Skip to content

Commit 6d7fa73

Browse files
committed
GC from today.
1 parent bbcfd2c commit 6d7fa73

File tree

5 files changed

+79
-37
lines changed

5 files changed

+79
-37
lines changed

langs/iniquity-gc/compile-ops.rkt

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@
66
(define eax 'eax) ; 32-bit load/store
77
(define rbx 'rbx) ; heap
88
(define rdi 'rdi) ; arg
9+
(define rsi 'rsi) ; arg
10+
(define rdx 'rdx) ; arg
11+
(define rcx 'rcx) ; arg
912
(define r8 'r8) ; scratch
1013
(define r9 'r9) ; scratch
1114
(define r10 'r10) ; scratch
15+
(define r14 'r14) ; stack pad (non-volatile)
1216
(define r15 'r15) ; stack pad (non-volatile)
1317
(define rsp 'rsp) ; stack
18+
(define rbp 'rbp) ; base stack
1419

1520
;; Op0 -> Asm
1621
(define (compile-op0 p)
@@ -24,22 +29,21 @@
2429
unpad-stack)]
2530
['dump-memory-stats
2631
(seq (Mov rdi rsp)
27-
(Mov 'rsi 'rbp)
28-
(Mov 'rdx rbx)
32+
(Mov rsi rbp)
33+
(Mov rdx rbx)
2934
pad-stack
3035
(Call 'print_memory)
31-
(Mov rax 0)
32-
unpad-stack)]
36+
unpad-stack
37+
(Mov rax val-void))]
3338
['collect-garbage
3439
(seq (Mov rdi rsp)
35-
(Mov 'rsi 'rbp)
36-
(Mov 'rdx rbx)
40+
(Mov rsi rbp)
41+
(Mov rdx rbx)
3742
pad-stack
3843
(Call 'collect_garbage)
3944
unpad-stack
4045
(Mov rbx rax)
4146
(Mov rax val-void))]))
42-
4347

4448
;; Op1 -> Asm
4549
(define (compile-op1 p)
@@ -73,7 +77,8 @@
7377
unpad-stack
7478
(Mov rax val-void))]
7579
['box
76-
(seq (Mov (Offset rbx 0) rax)
80+
(seq (allocate 1)
81+
(Mov (Offset rbx 0) rax)
7782
(Mov rax rbx)
7883
(Or rax type-box)
7984
(Add rbx 8))]
@@ -125,6 +130,20 @@
125130
(Mov rax 0)
126131
(Label done)))]))
127132

133+
(define (allocate n)
134+
(seq)
135+
#;
136+
(seq (Mov r15 rax) ; save rax
137+
(Mov rdi rsp)
138+
(Mov rsi rbp)
139+
(Mov rdx rbx)
140+
(Mov rcx n)
141+
pad-stack
142+
(Call 'alloc_val)
143+
unpad-stack
144+
;(Mov rbx rax)
145+
(Mov rax r15)))
146+
128147
;; Op2 -> Asm
129148
(define (compile-op2 p)
130149
(match p
@@ -160,7 +179,8 @@
160179
(Mov rax val-false)
161180
(Label true))))]
162181
['cons
163-
(seq (Mov (Offset rbx 0) rax)
182+
(seq (allocate 2)
183+
(Mov (Offset rbx 0) rax) ;; ALLOCATE
164184
(Pop rax)
165185
(Mov (Offset rbx 8) rax)
166186
(Mov rax rbx)
@@ -173,23 +193,28 @@
173193
(let ((loop (gensym))
174194
(done (gensym))
175195
(empty (gensym)))
176-
(seq (Pop r8)
177-
(assert-natural r8)
178-
(Cmp r8 0) ; special case empty vector
196+
(seq (Pop r14)
197+
(assert-natural r14)
198+
(Cmp r14 0) ; special case empty vector
179199
(Je empty)
200+
201+
(Sar r14 int-shift)
202+
203+
(Add r14 1)
204+
(allocate r14)
205+
(Sub r14 1)
180206

181207
(Mov r9 rbx)
182208
(Or r9 type-vect)
183-
184-
(Sar r8 int-shift)
185-
(Mov (Offset rbx 0) r8)
186-
(Add rbx 8)
209+
210+
(Mov (Offset rbx 0) r14)
211+
(Add rbx 8) ;; ALLOCATE
187212

188213
(Label loop)
189214
(Mov (Offset rbx 0) rax)
190-
(Add rbx 8)
191-
(Sub r8 1)
192-
(Cmp r8 0)
215+
(Add rbx 8) ;; ALLOCATE
216+
(Sub r14 1)
217+
(Cmp r14 0)
193218
(Jne loop)
194219

195220
(Mov rax r9)
@@ -230,7 +255,7 @@
230255

231256
(Sar r8 int-shift)
232257
(Mov (Offset rbx 0) r8)
233-
(Add rbx 8)
258+
(Add rbx 8) ;; ALLOCATE
234259

235260
(Sar rax char-shift)
236261

@@ -240,7 +265,7 @@
240265

241266
(Label loop)
242267
(Mov (Offset rbx 0) eax)
243-
(Add rbx 4)
268+
(Add rbx 4) ;; ALLOCATE
244269
(Sub r8 1)
245270
(Cmp r8 0)
246271
(Jne loop)

langs/iniquity-gc/compile.rkt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@
3434
(Extern 'write_byte)
3535
(Extern 'raise_error)
3636
(Extern 'print_memory)
37-
(Extern 'collect_garbage)))
37+
(Extern 'collect_garbage)
38+
(Extern 'alloc_val)))
3839

3940
;; [Listof Defn] -> Asm
4041
(define (compile-defines ds)

langs/iniquity-gc/gc.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const char* val_typeof_string(int64_t t) {
2121
}
2222
}
2323

24-
void step(val_t* to, val_t* from, val_t** to_curr, val_t** to_next, int count, int* t_back) {
24+
void step(val_t** to_curr, val_t** to_next, int count, int* t_back) {
2525
type_t t;
2626
int i;
2727
int size;
@@ -72,20 +72,16 @@ void step(val_t* to, val_t* from, val_t** to_curr, val_t** to_next, int count, i
7272
int64_t* collect_garbage(int64_t* rsp, int64_t *rbp, int64_t* rbx) {
7373
int stack_count = rbp - rsp;
7474

75-
val_t *from = heap + ((rbx < (heap + heap_size)) ? 0 : heap_size);
76-
val_t *to = heap + ((rbx < (heap + heap_size)) ? heap_size : 0);
77-
75+
val_t *tmp;
7876
val_t *to_next = to;
7977
val_t *to_curr = to;
8078

8179
int t_back = 0;
8280
int t_front = 0;
8381

8482
// Step through everything on the stack
85-
val_t * rsp_curr = rsp;
86-
step(to, from, &rsp_curr, &to_next, stack_count, &t_back);
87-
88-
printf("DONE STACK\n");
83+
val_t *rsp_curr = rsp;
84+
step(&rsp_curr, &to_next, stack_count, &t_back);
8985

9086
int vi;
9187
// now play catch up between to_curr and to_next
@@ -94,13 +90,13 @@ int64_t* collect_garbage(int64_t* rsp, int64_t *rbp, int64_t* rbx) {
9490
case T_VECT:
9591
vi = to_curr[0];
9692
to_curr++;
97-
step(to, from, &to_curr, &to_next, vi, &t_back);
93+
step(&to_curr, &to_next, vi, &t_back);
9894
break;
9995
case T_BOX:
100-
step(to, from, &to_curr, &to_next, 1, &t_back);
96+
step(&to_curr, &to_next, 1, &t_back);
10197
break;
10298
case T_CONS:
103-
step(to, from, &to_curr, &to_next, 2, &t_back);
99+
step(&to_curr, &to_next, 2, &t_back);
104100
break;
105101
case T_STR:
106102
to_curr = to_curr + 1 + ((*to_curr + 1) / 2);
@@ -110,16 +106,18 @@ int64_t* collect_garbage(int64_t* rsp, int64_t *rbp, int64_t* rbx) {
110106
break;
111107
}
112108
}
109+
110+
tmp = from;
111+
from = to;
112+
to = tmp;
113113
return to_next;
114114
}
115115

116116

117117
void print_memory(int64_t* rsp, int64_t* rbp, int64_t* rbx) {
118118

119-
val_t* h = heap + ((rbx < (heap + heap_size)) ? 0 : heap_size);
120-
121119
int stack_count = rbp - rsp;
122-
int heap_count = rbx - h;
120+
int heap_count = rbx - from;
123121

124122
printf("----------------------------------------------------------------\n");
125123
int i;
@@ -132,6 +130,17 @@ void print_memory(int64_t* rsp, int64_t* rbp, int64_t* rbx) {
132130
printf("HEAP:\n");
133131
for (i = 0; i < heap_count; i++) {
134132
printf("[%" PRIx64 "] = %016" PRIx64 ", %s\n",
135-
(int64_t)h + 8*i, h[i], val_typeof_string(h[i]));
133+
(int64_t)from + 8*i, from[i], val_typeof_string(from[i]));
134+
}
135+
}
136+
137+
int64_t* alloc_val(int64_t* rsp, int64_t* rbp, int64_t* rbx, int words) {
138+
if (rbx + words >= from + heap_size) {
139+
rbx = collect_garbage(rsp, rbp, rbx);
140+
if (rbx + words >= from + heap_size) {
141+
printf("OUT OF MEMORY!!\n");
142+
exit(1);
143+
}
136144
}
145+
return rbx;
137146
}

langs/iniquity-gc/main.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ FILE* in;
99
FILE* out;
1010
void (*error_handler)();
1111
val_t *heap;
12+
val_t *to;
13+
val_t *from;
1214
type_t *types;
1315

1416
void error_exit()
@@ -28,6 +30,8 @@ int main(int argc, char** argv)
2830
out = stdout;
2931
error_handler = &error_exit;
3032
heap = malloc(2 * 8 * heap_size);
33+
from = heap;
34+
to = heap + heap_size;
3135
types = malloc(sizeof(type_t) * heap_size);
3236

3337
val_t result;

langs/iniquity-gc/runtime.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,8 @@ extern void (*error_handler)();
88
// in words
99
#define heap_size 10000
1010
extern int64_t *heap;
11+
extern val_t *from;
12+
extern val_t *to;
13+
1114
extern type_t *types;
1215
#endif /* RUNTIME_H */

0 commit comments

Comments
 (0)