summaryrefslogtreecommitdiffstats
path: root/llvm/tools
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-02-20 06:51:07 +0000
committerRui Ueyama <ruiu@google.com>2014-02-20 06:51:07 +0000
commit215a586c4b9a3a17edd7ed9ef80afbeb15d9bc09 (patch)
tree5453d976c7290bfd5dcffc58600a9af8be0f0cb8 /llvm/tools
parenta864ce741e1214c01b62a18973fa47e10787d401 (diff)
downloadbcm5719-llvm-215a586c4b9a3a17edd7ed9ef80afbeb15d9bc09.tar.gz
bcm5719-llvm-215a586c4b9a3a17edd7ed9ef80afbeb15d9bc09.zip
llvm-objdump/COFF: Print SEH table addresses.
SEH table addresses are VA in COFF file. In this patch we convert VA to RVA before printing it, because dumpbin prints them as RVAs. llvm-svn: 201760
Diffstat (limited to 'llvm/tools')
-rw-r--r--llvm/tools/llvm-objdump/COFFDump.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objdump/COFFDump.cpp b/llvm/tools/llvm-objdump/COFFDump.cpp
index 883786d4f66..91ca5ba7e2e 100644
--- a/llvm/tools/llvm-objdump/COFFDump.cpp
+++ b/llvm/tools/llvm-objdump/COFFDump.cpp
@@ -233,6 +233,25 @@ static void printCOFFSymbolAddress(llvm::raw_ostream &Out,
Out << format(" + 0x%04x", Disp);
}
+static void
+printSEHTable(const COFFObjectFile *Obj, uint32_t TableVA, int Count) {
+ if (Count == 0)
+ return;
+
+ const pe32_header *PE32Header;
+ if (error(Obj->getPE32Header(PE32Header)))
+ return;
+ uint32_t ImageBase = PE32Header->ImageBase;
+ uintptr_t IntPtr = 0;
+ if (error(Obj->getVaPtr(TableVA, IntPtr)))
+ return;
+ const support::ulittle32_t *P = (const support::ulittle32_t *)IntPtr;
+ outs() << "SEH Table:";
+ for (int I = 0; I < Count; ++I)
+ outs() << format(" 0x%x", P[I] + ImageBase);
+ outs() << "\n\n";
+}
+
static void printLoadConfiguration(const COFFObjectFile *Obj) {
const coff_file_header *Header;
if (error(Obj->getCOFFHeader(Header)))
@@ -249,6 +268,7 @@ static void printLoadConfiguration(const COFFObjectFile *Obj) {
return;
if (error(Obj->getRvaPtr(DataDir->RelativeVirtualAddress, IntPtr)))
return;
+
const coff_load_configuration32 *LoadConf =
reinterpret_cast<const coff_load_configuration32 *>(IntPtr);
@@ -271,6 +291,8 @@ static void printLoadConfiguration(const COFFObjectFile *Obj) {
<< "\n SEH Table: " << LoadConf->SEHandlerTable
<< "\n SEH Count: " << LoadConf->SEHandlerCount
<< "\n\n";
+ printSEHTable(Obj, LoadConf->SEHandlerTable, LoadConf->SEHandlerCount);
+ outs() << "\n";
}
// Prints import tables. The import table is a table containing the list of
OpenPOWER on IntegriCloud