RX: only safe call clobbered registers inside non-leaf interrupt handlers

Nick Clifton nickc@redhat.com
Mon Jan 31 12:30:00 GMT 2011


Hi Guys,

  I am applying the patch below to improve the prologues and epilogues
  of interrupt handlers.  Currently we always save all of the
  call-clobbered registers, even if they are not live, as there is a
  possibility that they might be used by a function call from the
  interrupt handler.  This is not necessary however if the handler is a
  leaf function, and so this patch adds that check.

Cheers
  Nick

gcc/ChangeLog
2011-01-31  Nick Clifton  <nickc@redhat.com>

	* config/rx/rx.c (rx_get_stack_layout): Only save call clobbered
	registers inside interrupt handlers if the handler is not a leaf
	function.

Index: config/rx/rx.c
===================================================================
--- config/rx/rx.c	(revision 169431)
+++ config/rx/rx.c	(working copy)
@@ -1137,10 +1137,12 @@
   for (save_mask = high = low = 0, reg = 1; reg < CC_REGNUM; reg++)
     {
       if ((df_regs_ever_live_p (reg)
-	   /* Always save all call clobbered registers inside interrupt
-	      handlers, even if they are not live - they may be used in
-	      routines called from this one.  */
-	   || (call_used_regs[reg] && is_interrupt_func (NULL_TREE)))
+	   /* Always save all call clobbered registers inside non-leaf
+	      interrupt handlers, even if they are not live - they may
+	      be used in (non-interrupt aware) routines called from this one.  */
+	   || (call_used_regs[reg]
+	       && is_interrupt_func (NULL_TREE)
+	       && ! current_function_is_leaf))
 	  && (! call_used_regs[reg]
 	      /* Even call clobbered registered must
 		 be pushed inside interrupt handlers.  */



More information about the Gcc-patches mailing list