This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [RFC PATCH] Fix PR c++/12007
- From: "John David Anglin" <dave at hiauly1 dot hia dot nrc dot ca>
- To: mark at codesourcery dot com (Mark Mitchell)
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Fri, 20 Feb 2004 18:13:31 -0500 (EST)
- Subject: 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);