AINSTR_END, /* array */
};
+/* protos */
+static void ir_gen_extparam(ir_builder *ir);
+
+/* error functions */
+
static void irerror(lex_ctx ctx, const char *msg, ...)
{
va_list ap;
ir_value *param = instr->params[p];
ir_value *targetparam;
- if (p-8 >= vec_size(ir->extparams)) {
- irerror(instr->context, "Not enough extparam-globals have been created");
- return false;
- }
+ if (p-8 >= vec_size(ir->extparams))
+ ir_gen_extparam(ir);
targetparam = ir->extparams[p-8];
if (vec_size(irfun->locals)) {
ir_value *last = vec_last(irfun->locals);
local_var_end = last->code.globaladdr;
- local_var_end += type_sizeof[last->vtype];
+ if (last->vtype == TYPE_FIELD && last->fieldtype == TYPE_VECTOR)
+ local_var_end += type_sizeof[TYPE_VECTOR];
+ else
+ local_var_end += type_sizeof[last->vtype];
}
for (i = 0; i < vec_size(irfun->values); ++i)
{
fun.locals = vec_size(code_globals) - fun.firstlocal;
if (irfun->builtin)
- fun.entry = irfun->builtin;
+ fun.entry = irfun->builtin+1;
else {
irfun->code_function_def = vec_size(code_functions);
fun.entry = vec_size(code_statements);