[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