diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd015e1cd4302..d523ab5bde749 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -288,7 +288,7 @@ jobs: - name: dist-x86_64-apple env: SCRIPT: "./x.py dist --exclude rust-docs --exclude extended && ./x.py dist --target=x86_64-apple-darwin rust-docs && ./x.py dist extended" - RUST_CONFIGURE_ARGS: "--host=x86_64-apple-darwin --target=x86_64-apple-darwin,aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim --enable-full-tools --enable-sanitizers --enable-profiler --set rust.jemalloc --set llvm.ninja=false" + RUST_CONFIGURE_ARGS: "--host=x86_64-apple-darwin --target=x86_64-apple-darwin,aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim --enable-full-tools --enable-sanitizers --enable-profiler --set rust.mimalloc --set llvm.ninja=false" RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 MACOSX_DEPLOYMENT_TARGET: 10.7 NO_LLVM_ASSERTIONS: 1 @@ -299,7 +299,7 @@ jobs: - name: dist-x86_64-apple-alt env: SCRIPT: "./x.py dist" - RUST_CONFIGURE_ARGS: "--enable-extended --enable-profiler --set rust.jemalloc --set llvm.ninja=false" + RUST_CONFIGURE_ARGS: "--enable-extended --enable-profiler --set rust.mimalloc --set llvm.ninja=false" RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 MACOSX_DEPLOYMENT_TARGET: 10.7 NO_LLVM_ASSERTIONS: 1 @@ -309,7 +309,7 @@ jobs: - name: x86_64-apple env: SCRIPT: "./x.py --stage 2 test" - RUST_CONFIGURE_ARGS: "--build=x86_64-apple-darwin --enable-sanitizers --enable-profiler --set rust.jemalloc --set llvm.ninja=false" + RUST_CONFIGURE_ARGS: "--build=x86_64-apple-darwin --enable-sanitizers --enable-profiler --set rust.mimalloc --set llvm.ninja=false" RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 MACOSX_DEPLOYMENT_TARGET: 10.8 MACOSX_STD_DEPLOYMENT_TARGET: 10.7 @@ -320,7 +320,7 @@ jobs: - name: dist-aarch64-apple env: SCRIPT: "./x.py dist --stage 2" - RUST_CONFIGURE_ARGS: "--build=x86_64-apple-darwin --host=aarch64-apple-darwin --target=aarch64-apple-darwin --enable-full-tools --enable-sanitizers --enable-profiler --set rust.jemalloc --set llvm.ninja=false" + RUST_CONFIGURE_ARGS: "--build=x86_64-apple-darwin --host=aarch64-apple-darwin --target=aarch64-apple-darwin --enable-full-tools --enable-sanitizers --enable-profiler --set rust.mimalloc --set llvm.ninja=false" RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 USE_XCODE_CLANG: 1 MACOSX_DEPLOYMENT_TARGET: 11.0 @@ -329,7 +329,6 @@ jobs: NO_DEBUG_ASSERTIONS: 1 NO_OVERFLOW_CHECKS: 1 DIST_REQUIRE_ALL_TOOLS: 1 - JEMALLOC_SYS_WITH_LG_PAGE: 14 os: macos-latest - name: x86_64-msvc-1 env: diff --git a/Cargo.lock b/Cargo.lock index cd50defbe6f6c..524c5caabda2e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -888,6 +888,12 @@ dependencies = [ "syn", ] +[[package]] +name = "cty" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" + [[package]] name = "curl" version = "0.4.41" @@ -1238,12 +1244,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcd1163ae48bda72a20ae26d66a04d3094135cadab911cff418ae5e33f253431" -[[package]] -name = "fs_extra" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674" - [[package]] name = "fst" version = "0.4.5" @@ -1942,6 +1942,16 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" +[[package]] +name = "libmimalloc-sys" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9636c194f9db483f4d0adf2f99a65011a99f904bd222bbd67fb4df4f37863c30" +dependencies = [ + "cc", + "cty", +] + [[package]] name = "libnghttp2-sys" version = "0.1.4+1.41.0" @@ -3479,10 +3489,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" name = "rustc-main" version = "0.0.0" dependencies = [ + "libmimalloc-sys", "rustc_codegen_ssa", "rustc_driver", - "tikv-jemalloc-sys", - "tikv-jemallocator", ] [[package]] @@ -5303,27 +5312,6 @@ dependencies = [ name = "tier-check" version = "0.1.0" -[[package]] -name = "tikv-jemalloc-sys" -version = "0.4.1+5.2.1-patched" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a26331b05179d4cb505c8d6814a7e18d298972f0a551b0e3cefccff927f86d3" -dependencies = [ - "cc", - "fs_extra", - "libc", -] - -[[package]] -name = "tikv-jemallocator" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c14a5a604eb8715bc5785018a37d00739b180bcf609916ddf4393d33d49ccdf" -dependencies = [ - "libc", - "tikv-jemalloc-sys", -] - [[package]] name = "time" version = "0.1.43" diff --git a/compiler/rustc/Cargo.toml b/compiler/rustc/Cargo.toml index 277cf0f51d378..75e351580e931 100644 --- a/compiler/rustc/Cargo.toml +++ b/compiler/rustc/Cargo.toml @@ -10,16 +10,13 @@ rustc_driver = { path = "../rustc_driver" } # crate is intended to be used by codegen backends, which may not be in-tree. rustc_codegen_ssa = { path = "../rustc_codegen_ssa" } -[dependencies.tikv-jemalloc-sys] -version = '0.4.0' -optional = true -features = ['unprefixed_malloc_on_supported_platforms'] - -[dependencies.tikv-jemallocator] -version = '0.4.0' +[dependencies.libmimalloc-sys] +version = '0.1.20' optional = true +default-features = false +features = ['extended', 'override'] [features] -jemalloc = ['tikv-jemalloc-sys', 'tikv-jemallocator'] +mimalloc = ['libmimalloc-sys'] llvm = ['rustc_driver/llvm'] max_level_info = ['rustc_driver/max_level_info'] diff --git a/compiler/rustc/src/main.rs b/compiler/rustc/src/main.rs index 4edd095af10b5..f85611a069635 100644 --- a/compiler/rustc/src/main.rs +++ b/compiler/rustc/src/main.rs @@ -1,4 +1,4 @@ -// A note about jemalloc: rustc uses jemalloc when built for CI and +// A note about mimalloc: rustc uses mimalloc when built for CI and // distribution. The obvious way to do this is with the `#[global_allocator]` // mechanism. However, for complicated reasons (see // https://github.com/rust-lang/rust/pull/81782#issuecomment-784438001 for some @@ -6,57 +6,52 @@ // allocator across the rustc <-> llvm boundary, and `#[global_allocator]` // wouldn't provide that. // -// Instead, we use a lower-level mechanism. rustc is linked with jemalloc in a -// way such that jemalloc's implementation of `malloc`, `free`, etc., override +// Instead, we use a lower-level mechanism. rustc is linked with mimalloc in a +// way such that mimalloc's implementation of `malloc`, `free`, etc., override // the libc allocator's implementation. This means that Rust's `System` // allocator, which calls `libc::malloc()` et al., is actually calling into -// jemalloc. -// -// A consequence of not using `GlobalAlloc` (and the `tikv-jemallocator` crate -// provides an impl of that trait, which is called `Jemalloc`) is that we -// cannot use the sized deallocation APIs (`sdallocx`) that jemalloc provides. -// It's unclear how much performance is lost because of this. +// mimalloc. // // As for the symbol overrides in `main` below: we're pulling in a static copy -// of jemalloc. We need to actually reference its symbols for it to get linked. +// of mimalloc. We need to actually reference its symbols for it to get linked. // The two crates we link to here, `std` and `rustc_driver`, are both dynamic -// libraries. So we must reference jemalloc symbols one way or another, because +// libraries. So we must reference mimalloc symbols one way or another, because // this file is the only object code in the rustc executable. -#[cfg(feature = "tikv-jemalloc-sys")] -use tikv_jemalloc_sys as jemalloc_sys; fn main() { // See the comment at the top of this file for an explanation of this. - #[cfg(feature = "tikv-jemalloc-sys")] + #[cfg(feature = "libmimalloc-sys")] { use std::os::raw::{c_int, c_void}; #[used] - static _F1: unsafe extern "C" fn(usize, usize) -> *mut c_void = jemalloc_sys::calloc; + static _F1: unsafe extern "C" fn(usize, usize) -> *mut c_void = libmimalloc_sys::mi_calloc; #[used] static _F2: unsafe extern "C" fn(*mut *mut c_void, usize, usize) -> c_int = - jemalloc_sys::posix_memalign; + libmimalloc_sys::mi_posix_memalign; #[used] - static _F3: unsafe extern "C" fn(usize, usize) -> *mut c_void = jemalloc_sys::aligned_alloc; + static _F3: unsafe extern "C" fn(usize, usize) -> *mut c_void = + libmimalloc_sys::mi_aligned_alloc; #[used] - static _F4: unsafe extern "C" fn(usize) -> *mut c_void = jemalloc_sys::malloc; + static _F4: unsafe extern "C" fn(usize) -> *mut c_void = libmimalloc_sys::mi_malloc; #[used] - static _F5: unsafe extern "C" fn(*mut c_void, usize) -> *mut c_void = jemalloc_sys::realloc; + static _F5: unsafe extern "C" fn(*mut c_void, usize) -> *mut c_void = + libmimalloc_sys::mi_realloc; #[used] - static _F6: unsafe extern "C" fn(*mut c_void) = jemalloc_sys::free; + static _F6: unsafe extern "C" fn(*mut c_void) = libmimalloc_sys::mi_free; - // On OSX, jemalloc doesn't directly override malloc/free, but instead + // On OSX, mimalloc doesn't directly override malloc/free, but instead // registers itself with the allocator's zone APIs in a ctor. However, // the linker doesn't seem to consider ctors as "used" when statically // linking, so we need to explicitly depend on the function. #[cfg(target_os = "macos")] { extern "C" { - fn _rjem_je_zone_register(); + fn _mi_macos_override_malloc(); } #[used] - static _F7: unsafe extern "C" fn() = _rjem_je_zone_register; + static _F7: unsafe extern "C" fn() = _mi_macos_override_malloc; } } diff --git a/config.toml.example b/config.toml.example index 4dd953a495d67..05fefbd0cff73 100644 --- a/config.toml.example +++ b/config.toml.example @@ -582,9 +582,9 @@ changelog-seen = 2 # Map debuginfo paths to `/rust/$sha/...`, generally only set for releases #remap-debuginfo = false -# Link the compiler against `jemalloc`, where on Linux and OSX it should +# Link the compiler against `mimalloc`, where on Linux and OSX it should # override the default allocator for rustc and LLVM. -#jemalloc = false +#mimalloc = false # Run tests in various test suites with the "nll compare mode" in addition to # running the tests in normal mode. Largely only used on CI and during local diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index 68e20f90b7fa4..d20766fa48e33 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -151,7 +151,7 @@ pub struct Config { pub hosts: Vec, pub targets: Vec, pub local_rebuild: bool, - pub jemalloc: bool, + pub mimalloc: bool, pub control_flow_guard: bool, // dist misc @@ -512,7 +512,7 @@ struct Rust { verify_llvm_ir: Option, thin_lto_import_instr_limit: Option, remap_debuginfo: Option, - jemalloc: Option, + mimalloc: Option, test_compare_mode: Option, llvm_libunwind: Option, control_flow_guard: Option, @@ -878,7 +878,7 @@ impl Config { set(&mut config.rust_optimize_tests, rust.optimize_tests); set(&mut config.codegen_tests, rust.codegen_tests); set(&mut config.rust_rpath, rust.rpath); - set(&mut config.jemalloc, rust.jemalloc); + set(&mut config.mimalloc, rust.mimalloc); set(&mut config.test_compare_mode, rust.test_compare_mode); config.llvm_libunwind = rust .llvm_libunwind diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 82462f9758e5c..268809a050e6a 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -677,8 +677,8 @@ impl Build { /// Gets the space-separated set of activated features for the compiler. fn rustc_features(&self) -> String { let mut features = String::new(); - if self.config.jemalloc { - features.push_str("jemalloc"); + if self.config.mimalloc { + features.push_str("mimalloc"); } if self.config.llvm_enabled() { features.push_str(" llvm"); diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index 1317c3f983975..972e0077b241c 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -536,8 +536,8 @@ impl Step for Rustdoc { // to build rustdoc. // let mut features = Vec::new(); - if builder.config.jemalloc { - features.push("jemalloc".to_string()); + if builder.config.mimalloc { + features.push("mimalloc".to_string()); } let cargo = prepare_tool_cargo( diff --git a/src/ci/docker/host-x86_64/disabled/dist-x86_64-haiku/Dockerfile b/src/ci/docker/host-x86_64/disabled/dist-x86_64-haiku/Dockerfile index 5ddd3f1803964..315f393a040e7 100644 --- a/src/ci/docker/host-x86_64/disabled/dist-x86_64-haiku/Dockerfile +++ b/src/ci/docker/host-x86_64/disabled/dist-x86_64-haiku/Dockerfile @@ -43,8 +43,7 @@ RUN sh /scripts/sccache.sh ENV HOST=x86_64-unknown-haiku ENV TARGET=target.$HOST -ENV RUST_CONFIGURE_ARGS --disable-jemalloc \ - --set=$TARGET.cc=x86_64-unknown-haiku-gcc \ +ENV RUST_CONFIGURE_ARGS --set=$TARGET.cc=x86_64-unknown-haiku-gcc \ --set=$TARGET.cxx=x86_64-unknown-haiku-g++ \ --set=$TARGET.llvm-config=/bin/llvm-config-haiku ENV SCRIPT python3 ../x.py dist --host=$HOST --target=$HOST diff --git a/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile index 2b4b78e81350d..499347116cf03 100644 --- a/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile @@ -110,7 +110,7 @@ ENV RUST_CONFIGURE_ARGS \ --set target.i686-unknown-linux-gnu.linker=clang \ --build=i686-unknown-linux-gnu \ --set llvm.ninja=false \ - --set rust.jemalloc + --set rust.mimalloc ENV SCRIPT python3 ../x.py dist --build $HOSTS --host $HOSTS --target $HOSTS ENV CARGO_TARGET_I686_UNKNOWN_LINUX_GNU_LINKER=clang diff --git a/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile index efc83c6ccab1f..e1fe7f4ab856f 100644 --- a/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile @@ -121,7 +121,7 @@ ENV RUST_CONFIGURE_ARGS \ --set target.x86_64-unknown-linux-gnu.ranlib=/rustroot/bin/llvm-ranlib \ --set llvm.thin-lto=true \ --set llvm.ninja=false \ - --set rust.jemalloc + --set rust.mimalloc ENV SCRIPT ../src/ci/pgo.sh python3 ../x.py dist \ --host $HOSTS --target $HOSTS \ --include-default-paths \ diff --git a/src/ci/github-actions/ci.yml b/src/ci/github-actions/ci.yml index 96af401369e94..11ae900be12db 100644 --- a/src/ci/github-actions/ci.yml +++ b/src/ci/github-actions/ci.yml @@ -453,7 +453,7 @@ jobs: - name: dist-x86_64-apple env: SCRIPT: ./x.py dist --exclude rust-docs --exclude extended && ./x.py dist --target=x86_64-apple-darwin rust-docs && ./x.py dist extended - RUST_CONFIGURE_ARGS: --host=x86_64-apple-darwin --target=x86_64-apple-darwin,aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim --enable-full-tools --enable-sanitizers --enable-profiler --set rust.jemalloc --set llvm.ninja=false + RUST_CONFIGURE_ARGS: --host=x86_64-apple-darwin --target=x86_64-apple-darwin,aarch64-apple-ios,x86_64-apple-ios,aarch64-apple-ios-sim --enable-full-tools --enable-sanitizers --enable-profiler --set rust.mimalloc --set llvm.ninja=false RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 MACOSX_DEPLOYMENT_TARGET: 10.7 NO_LLVM_ASSERTIONS: 1 @@ -465,7 +465,7 @@ jobs: - name: dist-x86_64-apple-alt env: SCRIPT: ./x.py dist - RUST_CONFIGURE_ARGS: --enable-extended --enable-profiler --set rust.jemalloc --set llvm.ninja=false + RUST_CONFIGURE_ARGS: --enable-extended --enable-profiler --set rust.mimalloc --set llvm.ninja=false RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 MACOSX_DEPLOYMENT_TARGET: 10.7 NO_LLVM_ASSERTIONS: 1 @@ -476,7 +476,7 @@ jobs: - name: x86_64-apple env: SCRIPT: ./x.py --stage 2 test - RUST_CONFIGURE_ARGS: --build=x86_64-apple-darwin --enable-sanitizers --enable-profiler --set rust.jemalloc --set llvm.ninja=false + RUST_CONFIGURE_ARGS: --build=x86_64-apple-darwin --enable-sanitizers --enable-profiler --set rust.mimalloc --set llvm.ninja=false RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 MACOSX_DEPLOYMENT_TARGET: 10.8 MACOSX_STD_DEPLOYMENT_TARGET: 10.7 @@ -496,7 +496,7 @@ jobs: --enable-full-tools --enable-sanitizers --enable-profiler - --set rust.jemalloc + --set rust.mimalloc --set llvm.ninja=false RUSTC_RETRY_LINKER_ON_SEGFAULT: 1 USE_XCODE_CLANG: 1 @@ -506,14 +506,6 @@ jobs: NO_DEBUG_ASSERTIONS: 1 NO_OVERFLOW_CHECKS: 1 DIST_REQUIRE_ALL_TOOLS: 1 - # Corresponds to 16K page size - # - # Shouldn't be needed if jemalloc-sys is updated to - # handle this platform like iOS or if we build on - # aarch64-apple-darwin itself. - # - # https://github.com/gnzlbg/jemallocator/blob/c27a859e98e3cb790dc269773d9da71a1e918458/jemalloc-sys/build.rs#L237 - JEMALLOC_SYS_WITH_LG_PAGE: 14 <<: *job-macos-xl ###################### diff --git a/src/librustdoc/Cargo.toml b/src/librustdoc/Cargo.toml index 3c9b6f5006d59..898736ddafe93 100644 --- a/src/librustdoc/Cargo.toml +++ b/src/librustdoc/Cargo.toml @@ -31,7 +31,7 @@ features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] expect-test = "1.0" [features] -jemalloc = [] +mimalloc = [] [package.metadata.rust-analyzer] rustc_private = true diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 95de28e0c5b26..b50ac06c8f0a4 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -64,11 +64,11 @@ extern crate rustc_typeck; extern crate test; // See docs in https://github.com/rust-lang/rust/blob/master/compiler/rustc/src/main.rs -// about jemalloc. -#[cfg(feature = "jemalloc")] -extern crate tikv_jemalloc_sys; -#[cfg(feature = "jemalloc")] -use tikv_jemalloc_sys as jemalloc_sys; +// about mimalloc. +#[cfg(feature = "mimalloc")] +extern crate libmimalloc_sys; +#[cfg(feature = "mimalloc")] +use libmimalloc_sys as mimalloc_sys; use std::default::Default; use std::env; @@ -125,33 +125,35 @@ mod visit_lib; pub fn main() { // See docs in https://github.com/rust-lang/rust/blob/master/compiler/rustc/src/main.rs - // about jemalloc. - #[cfg(feature = "jemalloc")] + // about mimalloc. + #[cfg(feature = "mimalloc")] { use std::os::raw::{c_int, c_void}; #[used] - static _F1: unsafe extern "C" fn(usize, usize) -> *mut c_void = jemalloc_sys::calloc; + static _F1: unsafe extern "C" fn(usize, usize) -> *mut c_void = mimalloc_sys::mi_calloc; #[used] static _F2: unsafe extern "C" fn(*mut *mut c_void, usize, usize) -> c_int = - jemalloc_sys::posix_memalign; + mimalloc_sys::mi_posix_memalign; #[used] - static _F3: unsafe extern "C" fn(usize, usize) -> *mut c_void = jemalloc_sys::aligned_alloc; + static _F3: unsafe extern "C" fn(usize, usize) -> *mut c_void = + mimalloc_sys::mi_aligned_alloc; #[used] - static _F4: unsafe extern "C" fn(usize) -> *mut c_void = jemalloc_sys::malloc; + static _F4: unsafe extern "C" fn(usize) -> *mut c_void = mimalloc_sys::mi_malloc; #[used] - static _F5: unsafe extern "C" fn(*mut c_void, usize) -> *mut c_void = jemalloc_sys::realloc; + static _F5: unsafe extern "C" fn(*mut c_void, usize) -> *mut c_void = + mimalloc_sys::mi_realloc; #[used] - static _F6: unsafe extern "C" fn(*mut c_void) = jemalloc_sys::free; + static _F6: unsafe extern "C" fn(*mut c_void) = mimalloc_sys::mi_free; #[cfg(target_os = "macos")] { extern "C" { - fn _rjem_je_zone_register(); + fn _mi_macos_override_malloc(); } #[used] - static _F7: unsafe extern "C" fn() = _rjem_je_zone_register; + static _F7: unsafe extern "C" fn() = _mi_macos_override_malloc; } } diff --git a/src/tools/rustdoc/Cargo.toml b/src/tools/rustdoc/Cargo.toml index c4101f72cc2da..b515037d8938d 100644 --- a/src/tools/rustdoc/Cargo.toml +++ b/src/tools/rustdoc/Cargo.toml @@ -14,4 +14,4 @@ path = "main.rs" rustdoc = { path = "../../librustdoc" } [features] -jemalloc = ['rustdoc/jemalloc'] +mimalloc = ['rustdoc/mimalloc']