From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 14737 invoked by alias); 26 May 2011 19:32:33 -0000 Received: (qmail 14729 invoked by uid 22791); 26 May 2011 19:32:32 -0000 X-SWARE-Spam-Status: No, hits=-1.9 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from mel.act-europe.fr (HELO mel.act-europe.fr) (194.98.77.210) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 26 May 2011 19:32:18 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 8128ECB0294; Thu, 26 May 2011 21:32:16 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LRvuLg0ZEg2B; Thu, 26 May 2011 21:32:13 +0200 (CEST) Received: from [192.168.1.2] (bon31-9-83-155-120-49.fbx.proxad.net [83.155.120.49]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mel.act-europe.fr (Postfix) with ESMTP id 3F4FFCB0214; Thu, 26 May 2011 21:32:13 +0200 (CEST) From: Eric Botcazou To: Laurent =?iso-8859-1?q?Roug=E9?= Subject: Re: Reintroduce -mflat option on SPARC Date: Thu, 26 May 2011 21:54:00 -0000 User-Agent: KMail/1.9.9 Cc: gcc-patches@gcc.gnu.org References: <4D64F83B.5060704@menta.fr> <201105181231.21495.ebotcazou@adacore.com> <4DDE9EA9.5080206@menta.fr> In-Reply-To: <4DDE9EA9.5080206@menta.fr> MIME-Version: 1.0 Content-Disposition: inline Content-Type: Multipart/Mixed; boundary="Boundary-00=_7qq3NLdBqVO0n/B" Message-Id: <201105262132.11006.ebotcazou@adacore.com> Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-05/txt/msg02100.txt.bz2 --Boundary-00=_7qq3NLdBqVO0n/B Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 3959 > 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 --Boundary-00=_7qq3NLdBqVO0n/B Content-Type: application/x-gzip; name="gcc-4.7-mflat-2.diff.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="gcc-4.7-mflat-2.diff.gz" Content-length: 16666 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 k5vLCe2RGplan+EnZE+TJYaFRA7V/RsAC6K7qmUc4GHnlfMYmwmOsItIbpmR iWo7XTqkPXFkkD8H6gq4dNuK8aed9HMDARk0gY7xgEdp/cz1irSBTQ4L0kcV LR0V/Zp7nl9euNUKkMJZyqf+VbPS+utGpZWYlJTx+Daj0vpGk6KdfJFdKQ5I ioxLlhmJ1d7aynEgeZRfVGDz84sLphRvrY9Qsr1+vGYxn2zdep6RB8EKtbWy kMfzs3NCvbIqL/S55UWanAdRNCcPp1At8oCKdUdQLNjRFsOFTBIsKl5/FXZs /vmGAoipTYmN1GaCsn3CgB8YauWxaHO2vw3p2SHWZbqcpaVkldfFNU44Jd2d 4rS5IlKhqy5dwOFd9lc1yl7j7FfNTWW/2LlbQGZGTbW51Cnz0g2pnCZSRYn0 TlikxlTatUJdTtAq9JUsPx1qE8e8QPcI+E5YXAdJEneNQWYLqg2UQkjhm6oQ YNU+EbK4MHQ2OO8jlTLavwGEpFT0DRBCz4FsODSkMyNoGGdYRijZR9fSoUiO DyQo+7sHWBfa31MNKQbKFz8ND2QjsC0ZCwf+fBFveqN/GYNRr8mf3h4+UMjw cJTEPirIn/pLA2/GSPEEPlK8lUZB2EfaZc/wMejEz/YMNEyMrl+qwsDl2/5w iBS4vMJreyO+gd5GuW4ctHebnZ2vo70F37F8U43vmlOuAElSuPQxweb7sNtd sPyRuuIcVrkPI7CRosKHE6y+cVDUmiVReQsSL3Fnhu7jSN2wtlVW7mXyNh1M 4JOaDcp6cCRs8U/R2YO/jYbqxHNXCotUmAiwCL63P6qnAtOj5Dx5LFaOtYJF lbsM/LO6DWDViSc8cHCD19uPRUQFcKxtwsxfmPVnV9dHSBjKdHScyTfjUVIh L0JrpQNoybGkuj4sTq6ukxyyu7+3jRaru483MDtUo3TsOdbQqXysNTIu3Iko ANMIIYIXbzCgSOEGccF9HnP29zjdPGlC0HtPUQCzMb5CDkRQAWccCObzboqX 41oKWOh0NQVzPl2z4LsSxEhV0fWx1JW0CrHuVWRdf/FNME4dvCwAiMCs2lx1 79AFgZnwXN2d57a0qBEV1AL8OT4Wgwvj+uLk8iK+TUqXS+nmJ192WcGO++Vp FOORn9ahqSdtimVjQywzvdPOUczgMXOVr/eHwbTThF/dpgUjjwUgRbVYlPjR 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 +wabltq6AAA= --Boundary-00=_7qq3NLdBqVO0n/B--