diff options
author | Dodji Seketeli <dodji@redhat.com> | 2011-01-11 21:20:07 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2011-01-11 22:20:07 +0100 |
commit | f8fb7295298da14f3ae81d27f9c926ede96d466a (patch) | |
tree | b4919cd666c7d15bbfab15b801b4cb125555091a /gcc/cp | |
parent | dc6715320db92089b3c1b046157b56b5680738a5 (diff) | |
download | gcc-f8fb7295298da14f3ae81d27f9c926ede96d466a.tar.gz |
re PR debug/46955 (Missing DW_AT_const_value from DW_TAG_template_value_parameter)
Fix PR debug/46955
gcc/cp/
* cp-lang.c (get_template_innermost_arguments_folded)
(get_template_argument_pack_elems_folded)
(template_arg_needs_folding, fold_cplus_constants): New static
functions.
(LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS): Set this hook to
get_template_innermost_arguments_folded.
(LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS): Set this hook to
get_template_argument_pack_elems_folded.
gcc/testsuite/
* g++.dg/debug/dwarf2/template-params-8.C: New test.
From-SVN: r168681
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/cp-lang.c | 77 |
2 files changed, 87 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ba3eca36026..95b8d183bf1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2011-01-11 Dodji Seketeli <dodji@redhat.com> + + PR debug/46955 + * cp-lang.c (get_template_innermost_arguments_folded) + (get_template_argument_pack_elems_folded) + (template_arg_needs_folding, fold_cplus_constants): New static + functions. + (LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS): Set this hook to + get_template_innermost_arguments_folded. + (LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS): Set this hook to + get_template_argument_pack_elems_folded. + 2011-01-11 Jason Merrill <jason@redhat.com> PR c++/46658 diff --git a/gcc/cp/cp-lang.c b/gcc/cp/cp-lang.c index ff92666e4d4..e5c1c0911df 100644 --- a/gcc/cp/cp-lang.c +++ b/gcc/cp/cp-lang.c @@ -38,6 +38,8 @@ static void cp_init_ts (void); static const char * cxx_dwarf_name (tree t, int verbosity); static enum classify_record cp_classify_record (tree type); static tree cp_eh_personality (void); +static tree get_template_innermost_arguments_folded (const_tree); +static tree get_template_argument_pack_elems_folded (const_tree); /* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h; consequently, there should be very few hooks below. */ @@ -56,13 +58,13 @@ static tree cp_eh_personality (void); get_primary_template_innermost_parameters #undef LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS #define LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS \ - get_template_innermost_arguments + get_template_innermost_arguments_folded #undef LANG_HOOKS_FUNCTION_PARAMETER_PACK_P #define LANG_HOOKS_FUNCTION_PARAMETER_PACK_P \ function_parameter_pack_p #undef LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS #define LANG_HOOKS_GET_ARGUMENT_PACK_ELEMS \ - get_template_argument_pack_elems + get_template_argument_pack_elems_folded #undef LANG_HOOKS_GENERIC_GENERIC_PARAMETER_DECL_P #define LANG_HOOKS_GENERIC_GENERIC_PARAMETER_DECL_P \ template_template_parameter_p @@ -165,5 +167,76 @@ cp_eh_personality (void) return cp_eh_personality_decl; } +/* This is a subroutine of fold_cplus_constants. It returns TRUE if T + is a C++ specific constant that needs to be folded further before + being passed to the debug info emitter. */ + +static bool +template_arg_needs_folding (const_tree t) +{ + /* For now only PTRMEM_CST nodes are to be folded further. */ + if (TREE_CODE (t) == PTRMEM_CST) + return true; + return false; +} + +/* Fold the elements of the TREE_VEC C which are C++ specific nodes + that would need folding so that they can be processed by the debug + info emitter. This is a subroutine of + get_template_innermost_arguments_folded and + get_template_argument_pack_elems_folded. */ + +static tree +fold_cplus_constants (const_tree c) +{ + tree folded_elems, elems = CONST_CAST_TREE (c); + int vec_len, i; + + if (elems == NULL_TREE || elems == error_mark_node) + return elems; + + vec_len = TREE_VEC_LENGTH (elems); + + /* First check if there is at least one element that needs + folding. If there is none, we just return ELEMS. Otherwise create + and return a new tree vector that contains the folded versions of + ELEMS. This is to avoid allocating memory if we don't need + to. */ + for (i = 0; i < vec_len; ++i) + { + if (template_arg_needs_folding (TREE_VEC_ELT (elems, i))) + break; + } + if (i == vec_len) + return elems; + + folded_elems = make_tree_vec (vec_len); + for (i = 0; i < vec_len; ++i) + { + tree elem = TREE_VEC_ELT (elems, i); + TREE_VEC_ELT (folded_elems, i) = + (elem && !TYPE_P (elem)) ? cplus_expand_constant (elem) : elem; + + } + return folded_elems; +} + +/* The C++ implementation of the LANG_HOOKS_GET_INNERMOST_GENERIC_ARGS + hook. It returns the innermost template arguments of type T, and + makes sure those arguments are folded enough for the debug info + emitter. */ + +static tree +get_template_innermost_arguments_folded (const_tree t) +{ + return fold_cplus_constants (get_template_innermost_arguments (t)); +} + +static tree +get_template_argument_pack_elems_folded (const_tree t) +{ + return fold_cplus_constants (get_template_argument_pack_elems (t)); +} + #include "gt-cp-cp-lang.h" #include "gtype-cp.h" |