-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[BOLT] Support map other function entry address #101466
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
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think you need either remove # here or (probably even better) make var setting above like [[#%x,ADDR:]]
595eaa1
to
b049efe
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Test passed, thanks
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.
Allow BOLT to map the old address to a new binary address if the old address is the entry of the function.
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)
Allow BOLT to map the old address to a new binary address if the old address is the entry of the function.
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.