File tree 2 files changed +40
-0
lines changed
2 files changed +40
-0
lines changed Original file line number Diff line number Diff line change @@ -5509,6 +5509,14 @@ uint64_t RewriteInstance::getNewFunctionOrDataAddress(uint64_t OldAddress) {
5509
5509
if (const BinaryFunction *BF =
5510
5510
BC->getBinaryFunctionContainingAddress (OldAddress)) {
5511
5511
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
+ }
5512
5520
BC->errs () << " BOLT-ERROR: unable to get new address corresponding to "
5513
5521
" input address 0x"
5514
5522
<< Twine::utohexstr (OldAddress) << " in function " << *BF
Original file line number Diff line number Diff line change
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
You can’t perform that action at this time.
0 commit comments