OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-7.1/] [gdb/] [symmisc.c] - Blame information for rev 280

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 227 jeremybenn
/* Do various things to symbol tables (other than lookup), for GDB.
2
 
3
   Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
4
   1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2007, 2008, 2009, 2010
5
   Free Software Foundation, Inc.
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 3 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21
 
22
#include "defs.h"
23
#include "symtab.h"
24
#include "gdbtypes.h"
25
#include "bfd.h"
26
#include "symfile.h"
27
#include "objfiles.h"
28
#include "breakpoint.h"
29
#include "command.h"
30
#include "gdb_obstack.h"
31
#include "exceptions.h"
32
#include "language.h"
33
#include "bcache.h"
34
#include "block.h"
35
#include "gdb_regex.h"
36
#include "gdb_stat.h"
37
#include "dictionary.h"
38
 
39
#include "gdb_string.h"
40
#include "readline/readline.h"
41
 
42
#ifndef DEV_TTY
43
#define DEV_TTY "/dev/tty"
44
#endif
45
 
46
/* Unfortunately for debugging, stderr is usually a macro.  This is painful
47
   when calling functions that take FILE *'s from the debugger.
48
   So we make a variable which has the same value and which is accessible when
49
   debugging GDB with itself.  Because stdin et al need not be constants,
50
   we initialize them in the _initialize_symmisc function at the bottom
51
   of the file.  */
52
FILE *std_in;
53
FILE *std_out;
54
FILE *std_err;
55
 
56
/* Prototypes for local functions */
57
 
58
static void dump_symtab (struct objfile *, struct symtab *,
59
                         struct ui_file *);
60
 
61
static void dump_psymtab (struct objfile *, struct partial_symtab *,
62
                          struct ui_file *);
63
 
64
static void dump_msymbols (struct objfile *, struct ui_file *);
65
 
66
static void dump_objfile (struct objfile *);
67
 
68
static int block_depth (struct block *);
69
 
70
static void print_partial_symbols (struct gdbarch *,
71
                                   struct partial_symbol **, int,
72
                                   char *, struct ui_file *);
73
 
74
void _initialize_symmisc (void);
75
 
76
struct print_symbol_args
77
  {
78
    struct gdbarch *gdbarch;
79
    struct symbol *symbol;
80
    int depth;
81
    struct ui_file *outfile;
82
  };
83
 
84
static int print_symbol (void *);
85
 
86
/* Free all the storage associated with the struct symtab <- S.
87
   Note that some symtabs have contents that all live inside one big block of
88
   memory, and some share the contents of another symbol table and so you
89
   should not free the contents on their behalf (except sometimes the
90
   linetable, which maybe per symtab even when the rest is not).
91
   It is s->free_code that says which alternative to use.  */
92
 
93
void
94
free_symtab (struct symtab *s)
95
{
96
  int i, n;
97
  struct blockvector *bv;
98
 
99
  switch (s->free_code)
100
    {
101
    case free_nothing:
102
      /* All the contents are part of a big block of memory (an obstack),
103
         and some other symtab is in charge of freeing that block.
104
         Therefore, do nothing.  */
105
      break;
106
 
107
    case free_linetable:
108
      /* Everything will be freed either by our `free_func'
109
         or by some other symtab, except for our linetable.
110
         Free that now.  */
111
      if (LINETABLE (s))
112
        xfree (LINETABLE (s));
113
      break;
114
    }
115
 
116
  /* If there is a single block of memory to free, free it.  */
117
  if (s->free_func != NULL)
118
    s->free_func (s);
119
 
120
  /* Free source-related stuff */
121
  if (s->line_charpos != NULL)
122
    xfree (s->line_charpos);
123
  if (s->fullname != NULL)
124
    xfree (s->fullname);
125
  if (s->debugformat != NULL)
126
    xfree (s->debugformat);
127
  xfree (s);
128
}
129
 
130
void
131
print_symbol_bcache_statistics (void)
132
{
133
  struct program_space *pspace;
134
  struct objfile *objfile;
135
 
136
  immediate_quit++;
137
  ALL_PSPACES (pspace)
138
    ALL_PSPACE_OBJFILES (pspace, objfile)
139
  {
140
    printf_filtered (_("Byte cache statistics for '%s':\n"), objfile->name);
141
    print_bcache_statistics (objfile->psymbol_cache, "partial symbol cache");
142
    print_bcache_statistics (objfile->macro_cache, "preprocessor macro cache");
143
    print_bcache_statistics (objfile->filename_cache, "file name cache");
144
  }
145
  immediate_quit--;
146
}
147
 
148
void
149
print_objfile_statistics (void)
150
{
151
  struct program_space *pspace;
152
  struct objfile *objfile;
153
  struct symtab *s;
154
  struct partial_symtab *ps;
155
  int i, linetables, blockvectors;
156
 
157
  immediate_quit++;
158
  ALL_PSPACES (pspace)
159
    ALL_PSPACE_OBJFILES (pspace, objfile)
160
  {
161
    printf_filtered (_("Statistics for '%s':\n"), objfile->name);
162
    if (OBJSTAT (objfile, n_stabs) > 0)
163
      printf_filtered (_("  Number of \"stab\" symbols read: %d\n"),
164
                       OBJSTAT (objfile, n_stabs));
165
    if (OBJSTAT (objfile, n_minsyms) > 0)
166
      printf_filtered (_("  Number of \"minimal\" symbols read: %d\n"),
167
                       OBJSTAT (objfile, n_minsyms));
168
    if (OBJSTAT (objfile, n_psyms) > 0)
169
      printf_filtered (_("  Number of \"partial\" symbols read: %d\n"),
170
                       OBJSTAT (objfile, n_psyms));
171
    if (OBJSTAT (objfile, n_syms) > 0)
172
      printf_filtered (_("  Number of \"full\" symbols read: %d\n"),
173
                       OBJSTAT (objfile, n_syms));
174
    if (OBJSTAT (objfile, n_types) > 0)
175
      printf_filtered (_("  Number of \"types\" defined: %d\n"),
176
                       OBJSTAT (objfile, n_types));
177
    i = 0;
178
    ALL_OBJFILE_PSYMTABS (objfile, ps)
179
      {
180
        if (ps->readin == 0)
181
          i++;
182
      }
183
    printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
184
    i = linetables = blockvectors = 0;
185
    ALL_OBJFILE_SYMTABS (objfile, s)
186
      {
187
        i++;
188
        if (s->linetable != NULL)
189
          linetables++;
190
        if (s->primary == 1)
191
          blockvectors++;
192
      }
193
    printf_filtered (_("  Number of symbol tables: %d\n"), i);
194
    printf_filtered (_("  Number of symbol tables with line tables: %d\n"),
195
                     linetables);
196
    printf_filtered (_("  Number of symbol tables with blockvectors: %d\n"),
197
                     blockvectors);
198
 
199
    if (OBJSTAT (objfile, sz_strtab) > 0)
200
      printf_filtered (_("  Space used by a.out string tables: %d\n"),
201
                       OBJSTAT (objfile, sz_strtab));
202
    printf_filtered (_("  Total memory used for objfile obstack: %d\n"),
203
                     obstack_memory_used (&objfile->objfile_obstack));
204
    printf_filtered (_("  Total memory used for psymbol cache: %d\n"),
205
                     bcache_memory_used (objfile->psymbol_cache));
206
    printf_filtered (_("  Total memory used for macro cache: %d\n"),
207
                     bcache_memory_used (objfile->macro_cache));
208
    printf_filtered (_("  Total memory used for file name cache: %d\n"),
209
                     bcache_memory_used (objfile->filename_cache));
210
  }
211
  immediate_quit--;
212
}
213
 
214
static void
215
dump_objfile (struct objfile *objfile)
216
{
217
  struct symtab *symtab;
218
  struct partial_symtab *psymtab;
219
 
220
  printf_filtered ("\nObject file %s:  ", objfile->name);
221
  printf_filtered ("Objfile at ");
222
  gdb_print_host_address (objfile, gdb_stdout);
223
  printf_filtered (", bfd at ");
224
  gdb_print_host_address (objfile->obfd, gdb_stdout);
225
  printf_filtered (", %d minsyms\n\n",
226
                   objfile->minimal_symbol_count);
227
 
228
  if (objfile->psymtabs)
229
    {
230
      printf_filtered ("Psymtabs:\n");
231
      for (psymtab = objfile->psymtabs;
232
           psymtab != NULL;
233
           psymtab = psymtab->next)
234
        {
235
          printf_filtered ("%s at ",
236
                           psymtab->filename);
237
          gdb_print_host_address (psymtab, gdb_stdout);
238
          printf_filtered (", ");
239
          if (psymtab->objfile != objfile)
240
            {
241
              printf_filtered ("NOT ON CHAIN!  ");
242
            }
243
          wrap_here ("  ");
244
        }
245
      printf_filtered ("\n\n");
246
    }
247
 
248
  if (objfile->symtabs)
249
    {
250
      printf_filtered ("Symtabs:\n");
251
      for (symtab = objfile->symtabs;
252
           symtab != NULL;
253
           symtab = symtab->next)
254
        {
255
          printf_filtered ("%s at ", symtab->filename);
256
          gdb_print_host_address (symtab, gdb_stdout);
257
          printf_filtered (", ");
258
          if (symtab->objfile != objfile)
259
            {
260
              printf_filtered ("NOT ON CHAIN!  ");
261
            }
262
          wrap_here ("  ");
263
        }
264
      printf_filtered ("\n\n");
265
    }
266
}
267
 
268
/* Print minimal symbols from this objfile.  */
269
 
270
static void
271
dump_msymbols (struct objfile *objfile, struct ui_file *outfile)
272
{
273
  struct gdbarch *gdbarch = get_objfile_arch (objfile);
274
  struct minimal_symbol *msymbol;
275
  int index;
276
  char ms_type;
277
 
278
  fprintf_filtered (outfile, "\nObject file %s:\n\n", objfile->name);
279
  if (objfile->minimal_symbol_count == 0)
280
    {
281
      fprintf_filtered (outfile, "No minimal symbols found.\n");
282
      return;
283
    }
284
  index = 0;
285
  ALL_OBJFILE_MSYMBOLS (objfile, msymbol)
286
    {
287
      struct obj_section *section = SYMBOL_OBJ_SECTION (msymbol);
288
 
289
      switch (MSYMBOL_TYPE (msymbol))
290
        {
291
        case mst_unknown:
292
          ms_type = 'u';
293
          break;
294
        case mst_text:
295
          ms_type = 'T';
296
          break;
297
        case mst_solib_trampoline:
298
          ms_type = 'S';
299
          break;
300
        case mst_data:
301
          ms_type = 'D';
302
          break;
303
        case mst_bss:
304
          ms_type = 'B';
305
          break;
306
        case mst_abs:
307
          ms_type = 'A';
308
          break;
309
        case mst_file_text:
310
          ms_type = 't';
311
          break;
312
        case mst_file_data:
313
          ms_type = 'd';
314
          break;
315
        case mst_file_bss:
316
          ms_type = 'b';
317
          break;
318
        default:
319
          ms_type = '?';
320
          break;
321
        }
322
      fprintf_filtered (outfile, "[%2d] %c ", index, ms_type);
323
      fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msymbol)),
324
                      outfile);
325
      fprintf_filtered (outfile, " %s", SYMBOL_LINKAGE_NAME (msymbol));
326
      if (section)
327
        fprintf_filtered (outfile, " section %s",
328
                          bfd_section_name (objfile->obfd,
329
                                            section->the_bfd_section));
330
      if (SYMBOL_DEMANGLED_NAME (msymbol) != NULL)
331
        {
332
          fprintf_filtered (outfile, "  %s", SYMBOL_DEMANGLED_NAME (msymbol));
333
        }
334
      if (msymbol->filename)
335
        fprintf_filtered (outfile, "  %s", msymbol->filename);
336
      fputs_filtered ("\n", outfile);
337
      index++;
338
    }
339
  if (objfile->minimal_symbol_count != index)
340
    {
341
      warning (_("internal error:  minimal symbol count %d != %d"),
342
               objfile->minimal_symbol_count, index);
343
    }
344
  fprintf_filtered (outfile, "\n");
345
}
346
 
347
static void
348
dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
349
              struct ui_file *outfile)
350
{
351
  struct gdbarch *gdbarch = get_objfile_arch (objfile);
352
  int i;
353
 
354
  fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
355
                    psymtab->filename);
356
  fprintf_filtered (outfile, "(object ");
357
  gdb_print_host_address (psymtab, outfile);
358
  fprintf_filtered (outfile, ")\n\n");
359
  fprintf_unfiltered (outfile, "  Read from object file %s (",
360
                      objfile->name);
361
  gdb_print_host_address (objfile, outfile);
362
  fprintf_unfiltered (outfile, ")\n");
363
 
364
  if (psymtab->readin)
365
    {
366
      fprintf_filtered (outfile,
367
                        "  Full symtab was read (at ");
368
      gdb_print_host_address (psymtab->symtab, outfile);
369
      fprintf_filtered (outfile, " by function at ");
370
      gdb_print_host_address (psymtab->read_symtab, outfile);
371
      fprintf_filtered (outfile, ")\n");
372
    }
373
 
374
  fprintf_filtered (outfile, "  Relocate symbols by ");
375
  for (i = 0; i < psymtab->objfile->num_sections; ++i)
376
    {
377
      if (i != 0)
378
        fprintf_filtered (outfile, ", ");
379
      wrap_here ("    ");
380
      fputs_filtered (paddress (gdbarch,
381
                                ANOFFSET (psymtab->section_offsets, i)),
382
                      outfile);
383
    }
384
  fprintf_filtered (outfile, "\n");
385
 
386
  fprintf_filtered (outfile, "  Symbols cover text addresses ");
387
  fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
388
  fprintf_filtered (outfile, "-");
389
  fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
390
  fprintf_filtered (outfile, "\n");
391
  fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
392
                    psymtab->number_of_dependencies);
393
  for (i = 0; i < psymtab->number_of_dependencies; i++)
394
    {
395
      fprintf_filtered (outfile, "    %d ", i);
396
      gdb_print_host_address (psymtab->dependencies[i], outfile);
397
      fprintf_filtered (outfile, " %s\n",
398
                        psymtab->dependencies[i]->filename);
399
    }
400
  if (psymtab->n_global_syms > 0)
401
    {
402
      print_partial_symbols (gdbarch,
403
                             objfile->global_psymbols.list
404
                             + psymtab->globals_offset,
405
                             psymtab->n_global_syms, "Global", outfile);
406
    }
407
  if (psymtab->n_static_syms > 0)
408
    {
409
      print_partial_symbols (gdbarch,
410
                             objfile->static_psymbols.list
411
                             + psymtab->statics_offset,
412
                             psymtab->n_static_syms, "Static", outfile);
413
    }
414
  fprintf_filtered (outfile, "\n");
415
}
416
 
417
static void
418
dump_symtab_1 (struct objfile *objfile, struct symtab *symtab,
419
               struct ui_file *outfile)
420
{
421
  struct gdbarch *gdbarch = get_objfile_arch (objfile);
422
  int i;
423
  struct dict_iterator iter;
424
  int len, blen;
425
  struct linetable *l;
426
  struct blockvector *bv;
427
  struct symbol *sym;
428
  struct block *b;
429
  int depth;
430
 
431
  fprintf_filtered (outfile, "\nSymtab for file %s\n", symtab->filename);
432
  if (symtab->dirname)
433
    fprintf_filtered (outfile, "Compilation directory is %s\n",
434
                      symtab->dirname);
435
  fprintf_filtered (outfile, "Read from object file %s (", objfile->name);
436
  gdb_print_host_address (objfile, outfile);
437
  fprintf_filtered (outfile, ")\n");
438
  fprintf_filtered (outfile, "Language: %s\n", language_str (symtab->language));
439
 
440
  /* First print the line table.  */
441
  l = LINETABLE (symtab);
442
  if (l)
443
    {
444
      fprintf_filtered (outfile, "\nLine table:\n\n");
445
      len = l->nitems;
446
      for (i = 0; i < len; i++)
447
        {
448
          fprintf_filtered (outfile, " line %d at ", l->item[i].line);
449
          fputs_filtered (paddress (gdbarch, l->item[i].pc), outfile);
450
          fprintf_filtered (outfile, "\n");
451
        }
452
    }
453
  /* Now print the block info, but only for primary symtabs since we will
454
     print lots of duplicate info otherwise. */
455
  if (symtab->primary)
456
    {
457
      fprintf_filtered (outfile, "\nBlockvector:\n\n");
458
      bv = BLOCKVECTOR (symtab);
459
      len = BLOCKVECTOR_NBLOCKS (bv);
460
      for (i = 0; i < len; i++)
461
        {
462
          b = BLOCKVECTOR_BLOCK (bv, i);
463
          depth = block_depth (b) * 2;
464
          print_spaces (depth, outfile);
465
          fprintf_filtered (outfile, "block #%03d, object at ", i);
466
          gdb_print_host_address (b, outfile);
467
          if (BLOCK_SUPERBLOCK (b))
468
            {
469
              fprintf_filtered (outfile, " under ");
470
              gdb_print_host_address (BLOCK_SUPERBLOCK (b), outfile);
471
            }
472
          /* drow/2002-07-10: We could save the total symbols count
473
             even if we're using a hashtable, but nothing else but this message
474
             wants it.  */
475
          fprintf_filtered (outfile, ", %d syms/buckets in ",
476
                            dict_size (BLOCK_DICT (b)));
477
          fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile);
478
          fprintf_filtered (outfile, "..");
479
          fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile);
480
          if (BLOCK_FUNCTION (b))
481
            {
482
              fprintf_filtered (outfile, ", function %s",
483
                                SYMBOL_LINKAGE_NAME (BLOCK_FUNCTION (b)));
484
              if (SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)) != NULL)
485
                {
486
                  fprintf_filtered (outfile, ", %s",
487
                                SYMBOL_DEMANGLED_NAME (BLOCK_FUNCTION (b)));
488
                }
489
            }
490
          fprintf_filtered (outfile, "\n");
491
          /* Now print each symbol in this block (in no particular order, if
492
             we're using a hashtable).  */
493
          ALL_BLOCK_SYMBOLS (b, iter, sym)
494
            {
495
              struct print_symbol_args s;
496
              s.gdbarch = gdbarch;
497
              s.symbol = sym;
498
              s.depth = depth + 1;
499
              s.outfile = outfile;
500
              catch_errors (print_symbol, &s, "Error printing symbol:\n",
501
                            RETURN_MASK_ERROR);
502
            }
503
        }
504
      fprintf_filtered (outfile, "\n");
505
    }
506
  else
507
    {
508
      fprintf_filtered (outfile, "\nBlockvector same as previous symtab\n\n");
509
    }
510
}
511
 
512
static void
513
dump_symtab (struct objfile *objfile, struct symtab *symtab,
514
             struct ui_file *outfile)
515
{
516
  /* Set the current language to the language of the symtab we're dumping
517
     because certain routines used during dump_symtab() use the current
518
     language to print an image of the symbol.  We'll restore it later.
519
     But use only real languages, not placeholders.  */
520
  if (symtab->language != language_unknown
521
      && symtab->language != language_auto)
522
    {
523
      enum language saved_lang;
524
 
525
      saved_lang = set_language (symtab->language);
526
 
527
      dump_symtab_1 (objfile, symtab, outfile);
528
 
529
      set_language (saved_lang);
530
    }
531
  else
532
    dump_symtab_1 (objfile, symtab, outfile);
533
}
534
 
535
void
536
maintenance_print_symbols (char *args, int from_tty)
537
{
538
  char **argv;
539
  struct ui_file *outfile;
540
  struct cleanup *cleanups;
541
  char *symname = NULL;
542
  char *filename = DEV_TTY;
543
  struct objfile *objfile;
544
  struct symtab *s;
545
 
546
  dont_repeat ();
547
 
548
  if (args == NULL)
549
    {
550
      error (_("\
551
Arguments missing: an output file name and an optional symbol file name"));
552
    }
553
  argv = gdb_buildargv (args);
554
  cleanups = make_cleanup_freeargv (argv);
555
 
556
  if (argv[0] != NULL)
557
    {
558
      filename = argv[0];
559
      /* If a second arg is supplied, it is a source file name to match on */
560
      if (argv[1] != NULL)
561
        {
562
          symname = argv[1];
563
        }
564
    }
565
 
566
  filename = tilde_expand (filename);
567
  make_cleanup (xfree, filename);
568
 
569
  outfile = gdb_fopen (filename, FOPEN_WT);
570
  if (outfile == 0)
571
    perror_with_name (filename);
572
  make_cleanup_ui_file_delete (outfile);
573
 
574
  immediate_quit++;
575
  ALL_SYMTABS (objfile, s)
576
    if (symname == NULL || strcmp (symname, s->filename) == 0)
577
    dump_symtab (objfile, s, outfile);
578
  immediate_quit--;
579
  do_cleanups (cleanups);
580
}
581
 
582
/* Print symbol ARGS->SYMBOL on ARGS->OUTFILE.  ARGS->DEPTH says how
583
   far to indent.  ARGS is really a struct print_symbol_args *, but is
584
   declared as char * to get it past catch_errors.  Returns 0 for error,
585
   1 for success.  */
586
 
587
static int
588
print_symbol (void *args)
589
{
590
  struct gdbarch *gdbarch = ((struct print_symbol_args *) args)->gdbarch;
591
  struct symbol *symbol = ((struct print_symbol_args *) args)->symbol;
592
  int depth = ((struct print_symbol_args *) args)->depth;
593
  struct ui_file *outfile = ((struct print_symbol_args *) args)->outfile;
594
  struct obj_section *section = SYMBOL_OBJ_SECTION (symbol);
595
 
596
  print_spaces (depth, outfile);
597
  if (SYMBOL_DOMAIN (symbol) == LABEL_DOMAIN)
598
    {
599
      fprintf_filtered (outfile, "label %s at ", SYMBOL_PRINT_NAME (symbol));
600
      fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
601
                      outfile);
602
      if (section)
603
        fprintf_filtered (outfile, " section %s\n",
604
                          bfd_section_name (section->the_bfd_section->owner,
605
                                            section->the_bfd_section));
606
      else
607
        fprintf_filtered (outfile, "\n");
608
      return 1;
609
    }
610
  if (SYMBOL_DOMAIN (symbol) == STRUCT_DOMAIN)
611
    {
612
      if (TYPE_TAG_NAME (SYMBOL_TYPE (symbol)))
613
        {
614
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
615
        }
616
      else
617
        {
618
          fprintf_filtered (outfile, "%s %s = ",
619
                         (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_ENUM
620
                          ? "enum"
621
                     : (TYPE_CODE (SYMBOL_TYPE (symbol)) == TYPE_CODE_STRUCT
622
                        ? "struct" : "union")),
623
                            SYMBOL_LINKAGE_NAME (symbol));
624
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), "", outfile, 1, depth);
625
        }
626
      fprintf_filtered (outfile, ";\n");
627
    }
628
  else
629
    {
630
      if (SYMBOL_CLASS (symbol) == LOC_TYPEDEF)
631
        fprintf_filtered (outfile, "typedef ");
632
      if (SYMBOL_TYPE (symbol))
633
        {
634
          /* Print details of types, except for enums where it's clutter.  */
635
          LA_PRINT_TYPE (SYMBOL_TYPE (symbol), SYMBOL_PRINT_NAME (symbol),
636
                         outfile,
637
                         TYPE_CODE (SYMBOL_TYPE (symbol)) != TYPE_CODE_ENUM,
638
                         depth);
639
          fprintf_filtered (outfile, "; ");
640
        }
641
      else
642
        fprintf_filtered (outfile, "%s ", SYMBOL_PRINT_NAME (symbol));
643
 
644
      switch (SYMBOL_CLASS (symbol))
645
        {
646
        case LOC_CONST:
647
          fprintf_filtered (outfile, "const %ld (0x%lx)",
648
                            SYMBOL_VALUE (symbol),
649
                            SYMBOL_VALUE (symbol));
650
          break;
651
 
652
        case LOC_CONST_BYTES:
653
          {
654
            unsigned i;
655
            struct type *type = check_typedef (SYMBOL_TYPE (symbol));
656
            fprintf_filtered (outfile, "const %u hex bytes:",
657
                              TYPE_LENGTH (type));
658
            for (i = 0; i < TYPE_LENGTH (type); i++)
659
              fprintf_filtered (outfile, " %02x",
660
                                (unsigned) SYMBOL_VALUE_BYTES (symbol)[i]);
661
          }
662
          break;
663
 
664
        case LOC_STATIC:
665
          fprintf_filtered (outfile, "static at ");
666
          fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
667
                          outfile);
668
          if (section)
669
            fprintf_filtered (outfile, " section %s",
670
                              bfd_section_name (section->the_bfd_section->owner,
671
                                                section->the_bfd_section));
672
          break;
673
 
674
        case LOC_REGISTER:
675
          if (SYMBOL_IS_ARGUMENT (symbol))
676
            fprintf_filtered (outfile, "parameter register %ld",
677
                              SYMBOL_VALUE (symbol));
678
          else
679
            fprintf_filtered (outfile, "register %ld", SYMBOL_VALUE (symbol));
680
          break;
681
 
682
        case LOC_ARG:
683
          fprintf_filtered (outfile, "arg at offset 0x%lx",
684
                            SYMBOL_VALUE (symbol));
685
          break;
686
 
687
        case LOC_REF_ARG:
688
          fprintf_filtered (outfile, "reference arg at 0x%lx", SYMBOL_VALUE (symbol));
689
          break;
690
 
691
        case LOC_REGPARM_ADDR:
692
          fprintf_filtered (outfile, "address parameter register %ld", SYMBOL_VALUE (symbol));
693
          break;
694
 
695
        case LOC_LOCAL:
696
          fprintf_filtered (outfile, "local at offset 0x%lx",
697
                            SYMBOL_VALUE (symbol));
698
          break;
699
 
700
        case LOC_TYPEDEF:
701
          break;
702
 
703
        case LOC_LABEL:
704
          fprintf_filtered (outfile, "label at ");
705
          fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (symbol)),
706
                          outfile);
707
          if (section)
708
            fprintf_filtered (outfile, " section %s",
709
                              bfd_section_name (section->the_bfd_section->owner,
710
                                                section->the_bfd_section));
711
          break;
712
 
713
        case LOC_BLOCK:
714
          fprintf_filtered (outfile, "block object ");
715
          gdb_print_host_address (SYMBOL_BLOCK_VALUE (symbol), outfile);
716
          fprintf_filtered (outfile, ", ");
717
          fputs_filtered (paddress (gdbarch,
718
                                    BLOCK_START (SYMBOL_BLOCK_VALUE (symbol))),
719
                          outfile);
720
          fprintf_filtered (outfile, "..");
721
          fputs_filtered (paddress (gdbarch,
722
                                    BLOCK_END (SYMBOL_BLOCK_VALUE (symbol))),
723
                          outfile);
724
          if (section)
725
            fprintf_filtered (outfile, " section %s",
726
                              bfd_section_name (section->the_bfd_section->owner,
727
                                                section->the_bfd_section));
728
          break;
729
 
730
        case LOC_COMPUTED:
731
          fprintf_filtered (outfile, "computed at runtime");
732
          break;
733
 
734
        case LOC_UNRESOLVED:
735
          fprintf_filtered (outfile, "unresolved");
736
          break;
737
 
738
        case LOC_OPTIMIZED_OUT:
739
          fprintf_filtered (outfile, "optimized out");
740
          break;
741
 
742
        default:
743
          fprintf_filtered (outfile, "botched symbol class %x",
744
                            SYMBOL_CLASS (symbol));
745
          break;
746
        }
747
    }
748
  fprintf_filtered (outfile, "\n");
749
  return 1;
750
}
751
 
752
void
753
maintenance_print_psymbols (char *args, int from_tty)
754
{
755
  char **argv;
756
  struct ui_file *outfile;
757
  struct cleanup *cleanups;
758
  char *symname = NULL;
759
  char *filename = DEV_TTY;
760
  struct objfile *objfile;
761
  struct partial_symtab *ps;
762
 
763
  dont_repeat ();
764
 
765
  if (args == NULL)
766
    {
767
      error (_("print-psymbols takes an output file name and optional symbol file name"));
768
    }
769
  argv = gdb_buildargv (args);
770
  cleanups = make_cleanup_freeargv (argv);
771
 
772
  if (argv[0] != NULL)
773
    {
774
      filename = argv[0];
775
      /* If a second arg is supplied, it is a source file name to match on */
776
      if (argv[1] != NULL)
777
        {
778
          symname = argv[1];
779
        }
780
    }
781
 
782
  filename = tilde_expand (filename);
783
  make_cleanup (xfree, filename);
784
 
785
  outfile = gdb_fopen (filename, FOPEN_WT);
786
  if (outfile == 0)
787
    perror_with_name (filename);
788
  make_cleanup_ui_file_delete (outfile);
789
 
790
  immediate_quit++;
791
  ALL_PSYMTABS (objfile, ps)
792
    if (symname == NULL || strcmp (symname, ps->filename) == 0)
793
    dump_psymtab (objfile, ps, outfile);
794
  immediate_quit--;
795
  do_cleanups (cleanups);
796
}
797
 
798
static void
799
print_partial_symbols (struct gdbarch *gdbarch,
800
                       struct partial_symbol **p, int count, char *what,
801
                       struct ui_file *outfile)
802
{
803
  fprintf_filtered (outfile, "  %s partial symbols:\n", what);
804
  while (count-- > 0)
805
    {
806
      fprintf_filtered (outfile, "    `%s'", SYMBOL_LINKAGE_NAME (*p));
807
      if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
808
        {
809
          fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
810
        }
811
      fputs_filtered (", ", outfile);
812
      switch (SYMBOL_DOMAIN (*p))
813
        {
814
        case UNDEF_DOMAIN:
815
          fputs_filtered ("undefined domain, ", outfile);
816
          break;
817
        case VAR_DOMAIN:
818
          /* This is the usual thing -- don't print it */
819
          break;
820
        case STRUCT_DOMAIN:
821
          fputs_filtered ("struct domain, ", outfile);
822
          break;
823
        case LABEL_DOMAIN:
824
          fputs_filtered ("label domain, ", outfile);
825
          break;
826
        default:
827
          fputs_filtered ("<invalid domain>, ", outfile);
828
          break;
829
        }
830
      switch (SYMBOL_CLASS (*p))
831
        {
832
        case LOC_UNDEF:
833
          fputs_filtered ("undefined", outfile);
834
          break;
835
        case LOC_CONST:
836
          fputs_filtered ("constant int", outfile);
837
          break;
838
        case LOC_STATIC:
839
          fputs_filtered ("static", outfile);
840
          break;
841
        case LOC_REGISTER:
842
          fputs_filtered ("register", outfile);
843
          break;
844
        case LOC_ARG:
845
          fputs_filtered ("pass by value", outfile);
846
          break;
847
        case LOC_REF_ARG:
848
          fputs_filtered ("pass by reference", outfile);
849
          break;
850
        case LOC_REGPARM_ADDR:
851
          fputs_filtered ("register address parameter", outfile);
852
          break;
853
        case LOC_LOCAL:
854
          fputs_filtered ("stack parameter", outfile);
855
          break;
856
        case LOC_TYPEDEF:
857
          fputs_filtered ("type", outfile);
858
          break;
859
        case LOC_LABEL:
860
          fputs_filtered ("label", outfile);
861
          break;
862
        case LOC_BLOCK:
863
          fputs_filtered ("function", outfile);
864
          break;
865
        case LOC_CONST_BYTES:
866
          fputs_filtered ("constant bytes", outfile);
867
          break;
868
        case LOC_UNRESOLVED:
869
          fputs_filtered ("unresolved", outfile);
870
          break;
871
        case LOC_OPTIMIZED_OUT:
872
          fputs_filtered ("optimized out", outfile);
873
          break;
874
        case LOC_COMPUTED:
875
          fputs_filtered ("computed at runtime", outfile);
876
          break;
877
        default:
878
          fputs_filtered ("<invalid location>", outfile);
879
          break;
880
        }
881
      fputs_filtered (", ", outfile);
882
      fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
883
      fprintf_filtered (outfile, "\n");
884
      p++;
885
    }
886
}
887
 
888
void
889
maintenance_print_msymbols (char *args, int from_tty)
890
{
891
  char **argv;
892
  struct ui_file *outfile;
893
  struct cleanup *cleanups;
894
  char *filename = DEV_TTY;
895
  char *symname = NULL;
896
  struct program_space *pspace;
897
  struct objfile *objfile;
898
 
899
  struct stat sym_st, obj_st;
900
 
901
  dont_repeat ();
902
 
903
  if (args == NULL)
904
    {
905
      error (_("print-msymbols takes an output file name and optional symbol file name"));
906
    }
907
  argv = gdb_buildargv (args);
908
  cleanups = make_cleanup_freeargv (argv);
909
 
910
  if (argv[0] != NULL)
911
    {
912
      filename = argv[0];
913
      /* If a second arg is supplied, it is a source file name to match on */
914
      if (argv[1] != NULL)
915
        {
916
          symname = xfullpath (argv[1]);
917
          make_cleanup (xfree, symname);
918
          if (symname && stat (symname, &sym_st))
919
            perror_with_name (symname);
920
        }
921
    }
922
 
923
  filename = tilde_expand (filename);
924
  make_cleanup (xfree, filename);
925
 
926
  outfile = gdb_fopen (filename, FOPEN_WT);
927
  if (outfile == 0)
928
    perror_with_name (filename);
929
  make_cleanup_ui_file_delete (outfile);
930
 
931
  immediate_quit++;
932
  ALL_PSPACES (pspace)
933
    ALL_PSPACE_OBJFILES (pspace, objfile)
934
      if (symname == NULL
935
          || (!stat (objfile->name, &obj_st) && sym_st.st_ino == obj_st.st_ino))
936
        dump_msymbols (objfile, outfile);
937
  immediate_quit--;
938
  fprintf_filtered (outfile, "\n\n");
939
  do_cleanups (cleanups);
940
}
941
 
942
void
943
maintenance_print_objfiles (char *ignore, int from_tty)
944
{
945
  struct program_space *pspace;
946
  struct objfile *objfile;
947
 
948
  dont_repeat ();
949
 
950
  immediate_quit++;
951
  ALL_PSPACES (pspace)
952
    ALL_PSPACE_OBJFILES (pspace, objfile)
953
      dump_objfile (objfile);
954
  immediate_quit--;
955
}
956
 
957
 
958
/* List all the symbol tables whose names match REGEXP (optional).  */
959
void
960
maintenance_info_symtabs (char *regexp, int from_tty)
961
{
962
  struct program_space *pspace;
963
  struct objfile *objfile;
964
 
965
  if (regexp)
966
    re_comp (regexp);
967
 
968
  ALL_PSPACES (pspace)
969
    ALL_PSPACE_OBJFILES (pspace, objfile)
970
    {
971
      struct symtab *symtab;
972
 
973
      /* We don't want to print anything for this objfile until we
974
         actually find a symtab whose name matches.  */
975
      int printed_objfile_start = 0;
976
 
977
      ALL_OBJFILE_SYMTABS (objfile, symtab)
978
        {
979
          QUIT;
980
 
981
          if (! regexp
982
              || re_exec (symtab->filename))
983
            {
984
              if (! printed_objfile_start)
985
                {
986
                  printf_filtered ("{ objfile %s ", objfile->name);
987
                  wrap_here ("  ");
988
                  printf_filtered ("((struct objfile *) %s)\n",
989
                                   host_address_to_string (objfile));
990
                  printed_objfile_start = 1;
991
                }
992
 
993
              printf_filtered ("        { symtab %s ", symtab->filename);
994
              wrap_here ("    ");
995
              printf_filtered ("((struct symtab *) %s)\n",
996
                               host_address_to_string (symtab));
997
              printf_filtered ("          dirname %s\n",
998
                               symtab->dirname ? symtab->dirname : "(null)");
999
              printf_filtered ("          fullname %s\n",
1000
                               symtab->fullname ? symtab->fullname : "(null)");
1001
              printf_filtered ("          blockvector ((struct blockvector *) %s)%s\n",
1002
                               host_address_to_string (symtab->blockvector),
1003
                               symtab->primary ? " (primary)" : "");
1004
              printf_filtered ("          linetable ((struct linetable *) %s)\n",
1005
                               host_address_to_string (symtab->linetable));
1006
              printf_filtered ("          debugformat %s\n", symtab->debugformat);
1007
              printf_filtered ("        }\n");
1008
            }
1009
        }
1010
 
1011
      if (printed_objfile_start)
1012
        printf_filtered ("}\n");
1013
    }
1014
}
1015
 
1016
 
1017
/* List all the partial symbol tables whose names match REGEXP (optional).  */
1018
void
1019
maintenance_info_psymtabs (char *regexp, int from_tty)
1020
{
1021
  struct program_space *pspace;
1022
  struct objfile *objfile;
1023
 
1024
  if (regexp)
1025
    re_comp (regexp);
1026
 
1027
  ALL_PSPACES (pspace)
1028
    ALL_PSPACE_OBJFILES (pspace, objfile)
1029
    {
1030
      struct gdbarch *gdbarch = get_objfile_arch (objfile);
1031
      struct partial_symtab *psymtab;
1032
 
1033
      /* We don't want to print anything for this objfile until we
1034
         actually find a symtab whose name matches.  */
1035
      int printed_objfile_start = 0;
1036
 
1037
      ALL_OBJFILE_PSYMTABS (objfile, psymtab)
1038
        {
1039
          QUIT;
1040
 
1041
          if (! regexp
1042
              || re_exec (psymtab->filename))
1043
            {
1044
              if (! printed_objfile_start)
1045
                {
1046
                  printf_filtered ("{ objfile %s ", objfile->name);
1047
                  wrap_here ("  ");
1048
                  printf_filtered ("((struct objfile *) %s)\n",
1049
                                   host_address_to_string (objfile));
1050
                  printed_objfile_start = 1;
1051
                }
1052
 
1053
              printf_filtered ("  { psymtab %s ", psymtab->filename);
1054
              wrap_here ("    ");
1055
              printf_filtered ("((struct partial_symtab *) %s)\n",
1056
                               host_address_to_string (psymtab));
1057
 
1058
              printf_filtered ("    readin %s\n",
1059
                               psymtab->readin ? "yes" : "no");
1060
              printf_filtered ("    fullname %s\n",
1061
                               psymtab->fullname ? psymtab->fullname : "(null)");
1062
              printf_filtered ("    text addresses ");
1063
              fputs_filtered (paddress (gdbarch, psymtab->textlow),
1064
                              gdb_stdout);
1065
              printf_filtered (" -- ");
1066
              fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1067
                              gdb_stdout);
1068
              printf_filtered ("\n");
1069
              printf_filtered ("    globals ");
1070
              if (psymtab->n_global_syms)
1071
                {
1072
                  printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1073
                                   host_address_to_string (psymtab->objfile->global_psymbols.list
1074
                                    + psymtab->globals_offset),
1075
                                   psymtab->n_global_syms);
1076
                }
1077
              else
1078
                printf_filtered ("(none)\n");
1079
              printf_filtered ("    statics ");
1080
              if (psymtab->n_static_syms)
1081
                {
1082
                  printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1083
                                   host_address_to_string (psymtab->objfile->static_psymbols.list
1084
                                    + psymtab->statics_offset),
1085
                                   psymtab->n_static_syms);
1086
                }
1087
              else
1088
                printf_filtered ("(none)\n");
1089
              printf_filtered ("    dependencies ");
1090
              if (psymtab->number_of_dependencies)
1091
                {
1092
                  int i;
1093
 
1094
                  printf_filtered ("{\n");
1095
                  for (i = 0; i < psymtab->number_of_dependencies; i++)
1096
                    {
1097
                      struct partial_symtab *dep = psymtab->dependencies[i];
1098
 
1099
                      /* Note the string concatenation there --- no comma.  */
1100
                      printf_filtered ("      psymtab %s "
1101
                                       "((struct partial_symtab *) %s)\n",
1102
                                       dep->filename,
1103
                                       host_address_to_string (dep));
1104
                    }
1105
                  printf_filtered ("    }\n");
1106
                }
1107
              else
1108
                printf_filtered ("(none)\n");
1109
              printf_filtered ("  }\n");
1110
            }
1111
        }
1112
 
1113
      if (printed_objfile_start)
1114
        printf_filtered ("}\n");
1115
    }
1116
}
1117
 
1118
 
1119
/* Check consistency of psymtabs and symtabs.  */
1120
 
1121
void
1122
maintenance_check_symtabs (char *ignore, int from_tty)
1123
{
1124
  struct symbol *sym;
1125
  struct partial_symbol **psym;
1126
  struct symtab *s = NULL;
1127
  struct partial_symtab *ps;
1128
  struct blockvector *bv;
1129
  struct objfile *objfile;
1130
  struct block *b;
1131
  int length;
1132
 
1133
  ALL_PSYMTABS (objfile, ps)
1134
  {
1135
    struct gdbarch *gdbarch = get_objfile_arch (objfile);
1136
    s = PSYMTAB_TO_SYMTAB (ps);
1137
    if (s == NULL)
1138
      continue;
1139
    bv = BLOCKVECTOR (s);
1140
    b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1141
    psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1142
    length = ps->n_static_syms;
1143
    while (length--)
1144
      {
1145
        sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1146
                                   NULL, SYMBOL_DOMAIN (*psym));
1147
        if (!sym)
1148
          {
1149
            printf_filtered ("Static symbol `");
1150
            puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1151
            printf_filtered ("' only found in ");
1152
            puts_filtered (ps->filename);
1153
            printf_filtered (" psymtab\n");
1154
          }
1155
        psym++;
1156
      }
1157
    b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1158
    psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1159
    length = ps->n_global_syms;
1160
    while (length--)
1161
      {
1162
        sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1163
                                   NULL, SYMBOL_DOMAIN (*psym));
1164
        if (!sym)
1165
          {
1166
            printf_filtered ("Global symbol `");
1167
            puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1168
            printf_filtered ("' only found in ");
1169
            puts_filtered (ps->filename);
1170
            printf_filtered (" psymtab\n");
1171
          }
1172
        psym++;
1173
      }
1174
    if (ps->texthigh < ps->textlow)
1175
      {
1176
        printf_filtered ("Psymtab ");
1177
        puts_filtered (ps->filename);
1178
        printf_filtered (" covers bad range ");
1179
        fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1180
        printf_filtered (" - ");
1181
        fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1182
        printf_filtered ("\n");
1183
        continue;
1184
      }
1185
    if (ps->texthigh == 0)
1186
      continue;
1187
    if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1188
      {
1189
        printf_filtered ("Psymtab ");
1190
        puts_filtered (ps->filename);
1191
        printf_filtered (" covers ");
1192
        fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1193
        printf_filtered (" - ");
1194
        fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1195
        printf_filtered (" but symtab covers only ");
1196
        fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1197
        printf_filtered (" - ");
1198
        fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1199
        printf_filtered ("\n");
1200
      }
1201
  }
1202
}
1203
 
1204
 
1205
/* Return the nexting depth of a block within other blocks in its symtab.  */
1206
 
1207
static int
1208
block_depth (struct block *block)
1209
{
1210
  int i = 0;
1211
  while ((block = BLOCK_SUPERBLOCK (block)) != NULL)
1212
    {
1213
      i++;
1214
    }
1215
  return i;
1216
}
1217
 
1218
 
1219
/* Increase the space allocated for LISTP, which is probably
1220
   global_psymbols or static_psymbols. This space will eventually
1221
   be freed in free_objfile().  */
1222
 
1223
void
1224
extend_psymbol_list (struct psymbol_allocation_list *listp,
1225
                     struct objfile *objfile)
1226
{
1227
  int new_size;
1228
  if (listp->size == 0)
1229
    {
1230
      new_size = 255;
1231
      listp->list = (struct partial_symbol **)
1232
        xmalloc (new_size * sizeof (struct partial_symbol *));
1233
    }
1234
  else
1235
    {
1236
      new_size = listp->size * 2;
1237
      listp->list = (struct partial_symbol **)
1238
        xrealloc ((char *) listp->list,
1239
                  new_size * sizeof (struct partial_symbol *));
1240
    }
1241
  /* Next assumes we only went one over.  Should be good if
1242
     program works correctly */
1243
  listp->next = listp->list + listp->size;
1244
  listp->size = new_size;
1245
}
1246
 
1247
 
1248
/* Do early runtime initializations. */
1249
void
1250
_initialize_symmisc (void)
1251
{
1252
  std_in = stdin;
1253
  std_out = stdout;
1254
  std_err = stderr;
1255
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.