forked from OSchip/llvm-project
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. llvm-svn: 243854
This commit is contained in:
parent
afdafb126a
commit
1ad5ebc3ed
|
@ -566,59 +566,68 @@ class DIEValueList {
|
|||
ListTy List;
|
||||
|
||||
public:
|
||||
class const_iterator;
|
||||
class iterator
|
||||
: public iterator_adaptor_base<iterator, ListTy::iterator,
|
||||
class const_value_iterator;
|
||||
class value_iterator
|
||||
: public iterator_adaptor_base<value_iterator, ListTy::iterator,
|
||||
std::forward_iterator_tag, DIEValue> {
|
||||
friend class const_iterator;
|
||||
typedef iterator_adaptor_base<iterator, ListTy::iterator,
|
||||
friend class const_value_iterator;
|
||||
typedef iterator_adaptor_base<value_iterator, ListTy::iterator,
|
||||
std::forward_iterator_tag,
|
||||
DIEValue> iterator_adaptor;
|
||||
|
||||
public:
|
||||
iterator() = default;
|
||||
explicit iterator(ListTy::iterator X) : iterator_adaptor(X) {}
|
||||
value_iterator() = default;
|
||||
explicit value_iterator(ListTy::iterator X) : iterator_adaptor(X) {}
|
||||
|
||||
explicit operator bool() const { return bool(wrapped()); }
|
||||
DIEValue &operator*() const { return wrapped()->V; }
|
||||
};
|
||||
|
||||
class const_iterator
|
||||
: public iterator_adaptor_base<const_iterator, ListTy::const_iterator,
|
||||
std::forward_iterator_tag,
|
||||
const DIEValue> {
|
||||
typedef iterator_adaptor_base<const_iterator, ListTy::const_iterator,
|
||||
class const_value_iterator : public iterator_adaptor_base<
|
||||
const_value_iterator, ListTy::const_iterator,
|
||||
std::forward_iterator_tag, const DIEValue> {
|
||||
typedef iterator_adaptor_base<const_value_iterator, ListTy::const_iterator,
|
||||
std::forward_iterator_tag,
|
||||
const DIEValue> iterator_adaptor;
|
||||
|
||||
public:
|
||||
const_iterator() = default;
|
||||
const_iterator(DIEValueList::iterator X) : iterator_adaptor(X.wrapped()) {}
|
||||
explicit const_iterator(ListTy::const_iterator X) : iterator_adaptor(X) {}
|
||||
const_value_iterator() = default;
|
||||
const_value_iterator(DIEValueList::value_iterator X)
|
||||
: iterator_adaptor(X.wrapped()) {}
|
||||
explicit const_value_iterator(ListTy::const_iterator X)
|
||||
: iterator_adaptor(X) {}
|
||||
|
||||
explicit operator bool() const { return bool(wrapped()); }
|
||||
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));
|
||||
return iterator(ListTy::toIterator(List.back()));
|
||||
return value_iterator(ListTy::toIterator(List.back()));
|
||||
}
|
||||
template <class... Ts>
|
||||
iterator emplace(BumpPtrAllocator &Alloc, Ts &&... Args) {
|
||||
return insert(Alloc, DIEValue(std::forward<Ts>(Args)...));
|
||||
template <class T>
|
||||
value_iterator addValue(BumpPtrAllocator &Alloc, dwarf::Attribute Attribute,
|
||||
dwarf::Form Form, T &&Value) {
|
||||
return addValue(Alloc, DIEValue(Attribute, Form, std::forward<T>(Value)));
|
||||
}
|
||||
|
||||
iterator begin() { return iterator(List.begin()); }
|
||||
iterator end() { return iterator(List.end()); }
|
||||
const_iterator begin() const { return const_iterator(List.begin()); }
|
||||
const_iterator end() const { return const_iterator(List.end()); }
|
||||
value_range values() {
|
||||
return llvm::make_range(value_iterator(List.begin()),
|
||||
value_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
|
||||
/// describes its organization.
|
||||
class DIE : IntrusiveBackListNode {
|
||||
class DIE : IntrusiveBackListNode, public DIEValueList {
|
||||
friend class IntrusiveBackList<DIE>;
|
||||
|
||||
protected:
|
||||
|
@ -641,10 +650,6 @@ protected:
|
|||
|
||||
DIE *Parent = nullptr;
|
||||
|
||||
/// Attribute values.
|
||||
///
|
||||
DIEValueList Values;
|
||||
|
||||
protected:
|
||||
DIE() : Offset(0), Size(0) {}
|
||||
|
||||
|
@ -675,20 +680,6 @@ public:
|
|||
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; }
|
||||
|
||||
/// Generate the abbreviation for this DIE.
|
||||
|
@ -709,17 +700,6 @@ public:
|
|||
void setOffset(unsigned O) { Offset = O; }
|
||||
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.
|
||||
DIE &addChild(DIE *Child) {
|
||||
assert(!Child->getParent() && "Child should be orphaned");
|
||||
|
|
|
@ -109,7 +109,7 @@ void DIEAbbrev::dump() { print(dbgs()); }
|
|||
|
||||
DIEAbbrev DIE::generateAbbrev() const {
|
||||
DIEAbbrev Abbrev(Tag, hasChildren());
|
||||
for (const DIEValue &V : Values)
|
||||
for (const DIEValue &V : values())
|
||||
Abbrev.AddAttribute(V.getAttribute(), V.getForm());
|
||||
return Abbrev;
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ void DIE::print(raw_ostream &O, unsigned IndentCount) const {
|
|||
|
||||
IndentCount += 2;
|
||||
unsigned I = 0;
|
||||
for (const auto &V : Values) {
|
||||
for (const auto &V : values()) {
|
||||
O << Indent;
|
||||
|
||||
if (!isBlock)
|
||||
|
@ -507,7 +507,7 @@ void DIETypeSignature::print(raw_ostream &O) const {
|
|||
///
|
||||
unsigned DIELoc::ComputeSize(const AsmPrinter *AP) const {
|
||||
if (!Size) {
|
||||
for (const auto &V : Values)
|
||||
for (const auto &V : values())
|
||||
Size += V.SizeOf(AP);
|
||||
}
|
||||
|
||||
|
@ -527,7 +527,7 @@ void DIELoc::EmitValue(const AsmPrinter *Asm, dwarf::Form Form) const {
|
|||
Asm->EmitULEB128(Size); break;
|
||||
}
|
||||
|
||||
for (const auto &V : Values)
|
||||
for (const auto &V : values())
|
||||
V.EmitValue(Asm);
|
||||
}
|
||||
|
||||
|
@ -560,7 +560,7 @@ void DIELoc::print(raw_ostream &O) const {
|
|||
///
|
||||
unsigned DIEBlock::ComputeSize(const AsmPrinter *AP) const {
|
||||
if (!Size) {
|
||||
for (const auto &V : Values)
|
||||
for (const auto &V : values())
|
||||
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;
|
||||
}
|
||||
|
||||
for (const auto &V : Values)
|
||||
for (const auto &V : values())
|
||||
V.EmitValue(Asm);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue