|
Revision tags: llvmorg-20.1.0, llvmorg-20.1.0-rc3, llvmorg-20.1.0-rc2, llvmorg-20.1.0-rc1, llvmorg-21-init, llvmorg-19.1.7, llvmorg-19.1.6, llvmorg-19.1.5, llvmorg-19.1.4, llvmorg-19.1.3, llvmorg-19.1.2, llvmorg-19.1.1, llvmorg-19.1.0, llvmorg-19.1.0-rc4, llvmorg-19.1.0-rc3, llvmorg-19.1.0-rc2, llvmorg-19.1.0-rc1, llvmorg-20-init, llvmorg-18.1.8, llvmorg-18.1.7, llvmorg-18.1.6, llvmorg-18.1.5, llvmorg-18.1.4, llvmorg-18.1.3, llvmorg-18.1.2, llvmorg-18.1.1, llvmorg-18.1.0, llvmorg-18.1.0-rc4, llvmorg-18.1.0-rc3, llvmorg-18.1.0-rc2, llvmorg-18.1.0-rc1, llvmorg-19-init, llvmorg-17.0.6, llvmorg-17.0.5, llvmorg-17.0.4, llvmorg-17.0.3, llvmorg-17.0.2, llvmorg-17.0.1, llvmorg-17.0.0, llvmorg-17.0.0-rc4, llvmorg-17.0.0-rc3, llvmorg-17.0.0-rc2, llvmorg-17.0.0-rc1, llvmorg-18-init, llvmorg-16.0.6, llvmorg-16.0.5, llvmorg-16.0.4, llvmorg-16.0.3, llvmorg-16.0.2, llvmorg-16.0.1, llvmorg-16.0.0, llvmorg-16.0.0-rc4, llvmorg-16.0.0-rc3, llvmorg-16.0.0-rc2, llvmorg-16.0.0-rc1, llvmorg-17-init, llvmorg-15.0.7, llvmorg-15.0.6, llvmorg-15.0.5, llvmorg-15.0.4, llvmorg-15.0.3, llvmorg-15.0.2, llvmorg-15.0.1, llvmorg-15.0.0, llvmorg-15.0.0-rc3, llvmorg-15.0.0-rc2, llvmorg-15.0.0-rc1, llvmorg-16-init |
|
| #
b2c53a92 |
| 25-Jul-2022 |
Daniel Bertalan <[email protected]> |
[lld-macho] Implement -hidden-l
Similarly to -load_hidden, this flag instructs the linker to not export symbols from the specified archive. While that flag takes a path, -hidden-l looks for the spec
[lld-macho] Implement -hidden-l
Similarly to -load_hidden, this flag instructs the linker to not export symbols from the specified archive. While that flag takes a path, -hidden-l looks for the specified library name in the search path.
The test changes are needed because -hidden-lfoo resolves to libfoo.a, not foo.a.
Differential Revision: https://reviews.llvm.org/D130529
show more ...
|
| #
595fc59f |
| 25-Jul-2022 |
Daniel Bertalan <[email protected]> |
Reland "[lld-macho] Implement -load_hidden"
This flag was introduced in ld64-609. It instructs the linker to link to a static library while treating its symbols as if they had hidden visibility. Thi
Reland "[lld-macho] Implement -load_hidden"
This flag was introduced in ld64-609. It instructs the linker to link to a static library while treating its symbols as if they had hidden visibility. This is useful when building a dylib that links to static libraries but we don't want the symbols from those to be exported.
Closes #51505
This reland adds bitcode file handling, so we won't get any compile errors due to BitcodeFile::forceHidden being unused.
Differential Revision: https://reviews.llvm.org/D130473
show more ...
|
| #
9bf1c6da |
| 25-Jul-2022 |
Daniel Bertalan <[email protected]> |
Revert "[lld-macho] Implement -load_hidden"
This reverts commit 4c79e1a3f4eb790f40239833ae237e828ce07386.
Broke this bot: https://lab.llvm.org/buildbot/#builders/57/builds/20319
|
| #
4c79e1a3 |
| 25-Jul-2022 |
Daniel Bertalan <[email protected]> |
[lld-macho] Implement -load_hidden
This flag was introduced in ld64-609. It instructs the linker to link to a static library while treating its symbols as if they had hidden visibility. This is usef
[lld-macho] Implement -load_hidden
This flag was introduced in ld64-609. It instructs the linker to link to a static library while treating its symbols as if they had hidden visibility. This is useful when building a dylib that links to static libraries but we don't want the symbols from those to be exported.
Closes #51505
Differential Revision: https://reviews.llvm.org/D130473
show more ...
|
| #
d23da0ec |
| 23-Jul-2022 |
Jez Ng <[email protected]> |
[lld-macho] Fold __objc_imageinfo sections
Previously, we treated it as a regular ConcatInputSection. However, ld64 actually parses its contents and uses that to synthesize a single image info struc
[lld-macho] Fold __objc_imageinfo sections
Previously, we treated it as a regular ConcatInputSection. However, ld64 actually parses its contents and uses that to synthesize a single image info struct, generating one 8-byte section instead of `8 * number of object files with ObjC code`.
I'm not entirely sure what impact this section has on the runtime, so I just tried to follow ld64's semantics as closely as possible in this diff. My main motivation though was to reduce binary size.
No significant perf change on chromium_framework on my 16-core Mac Pro:
base diff difference (95% CI) sys_time 1.764 ± 0.062 1.748 ± 0.032 [ -2.4% .. +0.5%] user_time 5.112 ± 0.104 5.106 ± 0.046 [ -0.9% .. +0.7%] wall_time 6.111 ± 0.184 6.085 ± 0.076 [ -1.6% .. +0.8%] samples 30 32
Reviewed By: #lld-macho, thakis
Differential Revision: https://reviews.llvm.org/D130125
show more ...
|
| #
15f685ea |
| 20-Jul-2022 |
Keith Smiley <[email protected]> |
[lld-macho] Fold cfstrings with --deduplicate-literals
Similar to cstrings ld64 always deduplicates cfstrings. This was already being done when enabling ICF, but for debug builds you may want to fli
[lld-macho] Fold cfstrings with --deduplicate-literals
Similar to cstrings ld64 always deduplicates cfstrings. This was already being done when enabling ICF, but for debug builds you may want to flip this on if you cannot eliminate your instances of this, so this change makes --deduplicate-literals also apply to cfstrings.
Differential Revision: https://reviews.llvm.org/D130134
show more ...
|
| #
360c1111 |
| 20-Jul-2022 |
Kazu Hirata <[email protected]> |
Use llvm::is_contained (NFC)
|
| #
87ce7b41 |
| 20-Jul-2022 |
Jez Ng <[email protected]> |
[lld-macho] Simplify archive loading logic
This is a follow-on to {D129556}. I've refactored the code such that `addFile()` no longer needs to take an extra parameter. Additionally, the "do we force
[lld-macho] Simplify archive loading logic
This is a follow-on to {D129556}. I've refactored the code such that `addFile()` no longer needs to take an extra parameter. Additionally, the "do we force-load or not" policy logic is now fully contained within addFile, instead of being split between `addFile` and `parseLCLinkerOptions`. This also allows us to move the `ForceLoad` (now `LoadType`) enum out of the header file.
Additionally, we can now correctly report loads induced by `LC_LINKER_OPTION` in our `-why_load` output.
I've also added another test to check that CLI library non-force-loads take precedence over `LC_LINKER_OPTION` + `-force_load_swift_libs`. (The existing logic is correct, just untested.)
Reviewed By: #lld-macho, thakis
Differential Revision: https://reviews.llvm.org/D130137
show more ...
|
| #
dd563554 |
| 19-Jul-2022 |
Kaining Zhong <[email protected]> |
[lld-macho] Fix loading same libraries from both LC_LINKER_OPTION and command line
This fixes https://github.com/llvm/llvm-project/issues/56059 and https://github.com/llvm/llvm-project/issues/56440.
[lld-macho] Fix loading same libraries from both LC_LINKER_OPTION and command line
This fixes https://github.com/llvm/llvm-project/issues/56059 and https://github.com/llvm/llvm-project/issues/56440. This is inspired by tapthaker's patch (https://reviews.llvm.org/D127941), and has reused his test cases. This patch adds an bool "isCommandLineLoad" to indicate where archives are from. If lld tries to load the same library loaded previously by LC_LINKER_OPTION from CLI, it will use this isCommandLineLoad to determine if it should be affected by -all_load & -ObjC flags. This also prevents -force_load from affecting archives loaded previously from CLI without such flag, whereas tapthaker's patch will fail such test case (introduced by https://reviews.llvm.org/D128025).
Reviewed By: int3, #lld-macho
Differential Revision: https://reviews.llvm.org/D129556
show more ...
|
| #
0bc10098 |
| 16-Jul-2022 |
Keith Smiley <[email protected]> |
[lld-macho] Add support for -alias
This creates a symbol alias similar to --defsym in the elf linker. This is used by swiftpm for all executables, so it's useful to support. This doesn't implement -
[lld-macho] Add support for -alias
This creates a symbol alias similar to --defsym in the elf linker. This is used by swiftpm for all executables, so it's useful to support. This doesn't implement -alias_list but that could be done pretty easily as needed.
Differential Revision: https://reviews.llvm.org/D129938
show more ...
|
| #
403d61ae |
| 14-Jul-2022 |
Jez Ng <[email protected]> |
[lld-macho] Enable EH frame relocation / pruning
This just removes the code that gates the logic. The main issue here is perf impact: without {D122258}, LLD takes a significant perf hit because it n
[lld-macho] Enable EH frame relocation / pruning
This just removes the code that gates the logic. The main issue here is perf impact: without {D122258}, LLD takes a significant perf hit because it now has to do a lot more work in the input parsing phase. But with that change to eliminate unnecessary EH frames from input object files, the perf overhead here is minimal. Concretely, here are the numbers for some builds as measured on my 16-core Mac Pro:
**chromium_framework**
This is without the use of `-femit-dwarf-unwind=no-compact-unwind`:
base diff difference (95% CI) sys_time 1.826 ± 0.019 1.962 ± 0.034 [ +6.5% .. +8.4%] user_time 9.306 ± 0.054 9.926 ± 0.082 [ +6.2% .. +7.1%] wall_time 8.225 ± 0.068 8.947 ± 0.128 [ +8.0% .. +9.6%] samples 15 22
With that flag enabled, the regression mostly disappears, as hoped:
base diff difference (95% CI) sys_time 1.839 ± 0.062 1.866 ± 0.068 [ -0.9% .. +3.8%] user_time 9.452 ± 0.068 9.490 ± 0.067 [ -0.1% .. +0.9%] wall_time 8.383 ± 0.127 8.452 ± 0.114 [ -0.1% .. +1.8%] samples 17 21
**Unnamed internal app**
Without `-femit-dwarf-unwind`, this is the perf hit:
base diff difference (95% CI) sys_time 1.372 ± 0.029 1.317 ± 0.024 [ -4.6% .. -3.5%] user_time 2.835 ± 0.028 2.980 ± 0.027 [ +4.8% .. +5.4%] wall_time 3.205 ± 0.079 3.383 ± 0.066 [ +4.9% .. +6.2%] samples 102 83
With `-femit-dwarf-unwind`, the perf hit almost disappears:
base diff difference (95% CI) sys_time 1.274 ± 0.026 1.270 ± 0.025 [ -0.9% .. +0.3%] user_time 2.812 ± 0.023 2.822 ± 0.035 [ +0.1% .. +0.7%] wall_time 3.166 ± 0.047 3.174 ± 0.059 [ -0.2% .. +0.7%] samples 95 97
Just for fun, I measured the impact of `-femit-dwarf-unwind` on ld64 (`base` has the extra DWARF unwind info in the input object files, `diff` doesn't):
base diff difference (95% CI) sys_time 1.128 ± 0.010 1.124 ± 0.023 [ -1.3% .. +0.6%] user_time 7.176 ± 0.030 7.106 ± 0.094 [ -1.5% .. -0.4%] wall_time 7.874 ± 0.041 7.795 ± 0.121 [ -1.7% .. -0.3%] samples 16 25
And for LLD:
base diff difference (95% CI) sys_time 1.315 ± 0.019 1.280 ± 0.019 [ -3.2% .. -2.0%] user_time 2.980 ± 0.022 2.822 ± 0.016 [ -5.5% .. -5.0%] wall_time 3.369 ± 0.038 3.175 ± 0.033 [ -6.2% .. -5.3%] samples 47 47
So parsing the extra EH frames is a lot more expensive for us than for ld64. But given that we are quite a lot faster than ld64 to begin with, I guess this isn't entirely unexpected...
Reviewed By: #lld-macho, oontvoo
Differential Revision: https://reviews.llvm.org/D129540
show more ...
|
|
Revision tags: llvmorg-14.0.6 |
|
| #
a3f67f09 |
| 17-Jun-2022 |
Daniel Bertalan <[email protected]> |
[lld-macho] Initial support for Linker Optimization Hints
Linker optimization hints mark a sequence of instructions used for synthesizing an address, like ADRP+ADD. If the referenced symbol ends up
[lld-macho] Initial support for Linker Optimization Hints
Linker optimization hints mark a sequence of instructions used for synthesizing an address, like ADRP+ADD. If the referenced symbol ends up close enough, it can be replaced by a faster sequence of instructions like ADR+NOP.
This commit adds support for 2 of the 7 defined ARM64 optimization hints: - LOH_ARM64_ADRP_ADD, which transforms a pair of ADRP+ADD into ADR+NOP if the referenced address is within +/- 1 MiB - LOH_ARM64_ADRP_ADRP, which transforms two ADRP instructions into ADR+NOP if they reference the same page
These two kinds already cover more than 50% of all LOHs in chromium_framework.
Differential Review: https://reviews.llvm.org/D128093
show more ...
|
| #
a2c1f7c9 |
| 23-Jun-2022 |
Nico Weber <[email protected]> |
[lld, ELF and mac] Add --time-trace=<file>, remove --time-trace-file=<file>
`--time-trace=foo` has the same behavior as `--time-trace --time-trace-file=<file>` had previously.
Also, for mac, make -
[lld, ELF and mac] Add --time-trace=<file>, remove --time-trace-file=<file>
`--time-trace=foo` has the same behavior as `--time-trace --time-trace-file=<file>` had previously.
Also, for mac, make --time-trace-granularity *not* imply --time-trace, to match behavior of the ELF port.
Differential Revision: https://reviews.llvm.org/D128451
show more ...
|
| #
0ec87add |
| 22-Jun-2022 |
Nico Weber <[email protected]> |
[lld/mac] Add a few TimeTraceScopes
Identical literal folding takes ~1.4% of the time, and was missing from the trace.
Signature computation still needs ~2.2% of the time, so probably worth explici
[lld/mac] Add a few TimeTraceScopes
Identical literal folding takes ~1.4% of the time, and was missing from the trace.
Signature computation still needs ~2.2% of the time, so probably worth explicitly marking its contribution to "Write output file" (9.1%)
Differential Revision: https://reviews.llvm.org/D128343
show more ...
|
| #
272bf0fc |
| 11-Jun-2022 |
Keith Smiley <[email protected]> |
[lld-macho] Add support for exporting no symbols
As an optimization for ld64 sometimes it can be useful to not export any symbols for top level binaries that don't need any exports, to do this you c
[lld-macho] Add support for exporting no symbols
As an optimization for ld64 sometimes it can be useful to not export any symbols for top level binaries that don't need any exports, to do this you can pass `-exported_symbols_list /dev/null`, or new with Xcode 14 (ld64 816) there is a `-no_exported_symbols` flag for the same behavior. This reproduces this behavior where previously an empty exported symbols list file would have been ignored.
Differential Revision: https://reviews.llvm.org/D127562
show more ...
|
| #
e183bf8e |
| 13-Jun-2022 |
Jez Ng <[email protected]> |
[lld-macho][reland] Initial support for EH Frames
This reverts commit 942f4e3a7cc9a9f8b2654817cff12907d1276031.
The additional change required to avoid the assertion errors seen previously is:
-
[lld-macho][reland] Initial support for EH Frames
This reverts commit 942f4e3a7cc9a9f8b2654817cff12907d1276031.
The additional change required to avoid the assertion errors seen previously is:
--- a/lld/MachO/ICF.cpp +++ b/lld/MachO/ICF.cpp @@ -443,7 +443,9 @@ void macho::foldIdenticalSections() { /*relocVA=*/0); isec->data = copy; } - } else { + } else if (!isEhFrameSection(isec)) { + // EH frames are gathered as hashables from unwindEntry above; give a + // unique ID to everything else. isec->icfEqClass[0] = ++icfUniqueID; } }
Differential Revision: https://reviews.llvm.org/D123435
show more ...
|
|
Revision tags: llvmorg-14.0.5 |
|
| #
942f4e3a |
| 09-Jun-2022 |
Douglas Yung <[email protected]> |
Revert "[lld-macho] Initial support for EH Frames"
This reverts commit 826be330af9c0a8553a5b32718ecd2d97e10438e.
This was causing a test failure on build bots: - https://lab.llvm.org/buildbot/#/b
Revert "[lld-macho] Initial support for EH Frames"
This reverts commit 826be330af9c0a8553a5b32718ecd2d97e10438e.
This was causing a test failure on build bots: - https://lab.llvm.org/buildbot/#/builders/36/builds/21770 - https://lab.llvm.org/buildbot/#/builders/58/builds/23913
show more ...
|
| #
826be330 |
| 09-Jun-2022 |
Jez Ng <[email protected]> |
[lld-macho] Initial support for EH Frames
== Background ==
`llvm-mc` generates unwind info in both compact unwind and DWARF formats. LLD already handles the compact unwind format; this diff gets us
[lld-macho] Initial support for EH Frames
== Background ==
`llvm-mc` generates unwind info in both compact unwind and DWARF formats. LLD already handles the compact unwind format; this diff gets us close to handling the DWARF format properly.
== Caveats ==
It's not quite done yet, but I figure it's worth getting this reviewed and landed first as it's shaping up to be a fairly large code change.
**Known limitations of the current code:**
* Only works for x86_64, for which `llvm-mc` emits "abs-ified" relocations as described in https://github.com/llvm/llvm-project/commit/618def651b59bd42c05bbd91d825af2fb2145683. `llvm-mc` emits regular relocations for ARM EH frames, which we do not yet handle correctly.
Since the feature is not ready for real use yet, I've gated it behind a flag that only gets toggled on during test suite runs. With most of the new code disabled, we see just a hint of perf regression, so I don't think it'd be remiss to land this as-is:
base diff difference (95% CI) sys_time 1.926 ± 0.168 1.979 ± 0.117 [ -1.2% .. +6.6%] user_time 3.590 ± 0.033 3.606 ± 0.028 [ +0.0% .. +0.9%] wall_time 7.104 ± 0.184 7.179 ± 0.151 [ -0.2% .. +2.3%] samples 30 31
== Design ==
Like compact unwind entries, EH frames are also represented as regular ConcatInputSections that get pointed to via `Defined::unwindEntry`. This allows them to be handled generically by e.g. the MarkLive and ICF code. (But note that unlike compact unwind subsections, EH frame subsections do end up in the final binary.)
In order to make EH frames "look like" a regular ConcatInputSection, some processing is required. First, we need to split the `__eh_frame` section along EH frame boundaries rather than along symbol boundaries. We do this by decoding the length field of each EH frame. Second, the abs-ified relocations need to be turned into regular Relocs.
== Next Steps ==
In order to support EH frames on ARM targets, we will either have to teach LLD how to handle EH frames with explicit relocs, or we can try to make `llvm-mc` emit abs-ified relocs for ARM as well. I'm hoping to do the latter as I think it will make the LLD implementation both simpler and faster to execute.
== Misc ==
The `obj-file-with-stabs.s` test had to be updated as the previous version would trip assertion errors in the code. It appears that in our attempt to produce a minimal YAML test input, we created a file with invalid EH frame data. I've fixed this by re-generating the YAML and not doing any hand-pruning of it.
Reviewed By: #lld-macho, Roger
Differential Revision: https://reviews.llvm.org/D123435
show more ...
|
| #
82de9bb6 |
| 01-Jun-2022 |
Vy Nguyen <[email protected]> |
[lld-macho] Addressed additional post-commit comments from D126046
- fixed newlines - renamed helper function for clarity - added additional comment
Differential Revision: https://reviews.llvm.org
[lld-macho] Addressed additional post-commit comments from D126046
- fixed newlines - renamed helper function for clarity - added additional comment
Differential Revision: https://reviews.llvm.org/D126792
show more ...
|
|
Revision tags: llvmorg-14.0.4 |
|
| #
fae6bd75 |
| 20-May-2022 |
Vy Nguyen <[email protected]> |
[lld-macho] Support -non_global_symbols_strip_list, -non_global_symbols_no_strip_list, -x
PR/55600
Differential Revision: https://reviews.llvm.org/D126046
|
| #
4c5b187f |
| 16-May-2022 |
Vy Nguyen <[email protected]> |
[lld-macho] Demangle symbol names in export-symbol error messages when -demangle is specified. PR/55512
Reviewed By: keith
Differential Revision: https://reviews.llvm.org/D125732
|
|
Revision tags: llvmorg-14.0.3, llvmorg-14.0.2 |
|
| #
895a7211 |
| 22-Apr-2022 |
Nico Weber <[email protected]> |
[lld/mac] Support writing zippered dylibs and bundles
With -platform_version flags for two distinct platforms, this writes a LC_BUILD_VERSION header for each.
The motivation is that this is needed
[lld/mac] Support writing zippered dylibs and bundles
With -platform_version flags for two distinct platforms, this writes a LC_BUILD_VERSION header for each.
The motivation is that this is needed for self-hosting with lld as linker after D124059.
To create a zippered output at the clang driver level, pass
-target arm64-apple-macos -darwin-target-variant arm64-apple-ios-macabi
to create a zippered dylib.
(In Xcode's clang, `-darwin-target-variant` is spelled just `-target-variant`.)
(If you pass `-target arm64-apple-ios-macabi -target-variant arm64-apple-macos` instead, ld64 crashes!)
This results in two -platform_version flags being passed to the linker.
ld64 also verifies that the iOS SDK version is at least 13.1. We don't do that yet. But ld64 also does that for other platforms and we don't. So we need to do that at some point, but not in this patch.
Only dylib and bundle outputs can be zippered.
I verified that a Catalyst app linked against a dylib created with
clang -shared foo.cc -o libfoo.dylib \ -target arm64-apple-macos \ -target-variant arm64-apple-ios-macabi \ -Wl,-install_name,@rpath/libfoo.dylib \ -fuse-ld=$PWD/out/gn/bin/ld64.lld
runs successfully. (The app calls a function `f()` in libfoo.dylib that returns a const char* "foo", and NSLog(@"%s")s it.)
ld64 is a bit more permissive when writing zippered outputs, see references to "unzippered twins". That's not implemented yet. (If anybody wants to implement that, D124275 is a good start.)
Differential Revision: https://reviews.llvm.org/D124887
show more ...
|
| #
e29dc0c6 |
| 04-May-2022 |
Alex Borcan <[email protected]> |
[lld] Implement safe icf for MachO
This change implements --icf=safe for MachO based on addrsig section that is implemented in D123751.
Reviewed By: int3, #lld-macho
Differential Revision: https:/
[lld] Implement safe icf for MachO
This change implements --icf=safe for MachO based on addrsig section that is implemented in D123751.
Reviewed By: int3, #lld-macho
Differential Revision: https://reviews.llvm.org/D123752
show more ...
|
| #
3254f468 |
| 22-Apr-2022 |
Nico Weber <[email protected]> |
[lld/mac] For catalyst outputs, tolerate implicitly linking against mac-only tbd files
Before this,
clang empty.cc -target x86_64-apple-ios13.1-macabi \ -framework CoreServices -fuse-ld=lld
[lld/mac] For catalyst outputs, tolerate implicitly linking against mac-only tbd files
Before this,
clang empty.cc -target x86_64-apple-ios13.1-macabi \ -framework CoreServices -fuse-ld=lld
would error out with
ld64.lld: error: path/to/MacOSX.sdk/System/Library/Frameworks/ CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/ Versions/A/CarbonCore.tbd( /System/Library/Frameworks/ CoreServices.framework/Versions/A/Frameworks/CarbonCore.framework/ Versions/A/CarbonCore) is incompatible with x86_64 (macCatalyst)
Now it works, like with ld64.
Differential Revision: https://reviews.llvm.org/D124336
show more ...
|
| #
2d8cf26d |
| 22-Apr-2022 |
Keith Smiley <[email protected]> |
[lld-macho] Fix crash on invalid framework tbd
Previously these would crash because `file` is null in the case there is an invalid tbd file.
Differential Revision: https://reviews.llvm.org/D124271
|