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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [dbxread.c] - Blame information for rev 1782

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

Line No. Rev Author Line
1 578 markom
/* Read dbx symbol tables and convert to internal format, for GDB.
2
   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3
   1996, 1997, 1998, 1999, 2000, 2001
4
   Free Software Foundation, Inc.
5
 
6
   This file is part of GDB.
7
 
8
   This program is free software; you can redistribute it and/or modify
9
   it under the terms of the GNU General Public License as published by
10
   the Free Software Foundation; either version 2 of the License, or
11
   (at your option) any later version.
12
 
13
   This program is distributed in the hope that it will be useful,
14
   but WITHOUT ANY WARRANTY; without even the implied warranty of
15
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
   GNU General Public License for more details.
17
 
18
   You should have received a copy of the GNU General Public License
19
   along with this program; if not, write to the Free Software
20
   Foundation, Inc., 59 Temple Place - Suite 330,
21
   Boston, MA 02111-1307, USA.  */
22
 
23
/* This module provides three functions: dbx_symfile_init,
24
   which initializes to read a symbol file; dbx_new_init, which
25
   discards existing cached information when all symbols are being
26
   discarded; and dbx_symfile_read, which reads a symbol table
27
   from a file.
28
 
29
   dbx_symfile_read only does the minimum work necessary for letting the
30
   user "name" things symbolically; it does not read the entire symtab.
31
   Instead, it reads the external and static symbols and puts them in partial
32
   symbol tables.  When more extensive information is requested of a
33
   file, the corresponding partial symbol table is mutated into a full
34
   fledged symbol table by going back and reading the symbols
35
   for real.  dbx_psymtab_to_symtab() is the function that does this */
36
 
37
#include "defs.h"
38
#include "gdb_string.h"
39
 
40
#if defined(USG) || defined(__CYGNUSCLIB__)
41
#include <sys/types.h>
42
#include <fcntl.h>
43
#endif
44
 
45
#include "obstack.h"
46
#include "gdb_stat.h"
47
#include "symtab.h"
48
#include "breakpoint.h"
49
#include "target.h"
50
#include "gdbcore.h"            /* for bfd stuff */
51
#include "libaout.h"            /* FIXME Secret internal BFD stuff for a.out */
52
#include "symfile.h"
53
#include "objfiles.h"
54
#include "buildsym.h"
55
#include "stabsread.h"
56
#include "gdb-stabs.h"
57
#include "demangle.h"
58
#include "language.h"           /* Needed inside partial-stab.h */
59
#include "complaints.h"
60
#include "cp-abi.h"
61
 
62
#include "aout/aout64.h"
63
#include "aout/stab_gnu.h"      /* We always use GNU stabs, not native, now */
64
 
65
 
66
/* This macro returns the size field of a minimal symbol, which is normally
67
   stored in the "info" field.  The macro can be overridden for specific
68
   targets (e.g. MIPS16) that use the info field for other purposes.  */
69
#ifndef MSYMBOL_SIZE
70
#define MSYMBOL_SIZE(msym) ((long) MSYMBOL_INFO (msym))
71
#endif
72
 
73
 
74
/* We put a pointer to this structure in the read_symtab_private field
75
   of the psymtab.  */
76
 
77
struct symloc
78
  {
79
 
80
    /* Offset within the file symbol table of first local symbol for this
81
       file.  */
82
 
83
    int ldsymoff;
84
 
85
    /* Length (in bytes) of the section of the symbol table devoted to
86
       this file's symbols (actually, the section bracketed may contain
87
       more than just this file's symbols).  If ldsymlen is 0, the only
88
       reason for this thing's existence is the dependency list.  Nothing
89
       else will happen when it is read in.  */
90
 
91
    int ldsymlen;
92
 
93
    /* The size of each symbol in the symbol file (in external form).  */
94
 
95
    int symbol_size;
96
 
97
    /* Further information needed to locate the symbols if they are in
98
       an ELF file.  */
99
 
100
    int symbol_offset;
101
    int string_offset;
102
    int file_string_offset;
103
  };
104
 
105
#define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
106
#define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
107
#define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
108
#define SYMBOL_SIZE(p) (SYMLOC(p)->symbol_size)
109
#define SYMBOL_OFFSET(p) (SYMLOC(p)->symbol_offset)
110
#define STRING_OFFSET(p) (SYMLOC(p)->string_offset)
111
#define FILE_STRING_OFFSET(p) (SYMLOC(p)->file_string_offset)
112
 
113
 
114
/* Remember what we deduced to be the source language of this psymtab. */
115
 
116
static enum language psymtab_language = language_unknown;
117
 
118
/* Nonzero means give verbose info on gdb action.  From main.c.  */
119
 
120
extern int info_verbose;
121
 
122
/* The BFD for this file -- implicit parameter to next_symbol_text.  */
123
 
124
static bfd *symfile_bfd;
125
 
126
/* The size of each symbol in the symbol file (in external form).
127
   This is set by dbx_symfile_read when building psymtabs, and by
128
   dbx_psymtab_to_symtab when building symtabs.  */
129
 
130
static unsigned symbol_size;
131
 
132
/* This is the offset of the symbol table in the executable file. */
133
 
134
static unsigned symbol_table_offset;
135
 
136
/* This is the offset of the string table in the executable file. */
137
 
138
static unsigned string_table_offset;
139
 
140
/* For elf+stab executables, the n_strx field is not a simple index
141
   into the string table.  Instead, each .o file has a base offset in
142
   the string table, and the associated symbols contain offsets from
143
   this base.  The following two variables contain the base offset for
144
   the current and next .o files. */
145
 
146
static unsigned int file_string_table_offset;
147
static unsigned int next_file_string_table_offset;
148
 
149
/* .o and NLM files contain unrelocated addresses which are based at
150
   0.  When non-zero, this flag disables some of the special cases for
151
   Solaris elf+stab text addresses at location 0. */
152
 
153
static int symfile_relocatable = 0;
154
 
155
/* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are
156
   relative to the function start address.  */
157
 
158
static int block_address_function_relative = 0;
159
 
160
/* The lowest text address we have yet encountered.  This is needed
161
   because in an a.out file, there is no header field which tells us
162
   what address the program is actually going to be loaded at, so we
163
   need to make guesses based on the symbols (which *are* relocated to
164
   reflect the address it will be loaded at).  */
165
 
166
static CORE_ADDR lowest_text_address;
167
 
168
/* Non-zero if there is any line number info in the objfile.  Prevents
169
   end_psymtab from discarding an otherwise empty psymtab.  */
170
 
171
static int has_line_numbers;
172
 
173
/* Complaints about the symbols we have encountered.  */
174
 
175
struct complaint lbrac_complaint =
176
{"bad block start address patched", 0, 0};
177
 
178
struct complaint string_table_offset_complaint =
179
{"bad string table offset in symbol %d", 0, 0};
180
 
181
struct complaint unknown_symtype_complaint =
182
{"unknown symbol type %s", 0, 0};
183
 
184
struct complaint unknown_symchar_complaint =
185
{"unknown symbol descriptor `%c'", 0, 0};
186
 
187
struct complaint lbrac_rbrac_complaint =
188
{"block start larger than block end", 0, 0};
189
 
190
struct complaint lbrac_unmatched_complaint =
191
{"unmatched N_LBRAC before symtab pos %d", 0, 0};
192
 
193
struct complaint lbrac_mismatch_complaint =
194
{"N_LBRAC/N_RBRAC symbol mismatch at symtab pos %d", 0, 0};
195
 
196
struct complaint repeated_header_complaint =
197
{"\"repeated\" header file %s not previously seen, at symtab pos %d", 0, 0};
198
 
199
struct complaint unclaimed_bincl_complaint =
200
{"N_BINCL %s not in entries for any file, at symtab pos %d", 0, 0};
201
 
202
/* find_text_range --- find start and end of loadable code sections
203
 
204
   The find_text_range function finds the shortest address range that
205
   encloses all sections containing executable code, and stores it in
206
   objfile's text_addr and text_size members.
207
 
208
   dbx_symfile_read will use this to finish off the partial symbol
209
   table, in some cases.  */
210
 
211
static void
212
find_text_range (bfd * sym_bfd, struct objfile *objfile)
213
{
214
  asection *sec;
215
  int found_any = 0;
216
  CORE_ADDR start = 0;
217
  CORE_ADDR end = 0;
218
 
219
  for (sec = sym_bfd->sections; sec; sec = sec->next)
220
    if (bfd_get_section_flags (sym_bfd, sec) & SEC_CODE)
221
      {
222
        CORE_ADDR sec_start = bfd_section_vma (sym_bfd, sec);
223
        CORE_ADDR sec_end = sec_start + bfd_section_size (sym_bfd, sec);
224
 
225
        if (found_any)
226
          {
227
            if (sec_start < start)
228
              start = sec_start;
229
            if (sec_end > end)
230
              end = sec_end;
231
          }
232
        else
233
          {
234
            start = sec_start;
235
            end = sec_end;
236
          }
237
 
238
        found_any = 1;
239
      }
240
 
241
  if (!found_any)
242
    error ("Can't find any code sections in symbol file");
243
 
244
  DBX_TEXT_ADDR (objfile) = start;
245
  DBX_TEXT_SIZE (objfile) = end - start;
246
}
247
 
248
 
249
 
250
/* During initial symbol readin, we need to have a structure to keep
251
   track of which psymtabs have which bincls in them.  This structure
252
   is used during readin to setup the list of dependencies within each
253
   partial symbol table. */
254
 
255
struct header_file_location
256
{
257
  char *name;                   /* Name of header file */
258
  int instance;                 /* See above */
259
  struct partial_symtab *pst;   /* Partial symtab that has the
260
                                   BINCL/EINCL defs for this file */
261
};
262
 
263
/* The actual list and controling variables */
264
static struct header_file_location *bincl_list, *next_bincl;
265
static int bincls_allocated;
266
 
267
/* Local function prototypes */
268
 
269
extern void _initialize_dbxread (void);
270
 
271
static void process_now (struct objfile *);
272
 
273
static void free_header_files (void);
274
 
275
static void init_header_files (void);
276
 
277
static void read_ofile_symtab (struct partial_symtab *);
278
 
279
static void dbx_psymtab_to_symtab (struct partial_symtab *);
280
 
281
static void dbx_psymtab_to_symtab_1 (struct partial_symtab *);
282
 
283
static void read_dbx_dynamic_symtab (struct objfile *objfile);
284
 
285
static void read_dbx_symtab (struct objfile *);
286
 
287
static void free_bincl_list (struct objfile *);
288
 
289
static struct partial_symtab *find_corresponding_bincl_psymtab (char *, int);
290
 
291
static void add_bincl_to_list (struct partial_symtab *, char *, int);
292
 
293
static void init_bincl_list (int, struct objfile *);
294
 
295
static char *dbx_next_symbol_text (struct objfile *);
296
 
297
static void fill_symbuf (bfd *);
298
 
299
static void dbx_symfile_init (struct objfile *);
300
 
301
static void dbx_new_init (struct objfile *);
302
 
303
static void dbx_symfile_read (struct objfile *, int);
304
 
305
static void dbx_symfile_finish (struct objfile *);
306
 
307
static void record_minimal_symbol (char *, CORE_ADDR, int, struct objfile *);
308
 
309
static void add_new_header_file (char *, int);
310
 
311
static void add_old_header_file (char *, int);
312
 
313
static void add_this_object_header_file (int);
314
 
315
static struct partial_symtab *start_psymtab (struct objfile *, char *,
316
                                             CORE_ADDR, int,
317
                                             struct partial_symbol **,
318
                                             struct partial_symbol **);
319
 
320
/* Free up old header file tables */
321
 
322
static void
323
free_header_files (void)
324
{
325
  if (this_object_header_files)
326
    {
327
      xfree (this_object_header_files);
328
      this_object_header_files = NULL;
329
    }
330
  n_allocated_this_object_header_files = 0;
331
}
332
 
333
/* Allocate new header file tables */
334
 
335
static void
336
init_header_files (void)
337
{
338
  n_allocated_this_object_header_files = 10;
339
  this_object_header_files = (int *) xmalloc (10 * sizeof (int));
340
}
341
 
342
/* Add header file number I for this object file
343
   at the next successive FILENUM.  */
344
 
345
static void
346
add_this_object_header_file (int i)
347
{
348
  if (n_this_object_header_files == n_allocated_this_object_header_files)
349
    {
350
      n_allocated_this_object_header_files *= 2;
351
      this_object_header_files
352
        = (int *) xrealloc ((char *) this_object_header_files,
353
                       n_allocated_this_object_header_files * sizeof (int));
354
    }
355
 
356
  this_object_header_files[n_this_object_header_files++] = i;
357
}
358
 
359
/* Add to this file an "old" header file, one already seen in
360
   a previous object file.  NAME is the header file's name.
361
   INSTANCE is its instance code, to select among multiple
362
   symbol tables for the same header file.  */
363
 
364
static void
365
add_old_header_file (char *name, int instance)
366
{
367
  register struct header_file *p = HEADER_FILES (current_objfile);
368
  register int i;
369
 
370
  for (i = 0; i < N_HEADER_FILES (current_objfile); i++)
371
    if (STREQ (p[i].name, name) && instance == p[i].instance)
372
      {
373
        add_this_object_header_file (i);
374
        return;
375
      }
376
  complain (&repeated_header_complaint, name, symnum);
377
}
378
 
379
/* Add to this file a "new" header file: definitions for its types follow.
380
   NAME is the header file's name.
381
   Most often this happens only once for each distinct header file,
382
   but not necessarily.  If it happens more than once, INSTANCE has
383
   a different value each time, and references to the header file
384
   use INSTANCE values to select among them.
385
 
386
   dbx output contains "begin" and "end" markers for each new header file,
387
   but at this level we just need to know which files there have been;
388
   so we record the file when its "begin" is seen and ignore the "end".  */
389
 
390
static void
391
add_new_header_file (char *name, int instance)
392
{
393
  register int i;
394
  register struct header_file *hfile;
395
 
396
  /* Make sure there is room for one more header file.  */
397
 
398
  i = N_ALLOCATED_HEADER_FILES (current_objfile);
399
 
400
  if (N_HEADER_FILES (current_objfile) == i)
401
    {
402
      if (i == 0)
403
        {
404
          N_ALLOCATED_HEADER_FILES (current_objfile) = 10;
405
          HEADER_FILES (current_objfile) = (struct header_file *)
406
            xmalloc (10 * sizeof (struct header_file));
407
        }
408
      else
409
        {
410
          i *= 2;
411
          N_ALLOCATED_HEADER_FILES (current_objfile) = i;
412
          HEADER_FILES (current_objfile) = (struct header_file *)
413
            xrealloc ((char *) HEADER_FILES (current_objfile),
414
                      (i * sizeof (struct header_file)));
415
        }
416
    }
417
 
418
  /* Create an entry for this header file.  */
419
 
420
  i = N_HEADER_FILES (current_objfile)++;
421
  hfile = HEADER_FILES (current_objfile) + i;
422
  hfile->name = savestring (name, strlen (name));
423
  hfile->instance = instance;
424
  hfile->length = 10;
425
  hfile->vector
426
    = (struct type **) xmalloc (10 * sizeof (struct type *));
427
  memset (hfile->vector, 0, 10 * sizeof (struct type *));
428
 
429
  add_this_object_header_file (i);
430
}
431
 
432
#if 0
433
static struct type **
434
explicit_lookup_type (int real_filenum, int index)
435
{
436
  register struct header_file *f = &HEADER_FILES (current_objfile)[real_filenum];
437
 
438
  if (index >= f->length)
439
    {
440
      f->length *= 2;
441
      f->vector = (struct type **)
442
        xrealloc (f->vector, f->length * sizeof (struct type *));
443
      memset (&f->vector[f->length / 2],
444
              '\0', f->length * sizeof (struct type *) / 2);
445
    }
446
  return &f->vector[index];
447
}
448
#endif
449
 
450
static void
451
record_minimal_symbol (char *name, CORE_ADDR address, int type,
452
                       struct objfile *objfile)
453
{
454
  enum minimal_symbol_type ms_type;
455
  int section;
456
  asection *bfd_section;
457
 
458
  switch (type)
459
    {
460
    case N_TEXT | N_EXT:
461
      ms_type = mst_text;
462
      section = SECT_OFF_TEXT (objfile);
463
      bfd_section = DBX_TEXT_SECTION (objfile);
464
      break;
465
    case N_DATA | N_EXT:
466
      ms_type = mst_data;
467
      section = SECT_OFF_DATA (objfile);
468
      bfd_section = DBX_DATA_SECTION (objfile);
469
      break;
470
    case N_BSS | N_EXT:
471
      ms_type = mst_bss;
472
      section = SECT_OFF_BSS (objfile);
473
      bfd_section = DBX_BSS_SECTION (objfile);
474
      break;
475
    case N_ABS | N_EXT:
476
      ms_type = mst_abs;
477
      section = -1;
478
      bfd_section = NULL;
479
      break;
480
#ifdef N_SETV
481
    case N_SETV | N_EXT:
482
      ms_type = mst_data;
483
      section = SECT_OFF_DATA (objfile);
484
      bfd_section = DBX_DATA_SECTION (objfile);
485
      break;
486
    case N_SETV:
487
      /* I don't think this type actually exists; since a N_SETV is the result
488
         of going over many .o files, it doesn't make sense to have one
489
         file local.  */
490
      ms_type = mst_file_data;
491
      section = SECT_OFF_DATA (objfile);
492
      bfd_section = DBX_DATA_SECTION (objfile);
493
      break;
494
#endif
495
    case N_TEXT:
496
    case N_NBTEXT:
497
    case N_FN:
498
    case N_FN_SEQ:
499
      ms_type = mst_file_text;
500
      section = SECT_OFF_TEXT (objfile);
501
      bfd_section = DBX_TEXT_SECTION (objfile);
502
      break;
503
    case N_DATA:
504
      ms_type = mst_file_data;
505
 
506
      /* Check for __DYNAMIC, which is used by Sun shared libraries.
507
         Record it as global even if it's local, not global, so
508
         lookup_minimal_symbol can find it.  We don't check symbol_leading_char
509
         because for SunOS4 it always is '_'.  */
510
      if (name[8] == 'C' && STREQ ("__DYNAMIC", name))
511
        ms_type = mst_data;
512
 
513
      /* Same with virtual function tables, both global and static.  */
514
      {
515
        char *tempstring = name;
516
        if (tempstring[0] == bfd_get_symbol_leading_char (objfile->obfd))
517
          ++tempstring;
518
        if (is_vtable_name (tempstring))
519
          ms_type = mst_data;
520
      }
521
      section = SECT_OFF_DATA (objfile);
522
      bfd_section = DBX_DATA_SECTION (objfile);
523
      break;
524
    case N_BSS:
525
      ms_type = mst_file_bss;
526
      section = SECT_OFF_BSS (objfile);
527
      bfd_section = DBX_BSS_SECTION (objfile);
528
      break;
529
    default:
530
      ms_type = mst_unknown;
531
      section = -1;
532
      bfd_section = NULL;
533
      break;
534
    }
535
 
536
  if ((ms_type == mst_file_text || ms_type == mst_text)
537
      && address < lowest_text_address)
538
    lowest_text_address = address;
539
 
540
  prim_record_minimal_symbol_and_info
541
    (name, address, ms_type, NULL, section, bfd_section, objfile);
542
}
543
 
544
/* Scan and build partial symbols for a symbol file.
545
   We have been initialized by a call to dbx_symfile_init, which
546
   put all the relevant info into a "struct dbx_symfile_info",
547
   hung off the objfile structure.
548
 
549
   MAINLINE is true if we are reading the main symbol
550
   table (as opposed to a shared lib or dynamically loaded file).  */
551
 
552
static void
553
dbx_symfile_read (struct objfile *objfile, int mainline)
554
{
555
  bfd *sym_bfd;
556
  int val;
557
  struct cleanup *back_to;
558
 
559
  sym_bfd = objfile->obfd;
560
 
561
  /* .o and .nlm files are relocatables with text, data and bss segs based at
562
     0.  This flag disables special (Solaris stabs-in-elf only) fixups for
563
     symbols with a value of 0.  */
564
 
565
  symfile_relocatable = bfd_get_file_flags (sym_bfd) & HAS_RELOC;
566
 
567
  /* This is true for Solaris (and all other systems which put stabs
568
     in sections, hopefully, since it would be silly to do things
569
     differently from Solaris), and false for SunOS4 and other a.out
570
     file formats.  */
571
  block_address_function_relative =
572
    ((0 == strncmp (bfd_get_target (sym_bfd), "elf", 3))
573
     || (0 == strncmp (bfd_get_target (sym_bfd), "som", 3))
574
     || (0 == strncmp (bfd_get_target (sym_bfd), "coff", 4))
575
     || (0 == strncmp (bfd_get_target (sym_bfd), "pe", 2))
576
     || (0 == strncmp (bfd_get_target (sym_bfd), "epoc-pe", 7))
577
     || (0 == strncmp (bfd_get_target (sym_bfd), "nlm", 3)));
578
 
579
  val = bfd_seek (sym_bfd, DBX_SYMTAB_OFFSET (objfile), SEEK_SET);
580
  if (val < 0)
581
    perror_with_name (objfile->name);
582
 
583
  /* If we are reinitializing, or if we have never loaded syms yet, init */
584
  if (mainline
585
      || objfile->global_psymbols.size == 0
586
      || objfile->static_psymbols.size == 0)
587
    init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
588
 
589
  symbol_size = DBX_SYMBOL_SIZE (objfile);
590
  symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
591
 
592
  free_pending_blocks ();
593
  back_to = make_cleanup (really_free_pendings, 0);
594
 
595
  init_minimal_symbol_collection ();
596
  make_cleanup_discard_minimal_symbols ();
597
 
598
  /* Read stabs data from executable file and define symbols. */
599
 
600
  read_dbx_symtab (objfile);
601
 
602
  /* Add the dynamic symbols.  */
603
 
604
  read_dbx_dynamic_symtab (objfile);
605
 
606
  /* Install any minimal symbols that have been collected as the current
607
     minimal symbols for this objfile. */
608
 
609
  install_minimal_symbols (objfile);
610
 
611
  do_cleanups (back_to);
612
}
613
 
614
/* Initialize anything that needs initializing when a completely new
615
   symbol file is specified (not just adding some symbols from another
616
   file, e.g. a shared library).  */
617
 
618
static void
619
dbx_new_init (struct objfile *ignore)
620
{
621
  stabsread_new_init ();
622
  buildsym_new_init ();
623
  init_header_files ();
624
}
625
 
626
 
627
/* dbx_symfile_init ()
628
   is the dbx-specific initialization routine for reading symbols.
629
   It is passed a struct objfile which contains, among other things,
630
   the BFD for the file whose symbols are being read, and a slot for a pointer
631
   to "private data" which we fill with goodies.
632
 
633
   We read the string table into malloc'd space and stash a pointer to it.
634
 
635
   Since BFD doesn't know how to read debug symbols in a format-independent
636
   way (and may never do so...), we have to do it ourselves.  We will never
637
   be called unless this is an a.out (or very similar) file.
638
   FIXME, there should be a cleaner peephole into the BFD environment here.  */
639
 
640
#define DBX_STRINGTAB_SIZE_SIZE sizeof(long)    /* FIXME */
641
 
642
static void
643
dbx_symfile_init (struct objfile *objfile)
644
{
645
  int val;
646
  bfd *sym_bfd = objfile->obfd;
647
  char *name = bfd_get_filename (sym_bfd);
648
  asection *text_sect;
649
  unsigned char size_temp[DBX_STRINGTAB_SIZE_SIZE];
650
 
651
  /* Allocate struct to keep track of the symfile */
652
  objfile->sym_stab_info = (struct dbx_symfile_info *)
653
    xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
654
  memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
655
 
656
  DBX_TEXT_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
657
  DBX_DATA_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".data");
658
  DBX_BSS_SECTION (objfile) = bfd_get_section_by_name (sym_bfd, ".bss");
659
 
660
  /* FIXME POKING INSIDE BFD DATA STRUCTURES */
661
#define STRING_TABLE_OFFSET     (sym_bfd->origin + obj_str_filepos (sym_bfd))
662
#define SYMBOL_TABLE_OFFSET     (sym_bfd->origin + obj_sym_filepos (sym_bfd))
663
 
664
  /* FIXME POKING INSIDE BFD DATA STRUCTURES */
665
 
666
  DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
667
 
668
  text_sect = bfd_get_section_by_name (sym_bfd, ".text");
669
  if (!text_sect)
670
    error ("Can't find .text section in symbol file");
671
  DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
672
  DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
673
 
674
  DBX_SYMBOL_SIZE (objfile) = obj_symbol_entry_size (sym_bfd);
675
  DBX_SYMCOUNT (objfile) = bfd_get_symcount (sym_bfd);
676
  DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
677
 
678
  /* Read the string table and stash it away in the psymbol_obstack.  It is
679
     only needed as long as we need to expand psymbols into full symbols,
680
     so when we blow away the psymbol the string table goes away as well.
681
     Note that gdb used to use the results of attempting to malloc the
682
     string table, based on the size it read, as a form of sanity check
683
     for botched byte swapping, on the theory that a byte swapped string
684
     table size would be so totally bogus that the malloc would fail.  Now
685
     that we put in on the psymbol_obstack, we can't do this since gdb gets
686
     a fatal error (out of virtual memory) if the size is bogus.  We can
687
     however at least check to see if the size is less than the size of
688
     the size field itself, or larger than the size of the entire file.
689
     Note that all valid string tables have a size greater than zero, since
690
     the bytes used to hold the size are included in the count. */
691
 
692
  if (STRING_TABLE_OFFSET == 0)
693
    {
694
      /* It appears that with the existing bfd code, STRING_TABLE_OFFSET
695
         will never be zero, even when there is no string table.  This
696
         would appear to be a bug in bfd. */
697
      DBX_STRINGTAB_SIZE (objfile) = 0;
698
      DBX_STRINGTAB (objfile) = NULL;
699
    }
700
  else
701
    {
702
      val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
703
      if (val < 0)
704
        perror_with_name (name);
705
 
706
      memset ((PTR) size_temp, 0, sizeof (size_temp));
707
      val = bfd_read ((PTR) size_temp, sizeof (size_temp), 1, sym_bfd);
708
      if (val < 0)
709
        {
710
          perror_with_name (name);
711
        }
712
      else if (val == 0)
713
        {
714
          /* With the existing bfd code, STRING_TABLE_OFFSET will be set to
715
             EOF if there is no string table, and attempting to read the size
716
             from EOF will read zero bytes. */
717
          DBX_STRINGTAB_SIZE (objfile) = 0;
718
          DBX_STRINGTAB (objfile) = NULL;
719
        }
720
      else
721
        {
722
          /* Read some data that would appear to be the string table size.
723
             If there really is a string table, then it is probably the right
724
             size.  Byteswap if necessary and validate the size.  Note that
725
             the minimum is DBX_STRINGTAB_SIZE_SIZE.  If we just read some
726
             random data that happened to be at STRING_TABLE_OFFSET, because
727
             bfd can't tell us there is no string table, the sanity checks may
728
             or may not catch this. */
729
          DBX_STRINGTAB_SIZE (objfile) = bfd_h_get_32 (sym_bfd, size_temp);
730
 
731
          if (DBX_STRINGTAB_SIZE (objfile) < sizeof (size_temp)
732
              || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
733
            error ("ridiculous string table size (%d bytes).",
734
                   DBX_STRINGTAB_SIZE (objfile));
735
 
736
          DBX_STRINGTAB (objfile) =
737
            (char *) obstack_alloc (&objfile->psymbol_obstack,
738
                                    DBX_STRINGTAB_SIZE (objfile));
739
          OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile));
740
 
741
          /* Now read in the string table in one big gulp.  */
742
 
743
          val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, SEEK_SET);
744
          if (val < 0)
745
            perror_with_name (name);
746
          val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
747
                          sym_bfd);
748
          if (val != DBX_STRINGTAB_SIZE (objfile))
749
            perror_with_name (name);
750
        }
751
    }
752
}
753
 
754
/* Perform any local cleanups required when we are done with a particular
755
   objfile.  I.E, we are in the process of discarding all symbol information
756
   for an objfile, freeing up all memory held for it, and unlinking the
757
   objfile struct from the global list of known objfiles. */
758
 
759
static void
760
dbx_symfile_finish (struct objfile *objfile)
761
{
762
  if (objfile->sym_stab_info != NULL)
763
    {
764
      if (HEADER_FILES (objfile) != NULL)
765
        {
766
          register int i = N_HEADER_FILES (objfile);
767
          register struct header_file *hfiles = HEADER_FILES (objfile);
768
 
769
          while (--i >= 0)
770
            {
771
              xfree (hfiles[i].name);
772
              xfree (hfiles[i].vector);
773
            }
774
          xfree (hfiles);
775
        }
776
      mfree (objfile->md, objfile->sym_stab_info);
777
    }
778
  free_header_files ();
779
}
780
 
781
 
782
/* Buffer for reading the symbol table entries.  */
783
static struct external_nlist symbuf[4096];
784
static int symbuf_idx;
785
static int symbuf_end;
786
 
787
/* cont_elem is used for continuing information in cfront.
788
   It saves information about which types need to be fixed up and
789
   completed after all the stabs are read.  */
790
struct cont_elem
791
  {
792
    /* sym and stabstring for continuing information in cfront */
793
    struct symbol *sym;
794
    char *stabs;
795
    /* state dependencies (statics that must be preserved) */
796
    int sym_idx;
797
    int sym_end;
798
    int symnum;
799
    int (*func) (struct objfile *, struct symbol *, char *);
800
    /* other state dependencies include:
801
       (assumption is that these will not change since process_now FIXME!!)
802
       stringtab_global
803
       n_stabs
804
       objfile
805
       symfile_bfd */
806
  };
807
 
808
static struct cont_elem *cont_list = 0;
809
static int cont_limit = 0;
810
static int cont_count = 0;
811
 
812
/* Arrange for function F to be called with arguments SYM and P later
813
   in the stabs reading process.  */
814
void
815
process_later (struct symbol *sym, char *p,
816
               int (*f) (struct objfile *, struct symbol *, char *))
817
{
818
 
819
  /* Allocate more space for the deferred list.  */
820
  if (cont_count >= cont_limit - 1)
821
    {
822
      cont_limit += 32;         /* chunk size */
823
 
824
      cont_list
825
        = (struct cont_elem *) xrealloc (cont_list,
826
                                         (cont_limit
827
                                          * sizeof (struct cont_elem)));
828
      if (!cont_list)
829
        error ("Virtual memory exhausted\n");
830
    }
831
 
832
  /* Save state variables so we can process these stabs later.  */
833
  cont_list[cont_count].sym_idx = symbuf_idx;
834
  cont_list[cont_count].sym_end = symbuf_end;
835
  cont_list[cont_count].symnum = symnum;
836
  cont_list[cont_count].sym = sym;
837
  cont_list[cont_count].stabs = p;
838
  cont_list[cont_count].func = f;
839
  cont_count++;
840
}
841
 
842
/* Call deferred funtions in CONT_LIST.  */
843
 
844
static void
845
process_now (struct objfile *objfile)
846
{
847
  int i;
848
  int save_symbuf_idx;
849
  int save_symbuf_end;
850
  int save_symnum;
851
  struct symbol *sym;
852
  char *stabs;
853
  int err;
854
  int (*func) (struct objfile *, struct symbol *, char *);
855
 
856
  /* Save the state of our caller, we'll want to restore it before
857
     returning.  */
858
  save_symbuf_idx = symbuf_idx;
859
  save_symbuf_end = symbuf_end;
860
  save_symnum = symnum;
861
 
862
  /* Iterate over all the deferred stabs.  */
863
  for (i = 0; i < cont_count; i++)
864
    {
865
      /* Restore the state for this deferred stab.  */
866
      symbuf_idx = cont_list[i].sym_idx;
867
      symbuf_end = cont_list[i].sym_end;
868
      symnum = cont_list[i].symnum;
869
      sym = cont_list[i].sym;
870
      stabs = cont_list[i].stabs;
871
      func = cont_list[i].func;
872
 
873
      /* Call the function to handle this deferrd stab.  */
874
      err = (*func) (objfile, sym, stabs);
875
      if (err)
876
        error ("Internal error: unable to resolve stab.\n");
877
    }
878
 
879
  /* Restore our caller's state.  */
880
  symbuf_idx = save_symbuf_idx;
881
  symbuf_end = save_symbuf_end;
882
  symnum = save_symnum;
883
  cont_count = 0;
884
}
885
 
886
 
887
/* Name of last function encountered.  Used in Solaris to approximate
888
   object file boundaries.  */
889
static char *last_function_name;
890
 
891
/* The address in memory of the string table of the object file we are
892
   reading (which might not be the "main" object file, but might be a
893
   shared library or some other dynamically loaded thing).  This is
894
   set by read_dbx_symtab when building psymtabs, and by
895
   read_ofile_symtab when building symtabs, and is used only by
896
   next_symbol_text.  FIXME: If that is true, we don't need it when
897
   building psymtabs, right?  */
898
static char *stringtab_global;
899
 
900
/* These variables are used to control fill_symbuf when the stabs
901
   symbols are not contiguous (as may be the case when a COFF file is
902
   linked using --split-by-reloc).  */
903
static struct stab_section_list *symbuf_sections;
904
static unsigned int symbuf_left;
905
static unsigned int symbuf_read;
906
 
907
/* Refill the symbol table input buffer
908
   and set the variables that control fetching entries from it.
909
   Reports an error if no data available.
910
   This function can read past the end of the symbol table
911
   (into the string table) but this does no harm.  */
912
 
913
static void
914
fill_symbuf (bfd *sym_bfd)
915
{
916
  unsigned int count;
917
  int nbytes;
918
 
919
  if (symbuf_sections == NULL)
920
    count = sizeof (symbuf);
921
  else
922
    {
923
      if (symbuf_left <= 0)
924
        {
925
          file_ptr filepos = symbuf_sections->section->filepos;
926
          if (bfd_seek (sym_bfd, filepos, SEEK_SET) != 0)
927
            perror_with_name (bfd_get_filename (sym_bfd));
928
          symbuf_left = bfd_section_size (sym_bfd, symbuf_sections->section);
929
          symbol_table_offset = filepos - symbuf_read;
930
          symbuf_sections = symbuf_sections->next;
931
        }
932
 
933
      count = symbuf_left;
934
      if (count > sizeof (symbuf))
935
        count = sizeof (symbuf);
936
    }
937
 
938
  nbytes = bfd_read ((PTR) symbuf, count, 1, sym_bfd);
939
  if (nbytes < 0)
940
    perror_with_name (bfd_get_filename (sym_bfd));
941
  else if (nbytes == 0)
942
    error ("Premature end of file reading symbol table");
943
  symbuf_end = nbytes / symbol_size;
944
  symbuf_idx = 0;
945
  symbuf_left -= nbytes;
946
  symbuf_read += nbytes;
947
}
948
 
949
#define SWAP_SYMBOL(symp, abfd) \
950
  { \
951
    (symp)->n_strx = bfd_h_get_32(abfd,                 \
952
                                (unsigned char *)&(symp)->n_strx);      \
953
    (symp)->n_desc = bfd_h_get_16 (abfd,                        \
954
                                (unsigned char *)&(symp)->n_desc);      \
955
    (symp)->n_value = bfd_h_get_32 (abfd,                       \
956
                                (unsigned char *)&(symp)->n_value);     \
957
  }
958
 
959
#define INTERNALIZE_SYMBOL(intern, extern, abfd)                        \
960
  {                                                                     \
961
    (intern).n_type = bfd_h_get_8 (abfd, (extern)->e_type);             \
962
    (intern).n_strx = bfd_h_get_32 (abfd, (extern)->e_strx);            \
963
    (intern).n_desc = bfd_h_get_16 (abfd, (extern)->e_desc);            \
964
    (intern).n_value = bfd_h_get_32 (abfd, (extern)->e_value);          \
965
  }
966
 
967
/* Invariant: The symbol pointed to by symbuf_idx is the first one
968
   that hasn't been swapped.  Swap the symbol at the same time
969
   that symbuf_idx is incremented.  */
970
 
971
/* dbx allows the text of a symbol name to be continued into the
972
   next symbol name!  When such a continuation is encountered
973
   (a \ at the end of the text of a name)
974
   call this function to get the continuation.  */
975
 
976
static char *
977
dbx_next_symbol_text (struct objfile *objfile)
978
{
979
  struct internal_nlist nlist;
980
 
981
  if (symbuf_idx == symbuf_end)
982
    fill_symbuf (symfile_bfd);
983
 
984
  symnum++;
985
  INTERNALIZE_SYMBOL (nlist, &symbuf[symbuf_idx], symfile_bfd);
986
  OBJSTAT (objfile, n_stabs++);
987
 
988
  symbuf_idx++;
989
 
990
  return nlist.n_strx + stringtab_global + file_string_table_offset;
991
}
992
 
993
/* Initialize the list of bincls to contain none and have some
994
   allocated.  */
995
 
996
static void
997
init_bincl_list (int number, struct objfile *objfile)
998
{
999
  bincls_allocated = number;
1000
  next_bincl = bincl_list = (struct header_file_location *)
1001
    xmmalloc (objfile->md, bincls_allocated * sizeof (struct header_file_location));
1002
}
1003
 
1004
/* Add a bincl to the list.  */
1005
 
1006
static void
1007
add_bincl_to_list (struct partial_symtab *pst, char *name, int instance)
1008
{
1009
  if (next_bincl >= bincl_list + bincls_allocated)
1010
    {
1011
      int offset = next_bincl - bincl_list;
1012
      bincls_allocated *= 2;
1013
      bincl_list = (struct header_file_location *)
1014
        xmrealloc (pst->objfile->md, (char *) bincl_list,
1015
                   bincls_allocated * sizeof (struct header_file_location));
1016
      next_bincl = bincl_list + offset;
1017
    }
1018
  next_bincl->pst = pst;
1019
  next_bincl->instance = instance;
1020
  next_bincl++->name = name;
1021
}
1022
 
1023
/* Given a name, value pair, find the corresponding
1024
   bincl in the list.  Return the partial symtab associated
1025
   with that header_file_location.  */
1026
 
1027
static struct partial_symtab *
1028
find_corresponding_bincl_psymtab (char *name, int instance)
1029
{
1030
  struct header_file_location *bincl;
1031
 
1032
  for (bincl = bincl_list; bincl < next_bincl; bincl++)
1033
    if (bincl->instance == instance
1034
        && STREQ (name, bincl->name))
1035
      return bincl->pst;
1036
 
1037
  complain (&repeated_header_complaint, name, symnum);
1038
  return (struct partial_symtab *) 0;
1039
}
1040
 
1041
/* Free the storage allocated for the bincl list.  */
1042
 
1043
static void
1044
free_bincl_list (struct objfile *objfile)
1045
{
1046
  mfree (objfile->md, (PTR) bincl_list);
1047
  bincls_allocated = 0;
1048
}
1049
 
1050
static void
1051
do_free_bincl_list_cleanup (void *objfile)
1052
{
1053
  free_bincl_list (objfile);
1054
}
1055
 
1056
static struct cleanup *
1057
make_cleanup_free_bincl_list (struct objfile *objfile)
1058
{
1059
  return make_cleanup (do_free_bincl_list_cleanup, objfile);
1060
}
1061
 
1062
/* Scan a SunOs dynamic symbol table for symbols of interest and
1063
   add them to the minimal symbol table.  */
1064
 
1065
static void
1066
read_dbx_dynamic_symtab (struct objfile *objfile)
1067
{
1068
  bfd *abfd = objfile->obfd;
1069
  struct cleanup *back_to;
1070
  int counter;
1071
  long dynsym_size;
1072
  long dynsym_count;
1073
  asymbol **dynsyms;
1074
  asymbol **symptr;
1075
  arelent **relptr;
1076
  long dynrel_size;
1077
  long dynrel_count;
1078
  arelent **dynrels;
1079
  CORE_ADDR sym_value;
1080
  char *name;
1081
 
1082
  /* Check that the symbol file has dynamic symbols that we know about.
1083
     bfd_arch_unknown can happen if we are reading a sun3 symbol file
1084
     on a sun4 host (and vice versa) and bfd is not configured
1085
     --with-target=all.  This would trigger an assertion in bfd/sunos.c,
1086
     so we ignore the dynamic symbols in this case.  */
1087
  if (bfd_get_flavour (abfd) != bfd_target_aout_flavour
1088
      || (bfd_get_file_flags (abfd) & DYNAMIC) == 0
1089
      || bfd_get_arch (abfd) == bfd_arch_unknown)
1090
    return;
1091
 
1092
  dynsym_size = bfd_get_dynamic_symtab_upper_bound (abfd);
1093
  if (dynsym_size < 0)
1094
    return;
1095
 
1096
  dynsyms = (asymbol **) xmalloc (dynsym_size);
1097
  back_to = make_cleanup (xfree, dynsyms);
1098
 
1099
  dynsym_count = bfd_canonicalize_dynamic_symtab (abfd, dynsyms);
1100
  if (dynsym_count < 0)
1101
    {
1102
      do_cleanups (back_to);
1103
      return;
1104
    }
1105
 
1106
  /* Enter dynamic symbols into the minimal symbol table
1107
     if this is a stripped executable.  */
1108
  if (bfd_get_symcount (abfd) <= 0)
1109
    {
1110
      symptr = dynsyms;
1111
      for (counter = 0; counter < dynsym_count; counter++, symptr++)
1112
        {
1113
          asymbol *sym = *symptr;
1114
          asection *sec;
1115
          int type;
1116
 
1117
          sec = bfd_get_section (sym);
1118
 
1119
          /* BFD symbols are section relative.  */
1120
          sym_value = sym->value + sec->vma;
1121
 
1122
          if (bfd_get_section_flags (abfd, sec) & SEC_CODE)
1123
            {
1124
              sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1125
              type = N_TEXT;
1126
            }
1127
          else if (bfd_get_section_flags (abfd, sec) & SEC_DATA)
1128
            {
1129
              sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1130
              type = N_DATA;
1131
            }
1132
          else if (bfd_get_section_flags (abfd, sec) & SEC_ALLOC)
1133
            {
1134
              sym_value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
1135
              type = N_BSS;
1136
            }
1137
          else
1138
            continue;
1139
 
1140
          if (sym->flags & BSF_GLOBAL)
1141
            type |= N_EXT;
1142
 
1143
          record_minimal_symbol ((char *) bfd_asymbol_name (sym), sym_value,
1144
                                 type, objfile);
1145
        }
1146
    }
1147
 
1148
  /* Symbols from shared libraries have a dynamic relocation entry
1149
     that points to the associated slot in the procedure linkage table.
1150
     We make a mininal symbol table entry with type mst_solib_trampoline
1151
     at the address in the procedure linkage table.  */
1152
  dynrel_size = bfd_get_dynamic_reloc_upper_bound (abfd);
1153
  if (dynrel_size < 0)
1154
    {
1155
      do_cleanups (back_to);
1156
      return;
1157
    }
1158
 
1159
  dynrels = (arelent **) xmalloc (dynrel_size);
1160
  make_cleanup (xfree, dynrels);
1161
 
1162
  dynrel_count = bfd_canonicalize_dynamic_reloc (abfd, dynrels, dynsyms);
1163
  if (dynrel_count < 0)
1164
    {
1165
      do_cleanups (back_to);
1166
      return;
1167
    }
1168
 
1169
  for (counter = 0, relptr = dynrels;
1170
       counter < dynrel_count;
1171
       counter++, relptr++)
1172
    {
1173
      arelent *rel = *relptr;
1174
      CORE_ADDR address =
1175
      rel->address + ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1176
 
1177
      switch (bfd_get_arch (abfd))
1178
        {
1179
        case bfd_arch_sparc:
1180
          if (rel->howto->type != RELOC_JMP_SLOT)
1181
            continue;
1182
          break;
1183
        case bfd_arch_m68k:
1184
          /* `16' is the type BFD produces for a jump table relocation.  */
1185
          if (rel->howto->type != 16)
1186
            continue;
1187
 
1188
          /* Adjust address in the jump table to point to
1189
             the start of the bsr instruction.  */
1190
          address -= 2;
1191
          break;
1192
        default:
1193
          continue;
1194
        }
1195
 
1196
      name = (char *) bfd_asymbol_name (*rel->sym_ptr_ptr);
1197
      prim_record_minimal_symbol (name, address, mst_solib_trampoline,
1198
                                  objfile);
1199
    }
1200
 
1201
  do_cleanups (back_to);
1202
}
1203
 
1204
/* Setup partial_symtab's describing each source file for which
1205
   debugging information is available. */
1206
 
1207
static void
1208
read_dbx_symtab (struct objfile *objfile)
1209
{
1210
  register struct external_nlist *bufp = 0;      /* =0 avoids gcc -Wall glitch */
1211
  struct internal_nlist nlist;
1212
  CORE_ADDR text_addr;
1213
  int text_size;
1214
 
1215
  register char *namestring;
1216
  int nsl;
1217
  int past_first_source_file = 0;
1218
  CORE_ADDR last_o_file_start = 0;
1219
  CORE_ADDR last_function_start = 0;
1220
  struct cleanup *back_to;
1221
  bfd *abfd;
1222
  int textlow_not_set;
1223
 
1224
  /* Current partial symtab */
1225
  struct partial_symtab *pst;
1226
 
1227
  /* List of current psymtab's include files */
1228
  char **psymtab_include_list;
1229
  int includes_allocated;
1230
  int includes_used;
1231
 
1232
  /* Index within current psymtab dependency list */
1233
  struct partial_symtab **dependency_list;
1234
  int dependencies_used, dependencies_allocated;
1235
 
1236
  text_addr = DBX_TEXT_ADDR (objfile);
1237
  text_size = DBX_TEXT_SIZE (objfile);
1238
 
1239
  /* FIXME.  We probably want to change stringtab_global rather than add this
1240
     while processing every symbol entry.  FIXME.  */
1241
  file_string_table_offset = 0;
1242
  next_file_string_table_offset = 0;
1243
 
1244
  stringtab_global = DBX_STRINGTAB (objfile);
1245
 
1246
  pst = (struct partial_symtab *) 0;
1247
 
1248
  includes_allocated = 30;
1249
  includes_used = 0;
1250
  psymtab_include_list = (char **) alloca (includes_allocated *
1251
                                           sizeof (char *));
1252
 
1253
  dependencies_allocated = 30;
1254
  dependencies_used = 0;
1255
  dependency_list =
1256
    (struct partial_symtab **) alloca (dependencies_allocated *
1257
                                       sizeof (struct partial_symtab *));
1258
 
1259
  /* Init bincl list */
1260
  init_bincl_list (20, objfile);
1261
  back_to = make_cleanup_free_bincl_list (objfile);
1262
 
1263
  last_source_file = NULL;
1264
 
1265
  lowest_text_address = (CORE_ADDR) -1;
1266
 
1267
  symfile_bfd = objfile->obfd;  /* For next_text_symbol */
1268
  abfd = objfile->obfd;
1269
  symbuf_end = symbuf_idx = 0;
1270
  next_symbol_text_func = dbx_next_symbol_text;
1271
  textlow_not_set = 1;
1272
  has_line_numbers = 0;
1273
 
1274
  for (symnum = 0; symnum < DBX_SYMCOUNT (objfile); symnum++)
1275
    {
1276
      /* Get the symbol for this run and pull out some info */
1277
      QUIT;                     /* allow this to be interruptable */
1278
      if (symbuf_idx == symbuf_end)
1279
        fill_symbuf (abfd);
1280
      bufp = &symbuf[symbuf_idx++];
1281
 
1282
      /*
1283
       * Special case to speed up readin.
1284
       */
1285
      if (bfd_h_get_8 (abfd, bufp->e_type) == N_SLINE)
1286
        {
1287
          has_line_numbers = 1;
1288
          continue;
1289
        }
1290
 
1291
      INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1292
      OBJSTAT (objfile, n_stabs++);
1293
 
1294
      /* Ok.  There is a lot of code duplicated in the rest of this
1295
         switch statement (for efficiency reasons).  Since I don't
1296
         like duplicating code, I will do my penance here, and
1297
         describe the code which is duplicated:
1298
 
1299
         *) The assignment to namestring.
1300
         *) The call to strchr.
1301
         *) The addition of a partial symbol the the two partial
1302
         symbol lists.  This last is a large section of code, so
1303
         I've imbedded it in the following macro.
1304
       */
1305
 
1306
/* Set namestring based on nlist.  If the string table index is invalid,
1307
   give a fake name, and print a single error message per symbol file read,
1308
   rather than abort the symbol reading or flood the user with messages.  */
1309
 
1310
/*FIXME: Too many adds and indirections in here for the inner loop.  */
1311
#define SET_NAMESTRING()\
1312
  if (((unsigned)CUR_SYMBOL_STRX + file_string_table_offset) >=         \
1313
      DBX_STRINGTAB_SIZE (objfile)) {                                   \
1314
    complain (&string_table_offset_complaint, symnum);                  \
1315
    namestring = "<bad string table offset>";                           \
1316
  } else                                                                \
1317
    namestring = CUR_SYMBOL_STRX + file_string_table_offset +           \
1318
                 DBX_STRINGTAB (objfile)
1319
 
1320
#define CUR_SYMBOL_TYPE nlist.n_type
1321
#define CUR_SYMBOL_VALUE nlist.n_value
1322
#define CUR_SYMBOL_STRX nlist.n_strx
1323
#define DBXREAD_ONLY
1324
#define START_PSYMTAB(ofile,fname,low,symoff,global_syms,static_syms)\
1325
  start_psymtab(ofile, fname, low, symoff, global_syms, static_syms)
1326
#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)\
1327
  end_psymtab(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)
1328
 
1329
#include "partial-stab.h"
1330
    }
1331
 
1332
  /* If there's stuff to be cleaned up, clean it up.  */
1333
  if (DBX_SYMCOUNT (objfile) > 0 /* We have some syms */
1334
/*FIXME, does this have a bug at start address 0? */
1335
      && last_o_file_start
1336
      && objfile->ei.entry_point < nlist.n_value
1337
      && objfile->ei.entry_point >= last_o_file_start)
1338
    {
1339
      objfile->ei.entry_file_lowpc = last_o_file_start;
1340
      objfile->ei.entry_file_highpc = nlist.n_value;
1341
    }
1342
 
1343
  if (pst)
1344
    {
1345
      /* Don't set pst->texthigh lower than it already is.  */
1346
      CORE_ADDR text_end =
1347
      (lowest_text_address == (CORE_ADDR) -1
1348
       ? (text_addr + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)))
1349
       : lowest_text_address)
1350
      + text_size;
1351
 
1352
      end_psymtab (pst, psymtab_include_list, includes_used,
1353
                   symnum * symbol_size,
1354
                   text_end > pst->texthigh ? text_end : pst->texthigh,
1355
                   dependency_list, dependencies_used, textlow_not_set);
1356
    }
1357
 
1358
  do_cleanups (back_to);
1359
}
1360
 
1361
/* Allocate and partially fill a partial symtab.  It will be
1362
   completely filled at the end of the symbol list.
1363
 
1364
   SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
1365
   is the address relative to which its symbols are (incremental) or 0
1366
   (normal). */
1367
 
1368
 
1369
static struct partial_symtab *
1370
start_psymtab (struct objfile *objfile, char *filename, CORE_ADDR textlow,
1371
               int ldsymoff, struct partial_symbol **global_syms,
1372
               struct partial_symbol **static_syms)
1373
{
1374
  struct partial_symtab *result =
1375
  start_psymtab_common (objfile, objfile->section_offsets,
1376
                        filename, textlow, global_syms, static_syms);
1377
 
1378
  result->read_symtab_private = (char *)
1379
    obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
1380
  LDSYMOFF (result) = ldsymoff;
1381
  result->read_symtab = dbx_psymtab_to_symtab;
1382
  SYMBOL_SIZE (result) = symbol_size;
1383
  SYMBOL_OFFSET (result) = symbol_table_offset;
1384
  STRING_OFFSET (result) = string_table_offset;
1385
  FILE_STRING_OFFSET (result) = file_string_table_offset;
1386
 
1387
  /* If we're handling an ELF file, drag some section-relocation info
1388
     for this source file out of the ELF symbol table, to compensate for
1389
     Sun brain death.  This replaces the section_offsets in this psymtab,
1390
     if successful.  */
1391
  elfstab_offset_sections (objfile, result);
1392
 
1393
  /* Deduce the source language from the filename for this psymtab. */
1394
  psymtab_language = deduce_language_from_filename (filename);
1395
 
1396
  return result;
1397
}
1398
 
1399
/* Close off the current usage of PST.
1400
   Returns PST or NULL if the partial symtab was empty and thrown away.
1401
 
1402
   FIXME:  List variables and peculiarities of same.  */
1403
 
1404
struct partial_symtab *
1405
end_psymtab (struct partial_symtab *pst, char **include_list, int num_includes,
1406
             int capping_symbol_offset, CORE_ADDR capping_text,
1407
             struct partial_symtab **dependency_list, int number_dependencies,
1408
             int textlow_not_set)
1409
{
1410
  int i;
1411
  struct objfile *objfile = pst->objfile;
1412
 
1413
  if (capping_symbol_offset != -1)
1414
    LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
1415
  pst->texthigh = capping_text;
1416
 
1417
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
1418
  /* Under Solaris, the N_SO symbols always have a value of 0,
1419
     instead of the usual address of the .o file.  Therefore,
1420
     we have to do some tricks to fill in texthigh and textlow.
1421
     The first trick is in partial-stab.h: if we see a static
1422
     or global function, and the textlow for the current pst
1423
     is not set (ie: textlow_not_set), then we use that function's
1424
     address for the textlow of the pst.  */
1425
 
1426
  /* Now, to fill in texthigh, we remember the last function seen
1427
     in the .o file (also in partial-stab.h).  Also, there's a hack in
1428
     bfd/elf.c and gdb/elfread.c to pass the ELF st_size field
1429
     to here via the misc_info field.  Therefore, we can fill in
1430
     a reliable texthigh by taking the address plus size of the
1431
     last function in the file.  */
1432
 
1433
  if (pst->texthigh == 0 && last_function_name)
1434
    {
1435
      char *p;
1436
      int n;
1437
      struct minimal_symbol *minsym;
1438
 
1439
      p = strchr (last_function_name, ':');
1440
      if (p == NULL)
1441
        p = last_function_name;
1442
      n = p - last_function_name;
1443
      p = alloca (n + 2);
1444
      strncpy (p, last_function_name, n);
1445
      p[n] = 0;
1446
 
1447
      minsym = lookup_minimal_symbol (p, pst->filename, objfile);
1448
      if (minsym == NULL)
1449
        {
1450
          /* Sun Fortran appends an underscore to the minimal symbol name,
1451
             try again with an appended underscore if the minimal symbol
1452
             was not found.  */
1453
          p[n] = '_';
1454
          p[n + 1] = 0;
1455
          minsym = lookup_minimal_symbol (p, pst->filename, objfile);
1456
        }
1457
 
1458
      if (minsym)
1459
        pst->texthigh = SYMBOL_VALUE_ADDRESS (minsym) + MSYMBOL_SIZE (minsym);
1460
 
1461
      last_function_name = NULL;
1462
    }
1463
 
1464
  /* this test will be true if the last .o file is only data */
1465
  if (textlow_not_set)
1466
    pst->textlow = pst->texthigh;
1467
  else
1468
    {
1469
      struct partial_symtab *p1;
1470
 
1471
      /* If we know our own starting text address, then walk through all other
1472
         psymtabs for this objfile, and if any didn't know their ending text
1473
         address, set it to our starting address.  Take care to not set our
1474
         own ending address to our starting address, nor to set addresses on
1475
         `dependency' files that have both textlow and texthigh zero.  */
1476
 
1477
      ALL_OBJFILE_PSYMTABS (objfile, p1)
1478
      {
1479
        if (p1->texthigh == 0 && p1->textlow != 0 && p1 != pst)
1480
          {
1481
            p1->texthigh = pst->textlow;
1482
            /* if this file has only data, then make textlow match texthigh */
1483
            if (p1->textlow == 0)
1484
              p1->textlow = p1->texthigh;
1485
          }
1486
      }
1487
    }
1488
 
1489
  /* End of kludge for patching Solaris textlow and texthigh.  */
1490
#endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
1491
 
1492
  pst->n_global_syms =
1493
    objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
1494
  pst->n_static_syms =
1495
    objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
1496
 
1497
  pst->number_of_dependencies = number_dependencies;
1498
  if (number_dependencies)
1499
    {
1500
      pst->dependencies = (struct partial_symtab **)
1501
        obstack_alloc (&objfile->psymbol_obstack,
1502
                    number_dependencies * sizeof (struct partial_symtab *));
1503
      memcpy (pst->dependencies, dependency_list,
1504
              number_dependencies * sizeof (struct partial_symtab *));
1505
    }
1506
  else
1507
    pst->dependencies = 0;
1508
 
1509
  for (i = 0; i < num_includes; i++)
1510
    {
1511
      struct partial_symtab *subpst =
1512
      allocate_psymtab (include_list[i], objfile);
1513
 
1514
      /* Copy the sesction_offsets array from the main psymtab. */
1515
      subpst->section_offsets = pst->section_offsets;
1516
      subpst->read_symtab_private =
1517
        (char *) obstack_alloc (&objfile->psymbol_obstack,
1518
                                sizeof (struct symloc));
1519
      LDSYMOFF (subpst) =
1520
        LDSYMLEN (subpst) =
1521
        subpst->textlow =
1522
        subpst->texthigh = 0;
1523
 
1524
      /* We could save slight bits of space by only making one of these,
1525
         shared by the entire set of include files.  FIXME-someday.  */
1526
      subpst->dependencies = (struct partial_symtab **)
1527
        obstack_alloc (&objfile->psymbol_obstack,
1528
                       sizeof (struct partial_symtab *));
1529
      subpst->dependencies[0] = pst;
1530
      subpst->number_of_dependencies = 1;
1531
 
1532
      subpst->globals_offset =
1533
        subpst->n_global_syms =
1534
        subpst->statics_offset =
1535
        subpst->n_static_syms = 0;
1536
 
1537
      subpst->readin = 0;
1538
      subpst->symtab = 0;
1539
      subpst->read_symtab = pst->read_symtab;
1540
    }
1541
 
1542
  sort_pst_symbols (pst);
1543
 
1544
  /* If there is already a psymtab or symtab for a file of this name, remove it.
1545
     (If there is a symtab, more drastic things also happen.)
1546
     This happens in VxWorks.  */
1547
  free_named_symtabs (pst->filename);
1548
 
1549
  if (num_includes == 0
1550
      && number_dependencies == 0
1551
      && pst->n_global_syms == 0
1552
      && pst->n_static_syms == 0
1553
      && has_line_numbers == 0)
1554
    {
1555
      /* Throw away this psymtab, it's empty.  We can't deallocate it, since
1556
         it is on the obstack, but we can forget to chain it on the list.  */
1557
      /* Empty psymtabs happen as a result of header files which don't have
1558
         any symbols in them.  There can be a lot of them.  But this check
1559
         is wrong, in that a psymtab with N_SLINE entries but nothing else
1560
         is not empty, but we don't realize that.  Fixing that without slowing
1561
         things down might be tricky.  */
1562
 
1563
      discard_psymtab (pst);
1564
 
1565
      /* Indicate that psymtab was thrown away.  */
1566
      pst = (struct partial_symtab *) NULL;
1567
    }
1568
  return pst;
1569
}
1570
 
1571
static void
1572
dbx_psymtab_to_symtab_1 (struct partial_symtab *pst)
1573
{
1574
  struct cleanup *old_chain;
1575
  int i;
1576
 
1577
  if (!pst)
1578
    return;
1579
 
1580
  if (pst->readin)
1581
    {
1582
      fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1583
                          pst->filename);
1584
      return;
1585
    }
1586
 
1587
  /* Read in all partial symtabs on which this one is dependent */
1588
  for (i = 0; i < pst->number_of_dependencies; i++)
1589
    if (!pst->dependencies[i]->readin)
1590
      {
1591
        /* Inform about additional files that need to be read in.  */
1592
        if (info_verbose)
1593
          {
1594
            fputs_filtered (" ", gdb_stdout);
1595
            wrap_here ("");
1596
            fputs_filtered ("and ", gdb_stdout);
1597
            wrap_here ("");
1598
            printf_filtered ("%s...", pst->dependencies[i]->filename);
1599
            wrap_here ("");     /* Flush output */
1600
            gdb_flush (gdb_stdout);
1601
          }
1602
        dbx_psymtab_to_symtab_1 (pst->dependencies[i]);
1603
      }
1604
 
1605
  if (LDSYMLEN (pst))           /* Otherwise it's a dummy */
1606
    {
1607
      /* Init stuff necessary for reading in symbols */
1608
      stabsread_init ();
1609
      buildsym_init ();
1610
      old_chain = make_cleanup (really_free_pendings, 0);
1611
      file_string_table_offset = FILE_STRING_OFFSET (pst);
1612
      symbol_size = SYMBOL_SIZE (pst);
1613
 
1614
      /* Read in this file's symbols */
1615
      bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), SEEK_SET);
1616
      read_ofile_symtab (pst);
1617
      sort_symtab_syms (pst->symtab);
1618
 
1619
      do_cleanups (old_chain);
1620
    }
1621
 
1622
  pst->readin = 1;
1623
}
1624
 
1625
/* Read in all of the symbols for a given psymtab for real.
1626
   Be verbose about it if the user wants that.  */
1627
 
1628
static void
1629
dbx_psymtab_to_symtab (struct partial_symtab *pst)
1630
{
1631
  bfd *sym_bfd;
1632
 
1633
  if (!pst)
1634
    return;
1635
 
1636
  if (pst->readin)
1637
    {
1638
      fprintf_unfiltered (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1639
                          pst->filename);
1640
      return;
1641
    }
1642
 
1643
  if (LDSYMLEN (pst) || pst->number_of_dependencies)
1644
    {
1645
      /* Print the message now, before reading the string table,
1646
         to avoid disconcerting pauses.  */
1647
      if (info_verbose)
1648
        {
1649
          printf_filtered ("Reading in symbols for %s...", pst->filename);
1650
          gdb_flush (gdb_stdout);
1651
        }
1652
 
1653
      sym_bfd = pst->objfile->obfd;
1654
 
1655
      next_symbol_text_func = dbx_next_symbol_text;
1656
 
1657
      dbx_psymtab_to_symtab_1 (pst);
1658
 
1659
      /* Match with global symbols.  This only needs to be done once,
1660
         after all of the symtabs and dependencies have been read in.   */
1661
      scan_file_globals (pst->objfile);
1662
 
1663
      /* Finish up the debug error message.  */
1664
      if (info_verbose)
1665
        printf_filtered ("done.\n");
1666
    }
1667
}
1668
 
1669
/* Read in a defined section of a specific object file's symbols. */
1670
 
1671
static void
1672
read_ofile_symtab (struct partial_symtab *pst)
1673
{
1674
  register char *namestring;
1675
  register struct external_nlist *bufp;
1676
  struct internal_nlist nlist;
1677
  unsigned char type;
1678
  unsigned max_symnum;
1679
  register bfd *abfd;
1680
  struct objfile *objfile;
1681
  int sym_offset;               /* Offset to start of symbols to read */
1682
  int sym_size;                 /* Size of symbols to read */
1683
  CORE_ADDR text_offset;        /* Start of text segment for symbols */
1684
  int text_size;                /* Size of text segment for symbols */
1685
  struct section_offsets *section_offsets;
1686
 
1687
  objfile = pst->objfile;
1688
  sym_offset = LDSYMOFF (pst);
1689
  sym_size = LDSYMLEN (pst);
1690
  text_offset = pst->textlow;
1691
  text_size = pst->texthigh - pst->textlow;
1692
  /* This cannot be simply objfile->section_offsets because of
1693
     elfstab_offset_sections() which initializes the psymtab section
1694
     offsets information in a special way, and that is different from
1695
     objfile->section_offsets. */
1696
  section_offsets = pst->section_offsets;
1697
 
1698
  current_objfile = objfile;
1699
  subfile_stack = NULL;
1700
 
1701
  stringtab_global = DBX_STRINGTAB (objfile);
1702
  last_source_file = NULL;
1703
 
1704
  abfd = objfile->obfd;
1705
  symfile_bfd = objfile->obfd;  /* Implicit param to next_text_symbol */
1706
  symbuf_end = symbuf_idx = 0;
1707
 
1708
  /* It is necessary to actually read one symbol *before* the start
1709
     of this symtab's symbols, because the GCC_COMPILED_FLAG_SYMBOL
1710
     occurs before the N_SO symbol.
1711
 
1712
     Detecting this in read_dbx_symtab
1713
     would slow down initial readin, so we look for it here instead.  */
1714
  if (!processing_acc_compilation && sym_offset >= (int) symbol_size)
1715
    {
1716
      bfd_seek (symfile_bfd, sym_offset - symbol_size, SEEK_CUR);
1717
      fill_symbuf (abfd);
1718
      bufp = &symbuf[symbuf_idx++];
1719
      INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1720
      OBJSTAT (objfile, n_stabs++);
1721
 
1722
      SET_NAMESTRING ();
1723
 
1724
      processing_gcc_compilation = 0;
1725
      if (nlist.n_type == N_TEXT)
1726
        {
1727
          const char *tempstring = namestring;
1728
 
1729
          if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1730
            processing_gcc_compilation = 1;
1731
          else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1732
            processing_gcc_compilation = 2;
1733
          if (tempstring[0] == bfd_get_symbol_leading_char (symfile_bfd))
1734
            ++tempstring;
1735
          if (STREQN (tempstring, "__gnu_compiled", 14))
1736
            processing_gcc_compilation = 2;
1737
        }
1738
 
1739
      /* Try to select a C++ demangling based on the compilation unit
1740
         producer. */
1741
 
1742
#if 0
1743
      /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
1744
         know whether it will use the old style or v3 mangling.  */
1745
      if (processing_gcc_compilation)
1746
        {
1747
          if (AUTO_DEMANGLING)
1748
            {
1749
              set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1750
            }
1751
        }
1752
#endif
1753
    }
1754
  else
1755
    {
1756
      /* The N_SO starting this symtab is the first symbol, so we
1757
         better not check the symbol before it.  I'm not this can
1758
         happen, but it doesn't hurt to check for it.  */
1759
      bfd_seek (symfile_bfd, sym_offset, SEEK_CUR);
1760
      processing_gcc_compilation = 0;
1761
    }
1762
 
1763
  if (symbuf_idx == symbuf_end)
1764
    fill_symbuf (abfd);
1765
  bufp = &symbuf[symbuf_idx];
1766
  if (bfd_h_get_8 (abfd, bufp->e_type) != N_SO)
1767
    error ("First symbol in segment of executable not a source symbol");
1768
 
1769
  max_symnum = sym_size / symbol_size;
1770
 
1771
  for (symnum = 0;
1772
       symnum < max_symnum;
1773
       symnum++)
1774
    {
1775
      QUIT;                     /* Allow this to be interruptable */
1776
      if (symbuf_idx == symbuf_end)
1777
        fill_symbuf (abfd);
1778
      bufp = &symbuf[symbuf_idx++];
1779
      INTERNALIZE_SYMBOL (nlist, bufp, abfd);
1780
      OBJSTAT (objfile, n_stabs++);
1781
 
1782
      type = bfd_h_get_8 (abfd, bufp->e_type);
1783
 
1784
      SET_NAMESTRING ();
1785
 
1786
      if (type & N_STAB)
1787
        {
1788
          process_one_symbol (type, nlist.n_desc, nlist.n_value,
1789
                              namestring, section_offsets, objfile);
1790
        }
1791
      /* We skip checking for a new .o or -l file; that should never
1792
         happen in this routine. */
1793
      else if (type == N_TEXT)
1794
        {
1795
          /* I don't think this code will ever be executed, because
1796
             the GCC_COMPILED_FLAG_SYMBOL usually is right before
1797
             the N_SO symbol which starts this source file.
1798
             However, there is no reason not to accept
1799
             the GCC_COMPILED_FLAG_SYMBOL anywhere.  */
1800
 
1801
          if (STREQ (namestring, GCC_COMPILED_FLAG_SYMBOL))
1802
            processing_gcc_compilation = 1;
1803
          else if (STREQ (namestring, GCC2_COMPILED_FLAG_SYMBOL))
1804
            processing_gcc_compilation = 2;
1805
 
1806
#if 0
1807
          /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
1808
             know whether it will use the old style or v3 mangling.  */
1809
          if (AUTO_DEMANGLING)
1810
            {
1811
              set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
1812
            }
1813
#endif
1814
        }
1815
      else if (type & N_EXT || type == (unsigned char) N_TEXT
1816
               || type == (unsigned char) N_NBTEXT
1817
        )
1818
        {
1819
          /* Global symbol: see if we came across a dbx defintion for
1820
             a corresponding symbol.  If so, store the value.  Remove
1821
             syms from the chain when their values are stored, but
1822
             search the whole chain, as there may be several syms from
1823
             different files with the same name. */
1824
          /* This is probably not true.  Since the files will be read
1825
             in one at a time, each reference to a global symbol will
1826
             be satisfied in each file as it appears. So we skip this
1827
             section. */
1828
          ;
1829
        }
1830
    }
1831
 
1832
  current_objfile = NULL;
1833
 
1834
  /* In a Solaris elf file, this variable, which comes from the
1835
     value of the N_SO symbol, will still be 0.  Luckily, text_offset,
1836
     which comes from pst->textlow is correct. */
1837
  if (last_source_start_addr == 0)
1838
    last_source_start_addr = text_offset;
1839
 
1840
  /* In reordered executables last_source_start_addr may not be the
1841
     lower bound for this symtab, instead use text_offset which comes
1842
     from pst->textlow which is correct.  */
1843
  if (last_source_start_addr > text_offset)
1844
    last_source_start_addr = text_offset;
1845
 
1846
  pst->symtab = end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
1847
 
1848
  /* Process items which we had to "process_later" due to dependencies
1849
     on other stabs.  */
1850
  process_now (objfile);
1851
 
1852
  end_stabs ();
1853
}
1854
 
1855
 
1856
/* This handles a single symbol from the symbol-file, building symbols
1857
   into a GDB symtab.  It takes these arguments and an implicit argument.
1858
 
1859
   TYPE is the type field of the ".stab" symbol entry.
1860
   DESC is the desc field of the ".stab" entry.
1861
   VALU is the value field of the ".stab" entry.
1862
   NAME is the symbol name, in our address space.
1863
   SECTION_OFFSETS is a set of amounts by which the sections of this object
1864
   file were relocated when it was loaded into memory.
1865
   Note that these section_offsets are not the
1866
   objfile->section_offsets but the pst->section_offsets.
1867
   All symbols that refer
1868
   to memory locations need to be offset by these amounts.
1869
   OBJFILE is the object file from which we are reading symbols.
1870
   It is used in end_symtab.  */
1871
 
1872
void
1873
process_one_symbol (int type, int desc, CORE_ADDR valu, char *name,
1874
                    struct section_offsets *section_offsets,
1875
                    struct objfile *objfile)
1876
{
1877
#ifdef SUN_FIXED_LBRAC_BUG
1878
  /* If SUN_FIXED_LBRAC_BUG is defined, then it tells us whether we need
1879
     to correct the address of N_LBRAC's.  If it is not defined, then
1880
     we never need to correct the addresses.  */
1881
 
1882
  /* This records the last pc address we've seen.  We depend on there being
1883
     an SLINE or FUN or SO before the first LBRAC, since the variable does
1884
     not get reset in between reads of different symbol files.  */
1885
  static CORE_ADDR last_pc_address;
1886
#endif
1887
 
1888
  register struct context_stack *new;
1889
  /* This remembers the address of the start of a function.  It is used
1890
     because in Solaris 2, N_LBRAC, N_RBRAC, and N_SLINE entries are
1891
     relative to the current function's start address.  On systems
1892
     other than Solaris 2, this just holds the SECT_OFF_TEXT value, and is
1893
     used to relocate these symbol types rather than SECTION_OFFSETS.  */
1894
  static CORE_ADDR function_start_offset;
1895
 
1896
  /* If this is nonzero, we've seen a non-gcc N_OPT symbol for this source
1897
     file.  Used to detect the SunPRO solaris compiler.  */
1898
  static int n_opt_found;
1899
 
1900
  /* The stab type used for the definition of the last function.
1901
     N_STSYM or N_GSYM for SunOS4 acc; N_FUN for other compilers.  */
1902
  static int function_stab_type = 0;
1903
 
1904
  if (!block_address_function_relative)
1905
    /* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
1906
       function start address, so just use the text offset.  */
1907
    function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1908
 
1909
  /* Something is wrong if we see real data before
1910
     seeing a source file name.  */
1911
 
1912
  if (last_source_file == NULL && type != (unsigned char) N_SO)
1913
    {
1914
      /* Ignore any symbols which appear before an N_SO symbol.
1915
         Currently no one puts symbols there, but we should deal
1916
         gracefully with the case.  A complain()t might be in order,
1917
         but this should not be an error ().  */
1918
      return;
1919
    }
1920
 
1921
  switch (type)
1922
    {
1923
    case N_FUN:
1924
    case N_FNAME:
1925
 
1926
      if (*name == '\000')
1927
        {
1928
          /* This N_FUN marks the end of a function.  This closes off the
1929
             current block.  */
1930
          within_function = 0;
1931
          new = pop_context ();
1932
 
1933
          /* Make a block for the local symbols within.  */
1934
          finish_block (new->name, &local_symbols, new->old_blocks,
1935
                        new->start_addr, new->start_addr + valu,
1936
                        objfile);
1937
 
1938
          /* May be switching to an assembler file which may not be using
1939
             block relative stabs, so reset the offset.  */
1940
          if (block_address_function_relative)
1941
            function_start_offset = 0;
1942
 
1943
          break;
1944
        }
1945
 
1946
      /* Relocate for dynamic loading */
1947
      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1948
#ifdef SMASH_TEXT_ADDRESS
1949
      SMASH_TEXT_ADDRESS (valu);
1950
#endif
1951
      goto define_a_symbol;
1952
 
1953
    case N_LBRAC:
1954
      /* This "symbol" just indicates the start of an inner lexical
1955
         context within a function.  */
1956
 
1957
      /* Ignore extra outermost context from SunPRO cc and acc.  */
1958
      if (n_opt_found && desc == 1)
1959
        break;
1960
 
1961
      if (block_address_function_relative)
1962
        /* Relocate for Sun ELF acc fn-relative syms.  */
1963
        valu += function_start_offset;
1964
      else
1965
        /* On most machines, the block addresses are relative to the
1966
           N_SO, the linker did not relocate them (sigh).  */
1967
        valu += last_source_start_addr;
1968
 
1969
#ifdef SUN_FIXED_LBRAC_BUG
1970
      if (!SUN_FIXED_LBRAC_BUG && valu < last_pc_address)
1971
        {
1972
          /* Patch current LBRAC pc value to match last handy pc value */
1973
          complain (&lbrac_complaint);
1974
          valu = last_pc_address;
1975
        }
1976
#endif
1977
      new = push_context (desc, valu);
1978
      break;
1979
 
1980
    case N_RBRAC:
1981
      /* This "symbol" just indicates the end of an inner lexical
1982
         context that was started with N_LBRAC.  */
1983
 
1984
      /* Ignore extra outermost context from SunPRO cc and acc.  */
1985
      if (n_opt_found && desc == 1)
1986
        break;
1987
 
1988
      if (block_address_function_relative)
1989
        /* Relocate for Sun ELF acc fn-relative syms.  */
1990
        valu += function_start_offset;
1991
      else
1992
        /* On most machines, the block addresses are relative to the
1993
           N_SO, the linker did not relocate them (sigh).  */
1994
        valu += last_source_start_addr;
1995
 
1996
      new = pop_context ();
1997
      if (desc != new->depth)
1998
        complain (&lbrac_mismatch_complaint, symnum);
1999
 
2000
      /* Some compilers put the variable decls inside of an
2001
         LBRAC/RBRAC block.  This macro should be nonzero if this
2002
         is true.  DESC is N_DESC from the N_RBRAC symbol.
2003
         GCC_P is true if we've detected the GCC_COMPILED_SYMBOL
2004
         or the GCC2_COMPILED_SYMBOL.  */
2005
#if !defined (VARIABLES_INSIDE_BLOCK)
2006
#define VARIABLES_INSIDE_BLOCK(desc, gcc_p) 0
2007
#endif
2008
 
2009
      /* Can only use new->locals as local symbols here if we're in
2010
         gcc or on a machine that puts them before the lbrack.  */
2011
      if (!VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2012
        local_symbols = new->locals;
2013
 
2014
      if (context_stack_depth
2015
          > !VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2016
        {
2017
          /* This is not the outermost LBRAC...RBRAC pair in the function,
2018
             its local symbols preceded it, and are the ones just recovered
2019
             from the context stack.  Define the block for them (but don't
2020
             bother if the block contains no symbols.  Should we complain
2021
             on blocks without symbols?  I can't think of any useful purpose
2022
             for them).  */
2023
          if (local_symbols != NULL)
2024
            {
2025
              /* Muzzle a compiler bug that makes end < start.  (which
2026
                 compilers?  Is this ever harmful?).  */
2027
              if (new->start_addr > valu)
2028
                {
2029
                  complain (&lbrac_rbrac_complaint);
2030
                  new->start_addr = valu;
2031
                }
2032
              /* Make a block for the local symbols within.  */
2033
              finish_block (0, &local_symbols, new->old_blocks,
2034
                            new->start_addr, valu, objfile);
2035
            }
2036
        }
2037
      else
2038
        {
2039
          /* This is the outermost LBRAC...RBRAC pair.  There is no
2040
             need to do anything; leave the symbols that preceded it
2041
             to be attached to the function's own block.  We need to
2042
             indicate that we just moved outside of the function.  */
2043
          within_function = 0;
2044
        }
2045
 
2046
      if (VARIABLES_INSIDE_BLOCK (desc, processing_gcc_compilation))
2047
        /* Now pop locals of block just finished.  */
2048
        local_symbols = new->locals;
2049
      break;
2050
 
2051
    case N_FN:
2052
    case N_FN_SEQ:
2053
      /* This kind of symbol indicates the start of an object file.  */
2054
      /* Relocate for dynamic loading */
2055
      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2056
      break;
2057
 
2058
    case N_SO:
2059
      /* This type of symbol indicates the start of data
2060
         for one source file.
2061
         Finish the symbol table of the previous source file
2062
         (if any) and start accumulating a new symbol table.  */
2063
      /* Relocate for dynamic loading */
2064
      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2065
 
2066
      n_opt_found = 0;
2067
 
2068
#ifdef SUN_FIXED_LBRAC_BUG
2069
      last_pc_address = valu;   /* Save for SunOS bug circumcision */
2070
#endif
2071
 
2072
#ifdef PCC_SOL_BROKEN
2073
      /* pcc bug, occasionally puts out SO for SOL.  */
2074
      if (context_stack_depth > 0)
2075
        {
2076
          start_subfile (name, NULL);
2077
          break;
2078
        }
2079
#endif
2080
      if (last_source_file)
2081
        {
2082
          /* Check if previous symbol was also an N_SO (with some
2083
             sanity checks).  If so, that one was actually the directory
2084
             name, and the current one is the real file name.
2085
             Patch things up. */
2086
          if (previous_stab_code == (unsigned char) N_SO)
2087
            {
2088
              patch_subfile_names (current_subfile, name);
2089
              break;            /* Ignore repeated SOs */
2090
            }
2091
          end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
2092
          end_stabs ();
2093
        }
2094
 
2095
      /* Null name means this just marks the end of text for this .o file.
2096
         Don't start a new symtab in this case.  */
2097
      if (*name == '\000')
2098
        break;
2099
 
2100
      if (block_address_function_relative)
2101
        function_start_offset = 0;
2102
 
2103
      start_stabs ();
2104
      start_symtab (name, NULL, valu);
2105
      record_debugformat ("stabs");
2106
      break;
2107
 
2108
    case N_SOL:
2109
      /* This type of symbol indicates the start of data for
2110
         a sub-source-file, one whose contents were copied or
2111
         included in the compilation of the main source file
2112
         (whose name was given in the N_SO symbol.)  */
2113
      /* Relocate for dynamic loading */
2114
      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2115
      start_subfile (name, current_subfile->dirname);
2116
      break;
2117
 
2118
    case N_BINCL:
2119
      push_subfile ();
2120
      add_new_header_file (name, valu);
2121
      start_subfile (name, current_subfile->dirname);
2122
      break;
2123
 
2124
    case N_EINCL:
2125
      start_subfile (pop_subfile (), current_subfile->dirname);
2126
      break;
2127
 
2128
    case N_EXCL:
2129
      add_old_header_file (name, valu);
2130
      break;
2131
 
2132
    case N_SLINE:
2133
      /* This type of "symbol" really just records
2134
         one line-number -- core-address correspondence.
2135
         Enter it in the line list for this symbol table.  */
2136
 
2137
      /* Relocate for dynamic loading and for ELF acc fn-relative syms.  */
2138
      valu += function_start_offset;
2139
 
2140
#ifdef SUN_FIXED_LBRAC_BUG
2141
      last_pc_address = valu;   /* Save for SunOS bug circumcision */
2142
#endif
2143
      record_line (current_subfile, desc, valu);
2144
      break;
2145
 
2146
    case N_BCOMM:
2147
      common_block_start (name, objfile);
2148
      break;
2149
 
2150
    case N_ECOMM:
2151
      common_block_end (objfile);
2152
      break;
2153
 
2154
      /* The following symbol types need to have the appropriate offset added
2155
         to their value; then we process symbol definitions in the name.  */
2156
 
2157
    case N_STSYM:               /* Static symbol in data seg */
2158
    case N_LCSYM:               /* Static symbol in BSS seg */
2159
    case N_ROSYM:               /* Static symbol in Read-only data seg */
2160
      /* HORRID HACK DEPT.  However, it's Sun's furgin' fault.
2161
         Solaris2's stabs-in-elf makes *most* symbols relative
2162
         but leaves a few absolute (at least for Solaris 2.1 and version
2163
         2.0.1 of the SunPRO compiler).  N_STSYM and friends sit on the fence.
2164
         .stab "foo:S...",N_STSYM        is absolute (ld relocates it)
2165
         .stab "foo:V...",N_STSYM        is relative (section base subtracted).
2166
         This leaves us no choice but to search for the 'S' or 'V'...
2167
         (or pass the whole section_offsets stuff down ONE MORE function
2168
         call level, which we really don't want to do).  */
2169
      {
2170
        char *p;
2171
 
2172
        /* .o files and NLMs have non-zero text seg offsets, but don't need
2173
           their static syms offset in this fashion.  XXX - This is really a
2174
           crock that should be fixed in the solib handling code so that I
2175
           don't have to work around it here. */
2176
 
2177
        if (!symfile_relocatable)
2178
          {
2179
            p = strchr (name, ':');
2180
            if (p != 0 && p[1] == 'S')
2181
              {
2182
                /* The linker relocated it.  We don't want to add an
2183
                   elfstab_offset_sections-type offset, but we *do* want
2184
                   to add whatever solib.c passed to symbol_file_add as
2185
                   addr (this is known to affect SunOS4, and I suspect ELF
2186
                   too).  Since elfstab_offset_sections currently does not
2187
                   muck with the text offset (there is no Ttext.text
2188
                   symbol), we can get addr from the text offset.  If
2189
                   elfstab_offset_sections ever starts dealing with the
2190
                   text offset, and we still need to do this, we need to
2191
                   invent a SECT_OFF_ADDR_KLUDGE or something.  */
2192
                valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2193
                goto define_a_symbol;
2194
              }
2195
          }
2196
        /* Since it's not the kludge case, re-dispatch to the right handler. */
2197
        switch (type)
2198
          {
2199
          case N_STSYM:
2200
            goto case_N_STSYM;
2201
          case N_LCSYM:
2202
            goto case_N_LCSYM;
2203
          case N_ROSYM:
2204
            goto case_N_ROSYM;
2205
          default:
2206
            internal_error (__FILE__, __LINE__, "failed internal consistency check");
2207
          }
2208
      }
2209
 
2210
    case_N_STSYM:               /* Static symbol in data seg */
2211
    case N_DSLINE:              /* Source line number, data seg */
2212
      valu += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
2213
      goto define_a_symbol;
2214
 
2215
    case_N_LCSYM:               /* Static symbol in BSS seg */
2216
    case N_BSLINE:              /* Source line number, bss seg */
2217
      /*   N_BROWS:       overlaps with N_BSLINE */
2218
      valu += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
2219
      goto define_a_symbol;
2220
 
2221
    case_N_ROSYM:               /* Static symbol in Read-only data seg */
2222
      valu += ANOFFSET (section_offsets, SECT_OFF_RODATA (objfile));
2223
      goto define_a_symbol;
2224
 
2225
    case N_ENTRY:               /* Alternate entry point */
2226
      /* Relocate for dynamic loading */
2227
      valu += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
2228
      goto define_a_symbol;
2229
 
2230
      /* The following symbol types we don't know how to process.  Handle
2231
         them in a "default" way, but complain to people who care.  */
2232
    default:
2233
    case N_CATCH:               /* Exception handler catcher */
2234
    case N_EHDECL:              /* Exception handler name */
2235
    case N_PC:                  /* Global symbol in Pascal */
2236
    case N_M2C:         /* Modula-2 compilation unit */
2237
      /*   N_MOD2:        overlaps with N_EHDECL */
2238
    case N_SCOPE:               /* Modula-2 scope information */
2239
    case N_ECOML:               /* End common (local name) */
2240
    case N_NBTEXT:              /* Gould Non-Base-Register symbols??? */
2241
    case N_NBDATA:
2242
    case N_NBBSS:
2243
    case N_NBSTS:
2244
    case N_NBLCS:
2245
      complain (&unknown_symtype_complaint, local_hex_string (type));
2246
      /* FALLTHROUGH */
2247
 
2248
      /* The following symbol types don't need the address field relocated,
2249
         since it is either unused, or is absolute.  */
2250
    define_a_symbol:
2251
    case N_GSYM:                /* Global variable */
2252
    case N_NSYMS:               /* Number of symbols (ultrix) */
2253
    case N_NOMAP:               /* No map?  (ultrix) */
2254
    case N_RSYM:                /* Register variable */
2255
    case N_DEFD:                /* Modula-2 GNU module dependency */
2256
    case N_SSYM:                /* Struct or union element */
2257
    case N_LSYM:                /* Local symbol in stack */
2258
    case N_PSYM:                /* Parameter variable */
2259
    case N_LENG:                /* Length of preceding symbol type */
2260
      if (name)
2261
        {
2262
          int deftype;
2263
          char *colon_pos = strchr (name, ':');
2264
          if (colon_pos == NULL)
2265
            deftype = '\0';
2266
          else
2267
            deftype = colon_pos[1];
2268
 
2269
          switch (deftype)
2270
            {
2271
            case 'f':
2272
            case 'F':
2273
              function_stab_type = type;
2274
 
2275
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
2276
              /* Deal with the SunPRO 3.0 compiler which omits the address
2277
                 from N_FUN symbols.  */
2278
              if (type == N_FUN
2279
                  && valu == ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile)))
2280
                valu =
2281
                  find_stab_function_addr (name, last_source_file, objfile);
2282
#endif
2283
 
2284
#ifdef SUN_FIXED_LBRAC_BUG
2285
              /* The Sun acc compiler, under SunOS4, puts out
2286
                 functions with N_GSYM or N_STSYM.  The problem is
2287
                 that the address of the symbol is no good (for N_GSYM
2288
                 it doesn't even attept an address; for N_STSYM it
2289
                 puts out an address but then it gets relocated
2290
                 relative to the data segment, not the text segment).
2291
                 Currently we can't fix this up later as we do for
2292
                 some types of symbol in scan_file_globals.
2293
                 Fortunately we do have a way of finding the address -
2294
                 we know that the value in last_pc_address is either
2295
                 the one we want (if we're dealing with the first
2296
                 function in an object file), or somewhere in the
2297
                 previous function. This means that we can use the
2298
                 minimal symbol table to get the address.  */
2299
 
2300
              /* Starting with release 3.0, the Sun acc compiler,
2301
                 under SunOS4, puts out functions with N_FUN and a value
2302
                 of zero. This gets relocated to the start of the text
2303
                 segment of the module, which is no good either.
2304
                 Under SunOS4 we can deal with this as N_SLINE and N_SO
2305
                 entries contain valid absolute addresses.
2306
                 Release 3.0 acc also puts out N_OPT entries, which makes
2307
                 it possible to discern acc from cc or gcc.  */
2308
 
2309
              if (type == N_GSYM || type == N_STSYM
2310
                  || (type == N_FUN
2311
                      && n_opt_found && !block_address_function_relative))
2312
                {
2313
                  struct minimal_symbol *m;
2314
                  int l = colon_pos - name;
2315
 
2316
                  m = lookup_minimal_symbol_by_pc (last_pc_address);
2317
                  if (m && STREQN (SYMBOL_NAME (m), name, l)
2318
                      && SYMBOL_NAME (m)[l] == '\0')
2319
                    /* last_pc_address was in this function */
2320
                    valu = SYMBOL_VALUE (m);
2321
                  else if (m && SYMBOL_NAME (m + 1)
2322
                           && STREQN (SYMBOL_NAME (m + 1), name, l)
2323
                           && SYMBOL_NAME (m + 1)[l] == '\0')
2324
                    /* last_pc_address was in last function */
2325
                    valu = SYMBOL_VALUE (m + 1);
2326
                  else
2327
                    /* Not found - use last_pc_address (for finish_block) */
2328
                    valu = last_pc_address;
2329
                }
2330
 
2331
              last_pc_address = valu;   /* Save for SunOS bug circumcision */
2332
#endif
2333
 
2334
              if (block_address_function_relative)
2335
                /* For Solaris 2.0 compilers, the block addresses and
2336
                   N_SLINE's are relative to the start of the
2337
                   function.  On normal systems, and when using gcc on
2338
                   Solaris 2.0, these addresses are just absolute, or
2339
                   relative to the N_SO, depending on
2340
                   BLOCK_ADDRESS_ABSOLUTE.  */
2341
                function_start_offset = valu;
2342
 
2343
              within_function = 1;
2344
 
2345
              if (context_stack_depth > 1)
2346
                {
2347
                  complain (&lbrac_unmatched_complaint, symnum);
2348
                  break;
2349
                }
2350
 
2351
              if (context_stack_depth > 0)
2352
                {
2353
                  new = pop_context ();
2354
                  /* Make a block for the local symbols within.  */
2355
                  finish_block (new->name, &local_symbols, new->old_blocks,
2356
                                new->start_addr, valu, objfile);
2357
                }
2358
 
2359
              new = push_context (0, valu);
2360
              new->name = define_symbol (valu, name, desc, type, objfile);
2361
              break;
2362
 
2363
            default:
2364
              define_symbol (valu, name, desc, type, objfile);
2365
              break;
2366
            }
2367
        }
2368
      break;
2369
 
2370
      /* We use N_OPT to carry the gcc2_compiled flag.  Sun uses it
2371
         for a bunch of other flags, too.  Someday we may parse their
2372
         flags; for now we ignore theirs and hope they'll ignore ours.  */
2373
    case N_OPT:         /* Solaris 2:  Compiler options */
2374
      if (name)
2375
        {
2376
          if (STREQ (name, GCC2_COMPILED_FLAG_SYMBOL))
2377
            {
2378
              processing_gcc_compilation = 2;
2379
#if 0                           /* Works, but is experimental.  -fnf */
2380
              /* For now, stay with AUTO_DEMANGLING for g++ output, as we don't
2381
                 know whether it will use the old style or v3 mangling.  */
2382
              if (AUTO_DEMANGLING)
2383
                {
2384
                  set_demangling_style (GNU_DEMANGLING_STYLE_STRING);
2385
                }
2386
#endif
2387
            }
2388
          else
2389
            n_opt_found = 1;
2390
        }
2391
      break;
2392
 
2393
      /* The following symbol types can be ignored.  */
2394
    case N_OBJ:         /* Solaris 2:  Object file dir and name */
2395
      /*   N_UNDF:                   Solaris 2:  file separator mark */
2396
      /*   N_UNDF: -- we will never encounter it, since we only process one
2397
         file's symbols at once.  */
2398
    case N_ENDM:                /* Solaris 2:  End of module */
2399
    case N_MAIN:                /* Name of main routine.  */
2400
    case N_ALIAS:               /* SunPro F77: alias name, ignore for now.  */
2401
      break;
2402
    }
2403
 
2404
  /* '#' is a GNU C extension to allow one symbol to refer to another
2405
     related symbol.
2406
 
2407
     Generally this is used so that an alias can refer to its main
2408
     symbol.  */
2409
  if (name[0] == '#')
2410
    {
2411
      /* Initialize symbol reference names and determine if this is
2412
         a definition.  If symbol reference is being defined, go
2413
         ahead and add it.  Otherwise, just return sym. */
2414
 
2415
      char *s = name;
2416
      int refnum;
2417
 
2418
      /* If this stab defines a new reference ID that is not on the
2419
         reference list, then put it on the reference list.
2420
 
2421
         We go ahead and advance NAME past the reference, even though
2422
         it is not strictly necessary at this time.  */
2423
      refnum = symbol_reference_defined (&s);
2424
      if (refnum >= 0)
2425
        if (!ref_search (refnum))
2426
          ref_add (refnum, 0, name, valu);
2427
      name = s;
2428
    }
2429
 
2430
 
2431
  previous_stab_code = type;
2432
}
2433
 
2434
/* FIXME: The only difference between this and elfstab_build_psymtabs
2435
   is the call to install_minimal_symbols for elf, and the support for
2436
   split sections.  If the differences are really that small, the code
2437
   should be shared.  */
2438
 
2439
/* Scan and build partial symbols for an coff symbol file.
2440
   The coff file has already been processed to get its minimal symbols.
2441
 
2442
   This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2443
   rolled into one.
2444
 
2445
   OBJFILE is the object file we are reading symbols from.
2446
   ADDR is the address relative to which the symbols are (e.g.
2447
   the base address of the text segment).
2448
   MAINLINE is true if we are reading the main symbol
2449
   table (as opposed to a shared lib or dynamically loaded file).
2450
   TEXTADDR is the address of the text section.
2451
   TEXTSIZE is the size of the text section.
2452
   STABSECTS is the list of .stab sections in OBJFILE.
2453
   STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2454
   .stabstr section exists.
2455
 
2456
   This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2457
   adjusted for coff details. */
2458
 
2459
void
2460
coffstab_build_psymtabs (struct objfile *objfile, int mainline,
2461
                         CORE_ADDR textaddr, unsigned int textsize,
2462
                         struct stab_section_list *stabsects,
2463
                         file_ptr stabstroffset, unsigned int stabstrsize)
2464
{
2465
  int val;
2466
  bfd *sym_bfd = objfile->obfd;
2467
  char *name = bfd_get_filename (sym_bfd);
2468
  struct dbx_symfile_info *info;
2469
  unsigned int stabsize;
2470
 
2471
  /* There is already a dbx_symfile_info allocated by our caller.
2472
     It might even contain some info from the coff symtab to help us.  */
2473
  info = objfile->sym_stab_info;
2474
 
2475
  DBX_TEXT_ADDR (objfile) = textaddr;
2476
  DBX_TEXT_SIZE (objfile) = textsize;
2477
 
2478
#define COFF_STABS_SYMBOL_SIZE  12      /* XXX FIXME XXX */
2479
  DBX_SYMBOL_SIZE (objfile) = COFF_STABS_SYMBOL_SIZE;
2480
  DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2481
 
2482
  if (stabstrsize > bfd_get_size (sym_bfd))
2483
    error ("ridiculous string table size: %d bytes", stabstrsize);
2484
  DBX_STRINGTAB (objfile) = (char *)
2485
    obstack_alloc (&objfile->psymbol_obstack, stabstrsize + 1);
2486
  OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
2487
 
2488
  /* Now read in the string table in one big gulp.  */
2489
 
2490
  val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2491
  if (val < 0)
2492
    perror_with_name (name);
2493
  val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2494
  if (val != stabstrsize)
2495
    perror_with_name (name);
2496
 
2497
  stabsread_new_init ();
2498
  buildsym_new_init ();
2499
  free_header_files ();
2500
  init_header_files ();
2501
 
2502
  processing_acc_compilation = 1;
2503
 
2504
  /* In a coff file, we've already installed the minimal symbols that came
2505
     from the coff (non-stab) symbol table, so always act like an
2506
     incremental load here. */
2507
  if (stabsects->next == NULL)
2508
    {
2509
      stabsize = bfd_section_size (sym_bfd, stabsects->section);
2510
      DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2511
      DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2512
    }
2513
  else
2514
    {
2515
      struct stab_section_list *stabsect;
2516
 
2517
      DBX_SYMCOUNT (objfile) = 0;
2518
      for (stabsect = stabsects; stabsect != NULL; stabsect = stabsect->next)
2519
        {
2520
          stabsize = bfd_section_size (sym_bfd, stabsect->section);
2521
          DBX_SYMCOUNT (objfile) += stabsize / DBX_SYMBOL_SIZE (objfile);
2522
        }
2523
 
2524
      DBX_SYMTAB_OFFSET (objfile) = stabsects->section->filepos;
2525
 
2526
      symbuf_sections = stabsects->next;
2527
      symbuf_left = bfd_section_size (sym_bfd, stabsects->section);
2528
      symbuf_read = 0;
2529
    }
2530
 
2531
  dbx_symfile_read (objfile, 0);
2532
}
2533
 
2534
/* Scan and build partial symbols for an ELF symbol file.
2535
   This ELF file has already been processed to get its minimal symbols,
2536
   and any DWARF symbols that were in it.
2537
 
2538
   This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2539
   rolled into one.
2540
 
2541
   OBJFILE is the object file we are reading symbols from.
2542
   ADDR is the address relative to which the symbols are (e.g.
2543
   the base address of the text segment).
2544
   MAINLINE is true if we are reading the main symbol
2545
   table (as opposed to a shared lib or dynamically loaded file).
2546
   STABOFFSET and STABSIZE define the location in OBJFILE where the .stab
2547
   section exists.
2548
   STABSTROFFSET and STABSTRSIZE define the location in OBJFILE where the
2549
   .stabstr section exists.
2550
 
2551
   This routine is mostly copied from dbx_symfile_init and dbx_symfile_read,
2552
   adjusted for elf details. */
2553
 
2554
void
2555
elfstab_build_psymtabs (struct objfile *objfile, int mainline,
2556
                        file_ptr staboffset, unsigned int stabsize,
2557
                        file_ptr stabstroffset, unsigned int stabstrsize)
2558
{
2559
  int val;
2560
  bfd *sym_bfd = objfile->obfd;
2561
  char *name = bfd_get_filename (sym_bfd);
2562
  struct dbx_symfile_info *info;
2563
 
2564
  /* There is already a dbx_symfile_info allocated by our caller.
2565
     It might even contain some info from the ELF symtab to help us.  */
2566
  info = objfile->sym_stab_info;
2567
 
2568
  /* Find the first and last text address.  dbx_symfile_read seems to
2569
     want this.  */
2570
  find_text_range (sym_bfd, objfile);
2571
 
2572
#define ELF_STABS_SYMBOL_SIZE   12      /* XXX FIXME XXX */
2573
  DBX_SYMBOL_SIZE (objfile) = ELF_STABS_SYMBOL_SIZE;
2574
  DBX_SYMCOUNT (objfile) = stabsize / DBX_SYMBOL_SIZE (objfile);
2575
  DBX_STRINGTAB_SIZE (objfile) = stabstrsize;
2576
  DBX_SYMTAB_OFFSET (objfile) = staboffset;
2577
 
2578
  if (stabstrsize > bfd_get_size (sym_bfd))
2579
    error ("ridiculous string table size: %d bytes", stabstrsize);
2580
  DBX_STRINGTAB (objfile) = (char *)
2581
    obstack_alloc (&objfile->psymbol_obstack, stabstrsize + 1);
2582
  OBJSTAT (objfile, sz_strtab += stabstrsize + 1);
2583
 
2584
  /* Now read in the string table in one big gulp.  */
2585
 
2586
  val = bfd_seek (sym_bfd, stabstroffset, SEEK_SET);
2587
  if (val < 0)
2588
    perror_with_name (name);
2589
  val = bfd_read (DBX_STRINGTAB (objfile), stabstrsize, 1, sym_bfd);
2590
  if (val != stabstrsize)
2591
    perror_with_name (name);
2592
 
2593
  stabsread_new_init ();
2594
  buildsym_new_init ();
2595
  free_header_files ();
2596
  init_header_files ();
2597
  install_minimal_symbols (objfile);
2598
 
2599
  processing_acc_compilation = 1;
2600
 
2601
  /* In an elf file, we've already installed the minimal symbols that came
2602
     from the elf (non-stab) symbol table, so always act like an
2603
     incremental load here. */
2604
  dbx_symfile_read (objfile, 0);
2605
}
2606
 
2607
/* Scan and build partial symbols for a file with special sections for stabs
2608
   and stabstrings.  The file has already been processed to get its minimal
2609
   symbols, and any other symbols that might be necessary to resolve GSYMs.
2610
 
2611
   This routine is the equivalent of dbx_symfile_init and dbx_symfile_read
2612
   rolled into one.
2613
 
2614
   OBJFILE is the object file we are reading symbols from.
2615
   ADDR is the address relative to which the symbols are (e.g. the base address
2616
   of the text segment).
2617
   MAINLINE is true if we are reading the main symbol table (as opposed to a
2618
   shared lib or dynamically loaded file).
2619
   STAB_NAME is the name of the section that contains the stabs.
2620
   STABSTR_NAME is the name of the section that contains the stab strings.
2621
 
2622
   This routine is mostly copied from dbx_symfile_init and dbx_symfile_read. */
2623
 
2624
void
2625
stabsect_build_psymtabs (struct objfile *objfile, int mainline, char *stab_name,
2626
                         char *stabstr_name, char *text_name)
2627
{
2628
  int val;
2629
  bfd *sym_bfd = objfile->obfd;
2630
  char *name = bfd_get_filename (sym_bfd);
2631
  asection *stabsect;
2632
  asection *stabstrsect;
2633
  asection *text_sect;
2634
 
2635
  stabsect = bfd_get_section_by_name (sym_bfd, stab_name);
2636
  stabstrsect = bfd_get_section_by_name (sym_bfd, stabstr_name);
2637
 
2638
  if (!stabsect)
2639
    return;
2640
 
2641
  if (!stabstrsect)
2642
    error ("stabsect_build_psymtabs:  Found stabs (%s), but not string section (%s)",
2643
           stab_name, stabstr_name);
2644
 
2645
  objfile->sym_stab_info = (struct dbx_symfile_info *)
2646
    xmalloc (sizeof (struct dbx_symfile_info));
2647
  memset (objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
2648
 
2649
  text_sect = bfd_get_section_by_name (sym_bfd, text_name);
2650
  if (!text_sect)
2651
    error ("Can't find %s section in symbol file", text_name);
2652
  DBX_TEXT_ADDR (objfile) = bfd_section_vma (sym_bfd, text_sect);
2653
  DBX_TEXT_SIZE (objfile) = bfd_section_size (sym_bfd, text_sect);
2654
 
2655
  DBX_SYMBOL_SIZE (objfile) = sizeof (struct external_nlist);
2656
  DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
2657
    / DBX_SYMBOL_SIZE (objfile);
2658
  DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stabstrsect);
2659
  DBX_SYMTAB_OFFSET (objfile) = stabsect->filepos;      /* XXX - FIXME: POKING INSIDE BFD DATA STRUCTURES */
2660
 
2661
  if (DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
2662
    error ("ridiculous string table size: %d bytes", DBX_STRINGTAB_SIZE (objfile));
2663
  DBX_STRINGTAB (objfile) = (char *)
2664
    obstack_alloc (&objfile->psymbol_obstack, DBX_STRINGTAB_SIZE (objfile) + 1);
2665
  OBJSTAT (objfile, sz_strtab += DBX_STRINGTAB_SIZE (objfile) + 1);
2666
 
2667
  /* Now read in the string table in one big gulp.  */
2668
 
2669
  val = bfd_get_section_contents (sym_bfd,      /* bfd */
2670
                                  stabstrsect,  /* bfd section */
2671
                                  DBX_STRINGTAB (objfile),      /* input buffer */
2672
                                  0,     /* offset into section */
2673
                                  DBX_STRINGTAB_SIZE (objfile));        /* amount to read */
2674
 
2675
  if (!val)
2676
    perror_with_name (name);
2677
 
2678
  stabsread_new_init ();
2679
  buildsym_new_init ();
2680
  free_header_files ();
2681
  init_header_files ();
2682
  install_minimal_symbols (objfile);
2683
 
2684
  /* Now, do an incremental load */
2685
 
2686
  processing_acc_compilation = 1;
2687
  dbx_symfile_read (objfile, 0);
2688
}
2689
 
2690
static struct sym_fns aout_sym_fns =
2691
{
2692
  bfd_target_aout_flavour,
2693
  dbx_new_init,                 /* sym_new_init: init anything gbl to entire symtab */
2694
  dbx_symfile_init,             /* sym_init: read initial info, setup for sym_read() */
2695
  dbx_symfile_read,             /* sym_read: read a symbol file into symtab */
2696
  dbx_symfile_finish,           /* sym_finish: finished with file, cleanup */
2697
  default_symfile_offsets,      /* sym_offsets: parse user's offsets to internal form */
2698
  NULL                          /* next: pointer to next struct sym_fns */
2699
};
2700
 
2701
void
2702
_initialize_dbxread (void)
2703
{
2704
  add_symtab_fns (&aout_sym_fns);
2705
}

powered by: WebSVN 2.1.0

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