Patchwork [committed] SH: Accept -fstack-usage

login
register
mail settings
Submitter Kaz Kojima
Date Oct. 1, 2010, 12:05 a.m.
Message ID <20101001.090543.73354304.kkojima@rr.iij4u.or.jp>
Download mbox | patch
Permalink /patch/66289/
State New
Headers show

Comments

Kaz Kojima - Oct. 1, 2010, 12:05 a.m.
Hi,

The attached patch tries to implement -fstack-usage for SH.
It's tested with bootstrap and the top level "make -k check"
on sh4-unknown-linux-gnu with no new failures.
Applied on trunk.

Regards,
	kaz
--
2010-09-30  Kaz Kojima  <kkojima@gcc.gnu.org>

	* config/sh/sh.c (sh_expand_prologue):  Set
	current_function_static_stack_size.
Eric Botcazou - Oct. 1, 2010, 6:33 a.m.
> The attached patch tries to implement -fstack-usage for SH.
> It's tested with bootstrap and the top level "make -k check"
> on sh4-unknown-linux-gnu with no new failures.

Thanks!  You should also update testsuite/gcc.dg/stack-usage-1.c if needed.
Kaz Kojima - Oct. 1, 2010, 11:45 a.m.
Eric Botcazou <ebotcazou@libertysurf.fr> wrote:
> Thanks!  You should also update testsuite/gcc.dg/stack-usage-1.c if needed.

Thank you for noticing.  Fortunately, the default value looks
to work for SH.

Regards,
	kaz

Patch

--- ORIG/trunk/gcc/config/sh/sh.c	2010-09-17 09:25:03.000000000 +0900
+++ trunk/gcc/config/sh/sh.c	2010-09-28 08:20:24.000000000 +0900
@@ -6860,6 +6860,7 @@  sh_expand_prologue (void)
   int d_rounding = 0;
   int save_flags = target_flags;
   int pretend_args;
+  int stack_usage;
   tree sp_switch_attr
     = lookup_attribute ("sp_switch", DECL_ATTRIBUTES (current_function_decl));
 
@@ -6876,6 +6877,7 @@  sh_expand_prologue (void)
   output_stack_adjust (-pretend_args
 		       - crtl->args.info.stack_regs * 8,
 		       stack_pointer_rtx, 0, NULL, false);
+  stack_usage = pretend_args + crtl->args.info.stack_regs * 8;
 
   if (TARGET_SHCOMPACT && flag_pic && crtl->args.info.call_cookie)
     /* We're going to use the PIC register to load the address of the
@@ -6934,6 +6936,7 @@  sh_expand_prologue (void)
 			))
 		break;
 	      push (rn);
+	      stack_usage += GET_MODE_SIZE (SImode);
 	    }
 	}
     }
@@ -7006,6 +7009,7 @@  sh_expand_prologue (void)
 
       output_stack_adjust (-(save_size + d_rounding), stack_pointer_rtx,
 			   0, NULL, true);
+      stack_usage += save_size + d_rounding;
 
       sh5_schedule_saves (&live_regs_mask, &schedule, offset_base);
       tmp_pnt = schedule.temps;
@@ -7157,7 +7161,10 @@  sh_expand_prologue (void)
       gcc_assert (entry->offset == d_rounding);
     }
   else
-    push_regs (&live_regs_mask, current_function_interrupt);
+    {
+      push_regs (&live_regs_mask, current_function_interrupt);
+      stack_usage += d;
+    }
 
   if (flag_pic && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM))
     emit_insn (gen_GOTaddr2picreg ());
@@ -7181,6 +7188,7 @@  sh_expand_prologue (void)
 
   output_stack_adjust (-rounded_frame_size (d) + d_rounding,
 		       stack_pointer_rtx, 0, NULL, true);
+  stack_usage += rounded_frame_size (d) - d_rounding;
 
   if (frame_pointer_needed)
     frame_insn (GEN_MOV (hard_frame_pointer_rtx, stack_pointer_rtx));
@@ -7194,6 +7202,9 @@  sh_expand_prologue (void)
 		      "__GCC_shcompact_incoming_args", SFUNC_GOT);
       emit_insn (gen_shcompact_incoming_args ());
     }
+
+  if (flag_stack_usage)
+    current_function_static_stack_size = stack_usage;
 }
 
 void