[PATCH] D26936: llvm-nm: Don't print value or size for undefined or weak symbols

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 23 09:39:06 PST 2016


LGTM.

Thanks,
Rafael


On 21 November 2016 at 17:08, Meador Inge via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> meadori created this revision.
> meadori added reviewers: llvm-commits, Bigcheese, enderby.
>
> 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/
>
>
> https://reviews.llvm.org/D26936
>
> Files:
>   test/Object/nm-trivial-object.test
>   test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
>   test/tools/llvm-nm/X86/weak.test
>   tools/llvm-nm/llvm-nm.cpp
>
>
> Index: tools/llvm-nm/llvm-nm.cpp
> ===================================================================
> --- tools/llvm-nm/llvm-nm.cpp
> +++ 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
> Index: test/tools/llvm-nm/X86/weak.test
> ===================================================================
> --- /dev/null
> +++ 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: test/Object/nm-trivial-object.test
> ===================================================================
> --- test/Object/nm-trivial-object.test
> +++ 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
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>


More information about the llvm-commits mailing list