|
17 | 17 | (symbol->string r)) |
18 | 18 |
|
19 | 19 | ;; Label -> String |
20 | | -;; prefix with _ for Mac |
21 | 20 | (define label-symbol->string |
| 21 | + (match (system-type 'os) |
| 22 | + ['macosx |
| 23 | + (λ (s) (string-append "_" (symbol->string s)))] |
| 24 | + [_ symbol->string])) |
| 25 | + |
| 26 | +;; Label -> String |
| 27 | +;; prefix with _ for Mac |
| 28 | +(define label-symbol->string/rel |
22 | 29 | (match (system-type 'os) |
23 | 30 | ['macosx |
24 | 31 | (λ (s) (string-append "_" (symbol->string s)))] |
25 | 32 | [_ |
26 | | - (if (current-shared?) |
27 | | - (λ (s) |
28 | | - (if (memq s external-labels) |
29 | | - ; hack for ELF64 shared libraries in service of |
30 | | - ; calling external functions in asm-interp |
31 | | - (string-append (symbol->string s) " wrt ..plt") |
32 | | - (symbol->string s))) |
33 | | - symbol->string)])) |
| 33 | + (λ (s) |
| 34 | + (if (current-shared?) |
| 35 | + (if (memq s (unbox external-labels)) |
| 36 | + ; hack for ELF64 shared libraries in service of |
| 37 | + ; calling external functions in asm-interp |
| 38 | + (string-append (symbol->string s) " wrt ..plt") |
| 39 | + (symbol->string s)) |
| 40 | + (symbol->string s)))])) |
34 | 41 |
|
35 | 42 | ;; (U Label Reg) -> String |
36 | 43 | (define (jump-target->string t) |
37 | 44 | (match t |
38 | 45 | [(? reg?) (reg->string t)] |
39 | 46 | [(Offset (? reg? r) i) |
40 | 47 | (string-append "[" (reg->string r) " + " (number->string i) "]")] |
41 | | - [_ (label-symbol->string t)])) |
| 48 | + [_ (label-symbol->string/rel t)])) |
42 | 49 |
|
43 | 50 | ;; Arg -> String |
44 | 51 | (define (arg->string a) |
|
59 | 66 | [(? integer?) (number->string e)] |
60 | 67 | [(Plus e1 e2) |
61 | 68 | (string-append "(" (exp->string e1) " + " (exp->string e2) ")")] |
62 | | - [_ (label-symbol->string e)])) |
| 69 | + [_ (label-symbol->string/rel e)])) |
63 | 70 |
|
64 | 71 | (define tab (make-string 8 #\space)) |
65 | 72 |
|
66 | 73 |
|
67 | 74 | (define external-labels (box '())) |
68 | 75 |
|
| 76 | +(define (external-label-shared? x) |
| 77 | + (and (label? x) |
| 78 | + (current-shared?) |
| 79 | + (memq x (unbox external-labels)))) |
| 80 | + |
| 81 | +(define (mov->string a1 a2) |
| 82 | + (match a2 |
| 83 | + ;; to handle loading external data |
| 84 | + ;; when 1) ELF, 2) building a shared object |
| 85 | + [(Offset (? external-label-shared? l) i) |
| 86 | + (string-append tab "mov " |
| 87 | + (arg->string a1) ", " |
| 88 | + "[" (label-symbol->string l) " + " (number->string i) " wrt ..gotpc]\n" |
| 89 | + tab "mov " |
| 90 | + (arg->string a1) ", " |
| 91 | + "[" (arg->string a1) "]")] |
| 92 | + ;; the usual case |
| 93 | + [_ |
| 94 | + (string-append tab "mov " |
| 95 | + (arg->string a1) ", " |
| 96 | + (arg->string a2))])) |
| 97 | + |
69 | 98 | ;; Instruction -> String |
70 | 99 | (define (instr->string i) |
71 | 100 | (match i |
|
75 | 104 | [(Label l) (string-append (label-symbol->string l) ":")] |
76 | 105 | [(Global x) (string-append tab "global " (label-symbol->string x))] |
77 | 106 | [(Extern l) (let ((r (string-append tab "extern " (label-symbol->string l)))) |
78 | | - (begin |
79 | | - (set-box! external-labels (cons l (unbox external-labels))) |
80 | | - r))] |
| 107 | + (begin |
| 108 | + (set-box! external-labels (cons l (unbox external-labels))) |
| 109 | + r))] |
81 | 110 | [(Mov a1 a2) |
82 | | - (string-append tab "mov " |
83 | | - (arg->string a1) ", " |
84 | | - (arg->string a2))] |
| 111 | + (mov->string a1 a2)] |
85 | 112 | [(Add a1 a2) |
86 | 113 | (string-append tab "add " |
87 | | - (arg->string a1) ", " |
88 | | - (arg->string a2))] |
| 114 | + (arg->string a1) ", " |
| 115 | + (arg->string a2))] |
89 | 116 | [(Sub a1 a2) |
90 | 117 | (string-append tab "sub " |
91 | | - (arg->string a1) ", " |
92 | | - (arg->string a2))] |
| 118 | + (arg->string a1) ", " |
| 119 | + (arg->string a2))] |
93 | 120 | [(Cmp a1 a2) |
94 | 121 | (string-append tab "cmp " |
95 | | - (arg->string a1) ", " |
96 | | - (arg->string a2))] |
| 122 | + (arg->string a1) ", " |
| 123 | + (arg->string a2))] |
97 | 124 | [(Sal a1 a2) |
98 | 125 | (string-append tab "sal " |
99 | | - (arg->string a1) ", " |
100 | | - (arg->string a2))] |
| 126 | + (arg->string a1) ", " |
| 127 | + (arg->string a2))] |
101 | 128 | [(Sar a1 a2) |
102 | 129 | (string-append tab "sar " |
103 | | - (arg->string a1) ", " |
104 | | - (arg->string a2))] |
| 130 | + (arg->string a1) ", " |
| 131 | + (arg->string a2))] |
105 | 132 | [(And a1 a2) |
106 | 133 | (string-append tab "and " |
107 | | - (arg->string a1) ", " |
108 | | - (arg->string a2))] |
| 134 | + (arg->string a1) ", " |
| 135 | + (arg->string a2))] |
109 | 136 | [(Or a1 a2) |
110 | 137 | (string-append tab "or " |
111 | | - (arg->string a1) ", " |
112 | | - (arg->string a2))] |
| 138 | + (arg->string a1) ", " |
| 139 | + (arg->string a2))] |
113 | 140 | [(Xor a1 a2) |
114 | 141 | (string-append tab "xor " |
115 | | - (arg->string a1) ", " |
116 | | - (arg->string a2))] |
| 142 | + (arg->string a1) ", " |
| 143 | + (arg->string a2))] |
117 | 144 | [(Jmp l) |
118 | 145 | (string-append tab "jmp " |
119 | | - (jump-target->string l))] |
| 146 | + (jump-target->string l))] |
120 | 147 | [(Je l) |
121 | 148 | (string-append tab "je " |
122 | | - (jump-target->string l))] |
| 149 | + (jump-target->string l))] |
123 | 150 | [(Jne l) |
124 | 151 | (string-append tab "jne " |
125 | | - (jump-target->string l))] |
| 152 | + (jump-target->string l))] |
126 | 153 | [(Jl l) |
127 | 154 | (string-append tab "jl " |
128 | | - (jump-target->string l))] |
| 155 | + (jump-target->string l))] |
129 | 156 | [(Jle l) |
130 | 157 | (string-append tab "jle " |
131 | | - (jump-target->string l))] |
| 158 | + (jump-target->string l))] |
132 | 159 | [(Jg l) |
133 | 160 | (string-append tab "jg " |
134 | | - (jump-target->string l))] |
| 161 | + (jump-target->string l))] |
135 | 162 | [(Jge l) |
136 | 163 | (string-append tab "jge " |
137 | | - (jump-target->string l))] |
| 164 | + (jump-target->string l))] |
138 | 165 | [(Call l) |
139 | 166 | (string-append tab "call " |
140 | | - (jump-target->string l))] |
| 167 | + (jump-target->string l))] |
141 | 168 | [(Push a) |
142 | 169 | (string-append tab "push " |
143 | | - (arg->string a))] |
| 170 | + (arg->string a))] |
144 | 171 | [(Pop r) |
145 | 172 | (string-append tab "pop " |
146 | | - (reg->string r))] |
| 173 | + (reg->string r))] |
147 | 174 | [(Lea d (? offset? x)) |
148 | 175 | (string-append tab "lea " |
149 | | - (arg->string d) ", " |
150 | | - (arg->string x))] |
| 176 | + (arg->string d) ", " |
| 177 | + (arg->string x))] |
151 | 178 | [(Lea d x) |
152 | 179 | (string-append tab "lea " |
153 | | - (arg->string d) ", [rel " |
154 | | - (exp->string x) "]")] |
| 180 | + (arg->string d) ", [rel " |
| 181 | + (exp->string x) "]")] |
155 | 182 | [(Div r) |
156 | 183 | (string-append tab "div " |
157 | | - (arg->string r))] |
| 184 | + (arg->string r))] |
158 | 185 | [(Equ x c) |
159 | 186 | (string-append tab |
160 | | - (symbol->string x) |
161 | | - " equ " |
162 | | - (number->string c))] |
163 | | - |
| 187 | + (symbol->string x) |
| 188 | + " equ " |
| 189 | + (number->string c))] |
| 190 | + |
164 | 191 | [(Dd x) |
165 | 192 | (string-append tab "dd " (arg->string x))] |
166 | 193 | [(Dq x) |
|
180 | 207 | (match (findf Label? a) |
181 | 208 | [(Label g) |
182 | 209 | (string-append |
183 | | - tab "global " (label-symbol->string g) "\n" |
184 | | - tab "default rel\n" |
185 | | - tab "section .text\n" |
186 | | - (instrs->string a))] |
| 210 | + tab "global " (label-symbol->string g) "\n" |
| 211 | + tab "default rel\n" |
| 212 | + tab "section .text\n" |
| 213 | + (instrs->string a))] |
187 | 214 | [_ |
188 | 215 | (instrs->string a) |
189 | 216 | #; |
|
0 commit comments