From c697fcdcf528d4a9da93833f112580b50e8eccbe Mon Sep 17 00:00:00 2001 From: Maksim Panchenko Date: Fri, 31 Oct 2025 15:56:27 -0700 Subject: [PATCH] [BOLT] Issue error on unclaimed PC-relative relocation Replace assert with an error and improve the report when unclaimed PC-relative relocation is left in strict mode. --- bolt/lib/Core/BinaryContext.cpp | 18 +++++++++++------- bolt/test/X86/unclaimed-pc-rel.s | 24 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 bolt/test/X86/unclaimed-pc-rel.s diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp index a383ced1712e3..c7cd034a30410 100644 --- a/bolt/lib/Core/BinaryContext.cpp +++ b/bolt/lib/Core/BinaryContext.cpp @@ -778,13 +778,17 @@ void BinaryContext::populateJumpTables() { } if (opts::StrictMode && DataPCRelocations.size()) { - LLVM_DEBUG({ - dbgs() << DataPCRelocations.size() - << " unclaimed PC-relative relocations left in data:\n"; - for (uint64_t Reloc : DataPCRelocations) - dbgs() << Twine::utohexstr(Reloc) << '\n'; - }); - assert(0 && "unclaimed PC-relative relocations left in data\n"); + this->errs() << "BOLT-ERROR: " << DataPCRelocations.size() + << " unclaimed PC-relative relocation(s) left in data"; + if (opts::Verbosity) { + this->errs() << ":\n"; + for (uint64_t RelocOffset : DataPCRelocations) + this->errs() << " @0x" << Twine::utohexstr(RelocOffset) << '\n'; + } else { + this->errs() << ". Re-run with -v=1 to see the list\n"; + } + this->errs() << "BOLT-ERROR: unable to proceed with --strict\n"; + exit(1); } clearList(DataPCRelocations); } diff --git a/bolt/test/X86/unclaimed-pc-rel.s b/bolt/test/X86/unclaimed-pc-rel.s new file mode 100644 index 0000000000000..5292cccba754d --- /dev/null +++ b/bolt/test/X86/unclaimed-pc-rel.s @@ -0,0 +1,24 @@ +## Check that unclaimed PC-relative relocation from data to code is detected +## and reported to the user. + +# REQUIRES: system-linux + +# RUN: %clang %cflags -no-pie %s -o %t.exe -Wl,-q -nostartfiles +# RUN: not llvm-bolt %t.exe -o %t.bolt --strict 2>&1 | FileCheck %s + +# CHECK: BOLT-ERROR: 1 unclaimed PC-relative relocation(s) left in data + + .text + .globl _start + .type _start, %function +_start: + movl $42, %eax +.L0: + ret + .size _start, .-_start + +## Force relocation mode. + .reloc 0, R_X86_64_NONE + + .section .rodata + .long .L0-.