AsmPrinter: Change DIEValueList to a subclass of DIE, NFC

Rewrite `DIEValueList` as a subclass of `DIE`, renaming its API to match
`DIE`'s.  This is preparation for changing `DIEBlock` and `DIELoc` to
stop inheriting from `DIE` and inherit directly from `DIEValueList`.

I thought about leaving this as a has-a relationship (and changing
`DIELoc` and `DIEBlock` to also have-a `DIEValueList`), but that seemed
to require a fair bit more boilerplate and I think it needed more
changes to the `DwarfUnit` API than this will.

No functionality change intended here.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243854 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2015-08-02 20:42:45 +00:00
parent 1e95eedbab
commit bc3c2c319c
2 changed files with 40 additions and 60 deletions

View File

@ -566,59 +566,68 @@ class DIEValueList {
ListTy List; ListTy List;
public: public:
class const_iterator; class const_value_iterator;
class iterator class value_iterator
: public iterator_adaptor_base<iterator, ListTy::iterator, : public iterator_adaptor_base<value_iterator, ListTy::iterator,
std::forward_iterator_tag, DIEValue> { std::forward_iterator_tag, DIEValue> {
friend class const_iterator; friend class const_value_iterator;
typedef iterator_adaptor_base<iterator, ListTy::iterator, typedef iterator_adaptor_base<value_iterator, ListTy::iterator,
std::forward_iterator_tag, std::forward_iterator_tag,
DIEValue> iterator_adaptor; DIEValue> iterator_adaptor;
public: public:
iterator() = default; value_iterator() = default;
explicit iterator(ListTy::iterator X) : iterator_adaptor(X) {} explicit value_iterator(ListTy::iterator X) : iterator_adaptor(X) {}
explicit operator bool() const { return bool(wrapped()); } explicit operator bool() const { return bool(wrapped()); }
DIEValue &operator*() const { return wrapped()->V; } DIEValue &operator*() const { return wrapped()->V; }
}; };
class const_iterator class const_value_iterator : public iterator_adaptor_base<
: public iterator_adaptor_base<const_iterator, ListTy::const_iterator, const_value_iterator, ListTy::const_iterator,
std::forward_iterator_tag, std::forward_iterator_tag, const DIEValue> {
const DIEValue> { typedef iterator_adaptor_base<const_value_iterator, ListTy::const_iterator,
typedef iterator_adaptor_base<const_iterator, ListTy::const_iterator,
std::forward_iterator_tag, std::forward_iterator_tag,
const DIEValue> iterator_adaptor; const DIEValue> iterator_adaptor;
public: public:
const_iterator() = default; const_value_iterator() = default;
const_iterator(DIEValueList::iterator X) : iterator_adaptor(X.wrapped()) {} const_value_iterator(DIEValueList::value_iterator X)
explicit const_iterator(ListTy::const_iterator X) : iterator_adaptor(X) {} : iterator_adaptor(X.wrapped()) {}
explicit const_value_iterator(ListTy::const_iterator X)
: iterator_adaptor(X) {}
explicit operator bool() const { return bool(wrapped()); } explicit operator bool() const { return bool(wrapped()); }
const DIEValue &operator*() const { return wrapped()->V; } const DIEValue &operator*() const { return wrapped()->V; }
}; };
iterator insert(BumpPtrAllocator &Alloc, DIEValue V) { typedef iterator_range<value_iterator> value_range;
typedef iterator_range<const_value_iterator> const_value_range;
value_iterator addValue(BumpPtrAllocator &Alloc, DIEValue V) {
List.push_back(*new (Alloc) Node(V)); List.push_back(*new (Alloc) Node(V));
return iterator(ListTy::toIterator(List.back())); return value_iterator(ListTy::toIterator(List.back()));
} }
template <class... Ts> template <class T>
iterator emplace(BumpPtrAllocator &Alloc, Ts &&... Args) { value_iterator addValue(BumpPtrAllocator &Alloc, dwarf::Attribute Attribute,
return insert(Alloc, DIEValue(std::forward<Ts>(Args)...)); dwarf::Form Form, T &&Value) {
return addValue(Alloc, DIEValue(Attribute, Form, std::forward<T>(Value)));
} }
iterator begin() { return iterator(List.begin()); } value_range values() {
iterator end() { return iterator(List.end()); } return llvm::make_range(value_iterator(List.begin()),
const_iterator begin() const { return const_iterator(List.begin()); } value_iterator(List.end()));
const_iterator end() const { return const_iterator(List.end()); } }
const_value_range values() const {
return llvm::make_range(const_value_iterator(List.begin()),
const_value_iterator(List.end()));
}
}; };
//===--------------------------------------------------------------------===// //===--------------------------------------------------------------------===//
/// DIE - A structured debug information entry. Has an abbreviation which /// DIE - A structured debug information entry. Has an abbreviation which
/// describes its organization. /// describes its organization.
class DIE : IntrusiveBackListNode { class DIE : IntrusiveBackListNode, public DIEValueList {
friend class IntrusiveBackList<DIE>; friend class IntrusiveBackList<DIE>;
protected: protected:
@ -641,10 +650,6 @@ protected:
DIE *Parent = nullptr; DIE *Parent = nullptr;
/// Attribute values.
///
DIEValueList Values;
protected: protected:
DIE() : Offset(0), Size(0) {} DIE() : Offset(0), Size(0) {}
@ -675,20 +680,6 @@ public:
return llvm::make_range(Children.begin(), Children.end()); return llvm::make_range(Children.begin(), Children.end());
} }
typedef DIEValueList::iterator value_iterator;
typedef iterator_range<value_iterator> value_range;
value_range values() {
return llvm::make_range(Values.begin(), Values.end());
}
typedef DIEValueList::const_iterator const_value_iterator;
typedef iterator_range<const_value_iterator> const_value_range;
const_value_range values() const {
return llvm::make_range(Values.begin(), Values.end());
}
DIE *getParent() const { return Parent; } DIE *getParent() const { return Parent; }
/// Generate the abbreviation for this DIE. /// Generate the abbreviation for this DIE.
@ -709,17 +700,6 @@ public:
void setOffset(unsigned O) { Offset = O; } void setOffset(unsigned O) { Offset = O; }
void setSize(unsigned S) { Size = S; } void setSize(unsigned S) { Size = S; }
/// addValue - Add a value and attributes to a DIE.
///
value_iterator addValue(BumpPtrAllocator &Alloc, DIEValue Value) {
return Values.insert(Alloc, Value);
}
template <class T>
value_iterator addValue(BumpPtrAllocator &Alloc, dwarf::Attribute Attribute,
dwarf::Form Form, T &&Value) {
return Values.emplace(Alloc, Attribute, Form, std::forward<T>(Value));
}
/// Add a child to the DIE. /// Add a child to the DIE.
DIE &addChild(DIE *Child) { DIE &addChild(DIE *Child) {
assert(!Child->getParent() && "Child should be orphaned"); assert(!Child->getParent() && "Child should be orphaned");

View File

@ -109,7 +109,7 @@ void DIEAbbrev::dump() { print(dbgs()); }
DIEAbbrev DIE::generateAbbrev() const { DIEAbbrev DIE::generateAbbrev() const {
DIEAbbrev Abbrev(Tag, hasChildren()); DIEAbbrev Abbrev(Tag, hasChildren());
for (const DIEValue &V : Values) for (const DIEValue &V : values())
Abbrev.AddAttribute(V.getAttribute(), V.getForm()); Abbrev.AddAttribute(V.getAttribute(), V.getForm());
return Abbrev; return Abbrev;
} }
@ -166,7 +166,7 @@ void DIE::print(raw_ostream &O, unsigned IndentCount) const {
IndentCount += 2; IndentCount += 2;
unsigned I = 0; unsigned I = 0;
for (const auto &V : Values) { for (const auto &V : values()) {
O << Indent; O << Indent;
if (!isBlock) if (!isBlock)
@ -507,7 +507,7 @@ void DIETypeSignature::print(raw_ostream &O) const {
/// ///
unsigned DIELoc::ComputeSize(const AsmPrinter *AP) const { unsigned DIELoc::ComputeSize(const AsmPrinter *AP) const {
if (!Size) { if (!Size) {
for (const auto &V : Values) for (const auto &V : values())
Size += V.SizeOf(AP); Size += V.SizeOf(AP);
} }
@ -527,7 +527,7 @@ void DIELoc::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
Asm->EmitULEB128(Size); break; Asm->EmitULEB128(Size); break;
} }
for (const auto &V : Values) for (const auto &V : values())
V.EmitValue(Asm); V.EmitValue(Asm);
} }
@ -560,7 +560,7 @@ void DIELoc::print(raw_ostream &O) const {
/// ///
unsigned DIEBlock::ComputeSize(const AsmPrinter *AP) const { unsigned DIEBlock::ComputeSize(const AsmPrinter *AP) const {
if (!Size) { if (!Size) {
for (const auto &V : Values) for (const auto &V : values())
Size += V.SizeOf(AP); Size += V.SizeOf(AP);
} }
@ -578,7 +578,7 @@ void DIEBlock::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
case dwarf::DW_FORM_block: Asm->EmitULEB128(Size); break; case dwarf::DW_FORM_block: Asm->EmitULEB128(Size); break;
} }
for (const auto &V : Values) for (const auto &V : values())
V.EmitValue(Asm); V.EmitValue(Asm);
} }