Rollup merge of #57803 - jethrogb:jb/sgx-unwind-version, r=alexcrichton

Several changes to libunwind for SGX target

Two fixes:
* #34978 bites again!
* __rust_alloc are actually private symbols. Add new public versions. Also, these ones are `extern "C"`.

Upstream changes (https://github.com/fortanix/llvm-project/pull/2, https://github.com/fortanix/llvm-project/pull/3):
* b7357de Avoid too new relocation types being emitted
* 0feefe5 Use new symbol names to call Rust allocator

Fixes https://github.com/fortanix/rust-sgx/issues/65
This commit is contained in:
Mazdak Farrokhzad 2019-01-24 18:25:44 +01:00 committed by GitHub
commit bea83213f3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 1 deletions

View file

@ -32,7 +32,7 @@ RUN /tmp/build-solaris-toolchain.sh sparcv9 sparcv9 solaris-sparc
COPY dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh /tmp/ COPY dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh /tmp/
# We pass the commit id of the port of LLVM's libunwind to the build script. # We pass the commit id of the port of LLVM's libunwind to the build script.
# Any update to the commit id here, should cause the container image to be re-built from this point on. # Any update to the commit id here, should cause the container image to be re-built from this point on.
RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh "bbe23902411be88d7388f381becefadd6e3ef819" RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh "13fad13f8ea83a8da58d04a5faa45943151b3398"
COPY scripts/sccache.sh /scripts/ COPY scripts/sccache.sh /scripts/
RUN sh /scripts/sccache.sh RUN sh /scripts/sccache.sh

View file

@ -1,3 +1,4 @@
use alloc::{self, Layout};
use num::NonZeroUsize; use num::NonZeroUsize;
use slice; use slice;
use str; use str;
@ -147,6 +148,7 @@ impl RWLock {
self.__write_unlock(rguard, wguard); self.__write_unlock(rguard, wguard);
} }
// only used by __rust_rwlock_unlock below
#[inline] #[inline]
unsafe fn unlock(&self) { unsafe fn unlock(&self) {
let rguard = self.readers.lock(); let rguard = self.readers.lock();
@ -164,6 +166,7 @@ impl RWLock {
const EINVAL: i32 = 22; const EINVAL: i32 = 22;
// used by libunwind port
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn __rust_rwlock_rdlock(p: *mut RWLock) -> i32 { pub unsafe extern "C" fn __rust_rwlock_rdlock(p: *mut RWLock) -> i32 {
if p.is_null() { if p.is_null() {
@ -190,6 +193,8 @@ pub unsafe extern "C" fn __rust_rwlock_unlock(p: *mut RWLock) -> i32 {
return 0; 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.
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn __rust_print_err(m: *mut u8, s: i32) { pub unsafe extern "C" fn __rust_print_err(m: *mut u8, s: i32) {
if s < 0 { if s < 0 {
@ -206,6 +211,16 @@ pub unsafe extern "C" fn __rust_abort() {
::sys::abort_internal(); ::sys::abort_internal();
} }
#[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))
}
#[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)] #[cfg(test)]
mod tests { mod tests {