[llvm] [BOLT][RelVTable] Skip special handling on non virtual function pointer relocations (PR #137406)
YongKang Zhu via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 28 12:15:22 PDT 2025
https://github.com/yozhu updated https://github.com/llvm/llvm-project/pull/137406
>From c2ea84a98526d435a00a4741a076135bcb314bee Mon Sep 17 00:00:00 2001
From: YongKang Zhu <yongzhu at fb.com>
Date: Thu, 24 Apr 2025 20:31:55 -0700
Subject: [PATCH 1/2] [BOLT] Skip special handling on non virtual function
pointer relocation in relative vtable
Besides virtual function pointers vtable could also contain other kinds of
entries like the one for RTTI data that requires relocation too. We need to
skip the special handling on the relocations for non virtual function pointers
in relative vtable.
---
bolt/lib/Rewrite/RewriteInstance.cpp | 25 ++++++++++++-------------
1 file changed, 12 insertions(+), 13 deletions(-)
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 69fb736d7bde0..1c24200059035 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -2697,20 +2697,19 @@ void RewriteInstance::handleRelocation(const SectionRef &RelocatedSection,
BD->nameStartsWith("_ZTCN"))) { // construction vtable
BinaryFunction *BF = BC->getBinaryFunctionContainingAddress(
SymbolAddress, /*CheckPastEnd*/ false, /*UseMaxSize*/ true);
- if (!BF || BF->getAddress() != SymbolAddress) {
- BC->errs()
- << "BOLT-ERROR: the virtual function table entry at offset 0x"
- << Twine::utohexstr(Rel.getOffset());
- if (BF)
- BC->errs() << " points to the middle of a function @ 0x"
- << Twine::utohexstr(BF->getAddress()) << "\n";
- else
- BC->errs() << " does not point to any function\n";
- exit(1);
+ if (BF) {
+ if (BF->getAddress() != SymbolAddress) {
+ BC->errs()
+ << "BOLT-ERROR: the virtual function table entry at offset 0x"
+ << Twine::utohexstr(Rel.getOffset())
+ << " points to the middle of a function @ 0x"
+ << Twine::utohexstr(BF->getAddress()) << "\n";
+ exit(1);
+ }
+ BC->addRelocation(Rel.getOffset(), BF->getSymbol(), RType, Addend,
+ ExtractedValue);
+ return;
}
- BC->addRelocation(Rel.getOffset(), BF->getSymbol(), RType, Addend,
- ExtractedValue);
- return;
}
}
>From a9e5abe09168f3e9327737dfbec46732e5aa55e0 Mon Sep 17 00:00:00 2001
From: YongKang Zhu <yongzhu at fb.com>
Date: Mon, 28 Apr 2025 12:14:40 -0700
Subject: [PATCH 2/2] Add a test case
---
...-non-vfuncptr-reloc-in-relative-vtable.cpp | 25 +++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100644 bolt/test/X86/skip-non-vfuncptr-reloc-in-relative-vtable.cpp
diff --git a/bolt/test/X86/skip-non-vfuncptr-reloc-in-relative-vtable.cpp b/bolt/test/X86/skip-non-vfuncptr-reloc-in-relative-vtable.cpp
new file mode 100644
index 0000000000000..d7062022b3100
--- /dev/null
+++ b/bolt/test/X86/skip-non-vfuncptr-reloc-in-relative-vtable.cpp
@@ -0,0 +1,25 @@
+// Test the fix that BOLT should skip speical handling of any non virtual
+// function pointer relocations in relative vtable.
+
+// RUN: %clang -fuse-ld=lld -o %t.so %s -Wl,-q \
+// RUN: -fexperimental-relative-c++-abi-vtables
+// RUN: llvm-bolt %t.so -o %t.bolted.so
+
+extern "C" unsigned long long _ZTVN10__cxxabiv117__class_type_infoE = 0;
+extern "C" unsigned long long _ZTVN10__cxxabiv120__si_class_type_infoE = 0;
+
+class A {
+public:
+ virtual void foo() {}
+};
+
+class B : public A {
+ virtual void foo() override {}
+};
+
+int main() {
+ B b;
+ A *p = &b;
+ p->foo();
+ return 0;
+}
More information about the llvm-commits
mailing list