]> granicus.if.org Git - llvm/commitdiff
llvm-nm: Don't print value or size for undefined or weak symbols
authorMeador Inge <meadori@codesourcery.com>
Wed, 23 Nov 2016 20:17:15 +0000 (20:17 +0000)
committerMeador Inge <meadori@codesourcery.com>
Wed, 23 Nov 2016 20:17:15 +0000 (20:17 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287802 91177308-0d34-0410-b5e6-96231b3b80d8

test/Object/nm-trivial-object.test
test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 [new file with mode: 0644]
test/tools/llvm-nm/X86/weak.test [new file with mode: 0644]
tools/llvm-nm/llvm-nm.cpp

index def6549d65630455643d2655f6ed100a99f0704d..c1f4d9e1f96ff9044fc0ab22554100960f5a21cb 100644 (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
diff --git a/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 b/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
new file mode 100644 (file)
index 0000000..8aa41bf
Binary files /dev/null and b/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 differ
diff --git a/test/tools/llvm-nm/X86/weak.test b/test/tools/llvm-nm/X86/weak.test
new file mode 100644 (file)
index 0000000..19bcd84
--- /dev/null
@@ -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 5e6dbcbf662865e3d2b9e0c32cffb4de2bd4d266..e89d1d31048266cd08ce9c73b79df31abe3384c7 100644 (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