X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fsymmisc.c;h=9ce7679f978d3b5fc14a651c0f68be113521fd8f;hb=b786c521573fce15b05c4b879e05f9cc592e1e4b;hp=b292c3b6850264901f046aa44acdff94850774ba;hpb=7b6bb8daaceb9ecf3f42dea57ae82733d6a3b2f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/symmisc.c b/gdb/symmisc.c index b292c3b685..9ce7679f97 100644 --- a/gdb/symmisc.c +++ b/gdb/symmisc.c @@ -1,8 +1,7 @@ /* 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, - 2011 Free Software Foundation, Inc. + Copyright (C) 1986-2000, 2002-2004, 2007-2012 Free Software + Foundation, Inc. This file is part of GDB. @@ -23,6 +22,7 @@ #include "symtab.h" #include "gdbtypes.h" #include "bfd.h" +#include "filenames.h" #include "symfile.h" #include "objfiles.h" #include "breakpoint.h" @@ -78,46 +78,6 @@ struct print_symbol_args static int print_symbol (void *); -/* 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 +85,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 +107,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 +149,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 +226,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 +300,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 +317,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 +355,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; @@ -448,8 +415,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 +424,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 +439,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); } @@ -545,9 +513,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 +543,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: @@ -668,7 +639,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 +648,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,13 +666,14 @@ 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); } @@ -713,11 +686,12 @@ 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); + } } @@ -764,12 +738,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,7 +772,7 @@ block_depth (struct block *block) } -/* Do early runtime initializations. */ +/* Do early runtime initializations. */ void _initialize_symmisc (void) {