Skip to content

Commit

Permalink
Update MachOObjectFile::getSymbolAddress so it returns UnknownAddress…
Browse files Browse the repository at this point in the history
…OrSize

for undefined symbols, so it matches what COFFObjectFile::getSymbolAddress
does.  This allows llvm-nm to print spaces instead of 0’s for the value
of undefined symbols in Mach-O files.

To make this change other uses of MachOObjectFile::getSymbolAddress
are updated to handle when the Value is returned as UnknownAddressOrSize.
Which is needed to keep two of the ExecutionEngine tests working for example.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209253 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
enderby committed May 20, 2014
1 parent acf6215 commit b38059a
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 8 deletions.
20 changes: 17 additions & 3 deletions lib/Object/MachOObjectFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -472,10 +472,18 @@ error_code MachOObjectFile::getSymbolAddress(DataRefImpl Symb,
uint64_t &Res) const {
if (is64Bit()) {
MachO::nlist_64 Entry = getSymbol64TableEntry(Symb);
Res = Entry.n_value;
if ((Entry.n_type & MachO::N_TYPE) == MachO::N_UNDF &&
Entry.n_value == 0)
Res = UnknownAddressOrSize;
else
Res = Entry.n_value;
} else {
MachO::nlist Entry = getSymbolTableEntry(Symb);
Res = Entry.n_value;
if ((Entry.n_type & MachO::N_TYPE) == MachO::N_UNDF &&
Entry.n_value == 0)
Res = UnknownAddressOrSize;
else
Res = Entry.n_value;
}
return object_error::success;
}
Expand All @@ -501,6 +509,10 @@ error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI,
nlist_base Entry = getSymbolTableEntryBase(this, DRI);
uint64_t Value;
getSymbolAddress(DRI, Value);
if (Value == UnknownAddressOrSize) {
Result = UnknownAddressOrSize;
return object_error::success;
}

BeginOffset = Value;

Expand All @@ -519,6 +531,8 @@ error_code MachOObjectFile::getSymbolSize(DataRefImpl DRI,
DataRefImpl DRI = Symbol.getRawDataRefImpl();
Entry = getSymbolTableEntryBase(this, DRI);
getSymbolAddress(DRI, Value);
if (Value == UnknownAddressOrSize)
continue;
if (Entry.n_sect == SectionIndex && Value > BeginOffset)
if (!EndOffset || Value < EndOffset)
EndOffset = Value;
Expand Down Expand Up @@ -578,7 +592,7 @@ uint32_t MachOObjectFile::getSymbolFlags(DataRefImpl DRI) const {
if ((MachOType & MachO::N_TYPE) == MachO::N_UNDF) {
uint64_t Value;
getSymbolAddress(DRI, Value);
if (Value)
if (Value && Value != UnknownAddressOrSize)
Result |= SymbolRef::SF_Common;
}
}
Expand Down
8 changes: 4 additions & 4 deletions test/Object/nm-trivial-object.test
Original file line number Diff line number Diff line change
Expand Up @@ -55,14 +55,14 @@ WEAK-ELF64: 0000000000000000 V x2
ABSOLUTE-ELF64: 0000000000000123 a a1
ABSOLUTE-ELF64: 0000000000000123 A a2

macho: 00000000 U _SomeOtherFunction
macho: U _SomeOtherFunction
macho: 00000000 T _main
macho: 00000000 U _puts
macho: U _puts

macho64: 0000000000000028 s L_.str
macho64: 0000000000000000 U _SomeOtherFunction
macho64: U _SomeOtherFunction
macho64: 0000000000000000 T _main
macho64: 0000000000000000 U _puts
macho64: U _puts


Test that nm uses addresses even with ELF .o files.
Expand Down
2 changes: 1 addition & 1 deletion test/Object/nm-universal-binary.test
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ CHECK-AR: 0000000000000068 s EH_frame0
CHECK-AR: 000000000000003b s L_.str
CHECK-AR: 0000000000000000 T _main
CHECK-AR: 0000000000000080 S _main.eh
CHECK-AR: 0000000000000000 U _printf
CHECK-AR: U _printf
CHECK-AR: macho-universal-archive.x86_64.i386:i386:foo.o:
CHECK-AR: 00000008 S _bar
CHECK-AR: 00000000 T _foo

0 comments on commit b38059a

Please sign in to comment.