X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsymfile.c;h=3a9c488fa99bd4fd4d28fec53e878c3ac754e926;hb=112e8700a6fd2fed65ca70132c9cbed4132e8bd4;hp=7d7843ea7ce5a74332fd27c3aad9fcd7549181a7;hpb=764c99c18adcdf658b390f25940aed7713a6a769;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symfile.c b/gdb/symfile.c index 7d7843ea7c..3a9c488fa9 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); @@ -865,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; @@ -994,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; @@ -1085,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); @@ -1096,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 @@ -1138,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; @@ -1164,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); @@ -1242,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; @@ -1268,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); @@ -1280,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); @@ -1301,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); @@ -1318,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 (); } @@ -1461,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); @@ -1646,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) { @@ -1659,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; } @@ -1954,9 +1962,10 @@ 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", - args->section_name, hex_string (args->section_size), - paddress (target_gdbarch (), args->lma)); + current_uiout->message ("Loading section %s, size %s lma %s\n", + args->section_name, + hex_string (args->section_size), + paddress (target_gdbarch (), args->lma)); return; } @@ -2057,11 +2066,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; @@ -2122,21 +2135,23 @@ 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); - ui_out_text (uiout, "Start address "); - ui_out_field_fmt (uiout, "address", "%s", paddress (target_gdbarch (), entry)); - ui_out_text (uiout, ", load size "); - ui_out_field_fmt (uiout, "load-size", "%lu", total_progress.data_count); - ui_out_text (uiout, "\n"); + uiout->text ("Start address "); + uiout->field_fmt ("address", "%s", paddress (target_gdbarch (), entry)); + uiout->text (", load size "); + uiout->field_fmt ("load-size", "%lu", total_progress.data_count); + uiout->text ("\n"); regcache_write_pc (get_current_regcache (), entry); /* Reset breakpoints, now that we have changed the load image. For @@ -2151,61 +2166,61 @@ 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) + uiout->text ("Transfer rate: "); + 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)) + if (uiout->is_mi_like_p ()) { - ui_out_field_fmt (uiout, "transfer-rate", "%lu", rate * 8); - ui_out_text (uiout, " bits/sec"); + uiout->field_fmt ("transfer-rate", "%lu", rate * 8); + uiout->text (" bits/sec"); } else if (rate < 1024) { - ui_out_field_fmt (uiout, "transfer-rate", "%lu", rate); - ui_out_text (uiout, " bytes/sec"); + uiout->field_fmt ("transfer-rate", "%lu", rate); + uiout->text (" bytes/sec"); } else { - ui_out_field_fmt (uiout, "transfer-rate", "%lu", rate / 1024); - ui_out_text (uiout, " KB/sec"); + uiout->field_fmt ("transfer-rate", "%lu", rate / 1024); + uiout->text (" KB/sec"); } } else { - ui_out_field_fmt (uiout, "transferred-bits", "%lu", (data_count * 8)); - ui_out_text (uiout, " bits in <1 sec"); + uiout->field_fmt ("transferred-bits", "%lu", (data_count * 8)); + uiout->text (" bits in <1 sec"); } if (write_count > 0) { - ui_out_text (uiout, ", "); - ui_out_field_fmt (uiout, "write-rate", "%lu", data_count / write_count); - ui_out_text (uiout, " bytes/write"); + uiout->text (", "); + uiout->field_fmt ("write-rate", "%lu", data_count / write_count); + uiout->text (" bytes/write"); } - ui_out_text (uiout, ".\n"); + uiout->text (".\n"); } /* This function allows the addition of incrementally linked object files. @@ -2222,7 +2237,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; @@ -2232,6 +2246,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 { @@ -2357,8 +2376,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); @@ -2937,11 +2955,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. */