diff options
author | Rui Ueyama <ruiu@google.com> | 2013-09-27 00:07:01 +0000 |
---|---|---|
committer | Rui Ueyama <ruiu@google.com> | 2013-09-27 00:07:01 +0000 |
commit | 0c873adc82a81b0bce317c3e2cb3139e990a0f9e (patch) | |
tree | 5e84958bcbb706131e88776ef82c8fcafbc404c5 /include | |
parent | deac137da710cd8566b857ee9d1e182d4fd35932 (diff) | |
download | llvm-0c873adc82a81b0bce317c3e2cb3139e990a0f9e.tar.gz llvm-0c873adc82a81b0bce317c3e2cb3139e990a0f9e.tar.bz2 llvm-0c873adc82a81b0bce317c3e2cb3139e990a0f9e.tar.xz |
llvm-objdump: Dump COFF import table if -private-headers option is given.
This is a patch to add capability to llvm-objdump to dump COFF Import Table
entries, so that we can write tests for LLD checking Import Table contents.
llvm-objdump did not print anything but just file name if the format is COFF
and -private-headers option is given. This is a patch adds capability for
dumping DLL Import Table, which is specific to the COFF format.
In this patch I defined a new iterator to iterate over import table entries.
Also added a few functions to COFFObjectFile.cpp to access fields of the entry.
Differential Revision: http://llvm-reviews.chandlerc.com/D1719
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191472 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include')
-rw-r--r-- | include/llvm/Object/COFF.h | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index cb464abeeb..e9ea547bec 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -23,6 +23,8 @@ namespace llvm { class ArrayRef; namespace object { +class ImportDirectoryEntryRef; +typedef content_iterator<ImportDirectoryEntryRef> import_directory_iterator; /// The DOS compatible header at the front of all PE/COFF executables. struct dos_header { @@ -202,6 +204,7 @@ struct coff_aux_section_definition { class COFFObjectFile : public ObjectFile { private: + friend class ImportDirectoryEntryRef; const coff_file_header *COFFHeader; const pe32_header *PE32Header; const data_directory *DataDirectory; @@ -209,6 +212,8 @@ private: const coff_symbol *SymbolTable; const char *StringTable; uint32_t StringTableSize; + const import_directory_table_entry *ImportDirectory; + uint32_t NumberOfImportDirectory; error_code getString(uint32_t offset, StringRef &Res) const; @@ -216,6 +221,9 @@ private: const coff_section *toSec(DataRefImpl Sec) const; const coff_relocation *toRel(DataRefImpl Rel) const; + error_code initSymbolTablePtr(); + error_code initImportTablePtr(); + protected: virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; @@ -287,6 +295,9 @@ public: virtual unsigned getArch() const; virtual StringRef getLoadName() const; + import_directory_iterator getImportDirectoryBegin() const; + import_directory_iterator getImportDirectoryEnd() const; + error_code getHeader(const coff_file_header *&Res) const; error_code getCOFFHeader(const coff_file_header *&Res) const; error_code getPE32Header(const pe32_header *&Res) const; @@ -307,12 +318,37 @@ public: error_code getSectionContents(const coff_section *Sec, ArrayRef<uint8_t> &Res) const; + error_code getRvaPtr(uint32_t Rva, uintptr_t &Res) const; + error_code getHintName(uint32_t Rva, uint16_t &Hint, StringRef &Name) const; + static inline bool classof(const Binary *v) { return v->isCOFF(); } }; -} -} +// The iterator for the import directory table. +class ImportDirectoryEntryRef { +public: + ImportDirectoryEntryRef() : OwningObject(0) {} + ImportDirectoryEntryRef(DataRefImpl ImportDirectory, + const COFFObjectFile *Owner) + : ImportDirectoryPimpl(ImportDirectory), OwningObject(Owner) {} + + bool operator==(const ImportDirectoryEntryRef &Other) const; + error_code getNext(ImportDirectoryEntryRef &Result) const; + error_code getName(StringRef &Result) const; + + error_code + getImportTableEntry(const import_directory_table_entry *&Result) const; + + error_code + getImportLookupEntry(const COFF::ImportLookupTableEntry32 *&Result) const; + +private: + DataRefImpl ImportDirectoryPimpl; + const COFFObjectFile *OwningObject; +}; +} // end namespace object +} // end namespace llvm #endif |