[llvm] [BOLT] Support runtime libraries built as thin archives (PR #214292)
Fabian Parzefall via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 5 12:50:33 PDT 2026
https://github.com/pzfl updated https://github.com/llvm/llvm-project/pull/214292
>From a67f61b5faa39c1b3ea2b94535bee17dcac4ef05 Mon Sep 17 00:00:00 2001
From: Fabian Parzefall <parzefall at meta.com>
Date: Wed, 5 Aug 2026 10:58:52 -0700
Subject: [PATCH] [BOLT] Support runtime libraries built as thin archives
In some configurations, BOLT runtime libraries may be built as thin archive. Use
the more generic `Archive::create` to handle these.
---
bolt/lib/RuntimeLibs/RuntimeLibrary.cpp | 7 ++++---
bolt/test/CMakeLists.txt | 1 +
bolt/test/lit.cfg.py | 3 +++
bolt/test/runtime/thin-archive.c | 22 ++++++++++++++++++++++
4 files changed, 30 insertions(+), 3 deletions(-)
create mode 100644 bolt/test/runtime/thin-archive.c
diff --git a/bolt/lib/RuntimeLibs/RuntimeLibrary.cpp b/bolt/lib/RuntimeLibs/RuntimeLibrary.cpp
index 98852ee691ceb..46c42953eef0c 100644
--- a/bolt/lib/RuntimeLibs/RuntimeLibrary.cpp
+++ b/bolt/lib/RuntimeLibs/RuntimeLibrary.cpp
@@ -95,9 +95,10 @@ void RuntimeLibrary::loadLibrary(StringRef LibPath, BOLTLinker &Linker,
file_magic Magic = identify_magic(B->getBuffer());
if (Magic == file_magic::archive) {
- Error Err = Error::success();
- object::Archive Archive(B->getMemBufferRef(), Err);
- for (const object::Archive::Child &C : Archive.children(Err)) {
+ std::unique_ptr<object::Archive> Archive;
+ Error Err = object::Archive::create(B->getMemBufferRef()).moveInto(Archive);
+ check_error(std::move(Err), B->getBufferIdentifier());
+ for (const object::Archive::Child &C : Archive->children(Err)) {
std::unique_ptr<object::Binary> Bin = cantFail(C.getAsBinary());
if (object::ObjectFile *Obj = dyn_cast<object::ObjectFile>(&*Bin))
Linker.loadObject(Obj->getMemoryBufferRef(), MapSections);
diff --git a/bolt/test/CMakeLists.txt b/bolt/test/CMakeLists.txt
index 6e18b028bddfc..9cfa4e20ff785 100644
--- a/bolt/test/CMakeLists.txt
+++ b/bolt/test/CMakeLists.txt
@@ -35,6 +35,7 @@ list(APPEND BOLT_TEST_DEPS
FileCheck
llc
lld
+ llvm-ar
llvm-config
llvm-bolt
llvm-bolt-binary-analysis
diff --git a/bolt/test/lit.cfg.py b/bolt/test/lit.cfg.py
index 218ea24867eb5..30cfc8fa54901 100644
--- a/bolt/test/lit.cfg.py
+++ b/bolt/test/lit.cfg.py
@@ -96,9 +96,11 @@
if config.libbolt_rt_instr:
llvm_bolt_args.append(f"--runtime-instrumentation-lib={config.libbolt_rt_instr}")
+ config.substitutions.append(("%libbolt_rt_instr", config.libbolt_rt_instr))
if config.libbolt_rt_hugify:
llvm_bolt_args.append(f"--runtime-hugify-lib={config.libbolt_rt_hugify}")
+ config.substitutions.append(("%libbolt_rt_hugify", config.libbolt_rt_hugify))
tools = [
ToolSubst("llc", unresolved="fatal"),
@@ -114,6 +116,7 @@
ToolSubst("llvm-bat-dump", unresolved="fatal"),
ToolSubst("perf2bolt", unresolved="fatal"),
ToolSubst("yaml2obj", unresolved="fatal"),
+ ToolSubst("llvm-ar", unresolved="fatal"),
ToolSubst("llvm-mc", unresolved="fatal"),
ToolSubst("llvm-nm", unresolved="fatal"),
ToolSubst("llvm-objdump", unresolved="fatal"),
diff --git a/bolt/test/runtime/thin-archive.c b/bolt/test/runtime/thin-archive.c
new file mode 100644
index 0000000000000..71743004489ed
--- /dev/null
+++ b/bolt/test/runtime/thin-archive.c
@@ -0,0 +1,22 @@
+// Test that BOLT can consume thin archives for runtime libraries.
+
+// REQUIRES: system-linux,bolt-runtime
+
+// RUN: rm -rf %t && mkdir -p %t/objects
+
+// RUN: cd %t/objects && llvm-ar x %libbolt_rt_instr
+// RUN: cd %t && llvm-ar rcT libbolt_rt_instr.a objects/*
+// RUN: file %t/libbolt_rt_instr.a | FileCheck %s --check-prefix=CHECK-THIN
+// CHECK-THIN: thin archive
+
+// RUN: %clang %cflags -no-pie -Wl,-q -o %t/exe %s
+// RUN: llvm-bolt -o %t/exe.bolt %t/exe \
+// RUN: --instrument --instrumentation-file=%t/exe.fdata \
+// RUN: --runtime-instrumentation-lib=%t/libbolt_rt_instr.a
+// RUN: %t/exe.bolt
+// RUN: cat %t/exe.fdata | FileCheck %s
+// CHECK: main 0 0 1
+
+#include <stdio.h>
+
+int main(int argc, char *argv[]) { puts("thin archive test"); }
More information about the llvm-commits
mailing list