|
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, llvmorg-14.0.6, llvmorg-14.0.5, llvmorg-14.0.4, llvmorg-14.0.3, llvmorg-14.0.2 |
|
| #
2a04f5c4 |
| 20-Apr-2022 |
Shoaib Meenai <[email protected]> |
[ELF] Drop unused original symbol after wrapping if not defined
We were previously only omitting the original of a wrapped symbol if it was not used by an object file and undefined. We can tighten t
[ELF] Drop unused original symbol after wrapping if not defined
We were previously only omitting the original of a wrapped symbol if it was not used by an object file and undefined. We can tighten the second condition to drop any symbol that isn't defined instead, which lets us drop a previous check (added in https://reviews.llvm.org/D118756) that was only covering some such symbols.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D124065
show more ...
|
| #
1af25a98 |
| 20-Apr-2022 |
Shoaib Meenai <[email protected]> |
[ELF] Fix wrapping symbols produced during LTO codegen
We were previously not correctly wrapping symbols that were only produced during LTO codegen and unreferenced before then, or symbols only refe
[ELF] Fix wrapping symbols produced during LTO codegen
We were previously not correctly wrapping symbols that were only produced during LTO codegen and unreferenced before then, or symbols only referenced from such symbols. The root cause was that we weren't marking the wrapped symbol as used if we only saw the use after LTO codegen, leading to the failed wrapping.
Fix this by explicitly tracking whether a symbol will become referenced after wrapping is done. We can use this property to tell LTO to preserve such symbols, instead of overload isUsedInRegularObj for this purpose. Since we're no longer setting isUsedInRegularObj for all symbols which will be wrapped, its value at the time of performing the wrapping in the symbol table will accurately reflect whether the symbol was actually used in an object (including in an LTO-generated object), and we can propagate that value to the wrapped symbol and thereby ensure we wrap correctly.
This incorrect wrapping was the only scenario I was aware of where we produced an invalid PLT relocation, which D123985 started diagnosing, and with it fixed, we lose the test for that diagnosis. I think it's worth keeping the diagnosis though, in case we run into other issues in the future which would be caught by it.
Fixes PR50675.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D124056
show more ...
|
|
Revision tags: llvmorg-14.0.1, llvmorg-14.0.0, llvmorg-14.0.0-rc4, llvmorg-14.0.0-rc3, llvmorg-14.0.0-rc2 |
|
| #
8ca46bba |
| 24-Feb-2022 |
Fangrui Song <[email protected]> |
[ELF] Move isUsedInRegularObj assignment from ctor to call sites. NFC
This removes the tricky `isUsedInRegularObj(!file || file->kind() == InputFile::ObjKind)` and the copy from `Symbol::mergeProper
[ELF] Move isUsedInRegularObj assignment from ctor to call sites. NFC
This removes the tricky `isUsedInRegularObj(!file || file->kind() == InputFile::ObjKind)` and the copy from `Symbol::mergeProperties`.
show more ...
|
| #
38fbedab |
| 24-Feb-2022 |
Fangrui Song <[email protected]> |
[ELF] Don't rely on Symbols.h's transitive inclusion of InputFiles.h. NFC
|
| #
88d66f6e |
| 22-Feb-2022 |
Fangrui Song <[email protected]> |
[ELF] Move duplicate symbol check after input file parsing
https://discourse.llvm.org/t/parallel-input-file-parsing/60164
To decouple symbol initialization and section initialization, `Defined::sec
[ELF] Move duplicate symbol check after input file parsing
https://discourse.llvm.org/t/parallel-input-file-parsing/60164
To decouple symbol initialization and section initialization, `Defined::section` assignment should be postponed after input file parsing. To avoid spurious duplicate definition error due to two definitions in COMDAT groups of the same signature, we should postpone the duplicate symbol check.
The function is called postScan instead of a more specific name like checkDuplicateSymbols, because we may merge Symbol::mergeProperties into postScan. It is placed after compileBitcodeFiles to apply to ET_REL files produced by LTO. This causes minor diagnostic regression for skipLinkedOutput configurations: ld.lld --thinlto-index-only a.bc b.o (bitcode definition prevails) won't detect duplicate symbol error. I think this is an acceptable compromise. The important cases where (a) both files are bitcode or (b) --thinlto-index-only is unused are still detected.
Reviewed By: ikudrin
Differential Revision: https://reviews.llvm.org/D119908
show more ...
|
|
Revision tags: llvmorg-14.0.0-rc1 |
|
| #
27bb7990 |
| 08-Feb-2022 |
Fangrui Song <[email protected]> |
[ELF] Clean up headers. NFC
|
| #
73f55fba |
| 05-Feb-2022 |
Fangrui Song <[email protected]> |
[ELF] Reorder Symbol members to improve access locality. NFC
* partition and isPreemptible are frequently used. Move it to the front * move used beside isUsedInRegularObj. They are similar and acces
[ELF] Reorder Symbol members to improve access locality. NFC
* partition and isPreemptible are frequently used. Move it to the front * move used beside isUsedInRegularObj. They are similar and accessed together in .symtab finalizing * move auxIdx/dynsymIndex/verdefIndex to the end.
This decreases code size.
show more ...
|
| #
7c675923 |
| 05-Feb-2022 |
Fangrui Song <[email protected]> |
[ELF] Merge canInline into scriptDefined
They perform similar tasks and are essentially the same after d28c26bbdd9e6e55cc0a6156e9879f7e0ca36329.
|
| #
7288b85c |
| 05-Feb-2022 |
Fangrui Song <[email protected]> |
[ELF] --wrap: don't copy exportDynamic
For -no-pie/-pie, when `__real_foo` is interposable in a shared object, `foo` is exported. This rule does not match GNU ld and is unneeded because:
* the expo
[ELF] --wrap: don't copy exportDynamic
For -no-pie/-pie, when `__real_foo` is interposable in a shared object, `foo` is exported. This rule does not match GNU ld and is unneeded because:
* the exported `foo` does not interpose `__real_foo` at run-time * the similar `__wrap_foo` <-> `foo` relation does not have the rule
show more ...
|
|
Revision tags: llvmorg-15-init, llvmorg-13.0.1, llvmorg-13.0.1-rc3, llvmorg-13.0.1-rc2 |
|
| #
10e40a4e |
| 05-Jan-2022 |
Luís Ferreira <[email protected]> |
[lld] Add support for other demanglers other than Itanium
LLVM core library supports demangling other mangled symbols other than itanium, such as D and Rust. LLD should use those demanglers in order
[lld] Add support for other demanglers other than Itanium
LLVM core library supports demangling other mangled symbols other than itanium, such as D and Rust. LLD should use those demanglers in order to output pretty demangled symbols on error messages.
Reviewed By: MaskRay, #lld-macho
Differential Revision: https://reviews.llvm.org/D116279
show more ...
|
| #
8792cd75 |
| 30-Dec-2021 |
Luís Ferreira <[email protected]> |
Revert "[lld] Add support for other demanglers other than Itanium"
This reverts commit e60d6dfd5acdc821d391ad5af2c706397bdfd36a.
clang-ppc64le-rhel buildbot failed (https://lab.llvm.org/buildbot#bu
Revert "[lld] Add support for other demanglers other than Itanium"
This reverts commit e60d6dfd5acdc821d391ad5af2c706397bdfd36a.
clang-ppc64le-rhel buildbot failed (https://lab.llvm.org/buildbot#builders/57/builds/13424):
tools/lld/MachO/CMakeFiles/lldMachO.dir/Symbols.cpp.o: In function `lld::demangle(llvm::StringRef, bool)': Symbols.cpp:(.text._ZN3lld8demangleEN4llvm9StringRefEb[_ZN3lld8demangleEN4llvm9StringRefEb]+0x90): undefined reference to `llvm::demangle(std::string const&)'
show more ...
|
| #
e60d6dfd |
| 30-Dec-2021 |
Luís Ferreira <[email protected]> |
[lld] Add support for other demanglers other than Itanium
LLVM core library supports demangling other mangled symbols other than itanium, such as D and Rust. LLD should use those demanglers in order
[lld] Add support for other demanglers other than Itanium
LLVM core library supports demangling other mangled symbols other than itanium, such as D and Rust. LLD should use those demanglers in order to output pretty demangled symbols on error messages.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D116279
show more ...
|
| #
7924b381 |
| 27-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] Add Symbol::hasVersionSuffix
"Process symbol versions" may take 2+% time. "Redirect symbols" may take 0.6% time. This change speeds up the two passes and makes `*sym.getVersionSuffix() == '@'`
[ELF] Add Symbol::hasVersionSuffix
"Process symbol versions" may take 2+% time. "Redirect symbols" may take 0.6% time. This change speeds up the two passes and makes `*sym.getVersionSuffix() == '@'` in the `undefined reference` diagnostic cleaner.
Linking chrome (no debug info) and another large program is 1.5% faster.
For empty-ver2.s: the behavior now matches GNU ld, though I'd consider the input invalid and the exact behavior does not matter.
show more ...
|
| #
1abbbc7b |
| 24-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] scanVersionScript: remove unused variable
|
| #
a2baf634 |
| 24-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] Simplify SymbolTable::insert. NFC
|
| #
417cd2e5 |
| 24-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] SymbolTable: change some vector<Symbol *> to SmallVector
The generated assembly for Symbol::insert is much shorter (std::vector resize is inefficient) and enables some inlining.
|
| #
5fc4323e |
| 22-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] Change some global pointers to unique_ptr
Currently the singleton `config` is assigned by `config = make<Configuration>()` and (if `canExitEarly` is false) destroyed by `lld::freeArena`.
`mak
[ELF] Change some global pointers to unique_ptr
Currently the singleton `config` is assigned by `config = make<Configuration>()` and (if `canExitEarly` is false) destroyed by `lld::freeArena`.
`make<Configuration>` allocates a stab with `malloc(4096)`. This both wastes memory and bloats the executable (every type instantiates `BumpPtrAllocator` which costs more than 1KiB code on x86-64).
(No need to worry about `clang::no_destroy`. Regular invocations (`canExitEarly` is true) call `_Exit` via llvm::sys::Process::ExitNoCleanup.)
Reviewed By: lichray
Differential Revision: https://reviews.llvm.org/D116143
show more ...
|
| #
b0211de5 |
| 16-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] Change Symbol::verdefIndex from uint32_t to uint16_t
The SHT_GNU_version index is 16-bit, so the 32-bit value is a waste. Technically non-default version index 0x7fff uses version index 0xffff
[ELF] Change Symbol::verdefIndex from uint32_t to uint16_t
The SHT_GNU_version index is 16-bit, so the 32-bit value is a waste. Technically non-default version index 0x7fff uses version index 0xffff, but it is impossible in practice.
This change decreases sizeof(SymbolUnion) from 80 to 72 on ELF64 platforms. Memory usage decreases by 1% when linking a large executable.
show more ...
|
| #
2bdad163 |
| 15-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] SymbolTable::insert: keep @@ in the name
* Avoid the name truncation quirk in SymbolTable::insert: the truncated name will be replaced by @@ again. * Allow foo and foo@@v1 in different files t
[ELF] SymbolTable::insert: keep @@ in the name
* Avoid the name truncation quirk in SymbolTable::insert: the truncated name will be replaced by @@ again. * Allow foo and foo@@v1 in different files to be diagnosed as duplicate definition error (GNU ld behavior) * Avoid potential redundant strlen on symbol name due to StringRefZ in ObjFile<ELFT>::initializeSymbols
show more ...
|
| #
89661a0e |
| 15-Dec-2021 |
Fangrui Song <[email protected]> |
[ELF] Remove dead code from SymbolTable::find
|
| #
09401dfc |
| 26-Nov-2021 |
Fangrui Song <[email protected]> |
[ELF] Rename fetch to extract
The canonical term is "extract" (GNU ld documentation, Solaris's `-z *extract` options). Avoid inventing a term and match --why-extract. (ld64 prefers "load" but the wo
[ELF] Rename fetch to extract
The canonical term is "extract" (GNU ld documentation, Solaris's `-z *extract` options). Avoid inventing a term and match --why-extract. (ld64 prefers "load" but the word is overloaded too much)
Mostly MFC, except for --help messages and the header row in --print-archive-stats output.
show more ...
|
|
Revision tags: llvmorg-13.0.1-rc1 |
|
| #
bf6e259b |
| 25-Oct-2021 |
Fangrui Song <[email protected]> |
[ELF] Update comments/diagnostics for some long options to use the canonical two-dash form
Rewrite some comments as appropriate.
|
|
Revision tags: llvmorg-13.0.0, llvmorg-13.0.0-rc4, llvmorg-13.0.0-rc3, llvmorg-13.0.0-rc2 |
|
| #
00809c88 |
| 05-Aug-2021 |
Fangrui Song <[email protected]> |
[ELF] Apply version script patterns to non-default version symbols
Currently version script patterns are ignored for .symver produced non-default version (single @) symbols. This makes such symbols
[ELF] Apply version script patterns to non-default version symbols
Currently version script patterns are ignored for .symver produced non-default version (single @) symbols. This makes such symbols not localizable by `local:`, e.g.
``` .symver foo3_v1,foo3@v1 .globl foo_v1 foo3_v1:
ld.lld --version-script=a.ver -shared a.o ```
This patch adds the support:
* Move `config->versionDefinitions[VER_NDX_LOCAL].patterns` to `config->versionDefinitions[versionId].localPatterns` * Rename `config->versionDefinitions[versionId].patterns` to `config->versionDefinitions[versionId].nonLocalPatterns` * Allow `findAllByVersion` to find non-default version symbols when `includeNonDefault` is true. (Note: `symtab` keys do not have `@@`) * Make each pattern check both the unversioned `pat.name` and the versioned `${pat.name}@${v.name}` * `localPatterns` can localize `${pat.name}@${v.name}`. `nonLocalPatterns` can prevent localization by assigning `verdefIndex` (before `parseSymbolVersion`).
---
If a user notices new `undefined symbol` errors with a version script containing `local: *;`, the issue is likely due to a missing `global:` pattern.
Reviewed By: peter.smith
Differential Revision: https://reviews.llvm.org/D107234
show more ...
|
| #
a533eb74 |
| 05-Aug-2021 |
Fangrui Song <[email protected]> |
Revert "[ELF] Apply version script patterns to non-default version symbols"
This reverts commit 7ed22a6fa90cbdc70d6806c1121a0c50c1978dce.
buf is not cleared so the commit misses some cases.
|
| #
7ed22a6f |
| 04-Aug-2021 |
Fangrui Song <[email protected]> |
[ELF] Apply version script patterns to non-default version symbols
Currently version script patterns are ignored for .symver produced non-default version (single @) symbols. This makes such symbols
[ELF] Apply version script patterns to non-default version symbols
Currently version script patterns are ignored for .symver produced non-default version (single @) symbols. This makes such symbols not localizable by `local:`, e.g.
``` .symver foo3_v1,foo3@v1 .globl foo_v1 foo3_v1:
ld.lld --version-script=a.ver -shared a.o # In a.out, foo3@v1 is incorrectly exported. ```
This patch adds the support:
* Move `config->versionDefinitions[VER_NDX_LOCAL].patterns` to `config->versionDefinitions[versionId].localPatterns` * Rename `config->versionDefinitions[versionId].patterns` to `config->versionDefinitions[versionId].nonLocalPatterns` * Allow `findAllByVersion` to find non-default version symbols when `includeNonDefault` is true. (Note: `symtab` keys do not have `@@`) * Make each pattern check both the unversioned `pat.name` and the versioned `${pat.name}@${v.name}` * `localPatterns` can localize `${pat.name}@${v.name}`. `nonLocalPatterns` can prevent localization by assigning `verdefIndex` (before `parseSymbolVersion`).
---
If a user notices new `undefined symbol` errors with a version script containing `local: *;`, the issue is likely due to a missing `global:` pattern.
Reviewed By: peter.smith
Differential Revision: https://reviews.llvm.org/D107234
show more ...
|