1 //===-- llvm/CodeGen/DwarfUnit.h - Dwarf Compile Unit ---*- C++ -*--===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains support for writing dwarf compile unit. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H 15 #define CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H 16 17 #include "DIE.h" 18 #include "DwarfDebug.h" 19 #include "llvm/ADT/DenseMap.h" 20 #include "llvm/ADT/Optional.h" 21 #include "llvm/ADT/OwningPtr.h" 22 #include "llvm/ADT/StringMap.h" 23 #include "llvm/DebugInfo.h" 24 #include "llvm/MC/MCExpr.h" 25 #include "llvm/MC/MCSection.h" 26 27 namespace llvm { 28 29 class MachineLocation; 30 class MachineOperand; 31 class ConstantInt; 32 class ConstantFP; 33 class DbgVariable; 34 35 // Data structure to hold a range for range lists. 36 class RangeSpan { 37 public: 38 RangeSpan(MCSymbol *S, MCSymbol *E) : Start(S), End(E) {} 39 const MCSymbol *getStart() const { return Start; } 40 const MCSymbol *getEnd() const { return End; } 41 42 private: 43 const MCSymbol *Start, *End; 44 }; 45 46 class RangeSpanList { 47 private: 48 // Index for locating within the debug_range section this particular span. 49 MCSymbol *RangeSym; 50 // List of ranges. 51 SmallVector<RangeSpan, 2> Ranges; 52 53 public: 54 RangeSpanList(MCSymbol *Sym) : RangeSym(Sym) {} 55 MCSymbol *getSym() const { return RangeSym; } 56 const SmallVectorImpl<RangeSpan> &getRanges() const { return Ranges; } 57 void addRange(RangeSpan Range) { Ranges.push_back(Range); } 58 }; 59 60 //===----------------------------------------------------------------------===// 61 /// Unit - This dwarf writer support class manages information associated 62 /// with a source file. 63 class DwarfUnit { 64 protected: 65 /// UniqueID - a numeric ID unique among all CUs in the module 66 unsigned UniqueID; 67 68 /// Node - MDNode for the compile unit. 69 DICompileUnit CUNode; 70 71 /// Unit debug information entry. 72 const OwningPtr<DIE> UnitDie; 73 74 /// Offset of the UnitDie from beginning of debug info section. 75 unsigned DebugInfoOffset; 76 77 /// Asm - Target of Dwarf emission. 78 AsmPrinter *Asm; 79 80 // Holders for some common dwarf information. 81 DwarfDebug *DD; 82 DwarfFile *DU; 83 84 /// IndexTyDie - An anonymous type for index type. Owned by UnitDie. 85 DIE *IndexTyDie; 86 87 /// MDNodeToDieMap - Tracks the mapping of unit level debug information 88 /// variables to debug information entries. 89 DenseMap<const MDNode *, DIE *> MDNodeToDieMap; 90 91 /// MDNodeToDIEEntryMap - Tracks the mapping of unit level debug information 92 /// descriptors to debug information entries using a DIEEntry proxy. 93 DenseMap<const MDNode *, DIEEntry *> MDNodeToDIEEntryMap; 94 95 /// GlobalNames - A map of globally visible named entities for this unit. 96 StringMap<const DIE *> GlobalNames; 97 98 /// GlobalTypes - A map of globally visible types for this unit. 99 StringMap<const DIE *> GlobalTypes; 100 101 /// AccelNames - A map of names for the name accelerator table. 102 StringMap<std::vector<const DIE *> > AccelNames; 103 104 /// AccelObjC - A map of objc spec for the objc accelerator table. 105 StringMap<std::vector<const DIE *> > AccelObjC; 106 107 /// AccelNamespace - A map of names for the namespace accelerator table. 108 StringMap<std::vector<const DIE *> > AccelNamespace; 109 110 /// AccelTypes - A map of names for the type accelerator table. 111 StringMap<std::vector<std::pair<const DIE *, unsigned> > > AccelTypes; 112 113 /// DIEBlocks - A list of all the DIEBlocks in use. 114 std::vector<DIEBlock *> DIEBlocks; 115 116 /// ContainingTypeMap - This map is used to keep track of subprogram DIEs that 117 /// need DW_AT_containing_type attribute. This attribute points to a DIE that 118 /// corresponds to the MDNode mapped with the subprogram DIE. 119 DenseMap<DIE *, const MDNode *> ContainingTypeMap; 120 121 // List of ranges for a given compile unit. 122 SmallVector<RangeSpan, 1> CURanges; 123 124 // List of range lists for a given compile unit, separate from the ranges for 125 // the CU itself. 126 SmallVector<RangeSpanList, 1> CURangeLists; 127 128 // DIEValueAllocator - All DIEValues are allocated through this allocator. 129 BumpPtrAllocator DIEValueAllocator; 130 131 // DIEIntegerOne - A preallocated DIEValue because 1 is used frequently. 132 DIEInteger *DIEIntegerOne; 133 134 /// The section this unit will be emitted in. 135 const MCSection *Section; 136 137 /// A label at the start of the non-dwo section related to this unit. 138 MCSymbol *SectionSym; 139 140 /// The start of the unit within its section. 141 MCSymbol *LabelBegin; 142 143 /// The end of the unit within its section. 144 MCSymbol *LabelEnd; 145 146 /// The label for the start of the range sets for the elements of this unit. 147 MCSymbol *LabelRange; 148 149 /// Skeleton unit associated with this unit. 150 DwarfUnit *Skeleton; 151 152 DwarfUnit(unsigned UID, DIE *D, DICompileUnit CU, AsmPrinter *A, 153 DwarfDebug *DW, DwarfFile *DWU); 154 155 public: 156 virtual ~DwarfUnit(); 157 158 /// Set the skeleton unit associated with this unit. 159 void setSkeleton(DwarfUnit *Skel) { Skeleton = Skel; } 160 161 /// Get the skeleton unit associated with this unit. 162 DwarfUnit *getSkeleton() const { return Skeleton; } 163 164 /// Pass in the SectionSym even though we could recreate it in every compile 165 /// unit (type units will have actually distinct symbols once they're in 166 /// comdat sections). 167 void initSection(const MCSection *Section, MCSymbol *SectionSym) { 168 assert(!this->Section); 169 this->Section = Section; 170 this->SectionSym = SectionSym; 171 this->LabelBegin = 172 Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID()); 173 this->LabelEnd = 174 Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID()); 175 this->LabelRange = Asm->GetTempSymbol("gnu_ranges", getUniqueID()); 176 } 177 178 const MCSection *getSection() const { 179 assert(Section); 180 return Section; 181 } 182 183 /// If there's a skeleton then return the section symbol for the skeleton 184 /// unit, otherwise return the section symbol for this unit. 185 MCSymbol *getLocalSectionSym() const { 186 if (Skeleton) 187 return Skeleton->getSectionSym(); 188 return getSectionSym(); 189 } 190 191 MCSymbol *getSectionSym() const { 192 assert(Section); 193 return SectionSym; 194 } 195 196 /// If there's a skeleton then return the begin label for the skeleton unit, 197 /// otherwise return the local label for this unit. 198 MCSymbol *getLocalLabelBegin() const { 199 if (Skeleton) 200 return Skeleton->getLabelBegin(); 201 return getLabelBegin(); 202 } 203 204 MCSymbol *getLabelBegin() const { 205 assert(Section); 206 return LabelBegin; 207 } 208 209 MCSymbol *getLabelEnd() const { 210 assert(Section); 211 return LabelEnd; 212 } 213 214 MCSymbol *getLabelRange() const { 215 assert(Section); 216 return LabelRange; 217 } 218 219 // Accessors. 220 unsigned getUniqueID() const { return UniqueID; } 221 uint16_t getLanguage() const { return CUNode.getLanguage(); } 222 DICompileUnit getCUNode() const { return CUNode; } 223 DIE *getUnitDie() const { return UnitDie.get(); } 224 const StringMap<const DIE *> &getGlobalNames() const { return GlobalNames; } 225 const StringMap<const DIE *> &getGlobalTypes() const { return GlobalTypes; } 226 227 const StringMap<std::vector<const DIE *> > &getAccelNames() const { 228 return AccelNames; 229 } 230 const StringMap<std::vector<const DIE *> > &getAccelObjC() const { 231 return AccelObjC; 232 } 233 const StringMap<std::vector<const DIE *> > &getAccelNamespace() const { 234 return AccelNamespace; 235 } 236 const StringMap<std::vector<std::pair<const DIE *, unsigned> > > & 237 getAccelTypes() const { 238 return AccelTypes; 239 } 240 241 unsigned getDebugInfoOffset() const { return DebugInfoOffset; } 242 void setDebugInfoOffset(unsigned DbgInfoOff) { DebugInfoOffset = DbgInfoOff; } 243 244 /// hasContent - Return true if this compile unit has something to write out. 245 bool hasContent() const { return !UnitDie->getChildren().empty(); } 246 247 /// addRange - Add an address range to the list of ranges for this unit. 248 void addRange(RangeSpan Range) { CURanges.push_back(Range); } 249 250 /// getRanges - Get the list of ranges for this unit. 251 const SmallVectorImpl<RangeSpan> &getRanges() const { return CURanges; } 252 SmallVectorImpl<RangeSpan> &getRanges() { return CURanges; } 253 254 /// addRangeList - Add an address range list to the list of range lists. 255 void addRangeList(RangeSpanList Ranges) { CURangeLists.push_back(Ranges); } 256 257 /// getRangeLists - Get the vector of range lists. 258 const SmallVectorImpl<RangeSpanList> &getRangeLists() const { 259 return CURangeLists; 260 } 261 SmallVectorImpl<RangeSpanList> &getRangeLists() { return CURangeLists; } 262 263 /// getParentContextString - Get a string containing the language specific 264 /// context for a global name. 265 std::string getParentContextString(DIScope Context) const; 266 267 /// addGlobalName - Add a new global entity to the compile unit. 268 /// 269 void addGlobalName(StringRef Name, DIE *Die, DIScope Context); 270 271 /// addAccelName - Add a new name to the name accelerator table. 272 void addAccelName(StringRef Name, const DIE *Die); 273 274 /// addAccelObjC - Add a new name to the ObjC accelerator table. 275 void addAccelObjC(StringRef Name, const DIE *Die); 276 277 /// addAccelNamespace - Add a new name to the namespace accelerator table. 278 void addAccelNamespace(StringRef Name, const DIE *Die); 279 280 /// addAccelType - Add a new type to the type accelerator table. 281 void addAccelType(StringRef Name, std::pair<const DIE *, unsigned> Die); 282 283 /// getDIE - Returns the debug information entry map slot for the 284 /// specified debug variable. We delegate the request to DwarfDebug 285 /// when the MDNode can be part of the type system, since DIEs for 286 /// the type system can be shared across CUs and the mappings are 287 /// kept in DwarfDebug. 288 DIE *getDIE(DIDescriptor D) const; 289 290 /// getDIEBlock - Returns a fresh newly allocated DIEBlock. 291 DIEBlock *getDIEBlock() { return new (DIEValueAllocator) DIEBlock(); } 292 293 /// insertDIE - Insert DIE into the map. We delegate the request to DwarfDebug 294 /// when the MDNode can be part of the type system, since DIEs for 295 /// the type system can be shared across CUs and the mappings are 296 /// kept in DwarfDebug. 297 void insertDIE(DIDescriptor Desc, DIE *D); 298 299 /// addDie - Adds or interns the DIE to the compile unit. 300 /// 301 void addDie(DIE *Buffer) { UnitDie->addChild(Buffer); } 302 303 /// addFlag - Add a flag that is true to the DIE. 304 void addFlag(DIE *Die, dwarf::Attribute Attribute); 305 306 /// addUInt - Add an unsigned integer attribute data and value. 307 void addUInt(DIE *Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form, 308 uint64_t Integer); 309 310 void addUInt(DIEBlock *Block, dwarf::Form Form, uint64_t Integer); 311 312 /// addSInt - Add an signed integer attribute data and value. 313 void addSInt(DIE *Die, dwarf::Attribute Attribute, Optional<dwarf::Form> Form, 314 int64_t Integer); 315 316 void addSInt(DIEBlock *Die, Optional<dwarf::Form> Form, int64_t Integer); 317 318 /// addString - Add a string attribute data and value. 319 void addString(DIE *Die, dwarf::Attribute Attribute, const StringRef Str); 320 321 /// addLocalString - Add a string attribute data and value. 322 void addLocalString(DIE *Die, dwarf::Attribute Attribute, 323 const StringRef Str); 324 325 /// addExpr - Add a Dwarf expression attribute data and value. 326 void addExpr(DIEBlock *Die, dwarf::Form Form, const MCExpr *Expr); 327 328 /// addLabel - Add a Dwarf label attribute data and value. 329 void addLabel(DIE *Die, dwarf::Attribute Attribute, dwarf::Form Form, 330 const MCSymbol *Label); 331 332 void addLabel(DIEBlock *Die, dwarf::Form Form, const MCSymbol *Label); 333 334 /// addSectionLabel - Add a Dwarf section label attribute data and value. 335 /// 336 void addSectionLabel(DIE *Die, dwarf::Attribute Attribute, 337 const MCSymbol *Label); 338 339 /// addSectionOffset - Add an offset into a section attribute data and value. 340 /// 341 void addSectionOffset(DIE *Die, dwarf::Attribute Attribute, uint64_t Integer); 342 343 /// addOpAddress - Add a dwarf op address data and value using the 344 /// form given and an op of either DW_FORM_addr or DW_FORM_GNU_addr_index. 345 void addOpAddress(DIEBlock *Die, const MCSymbol *Label); 346 347 /// addSectionDelta - Add a label delta attribute data and value. 348 void addSectionDelta(DIE *Die, dwarf::Attribute Attribute, const MCSymbol *Hi, 349 const MCSymbol *Lo); 350 351 /// addDIEEntry - Add a DIE attribute data and value. 352 void addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIE *Entry); 353 354 /// addDIEEntry - Add a DIE attribute data and value. 355 void addDIEEntry(DIE *Die, dwarf::Attribute Attribute, DIEEntry *Entry); 356 357 void addDIETypeSignature(DIE *Die, const DwarfTypeUnit &Type); 358 359 /// addBlock - Add block data. 360 void addBlock(DIE *Die, dwarf::Attribute Attribute, DIEBlock *Block); 361 362 /// addSourceLine - Add location information to specified debug information 363 /// entry. 364 void addSourceLine(DIE *Die, DIVariable V); 365 void addSourceLine(DIE *Die, DIGlobalVariable G); 366 void addSourceLine(DIE *Die, DISubprogram SP); 367 void addSourceLine(DIE *Die, DIType Ty); 368 void addSourceLine(DIE *Die, DINameSpace NS); 369 void addSourceLine(DIE *Die, DIObjCProperty Ty); 370 371 /// addAddress - Add an address attribute to a die based on the location 372 /// provided. 373 void addAddress(DIE *Die, dwarf::Attribute Attribute, 374 const MachineLocation &Location, bool Indirect = false); 375 376 /// addConstantValue - Add constant value entry in variable DIE. 377 void addConstantValue(DIE *Die, const MachineOperand &MO, DIType Ty); 378 void addConstantValue(DIE *Die, const ConstantInt *CI, bool Unsigned); 379 void addConstantValue(DIE *Die, const APInt &Val, bool Unsigned); 380 381 /// addConstantFPValue - Add constant value entry in variable DIE. 382 void addConstantFPValue(DIE *Die, const MachineOperand &MO); 383 void addConstantFPValue(DIE *Die, const ConstantFP *CFP); 384 385 /// addTemplateParams - Add template parameters in buffer. 386 void addTemplateParams(DIE &Buffer, DIArray TParams); 387 388 /// addRegisterOp - Add register operand. 389 void addRegisterOp(DIEBlock *TheDie, unsigned Reg); 390 391 /// addRegisterOffset - Add register offset. 392 void addRegisterOffset(DIEBlock *TheDie, unsigned Reg, int64_t Offset); 393 394 /// addComplexAddress - Start with the address based on the location provided, 395 /// and generate the DWARF information necessary to find the actual variable 396 /// (navigating the extra location information encoded in the type) based on 397 /// the starting location. Add the DWARF information to the die. 398 void addComplexAddress(const DbgVariable &DV, DIE *Die, 399 dwarf::Attribute Attribute, 400 const MachineLocation &Location); 401 402 // FIXME: Should be reformulated in terms of addComplexAddress. 403 /// addBlockByrefAddress - Start with the address based on the location 404 /// provided, and generate the DWARF information necessary to find the 405 /// actual Block variable (navigating the Block struct) based on the 406 /// starting location. Add the DWARF information to the die. Obsolete, 407 /// please use addComplexAddress instead. 408 void addBlockByrefAddress(const DbgVariable &DV, DIE *Die, 409 dwarf::Attribute Attribute, 410 const MachineLocation &Location); 411 412 /// addVariableAddress - Add DW_AT_location attribute for a 413 /// DbgVariable based on provided MachineLocation. 414 void addVariableAddress(const DbgVariable &DV, DIE *Die, 415 MachineLocation Location); 416 417 /// addType - Add a new type attribute to the specified entity. This takes 418 /// and attribute parameter because DW_AT_friend attributes are also 419 /// type references. 420 void addType(DIE *Entity, DIType Ty, 421 dwarf::Attribute Attribute = dwarf::DW_AT_type); 422 423 /// getOrCreateNameSpace - Create a DIE for DINameSpace. 424 DIE *getOrCreateNameSpace(DINameSpace NS); 425 426 /// getOrCreateSubprogramDIE - Create new DIE using SP. 427 DIE *getOrCreateSubprogramDIE(DISubprogram SP); 428 429 /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the 430 /// given DIType. 431 DIE *getOrCreateTypeDIE(const MDNode *N); 432 433 /// getOrCreateContextDIE - Get context owner's DIE. 434 DIE *createTypeDIE(DICompositeType Ty); 435 436 /// getOrCreateContextDIE - Get context owner's DIE. 437 DIE *getOrCreateContextDIE(DIScope Context); 438 439 /// constructContainingTypeDIEs - Construct DIEs for types that contain 440 /// vtables. 441 void constructContainingTypeDIEs(); 442 443 /// constructVariableDIE - Construct a DIE for the given DbgVariable. 444 DIE *constructVariableDIE(DbgVariable &DV, bool isScopeAbstract); 445 446 /// Create a DIE with the given Tag, add the DIE to its parent, and 447 /// call insertDIE if MD is not null. 448 DIE *createAndAddDIE(unsigned Tag, DIE &Parent, 449 DIDescriptor N = DIDescriptor()); 450 451 /// Compute the size of a header for this unit, not including the initial 452 /// length field. 453 virtual unsigned getHeaderSize() const { 454 return sizeof(int16_t) + // DWARF version number 455 sizeof(int32_t) + // Offset Into Abbrev. Section 456 sizeof(int8_t); // Pointer Size (in bytes) 457 } 458 459 /// Emit the header for this unit, not including the initial length field. 460 virtual void emitHeader(const MCSection *ASection, 461 const MCSymbol *ASectionSym) const; 462 463 protected: 464 /// getOrCreateStaticMemberDIE - Create new static data member DIE. 465 DIE *getOrCreateStaticMemberDIE(DIDerivedType DT); 466 467 private: 468 /// constructTypeDIE - Construct basic type die from DIBasicType. 469 void constructTypeDIE(DIE &Buffer, DIBasicType BTy); 470 471 /// constructTypeDIE - Construct derived type die from DIDerivedType. 472 void constructTypeDIE(DIE &Buffer, DIDerivedType DTy); 473 474 /// constructTypeDIE - Construct type DIE from DICompositeType. 475 void constructTypeDIE(DIE &Buffer, DICompositeType CTy); 476 477 /// constructSubrangeDIE - Construct subrange DIE from DISubrange. 478 void constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy); 479 480 /// constructArrayTypeDIE - Construct array type DIE from DICompositeType. 481 void constructArrayTypeDIE(DIE &Buffer, DICompositeType CTy); 482 483 /// constructEnumTypeDIE - Construct enum type DIE from DIEnumerator. 484 void constructEnumTypeDIE(DIE &Buffer, DICompositeType CTy); 485 486 /// constructMemberDIE - Construct member DIE from DIDerivedType. 487 void constructMemberDIE(DIE &Buffer, DIDerivedType DT); 488 489 /// constructTemplateTypeParameterDIE - Construct new DIE for the given 490 /// DITemplateTypeParameter. 491 void constructTemplateTypeParameterDIE(DIE &Buffer, 492 DITemplateTypeParameter TP); 493 494 /// constructTemplateValueParameterDIE - Construct new DIE for the given 495 /// DITemplateValueParameter. 496 void constructTemplateValueParameterDIE(DIE &Buffer, 497 DITemplateValueParameter TVP); 498 499 /// getLowerBoundDefault - Return the default lower bound for an array. If the 500 /// DWARF version doesn't handle the language, return -1. 501 int64_t getDefaultLowerBound() const; 502 503 /// getDIEEntry - Returns the debug information entry for the specified 504 /// debug variable. 505 DIEEntry *getDIEEntry(const MDNode *N) const { 506 return MDNodeToDIEEntryMap.lookup(N); 507 } 508 509 /// insertDIEEntry - Insert debug information entry into the map. 510 void insertDIEEntry(const MDNode *N, DIEEntry *E) { 511 MDNodeToDIEEntryMap.insert(std::make_pair(N, E)); 512 } 513 514 // getIndexTyDie - Get an anonymous type for index type. 515 DIE *getIndexTyDie() { return IndexTyDie; } 516 517 // setIndexTyDie - Set D as anonymous type for index which can be reused 518 // later. 519 void setIndexTyDie(DIE *D) { IndexTyDie = D; } 520 521 /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug 522 /// information entry. 523 DIEEntry *createDIEEntry(DIE *Entry); 524 525 /// resolve - Look in the DwarfDebug map for the MDNode that 526 /// corresponds to the reference. 527 template <typename T> T resolve(DIRef<T> Ref) const { 528 return DD->resolve(Ref); 529 } 530 531 /// If this is a named finished type then include it in the list of types for 532 /// the accelerator tables. 533 void updateAcceleratorTables(DIScope Context, DIType Ty, const DIE *TyDIE); 534 }; 535 536 class DwarfCompileUnit : public DwarfUnit { 537 public: 538 DwarfCompileUnit(unsigned UID, DIE *D, DICompileUnit Node, AsmPrinter *A, 539 DwarfDebug *DW, DwarfFile *DWU); 540 virtual ~DwarfCompileUnit() LLVM_OVERRIDE; 541 542 /// createGlobalVariableDIE - create global variable DIE. 543 void createGlobalVariableDIE(DIGlobalVariable GV); 544 545 /// addLabelAddress - Add a dwarf label attribute data and value using 546 /// either DW_FORM_addr or DW_FORM_GNU_addr_index. 547 void addLabelAddress(DIE *Die, dwarf::Attribute Attribute, MCSymbol *Label); 548 }; 549 550 class DwarfTypeUnit : public DwarfUnit { 551 private: 552 uint64_t TypeSignature; 553 const DIE *Ty; 554 555 public: 556 DwarfTypeUnit(unsigned UID, DIE *D, DICompileUnit CUNode, AsmPrinter *A, 557 DwarfDebug *DW, DwarfFile *DWU); 558 virtual ~DwarfTypeUnit() LLVM_OVERRIDE; 559 560 void setTypeSignature(uint64_t Signature) { TypeSignature = Signature; } 561 uint64_t getTypeSignature() const { return TypeSignature; } 562 void setType(const DIE *Ty) { this->Ty = Ty; } 563 564 /// Emit the header for this unit, not including the initial length field. 565 void emitHeader(const MCSection *ASection, const MCSymbol *ASectionSym) const 566 LLVM_OVERRIDE; 567 unsigned getHeaderSize() const LLVM_OVERRIDE { 568 return DwarfUnit::getHeaderSize() + sizeof(uint64_t) + // Type Signature 569 sizeof(uint32_t); // Type DIE Offset 570 } 571 void initSection(const MCSection *Section); 572 }; 573 } // end llvm namespace 574 #endif 575