From 4b55e17efdd2452eea526c1f9cbd767c7327a32a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 21 Feb 2024 09:35:38 +0100 Subject: [PATCH 1/2] Update to LLVM 18.1.0 rc 4 --- src/llvm-project | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/llvm-project b/src/llvm-project index 9ea7f739f25..7973f356028 160000 --- a/src/llvm-project +++ b/src/llvm-project @@ -1 +1 @@ -Subproject commit 9ea7f739f257b049a65deeb1f2455bb2ea021cfa +Subproject commit 7973f3560287d750500718314a0fd4025bd8ac0e From 1a652fa869db424d9b8b1210b9dae509d8c0ffa7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 22 Feb 2024 11:55:09 +0100 Subject: [PATCH 2/2] Handle new LLVM soname LLVM now includes the minor version in the soname, and also changed the names of shared object files. libLLVM-18.so is now a symlink to libLLVM.so.18.1. We need to make some 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 install the target of the symlink, ans this is what will get loaded at runtime. However, the rust-dev component in particular also needs to distribute the symlink itself, as download-ci-llvm will end up invoking llvm-config, which requires the symlink to exist. The symlink is not shipped in other components. --- src/bootstrap/src/core/build_steps/dist.rs | 37 ++++++++++++++++++---- src/bootstrap/src/core/build_steps/llvm.rs | 3 -- src/tools/opt-dist/src/main.rs | 3 +- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index fe50a787f9f..067dede904f 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -2021,18 +2021,39 @@ fn add_env(builder: &Builder<'_>, cmd: &mut Command, target: TargetSelection) { } } -fn install_llvm_file(builder: &Builder<'_>, source: &Path, destination: &Path) { +fn install_llvm_file( + builder: &Builder<'_>, + source: &Path, + destination: &Path, + install_symlink: bool, +) { if builder.config.dry_run() { return; } - builder.install(source, destination, 0o644); + if source.is_symlink() { + // If we have a symlink like libLLVM-18.so -> libLLVM.so.18.1, install the target of the + // symlink, which is what will actually get loaded at runtime. + builder.install(&t!(fs::canonicalize(source)), destination, 0o644); + if install_symlink { + // If requested, also install the symlink. This is used by download-ci-llvm. + let full_dest = destination.join(source.file_name().unwrap()); + builder.copy(&source, &full_dest); + } + } else { + builder.install(&source, destination, 0o644); + } } /// Maybe add LLVM object files to the given destination lib-dir. Allows either static or dynamic linking. /// /// Returns whether the files were actually copied. -fn maybe_install_llvm(builder: &Builder<'_>, target: TargetSelection, dst_libdir: &Path) -> bool { +fn maybe_install_llvm( + builder: &Builder<'_>, + target: TargetSelection, + dst_libdir: &Path, + install_symlink: bool, +) -> bool { // If the LLVM was externally provided, then we don't currently copy // artifacts into the sysroot. This is not necessarily the right // choice (in particular, it will require the LLVM dylib to be in @@ -2081,7 +2102,7 @@ fn maybe_install_llvm(builder: &Builder<'_>, target: TargetSelection, dst_libdir } else { PathBuf::from(file) }; - install_llvm_file(builder, &file, dst_libdir); + install_llvm_file(builder, &file, dst_libdir, install_symlink); } !builder.config.dry_run() } else { @@ -2096,7 +2117,7 @@ pub fn maybe_install_llvm_target(builder: &Builder<'_>, target: TargetSelection, // dynamically linked; it is already included into librustc_llvm // statically. if builder.llvm_link_shared() { - maybe_install_llvm(builder, target, &dst_libdir); + maybe_install_llvm(builder, target, &dst_libdir, false); } } @@ -2108,7 +2129,7 @@ pub fn maybe_install_llvm_runtime(builder: &Builder<'_>, target: TargetSelection // dynamically linked; it is already included into librustc_llvm // statically. if builder.llvm_link_shared() { - maybe_install_llvm(builder, target, &dst_libdir); + maybe_install_llvm(builder, target, &dst_libdir, false); } } @@ -2203,6 +2224,8 @@ fn run(self, builder: &Builder<'_>) -> Option { let mut tarball = Tarball::new(builder, "rust-dev", &target.triple); tarball.set_overlay(OverlayKind::LLVM); + // LLVM requires a shared object symlink to exist on some platforms. + tarball.permit_symlinks(true); builder.ensure(crate::core::build_steps::llvm::Llvm { target }); @@ -2243,7 +2266,7 @@ fn run(self, builder: &Builder<'_>) -> Option { // of `rustc-dev` to support the inherited `-lLLVM` when using the // compiler libraries. let dst_libdir = tarball.image_dir().join("lib"); - maybe_install_llvm(builder, target, &dst_libdir); + maybe_install_llvm(builder, target, &dst_libdir, true); let link_type = if builder.llvm_link_shared() { "dynamic" } else { "static" }; t!(std::fs::write(tarball.image_dir().join("link-type.txt"), link_type), dst_libdir); diff --git a/src/bootstrap/src/core/build_steps/llvm.rs b/src/bootstrap/src/core/build_steps/llvm.rs index 4a92acfa3d9..0681289a94f 100644 --- a/src/bootstrap/src/core/build_steps/llvm.rs +++ b/src/bootstrap/src/core/build_steps/llvm.rs @@ -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"); diff --git a/src/tools/opt-dist/src/main.rs b/src/tools/opt-dist/src/main.rs index f9ff1a0a486..ffb01210e04 100644 --- a/src/tools/opt-dist/src/main.rs +++ b/src/tools/opt-dist/src/main.rs @@ -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");