[llvm] r209253 - Update MachOObjectFile::getSymbolAddress so it returns UnknownAddressOrSize

Kevin Enderby enderby at apple.com
Tue May 20 16:04:47 PDT 2014


Author: enderby
Date: Tue May 20 18:04:47 2014
New Revision: 209253

URL: http://llvm.org/viewvc/llvm-project?rev=209253&view=rev
Log:
Update MachOObjectFile::getSymbolAddress so it returns UnknownAddressOrSize
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.

Modified:
    llvm/trunk/lib/Object/MachOObjectFile.cpp
    llvm/trunk/test/Object/nm-trivial-object.test
    llvm/trunk/test/Object/nm-universal-binary.test

Modified: llvm/trunk/lib/Object/MachOObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/MachOObjectFile.cpp?rev=209253&r1=209252&r2=209253&view=diff
==============================================================================
--- llvm/trunk/lib/Object/MachOObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/MachOObjectFile.cpp Tue May 20 18:04:47 2014
@@ -472,10 +472,18 @@ error_code MachOObjectFile::getSymbolAdd
                                              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::getSymbolSiz
   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::getSymbolSiz
     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
     if ((MachOType & MachO::N_TYPE) == MachO::N_UNDF) {
       uint64_t Value;
       getSymbolAddress(DRI, Value);
-      if (Value)
+      if (Value && Value != UnknownAddressOrSize)
         Result |= SymbolRef::SF_Common;
     }
   }

Modified: llvm/trunk/test/Object/nm-trivial-object.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-trivial-object.test?rev=209253&r1=209252&r2=209253&view=diff
==============================================================================
--- llvm/trunk/test/Object/nm-trivial-object.test (original)
+++ llvm/trunk/test/Object/nm-trivial-object.test Tue May 20 18:04:47 2014
@@ -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.

Modified: llvm/trunk/test/Object/nm-universal-binary.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/nm-universal-binary.test?rev=209253&r1=209252&r2=209253&view=diff
==============================================================================
--- llvm/trunk/test/Object/nm-universal-binary.test (original)
+++ llvm/trunk/test/Object/nm-universal-binary.test Tue May 20 18:04:47 2014
@@ -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





More information about the llvm-commits mailing list