diff options
| author | Sunil Srivastava <sunil_srivastava@playstation.sony.com> | 2019-03-08 22:00:50 +0000 |
|---|---|---|
| committer | Sunil Srivastava <sunil_srivastava@playstation.sony.com> | 2019-03-08 22:00:50 +0000 |
| commit | ae8fe4e0931468456e5d15303304138c6f253d53 (patch) | |
| tree | c09dbfac4265edb8cd11f4cb826827817acfd5bb /llvm/tools/llvm-nm/llvm-nm.cpp | |
| parent | f84083b4dbb1ddb6d2783400f11121f490cdb5a8 (diff) | |
| download | bcm5719-llvm-ae8fe4e0931468456e5d15303304138c6f253d53.tar.gz bcm5719-llvm-ae8fe4e0931468456e5d15303304138c6f253d53.zip | |
Improve "llvm-nm -f sysv" output for Elf files
Specifically, compute and Print Type and Section columns.
This is a re-commit of rL354833, after fixing the Asan problem found a a buildbot.
Differential Revision: https://reviews.llvm.org/D59060
llvm-svn: 355742
Diffstat (limited to 'llvm/tools/llvm-nm/llvm-nm.cpp')
| -rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 45 |
1 files changed, 42 insertions, 3 deletions
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index a7346d56f32..53f07d191c8 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -262,6 +262,8 @@ struct NMSymbol { uint64_t Size; char TypeChar; StringRef Name; + StringRef SectionName; + StringRef TypeName; BasicSymbolRef Sym; // The Sym field above points to the native symbol in the object file, // for Mach-O when we are creating symbols from the dyld info the above @@ -882,8 +884,12 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, std::string PaddedName(Name); while (PaddedName.length() < 20) PaddedName += " "; + std::string TypeName = I->TypeName; + if (TypeName.size() < 18) + TypeName = std::string(18-TypeName.size(), ' ') + TypeName; outs() << PaddedName << "|" << SymbolAddrStr << "| " << I->TypeChar - << " | |" << SymbolSizeStr << "| |\n"; + << " |" << TypeName << "|" << SymbolSizeStr << "| |" + << I->SectionName << "\n"; } } @@ -1078,8 +1084,40 @@ static bool isObject(SymbolicFile &Obj, basic_symbol_iterator I) { : elf_symbol_iterator(I)->getELFType() == ELF::STT_OBJECT; } -static char getNMTypeChar(SymbolicFile &Obj, basic_symbol_iterator I) { +// For ELF object files, Set TypeName to the symbol typename, to be printed +// in the 'Type' column of the SYSV format output. +static StringRef getNMTypeName(SymbolicFile &Obj, basic_symbol_iterator I) { + if (isa<ELFObjectFileBase>(&Obj)) { + elf_symbol_iterator SymI(I); + return SymI->getELFTypeName(); + } + return ""; +} + +// Return Posix nm class type tag (single letter), but also set SecName and +// section and name, to be used in format=sysv output. +static char getNMSectionTagAndName(SymbolicFile &Obj, basic_symbol_iterator I, + StringRef &SecName) { uint32_t Symflags = I->getFlags(); + if (isa<ELFObjectFileBase>(&Obj)) { + if (Symflags & object::SymbolRef::SF_Absolute) + SecName = "*ABS*"; + else if (Symflags & object::SymbolRef::SF_Common) + SecName = "*COM*"; + else if (Symflags & object::SymbolRef::SF_Undefined) + SecName = "*UND*"; + else { + elf_symbol_iterator SymI(I); + Expected<elf_section_iterator> SecIOrErr = SymI->getSection(); + if (!SecIOrErr) { + consumeError(SecIOrErr.takeError()); + return '?'; + } + elf_section_iterator secT = *SecIOrErr; + secT->getName(SecName); + } + } + if ((Symflags & object::SymbolRef::SF_Weak) && !isa<MachOObjectFile>(Obj)) { char Ret = isObject(Obj, I) ? 'v' : 'w'; return (!(Symflags & object::SymbolRef::SF_Undefined)) ? toupper(Ret) : Ret; @@ -1201,7 +1239,8 @@ dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName, } S.Address = *AddressOrErr; } - S.TypeChar = getNMTypeChar(Obj, Sym); + S.TypeName = getNMTypeName(Obj, Sym); + S.TypeChar = getNMSectionTagAndName(Obj, Sym, S.SectionName); std::error_code EC = Sym.printName(OS); if (EC && MachO) OS << "bad string index"; |

