summaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2011-01-11 21:20:07 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2011-01-11 22:20:07 +0100
commitf8fb7295298da14f3ae81d27f9c926ede96d466a (patch)
treeb4919cd666c7d15bbfab15b801b4cb125555091a /gcc/cp
parentdc6715320db92089b3c1b046157b56b5680738a5 (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/cp/cp-lang.c77
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"