You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
5.4 KiB
142 lines
5.4 KiB
From f2fd2d01f96b50b039402c9ab4278230687f7922 Mon Sep 17 00:00:00 2001 |
|
From: Josh Stone <jistone@redhat.com> |
|
Date: Tue, 25 Jul 2023 13:11:50 -0700 |
|
Subject: [PATCH] Allow using external builds of the compiler-rt profile lib |
|
|
|
This changes the bootstrap config `target.*.profiler` from a plain bool |
|
to also allow a string, which will be used as a path to the pre-built |
|
profiling runtime for that target. Then `profiler_builtins/build.rs` |
|
reads that in a `LLVM_PROFILER_RT_LIB` environment variable. |
|
--- |
|
config.example.toml | 6 ++++-- |
|
library/profiler_builtins/build.rs | 6 ++++++ |
|
src/bootstrap/compile.rs | 4 ++++ |
|
src/bootstrap/config.rs | 30 ++++++++++++++++++++++++------ |
|
4 files changed, 38 insertions(+), 8 deletions(-) |
|
|
|
diff --git a/config.example.toml b/config.example.toml |
|
index d0eaa9fd7ffa..e0e991e679af 100644 |
|
--- a/config.example.toml |
|
+++ b/config.example.toml |
|
@@ -745,8 +745,10 @@ changelog-seen = 2 |
|
# This option will override the same option under [build] section. |
|
#sanitizers = build.sanitizers (bool) |
|
|
|
-# Build the profiler runtime for this target(required when compiling with options that depend |
|
-# on this runtime, such as `-C profile-generate` or `-C instrument-coverage`). |
|
+# When true, build the profiler runtime for this target(required when compiling |
|
+# with options that depend on this runtime, such as `-C profile-generate` or |
|
+# `-C instrument-coverage`). This may also be given a path to an existing build |
|
+# of the profiling runtime library from LLVM's compiler-rt. |
|
# This option will override the same option under [build] section. |
|
#profiler = build.profiler (bool) |
|
|
|
diff --git a/library/profiler_builtins/build.rs b/library/profiler_builtins/build.rs |
|
index 1b1f11798d74..d14d0b82229a 100644 |
|
--- a/library/profiler_builtins/build.rs |
|
+++ b/library/profiler_builtins/build.rs |
|
@@ -6,6 +6,12 @@ |
|
use std::path::Path; |
|
|
|
fn main() { |
|
+ println!("cargo:rerun-if-env-changed=LLVM_PROFILER_RT_LIB"); |
|
+ if let Ok(rt) = env::var("LLVM_PROFILER_RT_LIB") { |
|
+ println!("cargo:rustc-link-lib=static:+verbatim={rt}"); |
|
+ return; |
|
+ } |
|
+ |
|
let target = env::var("TARGET").expect("TARGET was not set"); |
|
let cfg = &mut cc::Build::new(); |
|
|
|
diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs |
|
index 33addb90da37..1d8b3c6e5435 100644 |
|
--- a/src/bootstrap/compile.rs |
|
+++ b/src/bootstrap/compile.rs |
|
@@ -305,6 +305,10 @@ pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, stage: u32, car |
|
cargo.env("MACOSX_DEPLOYMENT_TARGET", target); |
|
} |
|
|
|
+ if let Some(path) = builder.config.profiler_path(target) { |
|
+ cargo.env("LLVM_PROFILER_RT_LIB", path); |
|
+ } |
|
+ |
|
// 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 |
|
diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs |
|
index e192cda9a9a7..a4803db0a470 100644 |
|
--- a/src/bootstrap/config.rs |
|
+++ b/src/bootstrap/config.rs |
|
@@ -467,7 +467,7 @@ pub struct Target { |
|
pub linker: Option<PathBuf>, |
|
pub ndk: Option<PathBuf>, |
|
pub sanitizers: Option<bool>, |
|
- pub profiler: Option<bool>, |
|
+ pub profiler: Option<StringOrBool>, |
|
pub rpath: Option<bool>, |
|
pub crt_static: Option<bool>, |
|
pub musl_root: Option<PathBuf>, |
|
@@ -796,9 +796,9 @@ struct Dist { |
|
} |
|
} |
|
|
|
-#[derive(Debug, Deserialize)] |
|
+#[derive(Clone, Debug, Deserialize)] |
|
#[serde(untagged)] |
|
-enum StringOrBool { |
|
+pub enum StringOrBool { |
|
String(String), |
|
Bool(bool), |
|
} |
|
@@ -809,6 +809,12 @@ fn default() -> StringOrBool { |
|
} |
|
} |
|
|
|
+impl StringOrBool { |
|
+ fn is_string_or_true(&self) -> bool { |
|
+ matches!(self, Self::String(_) | Self::Bool(true)) |
|
+ } |
|
+} |
|
+ |
|
define_config! { |
|
/// TOML representation of how the Rust build is configured. |
|
struct Rust { |
|
@@ -880,7 +886,7 @@ struct TomlTarget { |
|
llvm_libunwind: Option<String> = "llvm-libunwind", |
|
android_ndk: Option<String> = "android-ndk", |
|
sanitizers: Option<bool> = "sanitizers", |
|
- profiler: Option<bool> = "profiler", |
|
+ profiler: Option<StringOrBool> = "profiler", |
|
rpath: Option<bool> = "rpath", |
|
crt_static: Option<bool> = "crt-static", |
|
musl_root: Option<String> = "musl-root", |
|
@@ -1744,12 +1750,24 @@ pub fn any_sanitizers_enabled(&self) -> bool { |
|
self.target_config.values().any(|t| t.sanitizers == Some(true)) || self.sanitizers |
|
} |
|
|
|
+ pub fn profiler_path(&self, target: TargetSelection) -> Option<&str> { |
|
+ match self.target_config.get(&target)?.profiler.as_ref()? { |
|
+ StringOrBool::String(s) => Some(s), |
|
+ StringOrBool::Bool(_) => None, |
|
+ } |
|
+ } |
|
+ |
|
pub fn profiler_enabled(&self, target: TargetSelection) -> bool { |
|
- self.target_config.get(&target).map(|t| t.profiler).flatten().unwrap_or(self.profiler) |
|
+ self.target_config |
|
+ .get(&target) |
|
+ .and_then(|t| t.profiler.as_ref()) |
|
+ .map(StringOrBool::is_string_or_true) |
|
+ .unwrap_or(self.profiler) |
|
} |
|
|
|
pub fn any_profiler_enabled(&self) -> bool { |
|
- self.target_config.values().any(|t| t.profiler == Some(true)) || self.profiler |
|
+ self.target_config.values().any(|t| matches!(&t.profiler, Some(p) if p.is_string_or_true())) |
|
+ || self.profiler |
|
} |
|
|
|
pub fn rpath_enabled(&self, target: TargetSelection) -> bool { |
|
-- |
|
2.41.0 |
|
|
|
|