aboutsummaryrefslogtreecommitdiff
path: root/lld
AgeCommit message (Collapse)AuthorFilesLines
2022-07-26Bump the trunk major version to 16llvmorg-16-initTom Stellard1-29/+0
2022-07-26[lld-macho] Fix -bitcode_process_mode arg typeKeith Smiley1-1/+1
This is still undocumented and unsupported, but if someone passed it before you would end up with a missing file error since this takes an argument that wouldn't be handled. Differential Revision: https://reviews.llvm.org/D130606
2022-07-26[ELF] addDependentLibrary: fix a use-after-free bug in archiveNameFangrui Song2-7/+13
2022-07-26[ELF] addLibrary: fix a use-after-free bug in archiveNameFangrui Song2-4/+4
It manifests as an incorrect name in --print-archive-stats=.
2022-07-26[ELF][test] Clean up print-archive-stats.sFangrui Song1-18/+20
2022-07-26[WPD] Use new llvm.public.type.test intrinsic for potentially publicly ↵Arthur Eubanks1-0/+27
visible classes Turning on opaque pointers has uncovered an issue with WPD where we currently pattern match away `assume(type.test)` in WPD so that a later LTT doesn't resolve the type test to undef and introduce an `assume(false)`. The pattern matching can fail in cases where we transform two `assume(type.test)`s into `assume(phi(type.test.1, type.test.2))`. Currently we create `assume(type.test)` for all virtual calls that might be devirtualized. This is to support `-Wl,--lto-whole-program-visibility`. To prevent this, all virtual calls that may not be in the same LTO module instead use a new `llvm.public.type.test` intrinsic in place of the `llvm.type.test`. Then when we know if `-Wl,--lto-whole-program-visibility` is passed or not, we can either replace all `llvm.public.type.test` with `llvm.type.test`, or replace all `llvm.public.type.test` with `true`. This prevents WPD from trying to pattern match away `assume(type.test)` for public virtual calls when failing the pattern matching will result in miscompiles. Reviewed By: tejohnson Differential Revision: https://reviews.llvm.org/D128955
2022-07-26[CMake] Fix add_subdirectory llvm buildsSebastian Neubauer1-1/+1
Fixes a regression from D117973, that used CMAKE_BINARY_DIR instead of LLVM_BINARY_DIR in some places. Differential Revision: https://reviews.llvm.org/D130555
2022-07-26[llvm-objdump,ARM] Add PrettyPrinters for Arm and AArch64.Simon Tatham51-968/+968
Most Arm disassemblers, including GNU objdump and Arm's own `fromelf`, emit an instruction's raw encoding as a 32-bit words or (for Thumb) one or two 16-bit halfwords, in logical order rather than according to their storage endianness. This is generally easier to read: it matches the encoding diagrams in the architecture spec, it matches the value you'd write in a `.inst` directive, and it means that fields within the instruction encoding that span more than one byte (such as branch offsets or `SVC` immediates) can be read directly in the encoding without having to mentally reverse the bytes. llvm-objdump already has a system of PrettyPrinter subclasses which makes it easy for a target to drop in its own preferred formatting. This patch adds pretty-printers for all the Arm targets, so that llvm-objdump will display Arm instruction encodings in their preferred layout instead of little-endian and bytewise. Reviewed By: DavidSpickett Differential Revision: https://reviews.llvm.org/D130358
2022-07-26[lld-macho] Implement -hidden-lDaniel Bertalan3-13/+23
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
2022-07-25[cmake] Support custom package install pathsJohn Ericson1-6/+11
Firstly, we we make an additional GNUInstallDirs-style variable. With NixOS, for example, this is crucial as we want those to go in `${dev}/lib/cmake` not `${out}/lib/cmake` as that would a cmake subdir of the "regular" libdir, which is installed even when no one needs to do any development. Secondly, we make *Config.cmake robust to absolute package install paths. We for NixOS will in fact be passing them absolute paths to make the `${dev}` vs `${out}` distinction mentioned above, and the GNUInstallDirs-style variables are suposed to support absolute paths in general so it's good practice besides the NixOS use-case. Thirdly, we make `${project}_INSTALL_PACKAGE_DIR` CACHE PATHs like other install dirs are. Reviewed By: sebastian-ne Differential Revision: https://reviews.llvm.org/D117973
2022-07-25Reland "[lld-macho] Implement -load_hidden"Daniel Bertalan8-31/+160
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
2022-07-25Revert "[lld-macho] Implement -load_hidden"Daniel Bertalan7-131/+30
This reverts commit 4c79e1a3f4eb790f40239833ae237e828ce07386. Broke this bot: https://lab.llvm.org/buildbot/#builders/57/builds/20319
2022-07-25[lld-macho] Implement -load_hiddenDaniel Bertalan7-30/+131
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
2022-07-25[lld-macho] Demangle location name in undefined symbol diagnosticsDaniel Bertalan2-8/+14
If the `-demangle` flag is passed to lld, symbol names will now be demangled in the "referenced by:" message in addition to the referenced symbol's name, which was already demangled before this change. Differential Revision: https://reviews.llvm.org/D130490
2022-07-25[ELF] --reproduce: support --export-dynamic-symbol-listFangrui Song2-1/+5
2022-07-25[ELF] Simplify --build-id/--color-diagnostics with AliasArgs. NFCFangrui Song3-24/+14
2022-07-24Remove redundaunt override specifiers (NFC)Kazu Hirata1-4/+2
Identified with modernize-use-override.
2022-07-24[ELF] Optimize some non-constant alignTo with alignToPowerOf2. NFCFangrui Song6-32/+39
My x86-64 lld executable is 2KiB smaller. .eh_frame writing gets faster as there were lots of divisions.
2022-07-23Convert for_each to range-based for loops (NFC)Kazu Hirata2-10/+11
2022-07-23[lld-macho][nfc] Reduce nesting of code added in D130125Jez Ng1-11/+11
2022-07-23Use static_assert instead of assert (NFC)Kazu Hirata2-2/+3
Identified with misc-static-assert.
2022-07-23[lld-macho] Fold __objc_imageinfo sectionsJez Ng9-8/+296
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
2022-07-23[lld-macho] Fix segfault when handling LTO + object file weak defsJez Ng3-2/+182
which occurs when there are EH frames present in the object file's weak def. Reviewed By: abrachet Differential Revision: https://reviews.llvm.org/D130409
2022-07-23Use llvm::sort instead of std::sort where possibleDmitri Gribenko4-11/+13
llvm::sort is beneficial even when we use the iterator-based overload, since it can optionally shuffle the elements (to detect non-determinism). However llvm::sort is not usable everywhere, for example, in compiler-rt. Reviewed By: nhaehnle Differential Revision: https://reviews.llvm.org/D130406
2022-07-22[ELF] Internalize isBitcode. NFCFangrui Song2-4/+4
2022-07-22[ELF] --fortran-common: remove unneeded identify_magic call. NFCFangrui Song1-1/+1
2022-07-22[ELF] Simplify createObjectFile/createLazyFile. NFCFangrui Song4-35/+31
And avoid redundant identify_magic test.
2022-07-22Use any_of (NFC)Kazu Hirata1-6/+4
2022-07-21[cmake] Don't export `LLVM_TOOLS_INSTALL_DIR` anymoreJohn Ericson2-2/+6
First of all, `LLVM_TOOLS_INSTALL_DIR` put there breaks our NixOS builds, because `LLVM_TOOLS_INSTALL_DIR` defined the same as `CMAKE_INSTALL_BINDIR` becomes an *absolute* path, and then when downstream projects try to install there too this breaks because our builds always install to fresh directories for isolation's sake. Second of all, note that `LLVM_TOOLS_INSTALL_DIR` stands out against the other specially crafted `LLVM_CONFIG_*` variables substituted in `llvm/cmake/modules/LLVMConfig.cmake.in`. @beanz added it in d0e1c2a550ef348aae036d0fe78cab6f038c420c to fix a dangling reference in `AddLLVM`, but I am suspicious of how this variable doesn't follow the pattern. Those other ones are carefully made to be build-time vs install-time variables depending on which `LLVMConfig.cmake` is being generated, are carefully made relative as appropriate, etc. etc. For my NixOS use-case they are also fine because they are never used as downstream install variables, only for reading not writing. To avoid the problems I face, and restore symmetry, I deleted the exported and arranged to have many `${project}_TOOLS_INSTALL_DIR`s. `AddLLVM` now instead expects each project to define its own, and they do so based on `CMAKE_INSTALL_BINDIR`. `LLVMConfig` still exports `LLVM_TOOLS_BINARY_DIR` which is the location for the tools defined in the usual way, matching the other remaining exported variables. For the `AddLLVM` changes, I tried to copy the existing pattern of internal vs non-internal or for LLVM vs for downstream function/macro names, but it would good to confirm I did that correctly. Reviewed By: nikic Differential Revision: https://reviews.llvm.org/D117977
2022-07-21[lld-macho] Fix LOH parsing segfaultJez Ng2-1/+26
`advanceSubsection()` didn't account for the possibility that a section could have no subsections. Reviewed By: #lld-macho, thakis, BertalanD Differential Revision: https://reviews.llvm.org/D130288
2022-07-21[lld-macho] Fix assertion when two symbols at same addr have unwind infoJez Ng4-1/+193
If there are multiple symbols at the same address, our unwind info implementation assumes that we always register unwind entries to a single canonical symbol. This assumption was violated by the `registerEhFrame` code. Fixes #56570. Reviewed By: #lld-macho, thakis Differential Revision: https://reviews.llvm.org/D130208
2022-07-21[lld-macho][NFC] Remove redundant StringRef constructionDaniel Bertalan1-2/+1
It's only used in one branch, so we were unnecessarily calculating the length of many symbol names. Tiny speedup when linking chromium_framework on my M1 Mac mini: x before.txt + after.txt N Min Max Median Avg Stddev x 10 3.9917109 4.0418 4.0318099 4.0203902 0.021459873 + 10 3.944725 4.053988 3.9708955 3.9825602 0.037257609 Difference at 95.0% confidence -0.03783 +/- 0.0285663 -0.940953% +/- 0.710536% (Student's t, pooled s = 0.0304028) Differential Revision: https://reviews.llvm.org/D130234
2022-07-21[lld-macho] Optimize rebase opcode generationDaniel Bertalan2-74/+161
This commit reduces the size of the emitted rebase sections by generating the REBASE_OPCODE_DO_REBASE_ADD_ADDR_ULEB and REBASE_OPCODE_DO_REBASE_ULEB_TIMES_SKIPPING_ULEB opcodes. With this change, chromium_framework's rebase section is a 40% smaller 197 kilobytes, down from the previous 320 kB. That is 6 kB smaller than what ld64 produces for the same input. Performance figures from my M1 Mac mini: x before + after N Min Max Median Avg Stddev x 10 4.2269349 4.3300061 4.2689675 4.2690016 0.031151669 + 10 4.219331 4.2914009 4.2398136 4.2448277 0.023817308 No difference proven at 95.0% confidence Differential Revision: https://reviews.llvm.org/D130180
2022-07-20[lld-macho] Fold cfstrings with --deduplicate-literalsKeith Smiley5-17/+26
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
2022-07-20Use llvm::is_contained (NFC)Kazu Hirata1-2/+1
2022-07-20[LLD] [COFF] Improve the error message for too many exported symbolsMartin Storsjö2-2/+2
Print the actual number of symbols that would have been exported too, which helps assessing the situation. Differential Revision: https://reviews.llvm.org/D130117
2022-07-19[lld-macho] Simplify archive loading logicJez Ng3-48/+64
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
2022-07-19[lld-macho] Read in new addrsig formatJez Ng1-12/+7
The new format uses symbol relocations, as described in {D127637}. Reviewed By: #lld-macho, alx32 Differential Revision: https://reviews.llvm.org/D128938
2022-07-19[lld-macho] Fix loading same libraries from both LC_LINKER_OPTION and ↵Kaining Zhong2-28/+81
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
2022-07-19[lld-macho] Add support for -aliasKeith Smiley6-1/+68
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
2022-07-19[test] Convert some tests to use opaque pointersArthur Eubanks1-30/+23
2022-07-19[lld-macho] Support folding of functions with identical LSDAsJez Ng5-13/+91
To do this, we need to slice away the LSDA pointer, just like we are slicing away the functionAddress pointer. No observable difference in perf on chromium_framework: base diff difference (95% CI) sys_time 1.769 ± 0.068 1.761 ± 0.065 [ -2.7% .. +1.8%] user_time 9.517 ± 0.110 9.528 ± 0.116 [ -0.6% .. +0.8%] wall_time 8.291 ± 0.174 8.307 ± 0.183 [ -1.1% .. +1.5%] samples 21 25 Reviewed By: #lld-macho, thakis Differential Revision: https://reviews.llvm.org/D129830
2022-07-18[lld-macho] Devirtualize TargetInfo::getRelocAttrsDaniel Bertalan5-89/+73
This method is called on each relocation when parsing input files, so the overhead of using virtual functions ends up being quite large. We now have a single non-virtual method, which reads from the appropriate array of relocation attributes set in the TargetInfo constructor. This change results in a modest 2.3% reduction in link time for chromium_framework measured on an x86-64 VPS, and 0.7% on an arm64 Mac. N Min Max Median Avg Stddev x 10 11.869417 12.032609 11.935041 11.938268 0.045802324 + 10 11.581526 11.785265 11.649885 11.659507 0.054634834 Difference at 95.0% confidence -0.278761 +/- 0.0473673 -2.33502% +/- 0.396768% (Student's t, pooled s = 0.0504124) Differential Revision: https://reviews.llvm.org/D130000
2022-07-17fix comment typo to cycle botsNico Weber1-1/+1
2022-07-16[lld-macho] Handle filename being passed in -lto_object_pathDaniel Bertalan3-13/+62
Clang passes a filename rather than a directory in -lto_object_path when using FullLTO. Previously, it was always treated it as a directory, so lld would crash when it attempted to create temporary files inside it. Fixes #54805 Differential Revision: https://reviews.llvm.org/D129705
2022-07-16[lld-macho][nfc] Add more tests + comments around ICF + unwind info interactionJez Ng2-6/+61
While working on {D129830}, I realized that our handling of ICF + eh_frame combined was untested. Additionally I realized that the comment explaining why we were safely slicing away the functionAddress reloc from our compact unwind entries was... insufficient and slightly misleading. I've tried to clarify it. Reviewed By: #lld-macho, thevinster Differential Revision: https://reviews.llvm.org/D129894
2022-07-15Use value instead of getValue (NFC)Kazu Hirata5-6/+6
2022-07-15[lld-macho][nfc] Fix numeric substitutions in icf.s testJez Ng1-41/+41
We were re-defining the various numeric variables when we actually intended to check already-defined variables against the value on the current CHECK line. Reviewed By: #lld-macho, thakis Differential Revision: https://reviews.llvm.org/D129831
2022-07-15[ELF][RISCV] Relax local-exec TLS modelFangrui Song2-34/+129
In -mrelax mode, GCC/Clang may generate a local-exec TLS code sequence like: ``` # R_RISCV_TPREL_HI20, R_RISCV_RELAX lui rd, %tprel_hi(x) # R_RISCV_TPREL_ADD, R_RISCV_RELAX add rd, rd, tp, %tprel_add(x) # (R_RISCV_TPREL_LO12_I || R_RISCV_TPREL_LO12_S), R_RISCV_RELAX addi rd, rd, %tprel_lo(x) || sw rs, %tprel(x)(rd) ``` Note: st_value(x) for TLS should be in the range [0,p_memsz(PT_TLS)). When st_value(x) < 2048 (i.e. hi20(x) == 0), the linker can relax the code sequence to: ``` addi rd, tp, st_value(x) || sw rs, st_value(x)(rd) ``` Differential Revision: https://reviews.llvm.org/D129425
2022-07-15[ELF] Reword --no-allow-shlib-undefined diagnosticFangrui Song4-7/+10
Use a format more similar to unresolved references from regular object files. It's probably easier to read for people who are less familiar with the linker diagnostics. Reviewed By: ikudrin Differential Revision: https://reviews.llvm.org/D129790