Fix overwriting preserved base pointer in prolog
authorLuke Lau <luke_lau@icloud.com>
Sat, 27 Jul 2019 22:54:16 +0000 (23:54 +0100)
committerLuke Lau <luke_lau@icloud.com>
Sat, 27 Jul 2019 22:54:16 +0000 (23:54 +0100)
Also fix illegal instruction copying over captives

codegen.scm

index dda14713ad69a2eda8f676387f3497ff647f735b..517cc110e545d9fe3490b0eeaf5c5d35b2c3d375 100644 (file)
   (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
     ; 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)))
 
 
         (stack-offsets (map (lambda (i)
                               (* (- wordsize) i))
-                            (range 1 (length params))))
+                            (range 0 (length params))))
 
         (env (map cons params stack-offsets)))
     (emit "~a:" label)
     (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)
 
       ('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))))