Dear RMs,

I'd like to have permission to backport the new -mflat support for SPARC from 
the mainline to the 4.6 branch.  I received the first requests to reinstate 
the option last year, when Laurent (and some others) started to work on it,
but the initial patch was submitted too late in the 4.6 development cycle, due 
to technical and administrative issues.  I nevertheless think that it would be 
too bad to postpone its availabilty by another full year.

The bulk of the changes are to the SPARC back-end, but there are a few minor 
adjustments to the generic RTL code, namely 3 one-liners to builtins.c, cse.c 
and postreload-gcse.c.  I think that the risk for non-SPARC targets is nearly 
null (and is acceptable for the SPARC port at this point in the 4.6 cycle).

The patch has already been written and tested on the branch (on x86/Linux, 
SPARC/Solaris and SPARC64/Solaris) so it could be applied immediately.  The 
patches from mainline it is made up of are listed at the end of the message.

Can I proceed with the backport?


2011-06-10  Eric Botcazou  <ebotca...@adacore.com>
            Laurent Rougé  <laurent.ro...@menta.fr>

        * doc/invoke.texi (SPARC options): Add -mflat.
        * config/sparc/sparc.opt: Likewise.
        * config/sparc/sparc-protos.h (sparc_expand_epilogue): Add parameter.
        (sparc_flat_expand_prologue): Declare.
        (sparc_flat_expand_epilogue): Likewise.
        * config/sparc/sparc.h (CPP_CPU_SPEC): Do not handle -msoft-float.
        (CPP_ENDIAN_SPEC): Replace with...
        (CPP_OTHER_SPEC): ...this.  Also handle -mflat and -msoft-float.
        (CPP_SPEC): Adjust to above change.
        (EXTRA_SPECS): Likewise.
        (SPARC_INCOMING_INT_ARG_FIRST): Add TARGET_FLAT handling.
        (INCOMING_REGNO): Likewise.
        (OUTGOING_REGNO): Likewise.
        (LOCAL_REGNO): Likewise.
        (SETUP_FRAME_ADDRESSES): Likewise.
        (FIXED_REGISTERS): Set 0 for %fp.
        (CALL_USED_REGISTERS): Likewise.
        (INITIAL_ELIMINATION_OFFSET): Pass current_function_is_leaf.
        (EXIT_IGNORE_STACK): Define to 1 unconditionally.
        (RETURN_ADDR_REGNUM): Define.
        (RETURN_ADDR_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.
        (EH_RETURN_HANDLER_RTX): Delete.
        (EPILOGUE_USES): Use them and add TARGET_FLAT handling.
        * config/sparc/sparc.c (apparent_fsize, actual_fsize, num_gfregs):
        Delete.
        (struct machine_function): Add frame_size, apparent_frame_size,
        frame_base_reg, frame_base_offset, n_global_fp_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_global_fp_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.
        (eligible_for_sibcall_delay): Likewise.
        (RTX_OK_FOR_OFFSET_P, RTX_OK_FOR_OLO10_P): Add MODE parameter.
        (sparc_legitimate_address_p): Adjust to above change.
        (save_global_or_fp_reg_p): New predicate.
        (return_addr_reg_needed_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_regs): ...this.  Change type of LOW and 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.
        (output_sibcall): Likewise.
        (sparc_output_mi_thunk): Likewise.
        (sparc_frame_pointer_required): Likewise.
        (sparc_conditional_register_usage): If TARGET_FLAT, disable the leaf
        function optimization.
        * config/sparc/sparc.md (flat): New attribute.
        (prologue): Add TARGET_FLAT handling.
        (save_register_window): Disable if TARGET_FLAT.
        (create_flat_frame_[123]): New patterns.
        (epilogue): Add TARGET_FLAT handling.
        (sibcall_epilogue): Likewise.
        (eh_return): New expander.
        (eh_return_internal): New insn and splitter.
        (return_internal): Add TARGET_FLAT handling.
        (untyped_return): Remove bogus test and use RETURN_ADDR_REGNUM.
        (save_stack_nonlocal): Use RETURN_ADDR_REGNUM.
        (nonlocal_goto): Add TARGET_FLAT handling.
        * config/sparc/t-elf: Add -mflat multilib.
        * config/sparc/t-leon: Likewise.
        * config/sparc/linux-unwind.h (STACK_BIAS): Define.
        (sparc64_fallback_frame_state): Use it.
        (sparc64_frob_update_context): Further adjust context.
        * config/sparc/sol2-unwind.h (sparc64_frob_update_context): Likewise.
        * config/sparc/sol2-ci.asm: Add TARGET_FLAT handling.
        * config/sparc/sol2-cn.asm: Likewise.
testsuite/
        * gcc.dg/20020503-1.c: Add back -mflat option on the SPARC.
        * gcc.target/sparc/sparc-ret.c: Skip if -mflat is passed.

2011-06-10  Hans-Peter Nilsson  <h...@axis.com>

        * system.h (SETJMP_VIA_SAVE_AREA): Poison.

2011-06-02  Eric Botcazou  <ebotca...@adacore.com>

        * cse.c (cse_find_path): Refine change to exclude EDGE_ABNORMAL_CALL
        edges only, when there is a non-local label in the function.
        * postreload-gcse.c (bb_has_well_behaved_predecessors): Likewise.

2011-06-02  Eric Botcazou  <ebotca...@adacore.com>

        * function.h (struct stack_usage): Remove dynamic_alloc_count field.
        (current_function_dynamic_alloc_count): Delete.
        * builtins.c (expand_builtin_setjmp_setup): Do not set calls_setjmp.
        (expand_builtin_nonlocal_goto): Remove obsolete comment.
        (expand_builtin_update_setjmp_buf): Remove dead code.
        * cse.c (cse_find_path): Do not follow a single abnormal incoming edge.
        * explow.c (allocate_dynamic_stack_space): Remove SETJMP_VIA_SAVE_AREA
        support.
        * function.c (instantiate_virtual_regs): Likewise.
        * postreload-gcse.c (bb_has_well_behaved_predecessors): Return false
        for a block with a single abnormal incoming edge.
        * config/sparc/sparc.h (STACK_SAVEAREA_MODE): Define.
        (SETJMP_VIA_SAVE_AREA): Delete.
        * config/sparc/sparc-protos.h (load_got_register): Declare.
        * config/sparc/sparc.c (TARGET_BUILTIN_SETJMP_FRAME_VALUE): Define.
        (load_got_register): Make global.
        (sparc_frame_pointer_required): Add 'static'.
        (sparc_can_eliminate): Likewise.  Call sparc_frame_pointer_required.
        (sparc_builtin_setjmp_frame_value): New function.
        * config/sparc/sparc.md (UNSPECV_SETJMP): Remove.
        (save_stack_nonlocal): New expander.
        (restore_stack_nonlocal): Likewise.
        (nonlocal_goto): Remove modes, adjust predicates and reimplement.
        (nonlocal_goto_internal): New insn.
        (goto_handler_and_restore): Delete.
        (builtin_setjmp_setup): Likewise.
        (do_builtin_setjmp_setup): Likewise.
        (setjmp): Likewise.
        (builtin_setjmp_receiver): New expander.

2011-05-12  Anatoly Sokolov  <ae...@post.ru>

        * config/sparc/sparc.h (REG_OK_FOR_INDEX_P, REG_OK_FOR_BASE_P,
        SYMBOLIC_CONST, RTX_OK_FOR_BASE_P, RTX_OK_FOR_INDEX_P): Remove.
        (RTX_OK_FOR_OFFSET_P, RTX_OK_FOR_OLO10_P): Move to...
        * config/sparc/sparc.c (RTX_OK_FOR_OFFSET_P,
        RTX_OK_FOR_OLO10_P): ...here.
        (sparc_mode_dependent_address_p): Use symbolic_operand instead of
        SYMBOLIC_CONST.


-- 
Eric Botcazou

Reply via email to