* target.h (struct target_ops): New member to_thread_architecture.
[deliverable/binutils-gdb.git] / gdb / maint.c
index d016dc42ea0f1704db2bb22fc623cffb8cf7989b..ae465ce638c1dc3b044744760f68d28ce6108d06 100644 (file)
@@ -1,7 +1,7 @@
 /* Support for GDB maintenance commands.
 
    Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2002,
-   2003, 2004, 2007 Free Software Foundation, Inc.
+   2003, 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
 
    Written by Fred Fish at Cygnus Support.
 
@@ -9,7 +9,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
 #include "defs.h"
+#include "arch-utils.h"
 #include <ctype.h>
 #include <signal.h>
 #include "command.h"
@@ -37,6 +36,7 @@
 #include "symfile.h"
 #include "objfiles.h"
 #include "value.h"
+#include "gdb_assert.h"
 
 #include "cli/cli-decode.h"
 
@@ -99,7 +99,7 @@ maintenance_command (char *args, int from_tty)
 static void
 maintenance_dump_me (char *args, int from_tty)
 {
-  if (query ("Should GDB dump core? "))
+  if (query (_("Should GDB dump core? ")))
     {
 #ifdef __DJGPP__
       /* SIGQUIT by default is ignored, so use SIGABRT instead.  */
@@ -308,8 +308,7 @@ maint_print_section_info (const char *name, flagword flags,
                          CORE_ADDR addr, CORE_ADDR endaddr, 
                          unsigned long filepos)
 {
-  /* FIXME-32x64: Need deprecated_print_address_numeric with field
-     width.  */
+  /* FIXME-32x64: Need paddress with field width.  */
   printf_filtered ("    0x%s", paddr (addr));
   printf_filtered ("->0x%s", paddr (endaddr));
   printf_filtered (" at %s",
@@ -351,8 +350,10 @@ print_objfile_section_info (bfd *abfd,
       || match_substring (string, name)
       || match_bfd_flags (string, flags))
     {
-      maint_print_section_info (name, flags, asect->addr, asect->endaddr, 
-                         asect->the_bfd_section->filepos);
+      maint_print_section_info (name, flags,
+                               obj_section_addr (asect),
+                               obj_section_endaddr (asect),
+                               asect->the_bfd_section->filepos);
     }
 }
 
@@ -411,15 +412,19 @@ maintenance_print_statistics (char *args, int from_tty)
 static void
 maintenance_print_architecture (char *args, int from_tty)
 {
+  struct gdbarch *gdbarch = get_current_arch ();
+
   if (args == NULL)
-    gdbarch_dump (current_gdbarch, gdb_stdout);
+    gdbarch_dump (gdbarch, gdb_stdout);
   else
     {
+      struct cleanup *cleanups;
       struct ui_file *file = gdb_fopen (args, "w");
       if (file == NULL)
        perror_with_name (_("maintenance print architecture"));
-      gdbarch_dump (current_gdbarch, file);    
-      ui_file_delete (file);
+      cleanups = make_cleanup_ui_file_delete (file);
+      gdbarch_dump (gdbarch, file);
+      do_cleanups (cleanups);
     }
 }
 
@@ -444,7 +449,7 @@ static void
 maintenance_translate_address (char *arg, int from_tty)
 {
   CORE_ADDR address;
-  asection *sect;
+  struct obj_section *sect;
   char *p;
   struct minimal_symbol *sym;
   struct objfile *objfile;
@@ -465,14 +470,13 @@ maintenance_translate_address (char *arg, int from_tty)
       while (isspace (*p))
        p++;                    /* Skip whitespace */
 
-      ALL_OBJFILES (objfile)
+      ALL_OBJSECTIONS (objfile, sect)
       {
-       sect = bfd_get_section_by_name (objfile->obfd, arg);
-       if (sect != NULL)
+       if (strcmp (sect->the_bfd_section->name, arg) == 0)
          break;
       }
 
-      if (!sect)
+      if (!objfile)
        error (_("Unknown section %s."), arg);
     }
 
@@ -484,11 +488,35 @@ maintenance_translate_address (char *arg, int from_tty)
     sym = lookup_minimal_symbol_by_pc (address);
 
   if (sym)
-    printf_filtered ("%s+%s\n",
-                    SYMBOL_PRINT_NAME (sym),
-                    paddr_u (address - SYMBOL_VALUE_ADDRESS (sym)));
+    {
+      const char *symbol_name = SYMBOL_PRINT_NAME (sym);
+      const char *symbol_offset = pulongest (address - SYMBOL_VALUE_ADDRESS (sym));
+
+      sect = SYMBOL_OBJ_SECTION(sym);
+      if (sect != NULL)
+       {
+         const char *section_name;
+         const char *obj_name;
+
+         gdb_assert (sect->the_bfd_section && sect->the_bfd_section->name);
+         section_name = sect->the_bfd_section->name;
+
+         gdb_assert (sect->objfile && sect->objfile->name);
+         obj_name = sect->objfile->name;
+
+         if (MULTI_OBJFILE_P ())
+           printf_filtered (_("%s + %s in section %s of %s\n"),
+                            symbol_name, symbol_offset, section_name, obj_name);
+         else
+           printf_filtered (_("%s + %s in section %s\n"),
+                            symbol_name, symbol_offset, section_name);
+       }
+      else
+       printf_filtered (_("%s + %s\n"), symbol_name, symbol_offset);
+    }
   else if (sect)
-    printf_filtered (_("no symbol at %s:0x%s\n"), sect->name, paddr (address));
+    printf_filtered (_("no symbol at %s:0x%s\n"),
+                    sect->the_bfd_section->name, paddr (address));
   else
     printf_filtered (_("no symbol at 0x%s\n"), paddr (address));
 
@@ -640,16 +668,16 @@ show_maintenance_profile_p (struct ui_file *file, int from_tty,
   fprintf_filtered (file, _("Internal profiling is %s.\n"), value);
 }
 
-#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP)
-
 #ifdef HAVE__ETEXT
 extern char _etext;
 #define TEXTEND &_etext
-#else
+#elif defined (HAVE_ETEXT)
 extern char etext;
 #define TEXTEND &etext
 #endif
 
+#if defined (HAVE_MONSTARTUP) && defined (HAVE__MCLEANUP) && defined (TEXTEND)
+
 static int profiling_state;
 
 static void
@@ -851,14 +879,14 @@ Takes an optional file parameter."),
 
   add_cmd ("deprecate", class_maintenance, maintenance_deprecate, _("\
 Deprecate a command.  Note that this is just in here so the \n\
-testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\
+testsuite can check the command deprecator. You probably shouldn't use this,\n\
 rather you should use the C function deprecate_cmd().  If you decide you \n\
 want to use it: maintenance deprecate 'commandname' \"replacement\". The \n\
 replacement is optional."), &maintenancelist);
 
   add_cmd ("undeprecate", class_maintenance, maintenance_undeprecate, _("\
 Undeprecate a command.  Note that this is just in here so the \n\
-testsuite can check the comamnd deprecator. You probably shouldn't use this,\n\
+testsuite can check the command deprecator. You probably shouldn't use this,\n\
 If you decide you want to use it: maintenance undeprecate 'commandname'"),
           &maintenancelist);
 
This page took 0.036086 seconds and 4 git commands to generate.