OSDN Git Service

PR c++/12007
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Feb 2004 23:03:41 +0000 (23:03 +0000)
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Feb 2004 23:03:41 +0000 (23:03 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78192 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cp/ChangeLog
gcc/cp/method.c
gcc/dbxout.c

index 24cf40e..9f0bf7b 100644 (file)
@@ -1,3 +1,9 @@
+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.
+
 2004-02-20  Falk Hueffner  <falk@debian.org>
 
        PR target/14201
index b07dcf3..d8f31c3 100644 (file)
@@ -1,3 +1,8 @@
+2004-02-20  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+
+        PR c++/12007
+       * method.c (use_thunk): Always clone function argument tree.
+
 2004-02-20  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/14199
index 802bf1d..bb34d82 100644 (file)
@@ -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_p)
   /* 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_p)
         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 9ca79c6..482470a 100644 (file)
@@ -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);