This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] builtin_frame_address(0) and omit-frame-pointer


Hi,

> You'll need documentation for the new macro, but otherwise
> it looks plausible.

Attached is the patch with the macro documentation added.

I've tried to implement the INITIAL_FRAME_ADDRESS_RTX macro for i386, but
I didn't found a working solution at the first glance. The problem is that
what the hard_frame_pointer_rtx would point to depends on whether a 
hard frame pointer is maintained or not. I think the definition must be
something like: 

#define INITIAL_FRAME_ADDRESS_RTX 
   (plus_constant (arg_pointer_rtx, 
 	           -(frame_pointer_needed ? UNITS_PER_WORD * 2 : UNITS_PER_WORD)))

But "frame_pointer_needed" is of course not known when the builtins are expanded
because it is set by reload.

This patch fixes the pass45-frag.c regression on s390 (31bit).

Bootstrapped and regtested on i386, s390, s390x.

Please commit to mainline if you think it is OK.

Bye,

-Andreas-


2005-01-18  Andreas Krebbel  <krebbel1@de.ibm.com>

	* gcc/builtins.c (expand_builtin_return_addr): Remove tem parameter.
	tem becomes a local variable which is set to the value of the 
	back end defined INITIAL_FRAME_ADDRESS macro.
	(expand_builtin_frame_address): Omit the base parameter to 
	expand_builtin_return_addr.
	* gcc/config/s390/s390.h (INITIAL_FRAME_ADDRESS_RTX): Define new macro.
	(DYNAMIC_CHAIN_ADDRESS): Remove the case for the initial frame.
	* gcc/doc/tm.texi: Documentation for INITIAL_FRAME_ADDRESS_RTX added.


Index: gcc/builtins.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/builtins.c,v
retrieving revision 1.413
diff -p -c -r1.413 builtins.c
*** gcc/builtins.c	12 Jan 2005 06:45:35 -0000	1.413
--- gcc/builtins.c	18 Jan 2005 15:52:48 -0000
*************** builtin_save_expr (tree exp)
*** 452,462 ****
     address located within it (depending on FNDECL_CODE).  */
  
  static rtx
! expand_builtin_return_addr (enum built_in_function fndecl_code, int count,
! 			    rtx tem)
  {
    int i;
  
    /* Some machines need special handling before we can access
       arbitrary frames.  For example, on the sparc, we must first flush
       all register windows to the stack.  */
--- 452,467 ----
     address located within it (depending on FNDECL_CODE).  */
  
  static rtx
! expand_builtin_return_addr (enum built_in_function fndecl_code, int count)
  {
    int i;
  
+ #ifdef INITIAL_FRAME_ADDRESS_RTX
+   rtx tem = INITIAL_FRAME_ADDRESS_RTX;
+ #else
+   rtx tem = hard_frame_pointer_rtx;
+ #endif
+ 
    /* Some machines need special handling before we can access
       arbitrary frames.  For example, on the sparc, we must first flush
       all register windows to the stack.  */
*************** expand_builtin_frame_address (tree fndec
*** 4149,4156 ****
      {
        rtx tem
  	= expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl),
! 				      tree_low_cst (TREE_VALUE (arglist), 1),
! 				      hard_frame_pointer_rtx);
  
        /* Some ports cannot access arbitrary stack frames.  */
        if (tem == NULL)
--- 4154,4160 ----
      {
        rtx tem
  	= expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl),
! 				      tree_low_cst (TREE_VALUE (arglist), 1));
  
        /* Some ports cannot access arbitrary stack frames.  */
        if (tem == NULL)
*************** expand_builtin_profile_func (bool exitp)
*** 4760,4766 ****
  
    emit_library_call (which, LCT_NORMAL, VOIDmode, 2, this, Pmode,
  		     expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS,
! 						 0, hard_frame_pointer_rtx),
  		     Pmode);
  
    return const0_rtx;
--- 4764,4770 ----
  
    emit_library_call (which, LCT_NORMAL, VOIDmode, 2, this, Pmode,
  		     expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS,
! 						 0),
  		     Pmode);
  
    return const0_rtx;
Index: gcc/config/s390/s390.h
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/s390/s390.h,v
retrieving revision 1.131
diff -p -c -r1.131 s390.h
*** gcc/config/s390/s390.h	30 Dec 2004 03:08:05 -0000	1.131
--- gcc/config/s390/s390.h	18 Jan 2005 15:52:49 -0000
*************** extern int current_function_outgoing_arg
*** 612,631 ****
     the argument area.  */
  #define FIRST_PARM_OFFSET(FNDECL) 0
  
  /* The return address of the current frame is retrieved
     from the initial value of register RETURN_REGNUM.
     For frames farther back, we use the stack slot where
     the corresponding RETURN_REGNUM register was saved.  */
  
! #define DYNAMIC_CHAIN_ADDRESS(FRAME)                                            \
!   (TARGET_PACKED_STACK ?                                                        \
!     ((FRAME) != hard_frame_pointer_rtx ?                                        \
!      plus_constant ((FRAME), STACK_POINTER_OFFSET - UNITS_PER_WORD) :           \
!      plus_constant (arg_pointer_rtx, -UNITS_PER_WORD)) :                        \
!      ((FRAME) != hard_frame_pointer_rtx ? (FRAME) :				\
!       plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET)))
! 
! #define RETURN_ADDR_RTX(COUNT, FRAME)						\
    s390_return_addr_rtx ((COUNT), DYNAMIC_CHAIN_ADDRESS ((FRAME)))
  
  /* In 31-bit mode, we need to mask off the high bit of return addresses.  */
--- 612,633 ----
     the argument area.  */
  #define FIRST_PARM_OFFSET(FNDECL) 0
  
+ /* Defining this macro makes __builtin_frame_address(0) and 
+    __builtin_return_address(0) work with -fomit-frame-pointer.  */
+ #define INITIAL_FRAME_ADDRESS_RTX                                             \
+   (TARGET_PACKED_STACK ?                                                      \
+    plus_constant (arg_pointer_rtx, -UNITS_PER_WORD) :                         \
+    plus_constant (arg_pointer_rtx, -STACK_POINTER_OFFSET))
+ 
  /* The return address of the current frame is retrieved
     from the initial value of register RETURN_REGNUM.
     For frames farther back, we use the stack slot where
     the corresponding RETURN_REGNUM register was saved.  */
+ #define DYNAMIC_CHAIN_ADDRESS(FRAME)                                          \
+   (TARGET_PACKED_STACK ?                                                      \
+    plus_constant ((FRAME), STACK_POINTER_OFFSET - UNITS_PER_WORD) : (FRAME))
  
! #define RETURN_ADDR_RTX(COUNT, FRAME)					      \
    s390_return_addr_rtx ((COUNT), DYNAMIC_CHAIN_ADDRESS ((FRAME)))
  
  /* In 31-bit mode, we need to mask off the high bit of return addresses.  */
Index: gcc/doc/tm.texi
===================================================================
RCS file: /cvs/gcc/gcc/gcc/doc/tm.texi,v
retrieving revision 1.410
diff -p -c -r1.410 tm.texi
*** gcc/doc/tm.texi	16 Jan 2005 15:28:18 -0000	1.410
--- gcc/doc/tm.texi	18 Jan 2005 15:52:50 -0000
*************** length of the outgoing arguments.  The d
*** 2931,2936 ****
--- 2931,2948 ----
  machines.  See @file{function.c} for details.
  @end defmac
  
+ @defmac INITIAL_FRAME_ADDRESS_RTX
+ A C expression whose value is RTL representing the address of the initial
+  stack frame. This address is passed to @code{RETURN_ADDR_RTX} and 
+ @code{DYNAMIC_CHAIN_ADDRESS}.
+ If you don't define this macro, the default is to return 
+ @code{hard_frame_pointer_rtx}.
+ This default is usually correct unless @code{-fomit-frame-pointer} is in 
+ effect.
+ Define this macro in order to make @code{__builtin_frame_address (0)} and 
+ @code{__builtin_return_address (0)} work even in absence of a hard frame pointer.
+ @end defmac
+ 
  @defmac DYNAMIC_CHAIN_ADDRESS (@var{frameaddr})
  A C expression whose value is RTL representing the address in a stack
  frame where the pointer to the caller's frame is stored.  Assume that


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]