summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2018-03-21 11:46:37 +0000
committerPavel Labath <labath@google.com>2018-03-21 11:46:37 +0000
commit9025f9559d778f425dbcc7f55917a6dccbb7d2f1 (patch)
treeb8dcc62f78e306eced611a27b9b0365daa6172b8 /llvm/lib/DebugInfo
parentecc8aee652d66dd2a9db575a66d13b477582bcb2 (diff)
downloadbcm5719-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')
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp20
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp42
-rw-r--r--llvm/lib/DebugInfo/DWARF/DWARFDie.cpp26
3 files changed, 21 insertions, 67 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp b/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp
index 688a85c9da3..adada672af0 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFAbbreviationDeclaration.cpp
@@ -16,6 +16,7 @@
#include "llvm/DebugInfo/DWARF/DWARFUnit.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Format.h"
+#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/raw_ostream.h"
#include <cstddef>
#include <cstdint>
@@ -126,26 +127,11 @@ DWARFAbbreviationDeclaration::extract(DataExtractor Data,
}
void DWARFAbbreviationDeclaration::dump(raw_ostream &OS) const {
- auto tagString = TagString(getTag());
OS << '[' << getCode() << "] ";
- if (!tagString.empty())
- OS << tagString;
- else
- OS << format("DW_TAG_Unknown_%x", getTag());
+ OS << formatv("{0}", getTag());
OS << "\tDW_CHILDREN_" << (hasChildren() ? "yes" : "no") << '\n';
for (const AttributeSpec &Spec : AttributeSpecs) {
- OS << '\t';
- auto attrString = AttributeString(Spec.Attr);
- if (!attrString.empty())
- OS << attrString;
- else
- OS << format("DW_AT_Unknown_%x", Spec.Attr);
- OS << '\t';
- auto formString = FormEncodingString(Spec.Form);
- if (!formString.empty())
- OS << formString;
- else
- OS << format("DW_FORM_Unknown_%x", Spec.Form);
+ OS << formatv("\t{0}\t{1}", Spec.Attr, Spec.Form);
if (Spec.isImplicitConst())
OS << '\t' << Spec.getImplicitConstValue();
OS << '\n';
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';
}
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
index 82f373e9c5c..7ae38e6e053 100644
--- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
+++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp
@@ -21,6 +21,7 @@
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/DataExtractor.h"
#include "llvm/Support/Format.h"
+#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/WithColor.h"
#include "llvm/Support/raw_ostream.h"
@@ -188,20 +189,10 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,
const char BaseIndent[] = " ";
OS << BaseIndent;
OS.indent(Indent + 2);
- auto attrString = AttributeString(Attr);
- if (!attrString.empty())
- WithColor(OS, HighlightColor::Attribute) << attrString;
- else
- WithColor(OS, HighlightColor::Attribute).get()
- << format("DW_AT_Unknown_%x", Attr);
+ WithColor(OS, HighlightColor::Attribute) << formatv("{0}", Attr);
- if (DumpOpts.Verbose || DumpOpts.ShowForm) {
- auto formString = FormEncodingString(Form);
- if (!formString.empty())
- OS << " [" << formString << ']';
- else
- OS << format(" [DW_FORM_Unknown_%x]", Form);
- }
+ if (DumpOpts.Verbose || DumpOpts.ShowForm)
+ OS << formatv(" [{0}]", Form);
DWARFUnit *U = Die.getDwarfUnit();
DWARFFormValue formValue(Form);
@@ -465,13 +456,8 @@ void DWARFDie::dump(raw_ostream &OS, unsigned Indent,
if (abbrCode) {
auto AbbrevDecl = getAbbreviationDeclarationPtr();
if (AbbrevDecl) {
- auto tagString = TagString(getTag());
- if (!tagString.empty())
- WithColor(OS, HighlightColor::Tag).get().indent(Indent) << tagString;
- else
- WithColor(OS, HighlightColor::Tag).get().indent(Indent)
- << format("DW_TAG_Unknown_%x", getTag());
-
+ WithColor(OS, HighlightColor::Tag).get().indent(Indent)
+ << formatv("{0}", getTag());
if (DumpOpts.Verbose)
OS << format(" [%u] %c", abbrCode,
AbbrevDecl->hasChildren() ? '*' : ' ');
OpenPOWER on IntegriCloud