X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FAsmPrinter%2FDwarfUnit.h;h=9a07106433cf715fc27603268e4da5736862ec47;hb=46e29705c667a94eb99828687f31dcb20f081feb;hp=7f485fe7399a77d07767c5bee88271bee73d2f96;hpb=f6e00376e7dc6d84f53efaf7cef9089021fac609;p=oota-llvm.git diff --git a/lib/CodeGen/AsmPrinter/DwarfUnit.h b/lib/CodeGen/AsmPrinter/DwarfUnit.h index 7f485fe7399..9a07106433c 100644 --- a/lib/CodeGen/AsmPrinter/DwarfUnit.h +++ b/lib/CodeGen/AsmPrinter/DwarfUnit.h @@ -11,8 +11,8 @@ // //===----------------------------------------------------------------------===// -#ifndef CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H -#define CODEGEN_ASMPRINTER_DWARFCOMPILEUNIT_H +#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DWARFUNIT_H +#define LLVM_LIB_CODEGEN_ASMPRINTER_DWARFUNIT_H #include "DIE.h" #include "DwarfDebug.h" @@ -73,7 +73,7 @@ protected: DICompileUnit CUNode; /// Unit debug information entry. - const std::unique_ptr UnitDie; + DIE UnitDie; /// Offset of the UnitDie from beginning of debug info section. unsigned DebugInfoOffset; @@ -138,13 +138,10 @@ protected: /// The end of the unit within its section. MCSymbol *LabelEnd; - /// The label for the start of the range sets for the elements of this unit. - MCSymbol *LabelRange; - /// Skeleton unit associated with this unit. DwarfUnit *Skeleton; - DwarfUnit(unsigned UID, DIE *D, DICompileUnit CU, AsmPrinter *A, + DwarfUnit(unsigned UID, dwarf::Tag, DICompileUnit CU, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU); public: @@ -167,7 +164,6 @@ public: Asm->GetTempSymbol(Section->getLabelBeginName(), getUniqueID()); this->LabelEnd = Asm->GetTempSymbol(Section->getLabelEndName(), getUniqueID()); - this->LabelRange = Asm->GetTempSymbol("gnu_ranges", getUniqueID()); } const MCSection *getSection() const { @@ -206,16 +202,11 @@ public: return LabelEnd; } - MCSymbol *getLabelRange() const { - assert(Section); - return LabelRange; - } - // Accessors. unsigned getUniqueID() const { return UniqueID; } uint16_t getLanguage() const { return CUNode.getLanguage(); } DICompileUnit getCUNode() const { return CUNode; } - DIE *getUnitDie() const { return UnitDie.get(); } + DIE &getUnitDie() { return UnitDie; } const StringMap &getGlobalNames() const { return GlobalNames; } const StringMap &getGlobalTypes() const { return GlobalTypes; } @@ -223,17 +214,16 @@ public: void setDebugInfoOffset(unsigned DbgInfoOff) { DebugInfoOffset = DbgInfoOff; } /// hasContent - Return true if this compile unit has something to write out. - bool hasContent() const { return !UnitDie->getChildren().empty(); } - - /// addRange - Add an address range to the list of ranges for this unit. - void addRange(RangeSpan Range); + bool hasContent() const { return !UnitDie.getChildren().empty(); } /// getRanges - Get the list of ranges for this unit. const SmallVectorImpl &getRanges() const { return CURanges; } SmallVectorImpl &getRanges() { return CURanges; } /// addRangeList - Add an address range list to the list of range lists. - void addRangeList(RangeSpanList Ranges) { CURangeLists.push_back(Ranges); } + void addRangeList(RangeSpanList Ranges) { + CURangeLists.push_back(std::move(Ranges)); + } /// getRangeLists - Get the vector of range lists. const SmallVectorImpl &getRangeLists() const { @@ -268,10 +258,6 @@ public: /// kept in DwarfDebug. void insertDIE(DIDescriptor Desc, DIE *D); - /// addDie - Adds or interns the DIE to the compile unit. - /// - void addDie(DIE *Buffer) { UnitDie->addChild(Buffer); } - /// addFlag - Add a flag that is true to the DIE. void addFlag(DIE &Die, dwarf::Attribute Attribute); @@ -288,11 +274,11 @@ public: void addSInt(DIELoc &Die, Optional Form, int64_t Integer); /// addString - Add a string attribute data and value. - void addString(DIE &Die, dwarf::Attribute Attribute, const StringRef Str); + void addString(DIE &Die, dwarf::Attribute Attribute, StringRef Str); /// addLocalString - Add a string attribute data and value. void addLocalString(DIE &Die, dwarf::Attribute Attribute, - const StringRef Str); + StringRef Str); /// addExpr - Add a Dwarf expression attribute data and value. void addExpr(DIELoc &Die, dwarf::Form Form, const MCExpr *Expr); @@ -306,11 +292,6 @@ public: /// addLocationList - Add a Dwarf loclistptr attribute data and value. void addLocationList(DIE &Die, dwarf::Attribute Attribute, unsigned Index); - /// addSectionLabel - Add a Dwarf section label attribute data and value. - /// - void addSectionLabel(DIE &Die, dwarf::Attribute Attribute, - const MCSymbol *Label); - /// addSectionOffset - Add an offset into a section attribute data and value. /// void addSectionOffset(DIE &Die, dwarf::Attribute Attribute, uint64_t Integer); @@ -328,7 +309,7 @@ public: const MCSymbol *Lo); /// addDIEEntry - Add a DIE attribute data and value. - void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE *Entry); + void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIE &Entry); /// addDIEEntry - Add a DIE attribute data and value. void addDIEEntry(DIE &Die, dwarf::Attribute Attribute, DIEEntry *Entry); @@ -359,8 +340,10 @@ public: /// addConstantValue - Add constant value entry in variable DIE. void addConstantValue(DIE &Die, const MachineOperand &MO, DIType Ty); - void addConstantValue(DIE &Die, const ConstantInt *CI, bool Unsigned); + void addConstantValue(DIE &Die, const ConstantInt *CI, DIType Ty); + void addConstantValue(DIE &Die, const APInt &Val, DIType Ty); void addConstantValue(DIE &Die, const APInt &Val, bool Unsigned); + void addConstantValue(DIE &Die, bool Unsigned, uint64_t Val); /// addConstantFPValue - Add constant value entry in variable DIE. void addConstantFPValue(DIE &Die, const MachineOperand &MO); @@ -370,7 +353,8 @@ public: void addTemplateParams(DIE &Buffer, DIArray TParams); /// addRegisterOp - Add register operand. - void addRegisterOp(DIELoc &TheDie, unsigned Reg); + void addRegisterOpPiece(DIELoc &TheDie, unsigned Reg, + unsigned SizeInBits = 0, unsigned OffsetInBits = 0); /// addRegisterOffset - Add register offset. void addRegisterOffset(DIELoc &TheDie, unsigned Reg, int64_t Offset); @@ -410,6 +394,10 @@ public: /// getOrCreateSubprogramDIE - Create new DIE using SP. DIE *getOrCreateSubprogramDIE(DISubprogram SP); + void applySubprogramAttributes(DISubprogram SP, DIE &SPDie); + void applySubprogramAttributesToDefinition(DISubprogram SP, DIE &SPDie); + void applyVariableAttributes(const DbgVariable &Var, DIE &VariableDie); + /// getOrCreateTypeDIE - Find existing DIE or create new DIE for the /// given DIType. DIE *getOrCreateTypeDIE(const MDNode *N); @@ -425,14 +413,19 @@ public: void constructContainingTypeDIEs(); /// constructVariableDIE - Construct a DIE for the given DbgVariable. - DIE *constructVariableDIE(DbgVariable &DV, bool isScopeAbstract); + std::unique_ptr constructVariableDIE(DbgVariable &DV, + bool Abstract = false); /// constructSubprogramArguments - Construct function argument DIEs. - void constructSubprogramArguments(DIE &Buffer, DIArray Args); + void constructSubprogramArguments(DIE &Buffer, DITypeArray Args); + + /// \brief Construct import_module DIE. + std::unique_ptr + constructImportedEntityDIE(const DIImportedEntity &Module); /// Create a DIE with the given Tag, add the DIE to its parent, and /// call insertDIE if MD is not null. - DIE *createAndAddDIE(unsigned Tag, DIE &Parent, + DIE &createAndAddDIE(unsigned Tag, DIE &Parent, DIDescriptor N = DIDescriptor()); /// Compute the size of a header for this unit, not including the initial @@ -448,6 +441,9 @@ public: virtual DwarfCompileUnit &getCU() = 0; + /// constructTypeDIE - Construct type DIE from DICompositeType. + void constructTypeDIE(DIE &Buffer, DICompositeType CTy); + protected: /// getOrCreateStaticMemberDIE - Create new static data member DIE. DIE *getOrCreateStaticMemberDIE(DIDerivedType DT); @@ -459,7 +455,8 @@ protected: private: /// \brief Construct a DIE for the given DbgVariable without initializing the /// DbgVariable's DIE reference. - DIE *constructVariableDIEImpl(const DbgVariable &DV, bool isScopeAbstract); + std::unique_ptr constructVariableDIEImpl(const DbgVariable &DV, + bool Abstract); /// constructTypeDIE - Construct basic type die from DIBasicType. void constructTypeDIE(DIE &Buffer, DIBasicType BTy); @@ -467,9 +464,6 @@ private: /// constructTypeDIE - Construct derived type die from DIDerivedType. void constructTypeDIE(DIE &Buffer, DIDerivedType DTy); - /// constructTypeDIE - Construct type DIE from DICompositeType. - void constructTypeDIE(DIE &Buffer, DICompositeType CTy); - /// constructSubrangeDIE - Construct subrange DIE from DISubrange. void constructSubrangeDIE(DIE &Buffer, DISubrange SR, DIE *IndexTy); @@ -516,7 +510,7 @@ private: /// createDIEEntry - Creates a new DIEEntry to be a proxy for a debug /// information entry. - DIEEntry *createDIEEntry(DIE *Entry); + DIEEntry *createDIEEntry(DIE &Entry); /// resolve - Look in the DwarfDebug map for the MDNode that /// corresponds to the reference. @@ -526,39 +520,7 @@ private: /// If this is a named finished type then include it in the list of types for /// the accelerator tables. - void updateAcceleratorTables(DIScope Context, DIType Ty, const DIE *TyDIE); -}; - -class DwarfCompileUnit : public DwarfUnit { - /// The attribute index of DW_AT_stmt_list in the compile unit DIE, avoiding - /// the need to search for it in applyStmtList. - unsigned stmtListIndex; - -public: - DwarfCompileUnit(unsigned UID, DIE *D, DICompileUnit Node, AsmPrinter *A, - DwarfDebug *DW, DwarfFile *DWU); - - void initStmtList(MCSymbol *DwarfLineSectionSym); - - /// Apply the DW_AT_stmt_list from this compile unit to the specified DIE. - void applyStmtList(DIE &D); - - /// createGlobalVariableDIE - create global variable DIE. - void createGlobalVariableDIE(DIGlobalVariable GV); - - /// addLabelAddress - Add a dwarf label attribute data and value using - /// either DW_FORM_addr or DW_FORM_GNU_addr_index. - void addLabelAddress(DIE &Die, dwarf::Attribute Attribute, - const MCSymbol *Label); - - /// addLocalLabelAddress - Add a dwarf label attribute data and value using - /// DW_FORM_addr only. - void addLocalLabelAddress(DIE &Die, dwarf::Attribute Attribute, - const MCSymbol *Label); - - DwarfCompileUnit &getCU() override { return *this; } - - unsigned getOrCreateSourceID(StringRef FileName, StringRef DirName) override; + void updateAcceleratorTables(DIScope Context, DIType Ty, const DIE &TyDIE); }; class DwarfTypeUnit : public DwarfUnit { @@ -569,7 +531,7 @@ private: MCDwarfDwoLineTable *SplitLineTable; public: - DwarfTypeUnit(unsigned UID, DIE *D, DwarfCompileUnit &CU, AsmPrinter *A, + DwarfTypeUnit(unsigned UID, DwarfCompileUnit &CU, AsmPrinter *A, DwarfDebug *DW, DwarfFile *DWU, MCDwarfDwoLineTable *SplitLineTable = nullptr); @@ -584,6 +546,10 @@ public: sizeof(uint32_t); // Type DIE Offset } void initSection(const MCSection *Section); + // Bring in the base function (taking two args, including the section symbol) + // for use when building DWO type units (they don't go in unique comdat + // sections) + using DwarfUnit::initSection; DwarfCompileUnit &getCU() override { return CU; } protected: