Common symbols are not undefined, at least for ObjectFile.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 7 Jul 2015 14:26:39 +0000 (14:26 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 7 Jul 2015 14:26:39 +0000 (14:26 +0000)
They are implemented like that in some object formats, but for the interface
provided by lib/Object, SF_Undefined and SF_Common are different things.

This matches the ELF and COFF implementation and fixes llvm-nm for MachO.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241587 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Object/MachOObjectFile.cpp
test/Object/X86/nm-macho.s [new file with mode: 0644]

index ce56531345539494c975dc5d88d1ebd164cddf45..54e4624af1388d97dffd72ae0f6a246d82d2a45f 100644 (file)
@@ -418,9 +418,6 @@ uint32_t MachOObjectFile::getSymbolFlags(DataRefImpl DRI) const {
 
   uint32_t Result = SymbolRef::SF_None;
 
-  if ((MachOType & MachO::N_TYPE) == MachO::N_UNDF)
-    Result |= SymbolRef::SF_Undefined;
-
   if ((MachOType & MachO::N_TYPE) == MachO::N_INDR)
     Result |= SymbolRef::SF_Indirect;
 
@@ -432,6 +429,8 @@ uint32_t MachOObjectFile::getSymbolFlags(DataRefImpl DRI) const {
     if ((MachOType & MachO::N_TYPE) == MachO::N_UNDF) {
       if (getNValue(DRI))
         Result |= SymbolRef::SF_Common;
+      else
+        Result |= SymbolRef::SF_Undefined;
     }
 
     if (!(MachOType & MachO::N_PEXT))
diff --git a/test/Object/X86/nm-macho.s b/test/Object/X86/nm-macho.s
new file mode 100644 (file)
index 0000000..7bdfa34
--- /dev/null
@@ -0,0 +1,9 @@
+// RUN: llvm-mc %s -o %t -filetype=obj -triple=x86_64-apple-darwin
+// RUN: llvm-nm -n %t | FileCheck %s
+// CHECK: 0000000000000000 t _f
+// CHECK: 0000000000000004 C _a
+
+_f:
+       retq
+
+       .comm   _a,4