llvm-project/lld/test/mach-o/use-simple-dylib.yaml

74 lines
2.5 KiB
YAML
Raw Normal View History

# RUN: lld -flavor darwin -arch x86_64 -print_atoms -r %s \
# RUN: %p/Inputs/use-simple-dylib.yaml -o %t | FileCheck %s
--- !mach-o
arch: x86_64
file-type: MH_OBJECT
flags: [ ]
has-UUID: false
OS: unknown
sections:
- segment: __TEXT
section: __text
type: S_REGULAR
attributes: [ S_ATTR_PURE_INSTRUCTIONS ]
address: 0x0000000000000000
content: [ 0x55, 0x48, 0x89, 0xE5, 0xE8, 0x00, 0x00, 0x00,
0x00, 0xE8, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x00,
0x00, 0x00, 0x00, 0xE8, 0x00, 0x00, 0x00, 0x00,
0xE8, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xE9, 0x00,
0x00, 0x00, 0x00 ]
global-symbols:
- name: _foo
type: N_SECT
scope: [ N_EXT ]
sect: 1
value: 0x0000000000000000
undefined-symbols:
- name: _myGlobal
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
- name: _myGlobalWeak
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
- name: _myHidden
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
- name: _myHiddenWeak
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
- name: _myResolver
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
- name: _myStatic
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
- name: _myVariablePreviouslyKnownAsPrivateExtern
type: N_UNDF
scope: [ N_EXT ]
value: 0x0000000000000000
...
# CHECK: undefined-atoms:
# CHECK: - name: _myStatic
# CHECK: - name: _myVariablePreviouslyKnownAsPrivateExtern
# CHECK: shared-library-atoms:
# CHECK: - name: _myGlobal
# CHECK: load-name: libspecial.dylib
# CHECK: - name: _myGlobalWeak
# CHECK: load-name: libspecial.dylib
Core: Make the resolver faster. In the resolver, we maintain a list of undefined symbols, and when we visit an archive file, we check that file if undefined symbols can be resolved using files in the archive. The archive file class provides find() function to lookup a symbol. Previously, we call find() for each undefined symbols. Archive files may be visited multiple times if they are in a --start-group and --end-group. If we visit a file M times and if we have N undefined symbols, find() is called M*N times. I found that that is one of the most significant bottlenecks in LLD when linking a large executable. find() is not a very cheap operation because it looks up a hash table for a given string. And a string, or a symbol name, can be pretty long if you are dealing with C++ symbols. We can eliminate the bottleneck. Calling find() with the same symbol multiple times is a waste. If a result of looking up a symbol is "not found", it stays "not found" forever because the symbol simply doesn't exist in the archive. Thus, we should call find() only for newly-added undefined symbols. This optimization makes O(M*N) O(N). In this patch, all undefined symbols are added to a vector. For each archive/shared library file, we maintain a start position P. All symbols [0, P) are already searched. [P, end of the vector) are not searched yet. For each file, we scan the vector only once. This patch changes the order in which undefined symbols are looked for. Previously, we iterated over the result of _symbolTable.undefines(). Now we iterate over the new vector. This is a benign change but caused differences in output if remaining undefines exist. This is why some tests are updated. The performance improvement of this patch seems sometimes significant. Previously, linking chrome.dll on my workstation (Xeon 2.4GHz 8 cores) took about 70 seconds. Now it takes (only?) 30 seconds! http://reviews.llvm.org/D8091 llvm-svn: 231434
2015-03-06 08:28:41 +08:00
# CHECK: - name: _myHidden
# CHECK: load-name: libspecial.dylib
# CHECK: - name: _myHiddenWeak
# CHECK: load-name: libspecial.dylib
# CHECK: - name: _myResolver
# CHECK: load-name: libspecial.dylib