Rollup merge of #78354 - 12101111:rustbuild_profiler, r=Mark-Simulacrum
Support enable/disable sanitizers/profiler per target This PR add options under `[target.*]` of `config.toml` which can enable or disable sanitizers/profiler runtime for corresponding target. If these options are empty, the global options under `[build]` will take effect. Fix #78329
This commit is contained in:
commit
194b96852f
@ -586,6 +586,15 @@ changelog-seen = 2
|
|||||||
# build native code.
|
# build native code.
|
||||||
#android-ndk = "/path/to/ndk"
|
#android-ndk = "/path/to/ndk"
|
||||||
|
|
||||||
|
# Build the sanitizer runtimes for this target.
|
||||||
|
# This option will override the same option under [build] section.
|
||||||
|
#sanitizers = false
|
||||||
|
|
||||||
|
# Build the profiler runtime for this target(required when compiling with options that depend
|
||||||
|
# on this runtime, such as `-C profile-generate` or `-Z instrument-coverage`).
|
||||||
|
# This option will override the same option under [build] section.
|
||||||
|
#profiler = false
|
||||||
|
|
||||||
# Force static or dynamic linkage of the standard library for this target. If
|
# Force static or dynamic linkage of the standard library for this target. If
|
||||||
# this target is a host for rustc, this will also affect the linkage of the
|
# this target is a host for rustc, this will also affect the linkage of the
|
||||||
# compiler itself. This is useful for building rustc on targets that normally
|
# compiler itself. This is useful for building rustc on targets that normally
|
||||||
|
@ -264,7 +264,7 @@ impl<'a> ShouldRun<'a> {
|
|||||||
/// `all_krates` should probably be removed at some point.
|
/// `all_krates` should probably be removed at some point.
|
||||||
pub fn all_krates(mut self, name: &str) -> Self {
|
pub fn all_krates(mut self, name: &str) -> Self {
|
||||||
let mut set = BTreeSet::new();
|
let mut set = BTreeSet::new();
|
||||||
for krate in self.builder.in_tree_crates(name) {
|
for krate in self.builder.in_tree_crates(name, None) {
|
||||||
let path = krate.local_path(self.builder);
|
let path = krate.local_path(self.builder);
|
||||||
set.insert(path);
|
set.insert(path);
|
||||||
}
|
}
|
||||||
@ -277,7 +277,7 @@ impl<'a> ShouldRun<'a> {
|
|||||||
///
|
///
|
||||||
/// `make_run` will be called separately for each matching command-line path.
|
/// `make_run` will be called separately for each matching command-line path.
|
||||||
pub fn krate(mut self, name: &str) -> Self {
|
pub fn krate(mut self, name: &str) -> Self {
|
||||||
for krate in self.builder.in_tree_crates(name) {
|
for krate in self.builder.in_tree_crates(name, None) {
|
||||||
let path = krate.local_path(self.builder);
|
let path = krate.local_path(self.builder);
|
||||||
self.paths.insert(PathSet::one(path));
|
self.paths.insert(PathSet::one(path));
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@ impl Step for Std {
|
|||||||
// Explicitly pass -p for all dependencies krates -- this will force cargo
|
// Explicitly pass -p for all dependencies krates -- this will force cargo
|
||||||
// to also check the tests/benches/examples for these crates, rather
|
// to also check the tests/benches/examples for these crates, rather
|
||||||
// than just the leaf crate.
|
// than just the leaf crate.
|
||||||
for krate in builder.in_tree_crates("test") {
|
for krate in builder.in_tree_crates("test", Some(target)) {
|
||||||
cargo.arg("-p").arg(krate.name);
|
cargo.arg("-p").arg(krate.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,7 +172,7 @@ impl Step for Rustc {
|
|||||||
// Explicitly pass -p for all compiler krates -- this will force cargo
|
// Explicitly pass -p for all compiler krates -- this will force cargo
|
||||||
// to also check the tests/benches/examples for these crates, rather
|
// to also check the tests/benches/examples for these crates, rather
|
||||||
// than just the leaf crate.
|
// than just the leaf crate.
|
||||||
for krate in builder.in_tree_crates("rustc-main") {
|
for krate in builder.in_tree_crates("rustc-main", Some(target)) {
|
||||||
cargo.arg("-p").arg(krate.name);
|
cargo.arg("-p").arg(krate.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,7 +143,7 @@ fn copy_third_party_objects(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if builder.config.sanitizers && compiler.stage != 0 {
|
if builder.config.sanitizers_enabled(target) && compiler.stage != 0 {
|
||||||
// The sanitizers are only copied in stage1 or above,
|
// The sanitizers are only copied in stage1 or above,
|
||||||
// to avoid creating dependency on LLVM.
|
// to avoid creating dependency on LLVM.
|
||||||
target_deps.extend(
|
target_deps.extend(
|
||||||
@ -251,7 +251,7 @@ pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, stage: u32, car
|
|||||||
.arg("--features")
|
.arg("--features")
|
||||||
.arg(features);
|
.arg(features);
|
||||||
} else {
|
} else {
|
||||||
let mut features = builder.std_features();
|
let mut features = builder.std_features(target);
|
||||||
features.push_str(compiler_builtins_c_feature);
|
features.push_str(compiler_builtins_c_feature);
|
||||||
|
|
||||||
cargo
|
cargo
|
||||||
|
@ -279,6 +279,8 @@ pub struct Target {
|
|||||||
pub ranlib: Option<PathBuf>,
|
pub ranlib: Option<PathBuf>,
|
||||||
pub linker: Option<PathBuf>,
|
pub linker: Option<PathBuf>,
|
||||||
pub ndk: Option<PathBuf>,
|
pub ndk: Option<PathBuf>,
|
||||||
|
pub sanitizers: bool,
|
||||||
|
pub profiler: bool,
|
||||||
pub crt_static: Option<bool>,
|
pub crt_static: Option<bool>,
|
||||||
pub musl_root: Option<PathBuf>,
|
pub musl_root: Option<PathBuf>,
|
||||||
pub musl_libdir: Option<PathBuf>,
|
pub musl_libdir: Option<PathBuf>,
|
||||||
@ -503,6 +505,8 @@ struct TomlTarget {
|
|||||||
llvm_config: Option<String>,
|
llvm_config: Option<String>,
|
||||||
llvm_filecheck: Option<String>,
|
llvm_filecheck: Option<String>,
|
||||||
android_ndk: Option<String>,
|
android_ndk: Option<String>,
|
||||||
|
sanitizers: Option<bool>,
|
||||||
|
profiler: Option<bool>,
|
||||||
crt_static: Option<bool>,
|
crt_static: Option<bool>,
|
||||||
musl_root: Option<String>,
|
musl_root: Option<String>,
|
||||||
musl_libdir: Option<String>,
|
musl_libdir: Option<String>,
|
||||||
@ -890,6 +894,8 @@ impl Config {
|
|||||||
target.musl_libdir = cfg.musl_libdir.map(PathBuf::from);
|
target.musl_libdir = cfg.musl_libdir.map(PathBuf::from);
|
||||||
target.wasi_root = cfg.wasi_root.map(PathBuf::from);
|
target.wasi_root = cfg.wasi_root.map(PathBuf::from);
|
||||||
target.qemu_rootfs = cfg.qemu_rootfs.map(PathBuf::from);
|
target.qemu_rootfs = cfg.qemu_rootfs.map(PathBuf::from);
|
||||||
|
target.sanitizers = cfg.sanitizers.unwrap_or(build.sanitizers.unwrap_or_default());
|
||||||
|
target.profiler = cfg.profiler.unwrap_or(build.profiler.unwrap_or_default());
|
||||||
|
|
||||||
config.target_config.insert(TargetSelection::from_user(&triple), target);
|
config.target_config.insert(TargetSelection::from_user(&triple), target);
|
||||||
}
|
}
|
||||||
@ -999,6 +1005,22 @@ impl Config {
|
|||||||
self.verbose > 1
|
self.verbose > 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn sanitizers_enabled(&self, target: TargetSelection) -> bool {
|
||||||
|
self.target_config.get(&target).map(|t| t.sanitizers).unwrap_or(self.sanitizers)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn any_sanitizers_enabled(&self) -> bool {
|
||||||
|
self.target_config.values().any(|t| t.sanitizers) || self.sanitizers
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn profiler_enabled(&self, target: TargetSelection) -> bool {
|
||||||
|
self.target_config.get(&target).map(|t| t.profiler).unwrap_or(self.profiler)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn any_profiler_enabled(&self) -> bool {
|
||||||
|
self.target_config.values().any(|t| t.profiler) || self.profiler
|
||||||
|
}
|
||||||
|
|
||||||
pub fn llvm_enabled(&self) -> bool {
|
pub fn llvm_enabled(&self) -> bool {
|
||||||
self.rust_codegen_backends.contains(&INTERNER.intern_str("llvm"))
|
self.rust_codegen_backends.contains(&INTERNER.intern_str("llvm"))
|
||||||
}
|
}
|
||||||
|
@ -535,8 +535,12 @@ impl Step for Rustc {
|
|||||||
// Find dependencies for top level crates.
|
// Find dependencies for top level crates.
|
||||||
let mut compiler_crates = HashSet::new();
|
let mut compiler_crates = HashSet::new();
|
||||||
for root_crate in &["rustc_driver", "rustc_codegen_llvm", "rustc_codegen_ssa"] {
|
for root_crate in &["rustc_driver", "rustc_codegen_llvm", "rustc_codegen_ssa"] {
|
||||||
compiler_crates
|
compiler_crates.extend(
|
||||||
.extend(builder.in_tree_crates(root_crate).into_iter().map(|krate| krate.name));
|
builder
|
||||||
|
.in_tree_crates(root_crate, Some(target))
|
||||||
|
.into_iter()
|
||||||
|
.map(|krate| krate.name),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
for krate in &compiler_crates {
|
for krate in &compiler_crates {
|
||||||
|
@ -541,7 +541,7 @@ impl Build {
|
|||||||
|
|
||||||
/// Gets the space-separated set of activated features for the standard
|
/// Gets the space-separated set of activated features for the standard
|
||||||
/// library.
|
/// library.
|
||||||
fn std_features(&self) -> String {
|
fn std_features(&self, target: TargetSelection) -> String {
|
||||||
let mut features = "panic-unwind".to_string();
|
let mut features = "panic-unwind".to_string();
|
||||||
|
|
||||||
match self.config.llvm_libunwind.unwrap_or_default() {
|
match self.config.llvm_libunwind.unwrap_or_default() {
|
||||||
@ -552,7 +552,7 @@ impl Build {
|
|||||||
if self.config.backtrace {
|
if self.config.backtrace {
|
||||||
features.push_str(" backtrace");
|
features.push_str(" backtrace");
|
||||||
}
|
}
|
||||||
if self.config.profiler {
|
if self.config.profiler_enabled(target) {
|
||||||
features.push_str(" profiler");
|
features.push_str(" profiler");
|
||||||
}
|
}
|
||||||
features
|
features
|
||||||
@ -1115,7 +1115,7 @@ impl Build {
|
|||||||
/// Returns a Vec of all the dependencies of the given root crate,
|
/// Returns a Vec of all the dependencies of the given root crate,
|
||||||
/// including transitive dependencies and the root itself. Only includes
|
/// including transitive dependencies and the root itself. Only includes
|
||||||
/// "local" crates (those in the local source tree, not from a registry).
|
/// "local" crates (those in the local source tree, not from a registry).
|
||||||
fn in_tree_crates(&self, root: &str) -> Vec<&Crate> {
|
fn in_tree_crates(&self, root: &str, target: Option<TargetSelection>) -> Vec<&Crate> {
|
||||||
let mut ret = Vec::new();
|
let mut ret = Vec::new();
|
||||||
let mut list = vec![INTERNER.intern_str(root)];
|
let mut list = vec![INTERNER.intern_str(root)];
|
||||||
let mut visited = HashSet::new();
|
let mut visited = HashSet::new();
|
||||||
@ -1136,7 +1136,10 @@ impl Build {
|
|||||||
// metadata::build.
|
// metadata::build.
|
||||||
if visited.insert(dep)
|
if visited.insert(dep)
|
||||||
&& dep != "build_helper"
|
&& dep != "build_helper"
|
||||||
&& (dep != "profiler_builtins" || self.config.profiler)
|
&& (dep != "profiler_builtins"
|
||||||
|
|| target
|
||||||
|
.map(|t| self.config.profiler_enabled(t))
|
||||||
|
.unwrap_or(self.config.any_profiler_enabled()))
|
||||||
&& (dep != "rustc_codegen_llvm" || self.config.llvm_enabled())
|
&& (dep != "rustc_codegen_llvm" || self.config.llvm_enabled())
|
||||||
{
|
{
|
||||||
list.push(*dep);
|
list.push(*dep);
|
||||||
|
@ -91,7 +91,7 @@ pub fn check(build: &mut Build) {
|
|||||||
.unwrap_or(true)
|
.unwrap_or(true)
|
||||||
})
|
})
|
||||||
.any(|build_llvm_ourselves| build_llvm_ourselves);
|
.any(|build_llvm_ourselves| build_llvm_ourselves);
|
||||||
if building_llvm || build.config.sanitizers {
|
if building_llvm || build.config.any_sanitizers_enabled() {
|
||||||
cmd_finder.must_have("cmake");
|
cmd_finder.must_have("cmake");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1271,11 +1271,11 @@ note: if you're sure you want to do this, please open an issue as to why. In the
|
|||||||
cmd.env("RUSTC_BOOTSTRAP", "1");
|
cmd.env("RUSTC_BOOTSTRAP", "1");
|
||||||
builder.add_rust_test_threads(&mut cmd);
|
builder.add_rust_test_threads(&mut cmd);
|
||||||
|
|
||||||
if builder.config.sanitizers {
|
if builder.config.sanitizers_enabled(target) {
|
||||||
cmd.env("RUSTC_SANITIZER_SUPPORT", "1");
|
cmd.env("RUSTC_SANITIZER_SUPPORT", "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
if builder.config.profiler {
|
if builder.config.profiler_enabled(target) {
|
||||||
cmd.env("RUSTC_PROFILER_SUPPORT", "1");
|
cmd.env("RUSTC_PROFILER_SUPPORT", "1");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1591,7 +1591,7 @@ impl Step for CrateLibrustc {
|
|||||||
let builder = run.builder;
|
let builder = run.builder;
|
||||||
let compiler = builder.compiler(builder.top_stage, run.build_triple());
|
let compiler = builder.compiler(builder.top_stage, run.build_triple());
|
||||||
|
|
||||||
for krate in builder.in_tree_crates("rustc-main") {
|
for krate in builder.in_tree_crates("rustc-main", Some(run.target)) {
|
||||||
if krate.path.ends_with(&run.path) {
|
if krate.path.ends_with(&run.path) {
|
||||||
let test_kind = builder.kind.into();
|
let test_kind = builder.kind.into();
|
||||||
|
|
||||||
@ -1698,7 +1698,7 @@ impl Step for Crate {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
for krate in builder.in_tree_crates("test") {
|
for krate in builder.in_tree_crates("test", Some(run.target)) {
|
||||||
if krate.path.ends_with(&run.path) {
|
if krate.path.ends_with(&run.path) {
|
||||||
make(Mode::Std, krate);
|
make(Mode::Std, krate);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user