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: Merge csl-arm-branch into mainline.


On Tuesday 03 February 2004 9:13 am, Mark Mitchell wrote:
> Let me know when that's done, and we'll take another look at the
> current_function_is_thunk changes.  I don't think they are very nearly
> obviously correct, but I will take a look at them in isolation, if you
> will send me those bits as a separate patch.

Attached.

Paul

2003-11-05  Mark Mitchell  <mark@codesourcery.com>

	* calls.c (initialize_argument_information): Add CALL_FROM_THUNK_P
	parameter.  Use it instead of current_function_is_thunk.
	* function.h (struct function): Update documentation for is_thunk.
	* tree.h (CALL_FROM_THUNK_P): New macro.
	* config/alpha/alpha.c (alpha_sa_mask): Do not check
	no_new_pseudos when testing current_function_is_thunk.
	* config/rs6000/rs6000.c (rs6000_ra_ever_killed): Likeiwse.

cp/
2003-11-05  Mark Mitchell  <mark@codesourcery.com>

	* decl.c (cxx_push_function_context): Do not set
	current_function_is_thunk.
	* method.c (use_thunk): Set CALL_FROM_THUNK on the call to the
	actual function.
Index: gcc/calls.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/calls.c,v
retrieving revision 1.317
diff -u -p -r1.317 calls.c
--- gcc/calls.c	31 Jan 2004 08:02:47 -0000	1.317
+++ gcc/calls.c	2 Feb 2004 19:42:05 -0000
@@ -133,7 +133,8 @@ static int compute_argument_block_size (
 static void initialize_argument_information (int, struct arg_data *,
 					     struct args_size *, int, tree,
 					     tree, CUMULATIVE_ARGS *, int,
-					     rtx *, int *, int *, int *);
+					     rtx *, int *, int *, int *,
+					     bool);
 static void compute_argument_addresses (struct arg_data *, rtx, int);
 static rtx rtx_for_function_call (tree, tree);
 static void load_register_parameters (struct arg_data *, int, rtx *, int,
@@ -1023,7 +1024,10 @@ store_unaligned_arguments_into_pseudos (
    and may be modified by this routine.
 
    OLD_PENDING_ADJ, MUST_PREALLOCATE and FLAGS are pointers to integer
-   flags which may may be modified by this routine.  */
+   flags which may may be modified by this routine. 
+
+   CALL_FROM_THUNK_P is true if this call is the jump from a thunk to
+   the thunked-to function.  */
 
 static void
 initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
@@ -1034,7 +1038,8 @@ initialize_argument_information (int num
 				 CUMULATIVE_ARGS *args_so_far,
 				 int reg_parm_stack_space,
 				 rtx *old_stack_level, int *old_pending_adj,
-				 int *must_preallocate, int *ecf_flags)
+				 int *must_preallocate, int *ecf_flags,
+				 bool call_from_thunk_p)
 {
   /* 1 if scanning parms front to back, -1 if scanning back to front.  */
   int inc;
@@ -1107,7 +1112,7 @@ initialize_argument_information (int num
 	{
 	  /* If we're compiling a thunk, pass through invisible
              references instead of making a copy.  */
-	  if (current_function_is_thunk
+	  if (call_from_thunk_p
 #ifdef FUNCTION_ARG_CALLEE_COPIES
 	      || (FUNCTION_ARG_CALLEE_COPIES (*args_so_far, TYPE_MODE (type),
 					     type, argpos < n_named_args)
@@ -2444,7 +2449,8 @@ expand_call (tree exp, rtx target, int i
 				   n_named_args, actparms, fndecl,
 				   &args_so_far, reg_parm_stack_space,
 				   &old_stack_level, &old_pending_adj,
-				   &must_preallocate, &flags);
+				   &must_preallocate, &flags,
+				   CALL_FROM_THUNK_P (exp));
 
   if (args_size.var)
     {
Index: gcc/function.h
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/function.h,v
retrieving revision 1.109
diff -u -p -r1.109 function.h
--- gcc/function.h	21 Jan 2004 20:39:54 -0000	1.109
+++ gcc/function.h	2 Feb 2004 19:42:05 -0000
@@ -457,9 +457,10 @@ struct function GTY(())
   /* Nonzero if the function being compiled issues a computed jump.  */
   unsigned int has_computed_jump : 1;
 
-  /* Nonzero if the current function is a thunk (a lightweight function that
-     just adjusts one of its arguments and forwards to another function), so
-     we should try to cut corners where we can.  */
+  /* Nonzero if the current function is a thunk, i.e., a lightweight
+     function implemented by the output_mi_thunk hook) that just
+     adjusts one of its arguments and forwards to another
+     function.  */
   unsigned int is_thunk : 1;
 
   /* This bit is used by the exception handling logic.  It is set if all
Index: gcc/tree.h
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/tree.h,v
retrieving revision 1.458
diff -u -p -r1.458 tree.h
--- gcc/tree.h	16 Jan 2004 07:20:29 -0000	1.458
+++ gcc/tree.h	2 Feb 2004 19:42:05 -0000
@@ -210,6 +210,8 @@ struct tree_common GTY(())
        TREE_PROTECTED in
            BLOCK
 	   ..._DECL
+       CALL_FROM_THUNK_P in
+           CALL_EXPR 
 
    side_effects_flag:
 
@@ -265,6 +267,7 @@ struct tree_common GTY(())
 
 	TREE_DEPRECATED in
 	   ..._DECL
+
 */
 
 /* Define accessors for the fields that all tree nodes have
@@ -623,6 +626,10 @@ extern void tree_operand_check_failed (i
    argument list.  */
 #define CALL_EXPR_HAS_RETURN_SLOT_ADDR(NODE) ((NODE)->common.private_flag)
 
+/* In a CALL_EXPR, means that the call is the jump from a thunk to the
+   thunked-to function.  */
+#define CALL_FROM_THUNK_P(NODE) ((NODE)->common.protected_flag)
+
 /* In a type, nonzero means that all objects of the type are guaranteed by the
    language or front-end to be properly aligned, so we can indicate that a MEM
    of this type is aligned at least to the alignment of the type, even if it
Index: gcc/config/alpha/alpha.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/alpha/alpha.c,v
retrieving revision 1.347
diff -u -p -r1.347 alpha.c
--- gcc/config/alpha/alpha.c	31 Jan 2004 02:06:50 -0000	1.347
+++ gcc/config/alpha/alpha.c	2 Feb 2004 19:42:05 -0000
@@ -6735,13 +6735,10 @@ alpha_sa_mask (unsigned long *imaskP, un
   unsigned long fmask = 0;
   unsigned int i;
 
-  /* Irritatingly, there are two kinds of thunks -- those created with
-     TARGET_ASM_OUTPUT_MI_THUNK and those with DECL_THUNK_P that go
-     through the regular part of the compiler.  In the
-     TARGET_ASM_OUTPUT_MI_THUNK case we don't have valid register life
-     info, but assemble_start_function wants to output .frame and
-     .mask directives.  */
-  if (current_function_is_thunk && !no_new_pseudos)
+  /* When outputting a thunk, we don't have valid register life info,
+     but assemble_start_function wants to output .frame and .mask
+     directives.  */
+  if (current_function_is_thunk)
     {
       *imaskP = 0;
       *fmaskP = 0;
Index: gcc/config/rs6000/rs6000.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/config/rs6000/rs6000.c,v
retrieving revision 1.587
diff -u -p -r1.587 rs6000.c
--- gcc/config/rs6000/rs6000.c	2 Feb 2004 06:31:05 -0000	1.587
+++ gcc/config/rs6000/rs6000.c	2 Feb 2004 19:42:05 -0000
@@ -11000,11 +11000,7 @@ rs6000_ra_ever_killed (void)
   rtx reg;
   rtx insn;
 
-  /* Irritatingly, there are two kinds of thunks -- those created with
-     TARGET_ASM_OUTPUT_MI_THUNK and those with DECL_THUNK_P that go
-     through the regular part of the compiler.  This is a very hacky
-     way to tell them apart.  */
-  if (current_function_is_thunk && !no_new_pseudos)
+  if (current_function_is_thunk)
     return 0;
 
   /* regs_ever_live has LR marked as used if any sibcalls are present,
Index: gcc/cp/decl.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/cp/decl.c,v
retrieving revision 1.1178
diff -u -p -r1.1178 decl.c
--- gcc/cp/decl.c	31 Jan 2004 17:58:49 -0000	1.1178
+++ gcc/cp/decl.c	2 Feb 2004 19:42:05 -0000
@@ -11196,8 +11196,6 @@ cxx_push_function_context (struct functi
     {
       tree fn = f->decl;
 
-      current_function_is_thunk = DECL_THUNK_P (fn);
-
       if (DECL_SAVED_FUNCTION_DATA (fn))
 	{
 	  /* If we already parsed this function, and we're just expanding it
Index: gcc/cp/method.c
===================================================================
RCS file: /var/cvsroot/gcc-cvs/gcc/gcc/cp/method.c,v
retrieving revision 1.276
diff -u -p -r1.276 method.c
--- gcc/cp/method.c	30 Jan 2004 23:37:39 -0000	1.276
+++ gcc/cp/method.c	2 Feb 2004 19:42:05 -0000
@@ -487,6 +487,7 @@ use_thunk (tree thunk_fndecl, bool emit_
 	t = tree_cons (NULL_TREE, a, t);
       t = nreverse (t);
       t = build_call (alias, t);
+      CALL_FROM_THUNK_P (t) = 1;
       
       if (VOID_TYPE_P (TREE_TYPE (t)))
 	finish_expr_stmt (t);

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