From: Luke Lau Date: Sat, 27 Jul 2019 22:54:16 +0000 (+0100) Subject: Fix overwriting preserved base pointer in prolog X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=commitdiff_plain;h=c3ee0f7639a02371a2d01b39ddca91506c4791c3 Fix overwriting preserved base pointer in prolog Also fix illegal instruction copying over captives --- diff --git a/codegen.scm b/codegen.scm index dda1471..517cc11 100644 --- a/codegen.scm +++ b/codegen.scm @@ -124,6 +124,8 @@ (let* ((heap-offsets (map (lambda (i) (+ 8 (* 8 i))) (range 0 (length captured))))) ; 4, 12, 20, etc. + (emit "## creating closure") + (emit "movq heap_start@GOTPCREL(%rip), %rbx") (emit "movq (%rbx), %rax") ; %rax = heap addr of closure @@ -132,16 +134,18 @@ ; point heap_start to next space (emit "addq $~a, (%rbx)" (+ 8 (* 8 (length captured)))) + (emit "## storing address to lambda") ; store the address to the lambda code (emit "movq ~a@GOTPCREL(%rip), %rbx" label) (emit "movq %rbx, 0(%rax)") + (emit "## storing captives") ; store the captured vars (for-each (lambda (var-name new-offset) - (emit "movq ~a(%rbp), ~a(rax)" - (cdr (assoc var-name env)) - new-offset)) + (begin + (emit "movq ~a(%rbp), %rbx" (cdr (assoc var-name env))) + (emit "movq %rbx, ~a(%rax)" new-offset))) captured heap-offsets))) @@ -206,7 +210,7 @@ (stack-offsets (map (lambda (i) (* (- wordsize) i)) - (range 1 (length params)))) + (range 0 (length params)))) (env (map cons params stack-offsets))) (emit "~a:" label) @@ -222,21 +226,27 @@ (newline) (emit "push %rbp") ; preserve caller's base pointer + (emit "movq %rsp, %rbp") ; set up our own base pointer + (emit "subq $8, %rbp") ; load the captured vars onto the stack (for-each (lambda (i) - (emit "movq ~a(~a), ~a(%rbp)" - i (param-register 0) (* (- wordsize) i))) + (begin + (emit "movq ~a(~a), %rbx" i (param-register 0)) + (emit "movq %rbx, ~a(%rbp)" (* (- wordsize) i)))) (range 0 (length captured))) ; load the args onto the stack (for-each (lambda (i) - (emit "movq ~a, ~a(%rbp)" - (param-register i) (* (- wordsize) i))) - (range 1 (length args))) + (begin + (emit "movq ~a, %rbx" (param-register (+ 1 i))) + (emit "movq %rbx, ~a(%rbp)" + (* (- wordsize) + (+ (length captured) i))))) + (range 0 (length args))) (codegen-expr body (* (- wordsize) (+ 1 (length params))) env) @@ -375,7 +385,7 @@ ('app (append ; if a builtin is used as a function, don't generate lambda (if (eqv? 'builtin (ast-type (car e))) - '() + (list (car e)) (list (extract (car e)))) (map extract (cdr e))))