summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorKevin Enderby <enderby@apple.com>2014-05-09 23:57:49 +0000
committerKevin Enderby <enderby@apple.com>2014-05-09 23:57:49 +0000
commitae417592a5cc33d2e0110cc98403e64301b23c73 (patch)
treedf7a9fa4877da632f8054f2b976b83b11a2e3aec /tools
parent3ae331d81a8f9e477df10ab86dca999d9f136a26 (diff)
downloadllvm-ae417592a5cc33d2e0110cc98403e64301b23c73.tar.gz
llvm-ae417592a5cc33d2e0110cc98403e64301b23c73.tar.bz2
llvm-ae417592a5cc33d2e0110cc98403e64301b23c73.tar.xz
Fix llvm-nm to print the full 64-bit address for symbols in 64-bit object files.
The implementation might be better to have a method is64Bit() in the class SymbolicFile instead of having the static routine isSymbolList64Bit() in llvm-nm.cpp . But this is very much in the sprit of isObject() and getNMTypeChar() in llvm-nm.cpp that has a series of if else statements based on the specific class of the SymbolicFile. I can update this if folks would like. Also the tests were updated to be explicit about checking the address for 64-bits or 32-bits from object files. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208463 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools')
-rw-r--r--tools/llvm-nm/llvm-nm.cpp44
1 files changed, 36 insertions, 8 deletions
diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp
index 22e019a8a5..4bf9178845 100644
--- a/tools/llvm-nm/llvm-nm.cpp
+++ b/tools/llvm-nm/llvm-nm.cpp
@@ -181,11 +181,30 @@ static bool compareSymbolName(const NMSymbol &A, const NMSymbol &B) {
return false;
}
+static char isSymbolList64Bit(SymbolicFile *Obj) {
+ if (dyn_cast<IRObjectFile>(Obj))
+ return false;
+ else if (dyn_cast<COFFObjectFile>(Obj))
+ return false;
+ else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(Obj))
+ return MachO->is64Bit();
+ else if (dyn_cast<ELF32LEObjectFile>(Obj))
+ return false;
+ else if (dyn_cast<ELF64LEObjectFile>(Obj))
+ return true;
+ else if (dyn_cast<ELF32BEObjectFile>(Obj))
+ return false;
+ else if(dyn_cast<ELF64BEObjectFile>(Obj))
+ return true;
+ else
+ return false;
+}
+
static StringRef CurrentFilename;
typedef std::vector<NMSymbol> SymbolListT;
static SymbolListT SymbolList;
-static void sortAndPrintSymbolList() {
+static void sortAndPrintSymbolList(SymbolicFile *Obj) {
if (!NoSort) {
if (NumericSort)
std::sort(SymbolList.begin(), SymbolList.end(), compareSymbolAddress);
@@ -205,6 +224,15 @@ static void sortAndPrintSymbolList() {
<< " Size Line Section\n";
}
+ const char *printBlanks, *printFormat;
+ if (isSymbolList64Bit(Obj)) {
+ printBlanks = " ";
+ printFormat = "%016" PRIx64;
+ } else {
+ printBlanks = " ";
+ printFormat = "%08" PRIx64;
+ }
+
for (SymbolListT::iterator I = SymbolList.begin(), E = SymbolList.end();
I != E; ++I) {
if ((I->TypeChar != 'U') && UndefinedOnly)
@@ -214,19 +242,19 @@ static void sortAndPrintSymbolList() {
if (SizeSort && !PrintAddress && I->Size == UnknownAddressOrSize)
continue;
- char SymbolAddrStr[10] = "";
- char SymbolSizeStr[10] = "";
+ char SymbolAddrStr[18] = "";
+ char SymbolSizeStr[18] = "";
if (OutputFormat == sysv || I->Address == UnknownAddressOrSize)
- strcpy(SymbolAddrStr, " ");
+ strcpy(SymbolAddrStr, printBlanks);
if (OutputFormat == sysv)
- strcpy(SymbolSizeStr, " ");
+ strcpy(SymbolSizeStr, printBlanks);
if (I->Address != UnknownAddressOrSize)
- format("%08" PRIx64, I->Address)
+ format(printFormat, I->Address)
.print(SymbolAddrStr, sizeof(SymbolAddrStr));
if (I->Size != UnknownAddressOrSize)
- format("%08" PRIx64, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
+ format(printFormat, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr));
if (OutputFormat == posix) {
outs() << I->Name << " " << I->TypeChar << " " << SymbolAddrStr
@@ -514,7 +542,7 @@ static void dumpSymbolNamesFromObject(SymbolicFile *Obj) {
}
CurrentFilename = Obj->getFileName();
- sortAndPrintSymbolList();
+ sortAndPrintSymbolList(Obj);
}
static void dumpSymbolNamesFromFile(std::string &Filename) {