1
Fork 0

openbsd: incoporate remarks

- consolidate target_record_sp_limit and target_get_sp_limit functions
  for aarch64, powerpc, arm-ios and openbsd as there are all without
  segmented stacks (no need to duplicate functions).

- rename __load_self function to rust_load_self

- use a mutex inner load_self() as underline implementation is not thread-safe
This commit is contained in:
Sébastien Marie 2015-01-30 08:15:28 +01:00
parent 3096784a3b
commit 568a451a90
3 changed files with 27 additions and 40 deletions

View file

@ -227,25 +227,15 @@ pub unsafe fn record_sp_limit(limit: uint) {
} }
// aarch64 - FIXME(AARCH64): missing... // aarch64 - FIXME(AARCH64): missing...
#[cfg(target_arch = "aarch64")]
unsafe fn target_record_sp_limit(_: uint) {
}
// powerpc - FIXME(POWERPC): missing... // powerpc - FIXME(POWERPC): missing...
#[cfg(target_arch = "powerpc")] // arm-ios - iOS segmented stack is disabled for now, see related notes
// openbsd - segmented stack is disabled
#[cfg(any(target_arch = "aarch64",
target_arch = "powerpc",
all(target_arch = "arm", target_os = "ios"),
target_os = "openbsd"))]
unsafe fn target_record_sp_limit(_: uint) { unsafe fn target_record_sp_limit(_: uint) {
} }
// iOS segmented stack is disabled for now, see related notes
#[cfg(all(target_arch = "arm", target_os = "ios"))] #[inline(always)]
unsafe fn target_record_sp_limit(_: uint) {
}
#[cfg(target_os = "openbsd")] #[inline(always)]
unsafe fn target_record_sp_limit(_: uint) {
// segmented stack is disabled
}
} }
/// The counterpart of the function above, this function will fetch the current /// The counterpart of the function above, this function will fetch the current
@ -332,28 +322,18 @@ pub unsafe fn get_sp_limit() -> uint {
} }
// aarch64 - FIXME(AARCH64): missing... // aarch64 - FIXME(AARCH64): missing...
#[cfg(target_arch = "aarch64")] // powerpc - FIXME(POWERPC): missing...
// arm-ios - iOS doesn't support segmented stacks yet.
// openbsd - OpenBSD doesn't support segmented stacks.
//
// This function might be called by runtime though
// so it is unsafe to unreachable, let's return a fixed constant.
#[cfg(any(target_arch = "aarch64",
target_arch = "powerpc",
all(target_arch = "arm", target_os = "ios"),
target_os = "openbsd"))]
#[inline(always)]
unsafe fn target_get_sp_limit() -> uint { unsafe fn target_get_sp_limit() -> uint {
1024 1024
} }
// powepc - FIXME(POWERPC): missing...
#[cfg(target_arch = "powerpc")]
unsafe fn target_get_sp_limit() -> uint {
1024
}
// iOS doesn't support segmented stacks yet. This function might
// be called by runtime though so it is unsafe to mark it as
// unreachable, let's return a fixed constant.
#[cfg(all(target_arch = "arm", target_os = "ios"))] #[inline(always)]
unsafe fn target_get_sp_limit() -> uint {
1024
}
#[cfg(target_os = "openbsd")] #[inline(always)]
unsafe fn target_get_sp_limit() -> uint {
// segmented stack is disabled
1024
}
} }

View file

@ -217,11 +217,18 @@ pub fn load_self() -> Option<Vec<u8>> {
#[cfg(target_os = "openbsd")] #[cfg(target_os = "openbsd")]
pub fn load_self() -> Option<Vec<u8>> { pub fn load_self() -> Option<Vec<u8>> {
use sync::{StaticMutex, MUTEX_INIT};
static LOCK: StaticMutex = MUTEX_INIT;
extern { extern {
fn __load_self() -> *const c_char; fn rust_load_self() -> *const c_char;
} }
let _guard = LOCK.lock();
unsafe { unsafe {
let v = __load_self(); let v = rust_load_self();
if v.is_null() { if v.is_null() {
None None
} else { } else {

View file

@ -204,7 +204,7 @@ int *__dfly_error(void) { return __error(); }
#include <sys/sysctl.h> #include <sys/sysctl.h>
#include <limits.h> #include <limits.h>
const char * __load_self() { const char * rust_load_self() {
static char *self = NULL; static char *self = NULL;
if (self == NULL) { if (self == NULL) {