From 1b985af0ba97dcc51adfd384611a329c8d86954b Mon Sep 17 00:00:00 2001 From: Kevin Enderby Date: Tue, 20 May 2014 23:04:47 +0000 Subject: [PATCH] =?utf8?q?Update=20MachOObjectFile::getSymbolAddress=20so?= =?utf8?q?=20it=20returns=20UnknownAddressOrSize=20for=20undefined=20symbo?= =?utf8?q?ls,=20so=20it=20matches=20what=20COFFObjectFile::getSymbolAddres?= =?utf8?q?s=20does.=20=20This=20allows=20llvm-nm=20to=20print=20spaces=20i?= =?utf8?q?nstead=20of=200=E2=80=99s=20for=20the=20value=20of=20undefined?= =?utf8?q?=20symbols=20in=20Mach-O=20files.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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. llvm-svn: 209253 --- llvm/lib/Object/MachOObjectFile.cpp | 20 +++++++++++++++++--- llvm/test/Object/nm-trivial-object.test | 8 ++++---- llvm/test/Object/nm-universal-binary.test | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/llvm/lib/Object/MachOObjectFile.cpp b/llvm/lib/Object/MachOObjectFile.cpp index 0951460..c6bab03 100644 --- a/llvm/lib/Object/MachOObjectFile.cpp +++ b/llvm/lib/Object/MachOObjectFile.cpp @@ -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; } @@ -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; @@ -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; @@ -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; } } diff --git a/llvm/test/Object/nm-trivial-object.test b/llvm/test/Object/nm-trivial-object.test index 1117492..20ac662 100644 --- a/llvm/test/Object/nm-trivial-object.test +++ b/llvm/test/Object/nm-trivial-object.test @@ -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. diff --git a/llvm/test/Object/nm-universal-binary.test b/llvm/test/Object/nm-universal-binary.test index faf4812..c20c733 100644 --- a/llvm/test/Object/nm-universal-binary.test +++ b/llvm/test/Object/nm-universal-binary.test @@ -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 -- 2.7.4