Skip to content

Commit bb1d57b

Browse files
committed
Handle new LLVM soname
LLVM now includes the minor version in the soname, and also changed the names of library files. libLLVM-18.so is now a symlink to libLLVM.so.18.1. We need to make two changes to support this: First, we need to run the installed llvm-config binary, rather than the one from the build directory. This is because the symlink does not exist in the build directory, but llvm-config requires it. This looks like an LLVM bug to me, but it's probably a good idea to use the installed version anyway. Second, when installing LLVM into the libdir, we need to follow the symlink from libLLVM-18.so to libLLVM.so.18.1, as this is what will actually get loaded at runtime.
1 parent 00e3b26 commit bb1d57b

File tree

3 files changed

+9
-5
lines changed

3 files changed

+9
-5
lines changed

Diff for: src/bootstrap/src/core/build_steps/dist.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -2026,7 +2026,13 @@ fn install_llvm_file(builder: &Builder<'_>, source: &Path, destination: &Path) {
20262026
return;
20272027
}
20282028

2029-
builder.install(source, destination, 0o644);
2029+
if source.is_symlink() {
2030+
// Follow symlinks. E.g. if we're linking against libLLVM-18.so, then what gets loaded
2031+
// at runtime is libLLVM.so.18.1.
2032+
builder.install(&t!(fs::canonicalize(source)), destination, 0o644);
2033+
} else {
2034+
builder.install(&source, destination, 0o644);
2035+
}
20302036
}
20312037

20322038
/// Maybe add LLVM object files to the given destination lib-dir. Allows either static or dynamic linking.

Diff for: src/bootstrap/src/core/build_steps/llvm.rs

-3
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,6 @@ pub fn prebuilt_llvm_config(
9898
let out_dir = builder.llvm_out(target);
9999

100100
let mut llvm_config_ret_dir = builder.llvm_out(builder.config.build);
101-
if (!builder.config.build.is_msvc() || builder.ninja()) && !builder.config.llvm_from_ci {
102-
llvm_config_ret_dir.push("build");
103-
}
104101
llvm_config_ret_dir.push("bin");
105102
let build_llvm_config = llvm_config_ret_dir.join(exe("llvm-config", builder.config.build));
106103
let llvm_cmake_dir = out_dir.join("lib/cmake/llvm");

Diff for: src/tools/opt-dist/src/main.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,8 @@ fn execute_pipeline(
270270
})?;
271271

272272
let libdir = env.build_artifacts().join("stage2").join("lib");
273-
let llvm_lib = io::find_file_in_dir(&libdir, "libLLVM", ".so")?;
273+
// The actual name will be something like libLLVM.so.18.1-rust-dev.
274+
let llvm_lib = io::find_file_in_dir(&libdir, "libLLVM.so", "")?;
274275

275276
log::info!("Optimizing {llvm_lib} with BOLT");
276277

0 commit comments

Comments
 (0)