diff options
Diffstat (limited to 'tools/llvm-nm/llvm-nm.cpp')
-rw-r--r-- | tools/llvm-nm/llvm-nm.cpp | 60 |
1 files changed, 51 insertions, 9 deletions
diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 22e019a..3be9247 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 (isa<IRObjectFile>(Obj)) + return false; + else if (isa<COFFObjectFile>(Obj)) + return false; + else if (MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(Obj)) + return MachO->is64Bit(); + else if (isa<ELF32LEObjectFile>(Obj)) + return false; + else if (isa<ELF64LEObjectFile>(Obj)) + return true; + else if (isa<ELF32BEObjectFile>(Obj)) + return false; + else if(isa<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 @@ -392,7 +420,7 @@ static char getSymbolNMTypeChar(const GlobalValue &GV) { if (isa<GlobalVariable>(GV)) return 'd'; const GlobalAlias *GA = cast<GlobalAlias>(&GV); - const GlobalValue *AliasedGV = GA->getAliasedGlobal(); + const GlobalValue *AliasedGV = GA->getAliasee(); return getSymbolNMTypeChar(*AliasedGV); } @@ -514,7 +542,7 @@ static void dumpSymbolNamesFromObject(SymbolicFile *Obj) { } CurrentFilename = Obj->getFileName(); - sortAndPrintSymbolList(); + sortAndPrintSymbolList(Obj); } static void dumpSymbolNamesFromFile(std::string &Filename) { @@ -567,10 +595,24 @@ static void dumpSymbolNamesFromFile(std::string &Filename) { E = UB->end_objects(); I != E; ++I) { std::unique_ptr<ObjectFile> Obj; + std::unique_ptr<Archive> A; if (!I->getAsObjectFile(Obj)) { outs() << Obj->getFileName() << ":\n"; dumpSymbolNamesFromObject(Obj.get()); } + else if (!I->getAsArchive(A)) { + for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end(); + AI != AE; ++AI) { + std::unique_ptr<Binary> Child; + if (AI->getAsBinary(Child, &Context)) + continue; + if (SymbolicFile *O = dyn_cast<SymbolicFile>(Child.get())) { + outs() << A->getFileName() << ":"; + outs() << O->getFileName() << ":\n"; + dumpSymbolNamesFromObject(O); + } + } + } } return; } |