Mercurial > repos > tabletprog
annotate modules/llcompile.tp @ 368:0673ccbc7379
Add clone bethod to bytearray module
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 09 Aug 2015 20:00:08 -0700 |
parents | 06dceff348ea |
children |
rev | line source |
---|---|
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 _compileError <- :_msg _line { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #{ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 isError? <- { true } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 msg <- { _msg } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 line <- { _line } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
10 _notError:else <- :vals ifnoterr iferror { |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
11 if: (object does: vals understand?: "find") { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
12 maybeErr <- vals find: :val { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
13 (object does: val understand?: "isError?") && (val isError?) |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
14 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
15 maybeErr value: :err { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
16 iferror: err |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
17 } none: ifnoterr |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
18 } else: ifnoterr |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
20 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
21 _notError <- :vals ifnoterr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
22 _notError: vals ifnoterr else: :e { e } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
23 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 _ilFun <- :_name { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 _buff <- #[] |
361
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
27 _data <- #[] |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
28 _blockStack <- [] |
361
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
29 _labelDefs <- dict hash |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 _nextReg <- 0 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 #{ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 name <- { _name } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 add <- :inst { _buff append: inst } |
361
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
34 addData <- :data { |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
35 lbl <- il label |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
36 dataPos <- _data length |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
37 _labelDefs set: dataPos lbl |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
38 _data append: data |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
39 lbl reference |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
40 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 getReg <- { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 r <- il reg: _nextReg |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 _nextReg <- _nextReg + 1 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 r |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
46 startBlock <- { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
47 _blockStack <- _buff | _blockStack |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
48 _buff <- #[] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
49 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
50 popBlock <- { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
51 res <- _buff |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
52 _buff <- _blockStack value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
53 _blockStack <- _blockStack tail |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
54 res |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
55 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
56 buffer <- { _buff } |
361
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
57 finalize <- { |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
58 foreach: _data :idx data { |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
59 _buff append: (_labelDefs get: idx else: { false }) |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
60 _buff append: (il data: data) |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
61 } |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
62 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
65 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
66 _sizeMap <- dict hash |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
67 _sizeMap set: "8" (il b) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
68 _sizeMap set: "16" (il w) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
69 _sizeMap set: "32" (il l) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
70 _sizeMap set: "64" (il q) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
71 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
72 _parseType <- :expr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
73 if: (expr nodeType) = (ast sym) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
74 name <- expr name |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
75 _signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
76 if: (name startsWith?: "u") { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
77 _signed? <- false |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
78 name <- name from: 1 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
79 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
80 if: (name startsWith?: "int") && ((name length) <= 5) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
81 size <- name from: 3 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
82 _sizeMap ifget: size :llsize { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
83 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
84 size <- llsize |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
85 signed? <- _signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
86 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
87 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
88 _compileError: "LL integer type " . (expr name) . " has an invalid size" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
89 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
90 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
91 _compileError: "LL Type " . (expr name) . " not implemented yet" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
92 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
93 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
94 _compileError: "LL Type with node type " . (expr nodeType) . " not implemented yet" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
95 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
96 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
97 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
98 _exprHandlers <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 _compileExpr:syms:ilfun:dest <- :expr :syms :ilf :dst { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 _exprHandlers ifget: (expr nodeType) :handler { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 handler: expr syms ilf dst |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
103 _compileError: "Expression with node type " . (expr nodeType) . " not implemented yet" |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
104 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
105 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
106 _opMap <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
107 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
108 _compOps <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
109 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
110 _compileBinary <- :expr syms ilf assignTo { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 _assignSize? <- false |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
112 _asize <- il b |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
113 dest <- assignTo value: :asn { |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 _assignSize? <- true |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 _asize <- asn size |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
116 asn |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
117 } none: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
118 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
119 val <- ilf getReg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
120 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
121 size <- _asize |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
122 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
123 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
124 l <- _compileExpr: (expr left) syms: syms ilfun: ilf dest: (option value: dest) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
125 r <- _compileExpr: (expr right) syms: syms ilfun: ilf dest: (option none) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 _notError: [(l) (r)] { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 lv <- l val |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 ls <- l size |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 rv <- r val |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 rs <- r size |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
131 _size <- if: ls > rs { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
132 ls |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
133 //TODO: sign/zero extend rv |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
134 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
135 rs |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
136 //TODO: sign/zero extend lv if rs > ls |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
137 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
138 if: _assignSize? && _asize > _size { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
139 _size <- _asize |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
140 //TODO: sign/zero extend result |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
141 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
142 _signed <- (l signed?) || (r signed?) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 _opMap ifget: (expr op) :ingen { |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
144 if: (lv isInteger?) { |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
145 tmp <- lv |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
146 lv <- ilf getReg |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
147 ilf add: (il mov: tmp lv ls) |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
148 } |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
149 ilf add: (ingen: rv lv (dest val) _size) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 #{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
151 val <- dest val |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 size <- _size |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 signed? <- _signed |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
154 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
155 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
156 _compOps ifget: (expr op) :condFun { |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
157 if: (lv isInteger?) { |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
158 tmp <- lv |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
159 lv <- ilf getReg |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
160 ilf add: (il mov: tmp lv ls) |
353
95bc24c729e6
Move right hand parameter to cmp in _compileBinary to a temp reg if it is a constant since those are only supported in the left hand param currently
Michael Pavone <pavone@retrodev.com>
parents:
352
diff
changeset
|
161 } |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
162 ilf add: (il cmp: rv lv _size) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
163 cond <- condFun: _signed |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
164 ilf add: (il bool: cond (dest val)) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
165 #{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
166 val <- dest val |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
167 size <- il b |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
168 signed? <- false |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
169 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
170 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
171 _compileError: "Operator " . (expr op) . " is not supported yet\n" 0 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
172 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
173 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
174 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
176 _compileString <- :expr syms ilf assignTo { |
361
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
177 lbl <- ilf addData: (expr val) |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
178 v <- assignTo value: :asn { |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
179 asn |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
180 } none: { |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
181 lbl |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
182 } |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
183 #{ |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
184 val <- v |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
185 //TODO: Asbstract pointer size |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
186 size <- il q |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
187 signed? <- false |
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
188 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
189 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
190 _compileInt <- :expr syms ilf assignTo { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
191 sz <- il sizeFromBytes: (expr size) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
192 assignTo value: :asn { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
193 ilf add: (il mov: (expr val) (asn val) sz) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
194 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
195 val <- asn val |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
196 signed? <- expr signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
197 size <- sz |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
198 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
199 } none: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
200 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
201 val <- expr val |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
202 signed? <- expr signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
203 size <- sz |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
204 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
205 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
206 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
207 _compileSym <- :expr syms ilf assignTo { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
208 syms ifDefined: (expr name) :syminfo { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
209 if: (syminfo isLocal?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
210 syminfo def |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
211 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
212 print: "Symbol " . (expr name) . " is not local and other types are not yet supported in LL dialect\n" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
213 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
215 _compileError: "Symbol " . (expr name) . " is not defined in " . (ilf name) |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
216 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
217 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
218 _compileIf <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
219 if: ((expr args) length) != 2 { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
220 _compileError: "if takes exactly 2 arguments" 0 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
221 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
222 condArg <- (expr args) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
223 blockArg <- ((expr args) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
224 cond <- _compileExpr: condArg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
225 _notError: [cond] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
226 if: (blockArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
227 _compileError: "second argument to if must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
228 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
229 ilf add: (il cmp: 0 (cond val) (cond size)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
230 dest <- if: (assignTo none?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
231 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
232 val <- ilf reg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
233 //TODO: FIXME |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
234 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
235 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
236 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
237 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
238 assignTo |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
239 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
240 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
241 foreach: (blockArg expressions) :idx expr{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
242 asn <- if: idx = ((blockArg expressions) length) - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
243 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
244 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
245 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
246 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
247 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
248 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
249 block <- ilf popBlock |
356
3b023e5a0b42
llcompile almost working well enough for fib sample
Michael Pavone <pavone@retrodev.com>
parents:
354
diff
changeset
|
250 ilf add: (il skipIf: (il eq) block) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
251 dest value: :d { d } none: { _compileError: "Something went wrong" } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
252 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
253 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
254 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
255 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
256 _compileIfElse <- :expr syms ilf assignTo { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
257 if: ((expr args) length) != 3 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
258 _compileError: "if:else takes exactly 3 arguments" 0 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
259 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
260 condArg <- (expr args) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
261 blockArg <- ((expr args) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
262 elseArg <- (((expr args) tail) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
263 cond <- _compileExpr: condArg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
264 _notError: [cond] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
265 if: (blockArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
266 _compileError: "second argument to if:else must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
267 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
268 if: (elseArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
269 _compileError: "third argument to if:else must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
270 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
271 ilf add: (il cmp: 0 (cond val) (cond size)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
272 dest <- if: (assignTo none?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
273 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
274 val <- ilf reg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
275 //TODO: FIXME |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
276 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
277 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
278 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
279 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
280 assignTo |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
281 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
282 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
283 foreach: (blockArg expressions) :idx expr { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
284 asn <- if: idx = ((blockArg expressions) length) - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
285 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
286 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
287 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
288 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
289 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
290 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
291 block <- ilf popBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
292 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
293 foreach: (elseArg expressions) :idx expr { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
294 asn <- if: idx = ((elseArg expressions) length) - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
295 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
296 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
297 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
298 } |
357
f237d0cae58b
llcompile now works well enough for the a simple fib program to work
Michael Pavone <pavone@retrodev.com>
parents:
356
diff
changeset
|
299 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
300 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
301 elseblock <- ilf popBlock |
356
3b023e5a0b42
llcompile almost working well enough for fib sample
Michael Pavone <pavone@retrodev.com>
parents:
354
diff
changeset
|
302 ilf add: (il skipIf: (il eq) block else: elseblock) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
303 dest value: :d { d } none: { _compileError: "Something went wrong" } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
304 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
305 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
306 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
307 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
308 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
309 _funMap <- false |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
310 _compileCall <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
311 if: ((expr tocall) nodeType) = (ast sym) && (_funMap contains?: ((expr tocall) name)) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
312 handler <- _funMap get: ((expr tocall) name) else: { false } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
313 handler: expr syms ilf assignTo |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
314 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
315 ctocall <- if: ((expr tocall) nodeType) = (ast sym) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
316 ctocall <- (expr tocall) name |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
317 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
318 _compileExpr: (expr tocall) syms: syms ilfun: ilf dest: (option none) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
319 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
320 cargs <- (expr args) map: :arg { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
321 _compileExpr: arg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
322 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
323 _notError: ctocall | cargs { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
324 ilf add: (il call: ctocall withArgs: (cargs map: :arg { arg val } )) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
325 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
326 retval <- assignTo value: :asn { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
327 ilf add: (il mov: (il retr) (asn val) (asn size)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
328 asn |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
329 } none: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
330 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
331 val <- il retr |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
332 //TODO: Use correct values based on return type |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
333 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
334 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
335 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
336 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
337 retval |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
338 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
339 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
340 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
341 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
342 _compileAssign <- :expr syms ilf assignTo { |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
343 dest <- ((expr to) type) value: :typeexpr { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
344 type <- _parseType: typeexpr |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
345 _notError: [type] { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
346 syms define: ((expr to) name) #{ |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
347 val <- ilf getReg |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
348 size <- type size |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
349 signed? <- type signed? |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
350 } |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
351 } |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
352 } none: { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
353 _compileExpr: (expr to) syms: syms ilfun: ilf dest: (option none) |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
354 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
355 _notError: [dest] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
356 value <- _compileExpr: (expr assign) syms: syms ilfun: ilf dest: dest |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
357 _notError: [value] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
358 //TODO: adjust size of value if necessary |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
359 //ilf add: (il mov: (value val) (dest val) (dest size)) |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
360 value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
361 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
362 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
363 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
364 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
365 _initDone? <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
366 #{ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
367 import: [ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
368 binary |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
369 stringlit |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
370 intlit |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
371 sym |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
372 call |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
373 obj |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
374 sequence |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
375 assignment |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
376 lambda |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
377 ] from: ast |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
378 _initHandlers <- { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
379 if: (not: _initDone?) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
380 _exprHandlers <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
381 _exprHandlers set: binary _compileBinary |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
382 _exprHandlers set: stringlit _compileString |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
383 _exprHandlers set: intlit _compileInt |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
384 _exprHandlers set: sym _compileSym |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
385 _exprHandlers set: assignment _compileAssign |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
386 _exprHandlers set: call _compileCall |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
387 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
388 _opMap <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
389 mapOp <- macro: :op ilfun { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
390 quote: (_opMap set: op :ina inb out size { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
391 il ilfun: ina inb out size |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
392 }) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
393 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
394 mapOp: "+" add |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
395 mapOp: "-" sub |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
396 mapOp: "*" mul |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
397 mapOp: "/" div |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
398 mapOp: "and" band |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
399 mapOp: "or" bor |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
400 mapOp: "xor" bxor |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
401 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
402 _compOps <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
403 _compOps set: "=" :signed? { il eq } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
404 _compOps set: "!=" :signed? { il ne } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
405 _compOps set: ">" :signed? { if: signed? { il gr } else: { il ugr } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
406 _compOps set: "<" :signed? { if: signed? { il ls } else: { il uls } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
407 _compOps set: ">=" :signed? { if: signed? { il ge } else: { il uge } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
408 _compOps set: "<=" :signed? { if: signed? { il le } else: { il ule } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
409 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
410 _funMap <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
411 _funMap set: "if" _compileIf |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
412 _funMap set: "if:else" _compileIfElse |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
413 //_funMap set: "while:do" _compileWhileDo |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
414 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
415 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
416 |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
417 llFun:syms:code:returns <- :name :syms :code :returnType{ |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
418 _initHandlers: |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
419 syms <- symbols tableWithParent: syms |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
420 |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
421 rType <- _parseType: returnType |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
422 _notError: [rType] { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
423 argErrors <- [] |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
424 foreach: (code args) :argnum argsym { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
425 (argsym type) value: :typeexpr { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
426 type <- _parseType: typeexpr |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
427 _notError: [type] { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
428 arg <- argsym name |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
429 if: (arg startsWith?: ":") { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
430 arg <- arg from: 1 |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
431 } |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
432 syms define: arg #{ |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
433 val <- il arg: argnum |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
434 size <- type size |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
435 signed? <- type signed? |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
436 } |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
437 } else: :err { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
438 argErrors <- err | argErrors |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
439 } |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
440 } none: { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
441 argErrors <- (_compileError: "Arguments to llFun must have type declarations" 0) | argErrors |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
442 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
443 } |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
444 |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
445 |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
446 |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
447 |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
448 if: (argErrors empty?) { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
449 ilf <- _ilFun: name |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
450 last <- option none |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
451 numexprs <- (code expressions) length |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
452 foreach: (code expressions) :idx expr { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
453 asn <- if: idx = numexprs - 1 { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
454 option value: #{ |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
455 val <- ilf getReg |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
456 //TODO: FIxme |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
457 size <- il q |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
458 signed? <- true |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
459 } |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
460 } else: { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
461 option none |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
462 } |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
463 last <- option value: (_compileExpr: expr syms: syms ilfun: ilf dest: asn) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
464 } |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
465 last value: :v { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
466 ilf add: (il return: (v val) (v size)) |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
467 } none: { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
468 ilf add: (il return: 0 (il l)) |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
469 } |
361
06dceff348ea
llcompile now has Hacky support for calling C functions using dl to lookup symbols and almost has support string constants
Michael Pavone <pavone@retrodev.com>
parents:
360
diff
changeset
|
470 ilf finalize |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
471 ilf |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
472 } else: { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
473 argErrors |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
474 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
475 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
476 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
477 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
478 compileText <- :text { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
479 res <- parser top: text |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
480 if: res { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
481 tree <- res yield |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
482 if: (tree nodeType) = obj { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
483 errors <- [] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
484 syms <- symbols table |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
485 functions <- (tree messages) fold: [] with: :curfuncs msg { |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
486 if: (msg nodeType) = assignment { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
487 def <- msg assign |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
488 if: (def nodeType) = call { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
489 if: ((def tocall) name) = "llFun:returns" { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
490 if: ((def args) length) = 2 { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
491 fname <- (msg to) name |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
492 syms define: fname #{ |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
493 type <- "topfun" |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
494 } |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
495 #{ |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
496 name <- fname |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
497 body <- (def args) value |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
498 returnType <- ((def args) tail) value |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
499 } | curfuncs |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
500 } else: { |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
501 errors <- ( |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
502 _compileError: "llFun:returns takes exactly 2 arguments" 0 |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
503 ) | errors |
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
504 curfuncs |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
505 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
506 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
507 errors <- ( |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
508 _compileError: "Top level definitions must be a call to llFun:returns" 0 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
509 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
510 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
511 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
512 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
513 errors <- ( |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
514 _compileError: "Right side of top-level assignment must be a call expression" 0 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
515 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
516 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
517 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
518 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
519 errors <- ( |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
520 _compileError: "Only assignment expresions are allowed in top level object" 0 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
521 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
522 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
523 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
524 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
525 if: (errors empty?) { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
526 errors <- [] |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
527 fmap <- functions fold: (dict hash) with: :acc func { |
360
0b83f15e819d
Update llcompile for changes to llFun syntax
Michael Pavone <pavone@retrodev.com>
parents:
357
diff
changeset
|
528 ilf <- llFun: (func name) syms: syms code: (func body) returns: (func returnType) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
529 _notError: ilf { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
530 acc set: (func name) (ilf buffer) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
531 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
532 errors <- ilf . errors |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
533 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
534 acc |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
535 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
536 if: (errors empty?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
537 foreach: fmap :name instarr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
538 print: "Function: " . name . "\n" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
539 foreach: instarr :_ inst { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
540 print: "\t" . inst . "\n" |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
541 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
542 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
543 print: "Translating IL to x86\n" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
544 il toBackend: fmap x86 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
545 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
546 errors |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
547 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
548 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
549 errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
550 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
551 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
552 [(_compileError: "Top level must be an object in llcompile dialect" 1)] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
553 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
554 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
555 [(_compileError: "Failed to parse file" 0)] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
556 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
557 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
558 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
559 main <- :args { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
560 if: (length: args) > 1 { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
561 text <- (file open: (args get: 1)) readAll |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
562 mcode <- compileText: text |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
563 _notError: mcode { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
564 ba <- bytearray executableFromBytes: mcode |
357
f237d0cae58b
llcompile now works well enough for the a simple fib program to work
Michael Pavone <pavone@retrodev.com>
parents:
356
diff
changeset
|
565 arg <- if: (length: args) > 2 { int64: (args get: 2) } else: {0} |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
566 res <- ba runWithArg: (arg int64) |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
567 print: (string: res) . "\n" |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
568 } else: :err { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
569 (file stderr) write: (err msg) . "\n" |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
570 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
571 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
572 (file stderr) write: "Usage: llcompile FILE\n" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
573 1 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
574 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
575 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
576 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
577 } |