about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2019-01-02 13:23:45 -0800
committerAlex Crichton <alex@alexcrichton.com>2019-01-03 13:52:36 -0800
commitccbf28eae8b345db3ede51112cc32c756a084bd9 (patch)
tree5f48795503b2ea4984b18347bfd9af701f9f3671
parenta36b960df626cbb8bea74f01243318b73f0bd201 (diff)
downloadrust-ccbf28eae8b345db3ede51112cc32c756a084bd9.tar.gz
rust-ccbf28eae8b345db3ede51112cc32c756a084bd9.zip
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()
 }