[BOLT] Support map other function entry address#101466
[BOLT] Support map other function entry address#101466linsinan1995 merged 1 commit intollvm:mainfrom
Conversation
|
@llvm/pr-subscribers-bolt Author: sinan (linsinan1995) ChangesAllow BOLT to map the old address to a new binary address if the old address is the entry of the function. Full diff: https://github.com/llvm/llvm-project/pull/101466.diff 2 Files Affected:
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 9077869fe4955..e2273472c15de 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -5509,6 +5509,14 @@ uint64_t RewriteInstance::getNewFunctionOrDataAddress(uint64_t OldAddress) {
if (const BinaryFunction *BF =
BC->getBinaryFunctionContainingAddress(OldAddress)) {
if (BF->isEmitted()) {
+ // If OldAddress is the another entry point of
+ // the function, then BOLT could get the new address.
+ if (BF->isMultiEntry()) {
+ for (auto &BB : *BF)
+ if (BB.isEntryPoint() &&
+ (BF->getAddress() + BB.getOffset()) == OldAddress)
+ return BF->getOutputAddress() + BB.getOffset();
+ }
BC->errs() << "BOLT-ERROR: unable to get new address corresponding to "
"input address 0x"
<< Twine::utohexstr(OldAddress) << " in function " << *BF
diff --git a/bolt/test/X86/dynamic-relocs-on-entry.s b/bolt/test/X86/dynamic-relocs-on-entry.s
new file mode 100644
index 0000000000000..7f47955440dd4
--- /dev/null
+++ b/bolt/test/X86/dynamic-relocs-on-entry.s
@@ -0,0 +1,25 @@
+// This test examines whether BOLT can correctly update when
+// dynamic relocation points to other entry points of the
+// function.
+
+# RUN: %clang %cflags -fPIC -pie %s -o %t.exe -nostdlib -Wl,-q
+# RUN: llvm-bolt %t.exe -o %t.bolt | FileCheck %s
+
+ .text
+ .type chain, @function
+chain:
+ movq $1, %rax
+Lable:
+ ret
+ .size chain, .-chain
+ .type _start, @function
+ .global _start
+_start:
+ jmpq *.Lfoo(%rip)
+ ret
+ .size _start, .-_start
+ .data
+.Lfoo:
+ .quad Lable
+
+# CHECK-NOT: BOLT-ERROR
|
|
take the assembly code attached in the test as an example (1) if -no-pie, there is not a dynamic relocation for (2) if it is pie, then an error occurs BOLT-ERROR: unable to get new address corresponding to input address 0x1007 in function chain/1(*2). Consider adding this function to --skip-funcs=... This change can make the case (2) work |
162bdd9 to
02d2df5
Compare
yota9
left a comment
There was a problem hiding this comment.
LGTM thanks!
JFYI next time you can use objdump with -R in order to skip extra file creation for readelf+objdump. It's a minor thing so I don't really mind anyway.
02d2df5 to
595eaa1
Compare
|
Looks like an X86 test is failing. |
Allow BOLT to map old address to new binary address if the old address is the other entry of the function.
| ## Check if the new address in `chain` is correctly updated by BOLT | ||
| # CHECK: Relocation section '.rela.dyn' at offset 0x{{.*}} contains 1 entry: | ||
| # CHECK: {{.*}} R_X86_64_RELATIVE [[ADDR:.+]] | ||
| # CHECK: [[#ADDR]]: c3 retq |
There was a problem hiding this comment.
I think you need either remove # here or (probably even better) make var setting above like [[#%x,ADDR:]]
595eaa1 to
b049efe
Compare
|
Also could you please push this one and #69136 to 19.x branch? Thanks! |
|
/cherry-pick 734c048 |
Allow BOLT to map the old address to a new binary address if the old address is the entry of the function. (cherry picked from commit 734c048)
|
/pull-request #102282 |
Allow BOLT to map the old address to a new binary address if the old address is the entry of the function. (cherry picked from commit 734c048)
Add logic to map addresses referring to non-entry basic blocks. PR llvm#101466 extended this function to enable it to map addresses for the entry points of multi-entry functions, but this still left references to individual basic blocks unmappable.
Allow BOLT to map the old address to a new binary address if the old address is the entry of the function.