X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsymfile.c;h=52f99bfc5f6bb07c1a62ac4634a5d908e80a90e8;hb=7fb048a2ee38bbc85ba0e96e2932cb0cb1f7381e;hp=76014d970e991c5adbc3ae6f1c3d6019b97ef7b4;hpb=870f88f7551b0f2d6aaaa36fb684b5ff8f468107;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symfile.c b/gdb/symfile.c index 76014d970e..52f99bfc5f 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -61,8 +61,7 @@ #include #include #include -#include -#include "gdb_sys_time.h" +#include #include "psymtab.h" @@ -85,7 +84,8 @@ int readnow_symbol_files; /* Read full symbols immediately. */ static void load_command (char *, int); -static void symbol_file_add_main_1 (const char *args, int from_tty, int flags); +static void symbol_file_add_main_1 (const char *args, symfile_add_flags add_flags, + objfile_flags flags); static void add_symbol_file_command (char *, int); @@ -114,12 +114,8 @@ static int simple_read_overlay_table (void); static int simple_overlay_update_1 (struct obj_section *); -static void add_filename_language (char *ext, enum language lang); - static void info_ext_lang_command (char *args, int from_tty); -static void init_filename_language_table (void); - static void symfile_find_segment_sections (struct objfile *objfile); void _initialize_symfile (void); @@ -869,7 +865,7 @@ default_symfile_segments (bfd *abfd) possibly force the partial symbols to be read. */ static void -read_symbols (struct objfile *objfile, int add_flags) +read_symbols (struct objfile *objfile, symfile_add_flags add_flags) { (*objfile->sf->sym_read) (objfile, add_flags); objfile->per_bfd->minsyms_read = 1; @@ -998,7 +994,7 @@ init_entry_point_info (struct objfile *objfile) static void syms_from_objfile_1 (struct objfile *objfile, struct section_addr_info *addrs, - int add_flags) + symfile_add_flags add_flags) { struct section_addr_info *local_addr = NULL; struct cleanup *old_chain; @@ -1089,7 +1085,7 @@ syms_from_objfile_1 (struct objfile *objfile, static void syms_from_objfile (struct objfile *objfile, struct section_addr_info *addrs, - int add_flags) + symfile_add_flags add_flags) { syms_from_objfile_1 (objfile, addrs, add_flags); init_entry_point_info (objfile); @@ -1100,7 +1096,7 @@ syms_from_objfile (struct objfile *objfile, objfile. ADD_FLAGS is a bitmask of enum symfile_add_flags. */ static void -finish_new_objfile (struct objfile *objfile, int add_flags) +finish_new_objfile (struct objfile *objfile, symfile_add_flags add_flags) { /* If this is the main symbol file we have to clean up all users of the old main symbol file. Otherwise it is sufficient to fixup all the @@ -1142,9 +1138,10 @@ finish_new_objfile (struct objfile *objfile, int add_flags) Upon failure, jumps back to command level (never returns). */ static struct objfile * -symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags, +symbol_file_add_with_addrs (bfd *abfd, const char *name, + symfile_add_flags add_flags, struct section_addr_info *addrs, - int flags, struct objfile *parent) + objfile_flags flags, struct objfile *parent) { struct objfile *objfile; const int from_tty = add_flags & SYMFILE_VERBOSE; @@ -1168,8 +1165,9 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags, && !query (_("Load new symbol table from \"%s\"? "), name)) error (_("Not confirmed.")); - objfile = allocate_objfile (abfd, name, - flags | (mainline ? OBJF_MAINLINE : 0)); + if (mainline) + flags |= OBJF_MAINLINE; + objfile = allocate_objfile (abfd, name, flags); if (parent) add_separate_debug_objfile (objfile, parent); @@ -1246,7 +1244,8 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name, int add_flags, see allocate_objfile's definition. */ void -symbol_file_add_separate (bfd *bfd, const char *name, int symfile_flags, +symbol_file_add_separate (bfd *bfd, const char *name, + symfile_add_flags symfile_flags, struct objfile *objfile) { struct section_addr_info *sap; @@ -1272,9 +1271,10 @@ symbol_file_add_separate (bfd *bfd, const char *name, int symfile_flags, See symbol_file_add_with_addrs's comments for details. */ struct objfile * -symbol_file_add_from_bfd (bfd *abfd, const char *name, int add_flags, +symbol_file_add_from_bfd (bfd *abfd, const char *name, + symfile_add_flags add_flags, struct section_addr_info *addrs, - int flags, struct objfile *parent) + objfile_flags flags, struct objfile *parent) { return symbol_file_add_with_addrs (abfd, name, add_flags, addrs, flags, parent); @@ -1284,8 +1284,8 @@ symbol_file_add_from_bfd (bfd *abfd, const char *name, int add_flags, loaded file. See symbol_file_add_with_addrs's comments for details. */ struct objfile * -symbol_file_add (const char *name, int add_flags, - struct section_addr_info *addrs, int flags) +symbol_file_add (const char *name, symfile_add_flags add_flags, + struct section_addr_info *addrs, objfile_flags flags) { bfd *bfd = symfile_bfd_open (name); struct cleanup *cleanup = make_cleanup_bfd_unref (bfd); @@ -1305,16 +1305,16 @@ symbol_file_add (const char *name, int add_flags, command itself. */ void -symbol_file_add_main (const char *args, int from_tty) +symbol_file_add_main (const char *args, symfile_add_flags add_flags) { - symbol_file_add_main_1 (args, from_tty, 0); + symbol_file_add_main_1 (args, add_flags, 0); } static void -symbol_file_add_main_1 (const char *args, int from_tty, int flags) +symbol_file_add_main_1 (const char *args, symfile_add_flags add_flags, + objfile_flags flags) { - const int add_flags = (current_inferior ()->symfile_flags - | SYMFILE_MAINLINE | (from_tty ? SYMFILE_VERBOSE : 0)); + add_flags |= current_inferior ()->symfile_flags | SYMFILE_MAINLINE; symbol_file_add (args, add_flags, NULL, flags); @@ -1322,7 +1322,7 @@ symbol_file_add_main_1 (const char *args, int from_tty, int flags) what is frameless. */ reinit_frame_cache (); - if ((flags & SYMFILE_NO_READ) == 0) + if ((add_flags & SYMFILE_NO_READ) == 0) set_initial_language (); } @@ -1465,7 +1465,7 @@ find_separate_debug_file (const char *dir, struct cleanup *back_to; int ix; - /* Set I to max (strlen (canon_dir), strlen (dir)). */ + /* Set I to std::max (strlen (canon_dir), strlen (dir)). */ i = strlen (dir); if (canon_dir != NULL && strlen (canon_dir) > i) i = strlen (canon_dir); @@ -1650,10 +1650,14 @@ symbol_file_command (char *args, int from_tty) else { char **argv = gdb_buildargv (args); - int flags = OBJF_USERLOADED; + objfile_flags flags = OBJF_USERLOADED; + symfile_add_flags add_flags = 0; struct cleanup *cleanups; char *name = NULL; + if (from_tty) + add_flags |= SYMFILE_VERBOSE; + cleanups = make_cleanup_freeargv (argv); while (*argv != NULL) { @@ -1663,7 +1667,7 @@ symbol_file_command (char *args, int from_tty) error (_("unknown option `%s'"), *argv); else { - symbol_file_add_main_1 (*argv, from_tty, flags); + symbol_file_add_main_1 (*argv, add_flags, flags); name = *argv; } @@ -1958,7 +1962,7 @@ load_progress (ULONGEST bytes, void *untyped_arg) { /* The write is just starting. Let the user know we've started this section. */ - ui_out_message (current_uiout, 0, "Loading section %s, size %s lma %s\n", + ui_out_message (current_uiout, "Loading section %s, size %s lma %s\n", args->section_name, hex_string (args->section_size), paddress (target_gdbarch (), args->lma)); return; @@ -2061,11 +2065,15 @@ clear_memory_write_data (void *arg) VEC_free (memory_write_request_s, vec); } +static void print_transfer_performance (struct ui_file *stream, + unsigned long data_count, + unsigned long write_count, + std::chrono::steady_clock::duration d); + void generic_load (const char *args, int from_tty) { bfd *loadfile_bfd; - struct timeval start_time, end_time; char *filename; struct cleanup *old_cleanups = make_cleanup (null_cleanup, 0); struct load_section_data cbdata; @@ -2126,13 +2134,15 @@ generic_load (const char *args, int from_tty) bfd_map_over_sections (loadfile_bfd, load_section_callback, &cbdata); - gettimeofday (&start_time, NULL); + using namespace std::chrono; + + steady_clock::time_point start_time = steady_clock::now (); if (target_write_memory_blocks (cbdata.requests, flash_discard, load_progress) != 0) error (_("Load failed")); - gettimeofday (&end_time, NULL); + steady_clock::time_point end_time = steady_clock::now (); entry = bfd_get_start_address (loadfile_bfd); entry = gdbarch_addr_bits_remove (target_gdbarch (), entry); @@ -2155,32 +2165,32 @@ generic_load (const char *args, int from_tty) print_transfer_performance (gdb_stdout, total_progress.data_count, total_progress.write_count, - &start_time, &end_time); + end_time - start_time); do_cleanups (old_cleanups); } -/* Report how fast the transfer went. */ +/* Report on STREAM the performance of a memory transfer operation, + such as 'load'. DATA_COUNT is the number of bytes transferred. + WRITE_COUNT is the number of separate write operations, or 0, if + that information is not available. TIME is how long the operation + lasted. */ -void +static void print_transfer_performance (struct ui_file *stream, unsigned long data_count, unsigned long write_count, - const struct timeval *start_time, - const struct timeval *end_time) + std::chrono::steady_clock::duration time) { - ULONGEST time_count; + using namespace std::chrono; struct ui_out *uiout = current_uiout; - /* Compute the elapsed time in milliseconds, as a tradeoff between - accuracy and overflow. */ - time_count = (end_time->tv_sec - start_time->tv_sec) * 1000; - time_count += (end_time->tv_usec - start_time->tv_usec) / 1000; + milliseconds ms = duration_cast (time); ui_out_text (uiout, "Transfer rate: "); - if (time_count > 0) + if (ms.count () > 0) { - unsigned long rate = ((ULONGEST) data_count * 1000) / time_count; + unsigned long rate = ((ULONGEST) data_count * 1000) / ms.count (); if (ui_out_is_mi_like_p (uiout)) { @@ -2226,7 +2236,6 @@ add_symbol_file_command (char *args, int from_tty) { struct gdbarch *gdbarch = get_current_arch (); char *filename = NULL; - int flags = OBJF_USERLOADED | OBJF_SHARED; char *arg; int section_index = 0; int argcnt = 0; @@ -2236,6 +2245,11 @@ add_symbol_file_command (char *args, int from_tty) int expecting_sec_addr = 0; char **argv; struct objfile *objf; + objfile_flags flags = OBJF_USERLOADED | OBJF_SHARED; + symfile_add_flags add_flags = 0; + + if (from_tty) + add_flags |= SYMFILE_VERBOSE; struct sect_opt { @@ -2361,8 +2375,7 @@ add_symbol_file_command (char *args, int from_tty) if (from_tty && (!query ("%s", ""))) error (_("Not confirmed.")); - objf = symbol_file_add (filename, from_tty ? SYMFILE_VERBOSE : 0, - section_addrs, flags); + objf = symbol_file_add (filename, add_flags, section_addrs, flags); add_target_sections_of_objfile (objf); @@ -2713,26 +2726,23 @@ typedef struct { char *ext; enum language lang; -} -filename_language; +} filename_language; -static filename_language *filename_language_table; -static int fl_table_size, fl_table_next; +DEF_VEC_O (filename_language); -static void -add_filename_language (char *ext, enum language lang) +static VEC (filename_language) *filename_language_table; + +/* See symfile.h. */ + +void +add_filename_language (const char *ext, enum language lang) { - if (fl_table_next >= fl_table_size) - { - fl_table_size += 10; - filename_language_table = XRESIZEVEC (filename_language, - filename_language_table, - fl_table_size); - } + filename_language entry; + + entry.ext = xstrdup (ext); + entry.lang = lang; - filename_language_table[fl_table_next].ext = xstrdup (ext); - filename_language_table[fl_table_next].lang = lang; - fl_table_next++; + VEC_safe_push (filename_language, filename_language_table, &entry); } static char *ext_args; @@ -2752,6 +2762,7 @@ set_ext_lang_command (char *args, int from_tty, struct cmd_list_element *e) int i; char *cp = ext_args; enum language lang; + filename_language *entry; /* First arg is filename extension, starting with '.' */ if (*cp != '.') @@ -2781,11 +2792,15 @@ set_ext_lang_command (char *args, int from_tty, struct cmd_list_element *e) lang = language_enum (cp); /* Now lookup the filename extension: do we already know it? */ - for (i = 0; i < fl_table_next; i++) - if (0 == strcmp (ext_args, filename_language_table[i].ext)) - break; + for (i = 0; + VEC_iterate (filename_language, filename_language_table, i, entry); + ++i) + { + if (0 == strcmp (ext_args, entry->ext)) + break; + } - if (i >= fl_table_next) + if (entry == NULL) { /* New file extension. */ add_filename_language (ext_args, lang); @@ -2798,9 +2813,9 @@ set_ext_lang_command (char *args, int from_tty, struct cmd_list_element *e) /* query ("Really make files of type %s '%s'?", */ /* ext_args, language_str (lang)); */ - xfree (filename_language_table[i].ext); - filename_language_table[i].ext = xstrdup (ext_args); - filename_language_table[i].lang = lang; + xfree (entry->ext); + entry->ext = xstrdup (ext_args); + entry->lang = lang; } } @@ -2808,63 +2823,14 @@ static void info_ext_lang_command (char *args, int from_tty) { int i; + filename_language *entry; printf_filtered (_("Filename extensions and the languages they represent:")); printf_filtered ("\n\n"); - for (i = 0; i < fl_table_next; i++) - printf_filtered ("\t%s\t- %s\n", - filename_language_table[i].ext, - language_str (filename_language_table[i].lang)); -} - -static void -init_filename_language_table (void) -{ - if (fl_table_size == 0) /* Protect against repetition. */ - { - fl_table_size = 20; - fl_table_next = 0; - filename_language_table = XNEWVEC (filename_language, fl_table_size); - - add_filename_language (".c", language_c); - add_filename_language (".d", language_d); - add_filename_language (".C", language_cplus); - add_filename_language (".cc", language_cplus); - add_filename_language (".cp", language_cplus); - add_filename_language (".cpp", language_cplus); - add_filename_language (".cxx", language_cplus); - add_filename_language (".c++", language_cplus); - add_filename_language (".java", language_java); - add_filename_language (".class", language_java); - add_filename_language (".m", language_objc); - add_filename_language (".f", language_fortran); - add_filename_language (".F", language_fortran); - add_filename_language (".for", language_fortran); - add_filename_language (".FOR", language_fortran); - add_filename_language (".ftn", language_fortran); - add_filename_language (".FTN", language_fortran); - add_filename_language (".fpp", language_fortran); - add_filename_language (".FPP", language_fortran); - add_filename_language (".f90", language_fortran); - add_filename_language (".F90", language_fortran); - add_filename_language (".f95", language_fortran); - add_filename_language (".F95", language_fortran); - add_filename_language (".f03", language_fortran); - add_filename_language (".F03", language_fortran); - add_filename_language (".f08", language_fortran); - add_filename_language (".F08", language_fortran); - add_filename_language (".s", language_asm); - add_filename_language (".sx", language_asm); - add_filename_language (".S", language_asm); - add_filename_language (".pas", language_pascal); - add_filename_language (".p", language_pascal); - add_filename_language (".pp", language_pascal); - add_filename_language (".adb", language_ada); - add_filename_language (".ads", language_ada); - add_filename_language (".a", language_ada); - add_filename_language (".ada", language_ada); - add_filename_language (".dg", language_ada); - } + for (i = 0; + VEC_iterate (filename_language, filename_language_table, i, entry); + ++i) + printf_filtered ("\t%s\t- %s\n", entry->ext, language_str (entry->lang)); } enum language @@ -2875,9 +2841,15 @@ deduce_language_from_filename (const char *filename) if (filename != NULL) if ((cp = strrchr (filename, '.')) != NULL) - for (i = 0; i < fl_table_next; i++) - if (strcmp (cp, filename_language_table[i].ext) == 0) - return filename_language_table[i].lang; + { + filename_language *entry; + + for (i = 0; + VEC_iterate (filename_language, filename_language_table, i, entry); + ++i) + if (strcmp (cp, entry->ext) == 0) + return entry->lang; + } return language_unknown; } @@ -2982,11 +2954,11 @@ add_compunit_symtab_to_objfile (struct compunit_symtab *cu) } -/* Reset all data structures in gdb which may contain references to symbol - table data. ADD_FLAGS is a bitmask of enum symfile_add_flags. */ +/* Reset all data structures in gdb which may contain references to + symbol table data. */ void -clear_symtab_users (int add_flags) +clear_symtab_users (symfile_add_flags add_flags) { /* Someday, we should do better than this, by only blowing away the things that really need to be blown. */ @@ -3629,25 +3601,22 @@ simple_read_overlay_table (void) static int simple_overlay_update_1 (struct obj_section *osect) { - int i, size; + int i; bfd *obfd = osect->objfile->obfd; asection *bsect = osect->the_bfd_section; struct gdbarch *gdbarch = get_objfile_arch (osect->objfile); int word_size = gdbarch_long_bit (gdbarch) / TARGET_CHAR_BIT; enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - size = bfd_get_section_size (osect->the_bfd_section); for (i = 0; i < cache_novlys; i++) if (cache_ovly_table[i][VMA] == bfd_section_vma (obfd, bsect) - && cache_ovly_table[i][LMA] == bfd_section_lma (obfd, bsect) - /* && cache_ovly_table[i][OSIZE] == size */ ) + && cache_ovly_table[i][LMA] == bfd_section_lma (obfd, bsect)) { read_target_long_array (cache_ovly_table_base + i * word_size, (unsigned int *) cache_ovly_table[i], 4, word_size, byte_order); if (cache_ovly_table[i][VMA] == bfd_section_vma (obfd, bsect) - && cache_ovly_table[i][LMA] == bfd_section_lma (obfd, bsect) - /* && cache_ovly_table[i][OSIZE] == size */ ) + && cache_ovly_table[i][LMA] == bfd_section_lma (obfd, bsect)) { osect->ovly_mapped = cache_ovly_table[i][MAPPED]; return 1; @@ -3705,15 +3674,13 @@ simple_overlay_update (struct obj_section *osect) ALL_OBJSECTIONS (objfile, osect) if (section_is_overlay (osect)) { - int i, size; + int i; bfd *obfd = osect->objfile->obfd; asection *bsect = osect->the_bfd_section; - size = bfd_get_section_size (bsect); for (i = 0; i < cache_novlys; i++) if (cache_ovly_table[i][VMA] == bfd_section_vma (obfd, bsect) - && cache_ovly_table[i][LMA] == bfd_section_lma (obfd, bsect) - /* && cache_ovly_table[i][OSIZE] == size */ ) + && cache_ovly_table[i][LMA] == bfd_section_lma (obfd, bsect)) { /* obj_section matches i'th entry in ovly_table. */ osect->ovly_mapped = cache_ovly_table[i][MAPPED]; break; /* finished with inner for loop: break out. */ @@ -4013,7 +3980,6 @@ A load OFFSET may also be given."), &cmdlist); _("Read the overlay mapping state from the target."), &overlaylist); /* Filename extension to source language lookup table: */ - init_filename_language_table (); add_setshow_string_noescape_cmd ("extension-language", class_files, &ext_args, _("\ Set mapping between filename extension and source language."), _("\