From patchwork Mon Oct 27 04:24:52 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Doug Evans X-Patchwork-Id: 3392 Received: (qmail 25649 invoked by alias); 27 Oct 2014 04:25:44 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 25639 invoked by uid 89); 27 Oct 2014 04:25:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.2 required=5.0 tests=AWL, BAYES_00, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, KAM_STOCKGEN, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=no version=3.3.2 X-HELO: mail-pa0-f52.google.com Received: from mail-pa0-f52.google.com (HELO mail-pa0-f52.google.com) (209.85.220.52) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Mon, 27 Oct 2014 04:25:41 +0000 Received: by mail-pa0-f52.google.com with SMTP id fa1so2963302pad.39 for ; Sun, 26 Oct 2014 21:25:40 -0700 (PDT) X-Received: by 10.68.68.141 with SMTP id w13mr12752830pbt.82.1414383939949; Sun, 26 Oct 2014 21:25:39 -0700 (PDT) Received: from seba.sebabeach.org.gmail.com (173-13-178-50-sfba.hfc.comcastbusiness.net. [173.13.178.50]) by mx.google.com with ESMTPSA id yp10sm9613421pac.18.2014.10.26.21.25.39 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Oct 2014 21:25:39 -0700 (PDT) From: Doug Evans To: gdb-patches@sourceware.org Subject: [PATCH 1/9] Move lookup_block_symbol from symtab.c to block.c. Date: Sun, 26 Oct 2014 21:24:52 -0700 Message-ID: MIME-Version: 1.0 X-IsSubscribed: yes Hi. This patch moves lookup_block_symbol from symtab.c to block.c, and renames it to block_lookup_symbol. There is another function, lookup_symbol_aux_block, and the names lookup_block_symbol and lookup_symbol_aux_block don't convey any real difference between them. ["aux" doesn't convey any real meaning either, that's taken care of in other patches in this series] The difference is that lookup_block_symbol lives in the lower level block API, and lookup_symbol_aux_block lives in the higher level symtab API. This patch makes this distinction clear. 2014-10-26 Doug Evans * symtab.c (lookup_block_symbol): Moved to ... * block.c (block_lookup_symbol): ... here and renamed. All callers updated. * block.h (block_lookup_symbol): Declare. * symtab.h (lookup_block_symbol): Delete. diff --git a/gdb/block.c b/gdb/block.c index 8d40c9d..3bb9de0 100644 --- a/gdb/block.c +++ b/gdb/block.c @@ -685,3 +685,61 @@ block_iter_match_next (const char *name, return block_iter_match_step (iterator, name, compare, 0); } + +/* See block.h. + + Note that if NAME is the demangled form of a C++ symbol, we will fail + to find a match during the binary search of the non-encoded names, but + for now we don't worry about the slight inefficiency of looking for + a match we'll never find, since it will go pretty quick. Once the + binary search terminates, we drop through and do a straight linear + search on the symbols. Each symbol which is marked as being a ObjC/C++ + symbol (language_cplus or language_objc set) has both the encoded and + non-encoded names tested for a match. */ + +struct symbol * +block_lookup_symbol (const struct block *block, const char *name, + const domain_enum domain) +{ + struct block_iterator iter; + struct symbol *sym; + + if (!BLOCK_FUNCTION (block)) + { + for (sym = block_iter_name_first (block, name, &iter); + sym != NULL; + sym = block_iter_name_next (name, &iter)) + { + if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), + SYMBOL_DOMAIN (sym), domain)) + return sym; + } + return NULL; + } + else + { + /* Note that parameter symbols do not always show up last in the + list; this loop makes sure to take anything else other than + parameter symbols first; it only uses parameter symbols as a + last resort. Note that this only takes up extra computation + time on a match. */ + + struct symbol *sym_found = NULL; + + for (sym = block_iter_name_first (block, name, &iter); + sym != NULL; + sym = block_iter_name_next (name, &iter)) + { + if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), + SYMBOL_DOMAIN (sym), domain)) + { + sym_found = sym; + if (!SYMBOL_IS_ARGUMENT (sym)) + { + break; + } + } + } + return (sym_found); /* Will be NULL if not found. */ + } +} diff --git a/gdb/block.h b/gdb/block.h index 30aaf98..e8d3452 100644 --- a/gdb/block.h +++ b/gdb/block.h @@ -271,6 +271,12 @@ extern struct symbol *block_iter_match_next (const char *name, symbol_compare_ftype *compare, struct block_iterator *iterator); +/* Search BLOCK for symbol NAME in DOMAIN. */ + +extern struct symbol *block_lookup_symbol (const struct block *block, + const char *name, + const domain_enum domain); + /* Macro to loop through all symbols in BLOCK, in no particular order. ITER helps keep track of the iteration, and must be a struct block_iterator. SYM points to the current symbol. */ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 3f2a127..b12b0d5 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -3616,7 +3616,7 @@ dw2_lookup_symbol (struct objfile *objfile, int block_index, const struct blockvector *bv = BLOCKVECTOR (stab); struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); - sym = lookup_block_symbol (block, name, domain); + sym = block_lookup_symbol (block, name, domain); } if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) diff --git a/gdb/psymtab.c b/gdb/psymtab.c index 6c0c880..2514b55 100644 --- a/gdb/psymtab.c +++ b/gdb/psymtab.c @@ -519,7 +519,7 @@ lookup_symbol_aux_psymtabs (struct objfile *objfile, const struct blockvector *bv = BLOCKVECTOR (stab); struct block *block = BLOCKVECTOR_BLOCK (bv, block_index); - sym = lookup_block_symbol (block, name, domain); + sym = block_lookup_symbol (block, name, domain); } if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0) @@ -2038,7 +2038,7 @@ maintenance_check_psymtabs (char *ignore, int from_tty) length = ps->n_static_syms; while (length--) { - sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym), + sym = block_lookup_symbol (b, SYMBOL_LINKAGE_NAME (*psym), SYMBOL_DOMAIN (*psym)); if (!sym) { @@ -2055,7 +2055,7 @@ maintenance_check_psymtabs (char *ignore, int from_tty) length = ps->n_global_syms; while (length--) { - sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym), + sym = block_lookup_symbol (b, SYMBOL_LINKAGE_NAME (*psym), SYMBOL_DOMAIN (*psym)); if (!sym) { diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c index 032f5de..30e569f 100644 --- a/gdb/spu-tdep.c +++ b/gdb/spu-tdep.c @@ -1987,7 +1987,7 @@ spu_catch_start (struct objfile *objfile) struct symbol *sym; struct symtab_and_line sal; - sym = lookup_block_symbol (block, "main", VAR_DOMAIN); + sym = block_lookup_symbol (block, "main", VAR_DOMAIN); if (sym) { fixup_symbol_section (sym, objfile); diff --git a/gdb/symtab.c b/gdb/symtab.c index ed164f7..c27ea51 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -1344,7 +1344,7 @@ lookup_language_this (const struct language_defn *lang, { struct symbol *sym; - sym = lookup_block_symbol (block, lang->la_name_of_this, VAR_DOMAIN); + sym = block_lookup_symbol (block, lang->la_name_of_this, VAR_DOMAIN); if (sym != NULL) { block_found = block; @@ -1570,7 +1570,7 @@ lookup_symbol_aux_block (const char *name, const struct block *block, { struct symbol *sym; - sym = lookup_block_symbol (block, name, domain); + sym = block_lookup_symbol (block, name, domain); if (sym) { block_found = block; @@ -1602,7 +1602,7 @@ lookup_global_symbol_from_objfile (const struct objfile *main_objfile, { bv = BLOCKVECTOR (s); block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - sym = lookup_block_symbol (block, name, domain); + sym = block_lookup_symbol (block, name, domain); if (sym) { block_found = block; @@ -1637,7 +1637,7 @@ lookup_symbol_aux_objfile (struct objfile *objfile, int block_index, { bv = BLOCKVECTOR (s); block = BLOCKVECTOR_BLOCK (bv, block_index); - sym = lookup_block_symbol (block, name, domain); + sym = block_lookup_symbol (block, name, domain); if (sym) { block_found = block; @@ -1745,7 +1745,7 @@ lookup_symbol_aux_quick (struct objfile *objfile, int block_index, bv = BLOCKVECTOR (symtab); block = BLOCKVECTOR_BLOCK (bv, block_index); - sym = lookup_block_symbol (block, name, domain); + sym = block_lookup_symbol (block, name, domain); if (!sym) error_in_psymtab_expansion (block_index, name, symtab); block_found = block; @@ -1929,7 +1929,7 @@ basic_lookup_transparent_type_quick (struct objfile *objfile, int block_index, bv = BLOCKVECTOR (symtab); block = BLOCKVECTOR_BLOCK (bv, block_index); - sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + sym = block_lookup_symbol (block, name, STRUCT_DOMAIN); if (!sym) error_in_psymtab_expansion (block_index, name, symtab); @@ -1966,7 +1966,7 @@ basic_lookup_transparent_type (const char *name) { bv = BLOCKVECTOR (s); block = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK); - sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + sym = block_lookup_symbol (block, name, STRUCT_DOMAIN); if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) { return SYMBOL_TYPE (sym); @@ -1994,7 +1994,7 @@ basic_lookup_transparent_type (const char *name) { bv = BLOCKVECTOR (s); block = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK); - sym = lookup_block_symbol (block, name, STRUCT_DOMAIN); + sym = block_lookup_symbol (block, name, STRUCT_DOMAIN); if (sym && !TYPE_IS_OPAQUE (SYMBOL_TYPE (sym))) { return SYMBOL_TYPE (sym); @@ -2012,64 +2012,6 @@ basic_lookup_transparent_type (const char *name) return (struct type *) 0; } -/* See symtab.h. - - Note that if NAME is the demangled form of a C++ symbol, we will fail - to find a match during the binary search of the non-encoded names, but - for now we don't worry about the slight inefficiency of looking for - a match we'll never find, since it will go pretty quick. Once the - binary search terminates, we drop through and do a straight linear - search on the symbols. Each symbol which is marked as being a ObjC/C++ - symbol (language_cplus or language_objc set) has both the encoded and - non-encoded names tested for a match. */ - -struct symbol * -lookup_block_symbol (const struct block *block, const char *name, - const domain_enum domain) -{ - struct block_iterator iter; - struct symbol *sym; - - if (!BLOCK_FUNCTION (block)) - { - for (sym = block_iter_name_first (block, name, &iter); - sym != NULL; - sym = block_iter_name_next (name, &iter)) - { - if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), - SYMBOL_DOMAIN (sym), domain)) - return sym; - } - return NULL; - } - else - { - /* Note that parameter symbols do not always show up last in the - list; this loop makes sure to take anything else other than - parameter symbols first; it only uses parameter symbols as a - last resort. Note that this only takes up extra computation - time on a match. */ - - struct symbol *sym_found = NULL; - - for (sym = block_iter_name_first (block, name, &iter); - sym != NULL; - sym = block_iter_name_next (name, &iter)) - { - if (symbol_matches_domain (SYMBOL_LANGUAGE (sym), - SYMBOL_DOMAIN (sym), domain)) - { - sym_found = sym; - if (!SYMBOL_IS_ARGUMENT (sym)) - { - break; - } - } - } - return (sym_found); /* Will be NULL if not found. */ - } -} - /* Iterate over the symbols named NAME, matching DOMAIN, in BLOCK. For each symbol that matches, CALLBACK is called. The symbol and diff --git a/gdb/symtab.h b/gdb/symtab.h index 73108f0..7fa42a6 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1125,11 +1125,6 @@ extern struct symbol *lookup_language_this (const struct language_defn *lang, extern struct symbol *lookup_static_symbol_aux (const char *name, const domain_enum domain); -/* Search BLOCK for symbol NAME in DOMAIN. */ - -extern struct symbol *lookup_block_symbol (const struct block *, const char *, - const domain_enum); - /* Lookup a [struct, union, enum] by name, within a specified block. */ extern struct type *lookup_struct (const char *, const struct block *);