diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/llvm-nm/llvm-nm.cpp | 44 |
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) { |