static ir_node *break_label;
static ir_node *current_switch_cond;
static bool saw_default_label;
-static ir_node **imature_blocks;
+static ir_node **immature_blocks;
static bool constant_folding;
static const declaration_t *current_function_decl;
if (declaration->v.entity == rts_entities[rts_alloca]) {
/* handle alloca() call */
expression_t *argument = call->arguments->expression;
- ir_node *size = expression_to_firm(argument);
+ ir_node *size = expression_to_firm(argument);
- size = create_conv(dbgi, size, get_ir_mode(type_size_t));
+ size = create_conv(dbgi, size, get_ir_mode(type_size_t));
- ir_node *store = get_store();
- dbg_info *dbgi = get_dbg_info(&call->base.source_position);
- ir_node *alloca = new_d_Alloc(dbgi, store, size, firm_unknown_type,
- stack_alloc);
- ir_node *proj_m = new_Proj(alloca, mode_M, pn_Alloc_M);
+ ir_node *store = get_store();
+ dbg_info *dbgi = get_dbg_info(&call->base.source_position);
+ ir_node *alloca = new_d_Alloc(dbgi, store, size, firm_unknown_type,
+ stack_alloc);
+ ir_node *proj_m = new_Proj(alloca, mode_M, pn_Alloc_M);
set_store(proj_m);
- ir_node *res = new_Proj(alloca, mode_P_data, pn_Alloc_res);
+ ir_node *res = new_Proj(alloca, mode_P_data, pn_Alloc_res);
return res;
}
result = new_d_Proj(dbgi, resproj, mode, 0);
}
+ if (function->kind == EXPR_REFERENCE &&
+ function->reference.declaration->modifiers & DM_NORETURN) {
+ /* A dead end: Keep the Call and the Block. Also place all further
+ * nodes into a new and unreachable block. */
+ keep_alive(node);
+ keep_alive(get_cur_block());
+ new_Block(0, NULL);
+ }
+
return result;
}
mature_immBlock(one_block);
mature_immBlock(zero_block);
- ir_node *common_block = new_immBlock();
- add_immBlock_pred(common_block, jmp_one);
- add_immBlock_pred(common_block, jmp_zero);
- mature_immBlock(common_block);
+ ir_node *in_cf[2] = { jmp_one, jmp_zero };
+ new_Block(2, in_cf);
ir_node *in[2] = { one, zero };
ir_node *val = new_d_Phi(dbgi, 2, in, mode);
dbg_info *const dbgi = get_dbg_info(&expression->base.source_position);
const expression_t *left_expr = expression->left;
ir_mode *left_mode = get_ir_mode(left_expr->base.type);
+ ir_node *right = expression_to_firm(expression->right);
ir_node *left_addr = expression_to_addr(left_expr);
ir_node *left = get_value_from_lvalue(left_expr, left_addr);
- ir_node *right = expression_to_firm(expression->right);
ir_node *result = create_op(dbgi, expression, left, right);
result = create_conv(dbgi, result, left_mode);
mature_immBlock(false_block);
/* create the common block */
- ir_node *common_block = new_immBlock();
- add_immBlock_pred(common_block, true_jmp);
- add_immBlock_pred(common_block, false_jmp);
- mature_immBlock(common_block);
+ ir_node *in_cf[2] = { true_jmp, false_jmp };
+ new_Block(2, in_cf);
/* TODO improve static semantics, so either both or no values are NULL */
if (true_val == NULL || false_val == NULL)
}
mature_immBlock(true_block);
- if (false_block != fallthrough_block) {
+ if (false_block != fallthrough_block && false_block != NULL) {
mature_immBlock(false_block);
}
if (fallthrough_block != NULL) {
add_immBlock_pred(body_block, header_jmp);
keep_alive(body_block);
+ set_cur_block(body_block);
+ keep_alive(get_store());
} else {
if (false_block == NULL) {
false_block = new_immBlock();
false_block);
} else {
keep_alive(header_block);
+ keep_alive(get_store());
jmp = new_Jmp();
add_immBlock_pred(body_block, jmp);
}
/* default case */
continue;
}
- for (long cns = l->first_case; cns <= l->last_case; ++cns)
- ++num_cases;
+ if (l->last_case >= l->first_case)
+ num_cases += l->last_case - l->first_case;
if (l->last_case > def_nr)
def_nr = l->last_case;
}
set_cur_block(old_block);
if (statement->expression != NULL) {
- long start_pn = statement->first_case;
- long end_pn = statement->last_case;
- assert(start_pn <= end_pn);
+ long pn = statement->first_case;
+ long end_pn = statement->last_case;
+ assert(pn <= end_pn);
/* create jumps for all cases in the given range */
- for (long pn = start_pn; pn <= end_pn; ++pn) {
+ do {
proj = new_d_Proj(dbgi, current_switch_cond, mode_X, pn);
add_immBlock_pred(block, proj);
- }
+ } while(pn++ < end_pn);
} else {
saw_default_label = true;
proj = new_d_defaultProj(dbgi, current_switch_cond,
label->declaration_kind = DECLARATION_KIND_LABEL_BLOCK;
label->v.block = block;
- ARR_APP1(ir_node *, imature_blocks, block);
+ ARR_APP1(ir_node *, immature_blocks, block);
return block;
}
}
set_cur_block(block);
+ keep_alive(get_store());
keep_alive(block);
if (statement->statement != NULL) {
current_function_name = NULL;
current_funcsig = NULL;
- assert(imature_blocks == NULL);
- imature_blocks = NEW_ARR_F(ir_node*, 0);
+ assert(immature_blocks == NULL);
+ immature_blocks = NEW_ARR_F(ir_node*, 0);
int n_local_vars = get_function_n_local_vars(declaration);
ir_graph *irg = new_ir_graph(function_entity, n_local_vars);
add_immBlock_pred(end_block, ret);
}
- for(int i = 0; i < ARR_LEN(imature_blocks); ++i) {
- mature_immBlock(imature_blocks[i]);
+ for(int i = 0; i < ARR_LEN(immature_blocks); ++i) {
+ mature_immBlock(immature_blocks[i]);
}
- DEL_ARR_F(imature_blocks);
- imature_blocks = NULL;
+ DEL_ARR_F(immature_blocks);
+ immature_blocks = NULL;
mature_immBlock(first_block);
mature_immBlock(end_block);
}
}
+static void set_be_option(const char *option)
+{
+ int res = firm_be_option(option);
+ assert(res);
+}
+
void init_ast2firm(void)
{
obstack_init(&asm_obst);
id_imp = new_id_from_chars("__imp_", 6);
/* OS option must be set to the backend */
- const char *s = "ia32-gasmode=linux";
switch (firm_opt.os_support) {
case OS_SUPPORT_MINGW:
create_ld_ident = create_ld_ident_win32;
- s = "ia32-gasmode=mingw";
+ set_be_option("ia32-gasmode=mingw");
break;
case OS_SUPPORT_LINUX:
create_ld_ident = create_ld_ident_linux_elf;
- s = "ia32-gasmode=elf";
+ set_be_option("ia32-gasmode=elf");
break;
case OS_SUPPORT_MACHO:
create_ld_ident = create_ld_ident_macho;
- s = "ia32-gasmode=macho";
+ set_be_option("ia32-gasmode=macho");
+ set_be_option("ia32-stackalign=4");
+ set_be_option("pic");
break;
}
- int res = firm_be_option(s);
- (void) res;
- assert(res);
/* create idents for all known runtime functions */
for (size_t i = 0; i < sizeof(rts_data) / sizeof(rts_data[0]); ++i) {
scope_to_firm(&unit->scope);
global_asm_to_firm(unit->global_asm);
+
+ current_ir_graph = NULL;
}