summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMeador Inge <meadori@codesourcery.com>2016-11-23 20:17:15 +0000
committerMeador Inge <meadori@codesourcery.com>2016-11-23 20:17:15 +0000
commitf74d99950d3f3e2f67859d190e404b27adfd41f7 (patch)
treef1a40bff84a6a0149739602c9534bbff5bc3a926
parent2eaacda53e0cab1c38bf077b2700ed6ef65e2b25 (diff)
downloadbcm5719-llvm-f74d99950d3f3e2f67859d190e404b27adfd41f7.tar.gz
bcm5719-llvm-f74d99950d3f3e2f67859d190e404b27adfd41f7.zip
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
-rw-r--r--llvm/test/Object/nm-trivial-object.test5
-rw-r--r--llvm/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64bin0 -> 1448 bytes
-rw-r--r--llvm/test/tools/llvm-nm/X86/weak.test6
-rw-r--r--llvm/tools/llvm-nm/llvm-nm.cpp22
4 files changed, 23 insertions, 10 deletions
diff --git a/llvm/test/Object/nm-trivial-object.test b/llvm/test/Object/nm-trivial-object.test
index def6549d656..c1f4d9e1f96 100644
--- a/llvm/test/Object/nm-trivial-object.test
+++ b/llvm/test/Object/nm-trivial-object.test
@@ -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/llvm/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64 b/llvm/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
new file mode 100644
index 00000000000..8aa41bf4f37
--- /dev/null
+++ b/llvm/test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
Binary files differ
diff --git a/llvm/test/tools/llvm-nm/X86/weak.test b/llvm/test/tools/llvm-nm/X86/weak.test
new file mode 100644
index 00000000000..19bcd846ddd
--- /dev/null
+++ b/llvm/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
diff --git a/llvm/tools/llvm-nm/llvm-nm.cpp b/llvm/tools/llvm-nm/llvm-nm.cpp
index 5e6dbcbf662..e89d1d31048 100644
--- a/llvm/tools/llvm-nm/llvm-nm.cpp
+++ b/llvm/tools/llvm-nm/llvm-nm.cpp
@@ -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
OpenPOWER on IntegriCloud