https://github.com/tru updated https://github.com/llvm/llvm-project/pull/102282

>From a0f4170ab8c355a1d8c6d7a810d95121b23fad19 Mon Sep 17 00:00:00 2001
From: sinan <sinan....@linux.alibaba.com>
Date: Wed, 7 Aug 2024 15:57:25 +0800
Subject: [PATCH] [BOLT] Support map other function entry address (#101466)

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 734c0488b6e69300adaf568f880f40b113ae02ca)
---
 bolt/lib/Rewrite/RewriteInstance.cpp    |  8 +++++++
 bolt/test/X86/dynamic-relocs-on-entry.s | 32 +++++++++++++++++++++++++
 2 files changed, 40 insertions(+)
 create mode 100644 bolt/test/X86/dynamic-relocs-on-entry.s

diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp 
b/bolt/lib/Rewrite/RewriteInstance.cpp
index 33ebae3b6e6de2..2e93b6576edad6 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 00000000000000..2a29a43c4939a2
--- /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

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to