|
18 | 18 |
|
19 | 19 | (define (comment->string c) |
20 | 20 | (match c |
21 | | - [(% s) (string-append (make-string 32 #\space) "; " s)] |
22 | | - [(%% s) (string-append tab ";; " s)] |
23 | | - [(%%% s) (string-append ";;; " s)])) |
| 21 | + [(% s) (string-append (make-string 32 #\space) "# " s)] |
| 22 | + [(%% s) (string-append tab "## " s)] |
| 23 | + [(%%% s) (string-append "### " s)])) |
24 | 24 |
|
25 | 25 | (define current-extern-labels (make-parameter '())) |
26 | 26 |
|
27 | 27 | ;; Label -> String |
28 | | -(define (label-symbol->string s) |
| 28 | +;; prefix with _ for Mac |
| 29 | +(define label-symbol->string |
| 30 | + (match (system-type 'os) |
| 31 | + ['macosx (λ (s) (string-append "_" (symbol->string s)))] |
| 32 | + [_ (λ (s) (symbol->string s))])) |
| 33 | + |
| 34 | + ;(if (and (current-shared?) (memq s (current-extern-labels))) |
| 35 | + ; hack for ELF64 shared libraries in service of |
| 36 | + ; calling external functions in asm-interp |
| 37 | + ;(string-append "$" (symbol->string s) " wrt ..plt") |
| 38 | + ;(symbol->string s)))])) |
| 39 | + |
| 40 | +(define (label-symbol->string_old s) |
29 | 41 | ;; This should maybe be handled specially in the printing of Call rather |
30 | 42 | ;; than in every label... |
31 | 43 | (if (and (eq? (system-type 'os) 'unix) (current-shared?) (memq s (current-extern-labels))) |
32 | 44 | ; hack for ELF64 shared libraries in service of |
33 | 45 | ; calling external functions in asm-interp |
34 | | - (string-append "$" (symbol->string s) " wrt ..plt") |
35 | | - (string-append "$" (symbol->string s)))) |
| 46 | + ;(string-append "$" (symbol->string s) " wrt ..plt") |
| 47 | + (symbol->string s) |
| 48 | + (string-append "_" (symbol->string s)))) |
| 49 | + |
| 50 | + |
| 51 | +(define extern-label-decl-symbol->string-new |
| 52 | + (match (system-type 'os) |
| 53 | + ['macosx (λ (s) (string-append "_" (symbol->string s)))] |
| 54 | + [_ (λ (s) |
| 55 | + (symbol->string s))])) |
| 56 | + |
36 | 57 |
|
37 | 58 | (define (extern-label-decl-symbol->string s) |
38 | | - (string-append "$" (symbol->string s))) |
| 59 | + (string-append "" (symbol->string s))) |
39 | 60 |
|
40 | 61 | ;; Instruction -> String |
41 | 62 | (define (common-instruction->string i) |
|
76 | 97 | (match e |
77 | 98 | [(? register?) (symbol->string e)] |
78 | 99 | [(? Mem?) (string-append "[" (mem->string e) "]")] |
| 100 | + [(Offset (? register? r)) (string-append "[" (symbol->string r) "]")] |
| 101 | + [(Offset ($ (? label? r))) (string-append "[" (label-symbol->string r) " + rip]")] |
79 | 102 | [(Offset e) |
80 | 103 | (string-append "[" (exp->string e) "]")] |
81 | 104 | [_ (exp->string e)])) |
|
95 | 118 |
|
96 | 119 | (define (text-section n) |
97 | 120 | (match (system-type 'os) |
98 | | - ['macosx (format "section __TEXT,~a align=16" n)] |
99 | | - [_ (format "section ~a progbits alloc exec nowrite align=16" n)])) |
| 121 | + ['macosx (format ".section __TEXT,~a \n\t .p2align 4" n)] |
| 122 | + [_ (format ".section ~a progbits alloc exec nowrite align=16" n)])) |
100 | 123 |
|
101 | 124 | (define (data-section n) |
102 | 125 | (match (system-type 'os) |
103 | | - ['macosx (format "section __DATA,~a align=8" n)] |
104 | | - [_ (format "section ~a progbits alloc noexec write align=8" n)])) |
| 126 | + ['macosx (format ".section __DATA,~a \n\t .p2align 3" n)] |
| 127 | + [_ (format ".section ~a progbits alloc noexec write align=8" n)])) |
105 | 128 |
|
106 | 129 | ;; Instruction -> String |
107 | 130 | (define (simple-instr->string i) |
108 | 131 | (match i |
109 | | - [(Text) (string-append tab "section .text")] |
| 132 | + [(Text) (string-append tab ".text")] |
110 | 133 | [(Text n) (string-append tab (text-section n))] |
111 | | - [(Data) (string-append tab "section .data align=8")] ; 8-byte aligned data |
| 134 | + [(Data) (string-append tab ".data\n\t .p2align 3")] ; 8-byte aligned data |
112 | 135 | [(Data n) (string-append tab (data-section n))] |
113 | | - [(Extern ($ l)) (string-append tab "extern " (extern-label-decl-symbol->string l))] |
| 136 | + [(Extern ($ l)) (string-append tab ".extern " (extern-label-decl-symbol->string l))] |
| 137 | + [(Global ($ l)) (string-append tab ".global " (label-symbol->string l))] |
| 138 | + ;;[(Label ($ l)) (string-append "_" (symbol->string l) ":")] |
114 | 139 | [(Label ($ l)) (string-append (label-symbol->string l) ":")] |
115 | 140 | [(Lea d (? Mem? m)) |
116 | 141 | (string-append tab "lea " |
117 | | - (arg->string d) ", [rel " |
| 142 | + (arg->string d) ", [rip + " |
118 | 143 | (mem->string m) "]")] |
119 | 144 | [(Lea d e) |
120 | 145 | (string-append tab "lea " |
121 | | - (arg->string d) ", [rel " |
| 146 | + (arg->string d) ", [rip + " |
122 | 147 | (arg->string e) "]")] |
123 | 148 | [(Equ x c) |
124 | 149 | (string-append tab |
125 | 150 | (symbol->string x) |
126 | 151 | " equ " |
127 | 152 | (number->string c))] |
128 | 153 | [(Dq (? Mem? m)) |
129 | | - (string-append tab "dq " (mem->string m))] |
| 154 | + (string-append tab ".quad " (mem->string m))] |
| 155 | + [(Dq m) |
| 156 | + (string-append tab ".quad " (number->string m))] |
130 | 157 | [(Dd (? Mem? m)) |
131 | | - (string-append tab "dd " (mem->string m))] |
| 158 | + (string-append tab ".long " (mem->string m))] |
| 159 | + [(Dd m) |
| 160 | + (string-append tab ".long " (number->string m))] |
132 | 161 | [(Db (? bytes? bs)) |
133 | | - (apply string-append tab "db " (add-between (map number->string (bytes->list bs)) ", "))] |
| 162 | + (apply string-append tab ".byte " (add-between (map number->string (bytes->list bs)) ", "))] |
134 | 163 | [_ (common-instruction->string i)])) |
135 | 164 |
|
136 | 165 | (define (line-comment i s) |
137 | 166 | (let ((i-str (simple-instr->string i))) |
138 | 167 | (let ((pad (make-string (max 1 (- 32 (string-length i-str))) #\space))) |
139 | | - (string-append i-str pad "; " s)))) |
| 168 | + (string-append i-str pad "# " s)))) |
140 | 169 |
|
141 | 170 | ;; [Listof Instr] -> Void |
142 | 171 | (define (instrs-display a) |
|
173 | 202 | (begin |
174 | 203 | (write-string (string-append |
175 | 204 | ; tab "global " (label-symbol->string g) "\n" |
176 | | - tab "default rel\n" |
177 | | - tab "section .text\n")) |
| 205 | + tab ".intel_syntax noprefix\n" |
| 206 | + tab ".text\n")) |
178 | 207 | (instrs-display a))] |
179 | 208 | [_ |
180 | 209 | (instrs-display a) |
|
0 commit comments