Skip to content

Commit

Permalink
Handle new LLVM soname
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nikic committed Feb 22, 2024
1 parent 00e3b26 commit bb1d57b
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 5 deletions.
8 changes: 7 additions & 1 deletion src/bootstrap/src/core/build_steps/dist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2026,7 +2026,13 @@ fn install_llvm_file(builder: &Builder<'_>, source: &Path, destination: &Path) {
return;
}

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

/// Maybe add LLVM object files to the given destination lib-dir. Allows either static or dynamic linking.
Expand Down
3 changes: 0 additions & 3 deletions src/bootstrap/src/core/build_steps/llvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,6 @@ pub fn prebuilt_llvm_config(
let out_dir = builder.llvm_out(target);

let mut llvm_config_ret_dir = builder.llvm_out(builder.config.build);
if (!builder.config.build.is_msvc() || builder.ninja()) && !builder.config.llvm_from_ci {
llvm_config_ret_dir.push("build");
}
llvm_config_ret_dir.push("bin");
let build_llvm_config = llvm_config_ret_dir.join(exe("llvm-config", builder.config.build));
let llvm_cmake_dir = out_dir.join("lib/cmake/llvm");
Expand Down
3 changes: 2 additions & 1 deletion src/tools/opt-dist/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -270,7 +270,8 @@ fn execute_pipeline(
})?;

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

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

Expand Down

0 comments on commit bb1d57b

Please sign in to comment.