From dba070638a444a78cfa7b826f57a08ca2881d167 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 23 Jun 2015 02:20:37 +0000 Subject: [PATCH] Compute correct symbol sizes for MachO and COFF. Before this would dump from the symbol start to the end of the section. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240367 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/llvm-cxxdump/sym-size.s | 44 +++++++++++++++++++++++++++++ tools/llvm-cxxdump/llvm-cxxdump.cpp | 11 ++++++-- 2 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 test/tools/llvm-cxxdump/sym-size.s diff --git a/test/tools/llvm-cxxdump/sym-size.s b/test/tools/llvm-cxxdump/sym-size.s new file mode 100644 index 00000000000..0e2ea3e1d5e --- /dev/null +++ b/test/tools/llvm-cxxdump/sym-size.s @@ -0,0 +1,44 @@ +// RUN: llvm-mc %s -o %t -filetype=obj -triple=x86_64-pc-win32 +// RUN: llvm-cxxdump %t | FileCheck %s + +// CHECK: ??_8B@@7B@[0]: 8 +// CHECK-NEXT: ??_8B@@7B@[4]: 9 +// CHECK-NEXT: ??_8C@@7B@[0]: 10 +// CHECK-NEXT: ??_8C@@7B@[4]: 11 +// CHECK-NEXT: ??_8D@@7B0@@[0]: 0 +// CHECK-NEXT: ??_8D@@7B0@@[4]: 1 +// CHECK-NEXT: ??_8D@@7B0@@[8]: 2 +// CHECK-NEXT: ??_8D@@7B0@@[12]: 3 +// CHECK-NEXT: ??_8D@@7BB@@@[0]: 4 +// CHECK-NEXT: ??_8D@@7BB@@@[4]: 5 +// CHECK-NEXT: ??_8D@@7BC@@@[0]: 6 +// CHECK-NEXT: ??_8D@@7BC@@@[4]: 7 + + .section .rdata,"dr" + .globl "??_8D@@7B0@@" +"??_8D@@7B0@@": + .long 0 + .long 1 + .long 2 + .long 3 + + .globl "??_8D@@7BB@@@" +"??_8D@@7BB@@@": + .long 4 + .long 5 + + .globl "??_8D@@7BC@@@" +"??_8D@@7BC@@@": + .long 6 + .long 7 + + .globl "??_8B@@7B@" +"??_8B@@7B@": + .long 8 + .long 9 + + .globl "??_8C@@7B@" +"??_8C@@7B@": + .long 10 + .long 11 + diff --git a/tools/llvm-cxxdump/llvm-cxxdump.cpp b/tools/llvm-cxxdump/llvm-cxxdump.cpp index ef42211cf89..bd9cf7d5df2 100644 --- a/tools/llvm-cxxdump/llvm-cxxdump.cpp +++ b/tools/llvm-cxxdump/llvm-cxxdump.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/Object/Archive.h" #include "llvm/Object/ObjectFile.h" +#include "llvm/Object/SymbolSize.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Endian.h" #include "llvm/Support/FileSystem.h" @@ -187,7 +188,14 @@ static void dumpCXXData(const ObjectFile *Obj) { uint8_t BytesInAddress = Obj->getBytesInAddress(); - for (const object::SymbolRef &Sym : Obj->symbols()) { + ErrorOr>> SymAddrOrErr = + object::computeSymbolSizes(*Obj); + if (error(SymAddrOrErr.getError())) + return; + + for (auto &P : *SymAddrOrErr) { + object::SymbolRef Sym = P.first; + uint64_t SymSize = P.second; StringRef SymName; if (error(Sym.getName(SymName))) return; @@ -207,7 +215,6 @@ static void dumpCXXData(const ObjectFile *Obj) { uint64_t SymAddress; if (error(Sym.getAddress(SymAddress))) return; - uint64_t SymSize = Sym.getSize(); uint64_t SecAddress = Sec.getAddress(); uint64_t SecSize = Sec.getSize(); uint64_t SymOffset = SymAddress - SecAddress;