Fixes PR 25475: ensure exec-file-mismatch "ask" always asks in case of mismatch.
authorPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Sun, 21 Jun 2020 19:26:25 +0000 (21:26 +0200)
committerPhilippe Waroquiers <philippe.waroquiers@skynet.be>
Wed, 24 Jun 2020 20:21:07 +0000 (22:21 +0200)
As explained in https://sourceware.org/bugzilla/show_bug.cgi?id=25475,
when the currently loaded file has no debug symbol,
symbol_file_add_with_addrs does not ask a confirmation to the user
before loading the new symbol file.  The behaviour is not consistent
when symbol_file_add_with_addrs is called due to exec-file-mismatch "ask"
setting.

The PR discusses several solutions/approaches.
The preferred approach (suggested by Joel) is to ensure that GDB always asks
a confirmation when it loads a new symbol file due to exec-file-mismatch,
using a new SYMFILE add-flag.

I tested this manually.  If OK, we can remove the bypass introduced by Tom
in 6b9374f1, in order to always answer to the 'load' question.

gdb/ChangeLog
2020-06-24  Philippe Waroquiers  <philippe.waroquiers@skynet.be>

* symfile-add-flags.h: New flag SYMFILE_ALWAYS_CONFIRM.
* exec.c (validate_exec_file): If from_tty, set both
SYMFILE_VERBOSE (== from_tty) and SYMFILE_ALWAYS_CONFIRM.
* symfile.c (symbol_file_add_with_addrs): if always_confirm
and from_tty, unconditionally ask a confirmation.

gdb/ChangeLog
gdb/exec.c
gdb/symfile-add-flags.h
gdb/symfile.c

index 57bd32397d72ad27868bbf83413d48e6bd35575d..12ef02bc997d4e7810f5829dac17a597b521d37d 100644 (file)
@@ -1,3 +1,11 @@
+2020-06-24  Philippe Waroquiers  <philippe.waroquiers@skynet.be>
+
+       * symfile-add-flags.h: New flag SYMFILE_ALWAYS_CONFIRM.
+       * exec.c (validate_exec_file): If from_tty, set both
+       SYMFILE_VERBOSE (== from_tty) and SYMFILE_ALWAYS_CONFIRM.
+       * symfile.c (symbol_file_add_with_addrs): if always_confirm
+       and from_tty, unconditionally ask a confirmation.
+
 2020-06-23  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * target-descriptions.c (tdesc_architecture_name): Protect against
index fa770c6f02099bfe3d2d9a2190c7826d70a10027..de473fbcb2974d95fec69fccfedbede42e2bbcaa 100644 (file)
@@ -315,7 +315,10 @@ validate_exec_file (int from_tty)
        {
          symfile_add_flags add_flags = SYMFILE_MAINLINE;
          if (from_tty)
-           add_flags |= SYMFILE_VERBOSE;
+           {
+             add_flags |= SYMFILE_VERBOSE;
+             add_flags |= SYMFILE_ALWAYS_CONFIRM;
+           }
          try
            {
              symbol_file_add_main (exec_file_target.c_str (), add_flags);
index 740357bc12588a386219dc17274de21eff055c5b..2b2c2e68f270ab71008908e9090cf09463cd932c 100644 (file)
@@ -44,6 +44,12 @@ enum symfile_add_flag : unsigned
 
     /* The new objfile should be marked OBJF_NOT_FILENAME.  */
     SYMFILE_NOT_FILENAME = 1 << 5,
+
+    /* If SYMFILE_VERBOSE (interpreted as from_tty) and SYMFILE_ALWAYS_CONFIRM,
+       always ask user to confirm loading the symbol file.
+       Without this flag, symbol_file_add_with_addrs asks a confirmation only
+       for a main symbol file replacing a file having symbols.  */
+    SYMFILE_ALWAYS_CONFIRM = 1 << 6,
  };
 
 DEF_ENUM_FLAGS_TYPE (enum symfile_add_flag, symfile_add_flags);
index b29f864b3735989392dae7684754e7958413a08d..2c38ce4431a6218c0f98c04e057ce0f890140183 100644 (file)
@@ -1051,6 +1051,7 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name,
   struct objfile *objfile;
   const int from_tty = add_flags & SYMFILE_VERBOSE;
   const int mainline = add_flags & SYMFILE_MAINLINE;
+  const int always_confirm = add_flags & SYMFILE_ALWAYS_CONFIRM;
   const int should_print = (print_symbol_loading_p (from_tty, mainline, 1)
                            && (readnow_symbol_files
                                || (add_flags & SYMFILE_NO_READ) == 0));
@@ -1069,12 +1070,13 @@ symbol_file_add_with_addrs (bfd *abfd, const char *name,
   if ((add_flags & SYMFILE_NOT_FILENAME) != 0)
     flags |= OBJF_NOT_FILENAME;
 
-  /* Give user a chance to burp if we'd be
+  /* Give user a chance to burp if ALWAYS_CONFIRM or we'd be
      interactively wiping out any existing symbols.  */
 
-  if ((have_full_symbols () || have_partial_symbols ())
-      && mainline
-      && from_tty
+  if (from_tty
+      && (always_confirm
+         || ((have_full_symbols () || have_partial_symbols ())
+             && mainline))
       && !query (_("Load new symbol table from \"%s\"? "), name))
     error (_("Not confirmed."));