mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-01-15 05:43:19 -08:00
Ported the Boehm-Weiser garbage collector to the ARM+DARWIN combination (R. Krishnan)
This commit is contained in:
parent
6be0eb88fc
commit
5cc562f25e
3 changed files with 104 additions and 11 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue