Make base pointer to point to the previous frames base pointer
authorLuke Lau <luke_lau@icloud.com>
Tue, 30 Jul 2019 22:26:41 +0000 (23:26 +0100)
committerLuke Lau <luke_lau@icloud.com>
Tue, 30 Jul 2019 22:26:41 +0000 (23:26 +0100)
Backtrace still looks kinda funny in lldb

codegen.scm

index 941dc158e89e61a4a30027b00641f942a80da0ef..52df26ece76527068fd89a7c397c3ca632aeaef4 100644 (file)
     (emit "## storing captives")
                                        ; store the captured vars
     (for-each
-     (lambda (var-name new-offset)
-       (let ([orig-offset (cdr (assoc var-name env))])
+     (lambda (var-name heap-offset)
+       (let ([stack-offset (cdr (assoc var-name env))])
         (emit "### captive ~a" var-name)
-        (if (eqv? orig-offset 'self-captive)
+        (if (eqv? stack-offset 'self-captive)
                                        ; captive refers to this closure:
                                        ; move heap addr of this closure to stack! 
-            (emit "movq %rax, ~a(%rax)" new-offset)
+            (emit "movq %rax, ~a(%rax)" heap-offset)
             (begin
-              (emit "movq ~a(%rbp), %rbx" orig-offset)
-              (emit "movq %rbx, ~a(%rax)" new-offset)))))
+              (emit "movq ~a(%rbp), %rbx" stack-offset)
+              (emit "movq %rbx, ~a(%rax)" heap-offset)))))
      captured
      heap-offsets)))
 
         (params (append captives args))
 
         (stack-offsets (map (lambda (i)
-                              (* (- wordsize) i))
+                              (* (- wordsize) (+ 1 i)))
                             (range 0 (length params))))
 
         (env (map cons params stack-offsets)))
     (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
        (begin
         (emit "# loading captive ~a" (list-ref captives i))
         (emit "movq ~a(~a), %rbx" (* wordsize i) (param-register 0))
-        (emit "movq %rbx, ~a(%rbp)" (* (- wordsize) i))))
+        (emit "movq %rbx, ~a(%rbp)" (* (- wordsize) (+ 1 i)))))
      (range 0 (length captives)))
 
                                        ; load the args onto the stack
         (emit "movq ~a, %rbx" (param-register (+ 1 i)))
         (emit "movq %rbx, ~a(%rbp)"
               (* (- wordsize)
-                 (+ (length captives) i)))))
+                 (+ (length captives) i)))))
      (range 0 (length args)))
     
     (codegen-expr body (* (- wordsize) (+ 1 (length params))) env)
     (initialize-heap)
 
     (emit "movq %rsp, %rbp")            ; set up the base pointer
-    (codegen-expr xform-prog 0 '())
+    
+    (codegen-expr xform-prog wordsize '())
 
                                        ; exit syscall
     (emit "mov %rax, %rdi")