From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21986 invoked by alias); 12 Jun 2003 02:11:49 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 21806 invoked from network); 12 Jun 2003 02:11:47 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 12 Jun 2003 02:11:47 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h5C2BlH15713 for ; Wed, 11 Jun 2003 22:11:47 -0400 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h5C2BlI31728 for ; Wed, 11 Jun 2003 22:11:47 -0400 Received: from localhost.redhat.com (IDENT:OB/uiVoq8xilbqf3gaB0d6aJmdJDMZ1f@tooth.toronto.redhat.com [172.16.14.29]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h5C2Bje02022; Wed, 11 Jun 2003 22:11:45 -0400 Received: by localhost.redhat.com (Postfix, from userid 469) id 4B6A92C985; Wed, 11 Jun 2003 22:18:11 -0400 (EDT) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <16103.58082.756463.577883@localhost.redhat.com> Date: Thu, 12 Jun 2003 02:11:00 -0000 To: David Carlton Cc: gdb-patches@sources.redhat.com, Elena Zannoni , Daniel Jacobowitz Subject: Re: [rfa] move make_symbol_overload_list to cp-support.c In-Reply-To: References: X-SW-Source: 2003-06/txt/msg00408.txt.bz2 David Carlton writes: > As previously discussed, here's a patch to move > make_symbol_overload_list and everything associated with it to > cp-support.c. It should be pretty obvious, and Daniel and Elena have > both agreed in principle, so I'll commit this once one of them gives a > thumbs-up. (I'm pretty sure I'm not missing anything - I just moved > code, so it's hard to imagine how anything could have gone wrong.) My thumbs are up. elena > > David Carlton > carlton@bactrian.org > > 2003-06-11 David Carlton > > * symtab.h: Delete declaration of make_symbol_overload_list. > Add declaration of lookup_partial_symbol. > * symtab.c (remove_params): Move to cp-support.c. > (overload_list_add_symbol, make_symbol_overload_list) > (sym_return_val_size, sym_return_val_index): Ditto. > symtab.c (lookup_partial_symbol): Make extern. > * cp-support.h: Add declaration of make_symbol_overload_list. > * cp-support.c: Include dictionary.h, objfiles.h, frame.h, > symtab.h, and block.h. > (remove_params): Move here from symtab.c. > (overload_list_add_symbol, make_symbol_overload_list) > (sym_return_val_size, sym_return_val_index): Ditto. > * valops.c: Include cp-support.h. > * Makefile.in (cp-support.o): Depend on dictionary_h, objfiles_h, > frame_h, and block_h. > (valops.o): Depend on cp_support_h. > > Index: symtab.h > =================================================================== > RCS file: /cvs/src/src/gdb/symtab.h,v > retrieving revision 1.74 > diff -u -p -r1.74 symtab.h > --- symtab.h 11 Jun 2003 23:29:48 -0000 1.74 > +++ symtab.h 12 Jun 2003 00:19:16 -0000 > @@ -1024,6 +1024,13 @@ extern struct symbol *lookup_symbol_aux_ > const domain_enum domain, > struct symtab **symtab); > > +/* Lookup a partial symbol. */ > + > +extern struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, > + const char *, > + const char *, int, > + domain_enum); > + > /* lookup a symbol by name, within a specified block */ > > extern struct symbol *lookup_block_symbol (const struct block *, const char *, > @@ -1285,8 +1292,6 @@ extern void select_source_symtab (struct > extern char **make_symbol_completion_list (char *, char *); > > extern char **make_file_symbol_completion_list (char *, char *, char *); > - > -extern struct symbol **make_symbol_overload_list (struct symbol *); > > extern char **make_source_files_completion_list (char *, char *); > > Index: symtab.c > =================================================================== > RCS file: /cvs/src/src/gdb/symtab.c,v > retrieving revision 1.111 > diff -u -p -r1.111 symtab.c > --- symtab.c 11 Jun 2003 23:29:48 -0000 1.111 > +++ symtab.c 12 Jun 2003 00:19:30 -0000 > @@ -77,11 +77,6 @@ static int find_line_common (struct line > > char *operator_chars (char *p, char **end); > > -static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *, > - const char *, > - const char *, int, > - domain_enum); > - > static struct symbol *lookup_symbol_aux (const char *name, > const char *linkage_name, > const struct block *block, > @@ -136,8 +131,6 @@ static void print_msymbol_info (struct m > > static void symtab_symbol_info (char *, domain_enum, int); > > -static void overload_list_add_symbol (struct symbol *sym, char *oload_name); > - > void _initialize_symtab (void); > > /* */ > @@ -1392,7 +1385,7 @@ lookup_symbol_global (const char *name, > linkage name matches it. Check the global symbols if GLOBAL, the > static symbols if not */ > > -static struct partial_symbol * > +struct partial_symbol * > lookup_partial_symbol (struct partial_symtab *pst, const char *name, > const char *linkage_name, int global, > domain_enum domain) > @@ -3922,211 +3915,6 @@ in_prologue (CORE_ADDR pc, CORE_ADDR fun > return func_addr <= pc && pc < sal.end; > } > > - > -/* Begin overload resolution functions */ > - > -static char * > -remove_params (const char *demangled_name) > -{ > - const char *argp; > - char *new_name; > - int depth; > - > - if (demangled_name == NULL) > - return NULL; > - > - /* First find the end of the arg list. */ > - argp = strrchr (demangled_name, ')'); > - if (argp == NULL) > - return NULL; > - > - /* Back up to the beginning. */ > - depth = 1; > - > - while (argp-- > demangled_name) > - { > - if (*argp == ')') > - depth ++; > - else if (*argp == '(') > - { > - depth --; > - > - if (depth == 0) > - break; > - } > - } > - if (depth != 0) > - internal_error (__FILE__, __LINE__, > - "bad demangled name %s\n", demangled_name); > - while (argp[-1] == ' ' && argp > demangled_name) > - argp --; > - > - new_name = xmalloc (argp - demangled_name + 1); > - memcpy (new_name, demangled_name, argp - demangled_name); > - new_name[argp - demangled_name] = '\0'; > - return new_name; > -} > - > -/* Helper routine for make_symbol_completion_list. */ > - > -static int sym_return_val_size; > -static int sym_return_val_index; > -static struct symbol **sym_return_val; > - > -/* Test to see if the symbol specified by SYMNAME (which is already > - demangled for C++ symbols) matches SYM_TEXT in the first SYM_TEXT_LEN > - characters. If so, add it to the current completion list. */ > - > -static void > -overload_list_add_symbol (struct symbol *sym, char *oload_name) > -{ > - int newsize; > - int i; > - char *sym_name; > - > - /* If there is no type information, we can't do anything, so skip */ > - if (SYMBOL_TYPE (sym) == NULL) > - return; > - > - /* skip any symbols that we've already considered. */ > - for (i = 0; i < sym_return_val_index; ++i) > - if (!strcmp (DEPRECATED_SYMBOL_NAME (sym), DEPRECATED_SYMBOL_NAME (sym_return_val[i]))) > - return; > - > - /* Get the demangled name without parameters */ > - sym_name = remove_params (SYMBOL_DEMANGLED_NAME (sym)); > - if (!sym_name) > - return; > - > - /* skip symbols that cannot match */ > - if (strcmp (sym_name, oload_name) != 0) > - { > - xfree (sym_name); > - return; > - } > - > - xfree (sym_name); > - > - /* We have a match for an overload instance, so add SYM to the current list > - * of overload instances */ > - if (sym_return_val_index + 3 > sym_return_val_size) > - { > - newsize = (sym_return_val_size *= 2) * sizeof (struct symbol *); > - sym_return_val = (struct symbol **) xrealloc ((char *) sym_return_val, newsize); > - } > - sym_return_val[sym_return_val_index++] = sym; > - sym_return_val[sym_return_val_index] = NULL; > -} > - > -/* Return a null-terminated list of pointers to function symbols that > - * match name of the supplied symbol FSYM. > - * This is used in finding all overloaded instances of a function name. > - * This has been modified from make_symbol_completion_list. */ > - > - > -struct symbol ** > -make_symbol_overload_list (struct symbol *fsym) > -{ > - register struct symbol *sym; > - register struct symtab *s; > - register struct partial_symtab *ps; > - register struct objfile *objfile; > - register struct block *b, *surrounding_static_block = 0; > - struct dict_iterator iter; > - /* The name we are completing on. */ > - char *oload_name = NULL; > - /* Length of name. */ > - int oload_name_len = 0; > - > - /* Look for the symbol we are supposed to complete on. */ > - > - oload_name = remove_params (SYMBOL_DEMANGLED_NAME (fsym)); > - if (!oload_name) > - { > - sym_return_val_size = 1; > - sym_return_val = (struct symbol **) xmalloc (2 * sizeof (struct symbol *)); > - sym_return_val[0] = fsym; > - sym_return_val[1] = NULL; > - > - return sym_return_val; > - } > - oload_name_len = strlen (oload_name); > - > - sym_return_val_size = 100; > - sym_return_val_index = 0; > - sym_return_val = (struct symbol **) xmalloc ((sym_return_val_size + 1) * sizeof (struct symbol *)); > - sym_return_val[0] = NULL; > - > - /* Read in all partial symtabs containing a partial symbol named > - OLOAD_NAME. */ > - > - ALL_PSYMTABS (objfile, ps) > - { > - struct partial_symbol **psym; > - > - /* If the psymtab's been read in we'll get it when we search > - through the blockvector. */ > - if (ps->readin) > - continue; > - > - if ((lookup_partial_symbol (ps, oload_name, NULL, 1, VAR_DOMAIN) > - != NULL) > - || (lookup_partial_symbol (ps, oload_name, NULL, 0, VAR_DOMAIN) > - != NULL)) > - PSYMTAB_TO_SYMTAB (ps); > - } > - > - /* Search upwards from currently selected frame (so that we can > - complete on local vars. */ > - > - for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) > - { > - if (!BLOCK_SUPERBLOCK (b)) > - { > - surrounding_static_block = b; /* For elimination of dups */ > - } > - > - /* Also catch fields of types defined in this places which match our > - text string. Only complete on types visible from current context. */ > - > - ALL_BLOCK_SYMBOLS (b, iter, sym) > - { > - overload_list_add_symbol (sym, oload_name); > - } > - } > - > - /* Go through the symtabs and check the externs and statics for > - symbols which match. */ > - > - ALL_SYMTABS (objfile, s) > - { > - QUIT; > - b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK); > - ALL_BLOCK_SYMBOLS (b, iter, sym) > - { > - overload_list_add_symbol (sym, oload_name); > - } > - } > - > - ALL_SYMTABS (objfile, s) > - { > - QUIT; > - b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK); > - /* Don't do this block twice. */ > - if (b == surrounding_static_block) > - continue; > - ALL_BLOCK_SYMBOLS (b, iter, sym) > - { > - overload_list_add_symbol (sym, oload_name); > - } > - } > - > - xfree (oload_name); > - > - return (sym_return_val); > -} > - > -/* End of overload resolution functions */ > > struct symtabs_and_lines > decode_line_spec (char *string, int funfirstline) > Index: cp-support.h > =================================================================== > RCS file: /cvs/src/src/gdb/cp-support.h,v > retrieving revision 1.5 > diff -u -p -r1.5 cp-support.h > --- cp-support.h 8 Jun 2003 18:27:13 -0000 1.5 > +++ cp-support.h 12 Jun 2003 00:19:39 -0000 > @@ -58,6 +58,7 @@ extern unsigned int cp_find_first_compon > > extern unsigned int cp_entire_prefix_len (const char *name); > > +extern struct symbol **make_symbol_overload_list (struct symbol *); > > /* Functions/variables from cp-namespace.c. */ > > Index: cp-support.c > =================================================================== > RCS file: /cvs/src/src/gdb/cp-support.c,v > retrieving revision 1.4 > diff -u -p -r1.4 cp-support.c > --- cp-support.c 8 Jun 2003 18:27:13 -0000 1.4 > +++ cp-support.c 12 Jun 2003 00:19:35 -0000 > @@ -27,6 +27,21 @@ > #include "demangle.h" > #include "gdb_assert.h" > #include "gdbcmd.h" > +#include "dictionary.h" > +#include "objfiles.h" > +#include "frame.h" > +#include "symtab.h" > +#include "block.h" > + > +/* Functions/variables related to overload resolution. */ > + > +static int sym_return_val_size; > +static int sym_return_val_index; > +static struct symbol **sym_return_val; > + > +static char *remove_params (const char *demangled_name); > + > +static void overload_list_add_symbol (struct symbol *sym, char *oload_name); > > /* The list of "maint cplus" commands. */ > > @@ -323,6 +338,204 @@ cp_entire_prefix_len (const char *name) > > return previous_len; > } > + > +/* Overload resolution functions. */ > + > +static char * > +remove_params (const char *demangled_name) > +{ > + const char *argp; > + char *new_name; > + int depth; > + > + if (demangled_name == NULL) > + return NULL; > + > + /* First find the end of the arg list. */ > + argp = strrchr (demangled_name, ')'); > + if (argp == NULL) > + return NULL; > + > + /* Back up to the beginning. */ > + depth = 1; > + > + while (argp-- > demangled_name) > + { > + if (*argp == ')') > + depth ++; > + else if (*argp == '(') > + { > + depth --; > + > + if (depth == 0) > + break; > + } > + } > + if (depth != 0) > + internal_error (__FILE__, __LINE__, > + "bad demangled name %s\n", demangled_name); > + while (argp[-1] == ' ' && argp > demangled_name) > + argp --; > + > + new_name = xmalloc (argp - demangled_name + 1); > + memcpy (new_name, demangled_name, argp - demangled_name); > + new_name[argp - demangled_name] = '\0'; > + return new_name; > +} > + > +/* Test to see if the symbol specified by SYMNAME (which is already > + demangled for C++ symbols) matches SYM_TEXT in the first SYM_TEXT_LEN > + characters. If so, add it to the current completion list. */ > + > +static void > +overload_list_add_symbol (struct symbol *sym, char *oload_name) > +{ > + int newsize; > + int i; > + char *sym_name; > + > + /* If there is no type information, we can't do anything, so skip */ > + if (SYMBOL_TYPE (sym) == NULL) > + return; > + > + /* skip any symbols that we've already considered. */ > + for (i = 0; i < sym_return_val_index; ++i) > + if (!strcmp (DEPRECATED_SYMBOL_NAME (sym), DEPRECATED_SYMBOL_NAME (sym_return_val[i]))) > + return; > + > + /* Get the demangled name without parameters */ > + sym_name = remove_params (SYMBOL_DEMANGLED_NAME (sym)); > + if (!sym_name) > + return; > + > + /* skip symbols that cannot match */ > + if (strcmp (sym_name, oload_name) != 0) > + { > + xfree (sym_name); > + return; > + } > + > + xfree (sym_name); > + > + /* We have a match for an overload instance, so add SYM to the current list > + * of overload instances */ > + if (sym_return_val_index + 3 > sym_return_val_size) > + { > + newsize = (sym_return_val_size *= 2) * sizeof (struct symbol *); > + sym_return_val = (struct symbol **) xrealloc ((char *) sym_return_val, newsize); > + } > + sym_return_val[sym_return_val_index++] = sym; > + sym_return_val[sym_return_val_index] = NULL; > +} > + > +/* Return a null-terminated list of pointers to function symbols that > + * match name of the supplied symbol FSYM. > + * This is used in finding all overloaded instances of a function name. > + * This has been modified from make_symbol_completion_list. */ > + > + > +struct symbol ** > +make_symbol_overload_list (struct symbol *fsym) > +{ > + register struct symbol *sym; > + register struct symtab *s; > + register struct partial_symtab *ps; > + register struct objfile *objfile; > + register struct block *b, *surrounding_static_block = 0; > + struct dict_iterator iter; > + /* The name we are completing on. */ > + char *oload_name = NULL; > + /* Length of name. */ > + int oload_name_len = 0; > + > + /* Look for the symbol we are supposed to complete on. */ > + > + oload_name = remove_params (SYMBOL_DEMANGLED_NAME (fsym)); > + if (!oload_name) > + { > + sym_return_val_size = 1; > + sym_return_val = (struct symbol **) xmalloc (2 * sizeof (struct symbol *)); > + sym_return_val[0] = fsym; > + sym_return_val[1] = NULL; > + > + return sym_return_val; > + } > + oload_name_len = strlen (oload_name); > + > + sym_return_val_size = 100; > + sym_return_val_index = 0; > + sym_return_val = (struct symbol **) xmalloc ((sym_return_val_size + 1) * sizeof (struct symbol *)); > + sym_return_val[0] = NULL; > + > + /* Read in all partial symtabs containing a partial symbol named > + OLOAD_NAME. */ > + > + ALL_PSYMTABS (objfile, ps) > + { > + struct partial_symbol **psym; > + > + /* If the psymtab's been read in we'll get it when we search > + through the blockvector. */ > + if (ps->readin) > + continue; > + > + if ((lookup_partial_symbol (ps, oload_name, NULL, 1, VAR_DOMAIN) > + != NULL) > + || (lookup_partial_symbol (ps, oload_name, NULL, 0, VAR_DOMAIN) > + != NULL)) > + PSYMTAB_TO_SYMTAB (ps); > + } > + > + /* Search upwards from currently selected frame (so that we can > + complete on local vars. */ > + > + for (b = get_selected_block (0); b != NULL; b = BLOCK_SUPERBLOCK (b)) > + { > + if (!BLOCK_SUPERBLOCK (b)) > + { > + surrounding_static_block = b; /* For elimination of dups */ > + } > + > + /* Also catch fields of types defined in this places which match our > + text string. Only complete on types visible from current context. */ > + > + ALL_BLOCK_SYMBOLS (b, iter, sym) > + { > + overload_list_add_symbol (sym, oload_name); > + } > + } > + > + /* Go through the symtabs and check the externs and statics for > + symbols which match. */ > + > + ALL_SYMTABS (objfile, s) > + { > + QUIT; > + b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK); > + ALL_BLOCK_SYMBOLS (b, iter, sym) > + { > + overload_list_add_symbol (sym, oload_name); > + } > + } > + > + ALL_SYMTABS (objfile, s) > + { > + QUIT; > + b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK); > + /* Don't do this block twice. */ > + if (b == surrounding_static_block) > + continue; > + ALL_BLOCK_SYMBOLS (b, iter, sym) > + { > + overload_list_add_symbol (sym, oload_name); > + } > + } > + > + xfree (oload_name); > + > + return (sym_return_val); > +} > + > > /* Don't allow just "maintenance cplus". */ > > Index: valops.c > =================================================================== > RCS file: /cvs/src/src/gdb/valops.c,v > retrieving revision 1.111 > diff -u -p -r1.111 valops.c > --- valops.c 11 Jun 2003 23:29:48 -0000 1.111 > +++ valops.c 12 Jun 2003 00:19:47 -0000 > @@ -36,6 +36,7 @@ > #include "block.h" > #include "infcall.h" > #include "dictionary.h" > +#include "cp-support.h" > > #include > #include "gdb_string.h" > Index: Makefile.in > =================================================================== > RCS file: /cvs/src/src/gdb/Makefile.in,v > retrieving revision 1.399 > diff -u -p -r1.399 Makefile.in > --- Makefile.in 11 Jun 2003 23:29:45 -0000 1.399 > +++ Makefile.in 12 Jun 2003 00:20:01 -0000 > @@ -1637,7 +1637,8 @@ cp-abi.o: cp-abi.c $(defs_h) $(value_h) > cp-namespace.o: cp-namespace.c $(defs_h) $(cp_support_h) $(gdb_obstack_h) \ > $(symtab_h) $(symfile_h) $(gdb_assert_h) $(block_h) > cp-support.o: cp-support.c $(defs_h) $(cp_support_h) $(gdb_string_h) \ > - $(demangle_h) $(gdb_assert_h) $(gdbcmd_h) > + $(demangle_h) $(gdb_assert_h) $(gdbcmd_h) $(dictionary_h) \ > + $(objfiles_h) $(frame_h) $(block_h) > cp-valprint.o: cp-valprint.c $(defs_h) $(gdb_obstack_h) $(symtab_h) \ > $(gdbtypes_h) $(expression_h) $(value_h) $(command_h) $(gdbcmd_h) \ > $(demangle_h) $(annotate_h) $(gdb_string_h) $(c_lang_h) $(target_h) \ > @@ -2349,7 +2350,7 @@ valarith.o: valarith.c $(defs_h) $(value > valops.o: valops.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(value_h) $(frame_h) \ > $(inferior_h) $(gdbcore_h) $(target_h) $(demangle_h) $(language_h) \ > $(gdbcmd_h) $(regcache_h) $(cp_abi_h) $(gdb_string_h) \ > - $(gdb_assert_h) $(block_h) $(dictionary_h) > + $(gdb_assert_h) $(block_h) $(dictionary_h) $(cp_support_h) > valprint.o: valprint.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \ > $(value_h) $(gdbcore_h) $(gdbcmd_h) $(target_h) $(language_h) \ > $(annotate_h) $(valprint_h) $(floatformat_h) $(doublest_h)