(define sizeof-ycl_ctx (foreign-value "sizeof(struct ycl_ctx)" size_t)) (define-record ycl-ctx buffer) (define-foreign-type ycl-ctx scheme-pointer ycl-ctx-buffer) (define ycl-error (lambda (ctx) ((foreign-lambda (const c-string) "ycl_strerror" ycl-ctx) ctx))) ;; an ycl-ctx is allocated with: (make-ycl-ctx (make-blob sizeof-ycl_ctx)) ;; later and passed around a bit until passed to ycl-error #define C_SPECIAL_BITS 0x0000000e #define C_SCHEME_UNDEFINED ((C_word)(C_SPECIAL_BITS | 0x00000010)) stub35(C_SCHEME_UNDEFINED,t2); frame #0: ycl.so`stub35(C_buf=30, C_a0=140737488346112) at ycl.c:42 39 C_regparm static C_word C_fcall stub35(C_word C_buf,C_word C_a0){ 40 C_word C_r=C_SCHEME_UNDEFINED,*C_a=(C_word*)C_buf; 41 void * t0=(void * )C_data_pointer_or_null(C_a0); -> 42 C_r=C_mpointer(&C_a,(void*)ycl_strerror(t0)); 43 return C_r;} (lldb) p/x C_buf (long) $3 = 0x000000000000001e (lldb) p C_a (long *) $1 = 0x000000000000001e * thread #1, stop reason = signal SIGSEGV: invalid address (fault address: 0x1e) frame #0: 0x0000000800d05e61 libchicken.so.8`C_mpointer + 17 libchicken.so.8`C_mpointer: -> 0x800d05e61 <+17>: movq %rcx, (%rax) 0x800d05e64 <+20>: movq %rsi, 0x8(%rax) 0x800d05e68 <+24>: leaq 0x10(%rax), %rcx 0x800d05e6c <+28>: movq %rcx, (%rdi) C_regparm C_word C_fcall C_mpointer(C_word **ptr, void *mp) { C_word *p = *ptr, *p0 = p; *(p++) = C_POINTER_TYPE | 1; *((void **)p) = mp; *ptr = p + 1; return (C_word)p0; }