[llvm] [BOLT] Support fragment symbol mapped to the parent address (PR #162727)

Amir Ayupov via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 9 13:10:11 PDT 2025


https://github.com/aaupov created https://github.com/llvm/llvm-project/pull/162727

Observed in GCC-produced binary. Emit a warning for the user.

Test Plan: added bolt/test/X86/fragment-alias.s


>From a9fbe3b634c9208e453d5296b31111e26c8f077f Mon Sep 17 00:00:00 2001
From: Amir Ayupov <aaupov at fb.com>
Date: Thu, 9 Oct 2025 12:55:40 -0700
Subject: [PATCH] [BOLT] Support fragment symbol mapped to the parent address

Observed in GCC-produced binary. Emit a warning for the user.

Test Plan: added bolt/test/X86/fragment-alias.s
---
 bolt/lib/Rewrite/RewriteInstance.cpp |  6 ++++++
 bolt/test/X86/fragment-alias.s       | 13 +++++++++++++
 2 files changed, 19 insertions(+)
 create mode 100644 bolt/test/X86/fragment-alias.s

diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index c428828956ca0..59dd1c301de4a 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -1514,6 +1514,12 @@ void RewriteInstance::registerFragments() {
       }
       if (BD) {
         BinaryFunction *BF = BC->getFunctionForSymbol(BD->getSymbol());
+        if (BF == &Function) {
+          BC->errs()
+              << "BOLT-WARNING: fragment maps to the same function as parent: "
+              << Function << '\n';
+          continue;
+        }
         if (BF) {
           BC->registerFragment(Function, *BF);
           continue;
diff --git a/bolt/test/X86/fragment-alias.s b/bolt/test/X86/fragment-alias.s
new file mode 100644
index 0000000000000..3392dd564f417
--- /dev/null
+++ b/bolt/test/X86/fragment-alias.s
@@ -0,0 +1,13 @@
+## This test reproduces the issue where a fragment has the same address as
+## parent function.
+# RUN: llvm-mc --filetype=obj --triple x86_64-unknown-unknown %s -o %t.o
+# RUN: %clang %cflags %t.o -o %t
+# RUN: llvm-bolt %t -o %t.out 2>&1 | FileCheck %s
+# CHECK: BOLT-WARNING: fragment maps to the same function as parent: main/1(*2)
+.type main, @function
+.type main.cold, @function
+main.cold:
+main:
+  ret
+.size main, .-main
+.size main.cold, .-main.cold



More information about the llvm-commits mailing list