X-Git-Url: https://git.xonotic.org/?p=xonotic%2Fgmqcc.git;a=blobdiff_plain;f=ir.c;h=afe4a40d1d5258988dac2e665f43c75a37faca21;hp=4482d1d40b7e3371c994dc9c424755437d280980;hb=7a5bb207782c890852cdb00b731fda29ad0ce45b;hpb=d700bb66b28910b175789eb94f29f917202d95af diff --git a/ir.c b/ir.c index 4482d1d..afe4a40 100644 --- a/ir.c +++ b/ir.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 + * Copyright (C) 2012, 2013 * Wolfgang Bumiller * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -44,7 +44,8 @@ const char *type_name[TYPE_COUNT] = { "union", "array", - "nil" + "nil", + "" }; size_t type_sizeof_[TYPE_COUNT] = { @@ -62,6 +63,7 @@ size_t type_sizeof_[TYPE_COUNT] = { 0, /* TYPE_UNION */ 0, /* TYPE_ARRAY */ 0, /* TYPE_NIL */ + 0, /* TYPE_NOESPR */ }; uint16_t type_store_instr[TYPE_COUNT] = { @@ -85,6 +87,7 @@ uint16_t type_store_instr[TYPE_COUNT] = { AINSTR_END, /* union */ AINSTR_END, /* array */ AINSTR_END, /* nil */ + AINSTR_END, /* noexpr */ }; uint16_t field_store_instr[TYPE_COUNT] = { @@ -108,6 +111,7 @@ uint16_t field_store_instr[TYPE_COUNT] = { AINSTR_END, /* union */ AINSTR_END, /* array */ AINSTR_END, /* nil */ + AINSTR_END, /* noexpr */ }; uint16_t type_storep_instr[TYPE_COUNT] = { @@ -131,6 +135,7 @@ uint16_t type_storep_instr[TYPE_COUNT] = { AINSTR_END, /* union */ AINSTR_END, /* array */ AINSTR_END, /* nil */ + AINSTR_END, /* noexpr */ }; uint16_t type_eq_instr[TYPE_COUNT] = { @@ -154,6 +159,7 @@ uint16_t type_eq_instr[TYPE_COUNT] = { AINSTR_END, /* union */ AINSTR_END, /* array */ AINSTR_END, /* nil */ + AINSTR_END, /* noexpr */ }; uint16_t type_ne_instr[TYPE_COUNT] = { @@ -177,6 +183,7 @@ uint16_t type_ne_instr[TYPE_COUNT] = { AINSTR_END, /* union */ AINSTR_END, /* array */ AINSTR_END, /* nil */ + AINSTR_END, /* noexpr */ }; uint16_t type_not_instr[TYPE_COUNT] = { @@ -200,6 +207,7 @@ uint16_t type_not_instr[TYPE_COUNT] = { AINSTR_END, /* union */ AINSTR_END, /* array */ AINSTR_END, /* nil */ + AINSTR_END, /* noexpr */ }; /* protos */ @@ -772,8 +780,10 @@ bool ir_function_finalize(ir_function *self) } } - if (!ir_function_naive_phi(self)) + if (!ir_function_naive_phi(self)) { + irerror(self->context, "internal error: ir_function_naive_phi failed"); return false; + } for (i = 0; i < vec_size(self->locals); ++i) { ir_value *v = self->locals[i]; @@ -2930,6 +2940,8 @@ tailcall: if (param->vtype == TYPE_FIELD) stmt.opcode = field_store_instr[param->fieldtype]; + else if (param->vtype == TYPE_NIL) + stmt.opcode = INSTR_STORE_V; else stmt.opcode = type_store_instr[param->vtype]; stmt.o1.u1 = ir_value_code_addr(param); @@ -2957,6 +2969,8 @@ tailcall: if (param->vtype == TYPE_FIELD) stmt.opcode = field_store_instr[param->fieldtype]; + else if (param->vtype == TYPE_NIL) + stmt.opcode = INSTR_STORE_V; else stmt.opcode = type_store_instr[param->vtype]; stmt.o1.u1 = ir_value_code_addr(param); @@ -3637,6 +3651,12 @@ bool ir_builder_generate(ir_builder *self, const char *filename) } } + /* generate nil */ + ir_value_code_setaddr(self->nil, vec_size(code_globals)); + vec_push(code_globals, 0); + vec_push(code_globals, 0); + vec_push(code_globals, 0); + /* generate global temps */ self->first_common_globaltemp = vec_size(code_globals); for (i = 0; i < self->max_globaltemps; ++i) {