Skip to content

Commit 053bb23

Browse files
committed
Standard library, shared objects, and ELF working together
Ugh, this was a slog. See: https://twitter.com/lambda_calculus/status/1472392982863224838
1 parent 8654f61 commit 053bb23

5 files changed

Lines changed: 94 additions & 63 deletions

File tree

langs/outlaw/Makefile

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,8 @@ UNAME := $(shell uname)
88

99
ifeq ($(UNAME), Darwin)
1010
format=macho64
11-
libs='-lunistring'
1211
else
1312
format=elf64
14-
libs='-L/usr/lib/x86_64-linux-gnu -l:libunistring.a'
1513
endif
1614

1715
objs = \
@@ -27,10 +25,13 @@ objs = \
2725
default: runtime.o
2826

2927
runtime.o: $(objs)
30-
ld -r $(objs) $(libs) -o runtime.o
28+
ld -r $(objs) -o runtime.o
29+
30+
%.so: %.o runtime.o
31+
gcc -z defs -v -L$(LINK_DIR) -lunistring -shared runtime.o $< -o $@
3132

3233
%.run: %.o runtime.o
33-
gcc runtime.o $< -o $@
34+
gcc -L$(LINK_DIR) -lunistring runtime.o $< -o $@
3435

3536
.c.o:
3637
gcc -fPIC -c -g -o $@ $<
@@ -42,7 +43,7 @@ stdlib.s: stdlib.rkt
4243
cat stdlib.rkt | racket -t compile-library.rkt -m > stdlib.s
4344

4445
%.s: %.rkt
45-
cat $< | racket -t compile-stdin.rkt > $@
46+
cat $< | racket -t compile-stdin.rkt -m > $@
4647

4748
clean:
4849
rm *.o *.s *.run

langs/outlaw/a86/interp.rkt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,9 @@
179179
""
180180
"-z defs "))
181181
(unless (parameterize ((current-error-port err-port))
182-
(system (format "gcc ~a-v -shared ~a ~a -o ~a"
182+
(system (format "gcc ~a-v -shared -L~a -lunistring ~a ~a -o ~a"
183183
-z-defs-maybe
184+
(getenv "LINK_PATH")
184185
t.o objs t.so)))
185186
(define err-msg
186187
(get-output-string err-port))

langs/outlaw/a86/printer.rkt

Lines changed: 83 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -17,28 +17,35 @@
1717
(symbol->string r))
1818

1919
;; Label -> String
20-
;; prefix with _ for Mac
2120
(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
2229
(match (system-type 'os)
2330
['macosx
2431
(λ (s) (string-append "_" (symbol->string s)))]
2532
[_
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)))]))
3441

3542
;; (U Label Reg) -> String
3643
(define (jump-target->string t)
3744
(match t
3845
[(? reg?) (reg->string t)]
3946
[(Offset (? reg? r) i)
4047
(string-append "[" (reg->string r) " + " (number->string i) "]")]
41-
[_ (label-symbol->string t)]))
48+
[_ (label-symbol->string/rel t)]))
4249

4350
;; Arg -> String
4451
(define (arg->string a)
@@ -59,13 +66,35 @@
5966
[(? integer?) (number->string e)]
6067
[(Plus e1 e2)
6168
(string-append "(" (exp->string e1) " + " (exp->string e2) ")")]
62-
[_ (label-symbol->string e)]))
69+
[_ (label-symbol->string/rel e)]))
6370

6471
(define tab (make-string 8 #\space))
6572

6673

6774
(define external-labels (box '()))
6875

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+
6998
;; Instruction -> String
7099
(define (instr->string i)
71100
(match i
@@ -75,92 +104,90 @@
75104
[(Label l) (string-append (label-symbol->string l) ":")]
76105
[(Global x) (string-append tab "global " (label-symbol->string x))]
77106
[(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))]
81110
[(Mov a1 a2)
82-
(string-append tab "mov "
83-
(arg->string a1) ", "
84-
(arg->string a2))]
111+
(mov->string a1 a2)]
85112
[(Add a1 a2)
86113
(string-append tab "add "
87-
(arg->string a1) ", "
88-
(arg->string a2))]
114+
(arg->string a1) ", "
115+
(arg->string a2))]
89116
[(Sub a1 a2)
90117
(string-append tab "sub "
91-
(arg->string a1) ", "
92-
(arg->string a2))]
118+
(arg->string a1) ", "
119+
(arg->string a2))]
93120
[(Cmp a1 a2)
94121
(string-append tab "cmp "
95-
(arg->string a1) ", "
96-
(arg->string a2))]
122+
(arg->string a1) ", "
123+
(arg->string a2))]
97124
[(Sal a1 a2)
98125
(string-append tab "sal "
99-
(arg->string a1) ", "
100-
(arg->string a2))]
126+
(arg->string a1) ", "
127+
(arg->string a2))]
101128
[(Sar a1 a2)
102129
(string-append tab "sar "
103-
(arg->string a1) ", "
104-
(arg->string a2))]
130+
(arg->string a1) ", "
131+
(arg->string a2))]
105132
[(And a1 a2)
106133
(string-append tab "and "
107-
(arg->string a1) ", "
108-
(arg->string a2))]
134+
(arg->string a1) ", "
135+
(arg->string a2))]
109136
[(Or a1 a2)
110137
(string-append tab "or "
111-
(arg->string a1) ", "
112-
(arg->string a2))]
138+
(arg->string a1) ", "
139+
(arg->string a2))]
113140
[(Xor a1 a2)
114141
(string-append tab "xor "
115-
(arg->string a1) ", "
116-
(arg->string a2))]
142+
(arg->string a1) ", "
143+
(arg->string a2))]
117144
[(Jmp l)
118145
(string-append tab "jmp "
119-
(jump-target->string l))]
146+
(jump-target->string l))]
120147
[(Je l)
121148
(string-append tab "je "
122-
(jump-target->string l))]
149+
(jump-target->string l))]
123150
[(Jne l)
124151
(string-append tab "jne "
125-
(jump-target->string l))]
152+
(jump-target->string l))]
126153
[(Jl l)
127154
(string-append tab "jl "
128-
(jump-target->string l))]
155+
(jump-target->string l))]
129156
[(Jle l)
130157
(string-append tab "jle "
131-
(jump-target->string l))]
158+
(jump-target->string l))]
132159
[(Jg l)
133160
(string-append tab "jg "
134-
(jump-target->string l))]
161+
(jump-target->string l))]
135162
[(Jge l)
136163
(string-append tab "jge "
137-
(jump-target->string l))]
164+
(jump-target->string l))]
138165
[(Call l)
139166
(string-append tab "call "
140-
(jump-target->string l))]
167+
(jump-target->string l))]
141168
[(Push a)
142169
(string-append tab "push "
143-
(arg->string a))]
170+
(arg->string a))]
144171
[(Pop r)
145172
(string-append tab "pop "
146-
(reg->string r))]
173+
(reg->string r))]
147174
[(Lea d (? offset? x))
148175
(string-append tab "lea "
149-
(arg->string d) ", "
150-
(arg->string x))]
176+
(arg->string d) ", "
177+
(arg->string x))]
151178
[(Lea d x)
152179
(string-append tab "lea "
153-
(arg->string d) ", [rel "
154-
(exp->string x) "]")]
180+
(arg->string d) ", [rel "
181+
(exp->string x) "]")]
155182
[(Div r)
156183
(string-append tab "div "
157-
(arg->string r))]
184+
(arg->string r))]
158185
[(Equ x c)
159186
(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+
164191
[(Dd x)
165192
(string-append tab "dd " (arg->string x))]
166193
[(Dq x)
@@ -180,10 +207,10 @@
180207
(match (findf Label? a)
181208
[(Label g)
182209
(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))]
187214
[_
188215
(instrs->string a)
189216
#;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@
88
(define (main)
99
(begin
1010
(read-line) ; ignore #lang racket line
11+
(current-shared? #t)
1112
(displayln (asm-string (compile (parse (read-all)))))))

langs/outlaw/stdlib.rkt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,8 @@
301301

302302
;; FIXME: hard-coded system type
303303
(define (system-type _)
304-
'macosx)
304+
'unix)
305+
; 'macosx)
305306

306307
(define (not x)
307308
(if x #f #t))

0 commit comments

Comments
 (0)