X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsymmisc.c;h=91ddc578a8d6df7dceca2563dc63b809fa6ba828;hb=c1ec8cea7ff53eb76cb7c354b813c67fde755409;hp=811183cf0816f273bacdbd26f1c277643abce4e8;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symmisc.c b/gdb/symmisc.c index 811183cf08..91ddc578a8 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -1,6 +1,6 @@ /* Do various things to symbol tables (other than lookup), for GDB. - Copyright (C) 1986-2017 Free Software Foundation, Inc. + Copyright (C) 1986-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -54,17 +54,8 @@ FILE *std_err; static int block_depth (struct block *); -void _initialize_symmisc (void); - -struct print_symbol_args - { - struct gdbarch *gdbarch; - struct symbol *symbol; - int depth; - struct ui_file *outfile; - }; - -static int print_symbol (void *); +static void print_symbol (struct gdbarch *gdbarch, struct symbol *symbol, + int depth, ui_file *outfile); void @@ -218,6 +209,7 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile) ms_type = 'T'; break; case mst_text_gnu_ifunc: + case mst_data_gnu_ifunc: ms_type = 'i'; break; case mst_solib_trampoline: @@ -359,14 +351,16 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) block, not any blocks from included symtabs. */ ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym) { - struct print_symbol_args s; - - s.gdbarch = gdbarch; - s.symbol = sym; - s.depth = depth + 1; - s.outfile = outfile; - catch_errors (print_symbol, &s, "Error printing symbol:\n", - RETURN_MASK_ERROR); + TRY + { + print_symbol (gdbarch, sym, depth + 1, outfile); + } + CATCH (ex, RETURN_MASK_ERROR) + { + exception_fprintf (gdb_stderr, ex, + "Error printing symbol:\n"); + } + END_CATCH } } fprintf_filtered (outfile, "\n"); @@ -405,20 +399,17 @@ dump_symtab (struct symtab *symtab, struct ui_file *outfile) } static void -maintenance_print_symbols (char *args, int from_tty) +maintenance_print_symbols (const char *args, int from_tty) { - char **argv; struct ui_file *outfile = gdb_stdout; - struct cleanup *cleanups; char *address_arg = NULL, *source_arg = NULL, *objfile_arg = NULL; int i, outfile_idx; dont_repeat (); - argv = gdb_buildargv (args); - cleanups = make_cleanup_freeargv (argv); + gdb_argv argv (args); - for (i = 0; argv[i] != NULL; ++i) + for (i = 0; argv != NULL && argv[i] != NULL; ++i) { if (strcmp (argv[i], "-pc") == 0) { @@ -457,18 +448,17 @@ maintenance_print_symbols (char *args, int from_tty) if (address_arg != NULL && source_arg != NULL) error (_("Must specify at most one of -pc and -source")); - if (argv[outfile_idx] != NULL) - { - char *outfile_name; + stdio_file arg_outfile; + if (argv != NULL && argv[outfile_idx] != NULL) + { if (argv[outfile_idx + 1] != NULL) error (_("Junk at end of command")); - outfile_name = tilde_expand (argv[outfile_idx]); - make_cleanup (xfree, outfile_name); - outfile = gdb_fopen (outfile_name, FOPEN_WT); - if (outfile == NULL) - perror_with_name (outfile_name); - make_cleanup_ui_file_delete (outfile); + gdb::unique_xmalloc_ptr outfile_name + (tilde_expand (argv[outfile_idx])); + if (!arg_outfile.open (outfile_name.get (), FOPEN_WT)) + perror_with_name (outfile_name.get ()); + outfile = &arg_outfile; } if (address_arg != NULL) @@ -519,22 +509,14 @@ maintenance_print_symbols (char *args, int from_tty) if (source_arg != NULL && !found) error (_("No symtab for source file: %s"), source_arg); } - - do_cleanups (cleanups); } -/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE. ARGS->DEPTH says how - far to indent. ARGS is really a struct print_symbol_args *, but is - declared as char * to get it past catch_errors. Returns 0 for error, - 1 for success. */ +/* Print symbol SYMBOL on OUTFILE. DEPTH says how far to indent. */ -static int -print_symbol (void *args) +static void +print_symbol (struct gdbarch *gdbarch, struct symbol *symbol, + int depth, ui_file *outfile) { - struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch; - struct symbol *symbol = ((struct print_symbol_args *) args)->symbol; - int depth = ((struct print_symbol_args *) args)->depth; - struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile; struct obj_section *section; if (SYMBOL_OBJFILE_OWNED (symbol)) @@ -554,8 +536,9 @@ print_symbol (void *args) section->the_bfd_section)); else fprintf_filtered (outfile, "\n"); - return 1; + return; } + if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN) { if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol))) @@ -702,25 +685,21 @@ print_symbol (void *args) } } fprintf_filtered (outfile, "\n"); - return 1; } static void -maintenance_print_msymbols (char *args, int from_tty) +maintenance_print_msymbols (const char *args, int from_tty) { - char **argv; struct ui_file *outfile = gdb_stdout; - struct cleanup *cleanups; char *objfile_arg = NULL; struct objfile *objfile; int i, outfile_idx; dont_repeat (); - argv = gdb_buildargv (args); - cleanups = make_cleanup_freeargv (argv); + gdb_argv argv (args); - for (i = 0; argv[i] != NULL; ++i) + for (i = 0; argv != NULL && argv[i] != NULL; ++i) { if (strcmp (argv[i], "-objfile") == 0) { @@ -744,18 +723,17 @@ maintenance_print_msymbols (char *args, int from_tty) } outfile_idx = i; - if (argv[outfile_idx] != NULL) - { - char *outfile_name; + stdio_file arg_outfile; + if (argv != NULL && argv[outfile_idx] != NULL) + { if (argv[outfile_idx + 1] != NULL) error (_("Junk at end of command")); - outfile_name = tilde_expand (argv[outfile_idx]); - make_cleanup (xfree, outfile_name); - outfile = gdb_fopen (outfile_name, FOPEN_WT); - if (outfile == NULL) - perror_with_name (outfile_name); - make_cleanup_ui_file_delete (outfile); + gdb::unique_xmalloc_ptr outfile_name + (tilde_expand (argv[outfile_idx])); + if (!arg_outfile.open (outfile_name.get (), FOPEN_WT)) + perror_with_name (outfile_name.get ()); + outfile = &arg_outfile; } ALL_OBJFILES (objfile) @@ -765,12 +743,10 @@ maintenance_print_msymbols (char *args, int from_tty) || compare_filenames_for_search (objfile_name (objfile), objfile_arg)) dump_msymbols (objfile, outfile); } - - do_cleanups (cleanups); } static void -maintenance_print_objfiles (char *regexp, int from_tty) +maintenance_print_objfiles (const char *regexp, int from_tty) { struct program_space *pspace; struct objfile *objfile; @@ -793,7 +769,7 @@ maintenance_print_objfiles (char *regexp, int from_tty) /* List all the symbol tables whose names match REGEXP (optional). */ static void -maintenance_info_symtabs (char *regexp, int from_tty) +maintenance_info_symtabs (const char *regexp, int from_tty) { struct program_space *pspace; struct objfile *objfile; @@ -887,7 +863,7 @@ maintenance_info_symtabs (char *regexp, int from_tty) Use "maint check-psymtabs" for that. */ static void -maintenance_check_symtabs (char *ignore, int from_tty) +maintenance_check_symtabs (const char *ignore, int from_tty) { struct program_space *pspace; struct objfile *objfile; @@ -935,52 +911,18 @@ maintenance_check_symtabs (char *ignore, int from_tty) } } -/* Helper function for maintenance_expand_symtabs. - This is the name_matcher function for expand_symtabs_matching. */ - -static int -maintenance_expand_name_matcher (const char *symname, void *data) -{ - /* Since we're not searching on symbols, just return TRUE. */ - return 1; -} - -/* Helper function for maintenance_expand_symtabs. - This is the file_matcher function for expand_symtabs_matching. */ - -static int -maintenance_expand_file_matcher (const char *filename, void *data, - int basenames) -{ - const char *regexp = (const char *) data; - - QUIT; - - /* KISS: Only apply the regexp to the complete file name. */ - if (basenames) - return 0; - - if (regexp == NULL || re_exec (filename)) - return 1; - - return 0; -} - /* Expand all symbol tables whose name matches an optional regexp. */ static void -maintenance_expand_symtabs (char *args, int from_tty) +maintenance_expand_symtabs (const char *args, int from_tty) { struct program_space *pspace; struct objfile *objfile; - struct cleanup *cleanups; - char **argv; char *regexp = NULL; /* We use buildargv here so that we handle spaces in the regexp in a way that allows adding more arguments later. */ - argv = gdb_buildargv (args); - cleanups = make_cleanup_freeargv (argv); + gdb_argv argv (args); if (argv != NULL) { @@ -1001,12 +943,23 @@ maintenance_expand_symtabs (char *args, int from_tty) if (objfile->sf) { objfile->sf->qf->expand_symtabs_matching - (objfile, maintenance_expand_file_matcher, - maintenance_expand_name_matcher, NULL, ALL_DOMAIN, regexp); + (objfile, + [&] (const char *filename, bool basenames) + { + /* KISS: Only apply the regexp to the complete file name. */ + return (!basenames + && (regexp == NULL || re_exec (filename))); + }, + lookup_name_info::match_any (), + [] (const char *symname) + { + /* Since we're not searching on symbols, just return true. */ + return true; + }, + NULL, + ALL_DOMAIN); } } - - do_cleanups (cleanups); } @@ -1076,7 +1029,7 @@ maintenance_print_one_line_table (struct symtab *symtab, void *data) /* Implement the 'maint info line-table' command. */ static void -maintenance_info_line_tables (char *regexp, int from_tty) +maintenance_info_line_tables (const char *regexp, int from_tty) { struct program_space *pspace; struct objfile *objfile;