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;
|
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");
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue