about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-01-06 07:48:16 +0000
committerbors <bors@rust-lang.org>2019-01-06 07:48:16 +0000
commitaf2c159cc38f251a8e7d43cf1f98806392fbddcf (patch)
treed0ab985b404fca1a578b0bed5ccdfde5c9d11266
parent2d7c8e981dc3ce2c4b31489b39dd2abbbad6bfff (diff)
parentccbf28eae8b345db3ede51112cc32c756a084bd9 (diff)
downloadrust-af2c159cc38f251a8e7d43cf1f98806392fbddcf.tar.gz
rust-af2c159cc38f251a8e7d43cf1f98806392fbddcf.zip
Auto merge of #57287 - alexcrichton:fix-jemalloc, r=nikomatsakis
rustc: Fix regression where jemalloc isn't used

In #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 #57115
-rw-r--r--src/rustc/Cargo.toml1
-rw-r--r--src/rustc/rustc.rs41
2 files changed, 32 insertions, 10 deletions
diff --git a/src/rustc/Cargo.toml b/src/rustc/Cargo.toml
index 164a3c6ad0d..e601a1f8237 100644
--- a/src/rustc/Cargo.toml
+++ b/src/rustc/Cargo.toml
@@ -2,6 +2,7 @@
 authors = ["The Rust Project Developers"]
 name = "rustc-main"
 version = "0.0.0"
+edition = '2018'
 
 [[bin]]
 name = "rustc_binary"
diff --git a/src/rustc/rustc.rs b/src/rustc/rustc.rs
index a0ef572933c..fef6b830040 100644
--- a/src/rustc/rustc.rs
+++ b/src/rustc/rustc.rs
@@ -1,4 +1,3 @@
-#![feature(rustc_private)]
 #![feature(link_args)]
 
 // Set the stack size at link time on Windows. See rustc_driver::in_rustc_thread
@@ -11,17 +10,39 @@
 // Also, don't forget to set this for rustdoc.
 extern {}
 
-extern crate rustc_driver;
+fn main() {
+    // Pull in jemalloc when enabled.
+    //
+    // Note that we're pulling in a static copy of jemalloc which means that to
+    // pull it in 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. That means to pull in jemalloc we need to actually
+    // reference allocation symbols one way or another (as this file is the only
+    // object code in the rustc executable).
+    #[cfg(feature = "jemalloc-sys")]
+    {
+        use std::os::raw::{c_void, c_int};
 
-// Note that the linkage here should be all that we need, on Linux we're not
-// prefixing the symbols here so this should naturally override our default
-// allocator. On OSX it should override via the zone allocator. We shouldn't
-// enable this by default on other platforms, so other platforms aren't handled
-// here yet.
-#[cfg(feature = "jemalloc-sys")]
-extern crate jemalloc_sys;
+        #[used]
+        static _F1: unsafe extern fn(usize, usize) -> *mut c_void =
+            jemalloc_sys::calloc;
+        #[used]
+        static _F2: unsafe extern fn(*mut *mut c_void, usize, usize) -> c_int =
+            jemalloc_sys::posix_memalign;
+        #[used]
+        static _F3: unsafe extern fn(usize, usize) -> *mut c_void =
+            jemalloc_sys::aligned_alloc;
+        #[used]
+        static _F4: unsafe extern fn(usize) -> *mut c_void =
+            jemalloc_sys::malloc;
+        #[used]
+        static _F5: unsafe extern fn(*mut c_void, usize) -> *mut c_void =
+            jemalloc_sys::realloc;
+        #[used]
+        static _F6: unsafe extern fn(*mut c_void) =
+            jemalloc_sys::free;
+    }
 
-fn main() {
     rustc_driver::set_sigpipe_handler();
     rustc_driver::main()
 }