diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 0eeb799672cf2..2464c97827806 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -42,7 +42,16 @@ pub fn std(build: &Build, target: &str, compiler: &Compiler) { 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")); diff --git a/src/libstd/Cargo.toml b/src/libstd/Cargo.toml index fcf84cb716917..8146e7fb1edaf 100644 --- a/src/libstd/Cargo.toml +++ b/src/libstd/Cargo.toml @@ -31,4 +31,5 @@ gcc = "0.3.27" backtrace = [] debug-jemalloc = ["alloc_jemalloc/debug"] jemalloc = ["alloc_jemalloc"] +force_alloc_system = [] panic-unwind = ["panic_unwind"] diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 521b938acfb7e..37632ac76f2db 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -219,9 +219,10 @@ // 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 @@ -333,7 +334,7 @@ extern crate libc; // 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 diff --git a/src/rustc/std_shim/Cargo.toml b/src/rustc/std_shim/Cargo.toml index 1fa9177243536..7260a8440734d 100644 --- a/src/rustc/std_shim/Cargo.toml +++ b/src/rustc/std_shim/Cargo.toml @@ -38,4 +38,5 @@ core = { path = "../../libcore" } backtrace = ["std/backtrace"] debug-jemalloc = ["std/debug-jemalloc"] jemalloc = ["std/jemalloc"] +force_alloc_system = ["std/force_alloc_system"] panic-unwind = ["std/panic-unwind"]