> In fact, I haven't tried to make big changes in how mflat option was > implemented. From my point of view, the goal was to facilitate mflat > option reintroduction first, and then improve it after. I hope you > understand. I know there's some place to improve, maybe you have start > to do it ?
Yes, I have changed a few things, patch attached. The basic stuff works, but not yet the fancy features (non-local gotos, setjmp/longjmp and exceptions). I'm also working on the GDB side. > So why mflat is like that we should ask the questions to 'wilson' who > did it in 92 (see revision 1275) ! Indeed, thanks for doing the archaeology. :-) * doc/invoke.texi (SPARC options): Add -mflat. * config/sparc/sparc.opt: Likewise. * config/sparc/sparc-protos.h (sparc_flat_expand_prologue): Declare. (sparc_flat_expand_epilogue): Likewise. (load_got_register): Likewise. * config/sparc/sparc.h (CPP_CPU_SPEC): Define _FLAT in flat mode. (SPARC_INCOMING_INT_ARG_FIRST): Add TARGET_FLAT handling. (INCOMING_REGNO): Likewise. (OUTGOING_REGNO): Likewise. (LOCAL_REGNO): Likewise. (FIXED_REGISTERS): Set 0 for %fp. (CALL_USED_REGISTERS): Likewise. (RETURN_ADDR_REGNUM): Define. (RETURN_ADDR_RTX): Use it. (EH_RETURN_HANDLER_RTX): Use it. (INCOMING_RETURN_ADDR_REGNUM): Define. (INCOMING_RETURN_ADDR_RTX): Use it. (DWARF_FRAME_RETURN_COLUMN): Likewise. (EH_RETURN_REGNUM): Define. (EH_RETURN_STACKADJ_RTX): Use it. (EPILOGUE_USES): Use them and add TARGET_FLAT handling. * config/sparc/sparc.c (struct machine_function): Add frame_size, apparent_frame_size, frame_base_reg, frame_base_offset, n_regs and save_local_in_regs_p fields. (sparc_frame_size, sparc_apparent_frame_size, sparc_frame_base_reg, sparc_frame_base_offset, sparc_n_regs, sparc_save_local_in_regs_p): New macros. (sparc_option_override): Error out if -fcall-saved-REG is specified for Out registers. (eligible_for_restore_insn): Fix formatting. (eligible_for_return_delay): Likewise. Add TARGET_FLAT handling. (load_got_register): Make global. (save_global_or_fp_reg_p): New predicate. (incoming_return_addr_reg_clobbered_p): Likewise. (save_local_or_in_reg_p): Likewise. (sparc_compute_frame_size): Use them. Add TARGET_FLAT handling. (SORR_SAVE, SORR_RESTORE): Delete. (sorr_pred_t): New typedef. (sorr_act_t): New enum. (save_or_restore_regs): Rename to... (emit_save_or_restore): ...this. Changed type of LOW/HIGH parameters remove ACTION parameter, add LEAF_FUNCTION_P, SAVE_P, ACTION_TRUE and ACTION_FALSE parameters. Implement more general mechanism. Add CFI information for double-word saves in 32-bit mode. (emit_adjust_base_to_offset): New function extracted from... (emit_save_or_restore_regs): ...this. Rename the rest to... (emit_save_or_restore_regs_global_fp_regs): ...this. (emit_save_or_restore_regs_local_in_regs): New function. (gen_create_flat_frame_[123]): New functions. (sparc_expand_prologue): Use SIZE local variable. Adjust. (sparc_flat_expand_prologue): New function. (sparc_asm_function_prologue): Add TARGET_FLAT handling. (sparc_expand_epilogue): Use SIZE local variable. Adjust. (sparc_flat_expand_epilogue): New function. (sparc_can_use_return_insn_p): Add TARGET_FLAT handling. (output_return): Likewise. (sparc_function_ok_for_sibcall): Likewise. (sparc_frame_pointer_required): Likewise. (sparc_can_eliminate): Call sparc_frame_pointer_required directly. (sparc_conditional_register_usage): If TARGET_FLAT, disable leaf function optimization. * config/sparc/sparc.md (flat): New attribute. (prologue): Add TARGET_FLAT handling. (epilogue): Likewise. (sibcall_epilogue): Likewise. (save_register_window): Disable if TARGET_FLAT. (create_flat_frame_[123]): New patterns. (return_internal): Add TARGET_FLAT handling. (flush_register_windows): Likewise. (goto_handler_and_restore): Likewise. (exception_receiver): New pattern. (builtin_setjmp_receiver): Likewise. -- Eric Botcazou
gcc-4.7-mflat-2.diff.gz
Description: GNU Zip compressed data