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: [RFC PATCH] Fix PR c++/12007


> Would you mind trying that change, and if it works out, checking  it in 
> to the mainline?

I committed the following change to the trunk.  Tested on hppa2.0w-hp-hpux11.11,
hppa64-hp-hpux11.11 and hppa-unknown-linux-gnu.

Dave
-- 
J. David Anglin                                  dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)

2004-02-20  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>

        PR c++/12007
	* dbxout.c (dbxout_parms): Check that DECL_RTL and DECL_INCOMING_RTL
	are set for parameters before outputing debugging information.

	* cp/method.c (use_thunk): Always clone function argument tree.

Index: dbxout.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/dbxout.c,v
retrieving revision 1.177
diff -u -3 -p -r1.177 dbxout.c
--- dbxout.c	16 Feb 2004 14:20:09 -0000	1.177
+++ dbxout.c	19 Feb 2004 04:17:16 -0000
@@ -2750,7 +2750,10 @@ dbxout_parms (tree parms)
   emit_pending_bincls_if_required ();
 
   for (; parms; parms = TREE_CHAIN (parms))
-    if (DECL_NAME (parms) && TREE_TYPE (parms) != error_mark_node)
+    if (DECL_NAME (parms)
+	&& TREE_TYPE (parms) != error_mark_node
+	&& DECL_RTL_SET_P (parms)
+	&& DECL_INCOMING_RTL (parms))
       {
 	dbxout_prepare_symbol (parms);
 
Index: cp/method.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/method.c,v
retrieving revision 1.277
diff -u -3 -p -r1.277 method.c
--- cp/method.c	4 Feb 2004 12:22:42 -0000	1.277
+++ cp/method.c	19 Feb 2004 04:17:18 -0000
@@ -331,7 +331,7 @@ make_alias_for_thunk (tree function)
 void
 use_thunk (tree thunk_fndecl, bool emit_p)
 {
-  tree function, alias;
+  tree a, t, function, alias;
   tree virtual_offset;
   HOST_WIDE_INT fixed_offset, virtual_value;
   bool this_adjusting = DECL_THIS_THUNK_P (thunk_fndecl);
@@ -417,7 +417,20 @@ use_thunk (tree thunk_fndecl, bool emit_
   /* The back-end expects DECL_INITIAL to contain a BLOCK, so we
      create one.  */
   DECL_INITIAL (thunk_fndecl) = make_node (BLOCK);
-  BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = DECL_ARGUMENTS (thunk_fndecl);
+
+  /* Set up cloned argument trees for the thunk.  */
+  t = NULL_TREE;
+  for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
+    {
+      tree x = copy_node (a);
+      TREE_CHAIN (x) = t;
+      DECL_CONTEXT (x) = thunk_fndecl;
+      SET_DECL_RTL (x, NULL_RTX);
+      t = x;
+    }
+  a = nreverse (t);
+  DECL_ARGUMENTS (thunk_fndecl) = a;
+  BLOCK_VARS (DECL_INITIAL (thunk_fndecl)) = a;
   
   if (this_adjusting
       && targetm.asm_out.can_output_mi_thunk (thunk_fndecl, fixed_offset,
@@ -450,24 +463,10 @@ use_thunk (tree thunk_fndecl, bool emit_
 	 just makes a call to the real function.  Unfortunately, this
 	 doesn't work for varargs.  */
 
-      tree a, t;
-
       if (varargs_function_p (function))
 	error ("generic thunk code fails for method `%#D' which uses `...'",
 	       function);
 
-      /* Set up cloned argument trees for the thunk.  */
-      t = NULL_TREE;
-      for (a = DECL_ARGUMENTS (function); a; a = TREE_CHAIN (a))
-	{
-	  tree x = copy_node (a);
-	  TREE_CHAIN (x) = t;
-	  DECL_CONTEXT (x) = thunk_fndecl;
-	  SET_DECL_RTL (x, NULL_RTX);
-	  t = x;
-	}
-      a = nreverse (t);
-      DECL_ARGUMENTS (thunk_fndecl) = a;
       DECL_RESULT (thunk_fndecl) = NULL_TREE;
 
       start_function (NULL_TREE, thunk_fndecl, NULL_TREE, SF_PRE_PARSED);


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