> 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

Attachment: gcc-4.7-mflat-2.diff.gz
Description: GNU Zip compressed data

Reply via email to