From 362ff856039fd10e1dc996d424d03dc02d410e5f Mon Sep 17 00:00:00 2001 From: Michael Chastain Date: Fri, 5 Dec 2003 04:25:09 +0000 Subject: 2003-12-04 Michael Chastain Partial fix for PR c++/1465. Fix for PR c++/1377. * cp-support.h (cp_lookup_rtti_type): New function. * cp-support.c (cp_lookup_rtti_type): New function. * gnu-v2-abi.c: Update copyright years. (gnuv2_rtti_type): Call cp_lookup_rtti_type. * gnu-v3-abi.c: Update copyright years. (gnuv3_rtti_type): Call cp_lookup_rtti_type. --- gdb/cp-support.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'gdb/cp-support.c') diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 9e6d44b..9b447fc 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -33,6 +33,7 @@ #include "symtab.h" #include "block.h" #include "complaints.h" +#include "gdbtypes.h" /* Functions related to demangled name parsing. */ @@ -582,6 +583,48 @@ make_symbol_overload_list (struct symbol *fsym) return (sym_return_val); } +/* Lookup the rtti type for a class name. */ + +struct type * +cp_lookup_rtti_type (const char *name, struct block *block) +{ + struct symbol * rtti_sym; + struct type * rtti_type; + + rtti_sym = lookup_symbol (name, block, STRUCT_DOMAIN, NULL, NULL); + + if (rtti_sym == NULL) + { + warning ("RTTI symbol not found for class '%s'", name); + return NULL; + } + + if (SYMBOL_CLASS (rtti_sym) != LOC_TYPEDEF) + { + warning ("RTTI symbol for class '%s' is not a type", name); + return NULL; + } + + rtti_type = SYMBOL_TYPE (rtti_sym); + + switch (TYPE_CODE (rtti_type)) + { + case TYPE_CODE_CLASS: + break; + case TYPE_CODE_NAMESPACE: + /* chastain/2003-11-26: the symbol tables often contain fake + symbols for namespaces with the same name as the struct. + This warning is an indication of a bug in the lookup order + or a bug in the way that the symbol tables are populated. */ + warning ("RTTI symbol for class '%s' is a namespace", name); + return NULL; + default: + warning ("RTTI symbol for class '%s' has bad type", name); + return NULL; + } + + return rtti_type; +} /* Don't allow just "maintenance cplus". */ -- cgit v1.1