diff options
author | Meador Inge <meadori@codesourcery.com> | 2016-11-23 20:17:15 +0000 |
---|---|---|
committer | Meador Inge <meadori@codesourcery.com> | 2016-11-23 20:17:15 +0000 |
commit | f74d99950d3f3e2f67859d190e404b27adfd41f7 (patch) | |
tree | f1a40bff84a6a0149739602c9534bbff5bc3a926 /llvm/tools | |
parent | 2eaacda53e0cab1c38bf077b2700ed6ef65e2b25 (diff) | |
download | bcm5719-llvm-f74d99950d3f3e2f67859d190e404b27adfd41f7.tar.gz bcm5719-llvm-f74d99950d3f3e2f67859d190e404b27adfd41f7.zip |
llvm-nm: Don't print value or size for undefined or weak symbols
Undefined and weak symbols don't have a meaningful size or value.
As such, nothing should be printed for those attributes (this is
already done for the address with 'U') with the BSD format. This
matches what GNU nm does.
Note that for the POSIX.2 format [1] zero values are still
printed for the size and value. This seems in spirit with
the format strings in that specification, but is debatable.
[1] http://pubs.opengroup.org/onlinepubs/9699919799/
Differential Revision: https://reviews.llvm.org/D26936
llvm-svn: 287802
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-nm/llvm-nm.cpp | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp index 5e6dbcbf662..e89d1d31048 100644 --- a/llvm/tools/llvm-nm/llvm-nm.cpp +++ b/llvm/tools/llvm-nm/llvm-nm.cpp @@ -597,6 +597,10 @@ static void darwinPrintStab(MachOObjectFile *MachO, SymbolListT::iterator I) { outs() << Str; } +static bool symbolIsDefined(const NMSymbol &Sym) { + return Sym.TypeChar != 'U' && Sym.TypeChar != 'w' && Sym.TypeChar != 'v'; +} + static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, const std::string &ArchiveName, const std::string &ArchitectureName) { @@ -683,24 +687,28 @@ static void sortAndPrintSymbolList(SymbolicFile &Obj, bool printName, char SymbolAddrStr[18] = ""; char SymbolSizeStr[18] = ""; - if (OutputFormat == sysv || I->TypeChar == 'U') { - if (OutputFormat == posix) + // If the format is SysV or the symbol isn't defined, then print spaces. + if (OutputFormat == sysv || !symbolIsDefined(*I)) { + if (OutputFormat == posix) { format(printFormat, I->Address) .print(SymbolAddrStr, sizeof(SymbolAddrStr)); - else + format(printFormat, I->Size) + .print(SymbolSizeStr, sizeof(SymbolSizeStr)); + } else { strcpy(SymbolAddrStr, printBlanks); + strcpy(SymbolSizeStr, printBlanks); + } } - if (OutputFormat == sysv) - strcpy(SymbolSizeStr, printBlanks); - if (I->TypeChar != 'U') { + // Otherwise, print the symbol address and size. + if (symbolIsDefined(*I)) { if (Obj.isIR()) strcpy(SymbolAddrStr, printDashes); else format(printFormat, I->Address) .print(SymbolAddrStr, sizeof(SymbolAddrStr)); + format(printFormat, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr)); } - format(printFormat, I->Size).print(SymbolSizeStr, sizeof(SymbolSizeStr)); // If OutputFormat is darwin or we are printing Mach-O symbols in hex and // we have a MachOObjectFile, call darwinPrintSymbol to print as darwin's |