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...
#[cfg(target_arch = "aarch64")]
unsafe fn target_record_sp_limit(_: uint) {
}
// 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) {
}
// 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
@ -332,28 +322,18 @@ pub unsafe fn get_sp_limit() -> uint {
}
// 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 {
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")]
pub fn load_self() -> Option<Vec<u8>> {
use sync::{StaticMutex, MUTEX_INIT};
static LOCK: StaticMutex = MUTEX_INIT;
extern {
fn __load_self() -> *const c_char;
fn rust_load_self() -> *const c_char;
}
let _guard = LOCK.lock();
unsafe {
let v = __load_self();
let v = rust_load_self();
if v.is_null() {
None
} else {

View File

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