* ada-lang.c (struct add_partial_datum): Update the comment for
	expand_partial_symbol_name.
	(ada_add_partial_symbol_completions): Rename to ...
	(ada_expand_partial_symbol_name): ... here, change return type, update
	function comment, call symbol_completion_match instead of
	symbol_completion_add.
	(ada_make_symbol_completion_list): Use now expand_partial_symbol_names
	and ada_expand_partial_symbol_name.
	* dwarf2read.c (dw2_expand_symtabs_matching): Support NULL
	FILE_MATCHER.
	(dw2_map_symbol_names): Remove.
	(dwarf2_gdb_index_functions): Unlist dw2_map_symbol_names.
	* psymtab.c (map_symbol_names_psymtab): Remove.
	(expand_symtabs_matching_via_partial): Support NULL FILE_MATCHER.
	Support KIND == ALL_DOMAIN.  Exchange the NAME_MATCHER and KIND check
	order.
	(psym_functions): Unlist map_symbol_names_psymtab.
	(map_partial_symbol_names): Rename to ...
	(expand_partial_symbol_names): ... here, change the FUN type, call
	expand_symtabs_matching with ALL_DOMAIN and NULL FILE_MATCHER now.
	* psymtab.h (map_partial_symbol_names): Rename to ...
	(expand_partial_symbol_names): ... here, change the FUN type.
	* symfile.h (struct quick_symbol_functions): Update the description of
	expand_symtabs_matching.  Remove map_symbol_names.
	* symtab.c (search_symbols): Add ALL_DOMAIN to the function comment.
	(struct add_name_data): Update the comment for
	expand_partial_symbol_name.
	(add_partial_symbol_name): Rename to ...
	(expand_partial_symbol_name): ... here.  Replace
	completion_list_add_name call by strncmp.
	(default_make_symbol_completion_list_break_on): Use now
	expand_partial_symbol_names and expand_partial_symbol_name.
	* symtab.h (enum search_domain): New element ALL_DOMAIN.

gdb/testsuite/
	* gdb.cp/cpcompletion.exp (complete class methods)
	(complete class methods beginning with F): Move them above runto.  New
	comment about the runto delimiter.
This commit is contained in:
Jan Kratochvil 2011-04-20 19:42:51 +00:00
parent 4ff224cb8d
commit 7b08b9eb12
10 changed files with 115 additions and 140 deletions

View File

@ -1,3 +1,39 @@
2011-04-20 Jan Kratochvil <jan.kratochvil@redhat.com>
* ada-lang.c (struct add_partial_datum): Update the comment for
expand_partial_symbol_name.
(ada_add_partial_symbol_completions): Rename to ...
(ada_expand_partial_symbol_name): ... here, change return type, update
function comment, call symbol_completion_match instead of
symbol_completion_add.
(ada_make_symbol_completion_list): Use now expand_partial_symbol_names
and ada_expand_partial_symbol_name.
* dwarf2read.c (dw2_expand_symtabs_matching): Support NULL
FILE_MATCHER.
(dw2_map_symbol_names): Remove.
(dwarf2_gdb_index_functions): Unlist dw2_map_symbol_names.
* psymtab.c (map_symbol_names_psymtab): Remove.
(expand_symtabs_matching_via_partial): Support NULL FILE_MATCHER.
Support KIND == ALL_DOMAIN. Exchange the NAME_MATCHER and KIND check
order.
(psym_functions): Unlist map_symbol_names_psymtab.
(map_partial_symbol_names): Rename to ...
(expand_partial_symbol_names): ... here, change the FUN type, call
expand_symtabs_matching with ALL_DOMAIN and NULL FILE_MATCHER now.
* psymtab.h (map_partial_symbol_names): Rename to ...
(expand_partial_symbol_names): ... here, change the FUN type.
* symfile.h (struct quick_symbol_functions): Update the description of
expand_symtabs_matching. Remove map_symbol_names.
* symtab.c (search_symbols): Add ALL_DOMAIN to the function comment.
(struct add_name_data): Update the comment for
expand_partial_symbol_name.
(add_partial_symbol_name): Rename to ...
(expand_partial_symbol_name): ... here. Replace
completion_list_add_name call by strncmp.
(default_make_symbol_completion_list_break_on): Use now
expand_partial_symbol_names and expand_partial_symbol_name.
* symtab.h (enum search_domain): New element ALL_DOMAIN.
2011-04-20 Tom Tromey <tromey@redhat.com>
* dwarf2read.c (save_gdb_index_command): Replace format

View File

@ -5490,7 +5490,7 @@ symbol_completion_add (VEC(char_ptr) **sv,
}
/* An object of this type is passed as the user_data argument to the
map_partial_symbol_names method. */
expand_partial_symbol_names method. */
struct add_partial_datum
{
VEC(char_ptr) **completions;
@ -5502,15 +5502,14 @@ struct add_partial_datum
int encoded;
};
/* A callback for map_partial_symbol_names. */
static void
ada_add_partial_symbol_completions (const char *name, void *user_data)
/* A callback for expand_partial_symbol_names. */
static int
ada_expand_partial_symbol_name (const char *name, void *user_data)
{
struct add_partial_datum *data = user_data;
symbol_completion_add (data->completions, name,
data->text, data->text_len, data->text0, data->word,
data->wild_match, data->encoded);
return symbol_completion_match (name, data->text, data->text_len,
data->wild_match, data->encoded) != NULL;
}
/* Return a list of possible symbol names completing TEXT0. The list
@ -5568,7 +5567,7 @@ ada_make_symbol_completion_list (char *text0, char *word)
data.word = word;
data.wild_match = wild_match;
data.encoded = encoded;
map_partial_symbol_names (ada_add_partial_symbol_completions, &data);
expand_partial_symbol_names (ada_expand_partial_symbol_name, &data);
}
/* At this point scan through the misc symbol vectors and add each

View File

@ -2587,30 +2587,31 @@ dw2_expand_symtabs_matching (struct objfile *objfile,
return;
index = dwarf2_per_objfile->index_table;
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
+ dwarf2_per_objfile->n_type_comp_units); ++i)
{
int j;
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
struct quick_file_names *file_data;
if (file_matcher != NULL)
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
+ dwarf2_per_objfile->n_type_comp_units); ++i)
{
int j;
struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
struct quick_file_names *file_data;
per_cu->v.quick->mark = 0;
if (per_cu->v.quick->symtab)
continue;
per_cu->v.quick->mark = 0;
if (per_cu->v.quick->symtab)
continue;
file_data = dw2_get_file_names (objfile, per_cu);
if (file_data == NULL)
continue;
file_data = dw2_get_file_names (objfile, per_cu);
if (file_data == NULL)
continue;
for (j = 0; j < file_data->num_file_names; ++j)
{
if (file_matcher (file_data->file_names[j], data))
{
per_cu->v.quick->mark = 1;
break;
}
}
}
for (j = 0; j < file_data->num_file_names; ++j)
{
if (file_matcher (file_data->file_names[j], data))
{
per_cu->v.quick->mark = 1;
break;
}
}
}
for (iter = 0; iter < index->symbol_table_slots; ++iter)
{
@ -2636,7 +2637,7 @@ dw2_expand_symtabs_matching (struct objfile *objfile,
struct dwarf2_per_cu_data *per_cu;
per_cu = dw2_get_cu (MAYBE_SWAP (vec[vec_idx + 1]));
if (per_cu->v.quick->mark)
if (file_matcher == NULL || per_cu->v.quick->mark)
dw2_instantiate_symtab (objfile, per_cu);
}
}
@ -2667,36 +2668,6 @@ dw2_find_pc_sect_symtab (struct objfile *objfile,
return dw2_instantiate_symtab (objfile, data);
}
static void
dw2_map_symbol_names (struct objfile *objfile,
void (*fun) (const char *, void *),
void *data)
{
offset_type iter;
struct mapped_index *index;
dw2_setup (objfile);
/* index_table is NULL if OBJF_READNOW. */
if (!dwarf2_per_objfile->index_table)
return;
index = dwarf2_per_objfile->index_table;
for (iter = 0; iter < index->symbol_table_slots; ++iter)
{
offset_type idx = 2 * iter;
const char *name;
offset_type *vec, vec_len, vec_idx;
if (index->symbol_table[idx] == 0 && index->symbol_table[idx + 1] == 0)
continue;
name = (index->constant_pool + MAYBE_SWAP (index->symbol_table[idx]));
(*fun) (name, data);
}
}
static void
dw2_map_symbol_filenames (struct objfile *objfile,
void (*fun) (const char *, const char *, void *),
@ -2753,7 +2724,6 @@ const struct quick_symbol_functions dwarf2_gdb_index_functions =
dw2_map_matching_symbols,
dw2_expand_symtabs_matching,
dw2_find_pc_sect_symtab,
dw2_map_symbol_names,
dw2_map_symbol_filenames
};

View File

@ -1073,42 +1073,6 @@ read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
}
}
static void
map_symbol_names_psymtab (struct objfile *objfile,
void (*fun) (const char *, void *), void *data)
{
struct partial_symtab *ps;
ALL_OBJFILE_PSYMTABS_REQUIRED (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;
for (psym = objfile->global_psymbols.list + ps->globals_offset;
psym < (objfile->global_psymbols.list + ps->globals_offset
+ ps->n_global_syms);
psym++)
{
/* If interrupted, then quit. */
QUIT;
(*fun) (SYMBOL_NATURAL_NAME (*psym), data);
}
for (psym = objfile->static_psymbols.list + ps->statics_offset;
psym < (objfile->static_psymbols.list + ps->statics_offset
+ ps->n_static_syms);
psym++)
{
QUIT;
(*fun) (SYMBOL_NATURAL_NAME (*psym), data);
}
}
}
static void
map_symbol_filenames_psymtab (struct objfile *objfile,
void (*fun) (const char *, const char *,
@ -1259,7 +1223,7 @@ expand_symtabs_matching_via_partial (struct objfile *objfile,
if (ps->readin)
continue;
if (! (*file_matcher) (ps->filename, data))
if (file_matcher && ! (*file_matcher) (ps->filename, data))
continue;
gbound = objfile->global_psymbols.list
@ -1288,14 +1252,15 @@ expand_symtabs_matching_via_partial (struct objfile *objfile,
{
QUIT;
if ((*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data)
&& ((kind == VARIABLES_DOMAIN
if ((kind == ALL_DOMAIN
|| (kind == VARIABLES_DOMAIN
&& SYMBOL_CLASS (*psym) != LOC_TYPEDEF
&& SYMBOL_CLASS (*psym) != LOC_BLOCK)
|| (kind == FUNCTIONS_DOMAIN
&& SYMBOL_CLASS (*psym) == LOC_BLOCK)
|| (kind == TYPES_DOMAIN
&& SYMBOL_CLASS (*psym) == LOC_TYPEDEF)))
|| (kind == FUNCTIONS_DOMAIN
&& SYMBOL_CLASS (*psym) == LOC_BLOCK)
|| (kind == TYPES_DOMAIN
&& SYMBOL_CLASS (*psym) == LOC_TYPEDEF))
&& (*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data))
{
PSYMTAB_TO_SYMTAB (ps);
keep_going = 0;
@ -1330,7 +1295,6 @@ const struct quick_symbol_functions psym_functions =
map_matching_symbols_psymtab,
expand_symtabs_matching_via_partial,
find_pc_sect_symtab_from_partial,
map_symbol_names_psymtab,
map_symbol_filenames_psymtab
};
@ -1933,14 +1897,15 @@ maintenance_check_symtabs (char *ignore, int from_tty)
void
map_partial_symbol_names (void (*fun) (const char *, void *), void *data)
expand_partial_symbol_names (int (*fun) (const char *, void *), void *data)
{
struct objfile *objfile;
ALL_OBJFILES (objfile)
{
if (objfile->sf)
objfile->sf->qf->map_symbol_names (objfile, fun, data);
objfile->sf->qf->expand_symtabs_matching (objfile, NULL, fun,
ALL_DOMAIN, data);
}
}

View File

@ -28,7 +28,8 @@ extern struct psymbol_bcache *psymbol_bcache_init (void);
extern void psymbol_bcache_free (struct psymbol_bcache *);
extern struct bcache *psymbol_bcache_get_bcache (struct psymbol_bcache *);
void map_partial_symbol_names (void (*) (const char *, void *), void *);
void expand_partial_symbol_names (int (*fun) (const char *, void *),
void *data);
void map_partial_symbol_filenames (void (*) (const char *, const char *,
void *),

View File

@ -250,17 +250,18 @@ struct quick_symbol_functions
FILE_MATCHER is called for each file in OBJFILE. The file name
and the DATA argument are passed to it. If it returns zero, this
file is skipped.
file is skipped. If FILE_MATCHER is NULL such file is not skipped.
Otherwise, if the file is not skipped, then NAME_MATCHER is
called for each symbol defined in the file. The symbol's
"natural" name and DATA are passed to NAME_MATCHER.
Otherwise, if KIND does not match this symbol is skipped.
If even KIND matches, then NAME_MATCHER is called for each symbol defined
in the file. The symbol's "natural" name and DATA are passed to
NAME_MATCHER.
If NAME_MATCHER returns zero, then this symbol is skipped.
Otherwise, if this symbol is not skipped, and it matches KIND,
then this symbol's symbol table is expanded.
Otherwise, this symbol's symbol table is expanded.
DATA is user data that is passed unmodified to the callback
functions. */
void (*expand_symtabs_matching) (struct objfile *objfile,
@ -281,13 +282,6 @@ struct quick_symbol_functions
struct obj_section *section,
int warn_if_readin);
/* Call a callback for every symbol defined in OBJFILE. FUN is the
callback. It is passed the symbol's natural name, and the DATA
passed to this function. */
void (*map_symbol_names) (struct objfile *objfile,
void (*fun) (const char *, void *),
void *data);
/* Call a callback for every file defined in OBJFILE whose symtab is
not already read in. FUN is the callback. It is passed the file's name,
the file's full name, and the DATA passed to this function. */

View File

@ -2974,6 +2974,7 @@ search_symbols_name_matches (const char *symname, void *user_data)
and constants (enums)
FUNCTIONS_DOMAIN - search all functions
TYPES_DOMAIN - search all type names
ALL_DOMAIN - an internal error for this function
free_search_symbols should be called when *MATCHES is no longer needed.
@ -3665,7 +3666,7 @@ completion_list_add_fields (struct symbol *sym, char *sym_text,
}
/* Type of the user_data argument passed to add_macro_name or
add_partial_symbol_name. The contents are simply whatever is
expand_partial_symbol_name. The contents are simply whatever is
needed by completion_list_add_name. */
struct add_name_data
{
@ -3688,15 +3689,13 @@ add_macro_name (const char *name, const struct macro_definition *ignore,
datum->text, datum->word);
}
/* A callback for map_partial_symbol_names. */
static void
add_partial_symbol_name (const char *name, void *user_data)
/* A callback for expand_partial_symbol_names. */
static int
expand_partial_symbol_name (const char *name, void *user_data)
{
struct add_name_data *datum = (struct add_name_data *) user_data;
completion_list_add_name ((char *) name,
datum->sym_text, datum->sym_text_len,
datum->text, datum->word);
return strncmp (name, datum->sym_text, datum->sym_text_len) == 0;
}
char **
@ -3786,8 +3785,9 @@ default_make_symbol_completion_list_break_on (char *text, char *word,
datum.word = word;
/* Look through the partial symtabs for all symbols which begin
by matching SYM_TEXT. Add each one that you find to the list. */
map_partial_symbol_names (add_partial_symbol_name, &datum);
by matching SYM_TEXT. Expand all CUs that you find to the list.
The real names will get added by COMPLETION_LIST_ADD_SYMBOL below. */
expand_partial_symbol_names (expand_partial_symbol_name, &datum);
/* At this point scan through the misc symbol vectors and add each
symbol you find to the list. Eventually we want to ignore

View File

@ -412,6 +412,9 @@ enum search_domain
/* All defined types */
TYPES_DOMAIN = 2,
/* Any type. */
ALL_DOMAIN = 3
};
/* An address-class says where to find the value of a symbol. */

View File

@ -1,3 +1,9 @@
2011-04-20 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.cp/cpcompletion.exp (complete class methods)
(complete class methods beginning with F): Move them above runto. New
comment about the runto delimiter.
2011-04-20 Pedro Alves <pedro@codesourcery.com>
* gdb.base/maint.exp: Test that "maint print registers" works

View File

@ -74,6 +74,15 @@ gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}
# Test that completion is restricted by class name (all methods)
test_class_complete Foo "" "complete class methods" \
[list Foo Foofoo get_foo set_foo ~Foo]
test_class_complete Foo F "complete class methods beginning with F" \
[list Foo Foofoo]
# The tests below depend on the current code scope.
set bp_location [gdb_get_line_number "Set breakpoint here" ${testfile}.cc]
if {![runto "${testfile}.cc:$bp_location"]} {
@ -93,11 +102,3 @@ gdb_test "complete p foo1.Fo" "p foo1\\.Foofoo"
# Test completion with an anonymous struct.
gdb_test "complete p a.g" "p a\\.get"
# Test that completion is restricted by class name (all methods)
test_class_complete Foo "" "complete class methods" \
[list Foo Foofoo get_foo set_foo ~Foo]
test_class_complete Foo F "complete class methods beginning with F" \
[list Foo Foofoo]