mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-18 18:42:46 +02:00
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
This commit is contained in:
parent
ee7135385b
commit
4761d43258
@ -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
|
||||
|
BIN
test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
Normal file
BIN
test/tools/llvm-nm/X86/Inputs/weak.obj.elf-x86_64
Normal file
Binary file not shown.
6
test/tools/llvm-nm/X86/weak.test
Normal file
6
test/tools/llvm-nm/X86/weak.test
Normal file
@ -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
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user