return false;
}
- self->curblock = ir_function_create_block(irf, "entry");
+ self->curblock = ir_function_create_block(ast_ctx(self), irf, "entry");
if (!self->curblock) {
asterror(ast_ctx(self), "failed to allocate entry block for `%s`", self->name);
return false;
*/
merge_id = vec_size(func->ir_func->blocks);
- merge = ir_function_create_block(func->ir_func, ast_function_label(func, "sce_merge"));
+ merge = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "sce_merge"));
cgen = self->left->expression.codegen;
if (!(*cgen)((ast_expression*)(self->left), func, false, &left))
}
from_left = func->curblock;
- other = ir_function_create_block(func->ir_func, ast_function_label(func, "sce_other"));
+ other = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "sce_other"));
if ( !(self->op == INSTR_OR) != !OPTS_FLAG(PERL_LOGIC) ) {
if (!ir_block_create_if(func->curblock, left, other, merge))
return false;
if (self->on_true) {
/* create on-true block */
- ontrue = ir_function_create_block(func->ir_func, ast_function_label(func, "ontrue"));
+ ontrue = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "ontrue"));
if (!ontrue)
return false;
/* on-false path */
if (self->on_false) {
/* create on-false block */
- onfalse = ir_function_create_block(func->ir_func, ast_function_label(func, "onfalse"));
+ onfalse = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "onfalse"));
if (!onfalse)
return false;
onfalse = NULL;
/* Merge block were they all merge in to */
- merge = ir_function_create_block(func->ir_func, ast_function_label(func, "endif"));
+ merge = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "endif"));
if (!merge)
return false;
/* add jumps ot the merge block */
ir_instr *phi;
ir_block *cond = func->curblock;
- ir_block *ontrue;
- ir_block *onfalse;
+ ir_block *ontrue, *ontrue_out = NULL;
+ ir_block *onfalse, *onfalse_out = NULL;
ir_block *merge;
/* Ternary can never create an lvalue... */
return false;
/* create on-true block */
- ontrue = ir_function_create_block(func->ir_func, ast_function_label(func, "tern_T"));
+ ontrue = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "tern_T"));
if (!ontrue)
return false;
else
cgen = self->on_true->expression.codegen;
if (!(*cgen)((ast_expression*)(self->on_true), func, false, &trueval))
return false;
+
+ ontrue_out = func->curblock;
}
/* create on-false block */
- onfalse = ir_function_create_block(func->ir_func, ast_function_label(func, "tern_F"));
+ onfalse = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "tern_F"));
if (!onfalse)
return false;
else
cgen = self->on_false->expression.codegen;
if (!(*cgen)((ast_expression*)(self->on_false), func, false, &falseval))
return false;
+
+ onfalse_out = func->curblock;
}
/* create merge block */
- merge = ir_function_create_block(func->ir_func, ast_function_label(func, "tern_out"));
+ merge = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "tern_out"));
if (!merge)
return false;
/* jump to merge block */
- if (!ir_block_create_jump(ontrue, merge))
+ if (!ir_block_create_jump(ontrue_out, merge))
return false;
- if (!ir_block_create_jump(onfalse, merge))
+ if (!ir_block_create_jump(onfalse_out, merge))
return false;
/* create if instruction */
phi = ir_block_create_phi(merge, ast_function_label(func, "phi"), trueval->vtype);
if (!phi)
return false;
- ir_phi_add(phi, ontrue, trueval);
- ir_phi_add(phi, onfalse, falseval);
+ ir_phi_add(phi, ontrue_out, trueval);
+ ir_phi_add(phi, onfalse_out, falseval);
self->expression.outr = ir_phi_value(phi);
*out = self->expression.outr;
*/
if (self->precond)
{
- bprecond = ir_function_create_block(func->ir_func, ast_function_label(func, "pre_loop_cond"));
+ bprecond = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "pre_loop_cond"));
if (!bprecond)
return false;
* generate them this early for 'break' and 'continue'.
*/
if (self->increment) {
- bincrement = ir_function_create_block(func->ir_func, ast_function_label(func, "loop_increment"));
+ bincrement = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "loop_increment"));
if (!bincrement)
return false;
bcontinue = bincrement; /* increment comes before the pre-loop-condition */
}
if (self->postcond) {
- bpostcond = ir_function_create_block(func->ir_func, ast_function_label(func, "post_loop_cond"));
+ bpostcond = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "post_loop_cond"));
if (!bpostcond)
return false;
bcontinue = bpostcond; /* postcond comes before the increment */
}
bout_id = vec_size(func->ir_func->blocks);
- bout = ir_function_create_block(func->ir_func, ast_function_label(func, "after_loop"));
+ bout = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "after_loop"));
if (!bout)
return false;
bbreak = bout;
/* The loop body... */
if (self->body)
{
- bbody = ir_function_create_block(func->ir_func, ast_function_label(func, "loop_body"));
+ bbody = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "loop_body"));
if (!bbody)
return false;
}
bout_id = vec_size(func->ir_func->blocks);
- bout = ir_function_create_block(func->ir_func, ast_function_label(func, "after_switch"));
+ bout = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "after_switch"));
if (!bout)
return false;
if (!cond)
return false;
- bcase = ir_function_create_block(func->ir_func, ast_function_label(func, "case"));
+ bcase = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "case"));
bnot_id = vec_size(func->ir_func->blocks);
- bnot = ir_function_create_block(func->ir_func, ast_function_label(func, "not_case"));
+ bnot = ir_function_create_block(ast_ctx(self), func->ir_func, ast_function_label(func, "not_case"));
if (!bcase || !bnot)
return false;
if (!ir_block_create_if(func->curblock, cond, bcase, bnot))
}
/* simply create a new block and jump to it */
- self->irblock = ir_function_create_block(func->ir_func, self->name);
+ self->irblock = ir_function_create_block(ast_ctx(self), func->ir_func, self->name);
if (!self->irblock) {
asterror(ast_ctx(self), "failed to allocate label block `%s`", self->name);
return false;