Index: llvm/trunk/test/Object/nm-trivial-object.test =================================================================== --- llvm/trunk/test/Object/nm-trivial-object.test +++ llvm/trunk/test/Object/nm-trivial-object.test @@ -79,10 +79,9 @@ 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 Index: llvm/trunk/test/tools/llvm-nm/X86/weak.test =================================================================== --- llvm/trunk/test/tools/llvm-nm/X86/weak.test +++ llvm/trunk/test/tools/llvm-nm/X86/weak.test @@ -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 Index: llvm/trunk/tools/llvm-nm/llvm-nm.cpp =================================================================== --- llvm/trunk/tools/llvm-nm/llvm-nm.cpp +++ llvm/trunk/tools/llvm-nm/llvm-nm.cpp @@ -597,6 +597,10 @@ 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 @@ 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