public inbox for archer-commits@sourceware.org
help / color / mirror / Atom feed
* [SCM] archer-sergiodj-cpp-template-lookup: [C++-template-lookup] Import of the second patch.
@ 2012-05-25 21:01 sergiodj
0 siblings, 0 replies; only message in thread
From: sergiodj @ 2012-05-25 21:01 UTC (permalink / raw)
To: archer-commits
The branch, archer-sergiodj-cpp-template-lookup has been updated
via a3b0f75e14c85acaa29401987b6348075d7ecff3 (commit)
from 6436c52bbd3d7ccd54e67138dd7cee92cb371966 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit a3b0f75e14c85acaa29401987b6348075d7ecff3
Author: Sergio Durigan Junior <sergiodj@redhat.com>
Date: Fri May 25 17:58:39 2012 -0300
[C++-template-lookup] Import of the second patch.
URL: http://sourceware.org/ml/gdb-patches/2010-07/msg00285.html
-----------------------------------------------------------------------
Summary of changes:
gdb/c-typeprint.c | 6 ++
gdb/dwarf2read.c | 96 ++++++++++++++++++++++++++++--------
gdb/findvar.c | 4 ++
gdb/gdbtypes.h | 7 ++-
gdb/symtab.h | 4 ++
gdb/testsuite/gdb.cp/temp-op.cc | 28 ++++++++--
gdb/testsuite/gdb.cp/temp-op.exp | 18 +++++--
gdb/testsuite/gdb.cp/templates.exp | 15 ++++++
gdb/valops.c | 9 ++--
9 files changed, 151 insertions(+), 36 deletions(-)
First 500 lines of diff:
diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c
index a5892b5..7db9660 100644
--- a/gdb/c-typeprint.c
+++ b/gdb/c-typeprint.c
@@ -326,6 +326,7 @@ c_type_print_varspec_prefix (struct type *type,
case TYPE_CODE_COMPLEX:
case TYPE_CODE_NAMESPACE:
case TYPE_CODE_DECFLOAT:
+ case TYPE_CODE_TEMPLATE:
/* These types need no prefix. They are listed here so that
gcc -Wall will reveal any types that haven't been handled. */
break;
@@ -683,6 +684,7 @@ c_type_print_varspec_suffix (struct type *type,
case TYPE_CODE_COMPLEX:
case TYPE_CODE_NAMESPACE:
case TYPE_CODE_DECFLOAT:
+ case TYPE_CODE_TEMPLATE:
/* These types do not need a suffix. They are listed so that
gcc -Wall will report types that may not have been
considered. */
@@ -1238,6 +1240,10 @@ c_type_print_base (struct type *type, struct ui_file *stream,
fputs_filtered (TYPE_TAG_NAME (type), stream);
break;
+ case TYPE_CODE_TEMPLATE:
+ fputs_filtered ("Template Symbol", stream);
+ break;
+
default:
/* Handle types not explicitly handled by the other cases, such
as fundamental types. For these, just print whatever the
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 33fea34..cce2eae 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -13253,6 +13253,72 @@ var_decode_location (struct attribute *attr, struct symbol *sym,
cu->has_loclist = 1;
}
+static void
+add_template_variable (struct symbol *symbol, struct pending **listhead,
+ struct objfile *objfile)
+{
+ const struct pending *iterator;
+ struct symbol *template_sym;
+ struct symbol *iterator_sym;
+ struct type *type;
+ const char *name = SYMBOL_NATURAL_NAME (symbol);
+ char *search_name;
+ char *tmp;
+ int i;
+ struct cleanup *all_cleanups = make_cleanup (null_cleanup, NULL);
+
+ gdb_assert (name != NULL);
+ gdb_assert (listhead != NULL);
+
+ /* Remove template parameters from the symbol's name and set its
+ search name. */
+ tmp = cp_remove_template_params (name);
+
+ gdb_assert (tmp != NULL);
+ make_cleanup(xfree, tmp);
+
+ if (strcmp (tmp, name) == 0)
+ return;
+
+ search_name = obsavestring (tmp, strlen (tmp), &objfile->objfile_obstack);
+
+ symbol_set_cplus_search_name (&symbol->ginfo, objfile, search_name);
+
+ /* Has a template symbol for this symbol been added already? */
+ for (iterator = *(listhead); iterator != NULL; iterator = iterator->next)
+ {
+ for (i = iterator->nsyms - 1; i >= 0; --i)
+ {
+ iterator_sym = iterator->symbol[i];
+
+ if (TYPE_CODE (SYMBOL_TYPE (iterator_sym)) == TYPE_CODE_TEMPLATE
+ && strcmp (SYMBOL_SEARCH_NAME(iterator_sym), search_name) == 0)
+ {
+ do_cleanups (all_cleanups);
+ return;
+ }
+ }
+ }
+
+ /* Add a new template symbol. */
+ template_sym = (struct symbol *) obstack_alloc (&objfile->objfile_obstack,
+ sizeof (struct symbol));
+ OBJSTAT (objfile, n_syms++);
+ memset (template_sym, 0, sizeof (struct symbol));
+
+ SYMBOL_SET_NAMES (template_sym, search_name, strlen (search_name), 0, objfile);
+ type = alloc_type (objfile);
+ TYPE_CODE (type) = TYPE_CODE_TEMPLATE;
+ SYMBOL_TYPE (template_sym) = type;
+
+ SYMBOL_DOMAIN (template_sym) = VAR_DOMAIN;
+ SYMBOL_CLASS (template_sym) = LOC_TEMPLATE;
+
+ add_symbol_to_list (template_sym, listhead);
+
+ do_cleanups (all_cleanups);
+}
+
/* Given a pointer to a DWARF information entry, figure out if we need
to make a symbol table entry for it, and if so, create a new entry
and return a pointer to it.
@@ -13303,26 +13369,6 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
(char *) dwarf2_full_name (name, die, cu),
NULL);
- /* For C++ if the name contains template parameters remove them, and set
- the cleaned up name to be the search name. */
- if (cu->language == language_cplus && linkagename
- && cp_name_has_template_parameters (linkagename))
- {
- char *tmp = cp_remove_template_params (linkagename);
-
- if (tmp != NULL && strcmp (tmp, linkagename) != 0)
- {
- search_name = obsavestring (tmp, strlen (tmp),
- &objfile->objfile_obstack);
-
- symbol_set_cplus_search_name (&sym->ginfo,
- objfile,
- search_name);
- }
-
- xfree (tmp);
- }
-
/* Default assumptions.
Use the passed type or decode it from the die. */
SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
@@ -13623,7 +13669,15 @@ new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
}
if (list_to_add != NULL)
- add_symbol_to_list (sym, list_to_add);
+ {
+ /* For C++ if the name contains template parameters remove them, and set
+ the cleaned up name to be the search name. */
+ if (cu->language == language_cplus && sym->ginfo.name
+ && cp_name_has_template_parameters (sym->ginfo.name))
+ add_template_variable (sym, list_to_add, objfile);
+
+ add_symbol_to_list (sym, list_to_add);
+ }
/* For the benefit of old versions of GCC, check for anonymous
namespaces based on the demangled name. */
diff --git a/gdb/findvar.c b/gdb/findvar.c
index ed7903c..0190a1b 100644
--- a/gdb/findvar.c
+++ b/gdb/findvar.c
@@ -590,6 +590,10 @@ default_read_var_value (struct symbol *var, struct frame_info *frame)
case LOC_OPTIMIZED_OUT:
return allocate_optimized_out_value (type);
+ case LOC_TEMPLATE:
+ error (_("Symbol represents a template and cannot be evaluated."));
+ break;
+
default:
error (_("Cannot look up value of a botched symbol `%s'."),
SYMBOL_PRINT_NAME (var));
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h
index 887dfdb..dee4012 100644
--- a/gdb/gdbtypes.h
+++ b/gdb/gdbtypes.h
@@ -137,7 +137,12 @@ enum type_code
TYPE_CODE_MODULE, /* Fortran module. */
/* Internal function type. */
- TYPE_CODE_INTERNAL_FUNCTION
+ TYPE_CODE_INTERNAL_FUNCTION,
+
+ /* Types with this code are artificial types created to
+ serve as the root for the instantiations of a given
+ template. */
+ TYPE_CODE_TEMPLATE
};
/* For now allow source to use TYPE_CODE_CLASS for C++ classes, as an
diff --git a/gdb/symtab.h b/gdb/symtab.h
index 37cfd71..ee9cd09 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -516,6 +516,10 @@ enum address_class
/* The variable's address is computed by a set of location
functions (see "struct symbol_computed_ops" below). */
LOC_COMPUTED,
+
+ /* The variable is a meta variable representing a template
+ and has no location. */
+ LOC_TEMPLATE
};
/* The methods needed to implement LOC_COMPUTED. These methods can
diff --git a/gdb/testsuite/gdb.cp/temp-op.cc b/gdb/testsuite/gdb.cp/temp-op.cc
index 6d4b13d..b423c26 100644
--- a/gdb/testsuite/gdb.cp/temp-op.cc
+++ b/gdb/testsuite/gdb.cp/temp-op.cc
@@ -9,21 +9,35 @@ int foo (T, char)
return 11;
}
+template<typename T>
+int foo (T, int)
+{
+ T t;
+ return 1112;
+}
+
+template<typename T>
+int foo (T, float)
+{
+ T t;
+ return 1113;
+}
+
template<typename T, typename T2>
-int foo2 (T, T2, char)
+int foo (T, T2, char)
{
T t;
- return 11;
+ return 112;
}
namespace C
{
namespace D {
template<typename T, typename T2>
- int foo3 (T, T2, char)
+ int foo (T, T2, char)
{
T t;
- return 11;
+ return 113;
}
}
}
@@ -85,8 +99,10 @@ int main ()
foo (a, 'a');
foo (a, 1);
- foo2 (a, a, 'a');
- C::D::foo3 (a, a, 'a');
+ foo (a, 1.0f);
+
+ foo (a, a, 'a');
+ C::D::foo (a, a, 'a');
a << 22;
a < 22;
diff --git a/gdb/testsuite/gdb.cp/temp-op.exp b/gdb/testsuite/gdb.cp/temp-op.exp
index f48582f..bb4385b 100644
--- a/gdb/testsuite/gdb.cp/temp-op.exp
+++ b/gdb/testsuite/gdb.cp/temp-op.exp
@@ -40,8 +40,18 @@ if ![runto_main] then {
}
# Test that a templated function can be found
-# with out specification of template arguments
-gdb_test "p foo(a, 'a')" "= 11"
+# with out specification of template arguments.
+gdb_test "p foo(a, 'a')" "= 11"
+
+# Test that overload resolution is still performed
+# correctly.
+gdb_test "p foo(a, 1)" "= 1112"
+gdb_test "p foo(a, 1.0f)" "= 1113"
+
+# Test that fully qualifed names names are not
+# confused.
+gdb_test "p foo(a, a, 'a')" "= 112"
+gdb_test "p C::D::foo (a, a, 'a')" "= 113"
# Test that function names with '<' in their names
# are not mistaken for templates
@@ -64,5 +74,5 @@ gdb_test "p b == 'a'" "= 18"
# Test that printing the a template name without
# template parameters does not return an arbitrary match
-gdb_test "p foo" "No symbol \"foo\" in current context"
-gdb_test "ptype B" "No symbol \"foo\" in current context"
+gdb_test "print foo" "Symbol represents a template and cannot be evaluated."
+gdb_test "ptype B" "type = Template Symbol"
diff --git a/gdb/testsuite/gdb.cp/templates.exp b/gdb/testsuite/gdb.cp/templates.exp
index 72b65ae..12a7336 100644
--- a/gdb/testsuite/gdb.cp/templates.exp
+++ b/gdb/testsuite/gdb.cp/templates.exp
@@ -323,6 +323,9 @@ gdb_test_multiple "ptype Foo" "ptype Foo" {
# GCC 2.95.3, stabs+ output.
pass "ptype Foo"
}
+ -re "type = Template Symbol\r\n$gdb_prompt $" {
+ pass "ptype Foo"
+ }
}
# -re "type = class Foo<int> \\{\r\n\[ \t\]*public:\r\n\[ \t\]*int x;\r\n\[ \t\]*int t;\r\n\r\n\[ \t\]*int foo(int, int);\r\n\\}\r\n$gdb_prompt $"
@@ -406,6 +409,9 @@ gdb_test_multiple "ptype Bar" "ptype Bar" {
# GCC 2.95.3, stabs+ output.
pass "ptype Bar"
}
+ -re "type = Template Symbol\r\n$gdb_prompt $" {
+ pass "ptype Bar"
+ }
}
@@ -453,6 +459,9 @@ gdb_test_multiple "ptype Baz" "ptype Baz" {
# GCC 2.95.3, stabs+ output.
pass "ptype Baz"
}
+ -re "type = Template Symbol\r\n$gdb_prompt $" {
+ pass "ptype Baz"
+ }
}
@@ -499,6 +508,9 @@ gdb_test_multiple "ptype Qux" "ptype Qux" {
# GCC 2.95.3, stabs+ output.
pass "ptype Qux"
}
+ -re "type = Template Symbol\r\n$gdb_prompt $" {
+ pass "ptype Qux"
+ }
}
# pt Qux<int,&string>
@@ -537,6 +549,9 @@ gdb_test_multiple "ptype Spec" "ptype Spec" {
# GCC 2.95.3, stabs+ output.
pass "ptype Spec"
}
+ -re "type = Template Symbol\r\n$gdb_prompt $" {
+ pass "ptype Qux"
+ }
}
# pt Spec<char,0>
diff --git a/gdb/valops.c b/gdb/valops.c
index 563c9ea..50c6414 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -2686,15 +2686,16 @@ find_overload_match (struct value **args, int nargs,
if (fsym)
{
+ enum type_code code
+ = TYPE_CODE (check_typedef (SYMBOL_TYPE (fsym)));
qualified_name = SYMBOL_SEARCH_NAME (fsym);
/* If we have a function with a C++ name, try to extract just
the function part. Do not try this for non-functions (e.g.
function pointers). */
- if (qualified_name
- && TYPE_CODE (check_typedef (SYMBOL_TYPE (fsym)))
- == TYPE_CODE_FUNC)
- {
+ if (qualified_name
+ && (code == TYPE_CODE_FUNC || code == TYPE_CODE_TEMPLATE))
+ {
char *temp;
temp = cp_func_name (qualified_name);
hooks/post-receive
--
Repository for Project Archer.
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-05-25 21:01 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-25 21:01 [SCM] archer-sergiodj-cpp-template-lookup: [C++-template-lookup] Import of the second patch sergiodj
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).