aboutsummaryrefslogtreecommitdiffstats
path: root/tools/llvm-nm/llvm-nm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-nm/llvm-nm.cpp')
-rw-r--r--tools/llvm-nm/llvm-nm.cpp60
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;
}