diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-11-01 11:17:42 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-01 11:17:42 +0100 |
commit | 611cd333cd03e3b44902223cd8f945a54e9ec843 (patch) | |
tree | 3e778dea3fc779cfc91481f7e3fe32b0fcb42c6c | |
parent | d0a55efc8463a68632498a84cffa7b84fe3d6e26 (diff) | |
download | gcc-611cd333cd03e3b44902223cd8f945a54e9ec843.zip gcc-611cd333cd03e3b44902223cd8f945a54e9ec843.tar.gz gcc-611cd333cd03e3b44902223cd8f945a54e9ec843.tar.bz2 |
re PR debug/33537 (C++ arguments passed by invisible reference have wrong type)
PR debug/33537
* dwarf2out.c (gen_formal_parameter_die, gen_variable_die,
gen_decl_die): Use TREE_TYPE (TREE_TYPE (decl)) as type
rather than TREE_TYPE (decl) if DECL_BY_REFERENCE (decl).
From-SVN: r129820
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 23 |
2 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0aa3b00..a5c3a9e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2007-11-01 Jakub Jelinek <jakub@redhat.com> + PR debug/33537 + * dwarf2out.c (gen_formal_parameter_die, gen_variable_die, + gen_decl_die): Use TREE_TYPE (TREE_TYPE (decl)) as type + rather than TREE_TYPE (decl) if DECL_BY_REFERENCE (decl). + PR rtl-optimization/33673 * gcse.c (cprop_jump): If a conditional jump has been optimized into unconditional jump, make the remaining normal edge fallthru diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 46e2b59..a9510eb 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -11832,8 +11832,11 @@ gen_formal_parameter_die (tree node, dw_die_ref context_die) add_abstract_origin_attribute (parm_die, origin); else { + tree type = TREE_TYPE (node); add_name_and_src_coords_attributes (parm_die, node); - add_type_attribute (parm_die, TREE_TYPE (node), + if (DECL_BY_REFERENCE (node)) + type = TREE_TYPE (type); + add_type_attribute (parm_die, type, TREE_READONLY (node), TREE_THIS_VOLATILE (node), context_die); @@ -12437,8 +12440,14 @@ gen_variable_die (tree decl, dw_die_ref context_die) } else { + tree type = TREE_TYPE (decl); + if ((TREE_CODE (decl) == PARM_DECL + || TREE_CODE (decl) == RESULT_DECL) + && DECL_BY_REFERENCE (decl)) + type = TREE_TYPE (type); + add_name_and_src_coords_attributes (var_die, decl); - add_type_attribute (var_die, TREE_TYPE (decl), TREE_READONLY (decl), + add_type_attribute (var_die, type, TREE_READONLY (decl), TREE_THIS_VOLATILE (decl), context_die); if (TREE_PUBLIC (decl)) @@ -13694,7 +13703,10 @@ gen_decl_die (tree decl, dw_die_ref context_die) /* Output any DIEs that are needed to specify the type of this data object. */ - gen_type_die (TREE_TYPE (decl), context_die); + if (TREE_CODE (decl) == RESULT_DECL && DECL_BY_REFERENCE (decl)) + gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die); + else + gen_type_die (TREE_TYPE (decl), context_die); /* And its containing type. */ origin = decl_class_context (decl); @@ -13728,7 +13740,10 @@ gen_decl_die (tree decl, dw_die_ref context_die) break; case PARM_DECL: - gen_type_die (TREE_TYPE (decl), context_die); + if (DECL_BY_REFERENCE (decl)) + gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die); + else + gen_type_die (TREE_TYPE (decl), context_die); gen_formal_parameter_die (decl, context_die); break; |