|
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 |
|
| #
77c19773 |
| 26-Jul-2022 |
Amir Ayupov <[email protected]> |
[BOLT] Support files with no symbols
`LastSymbol` handling in `discoverFileObjects` assumes a non-zero number of symbols in an object file. It's not the case for broken_dynsym.test added in D130073,
[BOLT] Support files with no symbols
`LastSymbol` handling in `discoverFileObjects` assumes a non-zero number of symbols in an object file. It's not the case for broken_dynsym.test added in D130073, and potentially other stripped binaries.
Reviewed By: maksfb
Differential Revision: https://reviews.llvm.org/D130544
show more ...
|
| #
8eb68d92 |
| 22-Jul-2022 |
Huan Nguyen <[email protected]> |
[BOLT] Handle broken .dynsym in stripped binaries
Strip tools cause a few symbols in .dynsym to have bad section index. This update safely keeps such broken symbols intact.
Test Plan: ``` ninja che
[BOLT] Handle broken .dynsym in stripped binaries
Strip tools cause a few symbols in .dynsym to have bad section index. This update safely keeps such broken symbols intact.
Test Plan: ``` ninja check-bolt ```
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D130073
show more ...
|
| #
ae563c91 |
| 15-Jul-2022 |
Huan Nguyen <[email protected]> |
[BOLT] Support split landing pad
We previously support split jump table, where some jump table entries target different fragments of same function. In this fix, we provide support for another type o
[BOLT] Support split landing pad
We previously support split jump table, where some jump table entries target different fragments of same function. In this fix, we provide support for another type of intra-indirect transfer: landing pad.
When C++ exception handling is used, compiler emits .gcc_except_table that describes the location of catch block (landing pad) for specific range that potentially invokes a throw(). Normally landing pads reside in the function, but with -fsplit-machine-functions, landing pads can be moved to another fragment. The intuition is, landing pads are rarely executed, so compiler can move them to .cold section.
This update will mark all fragments that have landing pad to another fragment as non-simple, and later propagate non-simple to all related fragments.
This update also includes one manual test case: split-landing-pad.s
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D128561
show more ...
|
| #
05523dc3 |
| 14-Jul-2022 |
Huan Nguyen <[email protected]> |
[BOLT] Support multiple parents for split jump table
There are two assumptions regarding jump table: (a) It is accessed by only one fragment, say, Parent (b) All entries target instructions in Paren
[BOLT] Support multiple parents for split jump table
There are two assumptions regarding jump table: (a) It is accessed by only one fragment, say, Parent (b) All entries target instructions in Parent
For (a), BOLT stores jump table entries as relative offset to Parent. For (b), BOLT treats jump table entries target somewhere out of Parent as INVALID_OFFSET, including fragment of same split function.
In this update, we extend (a) and (b) to include fragment of same split functinon. For (a), we store jump table entries in absolute offset instead. In addition, jump table will store all fragments that access it. A fragment uses this information to only create label for jump table entries that target to that fragment.
For (b), using absolute offset allows jump table entries to target fragments of same split function, i.e., extend support for split jump table. This can be done using relocation (fragment start/size) and fragment detection heuristics (e.g., using symbol name pattern for non-stripped binaries).
For jump table targets that can only be reached by one fragment, we mark them as local label; otherwise, they would be the secondary function entry to the target fragment.
Test Plan ``` ninja check-bolt ```
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D128474
show more ...
|
| #
35efe1d8 |
| 06-Jul-2022 |
Vladislav Khmelevsky <[email protected]> |
[BOLT][AArch64] Handle gold linker veneers
The gold linker veneers are written between functions without symbols, so we to handle it specially in BOLT.
Vladislav Khmelevsky, Advanced Software Techn
[BOLT][AArch64] Handle gold linker veneers
The gold linker veneers are written between functions without symbols, so we to handle it specially in BOLT.
Vladislav Khmelevsky, Advanced Software Technology Lab, Huawei
Differential Revision: https://reviews.llvm.org/D129260
show more ...
|
| #
228970f6 |
| 11-Jul-2022 |
spupyrev <[email protected]> |
Revert "Rebase: [Facebook] Revert "[BOLT] Update dynamic relocations from section relocations""
This reverts commit 76029cc53e838e6d86b13b0c39152f474fb09263.
|
|
Revision tags: llvmorg-14.0.6, llvmorg-14.0.5, llvmorg-14.0.4, llvmorg-14.0.3, llvmorg-14.0.2, llvmorg-14.0.1 |
|
| #
76029cc5 |
| 29-Mar-2022 |
Maksim Panchenko <[email protected]> |
Rebase: [Facebook] Revert "[BOLT] Update dynamic relocations from section relocations"
Summary: This reverts commit 729d29e167a553ee1190c310b6a510db8d8731ac.
Needed as a workaround for T112872562.
Rebase: [Facebook] Revert "[BOLT] Update dynamic relocations from section relocations"
Summary: This reverts commit 729d29e167a553ee1190c310b6a510db8d8731ac.
Needed as a workaround for T112872562.
Manual rebase conflict history: https://phabricator.intern.facebook.com/D35230076 https://phabricator.intern.facebook.com/D35681740
Test Plan: sandcastle
Reviewers: #llvm-bolt
Subscribers: spupyrev
Differential Revision: https://phabricator.intern.facebook.com/D37098481
show more ...
|
| #
fc2d96c3 |
| 29-Jun-2022 |
Rafael Auler <[email protected]> |
Revert "[BOLT][AArch64] Handle gold linker veneers"
This reverts commit 425dda76e9fac93117289fd68a2abdfb1e4a0ba5.
This commit is currently causing BOLT to crash in one of our binaries and needs a b
Revert "[BOLT][AArch64] Handle gold linker veneers"
This reverts commit 425dda76e9fac93117289fd68a2abdfb1e4a0ba5.
This commit is currently causing BOLT to crash in one of our binaries and needs a bit more checking to make sure it is safe to land.
show more ...
|
| #
425dda76 |
| 15-Jun-2022 |
Vladislav Khmelevsky <[email protected]> |
[BOLT][AArch64] Handle gold linker veneers
The gold linker veneers are written between functions without symbols, so we to handle it specially in BOLT.
Vladislav Khmelevsky, Advanced Software Techn
[BOLT][AArch64] Handle gold linker veneers
The gold linker veneers are written between functions without symbols, so we to handle it specially in BOLT.
Vladislav Khmelevsky, Advanced Software Technology Lab, Huawei
Differential Revision: https://reviews.llvm.org/D128082
show more ...
|
| #
d2c87699 |
| 24-Jun-2022 |
Amir Ayupov <[email protected]> |
[BOLT][NFC] Use range-based STL wrappers
Replace `std::` algorithms taking begin/end iterators with `llvm::` counterparts accepting ranges.
Reviewed By: rafauler
Differential Revision: https://rev
[BOLT][NFC] Use range-based STL wrappers
Replace `std::` algorithms taking begin/end iterators with `llvm::` counterparts accepting ranges.
Reviewed By: rafauler
Differential Revision: https://reviews.llvm.org/D128154
show more ...
|
|
Revision tags: llvmorg-14.0.0, llvmorg-14.0.0-rc4, llvmorg-14.0.0-rc3 |
|
| #
f263a66b |
| 10-Mar-2022 |
Maksim Panchenko <[email protected]> |
[BOLT] Split functions with exceptions in shared objects and PIEs
Add functionality to allow splitting code with C++ exceptions in shared libraries and PIEs. To overcome a limitation in exception ra
[BOLT] Split functions with exceptions in shared objects and PIEs
Add functionality to allow splitting code with C++ exceptions in shared libraries and PIEs. To overcome a limitation in exception ranges format, for functions with fragments spanning multiple sections, add trampoline landing pads in the same section as the corresponding throwing range.
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D127936
show more ...
|
| #
543f13c9 |
| 18-Jun-2022 |
Huan Nguyen <[email protected]> |
[BOLT] Allow function entry to be a cold fragment
Allow cold fragment to get new address.
Our previous assumption is that a fragment (.cold) is only reached through the main fragment of same functi
[BOLT] Allow function entry to be a cold fragment
Allow cold fragment to get new address.
Our previous assumption is that a fragment (.cold) is only reached through the main fragment of same function. In addition, .cold fragment must be reached through either (a) direct transfer, or (b) split jump table. For (a), we perform a simple fix-up. For (b), we currently mark all relevant fragments as non-simple. Therefore, there is no need to get new address for .cold fragment.
This is not always the case, as function entry can be rarely executed, and is placed in .text.cold segment. Essentially we cannot tell which the source-level function entry is based on hot and cold segments, so we must treat each fragment a function on its own. Therfore, we remove the assertion that a function entry cannot be cold fragment.
Test Plan: ``` ninja check-bolt ```
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D128111
show more ...
|
| #
28b1dcb1 |
| 17-Jun-2022 |
Huan Nguyen <[email protected]> |
[BOLT] Allow function fragments to point to one jump table
Resolve a crash related to split functions
Due to split function optimization, a function can be divided to two
fragments, and both fragm
[BOLT] Allow function fragments to point to one jump table
Resolve a crash related to split functions
Due to split function optimization, a function can be divided to two
fragments, and both fragments can access same jump table. This violates
the assumption that a jump table can only have one parent function,
which causes a crash during instrumentation.
We want to support the case: different functions cannot access same jump tables, but different fragments of same function can!
As all fragments are from same function, we point JT::Parent to one specific fragment. Right now it is the first disassembled fragment, but we can point it to the function's main fragment later.
Functions are disassembled sequentially. Previously, at the end of processing a function, JT::OffsetEntries is cleared, so other fragment can no longer reuse JT::OffsetEntries. To extend the support for split function, we only clear JT::OffsetEntries after all functions are disassembled.
Let say A.hot and A.cold access JT of three targets {X, Y, Z}, where X and Y are in A.hot, and Z is in A.cold. Suppose that A.hot is disassembled first, JT::OffsetEntries = {X',Y',INVALID_OFFSET}. When A.cold is disassembled, it cannot reuse JT::OffsetEntries above due to different fragment start. A simple solution: A.hot = {X',Y',INVALID_OFFSET} A.cold = {INVALID_OFFSET, INVALID_OFFSET, INVALID_OFFSET}
We update the assertion to allow different fragments of same function to get the same JumpTable object.
Potential improvements: A.hot = {X',Y',INVALID_OFFSET} A.cold = {INVALID_OFFSET, INVALID_OFFSET, Z'} The main issue is A.hot and A.cold have separate CFGs, thus jump table targets are still constrained within fragment bounds.
Future improvements: A.hot = {X, Y, Z} A.cold = {X, Y, Z}
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D127924
show more ...
|
| #
6e26ffa0 |
| 09-Jun-2022 |
Vladislav Khmelevsky <[email protected]> |
[BOLT][AARCH64] Skip R_AARCH64_LD_PREL_LO19 relocation
Supress failed to analyze relocations warning for R_AARCH64_LD_PREL_LO19 relocation. This relocation is mostly used to get value stored in CI a
[BOLT][AARCH64] Skip R_AARCH64_LD_PREL_LO19 relocation
Supress failed to analyze relocations warning for R_AARCH64_LD_PREL_LO19 relocation. This relocation is mostly used to get value stored in CI and we don't process it since we are caluclating target address using the instruction value in evaluateMemOperandTarget().
Differential Revision: https://reviews.llvm.org/D127413
show more ...
|
| #
82095bd5 |
| 10-Jun-2022 |
Huan Nguyen <[email protected]> |
[BOLT] Mark fragments related to split jump table as non-simple
Mark fragments related to split jump table as non-simple.
A function could be splitted into hot and cold fragments. A split jump tabl
[BOLT] Mark fragments related to split jump table as non-simple
Mark fragments related to split jump table as non-simple.
A function could be splitted into hot and cold fragments. A split jump table is challenging for correctly reconstructing control flow graphs, so it was marked as ignored. This update marks those fragments as non-simple, allowing them to be printed and partial control flow graph construction.
Test Plan: ``` llvm-lit -a tools/bolt/test/X86/split-func-icf.s ``` This test has two functions (main, main2), each has a jump table target to the same cold portion main2.cold.1(*2). We try to print out only this cold portion. If it is ignored, it cannot be printed. If it is non-simple, it can be printed. We verify that it can be printed.
Reviewed By: Amir
Differential Revision: https://reviews.llvm.org/D127464
show more ...
|
| #
15d82c62 |
| 07-Jun-2022 |
Fangrui Song <[email protected]> |
[MC] De-capitalize MCStreamer functions
Follow-up to c031378ce01b8485ba0ef486654bc9393c4ac024 . The class is mostly consistent now.
|
| #
b92436ef |
| 05-Jun-2022 |
Fangrui Song <[email protected]> |
[bolt] Remove unneeded cl::ZeroOrMore for cl::opt options
|
| #
36c7d79d |
| 04-Jun-2022 |
Fangrui Song <[email protected]> |
Remove unneeded cl::ZeroOrMore for cl::opt options
Similar to 557efc9a8b68628c2c944678c6471dac30ed9e8e. This commit handles options where cl::ZeroOrMore is more than one line below cl::opt.
|
| #
6333e5dd |
| 02-Jun-2022 |
Amir Ayupov <[email protected]> |
[BOLT][NFC] Use colors in CFG dumps
Use color coding to distinguish nodes: - Entry nodes have bold border - Scalar (non-loopy) code is milk white - Outer loops are light yellow - Innermost loops are
[BOLT][NFC] Use colors in CFG dumps
Use color coding to distinguish nodes: - Entry nodes have bold border - Scalar (non-loopy) code is milk white - Outer loops are light yellow - Innermost loops are light blue
`-print-loops` needs to be enabled to provide BinaryLoopInfo. Examples: {F23170673} {F23170680}
Reviewed By: rafauler
Differential Revision: https://reviews.llvm.org/D126248
show more ...
|
| #
8579db96 |
| 31-May-2022 |
Denis Revunov <[email protected]> |
[BOLT] [AArch64] Handle constant islands spanning multiple functions
Fix BOLT's constant island mapping when a constant island marked by $d spans multiple functions. Currently, because BOLT only mar
[BOLT] [AArch64] Handle constant islands spanning multiple functions
Fix BOLT's constant island mapping when a constant island marked by $d spans multiple functions. Currently, because BOLT only marks the constant island in the first function where $d is located, if the next function contains data at its start, BOLT will miss the data and try to disassemble it. This patch adds code to explicitly go through all symbols between $d and $x markers and mark their respective offsets as data, which stops BOLT from trying to disassemble data. It also adds MarkerType enum and refactors related functions.
Reviewed By: yota9, rafauler
Differential Revision: https://reviews.llvm.org/D126177
show more ...
|
| #
c907d6e0 |
| 17-May-2022 |
Amir Ayupov <[email protected]> |
[BOLT][NFC] Suppress unused variable warnings
Addresses the warnings emitted by Apple Clang 13.1.6 (Xcode 13.3.1). Tip @tschuett issue #55404.
Reviewed By: rafauler
Differential Revision: https://
[BOLT][NFC] Suppress unused variable warnings
Addresses the warnings emitted by Apple Clang 13.1.6 (Xcode 13.3.1). Tip @tschuett issue #55404.
Reviewed By: rafauler
Differential Revision: https://reviews.llvm.org/D125733
show more ...
|
| #
014cd37f |
| 21-Apr-2022 |
Alexander Yermolovich <[email protected]> |
[BOLT][DWARF] Implement monolithic DWARF5
Added implementation to support DWARF5 in monolithic mode. Next step DWARF5 split dwarf support.
Reviewed By: maksfb
Differential Revision: https://review
[BOLT][DWARF] Implement monolithic DWARF5
Added implementation to support DWARF5 in monolithic mode. Next step DWARF5 split dwarf support.
Reviewed By: maksfb
Differential Revision: https://reviews.llvm.org/D121876
show more ...
|
| #
63686af1 |
| 19-Apr-2022 |
Vladislav Khmelevsky <[email protected]> |
[BOLT] Fix build with GCC 7.3.0
The gcc 7.3.0 version raises "could not covert" error without std::move used explicitly.
Differential Revision: https://reviews.llvm.org/D124009
|
| #
36cb7366 |
| 13-Apr-2022 |
Maksim Panchenko <[email protected]> |
[BOLT] Ignore PC-relative relocations from data to data
BOLT expects PC-relative relocations in data sections to reference code and the relocated data to form a jump table. However, there are cases
[BOLT] Ignore PC-relative relocations from data to data
BOLT expects PC-relative relocations in data sections to reference code and the relocated data to form a jump table. However, there are cases where PC-relative addressing is used for data-to-data references (e.g. clang-15 can generate such code). BOLT should recognize and ignore such relocations. Otherwise, they will be considered relocations not claimed by any jump table and cause a failure in the strict mode.
Reviewed By: yota9, Amir
Differential Revision: https://reviews.llvm.org/D123650
show more ...
|
| #
9b02dc63 |
| 09-Apr-2022 |
Amir Ayupov <[email protected]> |
[BOLT] Check MCContext errors
Abort on emission errors to prevent a malformed binary being written. Example: ``` <unknown>:0: error: Undefined temporary symbol .Ltmp26310 <unknown>:0: error: Undefin
[BOLT] Check MCContext errors
Abort on emission errors to prevent a malformed binary being written. Example: ``` <unknown>:0: error: Undefined temporary symbol .Ltmp26310 <unknown>:0: error: Undefined temporary symbol .Ltmp26311 <unknown>:0: error: Undefined temporary symbol .Ltmp26312 <unknown>:0: error: Undefined temporary symbol .Ltmp26313 <unknown>:0: error: Undefined temporary symbol .Ltmp26314 <unknown>:0: error: Undefined temporary symbol .Ltmp26315 BOLT-ERROR: Emission failed. ```
Reviewed By: yota9
Differential Revision: https://reviews.llvm.org/D123263
show more ...
|