X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FCodeGen%2FDIE.h;fp=include%2Fllvm%2FCodeGen%2FDIE.h;h=270fa5c7c8d8611a685d9923791d56d3ef96ba7f;hb=611a2f232296f0b3178d800af2e9403be97bc2d3;hp=0d5348c9052589a7cbbc29a8eab310fbda3d8ac7;hpb=09fe4bf794502ed795d2ef125f0f1f1c75e72571;p=oota-llvm.git diff --git a/include/llvm/CodeGen/DIE.h b/include/llvm/CodeGen/DIE.h index 0d5348c9052..270fa5c7c8d 100644 --- a/include/llvm/CodeGen/DIE.h +++ b/include/llvm/CodeGen/DIE.h @@ -315,7 +315,9 @@ public: private: /// Ty - Type of data stored in the value. /// - Type Ty; + Type Ty = isNone; + dwarf::Attribute Attribute = (dwarf::Attribute)0; + dwarf::Form Form = (dwarf::Form)0; /// Storage for the value. /// @@ -387,20 +389,28 @@ private: } public: - DIEValue() : Ty(isNone) {} - DIEValue(const DIEValue &X) : Ty(X.Ty) { copyVal(X); } + DIEValue() = default; + DIEValue(const DIEValue &X) : Ty(X.Ty), Attribute(X.Attribute), Form(X.Form) { + copyVal(X); + } DIEValue &operator=(const DIEValue &X) { destroyVal(); Ty = X.Ty; + Attribute = X.Attribute; + Form = X.Form; copyVal(X); return *this; } ~DIEValue() { destroyVal(); } #define HANDLE_DIEVALUE_SMALL(T) \ - DIEValue(const DIE##T &V) : Ty(is##T) { construct(V); } + DIEValue(dwarf::Attribute Attribute, dwarf::Form Form, const DIE##T &V) \ + : Ty(is##T), Attribute(Attribute), Form(Form) { \ + construct(V); \ + } #define HANDLE_DIEVALUE_LARGE(T) \ - DIEValue(const DIE##T *V) : Ty(is##T) { \ + DIEValue(dwarf::Attribute Attribute, dwarf::Form Form, const DIE##T *V) \ + : Ty(is##T), Attribute(Attribute), Form(Form) { \ assert(V && "Expected valid value"); \ construct(V); \ } @@ -408,6 +418,8 @@ public: // Accessors Type getType() const { return Ty; } + dwarf::Attribute getAttribute() const { return Attribute; } + dwarf::Form getForm() const { return Form; } explicit operator bool() const { return Ty; } #define HANDLE_DIEVALUE_SMALL(T) \ @@ -449,9 +461,11 @@ protected: /// unsigned Size; - /// Abbrev - Buffer for constructing abbreviation. + unsigned AbbrevNumber = ~0u; + + /// Tag - Dwarf tag code. /// - DIEAbbrev Abbrev; + dwarf::Tag Tag = (dwarf::Tag)0; /// Children DIEs. /// @@ -470,22 +484,18 @@ protected: SmallVector Values; protected: - DIE() - : Offset(0), Size(0), Abbrev((dwarf::Tag)0, dwarf::DW_CHILDREN_no), - Parent(nullptr) {} + DIE() : Offset(0), Size(0), Parent(nullptr) {} public: explicit DIE(dwarf::Tag Tag) - : Offset(0), Size(0), Abbrev((dwarf::Tag)Tag, dwarf::DW_CHILDREN_no), - Parent(nullptr) {} + : Offset(0), Size(0), Tag(Tag), Parent(nullptr) {} // Accessors. - DIEAbbrev &getAbbrev() { return Abbrev; } - const DIEAbbrev &getAbbrev() const { return Abbrev; } - unsigned getAbbrevNumber() const { return Abbrev.getNumber(); } - dwarf::Tag getTag() const { return Abbrev.getTag(); } + unsigned getAbbrevNumber() const { return AbbrevNumber; } + dwarf::Tag getTag() const { return Tag; } unsigned getOffset() const { return Offset; } unsigned getSize() const { return Size; } + bool hasChildren() const { return !Children.empty(); } const std::vector> &getChildren() const { return Children; } @@ -495,6 +505,16 @@ public: Values[I] = New; } DIE *getParent() const { return Parent; } + + /// Generate the abbreviation for this DIE. + /// + /// Calculate the abbreviation for this, which should be uniqued and + /// eventually used to call \a setAbbrevNumber(). + DIEAbbrev generateAbbrev() const; + + /// Set the abbreviation number for this DIE. + void setAbbrevNumber(unsigned I) { AbbrevNumber = I; } + /// Climb up the parent chain to get the compile or type unit DIE this DIE /// belongs to. const DIE *getUnit() const; @@ -506,16 +526,16 @@ public: /// addValue - Add a value and attributes to a DIE. /// - void addValue(dwarf::Attribute Attribute, dwarf::Form Form, DIEValue Value) { - Abbrev.AddAttribute(Attribute, Form); - Values.push_back(Value); + void addValue(DIEValue Value) { Values.push_back(Value); } + template + void addValue(dwarf::Attribute Attribute, dwarf::Form Form, T &&Value) { + Values.emplace_back(Attribute, Form, std::forward(Value)); } /// addChild - Add a child to the DIE. /// void addChild(std::unique_ptr Child) { assert(!Child->getParent()); - Abbrev.setChildrenFlag(dwarf::DW_CHILDREN_yes); Child->Parent = this; Children.push_back(std::move(Child)); }