From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 27582 invoked by alias); 6 Dec 2011 18:54:04 -0000 Received: (qmail 27566 invoked by uid 22791); 6 Dec 2011 18:54:03 -0000 X-SWARE-Spam-Status: No, hits=-6.8 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,SPF_HELO_PASS,TW_CP X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 06 Dec 2011 18:53:42 +0000 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id pB6IrEYa012724 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 6 Dec 2011 13:53:20 -0500 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx09.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id pB6IchNw021749; Tue, 6 Dec 2011 13:38:44 -0500 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id pB6Icgrc032492; Tue, 6 Dec 2011 13:38:43 -0500 From: Tom Tromey To: Joel Brobecker Cc: gdb-patches@sourceware.org Subject: Re: creating the gdb-7.4 branch tomorrow (?) References: <20111205081911.GG28486@adacore.com> Date: Tue, 06 Dec 2011 19:05:00 -0000 In-Reply-To: <20111205081911.GG28486@adacore.com> (Joel Brobecker's message of "Mon, 5 Dec 2011 09:19:11 +0100") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.92 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" 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: 2011-12/txt/msg00192.txt.bz2 --=-=-= Content-Type: text/plain Content-length: 58 Here is patch #4. This fixes some Ada regressions. Tom --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=0004-ada-patch.patch Content-Description: patch 4 Content-length: 11387 diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index f960a25..250aba2 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -5052,6 +5052,36 @@ done: return ndefns; } +/* Implementation of the la_iterate_over_symbols method. */ + +static void +ada_iterate_over_symbols (const struct block *block, + const char *name, domain_enum domain, + int (*callback) (struct symbol *, void *), + void *data) +{ + int ndefs, i; + struct ada_symbol_info *results; + char *canon; + int nlen = strlen (name); + + if (name[0] == '<' && name[nlen - 1] == '>') + { + canon = alloca (nlen - 1); + memcpy (canon, name + 1, nlen - 2); + canon[nlen - 2] = '\0'; + } + else + canon = ada_encode (ada_fold_name (name)); + + ndefs = ada_lookup_symbol_list (canon, block, domain, &results); + for (i = 0; i < ndefs; ++i) + { + if (! (*callback) (results[i].sym, data)) + break; + } +} + struct symbol * ada_lookup_encoded_symbol (const char *name, const struct block *block0, domain_enum namespace, struct block **block_found) @@ -12282,6 +12312,7 @@ const struct language_defn ada_language_defn = { ada_print_array_index, default_pass_by_reference, c_get_string, + ada_iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 3a35a78..81e7849 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -863,6 +863,7 @@ const struct language_defn c_language_defn = default_print_array_index, default_pass_by_reference, c_get_string, + iterate_over_symbols, LANG_MAGIC }; @@ -984,6 +985,7 @@ const struct language_defn cplus_language_defn = default_print_array_index, cp_pass_by_reference, c_get_string, + iterate_over_symbols, LANG_MAGIC }; @@ -1023,6 +1025,7 @@ const struct language_defn asm_language_defn = default_print_array_index, default_pass_by_reference, c_get_string, + iterate_over_symbols, LANG_MAGIC }; @@ -1067,6 +1070,7 @@ const struct language_defn minimal_language_defn = default_print_array_index, default_pass_by_reference, c_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/d-lang.c b/gdb/d-lang.c index c0599a5..44ff68a 100644 --- a/gdb/d-lang.c +++ b/gdb/d-lang.c @@ -273,6 +273,7 @@ static const struct language_defn d_language_defn = default_print_array_index, default_pass_by_reference, c_get_string, + NULL, LANG_MAGIC }; diff --git a/gdb/f-lang.c b/gdb/f-lang.c index f538eee..7a8516d 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -309,6 +309,7 @@ const struct language_defn f_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index 4eae356..ce65a2d 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1197,6 +1197,7 @@ const struct language_defn java_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/language.c b/gdb/language.c index 825c02d..701c479 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1200,6 +1200,7 @@ const struct language_defn unknown_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; @@ -1241,6 +1242,7 @@ const struct language_defn auto_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; @@ -1280,6 +1282,7 @@ const struct language_defn local_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/language.h b/gdb/language.h index 1ff575f..82e6a88 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -318,6 +318,26 @@ struct language_defn void (*la_get_string) (struct value *value, gdb_byte **buffer, int *length, struct type **chartype, const char **charset); + /* Find all symbols in the current program space matching NAME in + DOMAIN, according to this language's rules. + + The search starts with BLOCK. This function iterates upward + through blocks. When the outermost block has been finished, + the function returns. + + For each one, call CALLBACK with the symbol and the DATA + argument. If CALLBACK returns zero, the iteration ends at that + point. + + This field can be NULL, meaning that this language doesn't need + any special code aside from ordinary searches of the symbol + table. */ + void (*la_iterate_over_symbols) (const struct block *block, + const char *name, + domain_enum domain, + int (*callback) (struct symbol *, void *), + void *data); + /* Add fields above this point, so the magic number is always last. */ /* Magic number for compat checking. */ @@ -422,6 +442,10 @@ extern enum language set_language (enum language); #define LA_PRINT_ARRAY_INDEX(index_value, stream, options) \ (current_language->la_print_array_index(index_value, stream, options)) +#define LA_ITERATE_OVER_SYMBOLS(BLOCK, NAME, DOMAIN, CALLBACK, DATA) \ + (current_language->la_iterate_over_symbols (BLOCK, NAME, DOMAIN, CALLBACK, \ + DATA)) + /* Test a character to decide whether it can be printed in literal form or needs to be printed in another representation. For example, in C the literal form of the character with octal value 141 is 'a' diff --git a/gdb/linespec.c b/gdb/linespec.c index f8ae062..8b357a3 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -375,8 +375,9 @@ iterate_over_all_matching_symtabs (const char *name, if (symtab->primary) { struct block *block; + block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK); - iterate_over_symbols (block, name, domain, callback, data); + LA_ITERATE_OVER_SYMBOLS (block, name, domain, callback, data); } } } @@ -1836,10 +1837,10 @@ lookup_prefix_sym (char **argptr, char *p, VEC (symtab_p) *file_symtabs, gdb_assert (!SYMTAB_PSPACE (elt)->executing_startup); set_current_program_space (SYMTAB_PSPACE (elt)); search_block = get_search_block (elt); - iterate_over_symbols (search_block, copy, STRUCT_DOMAIN, - collect_one_symbol, &collector); - iterate_over_symbols (search_block, copy, VAR_DOMAIN, - collect_one_symbol, &collector); + LA_ITERATE_OVER_SYMBOLS (search_block, copy, STRUCT_DOMAIN, + collect_one_symbol, &collector); + LA_ITERATE_OVER_SYMBOLS (search_block, copy, VAR_DOMAIN, + collect_one_symbol, &collector); } } @@ -2191,28 +2192,6 @@ find_function_symbols (char **argptr, char *p, int is_quote_enclosed, iterate_over_all_matching_symtabs (copy, VAR_DOMAIN, collect_function_symbols, &result, NULL); - /* If looking up the given name failed, try using the current - language to look up a symbol. This may augment the search. If a - symbol is found this way, repeat the iteration, but using the - discovered name. */ - if (VEC_empty (symbolp, result) - && current_language->la_language == language_ada) - { - struct symbol *function_symbol; - - function_symbol = lookup_symbol (copy, get_selected_block (0), - VAR_DOMAIN, 0); - if (function_symbol && SYMBOL_CLASS (function_symbol) == LOC_BLOCK) - { - xfree (copy); - copy = xstrdup (SYMBOL_SEARCH_NAME (function_symbol)); - *user_function = copy; - iterate_over_all_matching_symtabs (copy, VAR_DOMAIN, - collect_function_symbols, - &result, NULL); - } - } - if (VEC_empty (symbolp, result)) VEC_free (symbolp, result); else @@ -2807,9 +2786,9 @@ add_matching_symbols_to_info (const char *name, been filtered out earlier. */ gdb_assert (!SYMTAB_PSPACE (elt)->executing_startup); set_current_program_space (SYMTAB_PSPACE (elt)); - iterate_over_symbols (get_search_block (elt), name, - VAR_DOMAIN, collect_symbols, - info); + LA_ITERATE_OVER_SYMBOLS (get_search_block (elt), name, + VAR_DOMAIN, collect_symbols, + info); } } } @@ -2842,22 +2821,6 @@ decode_variable (struct linespec_state *self, char *copy) add_matching_symbols_to_info (lookup_name, &info, NULL); - /* If looking up the given name failed, try using the current - language to look up a symbol. This may augment the search. If a - symbol is found this way, repeat the iteration, but using the - discovered name. */ - if (info.result.nelts == 0 && current_language->la_language == language_ada) - { - struct symbol *sym; - - sym = lookup_symbol (lookup_name, get_selected_block (0), VAR_DOMAIN, 0); - if (sym) - { - copy = SYMBOL_SEARCH_NAME (sym); - add_matching_symbols_to_info (copy, &info, NULL); - } - } - if (info.result.nelts > 0) { if (self->canonical) diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index f83c622..106dfcf 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -401,6 +401,7 @@ const struct language_defn m2_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index dcf9459..1da92a5 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -541,6 +541,7 @@ const struct language_defn objc_language_defn = { default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index 05955b4..895a51c 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1024,6 +1024,7 @@ const struct language_defn opencl_language_defn = default_print_array_index, default_pass_by_reference, c_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/p-lang.c b/gdb/p-lang.c index 655279b..30b890f 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -459,6 +459,7 @@ const struct language_defn pascal_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + iterate_over_symbols, LANG_MAGIC }; diff --git a/gdb/testsuite/gdb.ada/homonym.exp b/gdb/testsuite/gdb.ada/homonym.exp index b5dff1b..d568633 100644 --- a/gdb/testsuite/gdb.ada/homonym.exp +++ b/gdb/testsuite/gdb.ada/homonym.exp @@ -31,6 +31,24 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug]] != "" } clean_restart ${testfile} + +# Do these tests before running, so we are operating in a known +# environment. + +gdb_test "break Get_Value" \ + "Breakpoint \[0-9\]+ at $hex: Get_Value. .2 locations." \ + "set breakpoint at Get_Value" + +gdb_test "break homonym.adb:Get_Value" \ + "Breakpoint \[0-9\]+ at $hex: homonym.adb:Get_Value. .2 locations." \ + "set breakpoint at homonym.adb:Get_Value" + +gdb_test "break " \ + "Breakpoint \[0-9\]+ at $hex: . .2 locations." \ + "set breakpoint at " + +delete_breakpoints + set bp_location [gdb_get_line_number "BREAK_1" ${testdir}/homonym.adb] runto "homonym.adb:$bp_location" @@ -86,6 +104,3 @@ gdb_test "ptype lcl" \ gdb_test "print lcl" \ "= 17" \ "print lcl at BREAK_2" - - - -- 1.7.6.4 --=-=-=--