X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fbe%2Ffirm%2Fbearch_firm.c;h=96f42a3160e01a73044b981ab5aa2cb9d63626df;hb=0ede039789208c6193a14b4505417a4995369516;hp=e1e934e26858786e070a103773042ebd61dafb17;hpb=bea700ecc61bc5228929abaf9e94de34092a04de;p=libfirm diff --git a/ir/be/firm/bearch_firm.c b/ir/be/firm/bearch_firm.c index e1e934e26..96f42a316 100644 --- a/ir/be/firm/bearch_firm.c +++ b/ir/be/firm/bearch_firm.c @@ -21,6 +21,7 @@ #include "irgwalk.h" #include "type.h" +#include "../be_t.h" #include "../bearch.h" #include "../besched.h" #include "../beutil.h" @@ -205,9 +206,16 @@ static const arch_register_class_t *firm_get_reg_class_for_mode(const void *self static void firm_get_call_abi(const void *self, ir_type *method_type, be_abi_call_t *abi) { + static ir_type *between_type = NULL; const arch_register_class_t *cls = ®_classes[CLS_DATAB]; int i, n; + if(!between_type) { + between_type = new_type_class(new_id_from_str("firm_be_between")); + set_type_size_bytes(between_type, 0); + } + + for(i = 0, n = get_method_n_params(method_type); i < n; ++i) { ir_type *t = get_method_param_type(method_type, i); if(is_Primitive_type(t)) @@ -222,7 +230,7 @@ static void firm_get_call_abi(const void *self, ir_type *method_type, be_abi_cal be_abi_call_res_reg(abi, i, &cls->regs[i]); } - be_abi_call_set_flags(abi, BE_ABI_NONE, 0); + be_abi_call_set_flags(abi, BE_ABI_NONE, between_type); } @@ -328,7 +336,13 @@ static arch_irn_flags_t firm_get_flags(const void *self, const ir_node *irn) return res; } -static void firm_set_stack_bias(const void *self, ir_node *irn, int bias) { +static void firm_set_stack_bias(const void *self, ir_node *irn, int bias) +{ +} + +static entity *firm_get_frame_entity(const void *self, const ir_node *irn) +{ + return NULL; } static const arch_irn_ops_if_t firm_irn_ops_if = { @@ -337,6 +351,7 @@ static const arch_irn_ops_if_t firm_irn_ops_if = { firm_get_irn_reg, firm_classify, firm_get_flags, + firm_get_frame_entity, firm_set_stack_bias }; @@ -532,7 +547,7 @@ static void firm_codegen_done(void *self) free(self); } -static void *firm_cg_init(FILE *file_handle, ir_graph *irg, const arch_env_t *env); +static void *firm_cg_init(FILE *file_handle, const be_irg_t *birg); static const arch_code_generator_if_t firm_code_gen_if = { firm_cg_init, @@ -544,11 +559,11 @@ static const arch_code_generator_if_t firm_code_gen_if = { firm_codegen_done }; -static void *firm_cg_init(FILE *file_handle, ir_graph *irg, const arch_env_t *env) +static void *firm_cg_init(FILE *file_handle, const be_irg_t *birg) { firm_code_gen_t *cg = xmalloc(sizeof(*cg)); cg->impl = &firm_code_gen_if; - cg->irg = irg; + cg->irg = birg->irg; return cg; }