[lld] r210502 - [mach-o] parse multiple symbols on same address into aliases

Nick Kledzik kledzik at apple.com
Mon Jun 9 16:35:38 PDT 2014


Author: kledzik
Date: Mon Jun  9 18:35:37 2014
New Revision: 210502

URL: http://llvm.org/viewvc/llvm-project?rev=210502&view=rev
Log:
[mach-o] parse multiple symbols on same address into aliases

Added:
    lld/trunk/test/mach-o/parse-aliases.yaml
Modified:
    lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp

Modified: lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp?rev=210502&r1=210501&r2=210502&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp (original)
+++ lld/trunk/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp Mon Jun  9 18:35:37 2014
@@ -254,10 +254,19 @@ error_code processSymboledSection(Define
   appendSymbolsInSection(normalizedFile.globalSymbols, sectIndex, symbols);
   appendSymbolsInSection(normalizedFile.localSymbols,  sectIndex, symbols);
 
-  // Sort symbols by address.
+  // Sort symbols.
   std::sort(symbols.begin(), symbols.end(),
             [](const Symbol *lhs, const Symbol *rhs) -> bool {
-              return lhs->value < rhs->value;
+              // First by address.
+              if (lhs->value != rhs->value)
+                return lhs->value < rhs->value;
+              // If same address, one is an alias.  Sort by scope.
+              Atom::Scope lScope = atomScope(lhs->scope);
+              Atom::Scope rScope = atomScope(rhs->scope);
+              if (lScope != rScope)
+                return lScope < rScope;
+              // If same address and scope, sort by name.   
+              return (lhs->name.compare(rhs->name) < 1);
             });
 
   // Debug logging of symbols.

Added: lld/trunk/test/mach-o/parse-aliases.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/mach-o/parse-aliases.yaml?rev=210502&view=auto
==============================================================================
--- lld/trunk/test/mach-o/parse-aliases.yaml (added)
+++ lld/trunk/test/mach-o/parse-aliases.yaml Mon Jun  9 18:35:37 2014
@@ -0,0 +1,90 @@
+# RUN: lld -flavor darwin -arch x86_64 -r -print_atoms %s -o %t  | FileCheck %s
+#
+# Test multiple labels to same address parse into aliases.
+#
+
+--- !mach-o
+arch:            x86_64
+file-type:       MH_OBJECT
+flags:           [ MH_SUBSECTIONS_VIA_SYMBOLS ]
+has-UUID:        false
+OS:              unknown
+sections:
+  - segment:         __TEXT
+    section:         __text
+    type:            S_REGULAR
+    attributes:      [ S_ATTR_PURE_INSTRUCTIONS, S_ATTR_SOME_INSTRUCTIONS ]
+    alignment:       4
+    address:         0x0000000000000000
+    content:         [ 0xCC, 0xC3 ]
+local-symbols:
+  - name:            _pad
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x0000000000000000
+  - name:            _myStaticAlias1
+    type:            N_SECT
+    sect:            1
+    value:           0x0000000000000001
+  - name:            _myStaticAlias3
+    type:            N_SECT
+    sect:            1
+    value:           0x0000000000000001
+  - name:            _myStaticAlias2
+    type:            N_SECT
+    sect:            1
+    value:           0x0000000000000001
+global-symbols:
+  - name:            _myGlobalFunc1
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x0000000000000001
+  - name:            _myGlobalFunc2
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x0000000000000001
+  - name:            _myGlobalFunc3
+    type:            N_SECT
+    scope:           [ N_EXT ]
+    sect:            1
+    value:           0x0000000000000001
+  - name:            _myHiddenAlias1
+    type:            N_SECT
+    scope:           [ N_EXT, N_PEXT ]
+    sect:            1
+    value:           0x0000000000000001
+  - name:            _myHiddenAlias2
+    type:            N_SECT
+    scope:           [ N_EXT, N_PEXT ]
+    sect:            1
+    value:           0x0000000000000001
+  - name:            _myHiddenAlias3
+    type:            N_SECT
+    scope:           [ N_EXT, N_PEXT ]
+    sect:            1
+    value:           0x0000000000000001
+...
+
+# CHECK: defined-atoms:   
+# CHECK:   - name:            _pad
+# CHECK:     scope:           global
+# CHECK:     content:         [ CC ]
+# CHECK:   - name:            _myStaticAlias1
+# CHECK:   - name:            _myStaticAlias2
+# CHECK:   - name:            _myStaticAlias3
+# CHECK:   - name:            _myHiddenAlias1
+# CHECK:     scope:           hidden
+# CHECK:   - name:            _myHiddenAlias2
+# CHECK:     scope:           hidden
+# CHECK:   - name:            _myHiddenAlias3
+# CHECK:     scope:           hidden
+# CHECK:   - name:            _myGlobalFunc1
+# CHECK:     scope:           global
+# CHECK:   - name:            _myGlobalFunc2
+# CHECK:     scope:           global
+# CHECK:   - name:            _myGlobalFunc3
+# CHECK:     scope:           global
+# CHECK:     content:         [ C3 ]





More information about the llvm-commits mailing list