Ported the Boehm-Weiser garbage collector to the ARM+DARWIN combination (R. Krishnan)

This commit is contained in:
Juan Jose Garcia Ripoll 2011-01-30 19:14:41 +01:00
parent 6be0eb88fc
commit 5cc562f25e
3 changed files with 104 additions and 11 deletions

View file

@ -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

View file

@ -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.

View file

@ -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())