~ chicken-core (chicken-5) 1127692f8ab51b07df99ea8b2024c6062ac2bdbb
commit 1127692f8ab51b07df99ea8b2024c6062ac2bdbb Author: Jim Ursetto <zbigniewsz@gmail.com> AuthorDate: Thu Jan 12 18:20:53 2012 -0600 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Sat Feb 18 13:18:54 2012 +0100 Make C_stack_pointer work with LLVM backend When using LLVM, allocating zero bytes on the stack is legal but is documented to return an undefined value. In practice, this is NULL if optimization is enabled, or alloca(1) if not. Work around this by using alloca(1) to get the stack pointer or, in supported environments, using inline asm. alloca(1) may waste a machine word, but does not always; also, llvm uses the stack more efficiently, so the effects tend to even out. diff --git a/chicken.h b/chicken.h index 2ced110b..fdf4b72c 100644 --- a/chicken.h +++ b/chicken.h @@ -940,7 +940,17 @@ extern double trunc(double); #define C_pick(n) (C_temporary_stack[ n ]) #define C_drop(n) (C_temporary_stack += (n)) #define C_alloc(n) ((C_word *)C_alloca((n) * sizeof(C_word))) -#define C_stack_pointer ((C_word *)C_alloca(0)) +#if defined (__llvm__) && defined (__GNUC__) +# if defined (__i386__) +# define C_stack_pointer ({C_word *sp; __asm__ __volatile__("movl %%esp,%0":"=r"(sp):);sp;}) +# elif defined (__x86_64__) +# define C_stack_pointer ({C_word *sp; __asm__ __volatile__("movq %%rsp,%0":"=r"(sp):);sp;}) +# else +# define C_stack_pointer ((C_word *)C_alloca(1)) +# endif +#else +# define C_stack_pointer ((C_word *)C_alloca(0)) +#endif #define C_stack_pointer_test ((C_word *)C_alloca(1)) #define C_demand_2(n) (((C_word *)C_fromspace_top + (n)) < (C_word *)C_fromspace_limit) #define C_fix(n) (((C_word)(n) << C_FIXNUM_SHIFT) | C_FIXNUM_BIT)Trap