diff options
author | Sunil Srivastava <sunil_srivastava@playstation.sony.com> | 2019-02-26 00:19:39 +0000 |
---|---|---|
committer | Sunil Srivastava <sunil_srivastava@playstation.sony.com> | 2019-02-26 00:19:39 +0000 |
commit | d72d16f4448f256f9383a719d502bee4416e0e39 (patch) | |
tree | 8becfbabebed8002d9ca68c6d4f58c362f0b1316 /llvm/tools/llvm-nm/llvm-nm.cpp | |
parent | 9a72870122394dbdfde5b93555e4409f81a4024e (diff) | |
download | bcm5719-llvm-d72d16f4448f256f9383a719d502bee4416e0e39.tar.gz bcm5719-llvm-d72d16f4448f256f9383a719d502bee4416e0e39.zip |
Improve "llvm-nm -f sysv" output for Elf files
Specifically, compute and Print Type and Section columns.
Differential Revision: https://reviews.llvm.org/D58263
llvm-svn: 354833
Diffstat (limited to 'llvm/tools/llvm-nm/llvm-nm.cpp')
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index a7346d56f32..55ef0b7661f 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,13 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, std::string PaddedName(Name); while (PaddedName.length() < 20) PaddedName += " "; + std::string TNPad = ""; + int TNL = I->TypeName.size(); + while ((TNPad.length() + TNL) < 18) + TNPad += " "; outs() << PaddedName << "|" << SymbolAddrStr << "| " << I->TypeChar - << " | |" << SymbolSizeStr << "| |\n"; + << " |" << TNPad << I->TypeName << "|" << SymbolSizeStr + << "| |" << I->SectionName << "\n"; } } @@ -1078,7 +1085,37 @@ 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 void getNMTypeName(SymbolicFile &Obj, basic_symbol_iterator I, + StringRef &TypeName) { + if (isa<ELFObjectFileBase>(&Obj)) { + elf_symbol_iterator SymI(I); + SymI->getELFTypeName(TypeName); + } +} + +// 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 getNMClassTagAndSectionName(SymbolicFile &Obj, + basic_symbol_iterator I, + StringRef &SecName) { + if (isa<ELFObjectFileBase>(&Obj)) { + elf_symbol_iterator SymI(I); + + Expected<elf_section_iterator> SecIOrErr = SymI->getSection(); + if (!SecIOrErr) { + consumeError(SecIOrErr.takeError()); + return '?'; + } + int SI = SymI->getSectionIndex(); + if (SI == 0) { + SecName = "*UND*"; + } else { + elf_section_iterator secT = *SecIOrErr; + secT->getName(SecName); + } + } uint32_t Symflags = I->getFlags(); if ((Symflags & object::SymbolRef::SF_Weak) && !isa<MachOObjectFile>(Obj)) { char Ret = isObject(Obj, I) ? 'v' : 'w'; @@ -1088,8 +1125,10 @@ static char getNMTypeChar(SymbolicFile &Obj, basic_symbol_iterator I) { if (Symflags & object::SymbolRef::SF_Undefined) return 'U'; - if (Symflags & object::SymbolRef::SF_Common) + if (Symflags & object::SymbolRef::SF_Common) { + SecName = "*COM*"; return 'C'; + } char Ret = '?'; if (Symflags & object::SymbolRef::SF_Absolute) @@ -1201,7 +1240,8 @@ dumpSymbolNamesFromObject(SymbolicFile &Obj, bool printName, } S.Address = *AddressOrErr; } - S.TypeChar = getNMTypeChar(Obj, Sym); + getNMTypeName(Obj, Sym, S.TypeName); + S.TypeChar = getNMClassTagAndSectionName(Obj, Sym, S.SectionName); std::error_code EC = Sym.printName(OS); if (EC && MachO) OS << "bad string index"; |