Skip to content

Commit

Permalink
Force the allocator to be looked up from the perspective of the rustc…
Browse files Browse the repository at this point in the history
… binary

Fixes rust-lang#1303
  • Loading branch information
bjorn3 committed Feb 7, 2023
1 parent 8494882 commit 7d53619
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 5 deletions.
5 changes: 3 additions & 2 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ jobs:
fail-fast: false
matrix:
include:
- os: ubuntu-20.04 # FIXME switch to ubuntu-22.04 once #1303 is fixed
- os: ubuntu-latest
env:
TARGET_TRIPLE: x86_64-unknown-linux-gnu
- os: macos-latest
Expand Down Expand Up @@ -226,7 +226,8 @@ jobs:
fail-fast: false
matrix:
include:
- os: ubuntu-20.04 # FIXME switch to ubuntu-22.04 once #1303 is fixed
# FIXME update at some point in the future once most distros use a newer glibc
- os: ubuntu-20.04
env:
TARGET_TRIPLE: x86_64-unknown-linux-gnu
- os: macos-latest
Expand Down
38 changes: 35 additions & 3 deletions src/compiler_builtins.rs
Original file line number Diff line number Diff line change
@@ -1,14 +1,33 @@
#[cfg(all(unix, feature = "jit"))]
use std::ffi::c_int;
#[cfg(feature = "jit")]
use std::ffi::c_void;

// FIXME replace with core::ffi::c_size_t once stablized
#[allow(non_camel_case_types)]
#[cfg(feature = "jit")]
type size_t = usize;

macro_rules! builtin_functions {
($register:ident; $(fn $name:ident($($arg_name:ident: $arg_ty:ty),*) -> $ret_ty:ty;)*) => {
(
$register:ident;
$(
$(#[$attr:meta])?
fn $name:ident($($arg_name:ident: $arg_ty:ty),*) -> $ret_ty:ty;
)*
) => {
#[cfg(feature = "jit")]
#[allow(improper_ctypes)]
extern "C" {
$(fn $name($($arg_name: $arg_ty),*) -> $ret_ty;)*
$(
$(#[$attr])?
fn $name($($arg_name: $arg_ty),*) -> $ret_ty;
)*
}

#[cfg(feature = "jit")]
pub(crate) fn $register(builder: &mut cranelift_jit::JITBuilder) {
for (name, val) in [$((stringify!($name), $name as *const u8)),*] {
for (name, val) in [$($(#[$attr])? (stringify!($name), $name as *const u8)),*] {
builder.symbol(name, val);
}
}
Expand Down Expand Up @@ -40,4 +59,17 @@ builtin_functions! {
fn __fixdfti(f: f64) -> i128;
fn __fixunssfti(f: f32) -> u128;
fn __fixunsdfti(f: f64) -> u128;

// allocator
// NOTE: These need to be mentioned here despite not being part of compiler_builtins because
// newer glibc resolve dlsym("malloc") to libc.so despite the override in the rustc binary to
// use jemalloc. Libraries opened with dlopen still get the jemalloc version, causing multiple
// allocators to be mixed, resulting in a crash.
fn calloc(nobj: size_t, size: size_t) -> *mut c_void;
#[cfg(unix)]
fn posix_memalign(memptr: *mut *mut c_void, align: size_t, size: size_t) -> c_int;
fn malloc(size: size_t) -> *mut c_void;
fn realloc(p: *mut c_void, size: size_t) -> *mut c_void;
fn free(p: *mut c_void) -> ();

}

0 comments on commit 7d53619

Please sign in to comment.