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
This commit is contained in:
Meador Inge 2016-11-23 20:17:15 +00:00
parent 2eaacda53e
commit f74d99950d
4 changed files with 23 additions and 10 deletions

View File

@ -79,10 +79,9 @@ ELF: U SomeOtherFunction
ELF: 00000000 T main
ELF: U puts
FIXME: we should not print the size of undefined symbols.
ELF-SIZE: 00000000 U SomeOtherFunction
ELF-SIZE: U SomeOtherFunction
ELF-SIZE-NEXT: 00000000 00000024 T main
ELF-SIZE-NEXT: 00000000 U puts
ELF-SIZE-NEXT: U puts
ELF-o: {{.*}}/trivial-object-test.elf-i386: U SomeOtherFunction
ELF-o: {{.*}}/trivial-object-test.elf-i386: 00000000 T main

Binary file not shown.

View File

@ -0,0 +1,6 @@
# RUN: llvm-nm -B -S %p/Inputs/weak.obj.elf-x86_64 | FileCheck --match-full-lines %s
CHECK: w weak_extern_func
CHECK: w weak_extern_var
CHECK: 0000000000000000 0000000000000011 W weak_func
CHECK: 0000000000000000 0000000000000004 V weak_var

View File

@ -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