Skip to content

Commit ccbf28e

Browse files
committed
rustc: Fix regression where jemalloc isn't used
In rust-lang#56986 the linkage of jemalloc to the compiler was switched from the driver library to the rustc binary to ensure that only rustc itself uses jemalloc. In doing so, however, it turns out jemalloc wasn't actually linked in at all! None of the symbols were referenced so the static library wasn't used. This means that jemalloc wasn't pulled in at all. This commit performs a bit of a dance to reference jemalloc symbols, attempting to pull it in despite LLVM's optimizations. Closes rust-lang#57115
1 parent a36b960 commit ccbf28e

File tree

2 files changed

+32
-10
lines changed

2 files changed

+32
-10
lines changed

src/rustc/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
authors = ["The Rust Project Developers"]
33
name = "rustc-main"
44
version = "0.0.0"
5+
edition = '2018'
56

67
[[bin]]
78
name = "rustc_binary"

src/rustc/rustc.rs

+31-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#![feature(rustc_private)]
21
#![feature(link_args)]
32

43
// Set the stack size at link time on Windows. See rustc_driver::in_rustc_thread
@@ -11,17 +10,39 @@
1110
// Also, don't forget to set this for rustdoc.
1211
extern {}
1312

14-
extern crate rustc_driver;
13+
fn main() {
14+
// Pull in jemalloc when enabled.
15+
//
16+
// Note that we're pulling in a static copy of jemalloc which means that to
17+
// pull it in we need to actually reference its symbols for it to get
18+
// linked. The two crates we link to here, std and rustc_driver, are both
19+
// dynamic libraries. That means to pull in jemalloc we need to actually
20+
// reference allocation symbols one way or another (as this file is the only
21+
// object code in the rustc executable).
22+
#[cfg(feature = "jemalloc-sys")]
23+
{
24+
use std::os::raw::{c_void, c_int};
1525

16-
// Note that the linkage here should be all that we need, on Linux we're not
17-
// prefixing the symbols here so this should naturally override our default
18-
// allocator. On OSX it should override via the zone allocator. We shouldn't
19-
// enable this by default on other platforms, so other platforms aren't handled
20-
// here yet.
21-
#[cfg(feature = "jemalloc-sys")]
22-
extern crate jemalloc_sys;
26+
#[used]
27+
static _F1: unsafe extern fn(usize, usize) -> *mut c_void =
28+
jemalloc_sys::calloc;
29+
#[used]
30+
static _F2: unsafe extern fn(*mut *mut c_void, usize, usize) -> c_int =
31+
jemalloc_sys::posix_memalign;
32+
#[used]
33+
static _F3: unsafe extern fn(usize, usize) -> *mut c_void =
34+
jemalloc_sys::aligned_alloc;
35+
#[used]
36+
static _F4: unsafe extern fn(usize) -> *mut c_void =
37+
jemalloc_sys::malloc;
38+
#[used]
39+
static _F5: unsafe extern fn(*mut c_void, usize) -> *mut c_void =
40+
jemalloc_sys::realloc;
41+
#[used]
42+
static _F6: unsafe extern fn(*mut c_void) =
43+
jemalloc_sys::free;
44+
}
2345

24-
fn main() {
2546
rustc_driver::set_sigpipe_handler();
2647
rustc_driver::main()
2748
}

0 commit comments

Comments
 (0)