Skip to content

Conversation

@llvmbot
Copy link
Member

@llvmbot llvmbot commented Aug 7, 2024

Backport 734c048

Requested by: @linsinan1995

@llvmbot llvmbot added this to the LLVM 19.X Release milestone Aug 7, 2024
@llvmbot
Copy link
Member Author

llvmbot commented Aug 7, 2024

@yota9 What do you think about merging this PR to the release branch?

@llvmbot
Copy link
Member Author

llvmbot commented Aug 7, 2024

@llvm/pr-subscribers-bolt

Author: None (llvmbot)

Changes

Backport 734c048

Requested by: @linsinan1995


Full diff: https://github.com/llvm/llvm-project/pull/102282.diff

2 Files Affected:

  • (modified) bolt/lib/Rewrite/RewriteInstance.cpp (+8)
  • (added) bolt/test/X86/dynamic-relocs-on-entry.s (+32)
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp index 33ebae3b6e6de..2e93b6576edad 100644 --- a/bolt/lib/Rewrite/RewriteInstance.cpp +++ b/bolt/lib/Rewrite/RewriteInstance.cpp @@ -5498,6 +5498,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 (const BinaryBasicBlock &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..2a29a43c4939a --- /dev/null +++ b/bolt/test/X86/dynamic-relocs-on-entry.s @@ -0,0 +1,32 @@ +// This test examines whether BOLT can correctly process 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 > %t.out.txt +# RUN: readelf -r %t.bolt >> %t.out.txt +# RUN: llvm-objdump --disassemble-symbols=chain %t.bolt >> %t.out.txt +# RUN: FileCheck %s --input-file=%t.out.txt + +## 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 [[#%x,ADDR:]] +# CHECK: [[#ADDR]]: c3 retq +.text +.type chain, @function +chain: +movq $1, %rax +Label: +ret +.size chain, .-chain + +.type _start, @function +.global _start +_start: +jmpq *.Lfoo(%rip) +ret +.size _start, .-_start + +.data +.Lfoo: +.quad Label \ No newline at end of file 
Copy link
Member

@yota9 yota9 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bugfix
LGTM

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)
@tru tru merged commit a0f4170 into llvm:release/19.x Aug 10, 2024
@github-actions
Copy link

@linsinan1995 (or anyone else). If you would like to add a note about this fix in the release notes (completely optional). Please reply to this comment with a one or two sentence description of the fix. When you are done, please add the release:note label to this PR.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4 participants