diff options
| author | Nick Kledzik <kledzik@apple.com> | 2014-06-09 23:35:37 +0000 |
|---|---|---|
| committer | Nick Kledzik <kledzik@apple.com> | 2014-06-09 23:35:37 +0000 |
| commit | b423266e93bb21a09b11c3d3ed689a524bdb03c6 (patch) | |
| tree | 3e0093ca19c7a2b79ef2801c1ab4b7703444b1b9 | |
| parent | 16bf89ecb2527fccac35afdb28771eb84f244eee (diff) | |
| download | bcm5719-llvm-b423266e93bb21a09b11c3d3ed689a524bdb03c6.tar.gz bcm5719-llvm-b423266e93bb21a09b11c3d3ed689a524bdb03c6.zip | |
[mach-o] parse multiple symbols on same address into aliases
llvm-svn: 210502
| -rw-r--r-- | lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp | 13 | ||||
| -rw-r--r-- | lld/test/mach-o/parse-aliases.yaml | 90 |
2 files changed, 101 insertions, 2 deletions
diff --git a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp index e5ce190f924..3ea49a4ac16 100644 --- a/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp +++ b/lld/lib/ReaderWriter/MachO/MachONormalizedFileToAtoms.cpp @@ -254,10 +254,19 @@ error_code processSymboledSection(DefinedAtom::ContentType atomType, 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. diff --git a/lld/test/mach-o/parse-aliases.yaml b/lld/test/mach-o/parse-aliases.yaml new file mode 100644 index 00000000000..457ea58133b --- /dev/null +++ b/lld/test/mach-o/parse-aliases.yaml @@ -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 ] |

