From 7a3e01c4081a6977a86fb44fe0aff6dece8dc44e Mon Sep 17 00:00:00 2001 From: John David Anglin Date: Fri, 20 Feb 2004 23:03:41 +0000 Subject: [PATCH] re PR c++/12007 (Multiple inheritance float pass by value fails) 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. From-SVN: r78192 --- gcc/ChangeLog | 6 ++++++ gcc/cp/ChangeLog | 5 +++++ gcc/cp/method.c | 31 +++++++++++++++---------------- gcc/dbxout.c | 5 ++++- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 24cf40e6e34b..9f0bf7baafbf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-02-20 John David Anglin + + 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 PR target/14201 diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b07dcf30dec5..d8f31c3d36df 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2004-02-20 John David Anglin + + PR c++/12007 + * method.c (use_thunk): Always clone function argument tree. + 2004-02-20 Mark Mitchell PR c++/14199 diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 802bf1d6f3ca..bb34d8221577 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -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); diff --git a/gcc/dbxout.c b/gcc/dbxout.c index 9ca79c6be834..482470abb8be 100644 --- a/gcc/dbxout.c +++ b/gcc/dbxout.c @@ -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); -- 2.47.2