summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-readobj/COFFDumper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-readobj/COFFDumper.cpp')
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp56
1 files changed, 38 insertions, 18 deletions
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp
index 67d7f9fcc58..f5ac6e04603 100644
--- a/llvm/tools/llvm-readobj/COFFDumper.cpp
+++ b/llvm/tools/llvm-readobj/COFFDumper.cpp
@@ -52,12 +52,33 @@ using namespace llvm::Win64EH;
namespace {
+class CVTypeDumper {
+public:
+ CVTypeDumper(StreamWriter &W) : W(W) {}
+
+ StringRef getTypeName(TypeIndex TI);
+ void printTypeIndex(StringRef FieldName, TypeIndex TI);
+
+ void dump(StringRef Data);
+
+private:
+ void printCodeViewFieldList(StringRef FieldData);
+ void printMemberAttributes(MemberAttributes Attrs);
+
+ StreamWriter &W;
+
+ /// All user defined type records in .debug$T live in here. Type indices
+ /// greater than 0x1000 are user defined. Subtract 0x1000 from the index to
+ /// index into this vector.
+ SmallVector<StringRef, 10> CVUDTNames;
+
+ StringSet<> TypeNames;
+};
+
class COFFDumper : public ObjDumper {
public:
- COFFDumper(const llvm::object::COFFObjectFile *Obj, StreamWriter& Writer)
- : ObjDumper(Writer)
- , Obj(Obj) {
- }
+ COFFDumper(const llvm::object::COFFObjectFile *Obj, StreamWriter &Writer)
+ : ObjDumper(Writer), Obj(Obj), CVTD(Writer) {}
void printFileHeaders() override;
void printSections() override;
@@ -84,11 +105,13 @@ private:
void printCodeViewSymbolSection(StringRef SectionName, const SectionRef &Section);
void printCodeViewTypeSection(StringRef SectionName, const SectionRef &Section);
- void printCodeViewFieldList(StringRef FieldData);
StringRef getTypeName(TypeIndex Ty);
StringRef getFileNameForFileOffset(uint32_t FileOffset);
void printFileNameForOffset(StringRef Label, uint32_t FileOffset);
- void printTypeIndex(StringRef FieldName, TypeIndex TI);
+ void printTypeIndex(StringRef FieldName, TypeIndex TI) {
+ // Forward to CVTypeDumper for simplicity.
+ CVTD.printTypeIndex(FieldName, TI);
+ }
void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
const coff_section *Sec,
StringRef SectionContents);
@@ -102,8 +125,6 @@ private:
void printCodeViewInlineeLines(StringRef Subsection);
- void printMemberAttributes(MemberAttributes Attrs);
-
void printRelocatedField(StringRef Label, const coff_section *Sec,
StringRef SectionContents, const ulittle32_t *Field,
StringRef *RelocSym = nullptr);
@@ -136,12 +157,7 @@ private:
StringRef CVFileChecksumTable;
StringRef CVStringTable;
- /// All user defined type records in .debug$T live in here. Type indices
- /// greater than 0x1000 are user defined. Subtract 0x1000 from the index to
- /// index into this vector.
- SmallVector<StringRef, 10> CVUDTNames;
-
- StringSet<> TypeNames;
+ CVTypeDumper CVTD;
};
} // namespace
@@ -1866,7 +1882,7 @@ StringRef getRemainingBytesAsString(const TypeRecordPrefix *Rec, const char *Sta
return Leading;
}
-StringRef COFFDumper::getTypeName(TypeIndex TI) {
+StringRef CVTypeDumper::getTypeName(TypeIndex TI) {
if (TI.isNoType())
return "<no type>";
@@ -1893,7 +1909,7 @@ StringRef COFFDumper::getTypeName(TypeIndex TI) {
return "<unknown UDT>";
}
-void COFFDumper::printTypeIndex(StringRef FieldName, TypeIndex TI) {
+void CVTypeDumper::printTypeIndex(StringRef FieldName, TypeIndex TI) {
StringRef TypeName;
if (!TI.isNoType())
TypeName = getTypeName(TI);
@@ -1990,6 +2006,10 @@ void COFFDumper::printCodeViewTypeSection(StringRef SectionName,
Data = Data.drop_front(4);
+ CVTD.dump(Data);
+}
+
+void CVTypeDumper::dump(StringRef Data) {
while (!Data.empty()) {
const TypeRecordPrefix *Rec;
error(consumeObject(Data, Rec));
@@ -2370,7 +2390,7 @@ static StringRef skipPadding(StringRef Data) {
return Data.drop_front(Leaf & 0x0F);
}
-void COFFDumper::printMemberAttributes(MemberAttributes Attrs) {
+void CVTypeDumper::printMemberAttributes(MemberAttributes Attrs) {
W.printEnum("AccessSpecifier", uint8_t(Attrs.getAccess()),
makeArrayRef(MemberAccessNames));
auto MK = Attrs.getMethodKind();
@@ -2383,7 +2403,7 @@ void COFFDumper::printMemberAttributes(MemberAttributes Attrs) {
}
}
-void COFFDumper::printCodeViewFieldList(StringRef FieldData) {
+void CVTypeDumper::printCodeViewFieldList(StringRef FieldData) {
while (!FieldData.empty()) {
const ulittle16_t *LeafPtr;
error(consumeObject(FieldData, LeafPtr));
OpenPOWER on IntegriCloud