gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / corefile.c
index 6cc2afc49e816e2dbefe45266e2977df1a5e4176..996e5301b27a336abbe60adfb2b16cd65fb874e6 100644 (file)
@@ -1,6 +1,6 @@
 /* Core dump and executable file functions above target vector, for GDB.
 
-   Copyright (C) 1986-2016 Free Software Foundation, Inc.
+   Copyright (C) 1986-2020 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "dis-asm.h"
 #include <sys/stat.h>
 #include "completer.h"
-#include "observer.h"
+#include "observable.h"
 #include "cli/cli-utils.h"
-
-/* Local function declarations.  */
-
-extern void _initialize_core (void);
+#include "gdbarch.h"
 
 /* You can have any number of hooks for `exec_file_command' command to
    call.  If there's only one hook, it is set in exec_file_display
@@ -53,29 +50,6 @@ static hook_type *exec_file_extra_hooks;     /* Array of additional
                                                   hooks.  */
 static int exec_file_hook_count = 0;           /* Size of array.  */
 
-/* Binary file diddling handle for the core file.  */
-
-bfd *core_bfd = NULL;
-
-/* corelow.c target.  It is never NULL after GDB initialization.  */
-
-struct target_ops *core_target;
-\f
-
-/* Backward compatability with old way of specifying core files.  */
-
-void
-core_file_command (char *filename, int from_tty)
-{
-  dont_repeat ();              /* Either way, seems bogus.  */
-
-  gdb_assert (core_target != NULL);
-
-  if (!filename)
-    (core_target->to_detach) (core_target, filename, from_tty);
-  else
-    (core_target->to_open) (filename, from_tty);
-}
 \f
 
 /* If there are two or more functions that wish to hook into
@@ -130,29 +104,24 @@ specify_exec_file_hook (void (*hook) (const char *))
 void
 reopen_exec_file (void)
 {
-  char *filename;
   int res;
   struct stat st;
-  struct cleanup *cleanups;
 
   /* Don't do anything if there isn't an exec file.  */
   if (exec_bfd == NULL)
     return;
 
   /* If the timestamp of the exec file has changed, reopen it.  */
-  filename = xstrdup (bfd_get_filename (exec_bfd));
-  cleanups = make_cleanup (xfree, filename);
-  res = stat (filename, &st);
+  std::string filename = bfd_get_filename (exec_bfd);
+  res = stat (filename.c_str (), &st);
 
-  if (exec_bfd_mtime && exec_bfd_mtime != st.st_mtime)
-    exec_file_attach (filename, 0);
+  if (res == 0 && exec_bfd_mtime && exec_bfd_mtime != st.st_mtime)
+    exec_file_attach (filename.c_str (), 0);
   else
     /* If we accessed the file since last opening it, close it now;
        this stops GDB from holding the executable open after it
        exits.  */
     bfd_cache_close_all ();
-
-  do_cleanups (cleanups);
 }
 \f
 /* If we have both a core file and an exec file,
@@ -170,11 +139,9 @@ validate_files (void)
     }
 }
 
-/* Return the name of the executable file as a string.
-   ERR nonzero means get error if there is none specified;
-   otherwise return 0 in that case.  */
+/* See gdbsupport/common-inferior.h.  */
 
-char *
+const char *
 get_exec_file (int err)
 {
   if (exec_filename)
@@ -184,11 +151,10 @@ get_exec_file (int err)
 
   error (_("No executable file specified.\n\
 Use the \"file\" or \"exec-file\" command."));
-  return NULL;
 }
 \f
 
-char *
+std::string
 memory_error_message (enum target_xfer_status err,
                      struct gdbarch *gdbarch, CORE_ADDR memaddr)
 {
@@ -197,11 +163,11 @@ memory_error_message (enum target_xfer_status err,
     case TARGET_XFER_E_IO:
       /* Actually, address between memaddr and memaddr + len was out of
         bounds.  */
-      return xstrprintf (_("Cannot access memory at address %s"),
-                        paddress (gdbarch, memaddr));
+      return string_printf (_("Cannot access memory at address %s"),
+                           paddress (gdbarch, memaddr));
     case TARGET_XFER_UNAVAILABLE:
-      return xstrprintf (_("Memory at address %s unavailable."),
-                        paddress (gdbarch, memaddr));
+      return string_printf (_("Memory at address %s unavailable."),
+                           paddress (gdbarch, memaddr));
     default:
       internal_error (__FILE__, __LINE__,
                      "unhandled target_xfer_status: %s (%s)",
@@ -215,12 +181,10 @@ memory_error_message (enum target_xfer_status err,
 void
 memory_error (enum target_xfer_status err, CORE_ADDR memaddr)
 {
-  char *str;
   enum errors exception = GDB_NO_ERROR;
 
   /* Build error string.  */
-  str = memory_error_message (err, target_gdbarch (), memaddr);
-  make_cleanup (xfree, str);
+  std::string str = memory_error_message (err, target_gdbarch (), memaddr);
 
   /* Choose the right error to throw.  */
   switch (err)
@@ -234,7 +198,7 @@ memory_error (enum target_xfer_status err, CORE_ADDR memaddr)
     }
 
   /* Throw it.  */
-  throw_error (exception, ("%s"), str);
+  throw_error (exception, ("%s"), str.c_str ());
 }
 
 /* Helper function.  */
@@ -250,8 +214,7 @@ read_memory_object (enum target_object object, CORE_ADDR memaddr,
       enum target_xfer_status status;
       ULONGEST xfered_len;
 
-      status = target_xfer_partial (current_target.beneath,
-                                   object, NULL,
+      status = target_xfer_partial (current_top_target (), object, NULL,
                                    myaddr + xfered, NULL,
                                    memaddr + xfered, len - xfered,
                                    &xfered_len);
@@ -421,7 +384,7 @@ write_memory_with_notification (CORE_ADDR memaddr, const bfd_byte *myaddr,
                                ssize_t len)
 {
   write_memory (memaddr, myaddr, len);
-  observer_notify_memory_changed (current_inferior (), memaddr, len, myaddr);
+  gdb::observers::memory_changed.notify (current_inferior (), memaddr, len, myaddr);
 }
 
 /* Store VALUE at ADDR in the inferior as a LEN-byte unsigned
@@ -452,7 +415,7 @@ write_memory_signed_integer (CORE_ADDR addr, int len,
 \f
 /* The current default bfd target.  Points to storage allocated for
    gnutarget_string.  */
-char *gnutarget;
+const char *gnutarget;
 
 /* Same thing, except it is "auto" not NULL for the default case.  */
 static char *gnutarget_string;
@@ -465,11 +428,8 @@ show_gnutarget_string (struct ui_file *file, int from_tty,
                    _("The current BFD target is \"%s\".\n"), value);
 }
 
-static void set_gnutarget_command (char *, int,
-                                  struct cmd_list_element *);
-
 static void
-set_gnutarget_command (char *ignore, int from_tty,
+set_gnutarget_command (const char *ignore, int from_tty,
                       struct cmd_list_element *c)
 {
   char *gend = gnutarget_string + strlen (gnutarget_string);
@@ -485,8 +445,9 @@ set_gnutarget_command (char *ignore, int from_tty,
 
 /* A completion function for "set gnutarget".  */
 
-static VEC (char_ptr) *
+static void
 complete_set_gnutarget (struct cmd_list_element *cmd,
+                       completion_tracker &tracker,
                        const char *text, const char *word)
 {
   static const char **bfd_targets;
@@ -504,26 +465,27 @@ complete_set_gnutarget (struct cmd_list_element *cmd,
       bfd_targets[last + 1] = NULL;
     }
 
-  return complete_on_enum (bfd_targets, text, word);
+  complete_on_enum (tracker, bfd_targets, text, word);
 }
 
 /* Set the gnutarget.  */
 void
-set_gnutarget (char *newtarget)
+set_gnutarget (const char *newtarget)
 {
-  if (gnutarget_string != NULL)
-    xfree (gnutarget_string);
+  xfree (gnutarget_string);
   gnutarget_string = xstrdup (newtarget);
   set_gnutarget_command (NULL, 0, NULL);
 }
 
+void _initialize_core ();
 void
-_initialize_core (void)
+_initialize_core ()
 {
   struct cmd_list_element *c;
 
   c = add_cmd ("core-file", class_files, core_file_command, _("\
 Use FILE as core dump for examining memory and registers.\n\
+Usage: core-file FILE\n\
 No arg means have no core file.  This command has been superseded by the\n\
 `target core' and `detach' commands."), &cmdlist);
   set_cmd_completer (c, filename_completer);
This page took 0.032616 seconds and 4 git commands to generate.