From c6bf547564088ad0ba0b2f281ffa813974f66bda Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Thu, 18 Aug 2016 16:39:19 +0000 Subject: [PATCH] llvm-objdump: add coff import library symbol listing support This adds behaviour similar to binutils' objdump which can show symbols in an import library. Differences from that stem around the fact that we do not create section symbols nor the all import import descriptor symbol reference. However, this does mean that the tool can serve as a possible replacement for the existing tool. llvm-svn: 279088 --- llvm/test/tools/llvm-objdump/Inputs/library.lib | Bin 0 -> 2166 bytes .../tools/llvm-objdump/coff-import-library.test | 12 +++++++++++ llvm/tools/llvm-objdump/COFFDump.cpp | 24 +++++++++++++++++++++ llvm/tools/llvm-objdump/llvm-objdump.cpp | 17 +++++++++++++++ llvm/tools/llvm-objdump/llvm-objdump.h | 2 ++ 5 files changed, 55 insertions(+) create mode 100755 llvm/test/tools/llvm-objdump/Inputs/library.lib create mode 100644 llvm/test/tools/llvm-objdump/coff-import-library.test diff --git a/llvm/test/tools/llvm-objdump/Inputs/library.lib b/llvm/test/tools/llvm-objdump/Inputs/library.lib new file mode 100755 index 0000000000000000000000000000000000000000..193380dd4858ce8cf4cc02298eeb4678a31f83ad GIT binary patch literal 2166 zcmcIm&2G~`5dQ4^;vy7}I1V8af`k?+QQfpkQz2EVoHU`-QW{rjdf>zh zaOg{L>74_&z5oX*@c{Hi%8b1mJE18_3oGs4?5tB<<&>-> z-E(#Z?ZHRbc74;b{#3vxq2aGLtDE%|d%4oA&<LRKyWO z6bb6NjgXhuKt=#C8BjRv0Gx?ngH3^o1Yj!S;v_QNUe5#RZ#*$el0YrZQX+W0^!43> zLQEi(s3@84`<r_V zG2X}@pv&Nmi1l>PEDKpdx#R91kgsRkigH2z`Q~^B7j{mC47m(=?(Rv67aZ@1NQuch zB)~|g5J*_Ab0Z3W9Vm$zcPbjxUW6}qIyjE<~heMUe1)Rw-huX zrsSoRnes(WM9)n5FASLFTpyAXQ&ZjCs1;v~GLO7pKgoc9$d{vb#r-NspqPq$zrrPS zzf37-y&rNS`hSYk;~L_;Sz0_Pji{2`g!` oqEKG4y%c^E3s=RVQvMCz${Sh9$^V0KwC+getCOFFImportHeader()->getType() == COFF::IMPORT_CODE; + + for (const object::BasicSymbolRef &Sym : i->symbols()) { + std::string Name; + raw_string_ostream NS(Name); + + Sym.printName(NS); + NS.flush(); + + outs() << "[" << format("%2d", Index) << "]" + << "(sec " << format("%2d", 0) << ")" + << "(fl 0x00)" // Flag bits, which COFF doesn't have. + << "(ty " << format("%3x", (IsCode && Index) ? 32 : 0) << ")" + << "(scl " << format("%3x", 0) << ") " + << "(nx " << 0 << ") " + << "0x" << format("%08x", 0) << " " << Name << '\n'; + + ++Index; + } +} + void llvm::printCOFFSymbolTable(const COFFObjectFile *coff) { for (unsigned SI = 0, SE = coff->getNumberOfSymbols(); SI != SE; ++SI) { ErrorOr Symbol = coff->getSymbol(SI); diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 4fc4aff..bff63e4 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -37,6 +37,7 @@ #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/Object/Archive.h" #include "llvm/Object/COFF.h" +#include "llvm/Object/COFFImportFile.h" #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/MachO.h" #include "llvm/Object/ObjectFile.h" @@ -1824,6 +1825,20 @@ static void DumpObject(const ObjectFile *o, const Archive *a = nullptr) { } } +static void DumpObject(const COFFImportFile *I, const Archive *A) { + StringRef ArchiveName = A ? A->getFileName() : ""; + + // Avoid other output when using a raw option. + if (!RawClangAST) + outs() << '\n' + << ArchiveName << "(" << I->getFileName() << ")" + << ":\tfile format COFF-import-file" + << "\n\n"; + + if (SymbolTable) + printCOFFSymbolTable(I); +} + /// @brief Dump each object file in \a a; static void DumpArchive(const Archive *a) { Error Err; @@ -1836,6 +1851,8 @@ static void DumpArchive(const Archive *a) { } if (ObjectFile *o = dyn_cast(&*ChildOrErr.get())) DumpObject(o, a); + else if (COFFImportFile *I = dyn_cast(&*ChildOrErr.get())) + DumpObject(I, a); else report_error(a->getFileName(), object_error::invalid_file_type); } diff --git a/llvm/tools/llvm-objdump/llvm-objdump.h b/llvm/tools/llvm-objdump/llvm-objdump.h index 5b10ee8..85ad0bb 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.h +++ b/llvm/tools/llvm-objdump/llvm-objdump.h @@ -20,6 +20,7 @@ class StringRef; namespace object { class COFFObjectFile; + class COFFImportFile; class MachOObjectFile; class ObjectFile; class Archive; @@ -74,6 +75,7 @@ void printMachOLazyBindTable(const object::MachOObjectFile* o); void printMachOWeakBindTable(const object::MachOObjectFile* o); void printELFFileHeader(const object::ObjectFile *o); void printCOFFFileHeader(const object::ObjectFile *o); +void printCOFFSymbolTable(const object::COFFImportFile *i); void printCOFFSymbolTable(const object::COFFObjectFile *o); void printMachOFileHeader(const object::ObjectFile *o); void printMachOLoadCommands(const object::ObjectFile *o); -- 2.7.4