if (!f->jmps)
goto _jmps_error;
+ f->tmp_vars = scf_vector_alloc();
+ if (!f->tmp_vars)
+ goto _tmp_vars_error;
+
f->bb_loops = scf_vector_alloc();
if (!f->bb_loops)
goto _loop_error;
_group_error:
scf_vector_free(f->bb_loops);
_loop_error:
+ scf_vector_free(f->tmp_vars);
+_tmp_vars_error:
scf_vector_free(f->jmps);
_jmps_error:
scf_vector_free(f->caller_functions);
f->jmps = NULL;
}
+ if (f->tmp_vars) {
+ scf_vector_free(f->tmp_vars);
+ f->tmp_vars = NULL;
+ }
+
if (f->text_relas) {
scf_vector_free(f->text_relas);
f->text_relas = NULL;
scf_string_t* signature;
- scf_vector_t* typedef_vars;
-
scf_list_t list; // for scope
scf_list_t hash; // for global search
int score; // overloaded score
scf_vector_t* jmps;
+ scf_vector_t* tmp_vars;
scf_list_t dag_list_head;
jnext = scf_3ac_jmp_code(SCF_OP_GOTO, NULL);
scf_list_add_tail(d->_3ac_list_head, &jnext->list);
- scf_vector_add(up_branch_ops->_breaks, jnext);
+
+ int ret = scf_vector_add(d->branch_ops->_breaks, jnext);
+ if (ret < 0)
+ return ret;
dst = jnot->dsts->data[0];
dst->code = jnext;
scf_list_add_tail(d->_3ac_list_head, &cmp->list);
scf_list_add_tail(d->_3ac_list_head, &jnot->list);
- scf_vector_add(up_branch_ops->_breaks, jnot);
+ int ret = scf_vector_add(d->branch_ops->_breaks, jnot);
+ if (ret < 0)
+ return ret;
}
if (jnext) {
if (ret < 0)
return ret;
bb->native_flag = 1;
- scf_logd("************ bb: %d\n", bb->index);
+ scf_logd("************ bb: %d\n\n", bb->index);
ret = x64_save_bb_colors(bb->dn_colors_exit, bbg, bb);
if (ret < 0)
_x64_set_offset_for_relas(ctx, f, f->text_relas);
_x64_set_offset_for_relas(ctx, f, f->data_relas);
+
+ for (i = 0; i < f->tmp_vars->size; i++) {
+ v = f->tmp_vars->data[i];
+ v->bp_offset = 0;
+ }
+
+ scf_vector_clear(f->tmp_vars, NULL);
return 0;
}
} else {
scf_rela_t* rela = NULL;
+ if (0 == dst->var->bp_offset
+ && !dst->var->global_flag
+ && !dst->var->local_flag) {
+
+ int ret = x64_tmp_bp_offset(dst->var, f);
+ if (ret < 0)
+ return ret;
+ }
+
mov = x64_find_OpCode(SCF_X64_MOV, dst->var->size, dst->var->size, SCF_X64_G2E);
inst = x64_make_inst_G2M(&rela, mov, dst->var, NULL, result, c, f);
X64_INST_ADD_CHECK(c, inst, rela);
return colors;
}
+int x64_tmp_bp_offset(scf_variable_t* v, scf_function_t* f)
+{
+ if (f->inline_flag) {
+ assert(!scf_vector_find(f->tmp_vars, v));
+
+ int ret = scf_vector_add(f->tmp_vars, v);
+ if (ret < 0)
+ return ret;
+ }
+
+ int size = f->local_vars_size + x64_variable_size(v);
+
+ if (size & 0x7)
+ size = (size + 7) & ~0x7;
+
+ v->bp_offset = -size;
+ v->tmp_flag = 1;
+
+ f->local_vars_size = size;
+ return 0;
+}
+
int x64_save_var2(scf_dag_node_t* dn, scf_register_t* r, scf_3ac_code_t* c, scf_function_t* f)
{
scf_variable_t* v = dn->var;
// if temp var in register, alloc it in stack
if (0 == v->bp_offset && !v->global_flag && !v->local_flag) {
- int local_vars_size = f->local_vars_size;
- local_vars_size += var_size;
-
- if (local_vars_size & 0x7)
- local_vars_size = (local_vars_size + 7) >> 3 << 3;
-
- v->bp_offset = -local_vars_size;
- v->tmp_flag = 1;
-
- f->local_vars_size = local_vars_size;
+ int ret = x64_tmp_bp_offset(v, f);
+ if (ret < 0)
+ return ret;
#if 0
scf_logw("r: %s, temp var, ", r->name);
if (v->w)
int x64_reg_cached_vars(scf_register_t* r);
+int x64_tmp_bp_offset(scf_variable_t* v, scf_function_t* f);
+
int x64_save_var(scf_dag_node_t* dn, scf_3ac_code_t* c, scf_function_t* f);
int x64_save_var2(scf_dag_node_t* dn, scf_register_t* r, scf_3ac_code_t* c, scf_function_t* f);