removed firm proj num translation function, existing projs are renumbered instead
[libfirm] / ir / be / beabi.c
index 401503c..86d768c 100644 (file)
@@ -407,11 +407,12 @@ static ir_node *adjust_call(be_abi_irg_t *env, ir_node *irn, ir_node *curr_sp, i
        for(i = 0; i < n_params; ++i) {
                be_abi_call_arg_t *arg = get_call_arg(call, 0, i);
                assert(arg);
-               if(arg->on_stack) {
-                       stack_size += arg->space_before;
-                       stack_size =  round_up2(stack_size, arg->alignment);
-                       stack_size += get_type_size_bytes(get_method_param_type(mt, i));
-                       stack_size += arg->space_after;
+               if (arg->on_stack) {
+                       int arg_size = get_type_size_bytes(get_method_param_type(mt, i));
+
+                       stack_size += round_up2(arg->space_before, arg->alignment);
+                       stack_size += round_up2(arg_size, arg->alignment);
+                       stack_size += round_up2(arg->space_after, arg->alignment);
                        obstack_int_grow(obst, i);
                        n_pos++;
                }
@@ -1798,6 +1799,7 @@ be_abi_irg_t *be_abi_introduce(be_irg_t *birg)
        arch_env_push_irn_handler(env->birg->main_env->arch_env, &env->irn_handler);
 
        env->call->cb->done(env->cb);
+       env->cb = NULL;
        return env;
 }
 
@@ -1966,6 +1968,13 @@ ir_node *be_abi_get_callee_save_irn(be_abi_irg_t *abi, const arch_register_t *re
        return pmap_get(abi->regs, (void *) reg);
 }
 
+ir_node *be_abi_get_ignore_irn(be_abi_irg_t *abi, const arch_register_t *reg)
+{
+       assert(arch_register_type_is(reg, ignore));
+       assert(pmap_contains(abi->regs, (void *) reg));
+       return pmap_get(abi->regs, (void *) reg);
+}
+
 /*
   _____ _____  _   _   _    _                 _ _
  |_   _|  __ \| \ | | | |  | |               | | |
@@ -2078,3 +2087,11 @@ static const arch_irn_ops_if_t abi_irn_ops = {
 static const arch_irn_handler_t abi_irn_handler = {
        abi_get_irn_ops
 };
+
+/**
+ * Returns non-zero if the ABI has omitted the frame pointer in
+ * the current graph.
+ */
+int be_abi_omit_fp(const be_abi_irg_t *abi) {
+       return abi->call->flags.bits.try_omit_fp;
+}