From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27989 invoked by alias); 29 Mar 2007 00:58:03 -0000 Received: (qmail 27169 invoked by uid 22791); 29 Mar 2007 00:57:57 -0000 X-Spam-Check-By: sourceware.org Received: from elrond.portugalmail.pt (HELO elrond.portugalmail.pt) (195.245.179.181) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 29 Mar 2007 01:57:52 +0100 Received: from localhost (localhost [127.0.0.1]) by elrond.portugalmail.pt (Postfix) with ESMTP id 13FEC3EA05 for ; Thu, 29 Mar 2007 01:56:09 +0100 (WEST) Received: from elrond.portugalmail.pt ([127.0.0.1]) by localhost (elrond.portugalmail.pt [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id I-oh4Xjo4IrE for ; Thu, 29 Mar 2007 01:56:08 +0100 (WEST) Received: from [127.0.0.1] (62.169.107.177.rev.optimus.pt [62.169.107.177]) (Authenticated sender: pedro_alves@portugalmail.pt) by elrond.portugalmail.pt (Postfix) with ESMTP id D60F943956 for ; Wed, 28 Mar 2007 21:15:50 +0100 (WEST) Message-ID: <4609B86B.5040706@portugalmail.pt> Date: Thu, 29 Mar 2007 00:58:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; pt-BR; rv:1.8.0.10) Gecko/20070221 Thunderbird/1.5.0.10 Mnenhy/0.7.4.0 MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: Re: Breaking in a c++ method with current language set to c. References: <45EB906B.6070408@portugalmail.pt> <20070305124143.GA14835@caradoc.them.org> <45F46F5A.5020906@portugalmail.pt> <20070327185802.GD28164@caradoc.them.org> In-Reply-To: <20070327185802.GD28164@caradoc.them.org> Content-Type: multipart/mixed; boundary="------------090507080704040803040508" X-Antivirus: avast! (VPS 000728-2, 28-03-2007), Outbound message X-Antivirus-Status: Clean X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-03/txt/msg00299.txt.bz2 This is a multi-part message in MIME format. --------------090507080704040803040508 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-length: 621 Daniel Jacobowitz wrote: > I like this much better. I tested using your version for Ada, and it > seemed to work - but we don't have test coverage for the problem case, > apparently, since commenting out the set_language call in > ada_lookup_symbol_in_language did not cause any test failures. I > think you should go ahead and remove the Ada-specific version. If > there's a problem we can fix it. > > Could you do that, and also check for overly long lines in your patch? > Thanks in advance. > OK, thanks for testing! I've committed the attached, plus the same testcase I originally sent. Cheers, Pedro Alves --------------090507080704040803040508 Content-Type: text/plain; name="cpp_break_in_c.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="cpp_break_in_c.diff" Content-length: 14486 gdb/ * linespec.c: Include language.h. (find_methods): Add language parameter. Call lookup_symbol_in_language. Pass language down. (add_matching_methods): Likewise. Call lookup_symbol_in_language. (add_constructors): Likewise. (find_method): Pass sym_class to collect_methods. (collect_methods): Add sym_class parameter. Pass language down. * symtab.c (lookup_symbol): Rename to ... (lookup_symbol_in_language): ... this. Add language parameter. Use passed language instead of current_language. (lookup_symbol): New as wrapper around lookup_symbol_in_language. (lookup_symbol_aux): Add language parameter. Use passed language instead of current_language. (search_symbols): Indent. * symtab.h (enum language): Forward declare. (lookup_symbol_in_language): Declare. (lookup_symbol): Update description. * ada-lang.h (lookup_symbol_in_language): Remove declaration. * ada-lang.c (restore_language): Remove. (lookup_symbol_in_language): Remove. --- gdb/ada-lang.c | 25 ------------------------- gdb/ada-lang.h | 11 ----------- gdb/linespec.c | 41 +++++++++++++++++++++++++---------------- gdb/symtab.c | 52 ++++++++++++++++++++++++++++++++++++---------------- gdb/symtab.h | 13 ++++++++++++- 5 files changed, 73 insertions(+), 69 deletions(-) Index: src/gdb/ada-lang.c =================================================================== --- src.orig/gdb/ada-lang.c 2007-03-14 19:38:42.000000000 +0000 +++ src/gdb/ada-lang.c 2007-03-28 00:15:28.000000000 +0100 @@ -4213,31 +4213,6 @@ add_symbols_from_enclosing_procs (struct { } -/* FIXME: The next two routines belong in symtab.c */ - -static void -restore_language (void *lang) -{ - set_language ((enum language) lang); -} - -/* As for lookup_symbol, but performed as if the current language - were LANG. */ - -struct symbol * -lookup_symbol_in_language (const char *name, const struct block *block, - domain_enum domain, enum language lang, - int *is_a_field_of_this, struct symtab **symtab) -{ - struct cleanup *old_chain - = make_cleanup (restore_language, (void *) current_language->la_language); - struct symbol *result; - set_language (lang); - result = lookup_symbol (name, block, domain, is_a_field_of_this, symtab); - do_cleanups (old_chain); - return result; -} - /* True if TYPE is definitely an artificial type supplied to a symbol for which no debugging information was given in the symbol file. */ Index: src/gdb/linespec.c =================================================================== --- src.orig/gdb/linespec.c 2007-03-14 19:38:42.000000000 +0000 +++ src/gdb/linespec.c 2007-03-28 00:23:30.000000000 +0100 @@ -37,6 +37,7 @@ #include "objc-lang.h" #include "linespec.h" #include "exceptions.h" +#include "language.h" /* We share this one with symtab.c, but it is not exported widely. */ @@ -75,6 +76,7 @@ static struct symtabs_and_lines find_met struct symbol *sym_class); static int collect_methods (char *copy, struct type *t, + struct symbol *sym_class, struct symbol **sym_arr); static NORETURN void cplusplus_error (const char *name, @@ -83,12 +85,15 @@ static NORETURN void cplusplus_error (co static int total_number_of_methods (struct type *type); -static int find_methods (struct type *, char *, struct symbol **); +static int find_methods (struct type *, char *, + enum language, struct symbol **); static int add_matching_methods (int method_counter, struct type *t, + enum language language, struct symbol **sym_arr); static int add_constructors (int method_counter, struct type *t, + enum language language, struct symbol **sym_arr); static void build_canonical_line_spec (struct symtab_and_line *, @@ -196,7 +201,8 @@ total_number_of_methods (struct type *ty Note that this function is g++ specific. */ static int -find_methods (struct type *t, char *name, struct symbol **sym_arr) +find_methods (struct type *t, char *name, enum language language, + struct symbol **sym_arr) { int i1 = 0; int ibase; @@ -206,8 +212,8 @@ find_methods (struct type *t, char *name unless we figure out how to get the physname without the name of the class, then the loop can't do any good. */ if (class_name - && (lookup_symbol (class_name, (struct block *) NULL, - STRUCT_DOMAIN, (int *) NULL, + && (lookup_symbol_in_language (class_name, (struct block *) NULL, + STRUCT_DOMAIN, language, (int *) NULL, (struct symtab **) NULL))) { int method_counter; @@ -238,12 +244,12 @@ find_methods (struct type *t, char *name if (strcmp_iw (name, method_name) == 0) /* Find all the overloaded methods with that name. */ - i1 += add_matching_methods (method_counter, t, + i1 += add_matching_methods (method_counter, t, language, sym_arr + i1); else if (strncmp (class_name, name, name_len) == 0 && (class_name[name_len] == '\0' || class_name[name_len] == '<')) - i1 += add_constructors (method_counter, t, + i1 += add_constructors (method_counter, t, language, sym_arr + i1); } } @@ -261,7 +267,8 @@ find_methods (struct type *t, char *name if (i1 == 0) for (ibase = 0; ibase < TYPE_N_BASECLASSES (t); ibase++) - i1 += find_methods (TYPE_BASECLASS (t, ibase), name, sym_arr + i1); + i1 += find_methods (TYPE_BASECLASS (t, ibase), name, + language, sym_arr + i1); return i1; } @@ -272,7 +279,7 @@ find_methods (struct type *t, char *name static int add_matching_methods (int method_counter, struct type *t, - struct symbol **sym_arr) + enum language language, struct symbol **sym_arr) { int field_counter; int i1 = 0; @@ -299,14 +306,15 @@ add_matching_methods (int method_counter } else phys_name = TYPE_FN_FIELD_PHYSNAME (f, field_counter); - + /* Destructor is handled by caller, don't add it to the list. */ if (is_destructor_name (phys_name) != 0) continue; - sym_arr[i1] = lookup_symbol (phys_name, + sym_arr[i1] = lookup_symbol_in_language (phys_name, NULL, VAR_DOMAIN, + language, (int *) NULL, (struct symtab **) NULL); if (sym_arr[i1]) @@ -333,7 +341,7 @@ add_matching_methods (int method_counter static int add_constructors (int method_counter, struct type *t, - struct symbol **sym_arr) + enum language language, struct symbol **sym_arr) { int field_counter; int i1 = 0; @@ -349,7 +357,7 @@ add_constructors (int method_counter, st { struct fn_field *f; char *phys_name; - + f = TYPE_FN_FIELDLIST1 (t, method_counter); /* GCC 3.x will never produce stabs stub methods, so @@ -362,8 +370,9 @@ add_constructors (int method_counter, st /* If this method is actually defined, include it in the list. */ - sym_arr[i1] = lookup_symbol (phys_name, + sym_arr[i1] = lookup_symbol_in_language (phys_name, NULL, VAR_DOMAIN, + language, (int *) NULL, (struct symtab **) NULL); if (sym_arr[i1]) @@ -1410,7 +1419,7 @@ find_method (int funfirstline, char ***c /* Find all methods with a matching name, and put them in sym_arr. */ - i1 = collect_methods (copy, t, sym_arr); + i1 = collect_methods (copy, t, sym_class, sym_arr); if (i1 == 1) { @@ -1466,7 +1475,7 @@ find_method (int funfirstline, char ***c static int collect_methods (char *copy, struct type *t, - struct symbol **sym_arr) + struct symbol *sym_class, struct symbol **sym_arr) { int i1 = 0; /* Counter for the symbol array. */ @@ -1488,7 +1497,7 @@ collect_methods (char *copy, struct type } } else - i1 = find_methods (t, copy, sym_arr); + i1 = find_methods (t, copy, SYMBOL_LANGUAGE (sym_class), sym_arr); return i1; } Index: src/gdb/symtab.c =================================================================== --- src.orig/gdb/symtab.c 2007-03-27 21:09:16.000000000 +0100 +++ src/gdb/symtab.c 2007-03-28 00:56:02.000000000 +0100 @@ -84,6 +84,7 @@ static struct symbol *lookup_symbol_aux const char *linkage_name, const struct block *block, const domain_enum domain, + enum language language, int *is_a_field_of_this, struct symtab **symtab); @@ -1079,9 +1080,10 @@ fixup_psymbol_section (struct partial_sy code). */ struct symbol * -lookup_symbol (const char *name, const struct block *block, - const domain_enum domain, int *is_a_field_of_this, - struct symtab **symtab) +lookup_symbol_in_language (const char *name, const struct block *block, + const domain_enum domain, enum language lang, + int *is_a_field_of_this, + struct symtab **symtab) { char *demangled_name = NULL; const char *modified_name = NULL; @@ -1093,7 +1095,7 @@ lookup_symbol (const char *name, const s /* If we are using C++ or Java, demangle the name before doing a lookup, so we can always binary search. */ - if (current_language->la_language == language_cplus) + if (lang == language_cplus) { demangled_name = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS); if (demangled_name) @@ -1103,7 +1105,7 @@ lookup_symbol (const char *name, const s needtofreename = 1; } } - else if (current_language->la_language == language_java) + else if (lang == language_java) { demangled_name = cplus_demangle (name, DMGL_ANSI | DMGL_PARAMS | DMGL_JAVA); @@ -1129,7 +1131,8 @@ lookup_symbol (const char *name, const s } returnval = lookup_symbol_aux (modified_name, mangled_name, block, - domain, is_a_field_of_this, symtab); + domain, lang, + is_a_field_of_this, symtab); if (needtofreename) xfree (demangled_name); @@ -1140,7 +1143,20 @@ lookup_symbol (const char *name, const s return returnval; } -/* Behave like lookup_symbol_aux except that NAME is the natural name +/* Behave like lookup_symbol_in_language, but performed with the + current language. */ + +struct symbol * +lookup_symbol (const char *name, const struct block *block, + domain_enum domain, int *is_a_field_of_this, + struct symtab **symtab) +{ + return lookup_symbol_in_language (name, block, domain, + current_language->la_language, + is_a_field_of_this, symtab); +} + +/* Behave like lookup_symbol except that NAME is the natural name of the symbol that we're looking for and, if LINKAGE_NAME is non-NULL, ensure that the symbol's linkage name matches as well. */ @@ -1148,9 +1164,11 @@ lookup_symbol (const char *name, const s static struct symbol * lookup_symbol_aux (const char *name, const char *linkage_name, const struct block *block, const domain_enum domain, + enum language language, int *is_a_field_of_this, struct symtab **symtab) { struct symbol *sym; + const struct language_defn *langdef; /* Make sure we do something sensible with is_a_field_of_this, since the callers that set this parameter to some non-null value will @@ -1168,13 +1186,15 @@ lookup_symbol_aux (const char *name, con if (sym != NULL) return sym; - /* If requested to do so by the caller and if appropriate for the - current language, check to see if NAME is a field of `this'. */ + /* If requested to do so by the caller and if appropriate for LANGUAGE, + check to see if NAME is a field of `this'. */ + + langdef = language_def (language); - if (current_language->la_value_of_this != NULL + if (langdef->la_value_of_this != NULL && is_a_field_of_this != NULL) { - struct value *v = current_language->la_value_of_this (0); + struct value *v = langdef->la_value_of_this (0); if (v && check_field (v, name)) { @@ -1185,12 +1205,11 @@ lookup_symbol_aux (const char *name, con } } - /* Now do whatever is appropriate for the current language to look + /* Now do whatever is appropriate for LANGUAGE to look up static and global variables. */ - sym = current_language->la_lookup_symbol_nonlocal (name, linkage_name, - block, domain, - symtab); + sym = langdef->la_lookup_symbol_nonlocal (name, linkage_name, + block, domain, symtab); if (sym != NULL) return sym; @@ -3070,7 +3089,8 @@ search_symbols (char *regexp, domain_enu || lookup_symbol (SYMBOL_LINKAGE_NAME (msymbol), (struct block *) NULL, VAR_DOMAIN, - 0, (struct symtab **) NULL) == NULL) + 0, (struct symtab **) NULL) + == NULL) found_misc = 1; } } Index: src/gdb/symtab.h =================================================================== --- src.orig/gdb/symtab.h 2007-03-14 19:38:42.000000000 +0000 +++ src/gdb/symtab.h 2007-03-28 00:26:44.000000000 +0100 @@ -34,6 +34,7 @@ struct block; struct blockvector; struct axs_value; struct agent_expr; +enum language; /* Some of the structures in this file are space critical. The space-critical structures are: @@ -1007,7 +1008,17 @@ extern int asm_demangle; extern struct symtab *lookup_symtab (const char *); -/* lookup a symbol by name (optional block, optional symtab) */ +/* lookup a symbol by name (optional block, optional symtab) in language */ + +extern struct symbol *lookup_symbol_in_language (const char *, + const struct block *, + const domain_enum, + enum language, + int *, + struct symtab **); + +/* lookup a symbol by name (optional block, optional symtab) + in the current language */ extern struct symbol *lookup_symbol (const char *, const struct block *, const domain_enum, int *, Index: src/gdb/ada-lang.h =================================================================== --- src.orig/gdb/ada-lang.h 2007-03-14 19:38:44.000000000 +0000 +++ src/gdb/ada-lang.h 2007-03-28 00:08:16.000000000 +0100 @@ -474,17 +474,6 @@ extern void ada_reset_thread_registers ( extern int ada_build_task_list (void); -/* Look up a symbol by name using the search conventions of - a specific language (optional block, optional symtab). - FIXME: Should be symtab.h. */ - -extern struct symbol *lookup_symbol_in_language (const char *, - const struct block *, - domain_enum, - enum language, - int *, - struct symtab **); - extern int ada_exception_catchpoint_p (struct breakpoint *b); extern struct symtab_and_line --------------090507080704040803040508--