+(define (extract-strings program)
+ (let ((cur-string 0)
+ (strings '())) ; assoc list of labels -> string
+ (define (fresh-string)
+ (set! cur-string (+ cur-string 1))
+ (format "string~a" (- cur-string 1)))
+ (define (extract e)
+ (case (ast-type e)
+ ('string-literal
+ (let ((label (fresh-string)))
+ (set! strings (cons (cons label e) strings))
+ `(static-string ,label)))
+ (else (ast-traverse extract e))))
+ (let ((transformed (extract program)))
+ (cons strings transformed))))
+
+(define (codegen-string-data s)
+ (emit "~a:" (car s))
+ (emit "\t.string \"~a\"" (cdr s)))
+
+;; (define (amd64-abi f)
+;; ; preserve registers
+;; (emit "push %rbp")
+;; ;; (emit "push %rbx")
+;; ;; (for-each (lambda (i)
+;; ;; (emit (string-append
+;; ;; "push %r"
+;; ;; (number->string i))))
+;; ;; '(12 13 14 15))
+
+;; (emit "movq %rsp, %rbp") ; set up the base pointer
+
+;; (f) ; call stuff
+;; ; restore preserved registers
+;; ;; (for-each (lambda (i)
+;; ;; (emit (string-append
+;; ;; "pop %r"
+;; ;; (number->string i))))
+;; ;; '(15 14 13 12))
+;; ;; (emit "pop %rbx")
+;; (emit "pop %rbp")
+;; (emit "ret"))