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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [coffread.c] - Blame information for rev 578

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

Line No. Rev Author Line
1 578 markom
/* Read coff symbol tables and convert to internal format, for GDB.
2
   Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
3
   1997, 1998, 1999, 2000
4
   Free Software Foundation, Inc.
5
   Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
6
 
7
   This file is part of GDB.
8
 
9
   This program is free software; you can redistribute it and/or modify
10
   it under the terms of the GNU General Public License as published by
11
   the Free Software Foundation; either version 2 of the License, or
12
   (at your option) any later version.
13
 
14
   This program is distributed in the hope that it will be useful,
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
   GNU General Public License for more details.
18
 
19
   You should have received a copy of the GNU General Public License
20
   along with this program; if not, write to the Free Software
21
   Foundation, Inc., 59 Temple Place - Suite 330,
22
   Boston, MA 02111-1307, USA.  */
23
 
24
#include "defs.h"
25
#include "symtab.h"
26
#include "gdbtypes.h"
27
#include "demangle.h"
28
#include "breakpoint.h"
29
 
30
#include "bfd.h"
31
#include "obstack.h"
32
 
33
#include "gdb_string.h"
34
#include <ctype.h>
35
 
36
#include "coff/internal.h"      /* Internal format of COFF symbols in BFD */
37
#include "libcoff.h"            /* FIXME secret internal data from BFD */
38
 
39
#include "symfile.h"
40
#include "objfiles.h"
41
#include "buildsym.h"
42
#include "gdb-stabs.h"
43
#include "stabsread.h"
44
#include "complaints.h"
45
#include "target.h"
46
#include "gdb_assert.h"
47
 
48
extern void _initialize_coffread (void);
49
 
50
struct coff_symfile_info
51
  {
52
    file_ptr min_lineno_offset; /* Where in file lowest line#s are */
53
    file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
54
 
55
    CORE_ADDR textaddr;         /* Addr of .text section. */
56
    unsigned int textsize;      /* Size of .text section. */
57
    struct stab_section_list *stabsects;        /* .stab sections.  */
58
    asection *stabstrsect;      /* Section pointer for .stab section */
59
    char *stabstrdata;
60
  };
61
 
62
/* Translate an external name string into a user-visible name.  */
63
#define EXTERNAL_NAME(string, abfd) \
64
        (string[0] == bfd_get_symbol_leading_char(abfd)? string+1: string)
65
 
66
/* To be an sdb debug type, type must have at least a basic or primary
67
   derived type.  Using this rather than checking against T_NULL is
68
   said to prevent core dumps if we try to operate on Michael Bloom
69
   dbx-in-coff file.  */
70
 
71
#define SDB_TYPE(type) (BTYPE(type) | (type & N_TMASK))
72
 
73
/* Core address of start and end of text of current source file.
74
   This comes from a ".text" symbol where x_nlinno > 0.  */
75
 
76
static CORE_ADDR current_source_start_addr;
77
static CORE_ADDR current_source_end_addr;
78
 
79
/* The addresses of the symbol table stream and number of symbols
80
   of the object file we are reading (as copied into core).  */
81
 
82
static bfd *nlist_bfd_global;
83
static int nlist_nsyms_global;
84
 
85
 
86
/* Pointers to scratch storage, used for reading raw symbols and auxents.  */
87
 
88
static char *temp_sym;
89
static char *temp_aux;
90
 
91
/* Local variables that hold the shift and mask values for the
92
   COFF file that we are currently reading.  These come back to us
93
   from BFD, and are referenced by their macro names, as well as
94
   internally to the BTYPE, ISPTR, ISFCN, ISARY, ISTAG, and DECREF
95
   macros from include/coff/internal.h .  */
96
 
97
static unsigned local_n_btmask;
98
static unsigned local_n_btshft;
99
static unsigned local_n_tmask;
100
static unsigned local_n_tshift;
101
 
102
#define N_BTMASK        local_n_btmask
103
#define N_BTSHFT        local_n_btshft
104
#define N_TMASK         local_n_tmask
105
#define N_TSHIFT        local_n_tshift
106
 
107
/* Local variables that hold the sizes in the file of various COFF structures.
108
   (We only need to know this to read them from the file -- BFD will then
109
   translate the data in them, into `internal_xxx' structs in the right
110
   byte order, alignment, etc.)  */
111
 
112
static unsigned local_linesz;
113
static unsigned local_symesz;
114
static unsigned local_auxesz;
115
 
116
/* This is set if this is a PE format file.  */
117
 
118
static int pe_file;
119
 
120
/* Chain of typedefs of pointers to empty struct/union types.
121
   They are chained thru the SYMBOL_VALUE_CHAIN.  */
122
 
123
static struct symbol *opaque_type_chain[HASHSIZE];
124
 
125
/* Complaints about various problems in the file being read  */
126
 
127
struct complaint ef_complaint =
128
{"Unmatched .ef symbol(s) ignored starting at symnum %d", 0, 0};
129
 
130
struct complaint ef_stack_complaint =
131
{"`.ef' symbol without matching `.bf' symbol ignored starting at symnum %d", 0, 0};
132
 
133
struct complaint eb_stack_complaint =
134
{"`.eb' symbol without matching `.bb' symbol ignored starting at symnum %d", 0, 0};
135
 
136
struct complaint bf_no_aux_complaint =
137
{"`.bf' symbol %d has no aux entry", 0, 0};
138
 
139
struct complaint ef_no_aux_complaint =
140
{"`.ef' symbol %d has no aux entry", 0, 0};
141
 
142
struct complaint lineno_complaint =
143
{"Line number pointer %d lower than start of line numbers", 0, 0};
144
 
145
struct complaint unexpected_type_complaint =
146
{"Unexpected type for symbol %s", 0, 0};
147
 
148
struct complaint bad_sclass_complaint =
149
{"Bad n_sclass for symbol %s", 0, 0};
150
 
151
struct complaint misordered_blocks_complaint =
152
{"Blocks out of order at address %x", 0, 0};
153
 
154
struct complaint tagndx_bad_complaint =
155
{"Symbol table entry for %s has bad tagndx value", 0, 0};
156
 
157
struct complaint eb_complaint =
158
{"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
159
 
160
/* Simplified internal version of coff symbol table information */
161
 
162
struct coff_symbol
163
  {
164
    char *c_name;
165
    int c_symnum;               /* symbol number of this entry */
166
    int c_naux;                 /* 0 if syment only, 1 if syment + auxent, etc */
167
    long c_value;
168
    int c_sclass;
169
    int c_secnum;
170
    unsigned int c_type;
171
  };
172
 
173
extern void stabsread_clear_cache (void);
174
 
175
static struct type *coff_read_struct_type (int, int, int);
176
 
177
static struct type *decode_base_type (struct coff_symbol *,
178
                                      unsigned int, union internal_auxent *);
179
 
180
static struct type *decode_type (struct coff_symbol *, unsigned int,
181
                                 union internal_auxent *);
182
 
183
static struct type *decode_function_type (struct coff_symbol *,
184
                                          unsigned int,
185
                                          union internal_auxent *);
186
 
187
static struct type *coff_read_enum_type (int, int, int);
188
 
189
static struct symbol *process_coff_symbol (struct coff_symbol *,
190
                                           union internal_auxent *,
191
                                           struct objfile *);
192
 
193
static void patch_opaque_types (struct symtab *);
194
 
195
static void patch_type (struct type *, struct type *);
196
 
197
static void enter_linenos (long, int, int, struct objfile *);
198
 
199
static void free_linetab (void);
200
 
201
static void free_linetab_cleanup (void *ignore);
202
 
203
static int init_lineno (bfd *, long, int);
204
 
205
static char *getsymname (struct internal_syment *);
206
 
207
static char *coff_getfilename (union internal_auxent *);
208
 
209
static void free_stringtab (void);
210
 
211
static void free_stringtab_cleanup (void *ignore);
212
 
213
static int init_stringtab (bfd *, long);
214
 
215
static void read_one_sym (struct coff_symbol *,
216
                          struct internal_syment *, union internal_auxent *);
217
 
218
static void coff_symtab_read (long, unsigned int, struct objfile *);
219
 
220
static void find_linenos (bfd *, sec_ptr, PTR);
221
 
222
static void coff_symfile_init (struct objfile *);
223
 
224
static void coff_new_init (struct objfile *);
225
 
226
static void coff_symfile_read (struct objfile *, int);
227
 
228
static void coff_symfile_finish (struct objfile *);
229
 
230
static void record_minimal_symbol (char *, CORE_ADDR,
231
                                   enum minimal_symbol_type,
232
                                   struct objfile *);
233
 
234
static void coff_end_symtab (struct objfile *);
235
 
236
static void complete_symtab (char *, CORE_ADDR, unsigned int);
237
 
238
static void coff_start_symtab (char *);
239
 
240
static struct type *coff_alloc_type (int);
241
 
242
static struct type **coff_lookup_type (int);
243
 
244
static void coff_locate_sections (bfd *, asection *, PTR);
245
 
246
/* We are called once per section from coff_symfile_read.  We
247
   need to examine each section we are passed, check to see
248
   if it is something we are interested in processing, and
249
   if so, stash away some access information for the section.
250
 
251
   FIXME: The section names should not be hardwired strings (what
252
   should they be?  I don't think most object file formats have enough
253
   section flags to specify what kind of debug section it is
254
   -kingdon).  */
255
 
256
static void
257
coff_locate_sections (bfd *abfd, asection *sectp, PTR csip)
258
{
259
  register struct coff_symfile_info *csi;
260
  const char *name;
261
 
262
  csi = (struct coff_symfile_info *) csip;
263
  name = bfd_get_section_name (abfd, sectp);
264
  if (STREQ (name, ".text"))
265
    {
266
      csi->textaddr = bfd_section_vma (abfd, sectp);
267
      csi->textsize += bfd_section_size (abfd, sectp);
268
    }
269
  else if (strncmp (name, ".text", sizeof ".text" - 1) == 0)
270
    {
271
      csi->textsize += bfd_section_size (abfd, sectp);
272
    }
273
  else if (STREQ (name, ".stabstr"))
274
    {
275
      csi->stabstrsect = sectp;
276
    }
277
  else if (strncmp (name, ".stab", sizeof ".stab" - 1) == 0)
278
    {
279
      const char *s;
280
 
281
      /* We can have multiple .stab sections if linked with
282
         --split-by-reloc.  */
283
      for (s = name + sizeof ".stab" - 1; *s != '\0'; s++)
284
        if (!isdigit (*s))
285
          break;
286
      if (*s == '\0')
287
        {
288
          struct stab_section_list *n, **pn;
289
 
290
          n = ((struct stab_section_list *)
291
               xmalloc (sizeof (struct stab_section_list)));
292
          n->section = sectp;
293
          n->next = NULL;
294
          for (pn = &csi->stabsects; *pn != NULL; pn = &(*pn)->next)
295
            ;
296
          *pn = n;
297
 
298
          /* This will be run after coffstab_build_psymtabs is called
299
             in coff_symfile_read, at which point we no longer need
300
             the information.  */
301
          make_cleanup (xfree, n);
302
        }
303
    }
304
}
305
 
306
/* Return the section_offsets* that CS points to.  */
307
static int cs_to_section (struct coff_symbol *, struct objfile *);
308
 
309
struct find_targ_sec_arg
310
  {
311
    int targ_index;
312
    asection **resultp;
313
  };
314
 
315
static void find_targ_sec (bfd *, asection *, PTR);
316
 
317
static void
318
find_targ_sec (bfd *abfd, asection *sect, PTR obj)
319
{
320
  struct find_targ_sec_arg *args = (struct find_targ_sec_arg *) obj;
321
  if (sect->target_index == args->targ_index)
322
    *args->resultp = sect;
323
}
324
 
325
/* Return the section number (SECT_OFF_*) that CS points to.  */
326
static int
327
cs_to_section (struct coff_symbol *cs, struct objfile *objfile)
328
{
329
  asection *sect = NULL;
330
  struct find_targ_sec_arg args;
331
  int off = SECT_OFF_TEXT (objfile);
332
 
333
  args.targ_index = cs->c_secnum;
334
  args.resultp = &sect;
335
  bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
336
  if (sect != NULL)
337
    {
338
      /* This is the section.  Figure out what SECT_OFF_* code it is.  */
339
      if (bfd_get_section_flags (abfd, sect) & SEC_CODE)
340
        off = SECT_OFF_TEXT (objfile);
341
      else if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
342
        off = SECT_OFF_DATA (objfile);
343
      else
344
        /* Just return the bfd section index. */
345
        off = sect->index;
346
    }
347
  return off;
348
}
349
 
350
/* Return the address of the section of a COFF symbol.  */
351
 
352
static CORE_ADDR cs_section_address (struct coff_symbol *, bfd *);
353
 
354
static CORE_ADDR
355
cs_section_address (struct coff_symbol *cs, bfd *abfd)
356
{
357
  asection *sect = NULL;
358
  struct find_targ_sec_arg args;
359
  CORE_ADDR addr = 0;
360
 
361
  args.targ_index = cs->c_secnum;
362
  args.resultp = &sect;
363
  bfd_map_over_sections (abfd, find_targ_sec, &args);
364
  if (sect != NULL)
365
    addr = bfd_get_section_vma (objfile->obfd, sect);
366
  return addr;
367
}
368
 
369
/* Look up a coff type-number index.  Return the address of the slot
370
   where the type for that index is stored.
371
   The type-number is in INDEX.
372
 
373
   This can be used for finding the type associated with that index
374
   or for associating a new type with the index.  */
375
 
376
static struct type **
377
coff_lookup_type (register int index)
378
{
379
  if (index >= type_vector_length)
380
    {
381
      int old_vector_length = type_vector_length;
382
 
383
      type_vector_length *= 2;
384
      if (index /* is still */  >= type_vector_length)
385
        type_vector_length = index * 2;
386
 
387
      type_vector = (struct type **)
388
        xrealloc ((char *) type_vector,
389
                  type_vector_length * sizeof (struct type *));
390
      memset (&type_vector[old_vector_length], 0,
391
         (type_vector_length - old_vector_length) * sizeof (struct type *));
392
    }
393
  return &type_vector[index];
394
}
395
 
396
/* Make sure there is a type allocated for type number index
397
   and return the type object.
398
   This can create an empty (zeroed) type object.  */
399
 
400
static struct type *
401
coff_alloc_type (int index)
402
{
403
  register struct type **type_addr = coff_lookup_type (index);
404
  register struct type *type = *type_addr;
405
 
406
  /* If we are referring to a type not known at all yet,
407
     allocate an empty type for it.
408
     We will fill it in later if we find out how.  */
409
  if (type == NULL)
410
    {
411
      type = alloc_type (current_objfile);
412
      *type_addr = type;
413
    }
414
  return type;
415
}
416
 
417
/* Start a new symtab for a new source file.
418
   This is called when a COFF ".file" symbol is seen;
419
   it indicates the start of data for one original source file.  */
420
 
421
static void
422
coff_start_symtab (char *name)
423
{
424
  start_symtab (
425
  /* We fill in the filename later.  start_symtab puts
426
     this pointer into last_source_file and we put it in
427
     subfiles->name, which end_symtab frees; that's why
428
     it must be malloc'd.  */
429
                 savestring (name, strlen (name)),
430
  /* We never know the directory name for COFF.  */
431
                 NULL,
432
  /* The start address is irrelevant, since we set
433
     last_source_start_addr in coff_end_symtab.  */
434
                 0);
435
  record_debugformat ("COFF");
436
}
437
 
438
/* Save the vital information from when starting to read a file,
439
   for use when closing off the current file.
440
   NAME is the file name the symbols came from, START_ADDR is the first
441
   text address for the file, and SIZE is the number of bytes of text.  */
442
 
443
static void
444
complete_symtab (char *name, CORE_ADDR start_addr, unsigned int size)
445
{
446
  if (last_source_file != NULL)
447
    xfree (last_source_file);
448
  last_source_file = savestring (name, strlen (name));
449
  current_source_start_addr = start_addr;
450
  current_source_end_addr = start_addr + size;
451
 
452
  if (current_objfile->ei.entry_point >= current_source_start_addr &&
453
      current_objfile->ei.entry_point < current_source_end_addr)
454
    {
455
      current_objfile->ei.entry_file_lowpc = current_source_start_addr;
456
      current_objfile->ei.entry_file_highpc = current_source_end_addr;
457
    }
458
}
459
 
460
/* Finish the symbol definitions for one main source file,
461
   close off all the lexical contexts for that file
462
   (creating struct block's for them), then make the
463
   struct symtab for that file and put it in the list of all such. */
464
 
465
static void
466
coff_end_symtab (struct objfile *objfile)
467
{
468
  struct symtab *symtab;
469
 
470
  last_source_start_addr = current_source_start_addr;
471
 
472
  symtab = end_symtab (current_source_end_addr, objfile, SECT_OFF_TEXT (objfile));
473
 
474
  if (symtab != NULL)
475
    free_named_symtabs (symtab->filename);
476
 
477
  /* Reinitialize for beginning of new file. */
478
  last_source_file = NULL;
479
}
480
 
481
static void
482
record_minimal_symbol (char *name, CORE_ADDR address,
483
                       enum minimal_symbol_type type, struct objfile *objfile)
484
{
485
  /* We don't want TDESC entry points in the minimal symbol table */
486
  if (name[0] == '@')
487
    return;
488
 
489
  prim_record_minimal_symbol (name, address, type, objfile);
490
}
491
 
492
/* coff_symfile_init ()
493
   is the coff-specific initialization routine for reading symbols.
494
   It is passed a struct objfile which contains, among other things,
495
   the BFD for the file whose symbols are being read, and a slot for
496
   a pointer to "private data" which we fill with cookies and other
497
   treats for coff_symfile_read ().
498
 
499
   We will only be called if this is a COFF or COFF-like file.
500
   BFD handles figuring out the format of the file, and code in symtab.c
501
   uses BFD's determination to vector to us.
502
 
503
   The ultimate result is a new symtab (or, FIXME, eventually a psymtab).  */
504
 
505
static void
506
coff_symfile_init (struct objfile *objfile)
507
{
508
  /* Allocate struct to keep track of stab reading. */
509
  objfile->sym_stab_info = (struct dbx_symfile_info *)
510
    xmmalloc (objfile->md, sizeof (struct dbx_symfile_info));
511
 
512
  memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
513
 
514
  /* Allocate struct to keep track of the symfile */
515
  objfile->sym_private = xmmalloc (objfile->md,
516
                                   sizeof (struct coff_symfile_info));
517
 
518
  memset (objfile->sym_private, 0, sizeof (struct coff_symfile_info));
519
 
520
  /* COFF objects may be reordered, so set OBJF_REORDERED.  If we
521
     find this causes a significant slowdown in gdb then we could
522
     set it in the debug symbol readers only when necessary.  */
523
  objfile->flags |= OBJF_REORDERED;
524
 
525
  init_entry_point_info (objfile);
526
}
527
 
528
/* This function is called for every section; it finds the outer limits
529
   of the line table (minimum and maximum file offset) so that the
530
   mainline code can read the whole thing for efficiency.  */
531
 
532
/* ARGSUSED */
533
static void
534
find_linenos (bfd *abfd, sec_ptr asect, PTR vpinfo)
535
{
536
  struct coff_symfile_info *info;
537
  int size, count;
538
  file_ptr offset, maxoff;
539
 
540
/* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
541
  count = asect->lineno_count;
542
/* End of warning */
543
 
544
  if (count == 0)
545
    return;
546
  size = count * local_linesz;
547
 
548
  info = (struct coff_symfile_info *) vpinfo;
549
/* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
550
  offset = asect->line_filepos;
551
/* End of warning */
552
 
553
  if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
554
    info->min_lineno_offset = offset;
555
 
556
  maxoff = offset + size;
557
  if (maxoff > info->max_lineno_offset)
558
    info->max_lineno_offset = maxoff;
559
}
560
 
561
 
562
/* The BFD for this file -- only good while we're actively reading
563
   symbols into a psymtab or a symtab.  */
564
 
565
static bfd *symfile_bfd;
566
 
567
/* Read a symbol file, after initialization by coff_symfile_init.  */
568
 
569
/* ARGSUSED */
570
static void
571
coff_symfile_read (struct objfile *objfile, int mainline)
572
{
573
  struct coff_symfile_info *info;
574
  struct dbx_symfile_info *dbxinfo;
575
  bfd *abfd = objfile->obfd;
576
  coff_data_type *cdata = coff_data (abfd);
577
  char *name = bfd_get_filename (abfd);
578
  register int val;
579
  unsigned int num_symbols;
580
  int symtab_offset;
581
  int stringtab_offset;
582
  struct cleanup *back_to;
583
  int stabstrsize;
584
  int len;
585
  char * target;
586
 
587
  info = (struct coff_symfile_info *) objfile->sym_private;
588
  dbxinfo = objfile->sym_stab_info;
589
  symfile_bfd = abfd;           /* Kludge for swap routines */
590
 
591
/* WARNING WILL ROBINSON!  ACCESSING BFD-PRIVATE DATA HERE!  FIXME!  */
592
  num_symbols = bfd_get_symcount (abfd);        /* How many syms */
593
  symtab_offset = cdata->sym_filepos;   /* Symbol table file offset */
594
  stringtab_offset = symtab_offset +    /* String table file offset */
595
    num_symbols * cdata->local_symesz;
596
 
597
  /* Set a few file-statics that give us specific information about
598
     the particular COFF file format we're reading.  */
599
  local_n_btmask = cdata->local_n_btmask;
600
  local_n_btshft = cdata->local_n_btshft;
601
  local_n_tmask = cdata->local_n_tmask;
602
  local_n_tshift = cdata->local_n_tshift;
603
  local_linesz = cdata->local_linesz;
604
  local_symesz = cdata->local_symesz;
605
  local_auxesz = cdata->local_auxesz;
606
 
607
  /* Allocate space for raw symbol and aux entries, based on their
608
     space requirements as reported by BFD.  */
609
  temp_sym = (char *) xmalloc
610
    (cdata->local_symesz + cdata->local_auxesz);
611
  temp_aux = temp_sym + cdata->local_symesz;
612
  back_to = make_cleanup (free_current_contents, &temp_sym);
613
 
614
  /* We need to know whether this is a PE file, because in PE files,
615
     unlike standard COFF files, symbol values are stored as offsets
616
     from the section address, rather than as absolute addresses.
617
     FIXME: We should use BFD to read the symbol table, and thus avoid
618
     this problem.  */
619
  pe_file =
620
    strncmp (bfd_get_target (objfile->obfd), "pe", 2) == 0
621
    || strncmp (bfd_get_target (objfile->obfd), "epoc-pe", 7) == 0;
622
 
623
/* End of warning */
624
 
625
  /* Read the line number table, all at once.  */
626
  info->min_lineno_offset = 0;
627
  info->max_lineno_offset = 0;
628
  bfd_map_over_sections (abfd, find_linenos, (PTR) info);
629
 
630
  make_cleanup (free_linetab_cleanup, 0 /*ignore*/);
631
  val = init_lineno (abfd, info->min_lineno_offset,
632
                     info->max_lineno_offset - info->min_lineno_offset);
633
  if (val < 0)
634
    error ("\"%s\": error reading line numbers\n", name);
635
 
636
  /* Now read the string table, all at once.  */
637
 
638
  make_cleanup (free_stringtab_cleanup, 0 /*ignore*/);
639
  val = init_stringtab (abfd, stringtab_offset);
640
  if (val < 0)
641
    error ("\"%s\": can't get string table", name);
642
 
643
  init_minimal_symbol_collection ();
644
  make_cleanup_discard_minimal_symbols ();
645
 
646
  /* Now that the executable file is positioned at symbol table,
647
     process it and define symbols accordingly.  */
648
 
649
  coff_symtab_read ((long) symtab_offset, num_symbols, objfile);
650
 
651
  /* Sort symbols alphabetically within each block.  */
652
 
653
  {
654
    struct symtab *s;
655
 
656
    for (s = objfile->symtabs; s != NULL; s = s->next)
657
      sort_symtab_syms (s);
658
  }
659
 
660
  /* Install any minimal symbols that have been collected as the current
661
     minimal symbols for this objfile.  */
662
 
663
  install_minimal_symbols (objfile);
664
 
665
  bfd_map_over_sections (abfd, coff_locate_sections, (PTR) info);
666
 
667
  if (info->stabsects)
668
    {
669
      if (!info->stabstrsect)
670
        {
671
          error_begin ();
672
          fprintf_filtered
673
            (gdb_stderr,
674
             ("The debugging information in `%s' is corrupted.\n"
675
           "The file has a `.stabs' section, but no `.stabstr' section.\n"),
676
             name);
677
          return_to_top_level (RETURN_ERROR);
678
        }
679
 
680
      /* FIXME: dubious.  Why can't we use something normal like
681
         bfd_get_section_contents?  */
682
      bfd_seek (abfd, abfd->where, 0);
683
 
684
      stabstrsize = bfd_section_size (abfd, info->stabstrsect);
685
 
686
      coffstab_build_psymtabs (objfile,
687
                               mainline,
688
                               info->textaddr, info->textsize,
689
                               info->stabsects,
690
                               info->stabstrsect->filepos, stabstrsize);
691
    }
692
  if (dwarf2_has_info (abfd))
693
    {
694
      /* DWARF2 sections.  */
695
      dwarf2_build_psymtabs (objfile, mainline);
696
    }
697
 
698
  do_cleanups (back_to);
699
}
700
 
701
static void
702
coff_new_init (struct objfile *ignore)
703
{
704
}
705
 
706
/* Perform any local cleanups required when we are done with a particular
707
   objfile.  I.E, we are in the process of discarding all symbol information
708
   for an objfile, freeing up all memory held for it, and unlinking the
709
   objfile struct from the global list of known objfiles. */
710
 
711
static void
712
coff_symfile_finish (struct objfile *objfile)
713
{
714
  if (objfile->sym_private != NULL)
715
    {
716
      mfree (objfile->md, objfile->sym_private);
717
    }
718
 
719
  /* Let stabs reader clean up */
720
  stabsread_clear_cache ();
721
}
722
 
723
 
724
/* Given pointers to a symbol table in coff style exec file,
725
   analyze them and create struct symtab's describing the symbols.
726
   NSYMS is the number of symbols in the symbol table.
727
   We read them one at a time using read_one_sym ().  */
728
 
729
static void
730
coff_symtab_read (long symtab_offset, unsigned int nsyms,
731
                  struct objfile *objfile)
732
{
733
  register struct context_stack *new;
734
  struct coff_symbol coff_symbol;
735
  register struct coff_symbol *cs = &coff_symbol;
736
  static struct internal_syment main_sym;
737
  static union internal_auxent main_aux;
738
  struct coff_symbol fcn_cs_saved;
739
  static struct internal_syment fcn_sym_saved;
740
  static union internal_auxent fcn_aux_saved;
741
  struct symtab *s;
742
  /* A .file is open.  */
743
  int in_source_file = 0;
744
  int next_file_symnum = -1;
745
  /* Name of the current file.  */
746
  char *filestring = "";
747
  int depth = 0;
748
  int fcn_first_line = 0;
749
  CORE_ADDR fcn_first_line_addr = 0;
750
  int fcn_last_line = 0;
751
  int fcn_start_addr = 0;
752
  long fcn_line_ptr = 0;
753
  int val;
754
  CORE_ADDR tmpaddr;
755
 
756
  /* Work around a stdio bug in SunOS4.1.1 (this makes me nervous....
757
     it's hard to know I've really worked around it.  The fix should be
758
     harmless, anyway).  The symptom of the bug is that the first
759
     fread (in read_one_sym), will (in my example) actually get data
760
     from file offset 268, when the fseek was to 264 (and ftell shows
761
     264).  This causes all hell to break loose.  I was unable to
762
     reproduce this on a short test program which operated on the same
763
     file, performing (I think) the same sequence of operations.
764
 
765
     It stopped happening when I put in this (former) rewind().
766
 
767
     FIXME: Find out if this has been reported to Sun, whether it has
768
     been fixed in a later release, etc.  */
769
 
770
  bfd_seek (objfile->obfd, 0, 0);
771
 
772
  /* Position to read the symbol table. */
773
  val = bfd_seek (objfile->obfd, (long) symtab_offset, 0);
774
  if (val < 0)
775
    perror_with_name (objfile->name);
776
 
777
  current_objfile = objfile;
778
  nlist_bfd_global = objfile->obfd;
779
  nlist_nsyms_global = nsyms;
780
  last_source_file = NULL;
781
  memset (opaque_type_chain, 0, sizeof opaque_type_chain);
782
 
783
  if (type_vector)              /* Get rid of previous one */
784
    xfree (type_vector);
785
  type_vector_length = 160;
786
  type_vector = (struct type **)
787
    xmalloc (type_vector_length * sizeof (struct type *));
788
  memset (type_vector, 0, type_vector_length * sizeof (struct type *));
789
 
790
  coff_start_symtab ("");
791
 
792
  symnum = 0;
793
  while (symnum < nsyms)
794
    {
795
      QUIT;                     /* Make this command interruptable.  */
796
 
797
      read_one_sym (cs, &main_sym, &main_aux);
798
 
799
      if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
800
        {
801
          if (last_source_file)
802
            coff_end_symtab (objfile);
803
 
804
          coff_start_symtab ("_globals_");
805
          complete_symtab ("_globals_", 0, 0);
806
          /* done with all files, everything from here on out is globals */
807
        }
808
 
809
      /* Special case for file with type declarations only, no text.  */
810
      if (!last_source_file && SDB_TYPE (cs->c_type)
811
          && cs->c_secnum == N_DEBUG)
812
        complete_symtab (filestring, 0, 0);
813
 
814
      /* Typedefs should not be treated as symbol definitions.  */
815
      if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
816
        {
817
          /* Record all functions -- external and static -- in minsyms. */
818
          tmpaddr = cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
819
          record_minimal_symbol (cs->c_name, tmpaddr, mst_text, objfile);
820
 
821
          fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
822
          fcn_start_addr = tmpaddr;
823
          fcn_cs_saved = *cs;
824
          fcn_sym_saved = main_sym;
825
          fcn_aux_saved = main_aux;
826
          continue;
827
        }
828
 
829
      switch (cs->c_sclass)
830
        {
831
        case C_EFCN:
832
        case C_EXTDEF:
833
        case C_ULABEL:
834
        case C_USTATIC:
835
        case C_LINE:
836
        case C_ALIAS:
837
        case C_HIDDEN:
838
          complain (&bad_sclass_complaint, cs->c_name);
839
          break;
840
 
841
        case C_FILE:
842
          /* c_value field contains symnum of next .file entry in table
843
             or symnum of first global after last .file.  */
844
          next_file_symnum = cs->c_value;
845
          if (cs->c_naux > 0)
846
            filestring = coff_getfilename (&main_aux);
847
          else
848
            filestring = "";
849
 
850
          /* Complete symbol table for last object file
851
             containing debugging information.  */
852
          if (last_source_file)
853
            {
854
              coff_end_symtab (objfile);
855
              coff_start_symtab (filestring);
856
            }
857
          in_source_file = 1;
858
          break;
859
 
860
          /* C_LABEL is used for labels and static functions.  Including
861
             it here allows gdb to see static functions when no debug
862
             info is available.  */
863
        case C_LABEL:
864
          /* However, labels within a function can make weird backtraces,
865
             so filter them out (from phdm@macqel.be). */
866
          if (within_function)
867
            break;
868
        case C_STAT:
869
        case C_THUMBLABEL:
870
        case C_THUMBSTAT:
871
        case C_THUMBSTATFUNC:
872
          if (cs->c_name[0] == '.')
873
            {
874
              if (STREQ (cs->c_name, ".text"))
875
                {
876
                  /* FIXME:  don't wire in ".text" as section name
877
                     or symbol name! */
878
                  /* Check for in_source_file deals with case of
879
                     a file with debugging symbols
880
                     followed by a later file with no symbols.  */
881
                  if (in_source_file)
882
                    complete_symtab (filestring,
883
                    cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
884
                                     main_aux.x_scn.x_scnlen);
885
                  in_source_file = 0;
886
                }
887
              /* flush rest of '.' symbols */
888
              break;
889
            }
890
          else if (!SDB_TYPE (cs->c_type)
891
                   && cs->c_name[0] == 'L'
892
                   && (strncmp (cs->c_name, "LI%", 3) == 0
893
                       || strncmp (cs->c_name, "LF%", 3) == 0
894
                       || strncmp (cs->c_name, "LC%", 3) == 0
895
                       || strncmp (cs->c_name, "LP%", 3) == 0
896
                       || strncmp (cs->c_name, "LPB%", 4) == 0
897
                       || strncmp (cs->c_name, "LBB%", 4) == 0
898
                       || strncmp (cs->c_name, "LBE%", 4) == 0
899
                       || strncmp (cs->c_name, "LPBX%", 5) == 0))
900
            /* At least on a 3b1, gcc generates swbeg and string labels
901
               that look like this.  Ignore them.  */
902
            break;
903
          /* fall in for static symbols that don't start with '.' */
904
        case C_THUMBEXT:
905
        case C_THUMBEXTFUNC:
906
        case C_EXT:
907
          {
908
            /* Record it in the minimal symbols regardless of
909
               SDB_TYPE.  This parallels what we do for other debug
910
               formats, and probably is needed to make
911
               print_address_symbolic work right without the (now
912
               gone) "set fast-symbolic-addr off" kludge.  */
913
 
914
            /* FIXME: should use mst_abs, and not relocate, if absolute.  */
915
            enum minimal_symbol_type ms_type;
916
            int sec;
917
 
918
            if (cs->c_secnum == N_UNDEF)
919
              {
920
                /* This is a common symbol.  See if the target
921
                   environment knows where it has been relocated to.  */
922
                CORE_ADDR reladdr;
923
                if (target_lookup_symbol (cs->c_name, &reladdr))
924
                  {
925
                    /* Error in lookup; ignore symbol.  */
926
                    break;
927
                  }
928
                tmpaddr = reladdr;
929
                /* The address has already been relocated; make sure that
930
                   objfile_relocate doesn't relocate it again.  */
931
                sec = -2;
932
                ms_type = cs->c_sclass == C_EXT
933
                  || cs->c_sclass == C_THUMBEXT ?
934
                  mst_bss : mst_file_bss;
935
              }
936
            else
937
              {
938
                sec = cs_to_section (cs, objfile);
939
                tmpaddr = cs->c_value;
940
                if (cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXTFUNC
941
                    || cs->c_sclass == C_THUMBEXT)
942
                  tmpaddr += ANOFFSET (objfile->section_offsets, sec);
943
 
944
                if (sec == SECT_OFF_TEXT (objfile))
945
                  {
946
                    ms_type =
947
                      cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXTFUNC
948
                      || cs->c_sclass == C_THUMBEXT ?
949
                      mst_text : mst_file_text;
950
#ifdef SMASH_TEXT_ADDRESS
951
                    if (tmpaddr & 1)    /* FIXME: delete this line */
952
                      SMASH_TEXT_ADDRESS (tmpaddr);
953
#endif
954
                  }
955
                else if (sec == SECT_OFF_DATA (objfile))
956
                  {
957
                    ms_type =
958
                      cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
959
                      mst_data : mst_file_data;
960
                  }
961
                else if (sec == SECT_OFF_BSS (objfile))
962
                  {
963
                    ms_type =
964
                      cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT ?
965
                      mst_data : mst_file_data;
966
                  }
967
                else
968
                  ms_type = mst_unknown;
969
              }
970
 
971
            if (cs->c_name[0] != '@' /* Skip tdesc symbols */ )
972
              {
973
                struct minimal_symbol *msym;
974
 
975
                /* FIXME: cagney/2001-02-01: The nasty (int) -> (long)
976
                   -> (void*) cast is to ensure that that the value of
977
                   cs->c_sclass can be correctly stored in a void
978
                   pointer in MSYMBOL_INFO.  Better solutions
979
                   welcome. */
980
                gdb_assert (sizeof (void *) >= sizeof (cs->c_sclass));
981
                msym = prim_record_minimal_symbol_and_info
982
                  (cs->c_name, tmpaddr, ms_type, (void *) (long) cs->c_sclass,
983
                   sec, NULL, objfile);
984
#ifdef COFF_MAKE_MSYMBOL_SPECIAL
985
                if (msym)
986
                  COFF_MAKE_MSYMBOL_SPECIAL (cs->c_sclass, msym);
987
#endif
988
              }
989
            if (SDB_TYPE (cs->c_type))
990
              {
991
                struct symbol *sym;
992
                sym = process_coff_symbol
993
                  (cs, &main_aux, objfile);
994
                SYMBOL_VALUE (sym) = tmpaddr;
995
                SYMBOL_SECTION (sym) = sec;
996
              }
997
          }
998
          break;
999
 
1000
        case C_FCN:
1001
          if (STREQ (cs->c_name, ".bf"))
1002
            {
1003
              within_function = 1;
1004
 
1005
              /* value contains address of first non-init type code */
1006
              /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
1007
                 contains line number of '{' } */
1008
              if (cs->c_naux != 1)
1009
                complain (&bf_no_aux_complaint, cs->c_symnum);
1010
              fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1011
              fcn_first_line_addr = cs->c_value;
1012
 
1013
              /* Might want to check that locals are 0 and
1014
                 context_stack_depth is zero, and complain if not.  */
1015
 
1016
              depth = 0;
1017
              new = push_context (depth, fcn_start_addr);
1018
              fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
1019
              new->name =
1020
                process_coff_symbol (&fcn_cs_saved, &fcn_aux_saved, objfile);
1021
            }
1022
          else if (STREQ (cs->c_name, ".ef"))
1023
            {
1024
              if (!within_function)
1025
                error ("Bad coff function information\n");
1026
              /* the value of .ef is the address of epilogue code;
1027
                 not useful for gdb.  */
1028
              /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1029
                 contains number of lines to '}' */
1030
 
1031
              if (context_stack_depth <= 0)
1032
                {               /* We attempted to pop an empty context stack */
1033
                  complain (&ef_stack_complaint, cs->c_symnum);
1034
                  within_function = 0;
1035
                  break;
1036
                }
1037
 
1038
              new = pop_context ();
1039
              /* Stack must be empty now.  */
1040
              if (context_stack_depth > 0 || new == NULL)
1041
                {
1042
                  complain (&ef_complaint, cs->c_symnum);
1043
                  within_function = 0;
1044
                  break;
1045
                }
1046
              if (cs->c_naux != 1)
1047
                {
1048
                  complain (&ef_no_aux_complaint, cs->c_symnum);
1049
                  fcn_last_line = 0x7FFFFFFF;
1050
                }
1051
              else
1052
                {
1053
                  fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1054
                }
1055
              /* fcn_first_line is the line number of the opening '{'.
1056
                 Do not record it - because it would affect gdb's idea
1057
                 of the line number of the first statement of the function -
1058
                 except for one-line functions, for which it is also the line
1059
                 number of all the statements and of the closing '}', and
1060
                 for which we do not have any other statement-line-number. */
1061
              if (fcn_last_line == 1)
1062
                record_line (current_subfile, fcn_first_line,
1063
                             fcn_first_line_addr);
1064
              else
1065
                enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line,
1066
                               objfile);
1067
 
1068
              finish_block (new->name, &local_symbols, new->old_blocks,
1069
                            new->start_addr,
1070
#if defined (FUNCTION_EPILOGUE_SIZE)
1071
              /* This macro should be defined only on
1072
                 machines where the
1073
                 fcn_aux_saved.x_sym.x_misc.x_fsize
1074
                 field is always zero.
1075
                 So use the .bf record information that
1076
                 points to the epilogue and add the size
1077
                 of the epilogue.  */
1078
                            cs->c_value
1079
                            + FUNCTION_EPILOGUE_SIZE
1080
                            + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
1081
#else
1082
                            fcn_cs_saved.c_value
1083
                            + fcn_aux_saved.x_sym.x_misc.x_fsize
1084
                            + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)),
1085
#endif
1086
                            objfile
1087
                );
1088
              within_function = 0;
1089
            }
1090
          break;
1091
 
1092
        case C_BLOCK:
1093
          if (STREQ (cs->c_name, ".bb"))
1094
            {
1095
              tmpaddr = cs->c_value;
1096
              tmpaddr += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1097
              push_context (++depth, tmpaddr);
1098
            }
1099
          else if (STREQ (cs->c_name, ".eb"))
1100
            {
1101
              if (context_stack_depth <= 0)
1102
                {               /* We attempted to pop an empty context stack */
1103
                  complain (&eb_stack_complaint, cs->c_symnum);
1104
                  break;
1105
                }
1106
 
1107
              new = pop_context ();
1108
              if (depth-- != new->depth)
1109
                {
1110
                  complain (&eb_complaint, symnum);
1111
                  break;
1112
                }
1113
              if (local_symbols && context_stack_depth > 0)
1114
                {
1115
                  tmpaddr =
1116
                    cs->c_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1117
                  /* Make a block for the local symbols within.  */
1118
                  finish_block (0, &local_symbols, new->old_blocks,
1119
                                new->start_addr, tmpaddr, objfile);
1120
                }
1121
              /* Now pop locals of block just finished.  */
1122
              local_symbols = new->locals;
1123
            }
1124
          break;
1125
 
1126
        default:
1127
          process_coff_symbol (cs, &main_aux, objfile);
1128
          break;
1129
        }
1130
    }
1131
 
1132
  if (last_source_file)
1133
    coff_end_symtab (objfile);
1134
 
1135
  /* Patch up any opaque types (references to types that are not defined
1136
     in the file where they are referenced, e.g. "struct foo *bar").  */
1137
  ALL_OBJFILE_SYMTABS (objfile, s)
1138
    patch_opaque_types (s);
1139
 
1140
  current_objfile = NULL;
1141
}
1142
 
1143
/* Routines for reading headers and symbols from executable.  */
1144
 
1145
/* Read the next symbol, swap it, and return it in both internal_syment
1146
   form, and coff_symbol form.  Also return its first auxent, if any,
1147
   in internal_auxent form, and skip any other auxents.  */
1148
 
1149
static void
1150
read_one_sym (register struct coff_symbol *cs,
1151
              register struct internal_syment *sym,
1152
              register union internal_auxent *aux)
1153
{
1154
  int i;
1155
 
1156
  cs->c_symnum = symnum;
1157
  bfd_read (temp_sym, local_symesz, 1, nlist_bfd_global);
1158
  bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *) sym);
1159
  cs->c_naux = sym->n_numaux & 0xff;
1160
  if (cs->c_naux >= 1)
1161
    {
1162
      bfd_read (temp_aux, local_auxesz, 1, nlist_bfd_global);
1163
      bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
1164
                            0, cs->c_naux, (char *) aux);
1165
      /* If more than one aux entry, read past it (only the first aux
1166
         is important). */
1167
      for (i = 1; i < cs->c_naux; i++)
1168
        bfd_read (temp_aux, local_auxesz, 1, nlist_bfd_global);
1169
    }
1170
  cs->c_name = getsymname (sym);
1171
  cs->c_value = sym->n_value;
1172
  cs->c_sclass = (sym->n_sclass & 0xff);
1173
  cs->c_secnum = sym->n_scnum;
1174
  cs->c_type = (unsigned) sym->n_type;
1175
  if (!SDB_TYPE (cs->c_type))
1176
    cs->c_type = 0;
1177
 
1178
#if 0
1179
  if (cs->c_sclass & 128)
1180
    printf ("thumb symbol %s, class 0x%x\n", cs->c_name, cs->c_sclass);
1181
#endif
1182
 
1183
  symnum += 1 + cs->c_naux;
1184
 
1185
  /* The PE file format stores symbol values as offsets within the
1186
     section, rather than as absolute addresses.  We correct that
1187
     here, if the symbol has an appropriate storage class.  FIXME: We
1188
     should use BFD to read the symbols, rather than duplicating the
1189
     work here.  */
1190
  if (pe_file)
1191
    {
1192
      switch (cs->c_sclass)
1193
        {
1194
        case C_EXT:
1195
        case C_THUMBEXT:
1196
        case C_THUMBEXTFUNC:
1197
        case C_SECTION:
1198
        case C_NT_WEAK:
1199
        case C_STAT:
1200
        case C_THUMBSTAT:
1201
        case C_THUMBSTATFUNC:
1202
        case C_LABEL:
1203
        case C_THUMBLABEL:
1204
        case C_BLOCK:
1205
        case C_FCN:
1206
        case C_EFCN:
1207
          if (cs->c_secnum != 0)
1208
            cs->c_value += cs_section_address (cs, symfile_bfd);
1209
          break;
1210
        }
1211
    }
1212
}
1213
 
1214
/* Support for string table handling */
1215
 
1216
static char *stringtab = NULL;
1217
 
1218
static int
1219
init_stringtab (bfd *abfd, long offset)
1220
{
1221
  long length;
1222
  int val;
1223
  unsigned char lengthbuf[4];
1224
 
1225
  free_stringtab ();
1226
 
1227
  /* If the file is stripped, the offset might be zero, indicating no
1228
     string table.  Just return with `stringtab' set to null. */
1229
  if (offset == 0)
1230
    return 0;
1231
 
1232
  if (bfd_seek (abfd, offset, 0) < 0)
1233
    return -1;
1234
 
1235
  val = bfd_read ((char *) lengthbuf, sizeof lengthbuf, 1, abfd);
1236
  length = bfd_h_get_32 (symfile_bfd, lengthbuf);
1237
 
1238
  /* If no string table is needed, then the file may end immediately
1239
     after the symbols.  Just return with `stringtab' set to null. */
1240
  if (val != sizeof lengthbuf || length < sizeof lengthbuf)
1241
    return 0;
1242
 
1243
  stringtab = (char *) xmalloc (length);
1244
  /* This is in target format (probably not very useful, and not currently
1245
     used), not host format.  */
1246
  memcpy (stringtab, lengthbuf, sizeof lengthbuf);
1247
  if (length == sizeof length)  /* Empty table -- just the count */
1248
    return 0;
1249
 
1250
  val = bfd_read (stringtab + sizeof lengthbuf, length - sizeof lengthbuf, 1, abfd);
1251
  if (val != length - sizeof lengthbuf || stringtab[length - 1] != '\0')
1252
    return -1;
1253
 
1254
  return 0;
1255
}
1256
 
1257
static void
1258
free_stringtab (void)
1259
{
1260
  if (stringtab)
1261
    xfree (stringtab);
1262
  stringtab = NULL;
1263
}
1264
 
1265
static void
1266
free_stringtab_cleanup (void *ignore)
1267
{
1268
  free_stringtab ();
1269
}
1270
 
1271
static char *
1272
getsymname (struct internal_syment *symbol_entry)
1273
{
1274
  static char buffer[SYMNMLEN + 1];
1275
  char *result;
1276
 
1277
  if (symbol_entry->_n._n_n._n_zeroes == 0)
1278
    {
1279
      /* FIXME: Probably should be detecting corrupt symbol files by
1280
         seeing whether offset points to within the stringtab.  */
1281
      result = stringtab + symbol_entry->_n._n_n._n_offset;
1282
    }
1283
  else
1284
    {
1285
      strncpy (buffer, symbol_entry->_n._n_name, SYMNMLEN);
1286
      buffer[SYMNMLEN] = '\0';
1287
      result = buffer;
1288
    }
1289
  return result;
1290
}
1291
 
1292
/* Extract the file name from the aux entry of a C_FILE symbol.  Return
1293
   only the last component of the name.  Result is in static storage and
1294
   is only good for temporary use.  */
1295
 
1296
static char *
1297
coff_getfilename (union internal_auxent *aux_entry)
1298
{
1299
  static char buffer[BUFSIZ];
1300
  register char *temp;
1301
  char *result;
1302
 
1303
  if (aux_entry->x_file.x_n.x_zeroes == 0)
1304
    strcpy (buffer, stringtab + aux_entry->x_file.x_n.x_offset);
1305
  else
1306
    {
1307
      strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1308
      buffer[FILNMLEN] = '\0';
1309
    }
1310
  result = buffer;
1311
 
1312
  /* FIXME: We should not be throwing away the information about what
1313
     directory.  It should go into dirname of the symtab, or some such
1314
     place.  */
1315
  if ((temp = strrchr (result, '/')) != NULL)
1316
    result = temp + 1;
1317
  return (result);
1318
}
1319
 
1320
/* Support for line number handling.  */
1321
 
1322
static char *linetab = NULL;
1323
static long linetab_offset;
1324
static unsigned long linetab_size;
1325
 
1326
/* Read in all the line numbers for fast lookups later.  Leave them in
1327
   external (unswapped) format in memory; we'll swap them as we enter
1328
   them into GDB's data structures.  */
1329
 
1330
static int
1331
init_lineno (bfd *abfd, long offset, int size)
1332
{
1333
  int val;
1334
 
1335
  linetab_offset = offset;
1336
  linetab_size = size;
1337
 
1338
  free_linetab ();
1339
 
1340
  if (size == 0)
1341
    return 0;
1342
 
1343
  if (bfd_seek (abfd, offset, 0) < 0)
1344
    return -1;
1345
 
1346
  /* Allocate the desired table, plus a sentinel */
1347
  linetab = (char *) xmalloc (size + local_linesz);
1348
 
1349
  val = bfd_read (linetab, size, 1, abfd);
1350
  if (val != size)
1351
    return -1;
1352
 
1353
  /* Terminate it with an all-zero sentinel record */
1354
  memset (linetab + size, 0, local_linesz);
1355
 
1356
  return 0;
1357
}
1358
 
1359
static void
1360
free_linetab (void)
1361
{
1362
  if (linetab)
1363
    xfree (linetab);
1364
  linetab = NULL;
1365
}
1366
 
1367
static void
1368
free_linetab_cleanup (void *ignore)
1369
{
1370
  free_linetab ();
1371
}
1372
 
1373
#if !defined (L_LNNO32)
1374
#define L_LNNO32(lp) ((lp)->l_lnno)
1375
#endif
1376
 
1377
static void
1378
enter_linenos (long file_offset, register int first_line,
1379
               register int last_line, struct objfile *objfile)
1380
{
1381
  register char *rawptr;
1382
  struct internal_lineno lptr;
1383
 
1384
  if (!linetab)
1385
    return;
1386
  if (file_offset < linetab_offset)
1387
    {
1388
      complain (&lineno_complaint, file_offset);
1389
      if (file_offset > linetab_size)   /* Too big to be an offset? */
1390
        return;
1391
      file_offset += linetab_offset;    /* Try reading at that linetab offset */
1392
    }
1393
 
1394
  rawptr = &linetab[file_offset - linetab_offset];
1395
 
1396
  /* skip first line entry for each function */
1397
  rawptr += local_linesz;
1398
  /* line numbers start at one for the first line of the function */
1399
  first_line--;
1400
 
1401
  for (;;)
1402
    {
1403
      bfd_coff_swap_lineno_in (symfile_bfd, rawptr, &lptr);
1404
      rawptr += local_linesz;
1405
      /* The next function, or the sentinel, will have L_LNNO32 zero; we exit. */
1406
      if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
1407
        record_line (current_subfile, first_line + L_LNNO32 (&lptr),
1408
                     lptr.l_addr.l_paddr
1409
                     + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)));
1410
      else
1411
        break;
1412
    }
1413
}
1414
 
1415
static void
1416
patch_type (struct type *type, struct type *real_type)
1417
{
1418
  register struct type *target = TYPE_TARGET_TYPE (type);
1419
  register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1420
  int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1421
 
1422
  TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1423
  TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1424
  TYPE_FIELDS (target) = (struct field *) TYPE_ALLOC (target, field_size);
1425
 
1426
  memcpy (TYPE_FIELDS (target), TYPE_FIELDS (real_target), field_size);
1427
 
1428
  if (TYPE_NAME (real_target))
1429
    {
1430
      if (TYPE_NAME (target))
1431
        xfree (TYPE_NAME (target));
1432
      TYPE_NAME (target) = concat (TYPE_NAME (real_target), NULL);
1433
    }
1434
}
1435
 
1436
/* Patch up all appropriate typedef symbols in the opaque_type_chains
1437
   so that they can be used to print out opaque data structures properly.  */
1438
 
1439
static void
1440
patch_opaque_types (struct symtab *s)
1441
{
1442
  register struct block *b;
1443
  register int i;
1444
  register struct symbol *real_sym;
1445
 
1446
  /* Go through the per-file symbols only */
1447
  b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
1448
  for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--)
1449
    {
1450
      /* Find completed typedefs to use to fix opaque ones.
1451
         Remove syms from the chain when their types are stored,
1452
         but search the whole chain, as there may be several syms
1453
         from different files with the same name.  */
1454
      real_sym = BLOCK_SYM (b, i);
1455
      if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1456
          SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE &&
1457
          TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1458
          TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1459
        {
1460
          register char *name = SYMBOL_NAME (real_sym);
1461
          register int hash = hashname (name);
1462
          register struct symbol *sym, *prev;
1463
 
1464
          prev = 0;
1465
          for (sym = opaque_type_chain[hash]; sym;)
1466
            {
1467
              if (name[0] == SYMBOL_NAME (sym)[0] &&
1468
                  STREQ (name + 1, SYMBOL_NAME (sym) + 1))
1469
                {
1470
                  if (prev)
1471
                    {
1472
                      SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym);
1473
                    }
1474
                  else
1475
                    {
1476
                      opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym);
1477
                    }
1478
 
1479
                  patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1480
 
1481
                  if (prev)
1482
                    {
1483
                      sym = SYMBOL_VALUE_CHAIN (prev);
1484
                    }
1485
                  else
1486
                    {
1487
                      sym = opaque_type_chain[hash];
1488
                    }
1489
                }
1490
              else
1491
                {
1492
                  prev = sym;
1493
                  sym = SYMBOL_VALUE_CHAIN (sym);
1494
                }
1495
            }
1496
        }
1497
    }
1498
}
1499
 
1500
static struct symbol *
1501
process_coff_symbol (register struct coff_symbol *cs,
1502
                     register union internal_auxent *aux,
1503
                     struct objfile *objfile)
1504
{
1505
  register struct symbol *sym
1506
  = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
1507
                                     sizeof (struct symbol));
1508
  char *name;
1509
 
1510
  memset (sym, 0, sizeof (struct symbol));
1511
  name = cs->c_name;
1512
  name = EXTERNAL_NAME (name, objfile->obfd);
1513
  SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
1514
                                    &objfile->symbol_obstack);
1515
  SYMBOL_LANGUAGE (sym) = language_auto;
1516
  SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack);
1517
 
1518
  /* default assumptions */
1519
  SYMBOL_VALUE (sym) = cs->c_value;
1520
  SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1521
  SYMBOL_SECTION (sym) = cs_to_section (cs, objfile);
1522
 
1523
  if (ISFCN (cs->c_type))
1524
    {
1525
      SYMBOL_VALUE (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1526
      SYMBOL_TYPE (sym) =
1527
        lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1528
 
1529
      SYMBOL_CLASS (sym) = LOC_BLOCK;
1530
      if (cs->c_sclass == C_STAT || cs->c_sclass == C_THUMBSTAT
1531
          || cs->c_sclass == C_THUMBSTATFUNC)
1532
        add_symbol_to_list (sym, &file_symbols);
1533
      else if (cs->c_sclass == C_EXT || cs->c_sclass == C_THUMBEXT
1534
               || cs->c_sclass == C_THUMBEXTFUNC)
1535
        add_symbol_to_list (sym, &global_symbols);
1536
    }
1537
  else
1538
    {
1539
      SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1540
      switch (cs->c_sclass)
1541
        {
1542
        case C_NULL:
1543
          break;
1544
 
1545
        case C_AUTO:
1546
          SYMBOL_CLASS (sym) = LOC_LOCAL;
1547
          add_symbol_to_list (sym, &local_symbols);
1548
          break;
1549
 
1550
        case C_THUMBEXT:
1551
        case C_THUMBEXTFUNC:
1552
        case C_EXT:
1553
          SYMBOL_CLASS (sym) = LOC_STATIC;
1554
          SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1555
          SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1556
          add_symbol_to_list (sym, &global_symbols);
1557
          break;
1558
 
1559
        case C_THUMBSTAT:
1560
        case C_THUMBSTATFUNC:
1561
        case C_STAT:
1562
          SYMBOL_CLASS (sym) = LOC_STATIC;
1563
          SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1564
          SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1565
          if (within_function)
1566
            {
1567
              /* Static symbol of local scope */
1568
              add_symbol_to_list (sym, &local_symbols);
1569
            }
1570
          else
1571
            {
1572
              /* Static symbol at top level of file */
1573
              add_symbol_to_list (sym, &file_symbols);
1574
            }
1575
          break;
1576
 
1577
#ifdef C_GLBLREG                /* AMD coff */
1578
        case C_GLBLREG:
1579
#endif
1580
        case C_REG:
1581
          SYMBOL_CLASS (sym) = LOC_REGISTER;
1582
          SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM (cs->c_value);
1583
          add_symbol_to_list (sym, &local_symbols);
1584
          break;
1585
 
1586
        case C_THUMBLABEL:
1587
        case C_LABEL:
1588
          break;
1589
 
1590
        case C_ARG:
1591
          SYMBOL_CLASS (sym) = LOC_ARG;
1592
          add_symbol_to_list (sym, &local_symbols);
1593
#if !defined (BELIEVE_PCC_PROMOTION)
1594
          if (TARGET_BYTE_ORDER == BIG_ENDIAN)
1595
            {
1596
              /* If PCC says a parameter is a short or a char,
1597
                 aligned on an int boundary, realign it to the
1598
                 "little end" of the int.  */
1599
              struct type *temptype;
1600
              temptype = lookup_fundamental_type (current_objfile,
1601
                                                  FT_INTEGER);
1602
              if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1603
                  && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
1604
                  && 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (temptype))
1605
                {
1606
                  SYMBOL_VALUE (sym) +=
1607
                    TYPE_LENGTH (temptype)
1608
                    - TYPE_LENGTH (SYMBOL_TYPE (sym));
1609
                }
1610
            }
1611
#endif
1612
          break;
1613
 
1614
        case C_REGPARM:
1615
          SYMBOL_CLASS (sym) = LOC_REGPARM;
1616
          SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM (cs->c_value);
1617
          add_symbol_to_list (sym, &local_symbols);
1618
#if !defined (BELIEVE_PCC_PROMOTION)
1619
          /* FIXME:  This should retain the current type, since it's just
1620
             a register value.  gnu@adobe, 26Feb93 */
1621
          {
1622
            /* If PCC says a parameter is a short or a char,
1623
               it is really an int.  */
1624
            struct type *temptype;
1625
            temptype =
1626
              lookup_fundamental_type (current_objfile, FT_INTEGER);
1627
            if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1628
                && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
1629
              {
1630
                SYMBOL_TYPE (sym) =
1631
                  (TYPE_UNSIGNED (SYMBOL_TYPE (sym))
1632
                   ? lookup_fundamental_type (current_objfile,
1633
                                              FT_UNSIGNED_INTEGER)
1634
                   : temptype);
1635
              }
1636
          }
1637
#endif
1638
          break;
1639
 
1640
        case C_TPDEF:
1641
          SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1642
          SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1643
 
1644
          /* If type has no name, give it one */
1645
          if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
1646
            {
1647
              if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR
1648
                  || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FUNC)
1649
                {
1650
                  /* If we are giving a name to a type such as "pointer to
1651
                     foo" or "function returning foo", we better not set
1652
                     the TYPE_NAME.  If the program contains "typedef char
1653
                     *caddr_t;", we don't want all variables of type char
1654
                     * to print as caddr_t.  This is not just a
1655
                     consequence of GDB's type management; CC and GCC (at
1656
                     least through version 2.4) both output variables of
1657
                     either type char * or caddr_t with the type
1658
                     refering to the C_TPDEF symbol for caddr_t.  If a future
1659
                     compiler cleans this up it GDB is not ready for it
1660
                     yet, but if it becomes ready we somehow need to
1661
                     disable this check (without breaking the PCC/GCC2.4
1662
                     case).
1663
 
1664
                     Sigh.
1665
 
1666
                     Fortunately, this check seems not to be necessary
1667
                     for anything except pointers or functions.  */
1668
                  ;
1669
                }
1670
              else
1671
                TYPE_NAME (SYMBOL_TYPE (sym)) =
1672
                  concat (SYMBOL_NAME (sym), NULL);
1673
            }
1674
#ifdef CXUX_TARGET
1675
          /* Ignore vendor section for Harris CX/UX targets. */
1676
          else if (cs->c_name[0] == '$')
1677
            break;
1678
#endif /* CXUX_TARGET */
1679
 
1680
          /* Keep track of any type which points to empty structured type,
1681
             so it can be filled from a definition from another file.  A
1682
             simple forward reference (TYPE_CODE_UNDEF) is not an
1683
             empty structured type, though; the forward references
1684
             work themselves out via the magic of coff_lookup_type.  */
1685
          if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1686
              TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0 &&
1687
              TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) !=
1688
              TYPE_CODE_UNDEF)
1689
            {
1690
              register int i = hashname (SYMBOL_NAME (sym));
1691
 
1692
              SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i];
1693
              opaque_type_chain[i] = sym;
1694
            }
1695
          add_symbol_to_list (sym, &file_symbols);
1696
          break;
1697
 
1698
        case C_STRTAG:
1699
        case C_UNTAG:
1700
        case C_ENTAG:
1701
          SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1702
          SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1703
 
1704
          /* Some compilers try to be helpful by inventing "fake"
1705
             names for anonymous enums, structures, and unions, like
1706
             "~0fake" or ".0fake".  Thanks, but no thanks... */
1707
          if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
1708
            if (SYMBOL_NAME (sym) != NULL
1709
                && *SYMBOL_NAME (sym) != '~'
1710
                && *SYMBOL_NAME (sym) != '.')
1711
              TYPE_TAG_NAME (SYMBOL_TYPE (sym)) =
1712
                concat (SYMBOL_NAME (sym), NULL);
1713
 
1714
          add_symbol_to_list (sym, &file_symbols);
1715
          break;
1716
 
1717
        default:
1718
          break;
1719
        }
1720
    }
1721
  return sym;
1722
}
1723
 
1724
/* Decode a coff type specifier;  return the type that is meant.  */
1725
 
1726
static struct type *
1727
decode_type (register struct coff_symbol *cs, unsigned int c_type,
1728
             register union internal_auxent *aux)
1729
{
1730
  register struct type *type = 0;
1731
  unsigned int new_c_type;
1732
 
1733
  if (c_type & ~N_BTMASK)
1734
    {
1735
      new_c_type = DECREF (c_type);
1736
      if (ISPTR (c_type))
1737
        {
1738
          type = decode_type (cs, new_c_type, aux);
1739
          type = lookup_pointer_type (type);
1740
        }
1741
      else if (ISFCN (c_type))
1742
        {
1743
          type = decode_type (cs, new_c_type, aux);
1744
          type = lookup_function_type (type);
1745
        }
1746
      else if (ISARY (c_type))
1747
        {
1748
          int i, n;
1749
          register unsigned short *dim;
1750
          struct type *base_type, *index_type, *range_type;
1751
 
1752
          /* Define an array type.  */
1753
          /* auxent refers to array, not base type */
1754
          if (aux->x_sym.x_tagndx.l == 0)
1755
            cs->c_naux = 0;
1756
 
1757
          /* shift the indices down */
1758
          dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1759
          i = 1;
1760
          n = dim[0];
1761
          for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1762
            *dim = *(dim + 1);
1763
          *dim = 0;
1764
 
1765
          base_type = decode_type (cs, new_c_type, aux);
1766
          index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
1767
          range_type =
1768
            create_range_type ((struct type *) NULL, index_type, 0, n - 1);
1769
          type =
1770
            create_array_type ((struct type *) NULL, base_type, range_type);
1771
        }
1772
      return type;
1773
    }
1774
 
1775
  /* Reference to existing type.  This only occurs with the
1776
     struct, union, and enum types.  EPI a29k coff
1777
     fakes us out by producing aux entries with a nonzero
1778
     x_tagndx for definitions of structs, unions, and enums, so we
1779
     have to check the c_sclass field.  SCO 3.2v4 cc gets confused
1780
     with pointers to pointers to defined structs, and generates
1781
     negative x_tagndx fields.  */
1782
  if (cs->c_naux > 0 && aux->x_sym.x_tagndx.l != 0)
1783
    {
1784
      if (cs->c_sclass != C_STRTAG
1785
          && cs->c_sclass != C_UNTAG
1786
          && cs->c_sclass != C_ENTAG
1787
          && aux->x_sym.x_tagndx.l >= 0)
1788
        {
1789
          type = coff_alloc_type (aux->x_sym.x_tagndx.l);
1790
          return type;
1791
        }
1792
      else
1793
        {
1794
          complain (&tagndx_bad_complaint, cs->c_name);
1795
          /* And fall through to decode_base_type... */
1796
        }
1797
    }
1798
 
1799
  return decode_base_type (cs, BTYPE (c_type), aux);
1800
}
1801
 
1802
/* Decode a coff type specifier for function definition;
1803
   return the type that the function returns.  */
1804
 
1805
static struct type *
1806
decode_function_type (register struct coff_symbol *cs, unsigned int c_type,
1807
                      register union internal_auxent *aux)
1808
{
1809
  if (aux->x_sym.x_tagndx.l == 0)
1810
    cs->c_naux = 0;              /* auxent refers to function, not base type */
1811
 
1812
  return decode_type (cs, DECREF (c_type), aux);
1813
}
1814
 
1815
/* basic C types */
1816
 
1817
static struct type *
1818
decode_base_type (register struct coff_symbol *cs, unsigned int c_type,
1819
                  register union internal_auxent *aux)
1820
{
1821
  struct type *type;
1822
 
1823
  switch (c_type)
1824
    {
1825
    case T_NULL:
1826
      /* shows up with "void (*foo)();" structure members */
1827
      return lookup_fundamental_type (current_objfile, FT_VOID);
1828
 
1829
#if 0
1830
/* DGUX actually defines both T_ARG and T_VOID to the same value.  */
1831
#ifdef T_ARG
1832
    case T_ARG:
1833
      /* Shows up in DGUX, I think.  Not sure where.  */
1834
      return lookup_fundamental_type (current_objfile, FT_VOID);        /* shouldn't show up here */
1835
#endif
1836
#endif /* 0 */
1837
 
1838
#ifdef T_VOID
1839
    case T_VOID:
1840
      /* Intel 960 COFF has this symbol and meaning.  */
1841
      return lookup_fundamental_type (current_objfile, FT_VOID);
1842
#endif
1843
 
1844
    case T_CHAR:
1845
      return lookup_fundamental_type (current_objfile, FT_CHAR);
1846
 
1847
    case T_SHORT:
1848
      return lookup_fundamental_type (current_objfile, FT_SHORT);
1849
 
1850
    case T_INT:
1851
      return lookup_fundamental_type (current_objfile, FT_INTEGER);
1852
 
1853
    case T_LONG:
1854
      if (cs->c_sclass == C_FIELD
1855
          && aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
1856
        return lookup_fundamental_type (current_objfile, FT_LONG_LONG);
1857
      else
1858
        return lookup_fundamental_type (current_objfile, FT_LONG);
1859
 
1860
    case T_FLOAT:
1861
      return lookup_fundamental_type (current_objfile, FT_FLOAT);
1862
 
1863
    case T_DOUBLE:
1864
      return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
1865
 
1866
    case T_LNGDBL:
1867
      return lookup_fundamental_type (current_objfile, FT_EXT_PREC_FLOAT);
1868
 
1869
    case T_STRUCT:
1870
      if (cs->c_naux != 1)
1871
        {
1872
          /* anonymous structure type */
1873
          type = coff_alloc_type (cs->c_symnum);
1874
          TYPE_CODE (type) = TYPE_CODE_STRUCT;
1875
          TYPE_NAME (type) = NULL;
1876
          /* This used to set the tag to "<opaque>".  But I think setting it
1877
             to NULL is right, and the printing code can print it as
1878
             "struct {...}".  */
1879
          TYPE_TAG_NAME (type) = NULL;
1880
          INIT_CPLUS_SPECIFIC (type);
1881
          TYPE_LENGTH (type) = 0;
1882
          TYPE_FIELDS (type) = 0;
1883
          TYPE_NFIELDS (type) = 0;
1884
        }
1885
      else
1886
        {
1887
          type = coff_read_struct_type (cs->c_symnum,
1888
                                        aux->x_sym.x_misc.x_lnsz.x_size,
1889
                                      aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1890
        }
1891
      return type;
1892
 
1893
    case T_UNION:
1894
      if (cs->c_naux != 1)
1895
        {
1896
          /* anonymous union type */
1897
          type = coff_alloc_type (cs->c_symnum);
1898
          TYPE_NAME (type) = NULL;
1899
          /* This used to set the tag to "<opaque>".  But I think setting it
1900
             to NULL is right, and the printing code can print it as
1901
             "union {...}".  */
1902
          TYPE_TAG_NAME (type) = NULL;
1903
          INIT_CPLUS_SPECIFIC (type);
1904
          TYPE_LENGTH (type) = 0;
1905
          TYPE_FIELDS (type) = 0;
1906
          TYPE_NFIELDS (type) = 0;
1907
        }
1908
      else
1909
        {
1910
          type = coff_read_struct_type (cs->c_symnum,
1911
                                        aux->x_sym.x_misc.x_lnsz.x_size,
1912
                                      aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1913
        }
1914
      TYPE_CODE (type) = TYPE_CODE_UNION;
1915
      return type;
1916
 
1917
    case T_ENUM:
1918
      if (cs->c_naux != 1)
1919
        {
1920
          /* anonymous enum type */
1921
          type = coff_alloc_type (cs->c_symnum);
1922
          TYPE_CODE (type) = TYPE_CODE_ENUM;
1923
          TYPE_NAME (type) = NULL;
1924
          /* This used to set the tag to "<opaque>".  But I think setting it
1925
             to NULL is right, and the printing code can print it as
1926
             "enum {...}".  */
1927
          TYPE_TAG_NAME (type) = NULL;
1928
          TYPE_LENGTH (type) = 0;
1929
          TYPE_FIELDS (type) = 0;
1930
          TYPE_NFIELDS (type) = 0;
1931
        }
1932
      else
1933
        {
1934
          type = coff_read_enum_type (cs->c_symnum,
1935
                                      aux->x_sym.x_misc.x_lnsz.x_size,
1936
                                      aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1937
        }
1938
      return type;
1939
 
1940
    case T_MOE:
1941
      /* shouldn't show up here */
1942
      break;
1943
 
1944
    case T_UCHAR:
1945
      return lookup_fundamental_type (current_objfile, FT_UNSIGNED_CHAR);
1946
 
1947
    case T_USHORT:
1948
      return lookup_fundamental_type (current_objfile, FT_UNSIGNED_SHORT);
1949
 
1950
    case T_UINT:
1951
      return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
1952
 
1953
    case T_ULONG:
1954
      if (cs->c_sclass == C_FIELD
1955
          && aux->x_sym.x_misc.x_lnsz.x_size > TARGET_LONG_BIT)
1956
        return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG_LONG);
1957
      else
1958
        return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
1959
    }
1960
  complain (&unexpected_type_complaint, cs->c_name);
1961
  return lookup_fundamental_type (current_objfile, FT_VOID);
1962
}
1963
 
1964
/* This page contains subroutines of read_type.  */
1965
 
1966
/* Read the description of a structure (or union type) and return an
1967
   object describing the type.  */
1968
 
1969
static struct type *
1970
coff_read_struct_type (int index, int length, int lastsym)
1971
{
1972
  struct nextfield
1973
    {
1974
      struct nextfield *next;
1975
      struct field field;
1976
    };
1977
 
1978
  register struct type *type;
1979
  register struct nextfield *list = 0;
1980
  struct nextfield *new;
1981
  int nfields = 0;
1982
  register int n;
1983
  char *name;
1984
  struct coff_symbol member_sym;
1985
  register struct coff_symbol *ms = &member_sym;
1986
  struct internal_syment sub_sym;
1987
  union internal_auxent sub_aux;
1988
  int done = 0;
1989
 
1990
  type = coff_alloc_type (index);
1991
  TYPE_CODE (type) = TYPE_CODE_STRUCT;
1992
  INIT_CPLUS_SPECIFIC (type);
1993
  TYPE_LENGTH (type) = length;
1994
 
1995
  while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1996
    {
1997
      read_one_sym (ms, &sub_sym, &sub_aux);
1998
      name = ms->c_name;
1999
      name = EXTERNAL_NAME (name, current_objfile->obfd);
2000
 
2001
      switch (ms->c_sclass)
2002
        {
2003
        case C_MOS:
2004
        case C_MOU:
2005
 
2006
          /* Get space to record the next field's data.  */
2007
          new = (struct nextfield *) alloca (sizeof (struct nextfield));
2008
          new->next = list;
2009
          list = new;
2010
 
2011
          /* Save the data.  */
2012
          list->field.name =
2013
            obsavestring (name,
2014
                          strlen (name),
2015
                          &current_objfile->symbol_obstack);
2016
          FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
2017
          FIELD_BITPOS (list->field) = 8 * ms->c_value;
2018
          FIELD_BITSIZE (list->field) = 0;
2019
          nfields++;
2020
          break;
2021
 
2022
        case C_FIELD:
2023
 
2024
          /* Get space to record the next field's data.  */
2025
          new = (struct nextfield *) alloca (sizeof (struct nextfield));
2026
          new->next = list;
2027
          list = new;
2028
 
2029
          /* Save the data.  */
2030
          list->field.name =
2031
            obsavestring (name,
2032
                          strlen (name),
2033
                          &current_objfile->symbol_obstack);
2034
          FIELD_TYPE (list->field) = decode_type (ms, ms->c_type, &sub_aux);
2035
          FIELD_BITPOS (list->field) = ms->c_value;
2036
          FIELD_BITSIZE (list->field) = sub_aux.x_sym.x_misc.x_lnsz.x_size;
2037
          nfields++;
2038
          break;
2039
 
2040
        case C_EOS:
2041
          done = 1;
2042
          break;
2043
        }
2044
    }
2045
  /* Now create the vector of fields, and record how big it is.  */
2046
 
2047
  TYPE_NFIELDS (type) = nfields;
2048
  TYPE_FIELDS (type) = (struct field *)
2049
    TYPE_ALLOC (type, sizeof (struct field) * nfields);
2050
 
2051
  /* Copy the saved-up fields into the field vector.  */
2052
 
2053
  for (n = nfields; list; list = list->next)
2054
    TYPE_FIELD (type, --n) = list->field;
2055
 
2056
  return type;
2057
}
2058
 
2059
/* Read a definition of an enumeration type,
2060
   and create and return a suitable type object.
2061
   Also defines the symbols that represent the values of the type.  */
2062
 
2063
/* ARGSUSED */
2064
static struct type *
2065
coff_read_enum_type (int index, int length, int lastsym)
2066
{
2067
  register struct symbol *sym;
2068
  register struct type *type;
2069
  int nsyms = 0;
2070
  int done = 0;
2071
  struct pending **symlist;
2072
  struct coff_symbol member_sym;
2073
  register struct coff_symbol *ms = &member_sym;
2074
  struct internal_syment sub_sym;
2075
  union internal_auxent sub_aux;
2076
  struct pending *osyms, *syms;
2077
  int o_nsyms;
2078
  register int n;
2079
  char *name;
2080
  int unsigned_enum = 1;
2081
 
2082
  type = coff_alloc_type (index);
2083
  if (within_function)
2084
    symlist = &local_symbols;
2085
  else
2086
    symlist = &file_symbols;
2087
  osyms = *symlist;
2088
  o_nsyms = osyms ? osyms->nsyms : 0;
2089
 
2090
  while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
2091
    {
2092
      read_one_sym (ms, &sub_sym, &sub_aux);
2093
      name = ms->c_name;
2094
      name = EXTERNAL_NAME (name, current_objfile->obfd);
2095
 
2096
      switch (ms->c_sclass)
2097
        {
2098
        case C_MOE:
2099
          sym = (struct symbol *) obstack_alloc
2100
            (&current_objfile->symbol_obstack,
2101
             sizeof (struct symbol));
2102
          memset (sym, 0, sizeof (struct symbol));
2103
 
2104
          SYMBOL_NAME (sym) =
2105
            obsavestring (name, strlen (name),
2106
                          &current_objfile->symbol_obstack);
2107
          SYMBOL_CLASS (sym) = LOC_CONST;
2108
          SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
2109
          SYMBOL_VALUE (sym) = ms->c_value;
2110
          add_symbol_to_list (sym, symlist);
2111
          nsyms++;
2112
          break;
2113
 
2114
        case C_EOS:
2115
          /* Sometimes the linker (on 386/ix 2.0.2 at least) screws
2116
             up the count of how many symbols to read.  So stop
2117
             on .eos.  */
2118
          done = 1;
2119
          break;
2120
        }
2121
    }
2122
 
2123
  /* Now fill in the fields of the type-structure.  */
2124
 
2125
  if (length > 0)
2126
    TYPE_LENGTH (type) = length;
2127
  else
2128
    TYPE_LENGTH (type) = TARGET_INT_BIT / TARGET_CHAR_BIT;      /* Assume ints */
2129
  TYPE_CODE (type) = TYPE_CODE_ENUM;
2130
  TYPE_NFIELDS (type) = nsyms;
2131
  TYPE_FIELDS (type) = (struct field *)
2132
    TYPE_ALLOC (type, sizeof (struct field) * nsyms);
2133
 
2134
  /* Find the symbols for the values and put them into the type.
2135
     The symbols can be found in the symlist that we put them on
2136
     to cause them to be defined.  osyms contains the old value
2137
     of that symlist; everything up to there was defined by us.  */
2138
  /* Note that we preserve the order of the enum constants, so
2139
     that in something like "enum {FOO, LAST_THING=FOO}" we print
2140
     FOO, not LAST_THING.  */
2141
 
2142
  for (syms = *symlist, n = 0; syms; syms = syms->next)
2143
    {
2144
      int j = 0;
2145
 
2146
      if (syms == osyms)
2147
        j = o_nsyms;
2148
      for (; j < syms->nsyms; j++, n++)
2149
        {
2150
          struct symbol *xsym = syms->symbol[j];
2151
          SYMBOL_TYPE (xsym) = type;
2152
          TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym);
2153
          TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym);
2154
          if (SYMBOL_VALUE (xsym) < 0)
2155
            unsigned_enum = 0;
2156
          TYPE_FIELD_BITSIZE (type, n) = 0;
2157
        }
2158
      if (syms == osyms)
2159
        break;
2160
    }
2161
 
2162
  if (unsigned_enum)
2163
    TYPE_FLAGS (type) |= TYPE_FLAG_UNSIGNED;
2164
 
2165
  return type;
2166
}
2167
 
2168
/* Register our ability to parse symbols for coff BFD files. */
2169
 
2170
static struct sym_fns coff_sym_fns =
2171
{
2172
  bfd_target_coff_flavour,
2173
  coff_new_init,                /* sym_new_init: init anything gbl to entire symtab */
2174
  coff_symfile_init,            /* sym_init: read initial info, setup for sym_read() */
2175
  coff_symfile_read,            /* sym_read: read a symbol file into symtab */
2176
  coff_symfile_finish,          /* sym_finish: finished with file, cleanup */
2177
  default_symfile_offsets,      /* sym_offsets:  xlate external to internal form */
2178
  NULL                          /* next: pointer to next struct sym_fns */
2179
};
2180
 
2181
void
2182
_initialize_coffread (void)
2183
{
2184
  add_symtab_fns (&coff_sym_fns);
2185
}

powered by: WebSVN 2.1.0

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