Skip to content

Commit 595eaa1

Browse files
committed
[BOLT] Support map other function entry address
Allow BOLT to map old address to new binary address if the old address is the other entry of the function.
1 parent f3761a4 commit 595eaa1

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

bolt/lib/Rewrite/RewriteInstance.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5509,6 +5509,14 @@ uint64_t RewriteInstance::getNewFunctionOrDataAddress(uint64_t OldAddress) {
55095509
if (const BinaryFunction *BF =
55105510
BC->getBinaryFunctionContainingAddress(OldAddress)) {
55115511
if (BF->isEmitted()) {
5512+
// If OldAddress is the another entry point of
5513+
// the function, then BOLT could get the new address.
5514+
if (BF->isMultiEntry()) {
5515+
for (const BinaryBasicBlock &BB : *BF)
5516+
if (BB.isEntryPoint() &&
5517+
(BF->getAddress() + BB.getOffset()) == OldAddress)
5518+
return BF->getOutputAddress() + BB.getOffset();
5519+
}
55125520
BC->errs() << "BOLT-ERROR: unable to get new address corresponding to "
55135521
"input address 0x"
55145522
<< Twine::utohexstr(OldAddress) << " in function " << *BF
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// This test examines whether BOLT can correctly process when
2+
// dynamic relocation points to other entry points of the
3+
// function.
4+
5+
# RUN: %clang %cflags -fPIC -pie %s -o %t.exe -nostdlib -Wl,-q
6+
# RUN: llvm-bolt %t.exe -o %t.bolt > %t.out.txt
7+
# RUN: readelf -r %t.bolt >> %t.out.txt
8+
# RUN: llvm-objdump --disassemble-symbols=chain %t.bolt >> %t.out.txt
9+
# RUN: FileCheck %s --input-file=%t.out.txt
10+
11+
## Check if the new address in `chain` is correctly updated by BOLT
12+
# CHECK: Relocation section '.rela.dyn' at offset 0x{{.*}} contains 1 entry:
13+
# CHECK: {{.*}} R_X86_64_RELATIVE [[ADDR:.+]]
14+
# CHECK: [[#ADDR]]: c3 retq
15+
.text
16+
.type chain, @function
17+
chain:
18+
movq $1, %rax
19+
Label:
20+
ret
21+
.size chain, .-chain
22+
23+
.type _start, @function
24+
.global _start
25+
_start:
26+
jmpq *.Lfoo(%rip)
27+
ret
28+
.size _start, .-_start
29+
30+
.data
31+
.Lfoo:
32+
.quad Label

0 commit comments

Comments
 (0)