Rollup merge of #59624 - jethrogb:jb/sgx-unwind-syms, r=alexcrichton
SGX target: Use linker option to avoid code CGU assignment kludge cc @VardhanThigle @faern
This commit is contained in:
commit
6c7ec18e33
@ -21,6 +21,15 @@ pub fn target() -> Result<Target, String> {
|
||||
"-Wl,--no-undefined-version",
|
||||
"-Wl,-Bsymbolic",
|
||||
"-Wl,--export-dynamic",
|
||||
// The following symbols are needed by libunwind, which is linked after
|
||||
// libstd. Make sure they're included in the link.
|
||||
"-Wl,-u,__rust_abort",
|
||||
"-Wl,-u,__rust_c_alloc",
|
||||
"-Wl,-u,__rust_c_dealloc",
|
||||
"-Wl,-u,__rust_print_err",
|
||||
"-Wl,-u,__rust_rwlock_rdlock",
|
||||
"-Wl,-u,__rust_rwlock_unlock",
|
||||
"-Wl,-u,__rust_rwlock_wrlock",
|
||||
];
|
||||
|
||||
const EXPORT_SYMBOLS: &[&str] = &[
|
||||
|
@ -1,4 +1,4 @@
|
||||
use crate::alloc::{GlobalAlloc, Layout, System};
|
||||
use crate::alloc::{self, GlobalAlloc, Layout, System};
|
||||
|
||||
use super::waitqueue::SpinMutex;
|
||||
|
||||
@ -30,3 +30,17 @@ unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut
|
||||
DLMALLOC.lock().realloc(ptr, layout.size(), layout.align(), new_size)
|
||||
}
|
||||
}
|
||||
|
||||
// The following functions are needed by libunwind. These symbols are named
|
||||
// in pre-link args for the target specification, so keep that in sync.
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __rust_c_alloc(size: usize, align: usize) -> *mut u8 {
|
||||
alloc::alloc(Layout::from_size_align_unchecked(size, align))
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __rust_c_dealloc(ptr: *mut u8, size: usize, align: usize) {
|
||||
alloc::dealloc(ptr, Layout::from_size_align_unchecked(size, align))
|
||||
}
|
||||
|
@ -130,6 +130,15 @@ pub unsafe fn abort_internal() -> ! {
|
||||
abi::usercalls::exit(true)
|
||||
}
|
||||
|
||||
// This function is needed by the panic runtime. The symbol is named in
|
||||
// pre-link args for the target specification, so keep that in sync.
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
// NB. used by both libunwind and libpanic_abort
|
||||
pub unsafe extern "C" fn __rust_abort() {
|
||||
abort_internal();
|
||||
}
|
||||
|
||||
pub fn hashmap_random_keys() -> (u64, u64) {
|
||||
fn rdrand64() -> u64 {
|
||||
unsafe {
|
||||
|
@ -1,10 +1,4 @@
|
||||
#[cfg(not(test))]
|
||||
use crate::alloc::{self, Layout};
|
||||
use crate::num::NonZeroUsize;
|
||||
#[cfg(not(test))]
|
||||
use crate::slice;
|
||||
#[cfg(not(test))]
|
||||
use crate::str;
|
||||
|
||||
use super::waitqueue::{
|
||||
try_lock_or_false, NotifiedTcs, SpinMutex, SpinMutexGuard, WaitQueue, WaitVariable,
|
||||
@ -165,10 +159,11 @@ unsafe fn unlock(&self) {
|
||||
pub unsafe fn destroy(&self) {}
|
||||
}
|
||||
|
||||
// The following functions are needed by libunwind. These symbols are named
|
||||
// in pre-link args for the target specification, so keep that in sync.
|
||||
#[cfg(not(test))]
|
||||
const EINVAL: i32 = 22;
|
||||
|
||||
// used by libunwind port
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __rust_rwlock_rdlock(p: *mut RWLock) -> i32 {
|
||||
@ -198,39 +193,6 @@ pub unsafe fn destroy(&self) {}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// the following functions are also used by the libunwind port. They're
|
||||
// included here to make sure parallel codegen and LTO don't mess things up.
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __rust_print_err(m: *mut u8, s: i32) {
|
||||
if s < 0 {
|
||||
return;
|
||||
}
|
||||
let buf = slice::from_raw_parts(m as *const u8, s as _);
|
||||
if let Ok(s) = str::from_utf8(&buf[..buf.iter().position(|&b| b == 0).unwrap_or(buf.len())]) {
|
||||
eprint!("{}", s);
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
// NB. used by both libunwind and libpanic_abort
|
||||
pub unsafe extern "C" fn __rust_abort() {
|
||||
crate::sys::abort_internal();
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __rust_c_alloc(size: usize, align: usize) -> *mut u8 {
|
||||
alloc::alloc(Layout::from_size_align_unchecked(size, align))
|
||||
}
|
||||
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __rust_c_dealloc(ptr: *mut u8, size: usize, align: usize) {
|
||||
alloc::dealloc(ptr, Layout::from_size_align_unchecked(size, align))
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
@ -2,6 +2,10 @@
|
||||
|
||||
use crate::io;
|
||||
use crate::sys::fd::FileDesc;
|
||||
#[cfg(not(test))]
|
||||
use crate::slice;
|
||||
#[cfg(not(test))]
|
||||
use crate::str;
|
||||
|
||||
pub struct Stdin(());
|
||||
pub struct Stdout(());
|
||||
@ -62,3 +66,17 @@ pub fn is_ebadf(err: &io::Error) -> bool {
|
||||
pub fn panic_output() -> Option<impl io::Write> {
|
||||
super::abi::panic::SgxPanicOutput::new()
|
||||
}
|
||||
|
||||
// This function is needed by libunwind. The symbol is named in pre-link args
|
||||
// for the target specification, so keep that in sync.
|
||||
#[cfg(not(test))]
|
||||
#[no_mangle]
|
||||
pub unsafe extern "C" fn __rust_print_err(m: *mut u8, s: i32) {
|
||||
if s < 0 {
|
||||
return;
|
||||
}
|
||||
let buf = slice::from_raw_parts(m as *const u8, s as _);
|
||||
if let Ok(s) = str::from_utf8(&buf[..buf.iter().position(|&b| b == 0).unwrap_or(buf.len())]) {
|
||||
eprint!("{}", s);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user