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