Skip to content

Commit

Permalink
Auto merge of rust-lang#129295 - Zalathar:profiler-builtins, r=Kobzol
Browse files Browse the repository at this point in the history
Build `library/profiler_builtins` from `ci-llvm` if appropriate

Running all of `tests/coverage` requires the LLVM profiler runtime, which requires setting `build.profiler = true`.

Historically, doing that has required checking out the entire `src/llvm-project` submodule. For compiler contributors who otherwise don't need that submodule (thanks to `download-ci-vm`), that's quite inconvenient.

However, thanks to rust-lang#129116, the downloaded CI LLVM tarball now contains a copy of LLVM's `compiler-rt` directory, which includes all the files needed to build the profiler runtime. So with a little bit of extra logic in bootstrap, we can have `library/profiler_builtins` look for the `compiler-rt` files in `ci-llvm` instead of the `src/llvm-project` submodule.
  • Loading branch information
bors committed Aug 25, 2024
2 parents 8dafd33 + a437005 commit 4de4deb
Showing 1 changed file with 12 additions and 4 deletions.
16 changes: 12 additions & 4 deletions profiler_builtins/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
//! See the build.rs for libcompiler_builtins crate for details.
use std::env;
use std::path::Path;
use std::path::PathBuf;

fn main() {
println!("cargo:rerun-if-env-changed=LLVM_PROFILER_RT_LIB");
Expand Down Expand Up @@ -79,17 +79,25 @@ fn main() {
cfg.define("COMPILER_RT_HAS_ATOMICS", Some("1"));
}

// Note that this should exist if we're going to run (otherwise we just
// don't build profiler builtins at all).
let root = Path::new("../../src/llvm-project/compiler-rt");
// Get the LLVM `compiler-rt` directory from bootstrap.
println!("cargo:rerun-if-env-changed=RUST_COMPILER_RT_FOR_PROFILER");
let root = PathBuf::from(env::var("RUST_COMPILER_RT_FOR_PROFILER").unwrap_or_else(|_| {
let path = "../../src/llvm-project/compiler-rt";
println!("RUST_COMPILER_RT_FOR_PROFILER was not set; falling back to {path:?}");
path.to_owned()
}));

let src_root = root.join("lib").join("profile");
assert!(src_root.exists(), "profiler runtime source directory not found: {src_root:?}");
let mut n_sources_found = 0u32;
for src in profile_sources {
let path = src_root.join(src);
if path.exists() {
cfg.file(path);
n_sources_found += 1;
}
}
assert!(n_sources_found > 0, "couldn't find any profiler runtime source files in {src_root:?}");

cfg.include(root.join("include"));
cfg.warnings(false);
Expand Down

0 comments on commit 4de4deb

Please sign in to comment.