From: Tom de Vries Date: Tue, 7 Dec 2021 06:51:25 +0000 (+0100) Subject: [gdb/symtab] Support -readnow during reread X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9dec38d3b11c779e8f386050ed5046aaa4e759db;p=binutils-gdb.git [gdb/symtab] Support -readnow during reread When running test-case gdb.base/cached-source-file.exp with target board readnow, we run into: ... FAIL: gdb.base/cached-source-file.exp: rerun program (the program exited) ... The problem is that when rereading, the readnow is ignored. Fix this by copying the readnow handling code from symbol_file_add_with_addrs to reread_symbols. Tested on x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=26800 --- diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 984ce4e042b..a3752cc9285 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -395,7 +395,7 @@ run_command_1 (const char *args, int from_tty, enum run_how run_how) to check again here. Since reopen_exec_file doesn't do anything if the timestamp hasn't changed, I don't see the harm. */ reopen_exec_file (); - reread_symbols (); + reread_symbols (from_tty); gdb::unique_xmalloc_ptr stripped = strip_bg_char (args, &async_exec); args = stripped.get (); @@ -2399,7 +2399,7 @@ setup_inferior (int from_tty) else { reopen_exec_file (); - reread_symbols (); + reread_symbols (from_tty); } /* Take any necessary post-attaching actions for this platform. */ diff --git a/gdb/remote.c b/gdb/remote.c index ebbc138b405..7ed9330ce39 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -5718,7 +5718,7 @@ remote_target::open_1 (const char *name, int from_tty, int extended_p) remote_fileio_reset (); reopen_exec_file (); - reread_symbols (); + reread_symbols (from_tty); remote_target *remote = (extended_p ? new extended_remote_target () : new remote_target ()); diff --git a/gdb/symfile.c b/gdb/symfile.c index 9e5c2d48881..89469a3d3dc 100644 --- a/gdb/symfile.c +++ b/gdb/symfile.c @@ -1797,7 +1797,7 @@ load_command (const char *arg, int from_tty) /* The user might be reloading because the binary has changed. Take this opportunity to check. */ reopen_exec_file (); - reread_symbols (); + reread_symbols (from_tty); std::string temp; if (arg == NULL) @@ -2411,7 +2411,7 @@ remove_symbol_file_command (const char *args, int from_tty) /* Re-read symbols if a symbol-file has changed. */ void -reread_symbols (void) +reread_symbols (int from_tty) { long new_modtime; struct stat new_statbuf; @@ -2588,6 +2588,19 @@ reread_symbols (void) read_symbols (objfile, 0); + if ((objfile->flags & OBJF_READNOW)) + { + const int mainline = objfile->flags & OBJF_MAINLINE; + const int should_print = (print_symbol_loading_p (from_tty, mainline, 1) + && readnow_symbol_files); + if (should_print) + printf_filtered (_("Expanding full symbols from %ps...\n"), + styled_string (file_name_style.style (), + objfile_name (objfile))); + + objfile->expand_all_symtabs (); + } + if (!objfile_has_symbols (objfile)) { wrap_here (""); diff --git a/gdb/symtab.h b/gdb/symtab.h index 61f20b25a7b..a9e01cc967c 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -1847,7 +1847,7 @@ extern struct compunit_symtab * extern bool find_pc_line_pc_range (CORE_ADDR, CORE_ADDR *, CORE_ADDR *); -extern void reread_symbols (void); +extern void reread_symbols (int from_tty); /* Look up a type named NAME in STRUCT_DOMAIN in the current language. The type returned must not be opaque -- i.e., must have at least one field diff --git a/gdb/testsuite/gdb.ada/exec_changed.exp b/gdb/testsuite/gdb.ada/exec_changed.exp index 8cbc29f8fdd..d08e1ce1555 100644 --- a/gdb/testsuite/gdb.ada/exec_changed.exp +++ b/gdb/testsuite/gdb.ada/exec_changed.exp @@ -51,8 +51,6 @@ gdb_reinitialize_dir $srcdir/$subdir gdb_test "shell mv ${binfile} ${common_binfile}" ".*" "" gdb_load ${common_binfile} -set readnow_p [readnow ${common_binfile}] - # Start the program, we should land in the program main procedure if { [gdb_start_cmd] < 0 } { untested start @@ -78,9 +76,6 @@ gdb_test "shell touch ${common_binfile}" ".*" "" if { [gdb_start_cmd] < 0 } { fail "start second" } else { - if { $readnow_p } { - setup_kfail "gdb/26800" *-*-* - } gdb_test "" \ "second \\(\\) at .*second.adb.*" \ "start second" @@ -108,9 +103,6 @@ if { [gdb_start_cmd] < 0 } { gdb_test_no_output "set \$check_gdb_running = 0" "check gdb running" fail "start just first" } else { - if { $readnow_p } { - setup_kfail "gdb/26800" *-*-* - } gdb_test "" \ "first \\(\\) at .*first.adb.*" \ "start just first" diff --git a/gdb/testsuite/gdb.base/cached-source-file.exp b/gdb/testsuite/gdb.base/cached-source-file.exp index 13965d93b65..3b0166aa18d 100644 --- a/gdb/testsuite/gdb.base/cached-source-file.exp +++ b/gdb/testsuite/gdb.base/cached-source-file.exp @@ -84,13 +84,17 @@ if { [gdb_compile "${srcfile}" "${binfile}" executable {debug}] != "" } { # Rerun the program. This should not only force GDB to reload the # source cache, but also to break at BP_LINE again, which now has # different contents. -gdb_test_multiple "run" "rerun program" { - -re {The program being debugged has been started already\.\r\nStart it from the beginning\? \(y or n\) $} { - set binregex [string_to_regexp $binfile] - gdb_test "y" "\\`$binregex\\' has changed; re-reading symbols\.\r\nStarting program: ${binregex}.*" \ - "rerun program" - } -} +set q \ + [multi_line \ + "The program being debugged has been started already\\." \ + "Start it from the beginning\\? \\(y or n\\) "] +set binregex [string_to_regexp $binfile] +set re \ + [multi_line \ + "\\`$binregex\\' has changed; re-reading symbols\\.(" \ + "Expanding full symbols from $binfile\\.\\.\\.)?" \ + "Starting program: ${binregex}.*"] +gdb_test "run" $re "rerun program" $q y # Again, perform the listing and check that the line indeed has # changed for GDB. diff --git a/gdb/testsuite/gdb.base/reread.exp b/gdb/testsuite/gdb.base/reread.exp index 7ab30f2fde0..3d4b484182d 100644 --- a/gdb/testsuite/gdb.base/reread.exp +++ b/gdb/testsuite/gdb.base/reread.exp @@ -60,8 +60,6 @@ foreach_with_prefix opts { "" "pie" } { gdb_rename_execfile ${binfile1} ${binfile} gdb_load ${binfile} - set readnow_p [readnow ${binfile}] - # Set a breakpoint at foo gdb_test "break foo" \ @@ -92,9 +90,6 @@ foreach_with_prefix opts { "" "pie" } { unsupported $test } else { gdb_run_cmd - if { $readnow_p } { - setup_kfail "gdb/26800" *-*-* - } gdb_test "" "Breakpoint.* foo .* at .*:9.*" $test } @@ -131,9 +126,6 @@ foreach_with_prefix opts { "" "pie" } { gdb_rename_execfile ${binfile} ${binfile1} gdb_rename_execfile ${binfile2} ${binfile} gdb_run_cmd - if { $readnow_p } { - setup_kfail "gdb/26800" *-*-* - } gdb_test "" "Breakpoint.* foo .* at .*:9.*" \ "second pass: run to foo() second time" }