X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=lib%2FCodeGen%2FAsmPrinter%2FDIE.h;h=1a1c080c32c155d26ec4cee987d938dab7217b11;hp=fa39806f1aa27b833564bedc814c9b422a3ba6ea;hb=12d5224df6df05dc1189788591c381f467f5ff25;hpb=e6d0bedb065a9d5c063ca9125dbe70c5c223b134 diff --git a/lib/CodeGen/AsmPrinter/DIE.h b/lib/CodeGen/AsmPrinter/DIE.h index fa39806f1aa..1a1c080c32c 100644 --- a/lib/CodeGen/AsmPrinter/DIE.h +++ b/lib/CodeGen/AsmPrinter/DIE.h @@ -16,15 +16,13 @@ #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/SmallVector.h" -#include "llvm/MC/MCExpr.h" -#include "llvm/Support/Compiler.h" #include "llvm/Support/Dwarf.h" #include namespace llvm { class AsmPrinter; +class MCExpr; class MCSymbol; -class MCSymbolRefExpr; class raw_ostream; class DwarfTypeUnit; @@ -126,7 +124,7 @@ protected: /// Children DIEs. /// - std::vector Children; + std::vector> Children; DIE *Parent; @@ -134,11 +132,15 @@ protected: /// SmallVector Values; +protected: + DIE() + : Offset(0), Size(0), Abbrev((dwarf::Tag)0, dwarf::DW_CHILDREN_no), + Parent(nullptr) {} + public: - explicit DIE(unsigned Tag) + explicit DIE(dwarf::Tag Tag) : Offset(0), Size(0), Abbrev((dwarf::Tag)Tag, dwarf::DW_CHILDREN_no), - Parent(0) {} - ~DIE(); + Parent(nullptr) {} // Accessors. DIEAbbrev &getAbbrev() { return Abbrev; } @@ -147,7 +149,9 @@ public: dwarf::Tag getTag() const { return Abbrev.getTag(); } unsigned getOffset() const { return Offset; } unsigned getSize() const { return Size; } - const std::vector &getChildren() const { return Children; } + const std::vector> &getChildren() const { + return Children; + } const SmallVectorImpl &getValues() const { return Values; } DIE *getParent() const { return Parent; } /// Climb up the parent chain to get the compile or type unit DIE this DIE @@ -168,11 +172,11 @@ public: /// addChild - Add a child to the DIE. /// - void addChild(DIE *Child) { + void addChild(std::unique_ptr Child) { assert(!Child->getParent()); Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes); - Children.push_back(Child); Child->Parent = this; + Children.push_back(std::move(Child)); } /// findAttribute - Find a value in the DIE with the attribute given, @@ -202,7 +206,8 @@ public: isEntry, isTypeSignature, isBlock, - isLoc + isLoc, + isLocList, }; protected: @@ -264,19 +269,19 @@ public: /// EmitValue - Emit integer of appropriate size. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; uint64_t getValue() const { return Integer; } /// SizeOf - Determine size of integer value in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const; + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; // Implement isa/cast/dyncast. static bool classof(const DIEValue *I) { return I->getType() == isInteger; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; #endif }; @@ -291,7 +296,7 @@ public: /// EmitValue - Emit expression value. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; /// getValue - Get MCExpr. /// @@ -299,13 +304,13 @@ public: /// SizeOf - Determine size of expression value in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const; + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; // Implement isa/cast/dyncast. static bool classof(const DIEValue *E) { return E->getType() == isExpr; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; #endif }; @@ -320,7 +325,7 @@ public: /// EmitValue - Emit label value. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; /// getValue - Get MCSymbol. /// @@ -328,13 +333,13 @@ public: /// SizeOf - Determine size of label value in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const; + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; // Implement isa/cast/dyncast. static bool classof(const DIEValue *L) { return L->getType() == isLabel; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; #endif }; @@ -351,17 +356,17 @@ public: /// EmitValue - Emit delta value. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; /// SizeOf - Determine size of delta value in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const; + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; // Implement isa/cast/dyncast. static bool classof(const DIEValue *D) { return D->getType() == isDelta; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; #endif }; @@ -381,17 +386,17 @@ public: /// EmitValue - Emit delta value. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; /// SizeOf - Determine size of delta value in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const; + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; // Implement isa/cast/dyncast. static bool classof(const DIEValue *D) { return D->getType() == isString; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; #endif }; @@ -400,22 +405,21 @@ public: /// this class can also be used as a proxy for a debug information entry not /// yet defined (ie. types.) class DIEEntry : public DIEValue { - DIE *const Entry; + DIE &Entry; public: - explicit DIEEntry(DIE *E) : DIEValue(isEntry), Entry(E) { - assert(E && "Cannot construct a DIEEntry with a null DIE"); + explicit DIEEntry(DIE &E) : DIEValue(isEntry), Entry(E) { } - DIE *getEntry() const { return Entry; } + DIE &getEntry() const { return Entry; } /// EmitValue - Emit debug information entry offset. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; /// SizeOf - Determine size of debug information entry in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const { + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override { return Form == dwarf::DW_FORM_ref_addr ? getRefAddrSize(AP) : sizeof(int32_t); } @@ -427,7 +431,7 @@ public: static bool classof(const DIEValue *E) { return E->getType() == isEntry; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; #endif }; @@ -441,10 +445,10 @@ public: : DIEValue(isTypeSignature), Unit(Unit) {} /// \brief Emit type unit signature. - virtual void EmitValue(AsmPrinter *Asm, dwarf::Form Form) const; + void EmitValue(AsmPrinter *Asm, dwarf::Form Form) const override; /// Returns size of a ref_sig8 entry. - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const { + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override { assert(Form == dwarf::DW_FORM_ref_sig8); return 8; } @@ -454,7 +458,7 @@ public: return E->getType() == isTypeSignature; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; void dump() const; #endif }; @@ -465,7 +469,7 @@ public: class DIELoc : public DIEValue, public DIE { mutable unsigned Size; // Size in bytes excluding size header. public: - DIELoc() : DIEValue(isLoc), DIE(0), Size(0) {} + DIELoc() : DIEValue(isLoc), Size(0) {} /// ComputeSize - Calculate the size of the location expression. /// @@ -488,17 +492,17 @@ public: /// EmitValue - Emit location data. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; /// SizeOf - Determine size of location data in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const; + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; // Implement isa/cast/dyncast. static bool classof(const DIEValue *E) { return E->getType() == isLoc; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; #endif }; @@ -508,7 +512,7 @@ public: class DIEBlock : public DIEValue, public DIE { mutable unsigned Size; // Size in bytes excluding size header. public: - DIEBlock() : DIEValue(isBlock), DIE(0), Size(0) {} + DIEBlock() : DIEValue(isBlock), Size(0) {} /// ComputeSize - Calculate the size of the location expression. /// @@ -528,19 +532,50 @@ public: /// EmitValue - Emit location data. /// - virtual void EmitValue(AsmPrinter *AP, dwarf::Form Form) const; + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; /// SizeOf - Determine size of location data in bytes. /// - virtual unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const; + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; // Implement isa/cast/dyncast. static bool classof(const DIEValue *E) { return E->getType() == isBlock; } #ifndef NDEBUG - virtual void print(raw_ostream &O) const; + void print(raw_ostream &O) const override; +#endif +}; + +//===--------------------------------------------------------------------===// +/// DIELocList - Represents a pointer to a location list in the debug_loc +/// section. +// +class DIELocList : public DIEValue { + // Index into the .debug_loc vector. + size_t Index; + +public: + DIELocList(size_t I) : DIEValue(isLocList), Index(I) {} + + /// getValue - Grab the current index out. + size_t getValue() const { return Index; } + + /// EmitValue - Emit location data. + /// + void EmitValue(AsmPrinter *AP, dwarf::Form Form) const override; + + /// SizeOf - Determine size of location data in bytes. + /// + unsigned SizeOf(AsmPrinter *AP, dwarf::Form Form) const override; + + // Implement isa/cast/dyncast. + static bool classof(const DIEValue *E) { return E->getType() == isLocList; } + +#ifndef NDEBUG + void print(raw_ostream &O) const override; #endif }; + } // end llvm namespace #endif