]> granicus.if.org Git - llvm/commitdiff
Fix llvm-nm to mach OS X's nm on some tests.
authorRafael Espindola <rafael.espindola@gmail.com>
Sat, 2 Nov 2013 05:03:24 +0000 (05:03 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sat, 2 Nov 2013 05:03:24 +0000 (05:03 +0000)
There is still a long way to go for llvm-nm, but at least we now match
nm's letter output in the cases we test for.

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

lib/Object/MachOObjectFile.cpp
test/Object/Inputs/weak-global-symbol.macho-i386 [new file with mode: 0644]
test/Object/nm-trivial-object.test
test/Object/nm-weak-global-macho.test [new file with mode: 0644]

index 3040094f14b818bbc6d77a5ea06170409f957950..f48bb8a7fe0925a55e56e3f145b74e95de7b5bd8 100644 (file)
@@ -594,24 +594,35 @@ error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
 error_code MachOObjectFile::getSymbolNMTypeChar(DataRefImpl Symb,
                                                 char &Res) const {
   nlist_base Entry = getSymbolTableEntryBase(this, Symb);
-  uint8_t Type = Entry.n_type;
-  uint16_t Flags = Entry.n_desc;
+  uint8_t NType = Entry.n_type;
 
   char Char;
-  switch (Type & MachO::N_TYPE) {
+  switch (NType & MachO::N_TYPE) {
     case MachO::N_UNDF:
       Char = 'u';
       break;
     case MachO::N_ABS:
-    case MachO::N_SECT:
       Char = 's';
       break;
+    case MachO::N_SECT: {
+      section_iterator Sec = end_sections();
+      getSymbolSection(Symb, Sec);
+      DataRefImpl Ref = Sec->getRawDataRefImpl();
+      StringRef SectionName;
+      getSectionName(Ref, SectionName);
+      StringRef SegmentName = getSectionFinalSegmentName(Ref);
+      if (SegmentName == "__TEXT" && SectionName == "__text")
+        Char = 't';
+      else
+        Char = 's';
+    }
+      break;
     default:
       Char = '?';
       break;
   }
 
-  if (Flags & (MachO::N_EXT | MachO::N_PEXT))
+  if (NType & (MachO::N_EXT | MachO::N_PEXT))
     Char = toupper(static_cast<unsigned char>(Char));
   Res = Char;
   return object_error::success;
@@ -630,7 +641,7 @@ error_code MachOObjectFile::getSymbolFlags(DataRefImpl DRI,
   if ((MachOType & MachO::N_TYPE) == MachO::N_UNDF)
     Result |= SymbolRef::SF_Undefined;
 
-  if (MachOFlags & MachO::N_STAB)
+  if (MachOType & MachO::N_STAB)
     Result |= SymbolRef::SF_FormatSpecific;
 
   if (MachOType & MachO::N_EXT) {
diff --git a/test/Object/Inputs/weak-global-symbol.macho-i386 b/test/Object/Inputs/weak-global-symbol.macho-i386
new file mode 100644 (file)
index 0000000..a9c8e0c
Binary files /dev/null and b/test/Object/Inputs/weak-global-symbol.macho-i386 differ
index d5177457a8df64c2d5172f74fe32a3be8599e1d8..748d6f20d5108c8e688ba302eb57e8eacf1da611 100644 (file)
@@ -25,10 +25,10 @@ ELF:          U puts
 
 
 macho: 00000000 U _SomeOtherFunction
-macho: 00000000 s _main
+macho: 00000000 T _main
 macho: 00000000 U _puts
 
 macho64: 00000028 s L_.str
-macho64: 00000000 u _SomeOtherFunction
-macho64: 00000000 s _main
-macho64: 00000000 u _puts
+macho64: 00000000 U _SomeOtherFunction
+macho64: 00000000 T _main
+macho64: 00000000 U _puts
diff --git a/test/Object/nm-weak-global-macho.test b/test/Object/nm-weak-global-macho.test
new file mode 100644 (file)
index 0000000..ede2609
--- /dev/null
@@ -0,0 +1,3 @@
+RUN: llvm-nm %p/Inputs/weak-global-symbol.macho-i386 | FileCheck %s
+
+CHECK: 00000000 S _a