// Determine if we're going to compile in optimized C intrinsics to
// the `compiler-builtins` crate. These intrinsics live in LLVM's
- // `compiler-rt` repository, but our `src/llvm-project` submodule isn't
- // always checked out, so we need to conditionally look for this. (e.g. if
- // an external LLVM is used we skip the LLVM submodule checkout).
+ // `compiler-rt` repository.
//
// Note that this shouldn't affect the correctness of `compiler-builtins`,
// but only its speed. Some intrinsics in C haven't been translated to Rust
// If `compiler-rt` is available ensure that the `c` feature of the
// `compiler-builtins` crate is enabled and it's configured to learn where
// `compiler-rt` is located.
- let compiler_builtins_root = builder.src.join("src/llvm-project/compiler-rt");
- let compiler_builtins_c_feature = if compiler_builtins_root.exists() {
+ let compiler_builtins_c_feature = if builder.config.optimized_compiler_builtins {
+ if !builder.is_rust_llvm(target) {
+ panic!(
+ "need a managed LLVM submodule for optimized intrinsics support; unset `llvm-config` or `optimized-compiler-builtins`"
+ );
+ }
+
+ builder.update_submodule(&Path::new("src").join("llvm-project"));
+ let compiler_builtins_root = builder.src.join("src/llvm-project/compiler-rt");
// Note that `libprofiler_builtins/build.rs` also computes this so if
// you're changing something here please also change that.
cargo.env("RUST_COMPILER_RT_ROOT", &compiler_builtins_root);
let libdir = builder.sysroot_libdir(target_compiler, target);
let hostdir = builder.sysroot_libdir(target_compiler, compiler.host);
add_to_sysroot(builder, &libdir, &hostdir, &libstd_stamp(builder, compiler, target));
-
- if compiler.stage == 0 {
- // special handling for stage0, to make `rustup toolchain link` and `x dist --stage 0`
- // work for stage0-sysroot
-
- // copy bin files from stage0/bin to stage0-sysroot/bin
- let sysroot = builder.out.join(&compiler.host.triple).join("stage0-sysroot");
-
- let host = compiler.host.triple;
- let stage0_bin_dir = builder.out.join(&host).join("stage0/bin");
- let sysroot_bin_dir = sysroot.join("bin");
- t!(fs::create_dir_all(&sysroot_bin_dir));
- builder.cp_r(&stage0_bin_dir, &sysroot_bin_dir);
-
- // copy all *.so files from stage0/lib to stage0-sysroot/lib
- let stage0_lib_dir = builder.out.join(&host).join("stage0/lib");
- if let Ok(files) = fs::read_dir(&stage0_lib_dir) {
- for file in files {
- let file = t!(file);
- let path = file.path();
- if path.is_file() && is_dylib(&file.file_name().into_string().unwrap()) {
- builder.copy(&path, &sysroot.join("lib").join(path.file_name().unwrap()));
- }
- }
- }
-
- // copy codegen-backends from stage0
- let sysroot_codegen_backends = builder.sysroot_codegen_backends(compiler);
- t!(fs::create_dir_all(&sysroot_codegen_backends));
- let stage0_codegen_backends = builder
- .out
- .join(&host)
- .join("stage0/lib/rustlib")
- .join(&host)
- .join("codegen-backends");
- builder.cp_r(&stage0_codegen_backends, &sysroot_codegen_backends);
- }
}
}