From 6152f7d59615de9e4fa869bdc89570560c34bddb Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sat, 2 Nov 2013 05:03:24 +0000 Subject: [PATCH] Fix llvm-nm to mach OS X's nm on some tests. 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 | 23 +++++++++++++----- .../Inputs/weak-global-symbol.macho-i386 | Bin 0 -> 344 bytes test/Object/nm-trivial-object.test | 8 +++--- test/Object/nm-weak-global-macho.test | 3 +++ 4 files changed, 24 insertions(+), 10 deletions(-) create mode 100644 test/Object/Inputs/weak-global-symbol.macho-i386 create mode 100644 test/Object/nm-weak-global-macho.test diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 3040094f14b..f48bb8a7fe0 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -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(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 index 0000000000000000000000000000000000000000..a9c8e0cde1563ab97e5929b2bf553110427e468d GIT binary patch literal 344 zcmX^2>+L^w1_lOZAZCQp8X$%Ognt0Y#0FS^f-XRHAR43}gqeUC1mfdMQY%UzYzRNZ zH6jGThp|BV(Le)?A0MBRSdy5WpO_P$2Qn%?-o-J*5he?vVQzrg3lilfCNYnNKF6`BLk2;2$KV}fSN#h`I#CZ+T#-$0Dk8bZ~y=R literal 0 HcmV?d00001 diff --git a/test/Object/nm-trivial-object.test b/test/Object/nm-trivial-object.test index d5177457a8d..748d6f20d51 100644 --- a/test/Object/nm-trivial-object.test +++ b/test/Object/nm-trivial-object.test @@ -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 index 00000000000..ede26090f95 --- /dev/null +++ b/test/Object/nm-weak-global-macho.test @@ -0,0 +1,3 @@ +RUN: llvm-nm %p/Inputs/weak-global-symbol.macho-i386 | FileCheck %s + +CHECK: 00000000 S _a