Skip to content

Commit 339c116

Browse files
committed
gc: backport basic arm64 support for Darwin
ivmai/bdwgc@d5d091a ivmai/bdwgc@0a8d467 See: #107
1 parent 64c3a9c commit 339c116

File tree

4 files changed

+84
-10
lines changed

4 files changed

+84
-10
lines changed

iv/lv5/third_party/gc/darwin_stop_world.c

+40
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,46 @@ STATIC ptr_t GC_stack_range_for(ptr_t *phi, thread_act_t thread, GC_thread p,
248248
/* GC_push_one(state.__pc); */
249249
GC_push_one(state.__cpsr);
250250

251+
# elif defined(AARCH64)
252+
lo = (void *)state.__sp;
253+
# ifndef DARWIN_DONT_PARSE_STACK
254+
*phi = GC_FindTopOfStack(state.__sp);
255+
# endif
256+
GC_push_one(state.__x[0]);
257+
GC_push_one(state.__x[1]);
258+
GC_push_one(state.__x[2]);
259+
GC_push_one(state.__x[3]);
260+
GC_push_one(state.__x[4]);
261+
GC_push_one(state.__x[5]);
262+
GC_push_one(state.__x[6]);
263+
GC_push_one(state.__x[7]);
264+
GC_push_one(state.__x[8]);
265+
GC_push_one(state.__x[9]);
266+
GC_push_one(state.__x[10]);
267+
GC_push_one(state.__x[11]);
268+
GC_push_one(state.__x[12]);
269+
GC_push_one(state.__x[13]);
270+
GC_push_one(state.__x[14]);
271+
GC_push_one(state.__x[15]);
272+
GC_push_one(state.__x[16]);
273+
GC_push_one(state.__x[17]);
274+
GC_push_one(state.__x[18]);
275+
GC_push_one(state.__x[19]);
276+
GC_push_one(state.__x[20]);
277+
GC_push_one(state.__x[21]);
278+
GC_push_one(state.__x[22]);
279+
GC_push_one(state.__x[23]);
280+
GC_push_one(state.__x[24]);
281+
GC_push_one(state.__x[25]);
282+
GC_push_one(state.__x[26]);
283+
GC_push_one(state.__x[27]);
284+
GC_push_one(state.__x[28]);
285+
GC_push_one(state.__fp);
286+
GC_push_one(state.__lr);
287+
/* GC_push_one(state.__sp); */
288+
/* GC_push_one(state.__pc); */
289+
/* GC_push_one(state.__cpsr); */
290+
251291
# else
252292
# error FIXME for non-x86 || ppc || arm architectures
253293
# endif

iv/lv5/third_party/gc/include/private/gc_priv.h

+11-9
Original file line numberDiff line numberDiff line change
@@ -587,16 +587,18 @@ GC_EXTERN GC_warn_proc GC_current_warn_proc;
587587
# define GC_MACH_THREAD_STATE x86_THREAD_STATE64
588588
# define GC_MACH_THREAD_STATE_COUNT x86_THREAD_STATE64_COUNT
589589
# endif
590-
# else
591-
# if defined(ARM32)
592-
# define GC_THREAD_STATE_T arm_thread_state_t
593-
# ifdef ARM_MACHINE_THREAD_STATE_COUNT
594-
# define GC_MACH_THREAD_STATE ARM_MACHINE_THREAD_STATE
595-
# define GC_MACH_THREAD_STATE_COUNT ARM_MACHINE_THREAD_STATE_COUNT
596-
# endif
597-
# else
598-
# error define GC_THREAD_STATE_T
590+
# elif defined(ARM32)
591+
# define GC_THREAD_STATE_T arm_thread_state_t
592+
# ifdef ARM_MACHINE_THREAD_STATE_COUNT
593+
# define GC_MACH_THREAD_STATE ARM_MACHINE_THREAD_STATE
594+
# define GC_MACH_THREAD_STATE_COUNT ARM_MACHINE_THREAD_STATE_COUNT
599595
# endif
596+
# elif defined(AARCH64)
597+
# define GC_THREAD_STATE_T arm_thread_state64_t
598+
# define GC_MACH_THREAD_STATE ARM_THREAD_STATE64
599+
# define GC_MACH_THREAD_STATE_COUNT ARM_THREAD_STATE64_COUNT
600+
# else
601+
# error define GC_THREAD_STATE_T
600602
# endif
601603
# ifndef GC_MACH_THREAD_STATE
602604
# define GC_MACH_THREAD_STATE MACHINE_THREAD_STATE

iv/lv5/third_party/gc/include/private/gcconfig.h

+28-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
# endif
9898
# if defined(__aarch64__)
9999
# define AARCH64
100-
# if !defined(LINUX)
100+
# if !defined(LINUX) && !defined(DARWIN)
101101
# define NOSYS
102102
# define mach_type_known
103103
# endif
@@ -368,6 +368,10 @@
368368
# define ARM32
369369
# define mach_type_known
370370
# define DARWIN_DONT_PARSE_STACK
371+
# elif defined(__aarch64__)
372+
# define AARCH64
373+
# define mach_type_known
374+
# define DARWIN_DONT_PARSE_STACK
371375
# endif
372376
# endif
373377
# if defined(__rtems__) && (defined(i386) || defined(__i386__))
@@ -1998,6 +2002,29 @@
19982002
extern char _end[];
19992003
# define DATAEND ((ptr_t)(&_end))
20002004
# endif
2005+
# ifdef DARWIN
2006+
/* iOS */
2007+
# define OS_TYPE "DARWIN"
2008+
# ifndef GC_DONT_REGISTER_MAIN_STATIC_DATA
2009+
# define DYNAMIC_LOADING
2010+
# endif
2011+
# define DATASTART ((ptr_t) get_etext())
2012+
# define DATAEND ((ptr_t) get_end())
2013+
# define STACKBOTTOM ((ptr_t) 0x16fdfffff)
2014+
# ifndef USE_MMAP
2015+
# define USE_MMAP
2016+
# endif
2017+
# define USE_MMAP_ANON
2018+
# define MPROTECT_VDB
2019+
# include <unistd.h>
2020+
# define GETPAGESIZE() getpagesize()
2021+
/* FIXME: There seems to be some issues with trylock hanging on */
2022+
/* darwin. This should be looked into some more. */
2023+
# define NO_PTHREAD_TRYLOCK
2024+
# ifndef NO_DYLD_BIND_FULLY_IMAGE
2025+
# define NO_DYLD_BIND_FULLY_IMAGE
2026+
# endif
2027+
# endif
20012028
# ifdef NOSYS
20022029
/* __data_start is usually defined in the target linker script. */
20032030
extern int __data_start[];

iv/lv5/third_party/gc/os_dep.c

+5
Original file line numberDiff line numberDiff line change
@@ -4274,6 +4274,11 @@ STATIC kern_return_t GC_forward_exception(mach_port_t thread, mach_port_t task,
42744274
# define DARWIN_EXC_STATE_COUNT ARM_EXCEPTION_STATE_COUNT
42754275
# define DARWIN_EXC_STATE_T arm_exception_state_t
42764276
# define DARWIN_EXC_STATE_DAR THREAD_FLD(far)
4277+
#elif defined(AARCH64)
4278+
# define DARWIN_EXC_STATE ARM_EXCEPTION_STATE64
4279+
# define DARWIN_EXC_STATE_COUNT ARM_EXCEPTION_STATE64_COUNT
4280+
# define DARWIN_EXC_STATE_T arm_exception_state64_t
4281+
# define DARWIN_EXC_STATE_DAR THREAD_FLD(far)
42774282
#elif defined(POWERPC)
42784283
# if CPP_WORDSZ == 32
42794284
# define DARWIN_EXC_STATE PPC_EXCEPTION_STATE

0 commit comments

Comments
 (0)