From ddd926441e7ff9b4b4217fbeea14ef79481021d2 Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Sat, 3 Jan 2015 21:35:09 +0000 Subject: [PATCH] llvm-readobj: add support to dump COFF export tables This enhances llvm-readobj to print out the COFF export table, similar to the -coff-import option. This is useful for testing in lld. llvm-svn: 225120 --- llvm/test/tools/llvm-readobj/Inputs/export-arm.dll | Bin 0 -> 5632 bytes llvm/test/tools/llvm-readobj/Inputs/export-x64.dll | Bin 0 -> 6144 bytes llvm/test/tools/llvm-readobj/Inputs/export-x86.dll | Bin 0 -> 6144 bytes llvm/test/tools/llvm-readobj/coff-exports.test | 11 +++++++++++ llvm/tools/llvm-readobj/COFFDumper.cpp | 21 +++++++++++++++++++++ llvm/tools/llvm-readobj/ObjDumper.h | 1 + llvm/tools/llvm-readobj/llvm-readobj.cpp | 6 ++++++ 7 files changed, 39 insertions(+) create mode 100755 llvm/test/tools/llvm-readobj/Inputs/export-arm.dll create mode 100755 llvm/test/tools/llvm-readobj/Inputs/export-x64.dll create mode 100755 llvm/test/tools/llvm-readobj/Inputs/export-x86.dll create mode 100644 llvm/test/tools/llvm-readobj/coff-exports.test diff --git a/llvm/test/tools/llvm-readobj/Inputs/export-arm.dll b/llvm/test/tools/llvm-readobj/Inputs/export-arm.dll new file mode 100755 index 0000000000000000000000000000000000000000..a5555628afc6556f13add3dfb5eea643878b48fa GIT binary patch literal 5632 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 C=PGCb literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-readobj/Inputs/export-x64.dll b/llvm/test/tools/llvm-readobj/Inputs/export-x64.dll new file mode 100755 index 0000000000000000000000000000000000000000..10b14e8fff9546e787a74333f08f0f1072285862 GIT binary patch literal 6144 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 NCiY9u`&Y!_zW`z`GfDse literal 0 HcmV?d00001 diff --git a/llvm/test/tools/llvm-readobj/Inputs/export-x86.dll b/llvm/test/tools/llvm-readobj/Inputs/export-x86.dll new file mode 100755 index 0000000000000000000000000000000000000000..9efcd3131fe053a03692fc5e45cf64ee72688cd4 GIT binary patch literal 6144 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 { + DictScope Export(W, "Export"); + + StringRef Name; + uint32_t Ordinal, RVA; + + if (error(E.getSymbolName(Name))) + continue; + if (error(E.getOrdinal(Ordinal))) + continue; + if (error(E.getExportRVA(RVA))) + continue; + + W.printNumber("Ordinal", Ordinal); + W.printString("Name", Name); + W.printHex("RVA", RVA); + } +} + void COFFDumper::printCOFFDirectives() { for (const SectionRef &Section : Obj->sections()) { StringRef Contents; diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h index a34e091..27e658f 100644 --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/tools/llvm-readobj/ObjDumper.h @@ -45,6 +45,7 @@ public: // Only implemented for PE/COFF. virtual void printCOFFImports() { } + virtual void printCOFFExports() { } virtual void printCOFFDirectives() { } virtual void printCOFFBaseReloc() { } diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp index d08f186..f95fea8 100644 --- a/llvm/tools/llvm-readobj/llvm-readobj.cpp +++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp @@ -146,6 +146,10 @@ namespace opts { cl::opt COFFImports("coff-imports", cl::desc("Display the PE/COFF import table")); + // -coff-exports + cl::opt + COFFExports("coff-exports", cl::desc("Display the PE/COFF export table")); + // -coff-directives cl::opt COFFDirectives("coff-directives", @@ -282,6 +286,8 @@ static void dumpObject(const ObjectFile *Obj) { Dumper->printMipsPLTGOT(); if (opts::COFFImports) Dumper->printCOFFImports(); + if (opts::COFFExports) + Dumper->printCOFFExports(); if (opts::COFFDirectives) Dumper->printCOFFDirectives(); if (opts::COFFBaseRelocs) -- 2.7.4