gas/
[deliverable/binutils-gdb.git] / gdb / symmisc.c
index ef6321613dedf0a946cc2e494126d094e668c818..ce0bd205afc455ce9298942fe42cd3dc9bc0b197 100644 (file)
@@ -1,8 +1,6 @@
 /* Do various things to symbol tables (other than lookup), for GDB.
 
-   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008, 2009, 2010
-   Free Software Foundation, Inc.
+   Copyright (C) 1986-2013 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -23,6 +21,7 @@
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "bfd.h"
+#include "filenames.h"
 #include "symfile.h"
 #include "objfiles.h"
 #include "breakpoint.h"
@@ -35,6 +34,8 @@
 #include "gdb_regex.h"
 #include "gdb_stat.h"
 #include "dictionary.h"
+#include "typeprint.h"
+#include "gdbcmd.h"
 
 #include "gdb_string.h"
 #include "readline/readline.h"
@@ -78,46 +79,6 @@ struct print_symbol_args
 
 static int print_symbol (void *);
 \f
-/* Free all the storage associated with the struct symtab <- S.
-   Note that some symtabs have contents that all live inside one big block of
-   memory, and some share the contents of another symbol table and so you
-   should not free the contents on their behalf (except sometimes the
-   linetable, which maybe per symtab even when the rest is not).
-   It is s->free_code that says which alternative to use.  */
-
-void
-free_symtab (struct symtab *s)
-{
-  switch (s->free_code)
-    {
-    case free_nothing:
-      /* All the contents are part of a big block of memory (an obstack),
-         and some other symtab is in charge of freeing that block.
-         Therefore, do nothing.  */
-      break;
-
-    case free_linetable:
-      /* Everything will be freed either by our `free_func'
-         or by some other symtab, except for our linetable.
-         Free that now.  */
-      if (LINETABLE (s))
-       xfree (LINETABLE (s));
-      break;
-    }
-
-  /* If there is a single block of memory to free, free it.  */
-  if (s->free_func != NULL)
-    s->free_func (s);
-
-  /* Free source-related stuff */
-  if (s->line_charpos != NULL)
-    xfree (s->line_charpos);
-  if (s->fullname != NULL)
-    xfree (s->fullname);
-  if (s->debugformat != NULL)
-    xfree (s->debugformat);
-  xfree (s);
-}
 
 void
 print_symbol_bcache_statistics (void)
@@ -125,17 +86,18 @@ print_symbol_bcache_statistics (void)
   struct program_space *pspace;
   struct objfile *objfile;
 
-  immediate_quit++;
   ALL_PSPACES (pspace)
     ALL_PSPACE_OBJFILES (pspace, objfile)
   {
+    QUIT;
     printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
     print_bcache_statistics (psymbol_bcache_get_bcache (objfile->psymbol_cache),
                              "partial symbol cache");
-    print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
-    print_bcache_statistics (objfile->filename_cache, "file name cache");
+    print_bcache_statistics (objfile->per_bfd->macro_cache,
+                            "preprocessor macro cache");
+    print_bcache_statistics (objfile->per_bfd->filename_cache,
+                            "file name cache");
   }
-  immediate_quit--;
 }
 
 void
@@ -146,10 +108,10 @@ print_objfile_statistics (void)
   struct symtab *s;
   int i, linetables, blockvectors;
 
-  immediate_quit++;
   ALL_PSPACES (pspace)
     ALL_PSPACE_OBJFILES (pspace, objfile)
   {
+    QUIT;
     printf_filtered (_("Statistics for '%s':\n"), objfile->name);
     if (OBJSTAT (objfile, n_stabs) > 0)
       printf_filtered (_("  Number of \"stab\" symbols read: %d\n"),
@@ -188,15 +150,16 @@ print_objfile_statistics (void)
                       OBJSTAT (objfile, sz_strtab));
     printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
                     obstack_memory_used (&objfile->objfile_obstack));
+    printf_filtered (_("  Total memory used for BFD obstack: %d\n"),
+                    obstack_memory_used (&objfile->per_bfd->storage_obstack));
     printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
                     bcache_memory_used (psymbol_bcache_get_bcache
                                          (objfile->psymbol_cache)));
     printf_filtered (_("  Total memory used for macro cache: %d\n"),
-                    bcache_memory_used (objfile->macro_cache));
+                    bcache_memory_used (objfile->per_bfd->macro_cache));
     printf_filtered (_("  Total memory used for file name cache: %d\n"),
-                    bcache_memory_used (objfile->filename_cache));
+                    bcache_memory_used (objfile->per_bfd->filename_cache));
   }
-  immediate_quit--;
 }
 
 static void
@@ -264,6 +227,9 @@ dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
        case mst_text:
          ms_type = 'T';
          break;
+       case mst_text_gnu_ifunc:
+         ms_type = 'i';
+         break;
        case mst_solib_trampoline:
          ms_type = 'S';
          break;
@@ -335,7 +301,8 @@ dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
   fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
   gdb_print_host_address (objfile, outfile);
   fprintf_filtered (outfile, ")\n");
-  fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
+  fprintf_filtered (outfile, "Language: %s\n",
+                   language_str (symtab->language));
 
   /* First print the line table.  */
   l = LINETABLE (symtab);
@@ -351,7 +318,7 @@ dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
        }
     }
   /* Now print the block info, but only for primary symtabs since we will
-     print lots of duplicate info otherwise. */
+     print lots of duplicate info otherwise.  */
   if (symtab->primary)
     {
       fprintf_filtered (outfile, "\nBlockvector:\n\n");
@@ -389,8 +356,9 @@ dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
            }
          fprintf_filtered (outfile, "\n");
          /* Now print each symbol in this block (in no particular order, if
-            we're using a hashtable).  */
-         ALL_BLOCK_SYMBOLS (b, iter, sym)
+            we're using a hashtable).  Note that we only want this
+            block, not any blocks from included symtabs.  */
+         ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
            {
              struct print_symbol_args s;
 
@@ -433,7 +401,7 @@ dump_symtab (struct objfile *objfile, struct symtab *symtab,
     dump_symtab_1 (objfile, symtab, outfile);
 }
 
-void
+static void
 maintenance_print_symbols (char *args, int from_tty)
 {
   char **argv;
@@ -448,8 +416,8 @@ maintenance_print_symbols (char *args, int from_tty)
 
   if (args == NULL)
     {
-      error (_("\
-Arguments missing: an output file name and an optional symbol file name"));
+      error (_("Arguments missing: an output file name "
+              "and an optional symbol file name"));
     }
   argv = gdb_buildargv (args);
   cleanups = make_cleanup_freeargv (argv);
@@ -457,7 +425,7 @@ Arguments missing: an output file name and an optional symbol file name"));
   if (argv[0] != NULL)
     {
       filename = argv[0];
-      /* If a second arg is supplied, it is a source file name to match on */
+      /* If a second arg is supplied, it is a source file name to match on */
       if (argv[1] != NULL)
        {
          symname = argv[1];
@@ -472,11 +440,12 @@ Arguments missing: an output file name and an optional symbol file name"));
     perror_with_name (filename);
   make_cleanup_ui_file_delete (outfile);
 
-  immediate_quit++;
   ALL_SYMTABS (objfile, s)
-    if (symname == NULL || strcmp (symname, s->filename) == 0)
-    dump_symtab (objfile, s, outfile);
-  immediate_quit--;
+    {
+      QUIT;
+      if (symname == NULL || filename_cmp (symname, s->filename) == 0)
+       dump_symtab (objfile, s, outfile);
+    }
   do_cleanups (cleanups);
 }
 
@@ -512,7 +481,8 @@ print_symbol (void *args)
     {
       if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
        {
-         LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
+         LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
+                        &type_print_raw_options);
        }
       else
        {
@@ -522,7 +492,8 @@ print_symbol (void *args)
                     : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
                        ? "struct" : "union")),
                            SYMBOL_LINKAGE_NAME (symbol));
-         LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
+         LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth,
+                        &type_print_raw_options);
        }
       fprintf_filtered (outfile, ";\n");
     }
@@ -536,7 +507,8 @@ print_symbol (void *args)
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
                         outfile,
                         TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
-                        depth);
+                        depth,
+                        &type_print_raw_options);
          fprintf_filtered (outfile, "; ");
        }
       else
@@ -545,9 +517,9 @@ print_symbol (void *args)
       switch (SYMBOL_CLASS (symbol))
        {
        case LOC_CONST:
-         fprintf_filtered (outfile, "const %ld (0x%lx)",
-                           SYMBOL_VALUE (symbol),
-                           SYMBOL_VALUE (symbol));
+         fprintf_filtered (outfile, "const %s (%s)",
+                           plongest (SYMBOL_VALUE (symbol)),
+                           hex_string (SYMBOL_VALUE (symbol)));
          break;
 
        case LOC_CONST_BYTES:
@@ -575,28 +547,31 @@ print_symbol (void *args)
 
        case LOC_REGISTER:
          if (SYMBOL_IS_ARGUMENT (symbol))
-           fprintf_filtered (outfile, "parameter register %ld",
-                             SYMBOL_VALUE (symbol));
+           fprintf_filtered (outfile, "parameter register %s",
+                             plongest (SYMBOL_VALUE (symbol)));
          else
-           fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
+           fprintf_filtered (outfile, "register %s",
+                             plongest (SYMBOL_VALUE (symbol)));
          break;
 
        case LOC_ARG:
-         fprintf_filtered (outfile, "arg at offset 0x%lx",
-                           SYMBOL_VALUE (symbol));
+         fprintf_filtered (outfile, "arg at offset %s",
+                           hex_string (SYMBOL_VALUE (symbol)));
          break;
 
        case LOC_REF_ARG:
-         fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
+         fprintf_filtered (outfile, "reference arg at %s",
+                           hex_string (SYMBOL_VALUE (symbol)));
          break;
 
        case LOC_REGPARM_ADDR:
-         fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
+         fprintf_filtered (outfile, "address parameter register %s",
+                           plongest (SYMBOL_VALUE (symbol)));
          break;
 
        case LOC_LOCAL:
-         fprintf_filtered (outfile, "local at offset 0x%lx",
-                           SYMBOL_VALUE (symbol));
+         fprintf_filtered (outfile, "local at offset %s",
+                           hex_string (SYMBOL_VALUE (symbol)));
          break;
 
        case LOC_TYPEDEF:
@@ -651,7 +626,7 @@ print_symbol (void *args)
   return 1;
 }
 
-void
+static void
 maintenance_print_msymbols (char *args, int from_tty)
 {
   char **argv;
@@ -668,7 +643,8 @@ maintenance_print_msymbols (char *args, int from_tty)
 
   if (args == NULL)
     {
-      error (_("print-msymbols takes an output file name and optional symbol file name"));
+      error (_("print-msymbols takes an output file "
+              "name and optional symbol file name"));
     }
   argv = gdb_buildargv (args);
   cleanups = make_cleanup_freeargv (argv);
@@ -676,7 +652,7 @@ maintenance_print_msymbols (char *args, int from_tty)
   if (argv[0] != NULL)
     {
       filename = argv[0];
-      /* If a second arg is supplied, it is a source file name to match on */
+      /* If a second arg is supplied, it is a source file name to match on */
       if (argv[1] != NULL)
        {
          symname = xfullpath (argv[1]);
@@ -694,18 +670,19 @@ maintenance_print_msymbols (char *args, int from_tty)
     perror_with_name (filename);
   make_cleanup_ui_file_delete (outfile);
 
-  immediate_quit++;
   ALL_PSPACES (pspace)
     ALL_PSPACE_OBJFILES (pspace, objfile)
-      if (symname == NULL
-         || (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino))
-       dump_msymbols (objfile, outfile);
-  immediate_quit--;
+      {
+       QUIT;
+       if (symname == NULL || (!stat (objfile->name, &obj_st)
+                               && sym_st.st_ino == obj_st.st_ino))
+         dump_msymbols (objfile, outfile);
+      }
   fprintf_filtered (outfile, "\n\n");
   do_cleanups (cleanups);
 }
 
-void
+static void
 maintenance_print_objfiles (char *ignore, int from_tty)
 {
   struct program_space *pspace;
@@ -713,16 +690,17 @@ maintenance_print_objfiles (char *ignore, int from_tty)
 
   dont_repeat ();
 
-  immediate_quit++;
   ALL_PSPACES (pspace)
     ALL_PSPACE_OBJFILES (pspace, objfile)
-      dump_objfile (objfile);
-  immediate_quit--;
+      {
+       QUIT;
+       dump_objfile (objfile);
+      }
 }
 
-
 /* List all the symbol tables whose names match REGEXP (optional).  */
-void
+
+static void
 maintenance_info_symtabs (char *regexp, int from_tty)
 {
   struct program_space *pspace;
@@ -764,12 +742,15 @@ maintenance_info_symtabs (char *regexp, int from_tty)
                               symtab->dirname ? symtab->dirname : "(null)");
              printf_filtered ("          fullname %s\n",
                               symtab->fullname ? symtab->fullname : "(null)");
-             printf_filtered ("          blockvector ((struct blockvector *) %s)%s\n",
+             printf_filtered ("          "
+                              "blockvector ((struct blockvector *) %s)%s\n",
                               host_address_to_string (symtab->blockvector),
                               symtab->primary ? " (primary)" : "");
-             printf_filtered ("          linetable ((struct linetable *) %s)\n",
+             printf_filtered ("          "
+                              "linetable ((struct linetable *) %s)\n",
                               host_address_to_string (symtab->linetable));
-             printf_filtered ("          debugformat %s\n", symtab->debugformat);
+             printf_filtered ("          debugformat %s\n",
+                              symtab->debugformat);
              printf_filtered ("        }\n");
            }
        }
@@ -795,11 +776,35 @@ block_depth (struct block *block)
 }
 \f
 
-/* Do early runtime initializations. */
+/* Do early runtime initializations.  */
+
 void
 _initialize_symmisc (void)
 {
   std_in = stdin;
   std_out = stdout;
   std_err = stderr;
+
+  add_cmd ("symbols", class_maintenance, maintenance_print_symbols, _("\
+Print dump of current symbol definitions.\n\
+Entries in the full symbol table are dumped to file OUTFILE.\n\
+If a SOURCE file is specified, dump only that file's symbols."),
+          &maintenanceprintlist);
+
+  add_cmd ("msymbols", class_maintenance, maintenance_print_msymbols, _("\
+Print dump of current minimal symbol definitions.\n\
+Entries in the minimal symbol table are dumped to file OUTFILE.\n\
+If a SOURCE file is specified, dump only that file's minimal symbols."),
+          &maintenanceprintlist);
+
+  add_cmd ("objfiles", class_maintenance, maintenance_print_objfiles,
+          _("Print dump of current object file definitions."),
+          &maintenanceprintlist);
+
+  add_cmd ("symtabs", class_maintenance, maintenance_info_symtabs, _("\
+List the full symbol tables for all object files.\n\
+This does not include information about individual symbols, blocks, or\n\
+linetables --- just the symbol table structures themselves.\n\
+With an argument REGEXP, list the symbol tables whose names that match that."),
+          &maintenanceinfolist);
 }
This page took 0.02778 seconds and 4 git commands to generate.