llvm-readobj: Dump more info for COFF import libraries.
authorRui Ueyama <ruiu@google.com>
Fri, 28 Aug 2015 10:27:50 +0000 (10:27 +0000)
committerRui Ueyama <ruiu@google.com>
Fri, 28 Aug 2015 10:27:50 +0000 (10:27 +0000)
This patch teaches llvm-readobj to print out COFF import file header fields.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246291 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/COFFImportFile.h
test/tools/llvm-readobj/file-headers.test
tools/llvm-readobj/CMakeLists.txt
tools/llvm-readobj/COFFImportDumper.cpp [new file with mode: 0644]
tools/llvm-readobj/ObjDumper.h
tools/llvm-readobj/llvm-readobj.cpp

index 603a0cdfe5d1f52fe183d9d831e0946df76ba6f3..07e98f5cf12d83d6b4ed746ae91d7f49e1b3fb25 100644 (file)
@@ -57,11 +57,14 @@ public:
     return BasicSymbolRef(Symb, this);
   }
 
+  const coff_import_header *getCOFFImportHeader() const {
+    return reinterpret_cast<const object::coff_import_header *>(
+        Data.getBufferStart());
+  }
+
 private:
   bool isCode() const {
-    auto *Import = reinterpret_cast<const object::coff_import_header *>(
-        Data.getBufferStart());
-    return Import->getType() == COFF::IMPORT_CODE;
+    return getCOFFImportHeader()->getType() == COFF::IMPORT_CODE;
   }
 };
 
index 3d043f127ae360b40f29b2cc65691c48c7c6aa1d..10fbcbcc153b28ca3bd8fa1787989010f75184aa 100644 (file)
@@ -330,4 +330,8 @@ COFF-UNKNOWN-NEXT:   Characteristics [ (0x0)
 COFF-UNKNOWN-NEXT:   ]
 COFF-UNKNOWN-NEXT: }
 
-COFF-IMPORTLIB: Format: COFF-import-file
+COFF-IMPORTLIB:      Format: COFF-import-file
+COFF-IMPORTLIB-NEXT: Type: code
+COFF-IMPORTLIB-NEXT: Name type: noprefix
+COFF-IMPORTLIB-NEXT: Symbol: _func
+COFF-IMPORTLIB-NEXT: Symbol: __imp__func
index 87407a258021bc3e2a5dbd9a2a736366bcc346a5..a06b678780cb470c37158f6a652d27f0137be75f 100644 (file)
@@ -7,6 +7,7 @@ add_llvm_tool(llvm-readobj
   ARMAttributeParser.cpp
   ARMWinEHPrinter.cpp
   COFFDumper.cpp
+  COFFImportDumper.cpp
   ELFDumper.cpp
   Error.cpp
   llvm-readobj.cpp
diff --git a/tools/llvm-readobj/COFFImportDumper.cpp b/tools/llvm-readobj/COFFImportDumper.cpp
new file mode 100644 (file)
index 0000000..83715e6
--- /dev/null
@@ -0,0 +1,52 @@
+//===-- COFFImportDumper.cpp - COFF import library dumper -------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file implements the COFF import library dumper for llvm-readobj.
+///
+//===----------------------------------------------------------------------===//
+
+#include "Error.h"
+#include "ObjDumper.h"
+#include "llvm-readobj.h"
+#include "llvm/Object/COFF.h"
+#include "llvm/Object/COFFImportFile.h"
+#include "llvm/Support/COFF.h"
+
+using namespace llvm::object;
+
+namespace llvm {
+
+void dumpCOFFImportFile(const COFFImportFile *File) {
+  outs() << '\n';
+  outs() << "File: " << File->getFileName() << "\n";
+  outs() << "Format: COFF-import-file\n";
+
+  const coff_import_header *H = File->getCOFFImportHeader();
+  switch (H->getType()) {
+  case COFF::IMPORT_CODE:  outs() << "Type: code\n"; break;
+  case COFF::IMPORT_DATA:  outs() << "Type: data\n"; break;
+  case COFF::IMPORT_CONST: outs() << "Type: const\n"; break;
+  }
+
+  switch (H->getNameType()) {
+  case COFF::IMPORT_ORDINAL: outs() << "Name type: ordinal\n"; break;
+  case COFF::IMPORT_NAME: outs() << "Name type: name\n"; break;
+  case COFF::IMPORT_NAME_NOPREFIX: outs() << "Name type: noprefix\n"; break;
+  case COFF::IMPORT_NAME_UNDECORATE: outs() << "Name type: undecorate\n"; break;
+  }
+
+  for (const object::BasicSymbolRef &Sym : File->symbols()) {
+    outs() << "Symbol: ";
+    Sym.printName(outs());
+    outs() << "\n";
+  }
+}
+
+} // namespace llvm
index 8710088185f1099ce9c44b4d129f6b3e7d22aa24..03a71b82ba68f945a94ad4dfb8efbfcfb97b48a2 100644 (file)
@@ -15,7 +15,8 @@
 
 namespace llvm {
 namespace object {
-  class ObjectFile;
+class COFFImportFile;
+class ObjectFile;
 }
 
 class StreamWriter;
@@ -76,6 +77,8 @@ std::error_code createMachODumper(const object::ObjectFile *Obj,
                                   StreamWriter &Writer,
                                   std::unique_ptr<ObjDumper> &Result);
 
+void dumpCOFFImportFile(const object::COFFImportFile *File);
+
 } // namespace llvm
 
 #endif
index 72844bc33a65dcebf6894fb18e5e42cf6cf1c0ba..2178dea0751e1c0df537710b6871cb8007754e60 100644 (file)
@@ -331,12 +331,6 @@ static void dumpObject(const ObjectFile *Obj) {
     Dumper->printStackMap();
 }
 
-static void dumpCOFFImportFile(const COFFImportFile *File) {
-  outs() << '\n';
-  outs() << "File: " << File->getFileName() << "\n";
-  outs() << "Format: COFF-import-file\n";
-}
-
 /// @brief Dumps each object file in \a Arc;
 static void dumpArchive(const Archive *Arc) {
   for (const auto &Child : Arc->children()) {