From 5cc562f25e17b9d496097cf74be3bc05e5ee3846 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sun, 30 Jan 2011 19:14:41 +0100 Subject: [PATCH] Ported the Boehm-Weiser garbage collector to the ARM+DARWIN combination (R. Krishnan) --- src/gc/darwin_stop_world.c | 52 ++++++++++++++++++++++++++++++ src/gc/include/private/gc_priv.h | 10 ++++-- src/gc/include/private/gcconfig.h | 53 ++++++++++++++++++++++++++----- 3 files changed, 104 insertions(+), 11 deletions(-) diff --git a/src/gc/darwin_stop_world.c b/src/gc/darwin_stop_world.c index 9d3d1e29a..550e7de74 100644 --- a/src/gc/darwin_stop_world.c +++ b/src/gc/darwin_stop_world.c @@ -174,6 +174,28 @@ void GC_push_all_stacks() GC_push_one(state . THREAD_FLD (r29)); GC_push_one(state . THREAD_FLD (r30)); GC_push_one(state . THREAD_FLD (r31)); + +# elif defined(ARM32) + lo = (void*)state.__sp; + + GC_push_one(state.__r[0]); + GC_push_one(state.__r[1]); + GC_push_one(state.__r[2]); + GC_push_one(state.__r[3]); + GC_push_one(state.__r[4]); + GC_push_one(state.__r[5]); + GC_push_one(state.__r[6]); + GC_push_one(state.__r[7]); + GC_push_one(state.__r[8]); + GC_push_one(state.__r[9]); + GC_push_one(state.__r[10]); + GC_push_one(state.__r[11]); + GC_push_one(state.__r[12]); + /* GC_push_one(state.__sp); */ + GC_push_one(state.__lr); + GC_push_one(state.__pc); + GC_push_one(state.__cpsr); + # else # error FIXME for non-x86 || ppc architectures # endif @@ -323,6 +345,36 @@ void GC_push_all_stacks() GC_push_one(info . THREAD_FLD (fs)); GC_push_one(info . THREAD_FLD (gs)); +# elif defined(ARM32) + GC_THREAD_STATE_T info; + mach_msg_type_number_t outCount = THREAD_STATE_MAX; + r = thread_get_state(thread, GC_MACH_THREAD_STATE, (natural_t *)&info, + &outCount); + if(r != KERN_SUCCESS) + ABORT("task_get_state failed"); + + hi = (ptr_t)FindTopOfStack(info . __sp); + + lo = (void*)info.__sp; + + GC_push_one(info.__r[0]); + GC_push_one(info.__r[1]); + GC_push_one(info.__r[2]); + GC_push_one(info.__r[3]); + GC_push_one(info.__r[4]); + GC_push_one(info.__r[5]); + GC_push_one(info.__r[6]); + GC_push_one(info.__r[7]); + GC_push_one(info.__r[8]); + GC_push_one(info.__r[9]); + GC_push_one(info.__r[10]); + GC_push_one(info.__r[11]); + GC_push_one(info.__r[12]); + /* GC_push_one(info.__sp); */ + GC_push_one(info.__lr); + GC_push_one(info.__pc); + GC_push_one(info.__cpsr); + # else # error FIXME for non-x86 || ppc architectures # endif diff --git a/src/gc/include/private/gc_priv.h b/src/gc/include/private/gc_priv.h index ef724a2b9..f5161272b 100644 --- a/src/gc/include/private/gc_priv.h +++ b/src/gc/include/private/gc_priv.h @@ -401,9 +401,13 @@ extern GC_warn_proc GC_current_warn_proc; # define GC_GETSECTBYNAME getsectbynamefromheader_64 # endif # else -# error define GC_THREAD_STATE_T -# define GC_MACH_THREAD_STATE MACHINE_THREAD_STATE -# define GC_MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT +# if defined(ARM32) +# define GC_THREAD_STATE_T arm_thread_state_t +# else +# error define GC_THREAD_STATE_T +# endif +# define GC_MACH_THREAD_STATE MACHINE_THREAD_STATE +# define GC_MACH_THREAD_STATE_COUNT MACHINE_THREAD_STATE_COUNT # endif /* Try to work out the right way to access thread state structure members. The structure has changed its definition in different Darwin versions. diff --git a/src/gc/include/private/gcconfig.h b/src/gc/include/private/gcconfig.h index a7128f148..73b3f81c9 100644 --- a/src/gc/include/private/gcconfig.h +++ b/src/gc/include/private/gcconfig.h @@ -61,10 +61,15 @@ # define FREEBSD # endif +/* And one for Darwin: */ +# if defined(macosx) || (defined(__APPLE__) && defined(__MACH__)) +# define DARWIN +# endif + /* Determine the machine type: */ # if defined(__arm__) || defined(__thumb__) # define ARM32 -# if !defined(LINUX) && !defined(NETBSD) +# if !defined(LINUX) && !defined(NETBSD) && !defined(DARWIN) # define NOSYS # define mach_type_known # endif @@ -290,8 +295,7 @@ # define MACOS # define mach_type_known # endif -# if defined(macosx) || (defined(__APPLE__) && defined(__MACH__)) -# define DARWIN +# if defined(DARWIN) # if defined(__ppc__) || defined(__ppc64__) # define POWERPC # define mach_type_known @@ -301,6 +305,10 @@ # elif defined(__i386__) # define I386 # define mach_type_known +# elif defined(__arm__) +# define ARM32 +# define mach_type_known +# define DARWIN_DONT_PARSE_STACK # endif # endif # if defined(NeXT) && defined(mc68000) @@ -755,7 +763,11 @@ # endif # ifdef DARWIN # define OS_TYPE "DARWIN" -# define DYNAMIC_LOADING +# if defined(TARGET_OS_IPHONE) +# undef DYNAMIC_LOADING +# else +# define DYNAMIC_LOADING +# endif # if defined(__ppc64__) # define ALIGNMENT 8 # define CPP_WORDSZ 64 @@ -772,8 +784,13 @@ These aren't used when dyld support is enabled (it is by default) */ # define DATASTART ((ptr_t) get_etext()) # define DATAEND ((ptr_t) get_end()) -# define USE_MMAP -# define USE_MMAP_ANON +# if defined(TARGET_OS_IPHONE) +# undef USE_MMAP +# undef USE_MMAP_ANON +# else +# define USE_MMAP +# define USE_MMAP_ANON +# endif # ifdef GC_DARWIN_THREADS # define MPROTECT_VDB # endif @@ -1282,7 +1299,11 @@ # ifdef DARWIN # define OS_TYPE "DARWIN" # define DARWIN_DONT_PARSE_STACK -# define DYNAMIC_LOADING +# if defined(TARGET_OS_IPHONE) +# undef DYNAMIC_LOADING +# else +# define DYNAMIC_LOADING +# endif /* XXX: see get_end(3), get_etext() and get_end() should not be used. These aren't used when dyld support is enabled (it is by default) */ # define DATASTART ((ptr_t) get_etext()) @@ -1771,6 +1792,18 @@ # define OS_TYPE "MSWINCE" # define DATAEND /* not needed */ # endif +# ifdef DARWIN + /* iPhone */ +# define OS_TYPE "DARWIN" +# define DATASTART ((ptr_t) get_etext()) +# define DATAEND ((ptr_t) get_end()) +/* #define STACKBOTTOM ((ptr_t) 0x30000000) */ /* FIXME: Is this needed? */ +# define HEURISTIC1 +# ifndef USE_MMAP +# define USE_MMAP +# endif +# define USE_MMAP_ANON +# endif # ifdef NOSYS /* __data_start is usually defined in the target linker script. */ extern int __data_start[]; @@ -1879,7 +1912,11 @@ # ifdef DARWIN # define OS_TYPE "DARWIN" # define DARWIN_DONT_PARSE_STACK -# define DYNAMIC_LOADING +# if defined(TARGET_OS_IPHONE) +# undef DYNAMIC_LOADING +# else +# define DYNAMIC_LOADING +# endif /* XXX: see get_end(3), get_etext() and get_end() should not be used. These aren't used when dyld support is enabled (it is by default) */ # define DATASTART ((ptr_t) get_etext())