DWARF 2 frame info patch

Andrew Haley aph@viagra.cygnus.co.uk
Tue Aug 15 08:39:00 GMT 2000


   From: Jason Merrill <jason@redhat.com>
   Date: 11 Aug 2000 18:36:07 -0700

   Please also handle SEQUENCEs with the same code.

   Jason

Done.  Bootstrapped i386-Linux.

Andrew.

2000-08-04  Andrew Haley  <aph@cygnus.com>

        * dwarf2out.c (stack_adjust_offset): New function.
        (dwarf2out_stack_adjust): Break out stack adjust logic into
        new stack_adjust_offset function.  Look inside parallels and
        sequences for stack adjustments.

Index: dwarf2out.c
===================================================================
RCS file: /cvs/cvsfiles/devo/gcc/dwarf2out.c,v
retrieving revision 1.142
diff -p -2 -c -r1.142 dwarf2out.c
*** dwarf2out.c	2000/07/11 14:32:03	1.142
--- dwarf2out.c	2000/08/15 14:14:02
*************** initial_return_save (rtl)
*** 1102,1105 ****
--- 1102,1148 ----
  }
  
+ /* Given a SET, calculate the amount of stack adjustment it
+    contains. */
+ 
+ static long stack_adjust_offset (pattern)
+   rtx pattern;
+ {
+   rtx src = SET_SRC (pattern);
+   rtx dest = SET_DEST (pattern);
+   long offset = 0;
+   enum rtx_code code;
+ 
+   if (dest == stack_pointer_rtx)
+     {
+       /* (set (reg sp) (plus (reg sp) (const_int))) */
+       code = GET_CODE (src);
+       if (! (code == PLUS || code == MINUS)
+ 	  || XEXP (src, 0) != stack_pointer_rtx
+ 	  || GET_CODE (XEXP (src, 1)) != CONST_INT)
+ 	return 0;
+ 
+       offset = INTVAL (XEXP (src, 1));
+     }
+   else if (GET_CODE (dest) == MEM)
+     {
+       /* (set (mem (pre_dec (reg sp))) (foo)) */
+       src = XEXP (dest, 0);
+       code = GET_CODE (src);
+ 
+       if (! (code == PRE_DEC || code == PRE_INC)
+ 	  || XEXP (src, 0) != stack_pointer_rtx)
+ 	return 0;
+ 
+       offset = GET_MODE_SIZE (GET_MODE (dest));
+     }
+   else
+     return 0;
+ 
+   if (code == PLUS || code == PRE_INC)
+     offset = -offset;
+ 
+   return offset;
+ }
+ 
  /* Check INSN to see if it looks like a push or a stack adjustment, and
     make a note of it if it does.  EH uses this information to find out how
*************** dwarf2out_stack_adjust (insn)
*** 1146,1188 ****
    else if (GET_CODE (PATTERN (insn)) == SET)
      {
!       rtx src, dest;
!       enum rtx_code code;
! 
!       insn = PATTERN (insn);
!       src = SET_SRC (insn);
!       dest = SET_DEST (insn);
! 
!       if (dest == stack_pointer_rtx)
! 	{
! 	  /* (set (reg sp) (plus (reg sp) (const_int))) */
! 	  code = GET_CODE (src);
! 	  if (! (code == PLUS || code == MINUS)
! 	      || XEXP (src, 0) != stack_pointer_rtx
! 	      || GET_CODE (XEXP (src, 1)) != CONST_INT)
! 	    return;
  
! 	  offset = INTVAL (XEXP (src, 1));
! 	}
!       else if (GET_CODE (dest) == MEM)
  	{
! 	  /* (set (mem (pre_dec (reg sp))) (foo)) */
! 	  src = XEXP (dest, 0);
! 	  code = GET_CODE (src);
! 
! 	  if (! (code == PRE_DEC || code == PRE_INC)
! 	      || XEXP (src, 0) != stack_pointer_rtx)
! 	    return;
! 
! 	  offset = GET_MODE_SIZE (GET_MODE (dest));
  	}
-       else
- 	return;
- 
-       if (code == PLUS || code == PRE_INC)
- 	offset = -offset;
      }
    else
      return;
! 
    if (offset == 0)
      return;
--- 1189,1212 ----
    else if (GET_CODE (PATTERN (insn)) == SET)
      {
!       offset = stack_adjust_offset (PATTERN (insn));
!     }
!   else if (GET_CODE (PATTERN (insn)) == PARALLEL
! 	   || GET_CODE (PATTERN (insn)) == SEQUENCE)
!     {
!       /* There may be stack adjustments inside compound insns.  Search
!          for them. */
!       int j;
  
!       offset = 0;
!       for (j = XVECLEN (PATTERN (insn), 0) - 1; j >= 0; j--)
  	{
! 	  rtx pattern = XVECEXP (PATTERN (insn), 0, j);
! 	  if (GET_CODE (pattern) == SET)
! 	    offset += stack_adjust_offset (pattern);
  	}
      }
    else
      return;
!   
    if (offset == 0)
      return;


More information about the Gcc-patches mailing list