diff options
author | Pavel Labath <labath@google.com> | 2018-03-21 11:46:37 +0000 |
---|---|---|
committer | Pavel Labath <labath@google.com> | 2018-03-21 11:46:37 +0000 |
commit | 9025f9559d778f425dbcc7f55917a6dccbb7d2f1 (patch) | |
tree | b8dcc62f78e306eced611a27b9b0365daa6172b8 /llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp | |
parent | ecc8aee652d66dd2a9db575a66d13b477582bcb2 (diff) | |
download | bcm5719-llvm-9025f9559d778f425dbcc7f55917a6dccbb7d2f1.tar.gz bcm5719-llvm-9025f9559d778f425dbcc7f55917a6dccbb7d2f1.zip |
[dwarf] Unify unknown dwarf enum formatting code
Summary:
We have had at least three pieces of code (in DWARFAbbreviationDeclaration,
DWARFAcceleratorTable and DWARFDie) that have hand-rolled support for
dumping unknown dwarf enum values. While not terrible, they are a bit
distracting and enable small differences to creep in (Unknown_ffff vs.
Unknown_0xffff). I ended up needing to add a fourth place
(DWARFVerifier), so it seems it would be a good time to centralize.
This patch creates an alternative to the XXXString dumping functions in
the BinaryFormat library, which formats an unknown value as
DW_TYPE_unknown_1234, instead of just an empty string. It is based on
the formatv function, as that allows us to avoid materializing the
string for unknown values (and because this way I don't have to invent a
name for the new functions :P).
In this patch I add formatters for dwarf attributes, forms, tags, and
index attributes as these are the ones in use currently, but adding
other enums is straight-forward.
Reviewers: dblaikie, JDevlieghere, aprantl
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D44570
llvm-svn: 328090
Diffstat (limited to 'llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp | 42 |
1 files changed, 12 insertions, 30 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp index 2bde3d6d034..3b9662067c3 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp @@ -15,6 +15,7 @@ #include "llvm/Support/Compiler.h" #include "llvm/Support/DJB.h" #include "llvm/Support/Format.h" +#include "llvm/Support/FormatVariadic.h" #include "llvm/Support/ScopedPrinter.h" #include "llvm/Support/raw_ostream.h" #include <cstddef> @@ -24,35 +25,19 @@ using namespace llvm; namespace { -struct DwarfConstant { - StringRef (*StringFn)(unsigned); - StringRef Type; +struct Atom { unsigned Value; }; -static raw_ostream &operator<<(raw_ostream &OS, const DwarfConstant &C) { - StringRef Str = C.StringFn(C.Value); +static raw_ostream &operator<<(raw_ostream &OS, const Atom &A) { + StringRef Str = dwarf::AtomTypeString(A.Value); if (!Str.empty()) return OS << Str; - return OS << "DW_" << C.Type << "_Unknown_0x" << format("%x", C.Value); + return OS << "DW_ATOM_unknown_" << format("%x", A.Value); } } // namespace -static DwarfConstant formatTag(unsigned Tag) { - return {dwarf::TagString, "TAG", Tag}; -} - -static DwarfConstant formatForm(unsigned Form) { - return {dwarf::FormEncodingString, "FORM", Form}; -} - -static DwarfConstant formatIndex(unsigned Idx) { - return {dwarf::IndexString, "IDX", Idx}; -} - -static DwarfConstant formatAtom(unsigned Atom) { - return {dwarf::AtomTypeString, "ATOM", Atom}; -} +static Atom formatAtom(unsigned Atom) { return {Atom}; } DWARFAcceleratorTable::~DWARFAcceleratorTable() = default; @@ -226,7 +211,7 @@ LLVM_DUMP_METHOD void AppleAcceleratorTable::dump(raw_ostream &OS) const { for (const auto &Atom : HdrData.Atoms) { DictScope AtomScope(W, ("Atom " + Twine(i++)).str()); W.startLine() << "Type: " << formatAtom(Atom.first) << '\n'; - W.startLine() << "Form: " << formatForm(Atom.second) << '\n'; + W.startLine() << "Form: " << formatv("{0}", Atom.second) << '\n'; AtomForms.push_back(DWARFFormValue(Atom.second)); } } @@ -415,12 +400,10 @@ llvm::Error DWARFDebugNames::Header::extract(const DWARFDataExtractor &AS, void DWARFDebugNames::Abbrev::dump(ScopedPrinter &W) const { DictScope AbbrevScope(W, ("Abbreviation 0x" + Twine::utohexstr(Code)).str()); - W.startLine() << "Tag: " << formatTag(Tag) << '\n'; + W.startLine() << formatv("Tag: {0}\n", Tag); - for (const auto &Attr : Attributes) { - W.startLine() << formatIndex(Attr.Index) << ": " << formatForm(Attr.Form) - << '\n'; - } + for (const auto &Attr : Attributes) + W.startLine() << formatv("{0}: {1}\n", Attr.Index, Attr.Form); } static constexpr DWARFDebugNames::AttributeEncoding sentinelAttrEnc() { @@ -583,11 +566,10 @@ Optional<uint64_t> DWARFDebugNames::Entry::getDIESectionOffset() const { void DWARFDebugNames::Entry::dump(ScopedPrinter &W) const { W.printHex("Abbrev", Abbr->Code); - W.startLine() << "Tag: " << formatTag(Abbr->Tag) << "\n"; - + W.startLine() << formatv("Tag: {0}\n", Abbr->Tag); assert(Abbr->Attributes.size() == Values.size()); for (const auto &Tuple : zip_first(Abbr->Attributes, Values)) { - W.startLine() << formatIndex(std::get<0>(Tuple).Index) << ": "; + W.startLine() << formatv("{0}: ", std::get<0>(Tuple).Index); std::get<1>(Tuple).dump(W.getOStream()); W.getOStream() << '\n'; } |