diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/ir.h | 42 |
2 files changed, 25 insertions, 19 deletions
@@ -15,7 +15,7 @@ BIN := $(BUILD_DIR)/$(TARGET) | |||
15 | 15 | ||
16 | # Compiler and linker configuration. | 16 | # Compiler and linker configuration. |
17 | CC := cc | 17 | CC := cc |
18 | CFLAGS := -Wall -Wextra -pedantic -DBIN_NAME=\"$(TARGET)\" | 18 | CFLAGS := -Wall -Wextra -pedantic -DBIN_NAME=\"$(TARGET)\" -Wno-missing-braces |
19 | CFLAGS += $(INC_FLAGS) | 19 | CFLAGS += $(INC_FLAGS) |
20 | NASM_FLAGS ?= -felf64 | 20 | NASM_FLAGS ?= -felf64 |
21 | LDFLAGS := | 21 | LDFLAGS := |
@@ -132,7 +132,13 @@ typedef struct ProgramIr { | |||
132 | 132 | ||
133 | #define INST_ARG(PROC, OP, ARG, LINE, COL) \ | 133 | #define INST_ARG(PROC, OP, ARG, LINE, COL) \ |
134 | do { \ | 134 | do { \ |
135 | Instruction inst = (Instruction){(OP), (ARG), (LINE), (COL)}; \ | 135 | Instruction inst = (Instruction){(OP), .argument = (ARG), (LINE), (COL)}; \ |
136 | array_push((PROC)->instructions, inst); \ | ||
137 | } while(false); | ||
138 | |||
139 | #define INST_LABEL(PROC, OP, ARG, LINE, COL) \ | ||
140 | do { \ | ||
141 | Instruction inst = (Instruction){(OP), .label_id = (ARG), (LINE), (COL)}; \ | ||
136 | array_push((PROC)->instructions, inst); \ | 142 | array_push((PROC)->instructions, inst); \ |
137 | } while(false); | 143 | } while(false); |
138 | 144 | ||
@@ -208,15 +214,15 @@ compile_numeric_cmp(ProgramIr *program, Procedure *proc, Op op, | |||
208 | args = args->tail; | 214 | args = args->tail; |
209 | INST_SIMPLE(proc, OP_DUP, line, col); | 215 | INST_SIMPLE(proc, OP_DUP, line, col); |
210 | INST_SIMPLE(proc, OP_ROT_RIGHT, line, col); | 216 | INST_SIMPLE(proc, OP_ROT_RIGHT, line, col); |
211 | INST_ARG(proc, op, label_false, line, col); | 217 | INST_LABEL(proc, op, label_false, line, col); |
212 | } | 218 | } |
213 | INST_SIMPLE(proc, OP_DROP, line, col); | 219 | INST_SIMPLE(proc, OP_DROP, line, col); |
214 | INST_ARG(proc, OP_PUSH, &obj_true, line, col); | 220 | INST_ARG(proc, OP_PUSH, &obj_true, line, col); |
215 | INST_ARG(proc, OP_JUMP, label_exit, line, col); | 221 | INST_LABEL(proc, OP_JUMP, label_exit, line, col); |
216 | INST_ARG(proc, OP_LABEL, label_false, line, col); | 222 | INST_LABEL(proc, OP_LABEL, label_false, line, col); |
217 | INST_SIMPLE(proc, OP_DROP, line, col); | 223 | INST_SIMPLE(proc, OP_DROP, line, col); |
218 | INST_ARG(proc, OP_PUSH, &obj_false, line, col); | 224 | INST_ARG(proc, OP_PUSH, &obj_false, line, col); |
219 | INST_ARG(proc, OP_LABEL, label_exit, line, col); | 225 | INST_LABEL(proc, OP_LABEL, label_exit, line, col); |
220 | } | 226 | } |
221 | 227 | ||
222 | void | 228 | void |
@@ -244,13 +250,13 @@ compile_and(ProgramIr *program, Procedure *proc, | |||
244 | while (args != NULL) { | 250 | while (args != NULL) { |
245 | compile_object(program, proc, args->head); | 251 | compile_object(program, proc, args->head); |
246 | args = args->tail; | 252 | args = args->tail; |
247 | INST_ARG(proc, OP_JUMP_IF_FALSE, label_false, line, col); | 253 | INST_LABEL(proc, OP_JUMP_IF_FALSE, label_false, line, col); |
248 | } | 254 | } |
249 | INST_ARG(proc, OP_PUSH, &obj_true, line, col); | 255 | INST_ARG(proc, OP_PUSH, &obj_true, line, col); |
250 | INST_ARG(proc, OP_JUMP, label_exit, line, col); | 256 | INST_LABEL(proc, OP_JUMP, label_exit, line, col); |
251 | INST_ARG(proc, OP_LABEL, label_false, line, col); | 257 | INST_LABEL(proc, OP_LABEL, label_false, line, col); |
252 | INST_ARG(proc, OP_PUSH, &obj_false, line, col); | 258 | INST_ARG(proc, OP_PUSH, &obj_false, line, col); |
253 | INST_ARG(proc, OP_LABEL, label_exit, line, col); | 259 | INST_LABEL(proc, OP_LABEL, label_exit, line, col); |
254 | } | 260 | } |
255 | 261 | ||
256 | void | 262 | void |
@@ -261,13 +267,13 @@ compile_or(ProgramIr *program, Procedure *proc, | |||
261 | while (args != NULL) { | 267 | while (args != NULL) { |
262 | compile_object(program, proc, args->head); | 268 | compile_object(program, proc, args->head); |
263 | args = args->tail; | 269 | args = args->tail; |
264 | INST_ARG(proc, OP_JUMP_IF_TRUE, label_true, line, col); | 270 | INST_LABEL(proc, OP_JUMP_IF_TRUE, label_true, line, col); |
265 | } | 271 | } |
266 | INST_ARG(proc, OP_PUSH, &obj_false, line, col); | 272 | INST_ARG(proc, OP_PUSH, &obj_false, line, col); |
267 | INST_ARG(proc, OP_JUMP, label_exit, line, col); | 273 | INST_LABEL(proc, OP_JUMP, label_exit, line, col); |
268 | INST_ARG(proc, OP_LABEL, label_true, line, col); | 274 | INST_LABEL(proc, OP_LABEL, label_true, line, col); |
269 | INST_ARG(proc, OP_PUSH, &obj_true, line, col); | 275 | INST_ARG(proc, OP_PUSH, &obj_true, line, col); |
270 | INST_ARG(proc, OP_LABEL, label_exit, line, col); | 276 | INST_LABEL(proc, OP_LABEL, label_exit, line, col); |
271 | } | 277 | } |
272 | 278 | ||
273 | void | 279 | void |
@@ -332,16 +338,16 @@ void | |||
332 | compile_if(ProgramIr *program, Procedure *proc, Object *obj) { | 338 | compile_if(ProgramIr *program, Procedure *proc, Object *obj) { |
333 | size_t label_false = program->labels++; | 339 | size_t label_false = program->labels++; |
334 | compile_object(program, proc, obj->condition); | 340 | compile_object(program, proc, obj->condition); |
335 | INST_ARG(proc, OP_JUMP_IF_FALSE, label_false, obj->line, obj->col); | 341 | INST_LABEL(proc, OP_JUMP_IF_FALSE, label_false, obj->line, obj->col); |
336 | compile_object(program, proc, obj->expr_true); | 342 | compile_object(program, proc, obj->expr_true); |
337 | if (obj->expr_false != NULL) { | 343 | if (obj->expr_false != NULL) { |
338 | size_t label_exit = program->labels++; | 344 | size_t label_exit = program->labels++; |
339 | INST_ARG(proc, OP_JUMP, label_exit, obj->line, obj->col); | 345 | INST_LABEL(proc, OP_JUMP, label_exit, obj->line, obj->col); |
340 | INST_ARG(proc, OP_LABEL, label_false, obj->line, obj->col); | 346 | INST_LABEL(proc, OP_LABEL, label_false, obj->line, obj->col); |
341 | compile_object(program, proc, obj->expr_false); | 347 | compile_object(program, proc, obj->expr_false); |
342 | INST_ARG(proc, OP_LABEL, label_exit, obj->line, obj->col); | 348 | INST_LABEL(proc, OP_LABEL, label_exit, obj->line, obj->col); |
343 | } else { | 349 | } else { |
344 | INST_ARG(proc, OP_LABEL, label_false, obj->line, obj->col); | 350 | INST_LABEL(proc, OP_LABEL, label_false, obj->line, obj->col); |
345 | } | 351 | } |
346 | } | 352 | } |
347 | 353 | ||