+/**
+ * Perform some fixups for variadic functions.
+ * To make the rest of the frontend code easier to understand we add
+ * "dummy" parameters until the number of parameters transmitted in registers.
+ * (because otherwise the backend wouldn't store the value of the register
+ * parameters into memory for the VLA magic)
+ */
+bool sparc_variadic_fixups(ir_graph *irg, calling_convention_t *cconv)
+{
+ ir_entity *entity = get_irg_entity(irg);
+ ir_type *mtp = get_entity_type(entity);
+ if (get_method_variadicity(mtp) != variadicity_variadic)
+ return false;
+
+ if (cconv->n_param_regs >= SPARC_N_PARAM_REGS)
+ return false;
+
+ {
+ size_t n_params = get_method_n_params(mtp);
+ type_dbg_info *dbgi = get_type_dbg_info(mtp);
+ size_t n_ress = get_method_n_ress(mtp);
+ size_t new_n_params
+ = n_params + (SPARC_N_PARAM_REGS - cconv->n_param_regs);
+ ir_type *new_mtp = new_d_type_method(new_n_params, n_ress, dbgi);
+ ir_mode *gp_reg_mode = sparc_reg_classes[CLASS_sparc_gp].mode;
+ ir_type *gp_reg_type = get_type_for_mode(gp_reg_mode);
+ ir_type *frame_type = get_irg_frame_type(irg);
+ size_t i;
+
+ for (i = 0; i < n_ress; ++i) {
+ ir_type *type = get_method_res_type(mtp, i);
+ set_method_res_type(new_mtp, i, type);
+ }
+ for (i = 0; i < n_params; ++i) {
+ ir_type *type = get_method_param_type(mtp, i);
+ set_method_param_type(new_mtp, i, type);
+ }
+ for ( ; i < new_n_params; ++i) {
+ set_method_param_type(new_mtp, i, gp_reg_type);
+ new_parameter_entity(frame_type, i, gp_reg_type);
+ }
+
+ set_method_variadicity(new_mtp, get_method_variadicity(mtp));
+ set_method_calling_convention(new_mtp, get_method_calling_convention(mtp));
+ set_method_additional_properties(new_mtp, get_method_additional_properties(mtp));
+ set_higher_type(new_mtp, mtp);
+
+ set_entity_type(entity, new_mtp);
+ }
+ return true;
+}
+
+static ir_type *compute_arg_type(ir_graph *irg, calling_convention_t *cconv,
+ ir_type *between_type)