let out_dir = build.cargo_out(compiler, Mode::Libstd, target);
build.clear_if_dirty(&out_dir, &build.compiler_path(compiler));
let mut cargo = build.cargo(compiler, Mode::Libstd, target, "build");
- cargo.arg("--features").arg(build.std_features())
+ let mut features = build.std_features();
+ // When doing a local rebuild we tell cargo that we're stage1 rather than
+ // stage0. This works fine if the local rust and being-built rust have the
+ // same view of what the default allocator is, but fails otherwise. Since
+ // we don't have a way to express an allocator preference yet, work
+ // around the issue in the case of a local rebuild with jemalloc disabled.
+ if compiler.stage == 0 && build.local_rebuild && !build.config.use_jemalloc {
+ features.push_str(" force_alloc_system");
+ }
+ cargo.arg("--features").arg(features)
.arg("--manifest-path")
.arg(build.src.join("src/rustc/std_shim/Cargo.toml"));
backtrace = []
debug-jemalloc = ["alloc_jemalloc/debug"]
jemalloc = ["alloc_jemalloc"]
+force_alloc_system = []
panic-unwind = ["panic_unwind"]
// Tell the compiler to link to either panic_abort or panic_unwind
#![needs_panic_runtime]
-// Always use alloc_system during stage0 since jemalloc might be unavailable or
-// disabled (Issue #30592)
-#![cfg_attr(stage0, feature(alloc_system))]
+// Always use alloc_system during stage0 since we don't know if the alloc_*
+// crate the stage0 compiler will pick by default is available (most
+// obviously, if the user has disabled jemalloc in `./configure`).
+#![cfg_attr(any(stage0, feature = "force_alloc_system"), feature(alloc_system))]
// Turn warnings into errors, but only after stage0, where it can be useful for
// code to emit warnings during language transitions
// We always need an unwinder currently for backtraces
extern crate unwind;
-#[cfg(stage0)]
+#[cfg(any(stage0, feature = "force_alloc_system"))]
extern crate alloc_system;
// compiler-rt intrinsics
backtrace = ["std/backtrace"]
debug-jemalloc = ["std/debug-jemalloc"]
jemalloc = ["std/jemalloc"]
+force_alloc_system = ["std/force_alloc_system"]
panic-unwind = ["std/panic-unwind"]