File tree Expand file tree Collapse file tree 2 files changed +40
-0
lines changed Expand file tree Collapse file tree 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) {
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
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