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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [mdebugread.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 a symbol table in ECOFF format (Third-Eye).
2
   Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
3
   1997, 1998, 1999, 2000, 2001
4
   Free Software Foundation, Inc.
5
   Original version contributed by Alessandro Forin (af@cs.cmu.edu) at
6
   CMU.  Major work by Per Bothner, John Gilmore and Ian Lance Taylor
7
   at Cygnus Support.
8
 
9
   This file is part of GDB.
10
 
11
   This program is free software; you can redistribute it and/or modify
12
   it under the terms of the GNU General Public License as published by
13
   the Free Software Foundation; either version 2 of the License, or
14
   (at your option) any later version.
15
 
16
   This program is distributed in the hope that it will be useful,
17
   but WITHOUT ANY WARRANTY; without even the implied warranty of
18
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
   GNU General Public License for more details.
20
 
21
   You should have received a copy of the GNU General Public License
22
   along with this program; if not, write to the Free Software
23
   Foundation, Inc., 59 Temple Place - Suite 330,
24
   Boston, MA 02111-1307, USA.  */
25
 
26
/* This module provides the function mdebug_build_psymtabs.  It reads
27
   ECOFF debugging information into partial symbol tables.  The
28
   debugging information is read from two structures.  A struct
29
   ecoff_debug_swap includes the sizes of each ECOFF structure and
30
   swapping routines; these are fixed for a particular target.  A
31
   struct ecoff_debug_info points to the debugging information for a
32
   particular object file.
33
 
34
   ECOFF symbol tables are mostly written in the byte order of the
35
   target machine.  However, one section of the table (the auxiliary
36
   symbol information) is written in the host byte order.  There is a
37
   bit in the other symbol info which describes which host byte order
38
   was used.  ECOFF thereby takes the trophy from Intel `b.out' for
39
   the most brain-dead adaptation of a file format to byte order.
40
 
41
   This module can read all four of the known byte-order combinations,
42
   on any type of host.  */
43
 
44
#include "defs.h"
45
#include "symtab.h"
46
#include "gdbtypes.h"
47
#include "gdbcore.h"
48
#include "symfile.h"
49
#include "objfiles.h"
50
#include "obstack.h"
51
#include "buildsym.h"
52
#include "stabsread.h"
53
#include "complaints.h"
54
#include "demangle.h"
55
 
56
/* These are needed if the tm.h file does not contain the necessary
57
   mips specific definitions.  */
58
 
59
#ifndef MIPS_EFI_SYMBOL_NAME
60
#define MIPS_EFI_SYMBOL_NAME "__GDB_EFI_INFO__"
61
extern void ecoff_relocate_efi (struct symbol *, CORE_ADDR);
62
#include "coff/sym.h"
63
#include "coff/symconst.h"
64
typedef struct mips_extra_func_info
65
  {
66
    long numargs;
67
    PDR pdr;
68
  }
69
 *mips_extra_func_info_t;
70
#ifndef RA_REGNUM
71
#define RA_REGNUM 0
72
#endif
73
#endif
74
 
75
#ifdef USG
76
#include <sys/types.h>
77
#endif
78
 
79
#include "gdb_stat.h"
80
#include "gdb_string.h"
81
 
82
#include "bfd.h"
83
 
84
#include "coff/ecoff.h"         /* COFF-like aspects of ecoff files */
85
 
86
#include "libaout.h"            /* Private BFD a.out information.  */
87
#include "aout/aout64.h"
88
#include "aout/stab_gnu.h"      /* STABS information */
89
 
90
#include "expression.h"
91
#include "language.h"           /* Needed inside partial-stab.h */
92
 
93
extern void _initialize_mdebugread (void);
94
 
95
/* Provide a way to test if we have both ECOFF and ELF symbol tables.
96
   We use this define in order to know whether we should override a
97
   symbol's ECOFF section with its ELF section.  This is necessary in
98
   case the symbol's ELF section could not be represented in ECOFF.  */
99
#define ECOFF_IN_ELF(bfd) (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
100
                           && bfd_get_section_by_name (bfd, ".mdebug") != NULL)
101
 
102
 
103
/* We put a pointer to this structure in the read_symtab_private field
104
   of the psymtab.  */
105
 
106
struct symloc
107
  {
108
    /* Index of the FDR that this psymtab represents.  */
109
    int fdr_idx;
110
    /* The BFD that the psymtab was created from.  */
111
    bfd *cur_bfd;
112
    const struct ecoff_debug_swap *debug_swap;
113
    struct ecoff_debug_info *debug_info;
114
    struct mdebug_pending **pending_list;
115
    /* Pointer to external symbols for this file.  */
116
    EXTR *extern_tab;
117
    /* Size of extern_tab.  */
118
    int extern_count;
119
    enum language pst_language;
120
  };
121
 
122
#define PST_PRIVATE(p) ((struct symloc *)(p)->read_symtab_private)
123
#define FDR_IDX(p) (PST_PRIVATE(p)->fdr_idx)
124
#define CUR_BFD(p) (PST_PRIVATE(p)->cur_bfd)
125
#define DEBUG_SWAP(p) (PST_PRIVATE(p)->debug_swap)
126
#define DEBUG_INFO(p) (PST_PRIVATE(p)->debug_info)
127
#define PENDING_LIST(p) (PST_PRIVATE(p)->pending_list)
128
 
129
#define SC_IS_TEXT(sc) ((sc) == scText \
130
                   || (sc) == scRConst \
131
                   || (sc) == scInit \
132
                   || (sc) == scFini)
133
#define SC_IS_DATA(sc) ((sc) == scData \
134
                   || (sc) == scSData \
135
                   || (sc) == scRData \
136
                   || (sc) == scPData \
137
                   || (sc) == scXData)
138
#define SC_IS_COMMON(sc) ((sc) == scCommon || (sc) == scSCommon)
139
#define SC_IS_BSS(sc) ((sc) == scBss || (sc) == scSBss)
140
#define SC_IS_UNDEF(sc) ((sc) == scUndefined || (sc) == scSUndefined)
141
 
142
 
143
/* Things we import explicitly from other modules */
144
 
145
extern int info_verbose;
146
 
147
/* Various complaints about symbol reading that don't abort the process */
148
 
149
static struct complaint bad_file_number_complaint =
150
{"bad file number %d", 0, 0};
151
 
152
static struct complaint index_complaint =
153
{"bad aux index at symbol %s", 0, 0};
154
 
155
static struct complaint aux_index_complaint =
156
{"bad proc end in aux found from symbol %s", 0, 0};
157
 
158
static struct complaint block_index_complaint =
159
{"bad aux index at block symbol %s", 0, 0};
160
 
161
static struct complaint unknown_ext_complaint =
162
{"unknown external symbol %s", 0, 0};
163
 
164
static struct complaint unknown_sym_complaint =
165
{"unknown local symbol %s", 0, 0};
166
 
167
static struct complaint unknown_st_complaint =
168
{"with type %d", 0, 0};
169
 
170
static struct complaint block_overflow_complaint =
171
{"block containing %s overfilled", 0, 0};
172
 
173
static struct complaint basic_type_complaint =
174
{"cannot map ECOFF basic type 0x%x for %s", 0, 0};
175
 
176
static struct complaint unknown_type_qual_complaint =
177
{"unknown type qualifier 0x%x", 0, 0};
178
 
179
static struct complaint array_index_type_complaint =
180
{"illegal array index type for %s, assuming int", 0, 0};
181
 
182
static struct complaint bad_tag_guess_complaint =
183
{"guessed tag type of %s incorrectly", 0, 0};
184
 
185
static struct complaint block_member_complaint =
186
{"declaration block contains unhandled symbol type %d", 0, 0};
187
 
188
static struct complaint stEnd_complaint =
189
{"stEnd with storage class %d not handled", 0, 0};
190
 
191
static struct complaint unknown_mdebug_symtype_complaint =
192
{"unknown symbol type 0x%x", 0, 0};
193
 
194
static struct complaint stab_unknown_complaint =
195
{"unknown stabs symbol %s", 0, 0};
196
 
197
static struct complaint pdr_for_nonsymbol_complaint =
198
{"PDR for %s, but no symbol", 0, 0};
199
 
200
static struct complaint pdr_static_symbol_complaint =
201
{"can't handle PDR for static proc at 0x%lx", 0, 0};
202
 
203
static struct complaint bad_setjmp_pdr_complaint =
204
{"fixing bad setjmp PDR from libc", 0, 0};
205
 
206
static struct complaint bad_fbitfield_complaint =
207
{"can't handle TIR fBitfield for %s", 0, 0};
208
 
209
static struct complaint bad_continued_complaint =
210
{"illegal TIR continued for %s", 0, 0};
211
 
212
static struct complaint bad_rfd_entry_complaint =
213
{"bad rfd entry for %s: file %d, index %d", 0, 0};
214
 
215
static struct complaint unexpected_type_code_complaint =
216
{"unexpected type code for %s", 0, 0};
217
 
218
static struct complaint unable_to_cross_ref_complaint =
219
{"unable to cross ref btTypedef for %s", 0, 0};
220
 
221
static struct complaint bad_indirect_xref_complaint =
222
{"unable to cross ref btIndirect for %s", 0, 0};
223
 
224
static struct complaint illegal_forward_tq0_complaint =
225
{"illegal tq0 in forward typedef for %s", 0, 0};
226
 
227
static struct complaint illegal_forward_bt_complaint =
228
{"illegal bt %d in forward typedef for %s", 0, 0};
229
 
230
static struct complaint bad_linetable_guess_complaint =
231
{"guessed size of linetable for %s incorrectly", 0, 0};
232
 
233
static struct complaint bad_ext_ifd_complaint =
234
{"bad ifd for external symbol: %d (max %d)", 0, 0};
235
 
236
static struct complaint bad_ext_iss_complaint =
237
{"bad iss for external symbol: %ld (max %ld)", 0, 0};
238
 
239
/* Macros and extra defs */
240
 
241
/* Puns: hard to find whether -g was used and how */
242
 
243
#define MIN_GLEVEL GLEVEL_0
244
#define compare_glevel(a,b)                                     \
245
        (((a) == GLEVEL_3) ? ((b) < GLEVEL_3) :                 \
246
         ((b) == GLEVEL_3) ? -1 : (int)((b) - (a)))
247
 
248
/* Things that really are local to this module */
249
 
250
/* Remember what we deduced to be the source language of this psymtab. */
251
 
252
static enum language psymtab_language = language_unknown;
253
 
254
/* Current BFD.  */
255
 
256
static bfd *cur_bfd;
257
 
258
/* How to parse debugging information for CUR_BFD.  */
259
 
260
static const struct ecoff_debug_swap *debug_swap;
261
 
262
/* Pointers to debugging information for CUR_BFD.  */
263
 
264
static struct ecoff_debug_info *debug_info;
265
 
266
/* Pointer to current file decriptor record, and its index */
267
 
268
static FDR *cur_fdr;
269
static int cur_fd;
270
 
271
/* Index of current symbol */
272
 
273
static int cur_sdx;
274
 
275
/* Note how much "debuggable" this image is.  We would like
276
   to see at least one FDR with full symbols */
277
 
278
static int max_gdbinfo;
279
static int max_glevel;
280
 
281
/* When examining .o files, report on undefined symbols */
282
 
283
static int n_undef_symbols, n_undef_labels, n_undef_vars, n_undef_procs;
284
 
285
/* Pseudo symbol to use when putting stabs into the symbol table.  */
286
 
287
static char stabs_symbol[] = STABS_SYMBOL;
288
 
289
/* Types corresponding to mdebug format bt* basic types.  */
290
 
291
static struct type *mdebug_type_void;
292
static struct type *mdebug_type_char;
293
static struct type *mdebug_type_short;
294
static struct type *mdebug_type_int_32;
295
#define mdebug_type_int mdebug_type_int_32
296
static struct type *mdebug_type_int_64;
297
static struct type *mdebug_type_long_32;
298
static struct type *mdebug_type_long_64;
299
static struct type *mdebug_type_long_long_64;
300
static struct type *mdebug_type_unsigned_char;
301
static struct type *mdebug_type_unsigned_short;
302
static struct type *mdebug_type_unsigned_int_32;
303
static struct type *mdebug_type_unsigned_int_64;
304
static struct type *mdebug_type_unsigned_long_32;
305
static struct type *mdebug_type_unsigned_long_64;
306
static struct type *mdebug_type_unsigned_long_long_64;
307
static struct type *mdebug_type_adr_32;
308
static struct type *mdebug_type_adr_64;
309
static struct type *mdebug_type_float;
310
static struct type *mdebug_type_double;
311
static struct type *mdebug_type_complex;
312
static struct type *mdebug_type_double_complex;
313
static struct type *mdebug_type_fixed_dec;
314
static struct type *mdebug_type_float_dec;
315
static struct type *mdebug_type_string;
316
 
317
/* Types for symbols from files compiled without debugging info.  */
318
 
319
static struct type *nodebug_func_symbol_type;
320
static struct type *nodebug_var_symbol_type;
321
 
322
/* Nonzero if we have seen ecoff debugging info for a file.  */
323
 
324
static int found_ecoff_debugging_info;
325
 
326
/* Forward declarations */
327
 
328
static void add_pending (FDR *, char *, struct type *);
329
 
330
static struct mdebug_pending *is_pending_symbol (FDR *, char *);
331
 
332
static void pop_parse_stack (void);
333
 
334
static void push_parse_stack (void);
335
 
336
static char *fdr_name (FDR *);
337
 
338
static void mdebug_psymtab_to_symtab (struct partial_symtab *);
339
 
340
static int
341
upgrade_type (int, struct type **, int, union aux_ext *, int, char *);
342
 
343
static void parse_partial_symbols (struct objfile *);
344
 
345
static FDR * get_rfd (int, int);
346
 
347
static int has_opaque_xref (FDR *, SYMR *);
348
 
349
static int
350
cross_ref (int, union aux_ext *, struct type **, enum type_code,
351
           char **, int, char *);
352
 
353
static struct symbol *new_symbol (char *);
354
 
355
static struct type *new_type (char *);
356
 
357
static struct block *new_block (int);
358
 
359
static struct symtab *new_symtab (char *, int, int, struct objfile *);
360
 
361
static struct linetable *new_linetable (int);
362
 
363
static struct blockvector *new_bvect (int);
364
 
365
static int
366
parse_symbol (SYMR *, union aux_ext *, char *, int, struct section_offsets *,
367
              struct objfile *);
368
 
369
static struct type *parse_type (int, union aux_ext *, unsigned int, int *,
370
                                int, char *);
371
 
372
static struct symbol *mylookup_symbol (char *, struct block *, namespace_enum,
373
                                       enum address_class);
374
 
375
static struct block *shrink_block (struct block *, struct symtab *);
376
 
377
static PTR xzalloc (unsigned int);
378
 
379
static void sort_blocks (struct symtab *);
380
 
381
static int compare_blocks (const PTR, const PTR);
382
 
383
static struct partial_symtab *new_psymtab (char *, struct objfile *);
384
 
385
static void psymtab_to_symtab_1 (struct partial_symtab *, char *);
386
 
387
static void add_block (struct block *, struct symtab *);
388
 
389
static void add_symbol (struct symbol *, struct block *);
390
 
391
static int add_line (struct linetable *, int, CORE_ADDR, int);
392
 
393
static struct linetable *shrink_linetable (struct linetable *);
394
 
395
static void
396
handle_psymbol_enumerators (struct objfile *, FDR *, int, CORE_ADDR);
397
 
398
static char *mdebug_next_symbol_text (struct objfile *);
399
 
400
/* Address bounds for the signal trampoline in inferior, if any */
401
 
402
CORE_ADDR sigtramp_address, sigtramp_end;
403
 
404
/* Allocate zeroed memory */
405
 
406
static PTR
407
xzalloc (unsigned int size)
408
{
409
  PTR p = xmalloc (size);
410
 
411
  memset (p, 0, size);
412
  return p;
413
}
414
 
415
/* Exported procedure: Builds a symtab from the PST partial one.
416
   Restores the environment in effect when PST was created, delegates
417
   most of the work to an ancillary procedure, and sorts
418
   and reorders the symtab list at the end */
419
 
420
static void
421
mdebug_psymtab_to_symtab (struct partial_symtab *pst)
422
{
423
 
424
  if (!pst)
425
    return;
426
 
427
  if (info_verbose)
428
    {
429
      printf_filtered ("Reading in symbols for %s...", pst->filename);
430
      gdb_flush (gdb_stdout);
431
    }
432
 
433
  next_symbol_text_func = mdebug_next_symbol_text;
434
 
435
  psymtab_to_symtab_1 (pst, pst->filename);
436
 
437
  /* Match with global symbols.  This only needs to be done once,
438
     after all of the symtabs and dependencies have been read in.   */
439
  scan_file_globals (pst->objfile);
440
 
441
  if (info_verbose)
442
    printf_filtered ("done.\n");
443
}
444
 
445
/* File-level interface functions */
446
 
447
/* Find a file descriptor given its index RF relative to a file CF */
448
 
449
static FDR *
450
get_rfd (int cf, int rf)
451
{
452
  FDR *fdrs;
453
  register FDR *f;
454
  RFDT rfd;
455
 
456
  fdrs = debug_info->fdr;
457
  f = fdrs + cf;
458
  /* Object files do not have the RFD table, all refs are absolute */
459
  if (f->rfdBase == 0)
460
    return fdrs + rf;
461
  (*debug_swap->swap_rfd_in) (cur_bfd,
462
                              ((char *) debug_info->external_rfd
463
                               + ((f->rfdBase + rf)
464
                                  * debug_swap->external_rfd_size)),
465
                              &rfd);
466
  return fdrs + rfd;
467
}
468
 
469
/* Return a safer print NAME for a file descriptor */
470
 
471
static char *
472
fdr_name (FDR *f)
473
{
474
  if (f->rss == -1)
475
    return "<stripped file>";
476
  if (f->rss == 0)
477
    return "<NFY>";
478
  return debug_info->ss + f->issBase + f->rss;
479
}
480
 
481
 
482
/* Read in and parse the symtab of the file OBJFILE.  Symbols from
483
   different sections are relocated via the SECTION_OFFSETS.  */
484
 
485
void
486
mdebug_build_psymtabs (struct objfile *objfile,
487
                       const struct ecoff_debug_swap *swap,
488
                       struct ecoff_debug_info *info)
489
{
490
  cur_bfd = objfile->obfd;
491
  debug_swap = swap;
492
  debug_info = info;
493
 
494
  /* Make sure all the FDR information is swapped in.  */
495
  if (info->fdr == (FDR *) NULL)
496
    {
497
      char *fdr_src;
498
      char *fdr_end;
499
      FDR *fdr_ptr;
500
 
501
      info->fdr = (FDR *) obstack_alloc (&objfile->psymbol_obstack,
502
                                         (info->symbolic_header.ifdMax
503
                                          * sizeof (FDR)));
504
      fdr_src = info->external_fdr;
505
      fdr_end = (fdr_src
506
                 + info->symbolic_header.ifdMax * swap->external_fdr_size);
507
      fdr_ptr = info->fdr;
508
      for (; fdr_src < fdr_end; fdr_src += swap->external_fdr_size, fdr_ptr++)
509
        (*swap->swap_fdr_in) (objfile->obfd, fdr_src, fdr_ptr);
510
    }
511
 
512
  parse_partial_symbols (objfile);
513
 
514
#if 0
515
  /* Check to make sure file was compiled with -g.  If not, warn the
516
     user of this limitation.  */
517
  if (compare_glevel (max_glevel, GLEVEL_2) < 0)
518
    {
519
      if (max_gdbinfo == 0)
520
        printf_unfiltered ("\n%s not compiled with -g, debugging support is limited.\n",
521
                           objfile->name);
522
      printf_unfiltered ("You should compile with -g2 or -g3 for best debugging support.\n");
523
      gdb_flush (gdb_stdout);
524
    }
525
#endif
526
}
527
 
528
/* Local utilities */
529
 
530
/* Map of FDR indexes to partial symtabs */
531
 
532
struct pst_map
533
{
534
  struct partial_symtab *pst;   /* the psymtab proper */
535
  long n_globals;               /* exported globals (external symbols) */
536
  long globals_offset;          /* cumulative */
537
};
538
 
539
 
540
/* Utility stack, used to nest procedures and blocks properly.
541
   It is a doubly linked list, to avoid too many alloc/free.
542
   Since we might need it quite a few times it is NOT deallocated
543
   after use. */
544
 
545
static struct parse_stack
546
  {
547
    struct parse_stack *next, *prev;
548
    struct symtab *cur_st;      /* Current symtab. */
549
    struct block *cur_block;    /* Block in it. */
550
 
551
    /* What are we parsing.  stFile, or stBlock are for files and
552
       blocks.  stProc or stStaticProc means we have seen the start of a
553
       procedure, but not the start of the block within in.  When we see
554
       the start of that block, we change it to stNil, without pushing a
555
       new block, i.e. stNil means both a procedure and a block.  */
556
 
557
    int blocktype;
558
 
559
    int maxsyms;                /* Max symbols in this block. */
560
    struct type *cur_type;      /* Type we parse fields for. */
561
    int cur_field;              /* Field number in cur_type. */
562
    CORE_ADDR procadr;          /* Start addres of this procedure */
563
    int numargs;                /* Its argument count */
564
  }
565
 
566
 *top_stack;                    /* Top stack ptr */
567
 
568
 
569
/* Enter a new lexical context */
570
 
571
static void
572
push_parse_stack (void)
573
{
574
  struct parse_stack *new;
575
 
576
  /* Reuse frames if possible */
577
  if (top_stack && top_stack->prev)
578
    new = top_stack->prev;
579
  else
580
    new = (struct parse_stack *) xzalloc (sizeof (struct parse_stack));
581
  /* Initialize new frame with previous content */
582
  if (top_stack)
583
    {
584
      register struct parse_stack *prev = new->prev;
585
 
586
      *new = *top_stack;
587
      top_stack->prev = new;
588
      new->prev = prev;
589
      new->next = top_stack;
590
    }
591
  top_stack = new;
592
}
593
 
594
/* Exit a lexical context */
595
 
596
static void
597
pop_parse_stack (void)
598
{
599
  if (!top_stack)
600
    return;
601
  if (top_stack->next)
602
    top_stack = top_stack->next;
603
}
604
 
605
 
606
/* Cross-references might be to things we haven't looked at
607
   yet, e.g. type references.  To avoid too many type
608
   duplications we keep a quick fixup table, an array
609
   of lists of references indexed by file descriptor */
610
 
611
struct mdebug_pending
612
{
613
  struct mdebug_pending *next;  /* link */
614
  char *s;                      /* the unswapped symbol */
615
  struct type *t;               /* its partial type descriptor */
616
};
617
 
618
 
619
/* The pending information is kept for an entire object file, and used
620
   to be in the sym_private field.  I took it out when I split
621
   mdebugread from mipsread, because this might not be the only type
622
   of symbols read from an object file.  Instead, we allocate the
623
   pending information table when we create the partial symbols, and
624
   we store a pointer to the single table in each psymtab.  */
625
 
626
static struct mdebug_pending **pending_list;
627
 
628
/* Check whether we already saw symbol SH in file FH */
629
 
630
static struct mdebug_pending *
631
is_pending_symbol (FDR *fh, char *sh)
632
{
633
  int f_idx = fh - debug_info->fdr;
634
  register struct mdebug_pending *p;
635
 
636
  /* Linear search is ok, list is typically no more than 10 deep */
637
  for (p = pending_list[f_idx]; p; p = p->next)
638
    if (p->s == sh)
639
      break;
640
  return p;
641
}
642
 
643
/* Add a new symbol SH of type T */
644
 
645
static void
646
add_pending (FDR *fh, char *sh, struct type *t)
647
{
648
  int f_idx = fh - debug_info->fdr;
649
  struct mdebug_pending *p = is_pending_symbol (fh, sh);
650
 
651
  /* Make sure we do not make duplicates */
652
  if (!p)
653
    {
654
      p = ((struct mdebug_pending *)
655
           obstack_alloc (&current_objfile->psymbol_obstack,
656
                          sizeof (struct mdebug_pending)));
657
      p->s = sh;
658
      p->t = t;
659
      p->next = pending_list[f_idx];
660
      pending_list[f_idx] = p;
661
    }
662
}
663
 
664
 
665
/* Parsing Routines proper. */
666
 
667
/* Parse a single symbol. Mostly just make up a GDB symbol for it.
668
   For blocks, procedures and types we open a new lexical context.
669
   This is basically just a big switch on the symbol's type.  Argument
670
   AX is the base pointer of aux symbols for this file (fh->iauxBase).
671
   EXT_SH points to the unswapped symbol, which is needed for struct,
672
   union, etc., types; it is NULL for an EXTR.  BIGEND says whether
673
   aux symbols are big-endian or little-endian.  Return count of
674
   SYMR's handled (normally one).  */
675
 
676
static int
677
parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend,
678
              struct section_offsets *section_offsets, struct objfile *objfile)
679
{
680
  const bfd_size_type external_sym_size = debug_swap->external_sym_size;
681
  void (*const swap_sym_in) (bfd *, PTR, SYMR *) = debug_swap->swap_sym_in;
682
  char *name;
683
  struct symbol *s;
684
  struct block *b;
685
  struct mdebug_pending *pend;
686
  struct type *t;
687
  struct field *f;
688
  int count = 1;
689
  enum address_class class;
690
  TIR tir;
691
  long svalue = sh->value;
692
  int bitsize;
693
 
694
  if (ext_sh == (char *) NULL)
695
    name = debug_info->ssext + sh->iss;
696
  else
697
    name = debug_info->ss + cur_fdr->issBase + sh->iss;
698
 
699
  switch (sh->sc)
700
    {
701
    case scText:
702
    case scRConst:
703
      /* Do not relocate relative values.
704
         The value of a stEnd symbol is the displacement from the
705
         corresponding start symbol value.
706
         The value of a stBlock symbol is the displacement from the
707
         procedure address.  */
708
      if (sh->st != stEnd && sh->st != stBlock)
709
        sh->value += ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
710
      break;
711
    case scData:
712
    case scSData:
713
    case scRData:
714
    case scPData:
715
    case scXData:
716
      sh->value += ANOFFSET (section_offsets, SECT_OFF_DATA (objfile));
717
      break;
718
    case scBss:
719
    case scSBss:
720
      sh->value += ANOFFSET (section_offsets, SECT_OFF_BSS (objfile));
721
      break;
722
    }
723
 
724
  switch (sh->st)
725
    {
726
    case stNil:
727
      break;
728
 
729
    case stGlobal:              /* external symbol, goes into global block */
730
      class = LOC_STATIC;
731
      b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
732
                             GLOBAL_BLOCK);
733
      s = new_symbol (name);
734
      SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
735
      goto data;
736
 
737
    case stStatic:              /* static data, goes into current block. */
738
      class = LOC_STATIC;
739
      b = top_stack->cur_block;
740
      s = new_symbol (name);
741
      if (SC_IS_COMMON (sh->sc))
742
        {
743
          /* It is a FORTRAN common block.  At least for SGI Fortran the
744
             address is not in the symbol; we need to fix it later in
745
             scan_file_globals.  */
746
          int bucket = hashname (SYMBOL_NAME (s));
747
          SYMBOL_VALUE_CHAIN (s) = global_sym_chain[bucket];
748
          global_sym_chain[bucket] = s;
749
        }
750
      else
751
        SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
752
      goto data;
753
 
754
    case stLocal:               /* local variable, goes into current block */
755
      if (sh->sc == scRegister)
756
        {
757
          class = LOC_REGISTER;
758
          svalue = ECOFF_REG_TO_REGNUM (svalue);
759
        }
760
      else
761
        class = LOC_LOCAL;
762
      b = top_stack->cur_block;
763
      s = new_symbol (name);
764
      SYMBOL_VALUE (s) = svalue;
765
 
766
    data:                       /* Common code for symbols describing data */
767
      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
768
      SYMBOL_CLASS (s) = class;
769
      add_symbol (s, b);
770
 
771
      /* Type could be missing if file is compiled without debugging info.  */
772
      if (SC_IS_UNDEF (sh->sc)
773
          || sh->sc == scNil || sh->index == indexNil)
774
        SYMBOL_TYPE (s) = nodebug_var_symbol_type;
775
      else
776
        SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
777
      /* Value of a data symbol is its memory address */
778
      break;
779
 
780
    case stParam:               /* arg to procedure, goes into current block */
781
      max_gdbinfo++;
782
      found_ecoff_debugging_info = 1;
783
      top_stack->numargs++;
784
 
785
      /* Special GNU C++ name.  */
786
      if (is_cplus_marker (name[0]) && name[1] == 't' && name[2] == 0)
787
        name = "this";          /* FIXME, not alloc'd in obstack */
788
      s = new_symbol (name);
789
 
790
      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
791
      switch (sh->sc)
792
        {
793
        case scRegister:
794
          /* Pass by value in register.  */
795
          SYMBOL_CLASS (s) = LOC_REGPARM;
796
          svalue = ECOFF_REG_TO_REGNUM (svalue);
797
          break;
798
        case scVar:
799
          /* Pass by reference on stack.  */
800
          SYMBOL_CLASS (s) = LOC_REF_ARG;
801
          break;
802
        case scVarRegister:
803
          /* Pass by reference in register.  */
804
          SYMBOL_CLASS (s) = LOC_REGPARM_ADDR;
805
          svalue = ECOFF_REG_TO_REGNUM (svalue);
806
          break;
807
        default:
808
          /* Pass by value on stack.  */
809
          SYMBOL_CLASS (s) = LOC_ARG;
810
          break;
811
        }
812
      SYMBOL_VALUE (s) = svalue;
813
      SYMBOL_TYPE (s) = parse_type (cur_fd, ax, sh->index, 0, bigend, name);
814
      add_symbol (s, top_stack->cur_block);
815
      break;
816
 
817
    case stLabel:               /* label, goes into current block */
818
      s = new_symbol (name);
819
      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;     /* so that it can be used */
820
      SYMBOL_CLASS (s) = LOC_LABEL;     /* but not misused */
821
      SYMBOL_VALUE_ADDRESS (s) = (CORE_ADDR) sh->value;
822
      SYMBOL_TYPE (s) = mdebug_type_int;
823
      add_symbol (s, top_stack->cur_block);
824
      break;
825
 
826
    case stProc:                /* Procedure, usually goes into global block */
827
    case stStaticProc:          /* Static procedure, goes into current block */
828
      s = new_symbol (name);
829
      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
830
      SYMBOL_CLASS (s) = LOC_BLOCK;
831
      /* Type of the return value */
832
      if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil)
833
        t = mdebug_type_int;
834
      else
835
        {
836
          t = parse_type (cur_fd, ax, sh->index + 1, 0, bigend, name);
837
          if (STREQ (name, "malloc") && t->code == TYPE_CODE_VOID)
838
            {
839
              /* I don't know why, but, at least under Alpha GNU/Linux,
840
                 when linking against a malloc without debugging
841
                 symbols, its read as a function returning void---this
842
                 is bad because it means we cannot call functions with
843
                 string arguments interactively; i.e., "call
844
                 printf("howdy\n")" would fail with the error message
845
                 "program has no memory available".  To avoid this, we
846
                 patch up the type and make it void*
847
                 instead. (davidm@azstarnet.com)
848
               */
849
              t = make_pointer_type (t, NULL);
850
            }
851
        }
852
      b = top_stack->cur_block;
853
      if (sh->st == stProc)
854
        {
855
          struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
856
          /* The next test should normally be true, but provides a
857
             hook for nested functions (which we don't want to make
858
             global). */
859
          if (b == BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK))
860
            b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
861
          /* Irix 5 sometimes has duplicate names for the same
862
             function.  We want to add such names up at the global
863
             level, not as a nested function.  */
864
          else if (sh->value == top_stack->procadr)
865
            b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
866
        }
867
      add_symbol (s, b);
868
 
869
      /* Make a type for the procedure itself */
870
      SYMBOL_TYPE (s) = lookup_function_type (t);
871
 
872
      /* Create and enter a new lexical context */
873
      b = new_block (top_stack->maxsyms);
874
      SYMBOL_BLOCK_VALUE (s) = b;
875
      BLOCK_FUNCTION (b) = s;
876
      BLOCK_START (b) = BLOCK_END (b) = sh->value;
877
      BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
878
      add_block (b, top_stack->cur_st);
879
 
880
      /* Not if we only have partial info */
881
      if (SC_IS_UNDEF (sh->sc) || sh->sc == scNil)
882
        break;
883
 
884
      push_parse_stack ();
885
      top_stack->cur_block = b;
886
      top_stack->blocktype = sh->st;
887
      top_stack->cur_type = SYMBOL_TYPE (s);
888
      top_stack->cur_field = -1;
889
      top_stack->procadr = sh->value;
890
      top_stack->numargs = 0;
891
      break;
892
 
893
      /* Beginning of code for structure, union, and enum definitions.
894
         They all share a common set of local variables, defined here.  */
895
      {
896
        enum type_code type_code;
897
        char *ext_tsym;
898
        int nfields;
899
        long max_value;
900
        struct field *f;
901
 
902
    case stStruct:              /* Start a block defining a struct type */
903
        type_code = TYPE_CODE_STRUCT;
904
        goto structured_common;
905
 
906
    case stUnion:               /* Start a block defining a union type */
907
        type_code = TYPE_CODE_UNION;
908
        goto structured_common;
909
 
910
    case stEnum:                /* Start a block defining an enum type */
911
        type_code = TYPE_CODE_ENUM;
912
        goto structured_common;
913
 
914
    case stBlock:               /* Either a lexical block, or some type */
915
        if (sh->sc != scInfo && !SC_IS_COMMON (sh->sc))
916
          goto case_stBlock_code;       /* Lexical block */
917
 
918
        type_code = TYPE_CODE_UNDEF;    /* We have a type.  */
919
 
920
        /* Common code for handling struct, union, enum, and/or as-yet-
921
           unknown-type blocks of info about structured data.  `type_code'
922
           has been set to the proper TYPE_CODE, if we know it.  */
923
      structured_common:
924
        found_ecoff_debugging_info = 1;
925
        push_parse_stack ();
926
        top_stack->blocktype = stBlock;
927
 
928
        /* First count the number of fields and the highest value. */
929
        nfields = 0;
930
        max_value = 0;
931
        for (ext_tsym = ext_sh + external_sym_size;
932
             ;
933
             ext_tsym += external_sym_size)
934
          {
935
            SYMR tsym;
936
 
937
            (*swap_sym_in) (cur_bfd, ext_tsym, &tsym);
938
 
939
            switch (tsym.st)
940
              {
941
              case stEnd:
942
                goto end_of_fields;
943
 
944
              case stMember:
945
                if (nfields == 0 && type_code == TYPE_CODE_UNDEF)
946
                  {
947
                    /* If the type of the member is Nil (or Void),
948
                       without qualifiers, assume the tag is an
949
                       enumeration.
950
                       Alpha cc -migrate enums are recognized by a zero
951
                       index and a zero symbol value.
952
                       DU 4.0 cc enums are recognized by a member type of
953
                       btEnum without qualifiers and a zero symbol value.  */
954
                    if (tsym.index == indexNil
955
                        || (tsym.index == 0 && sh->value == 0))
956
                      type_code = TYPE_CODE_ENUM;
957
                    else
958
                      {
959
                        (*debug_swap->swap_tir_in) (bigend,
960
                                                    &ax[tsym.index].a_ti,
961
                                                    &tir);
962
                        if ((tir.bt == btNil || tir.bt == btVoid
963
                             || (tir.bt == btEnum && sh->value == 0))
964
                            && tir.tq0 == tqNil)
965
                          type_code = TYPE_CODE_ENUM;
966
                      }
967
                  }
968
                nfields++;
969
                if (tsym.value > max_value)
970
                  max_value = tsym.value;
971
                break;
972
 
973
              case stBlock:
974
              case stUnion:
975
              case stEnum:
976
              case stStruct:
977
                {
978
#if 0
979
                  /* This is a no-op; is it trying to tell us something
980
                     we should be checking?  */
981
                  if (tsym.sc == scVariant);    /*UNIMPLEMENTED */
982
#endif
983
                  if (tsym.index != 0)
984
                    {
985
                      /* This is something like a struct within a
986
                         struct.  Skip over the fields of the inner
987
                         struct.  The -1 is because the for loop will
988
                         increment ext_tsym.  */
989
                      ext_tsym = ((char *) debug_info->external_sym
990
                                  + ((cur_fdr->isymBase + tsym.index - 1)
991
                                     * external_sym_size));
992
                    }
993
                }
994
                break;
995
 
996
              case stTypedef:
997
                /* mips cc puts out a typedef for struct x if it is not yet
998
                   defined when it encounters
999
                   struct y { struct x *xp; };
1000
                   Just ignore it. */
1001
                break;
1002
 
1003
              case stIndirect:
1004
                /* Irix5 cc puts out a stIndirect for struct x if it is not
1005
                   yet defined when it encounters
1006
                   struct y { struct x *xp; };
1007
                   Just ignore it. */
1008
                break;
1009
 
1010
              default:
1011
                complain (&block_member_complaint, tsym.st);
1012
              }
1013
          }
1014
      end_of_fields:;
1015
 
1016
        /* In an stBlock, there is no way to distinguish structs,
1017
           unions, and enums at this point.  This is a bug in the
1018
           original design (that has been fixed with the recent
1019
           addition of the stStruct, stUnion, and stEnum symbol
1020
           types.)  The way you can tell is if/when you see a variable
1021
           or field of that type.  In that case the variable's type
1022
           (in the AUX table) says if the type is struct, union, or
1023
           enum, and points back to the stBlock here.  So you can
1024
           patch the tag kind up later - but only if there actually is
1025
           a variable or field of that type.
1026
 
1027
           So until we know for sure, we will guess at this point.
1028
           The heuristic is:
1029
           If the first member has index==indexNil or a void type,
1030
           assume we have an enumeration.
1031
           Otherwise, if there is more than one member, and all
1032
           the members have offset 0, assume we have a union.
1033
           Otherwise, assume we have a struct.
1034
 
1035
           The heuristic could guess wrong in the case of of an
1036
           enumeration with no members or a union with one (or zero)
1037
           members, or when all except the last field of a struct have
1038
           width zero.  These are uncommon and/or illegal situations,
1039
           and in any case guessing wrong probably doesn't matter
1040
           much.
1041
 
1042
           But if we later do find out we were wrong, we fixup the tag
1043
           kind.  Members of an enumeration must be handled
1044
           differently from struct/union fields, and that is harder to
1045
           patch up, but luckily we shouldn't need to.  (If there are
1046
           any enumeration members, we can tell for sure it's an enum
1047
           here.) */
1048
 
1049
        if (type_code == TYPE_CODE_UNDEF)
1050
          {
1051
            if (nfields > 1 && max_value == 0)
1052
              type_code = TYPE_CODE_UNION;
1053
            else
1054
              type_code = TYPE_CODE_STRUCT;
1055
          }
1056
 
1057
        /* Create a new type or use the pending type.  */
1058
        pend = is_pending_symbol (cur_fdr, ext_sh);
1059
        if (pend == (struct mdebug_pending *) NULL)
1060
          {
1061
            t = new_type (NULL);
1062
            add_pending (cur_fdr, ext_sh, t);
1063
          }
1064
        else
1065
          t = pend->t;
1066
 
1067
        /* Do not set the tag name if it is a compiler generated tag name
1068
           (.Fxx or .xxfake or empty) for unnamed struct/union/enums.
1069
           Alpha cc puts out an sh->iss of zero for those.  */
1070
        if (sh->iss == 0 || name[0] == '.' || name[0] == '\0')
1071
          TYPE_TAG_NAME (t) = NULL;
1072
        else
1073
          TYPE_TAG_NAME (t) = obconcat (&current_objfile->symbol_obstack,
1074
                                        "", "", name);
1075
 
1076
        TYPE_CODE (t) = type_code;
1077
        TYPE_LENGTH (t) = sh->value;
1078
        TYPE_NFIELDS (t) = nfields;
1079
        TYPE_FIELDS (t) = f = ((struct field *)
1080
                               TYPE_ALLOC (t,
1081
                                           nfields * sizeof (struct field)));
1082
 
1083
        if (type_code == TYPE_CODE_ENUM)
1084
          {
1085
            int unsigned_enum = 1;
1086
 
1087
            /* This is a non-empty enum. */
1088
 
1089
            /* DEC c89 has the number of enumerators in the sh.value field,
1090
               not the type length, so we have to compensate for that
1091
               incompatibility quirk.
1092
               This might do the wrong thing for an enum with one or two
1093
               enumerators and gcc -gcoff -fshort-enums, but these cases
1094
               are hopefully rare enough.
1095
               Alpha cc -migrate has a sh.value field of zero, we adjust
1096
               that too.  */
1097
            if (TYPE_LENGTH (t) == TYPE_NFIELDS (t)
1098
                || TYPE_LENGTH (t) == 0)
1099
              TYPE_LENGTH (t) = TARGET_INT_BIT / HOST_CHAR_BIT;
1100
            for (ext_tsym = ext_sh + external_sym_size;
1101
                 ;
1102
                 ext_tsym += external_sym_size)
1103
              {
1104
                SYMR tsym;
1105
                struct symbol *enum_sym;
1106
 
1107
                (*swap_sym_in) (cur_bfd, ext_tsym, &tsym);
1108
 
1109
                if (tsym.st != stMember)
1110
                  break;
1111
 
1112
                FIELD_BITPOS (*f) = tsym.value;
1113
                FIELD_TYPE (*f) = t;
1114
                FIELD_NAME (*f) = debug_info->ss + cur_fdr->issBase + tsym.iss;
1115
                FIELD_BITSIZE (*f) = 0;
1116
 
1117
                enum_sym = ((struct symbol *)
1118
                            obstack_alloc (&current_objfile->symbol_obstack,
1119
                                           sizeof (struct symbol)));
1120
                memset ((PTR) enum_sym, 0, sizeof (struct symbol));
1121
                SYMBOL_NAME (enum_sym) =
1122
                  obsavestring (f->name, strlen (f->name),
1123
                                &current_objfile->symbol_obstack);
1124
                SYMBOL_CLASS (enum_sym) = LOC_CONST;
1125
                SYMBOL_TYPE (enum_sym) = t;
1126
                SYMBOL_NAMESPACE (enum_sym) = VAR_NAMESPACE;
1127
                SYMBOL_VALUE (enum_sym) = tsym.value;
1128
                if (SYMBOL_VALUE (enum_sym) < 0)
1129
                  unsigned_enum = 0;
1130
                add_symbol (enum_sym, top_stack->cur_block);
1131
 
1132
                /* Skip the stMembers that we've handled. */
1133
                count++;
1134
                f++;
1135
              }
1136
            if (unsigned_enum)
1137
              TYPE_FLAGS (t) |= TYPE_FLAG_UNSIGNED;
1138
          }
1139
        /* make this the current type */
1140
        top_stack->cur_type = t;
1141
        top_stack->cur_field = 0;
1142
 
1143
        /* Do not create a symbol for alpha cc unnamed structs.  */
1144
        if (sh->iss == 0)
1145
          break;
1146
 
1147
        /* gcc puts out an empty struct for an opaque struct definitions,
1148
           do not create a symbol for it either.  */
1149
        if (TYPE_NFIELDS (t) == 0)
1150
          {
1151
            TYPE_FLAGS (t) |= TYPE_FLAG_STUB;
1152
            break;
1153
          }
1154
 
1155
        s = new_symbol (name);
1156
        SYMBOL_NAMESPACE (s) = STRUCT_NAMESPACE;
1157
        SYMBOL_CLASS (s) = LOC_TYPEDEF;
1158
        SYMBOL_VALUE (s) = 0;
1159
        SYMBOL_TYPE (s) = t;
1160
        add_symbol (s, top_stack->cur_block);
1161
        break;
1162
 
1163
        /* End of local variables shared by struct, union, enum, and
1164
           block (as yet unknown struct/union/enum) processing.  */
1165
      }
1166
 
1167
    case_stBlock_code:
1168
      found_ecoff_debugging_info = 1;
1169
      /* beginnning of (code) block. Value of symbol
1170
         is the displacement from procedure start */
1171
      push_parse_stack ();
1172
 
1173
      /* Do not start a new block if this is the outermost block of a
1174
         procedure.  This allows the LOC_BLOCK symbol to point to the
1175
         block with the local variables, so funcname::var works.  */
1176
      if (top_stack->blocktype == stProc
1177
          || top_stack->blocktype == stStaticProc)
1178
        {
1179
          top_stack->blocktype = stNil;
1180
          break;
1181
        }
1182
 
1183
      top_stack->blocktype = stBlock;
1184
      b = new_block (top_stack->maxsyms);
1185
      BLOCK_START (b) = sh->value + top_stack->procadr;
1186
      BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
1187
      top_stack->cur_block = b;
1188
      add_block (b, top_stack->cur_st);
1189
      break;
1190
 
1191
    case stEnd:         /* end (of anything) */
1192
      if (sh->sc == scInfo || SC_IS_COMMON (sh->sc))
1193
        {
1194
          /* Finished with type */
1195
          top_stack->cur_type = 0;
1196
        }
1197
      else if (sh->sc == scText &&
1198
               (top_stack->blocktype == stProc ||
1199
                top_stack->blocktype == stStaticProc))
1200
        {
1201
          /* Finished with procedure */
1202
          struct blockvector *bv = BLOCKVECTOR (top_stack->cur_st);
1203
          struct mips_extra_func_info *e;
1204
          struct block *b;
1205
          struct type *ftype = top_stack->cur_type;
1206
          int i;
1207
 
1208
          BLOCK_END (top_stack->cur_block) += sh->value;        /* size */
1209
 
1210
          /* Make up special symbol to contain procedure specific info */
1211
          s = new_symbol (MIPS_EFI_SYMBOL_NAME);
1212
          SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
1213
          SYMBOL_CLASS (s) = LOC_CONST;
1214
          SYMBOL_TYPE (s) = mdebug_type_void;
1215
          e = ((struct mips_extra_func_info *)
1216
               obstack_alloc (&current_objfile->symbol_obstack,
1217
                              sizeof (struct mips_extra_func_info)));
1218
          memset ((PTR) e, 0, sizeof (struct mips_extra_func_info));
1219
          SYMBOL_VALUE (s) = (long) e;
1220
          e->numargs = top_stack->numargs;
1221
          e->pdr.framereg = -1;
1222
          add_symbol (s, top_stack->cur_block);
1223
 
1224
          /* Reallocate symbols, saving memory */
1225
          b = shrink_block (top_stack->cur_block, top_stack->cur_st);
1226
 
1227
          /* f77 emits proc-level with address bounds==[0,0],
1228
             So look for such child blocks, and patch them.  */
1229
          for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
1230
            {
1231
              struct block *b_bad = BLOCKVECTOR_BLOCK (bv, i);
1232
              if (BLOCK_SUPERBLOCK (b_bad) == b
1233
                  && BLOCK_START (b_bad) == top_stack->procadr
1234
                  && BLOCK_END (b_bad) == top_stack->procadr)
1235
                {
1236
                  BLOCK_START (b_bad) = BLOCK_START (b);
1237
                  BLOCK_END (b_bad) = BLOCK_END (b);
1238
                }
1239
            }
1240
 
1241
          if (TYPE_NFIELDS (ftype) <= 0)
1242
            {
1243
              /* No parameter type information is recorded with the function's
1244
                 type.  Set that from the type of the parameter symbols. */
1245
              int nparams = top_stack->numargs;
1246
              int iparams;
1247
              struct symbol *sym;
1248
 
1249
              if (nparams > 0)
1250
                {
1251
                  TYPE_NFIELDS (ftype) = nparams;
1252
                  TYPE_FIELDS (ftype) = (struct field *)
1253
                    TYPE_ALLOC (ftype, nparams * sizeof (struct field));
1254
 
1255
                  for (i = iparams = 0; iparams < nparams; i++)
1256
                    {
1257
                      sym = BLOCK_SYM (b, i);
1258
                      switch (SYMBOL_CLASS (sym))
1259
                        {
1260
                        case LOC_ARG:
1261
                        case LOC_REF_ARG:
1262
                        case LOC_REGPARM:
1263
                        case LOC_REGPARM_ADDR:
1264
                          TYPE_FIELD_TYPE (ftype, iparams) = SYMBOL_TYPE (sym);
1265
                          iparams++;
1266
                          break;
1267
                        default:
1268
                          break;
1269
                        }
1270
                    }
1271
                }
1272
            }
1273
        }
1274
      else if (sh->sc == scText && top_stack->blocktype == stBlock)
1275
        {
1276
          /* End of (code) block. The value of the symbol is the
1277
             displacement from the procedure`s start address of the
1278
             end of this block. */
1279
          BLOCK_END (top_stack->cur_block) = sh->value + top_stack->procadr;
1280
          shrink_block (top_stack->cur_block, top_stack->cur_st);
1281
        }
1282
      else if (sh->sc == scText && top_stack->blocktype == stNil)
1283
        {
1284
          /* End of outermost block.  Pop parse stack and ignore.  The
1285
             following stEnd of stProc will take care of the block.  */
1286
          ;
1287
        }
1288
      else if (sh->sc == scText && top_stack->blocktype == stFile)
1289
        {
1290
          /* End of file.  Pop parse stack and ignore.  Higher
1291
             level code deals with this.  */
1292
          ;
1293
        }
1294
      else
1295
        complain (&stEnd_complaint, sh->sc);
1296
 
1297
      pop_parse_stack ();       /* restore previous lexical context */
1298
      break;
1299
 
1300
    case stMember:              /* member of struct or union */
1301
      f = &TYPE_FIELDS (top_stack->cur_type)[top_stack->cur_field++];
1302
      FIELD_NAME (*f) = name;
1303
      FIELD_BITPOS (*f) = sh->value;
1304
      bitsize = 0;
1305
      FIELD_TYPE (*f) = parse_type (cur_fd, ax, sh->index, &bitsize, bigend, name);
1306
      FIELD_BITSIZE (*f) = bitsize;
1307
      break;
1308
 
1309
    case stIndirect:            /* forward declaration on Irix5 */
1310
      /* Forward declarations from Irix5 cc are handled by cross_ref,
1311
         skip them.  */
1312
      break;
1313
 
1314
    case stTypedef:             /* type definition */
1315
      found_ecoff_debugging_info = 1;
1316
 
1317
      /* Typedefs for forward declarations and opaque structs from alpha cc
1318
         are handled by cross_ref, skip them.  */
1319
      if (sh->iss == 0)
1320
        break;
1321
 
1322
      /* Parse the type or use the pending type.  */
1323
      pend = is_pending_symbol (cur_fdr, ext_sh);
1324
      if (pend == (struct mdebug_pending *) NULL)
1325
        {
1326
          t = parse_type (cur_fd, ax, sh->index, (int *) NULL, bigend, name);
1327
          add_pending (cur_fdr, ext_sh, t);
1328
        }
1329
      else
1330
        t = pend->t;
1331
 
1332
      /* mips cc puts out a typedef with the name of the struct for forward
1333
         declarations. These should not go into the symbol table and
1334
         TYPE_NAME should not be set for them.
1335
         They can't be distinguished from an intentional typedef to
1336
         the same name however:
1337
         x.h:
1338
         struct x { int ix; int jx; };
1339
         struct xx;
1340
         x.c:
1341
         typedef struct x x;
1342
         struct xx {int ixx; int jxx; };
1343
         generates a cross referencing stTypedef for x and xx.
1344
         The user visible effect of this is that the type of a pointer
1345
         to struct foo sometimes is given as `foo *' instead of `struct foo *'.
1346
         The problem is fixed with alpha cc and Irix5 cc.  */
1347
 
1348
      /* However if the typedef cross references to an opaque aggregate, it
1349
         is safe to omit it from the symbol table.  */
1350
 
1351
      if (has_opaque_xref (cur_fdr, sh))
1352
        break;
1353
      s = new_symbol (name);
1354
      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
1355
      SYMBOL_CLASS (s) = LOC_TYPEDEF;
1356
      SYMBOL_BLOCK_VALUE (s) = top_stack->cur_block;
1357
      SYMBOL_TYPE (s) = t;
1358
      add_symbol (s, top_stack->cur_block);
1359
 
1360
      /* Incomplete definitions of structs should not get a name.  */
1361
      if (TYPE_NAME (SYMBOL_TYPE (s)) == NULL
1362
          && (TYPE_NFIELDS (SYMBOL_TYPE (s)) != 0
1363
              || (TYPE_CODE (SYMBOL_TYPE (s)) != TYPE_CODE_STRUCT
1364
                  && TYPE_CODE (SYMBOL_TYPE (s)) != TYPE_CODE_UNION)))
1365
        {
1366
          if (TYPE_CODE (SYMBOL_TYPE (s)) == TYPE_CODE_PTR
1367
              || TYPE_CODE (SYMBOL_TYPE (s)) == TYPE_CODE_FUNC)
1368
            {
1369
              /* If we are giving a name to a type such as "pointer to
1370
                 foo" or "function returning foo", we better not set
1371
                 the TYPE_NAME.  If the program contains "typedef char
1372
                 *caddr_t;", we don't want all variables of type char
1373
                 * to print as caddr_t.  This is not just a
1374
                 consequence of GDB's type management; CC and GCC (at
1375
                 least through version 2.4) both output variables of
1376
                 either type char * or caddr_t with the type
1377
                 refering to the stTypedef symbol for caddr_t.  If a future
1378
                 compiler cleans this up it GDB is not ready for it
1379
                 yet, but if it becomes ready we somehow need to
1380
                 disable this check (without breaking the PCC/GCC2.4
1381
                 case).
1382
 
1383
                 Sigh.
1384
 
1385
                 Fortunately, this check seems not to be necessary
1386
                 for anything except pointers or functions.  */
1387
            }
1388
          else
1389
            TYPE_NAME (SYMBOL_TYPE (s)) = SYMBOL_NAME (s);
1390
        }
1391
      break;
1392
 
1393
    case stFile:                /* file name */
1394
      push_parse_stack ();
1395
      top_stack->blocktype = sh->st;
1396
      break;
1397
 
1398
      /* I`ve never seen these for C */
1399
    case stRegReloc:
1400
      break;                    /* register relocation */
1401
    case stForward:
1402
      break;                    /* forwarding address */
1403
    case stConstant:
1404
      break;                    /* constant */
1405
    default:
1406
      complain (&unknown_mdebug_symtype_complaint, sh->st);
1407
      break;
1408
    }
1409
 
1410
  return count;
1411
}
1412
 
1413
/* Parse the type information provided in the raw AX entries for
1414
   the symbol SH. Return the bitfield size in BS, in case.
1415
   We must byte-swap the AX entries before we use them; BIGEND says whether
1416
   they are big-endian or little-endian (from fh->fBigendian).  */
1417
 
1418
static struct type *
1419
parse_type (int fd, union aux_ext *ax, unsigned int aux_index, int *bs,
1420
            int bigend, char *sym_name)
1421
{
1422
  /* Null entries in this map are treated specially */
1423
  static struct type **map_bt[] =
1424
  {
1425
    &mdebug_type_void,          /* btNil */
1426
    &mdebug_type_adr_32,        /* btAdr */
1427
    &mdebug_type_char,          /* btChar */
1428
    &mdebug_type_unsigned_char, /* btUChar */
1429
    &mdebug_type_short,         /* btShort */
1430
    &mdebug_type_unsigned_short,        /* btUShort */
1431
    &mdebug_type_int_32,        /* btInt */
1432
    &mdebug_type_unsigned_int_32,       /* btUInt */
1433
    &mdebug_type_long_32,       /* btLong */
1434
    &mdebug_type_unsigned_long_32,      /* btULong */
1435
    &mdebug_type_float,         /* btFloat */
1436
    &mdebug_type_double,        /* btDouble */
1437
    0,                           /* btStruct */
1438
    0,                           /* btUnion */
1439
    0,                           /* btEnum */
1440
    0,                           /* btTypedef */
1441
    0,                           /* btRange */
1442
    0,                           /* btSet */
1443
    &mdebug_type_complex,       /* btComplex */
1444
    &mdebug_type_double_complex,        /* btDComplex */
1445
    0,                           /* btIndirect */
1446
    &mdebug_type_fixed_dec,     /* btFixedDec */
1447
    &mdebug_type_float_dec,     /* btFloatDec */
1448
    &mdebug_type_string,        /* btString */
1449
    0,                           /* btBit */
1450
    0,                           /* btPicture */
1451
    &mdebug_type_void,          /* btVoid */
1452
    0,                           /* DEC C++:  Pointer to member */
1453
    0,                           /* DEC C++:  Virtual function table */
1454
    0,                           /* DEC C++:  Class (Record) */
1455
    &mdebug_type_long_64,       /* btLong64  */
1456
    &mdebug_type_unsigned_long_64,      /* btULong64 */
1457
    &mdebug_type_long_long_64,  /* btLongLong64  */
1458
    &mdebug_type_unsigned_long_long_64,         /* btULongLong64 */
1459
    &mdebug_type_adr_64,        /* btAdr64 */
1460
    &mdebug_type_int_64,        /* btInt64  */
1461
    &mdebug_type_unsigned_int_64,       /* btUInt64 */
1462
  };
1463
 
1464
  TIR t[1];
1465
  struct type *tp = 0;
1466
  enum type_code type_code = TYPE_CODE_UNDEF;
1467
 
1468
  /* Handle undefined types, they have indexNil. */
1469
  if (aux_index == indexNil)
1470
    return mdebug_type_int;
1471
 
1472
  /* Handle corrupt aux indices.  */
1473
  if (aux_index >= (debug_info->fdr + fd)->caux)
1474
    {
1475
      complain (&index_complaint, sym_name);
1476
      return mdebug_type_int;
1477
    }
1478
  ax += aux_index;
1479
 
1480
  /* Use aux as a type information record, map its basic type.  */
1481
  (*debug_swap->swap_tir_in) (bigend, &ax->a_ti, t);
1482
  if (t->bt >= (sizeof (map_bt) / sizeof (*map_bt)))
1483
    {
1484
      complain (&basic_type_complaint, t->bt, sym_name);
1485
      return mdebug_type_int;
1486
    }
1487
  if (map_bt[t->bt])
1488
    {
1489
      tp = *map_bt[t->bt];
1490
    }
1491
  else
1492
    {
1493
      tp = NULL;
1494
      /* Cannot use builtin types -- build our own */
1495
      switch (t->bt)
1496
        {
1497
        case btStruct:
1498
          type_code = TYPE_CODE_STRUCT;
1499
          break;
1500
        case btUnion:
1501
          type_code = TYPE_CODE_UNION;
1502
          break;
1503
        case btEnum:
1504
          type_code = TYPE_CODE_ENUM;
1505
          break;
1506
        case btRange:
1507
          type_code = TYPE_CODE_RANGE;
1508
          break;
1509
        case btSet:
1510
          type_code = TYPE_CODE_SET;
1511
          break;
1512
        case btIndirect:
1513
          /* alpha cc -migrate uses this for typedefs. The true type will
1514
             be obtained by crossreferencing below.  */
1515
          type_code = TYPE_CODE_ERROR;
1516
          break;
1517
        case btTypedef:
1518
          /* alpha cc uses this for typedefs. The true type will be
1519
             obtained by crossreferencing below.  */
1520
          type_code = TYPE_CODE_ERROR;
1521
          break;
1522
        default:
1523
          complain (&basic_type_complaint, t->bt, sym_name);
1524
          return mdebug_type_int;
1525
        }
1526
    }
1527
 
1528
  /* Move on to next aux */
1529
  ax++;
1530
 
1531
  if (t->fBitfield)
1532
    {
1533
      int width = AUX_GET_WIDTH (bigend, ax);
1534
 
1535
      /* Inhibit core dumps with some cfront generated objects that
1536
         corrupt the TIR.  */
1537
      if (bs == (int *) NULL)
1538
        {
1539
          /* Alpha cc -migrate encodes char and unsigned char types
1540
             as short and unsigned short types with a field width of 8.
1541
             Enum types also have a field width which we ignore for now.  */
1542
          if (t->bt == btShort && width == 8)
1543
            tp = mdebug_type_char;
1544
          else if (t->bt == btUShort && width == 8)
1545
            tp = mdebug_type_unsigned_char;
1546
          else if (t->bt == btEnum)
1547
            ;
1548
          else
1549
            complain (&bad_fbitfield_complaint, sym_name);
1550
        }
1551
      else
1552
        *bs = width;
1553
      ax++;
1554
    }
1555
 
1556
  /* A btIndirect entry cross references to an aux entry containing
1557
     the type.  */
1558
  if (t->bt == btIndirect)
1559
    {
1560
      RNDXR rn[1];
1561
      int rf;
1562
      FDR *xref_fh;
1563
      int xref_fd;
1564
 
1565
      (*debug_swap->swap_rndx_in) (bigend, &ax->a_rndx, rn);
1566
      ax++;
1567
      if (rn->rfd == 0xfff)
1568
        {
1569
          rf = AUX_GET_ISYM (bigend, ax);
1570
          ax++;
1571
        }
1572
      else
1573
        rf = rn->rfd;
1574
 
1575
      if (rf == -1)
1576
        {
1577
          complain (&bad_indirect_xref_complaint, sym_name);
1578
          return mdebug_type_int;
1579
        }
1580
      xref_fh = get_rfd (fd, rf);
1581
      xref_fd = xref_fh - debug_info->fdr;
1582
      tp = parse_type (xref_fd, debug_info->external_aux + xref_fh->iauxBase,
1583
                    rn->index, (int *) NULL, xref_fh->fBigendian, sym_name);
1584
    }
1585
 
1586
  /* All these types really point to some (common) MIPS type
1587
     definition, and only the type-qualifiers fully identify
1588
     them.  We'll make the same effort at sharing. */
1589
  if (t->bt == btStruct ||
1590
      t->bt == btUnion ||
1591
      t->bt == btEnum ||
1592
 
1593
  /* btSet (I think) implies that the name is a tag name, not a typedef
1594
     name.  This apparently is a MIPS extension for C sets.  */
1595
      t->bt == btSet)
1596
    {
1597
      char *name;
1598
 
1599
      /* Try to cross reference this type, build new type on failure.  */
1600
      ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
1601
      if (tp == (struct type *) NULL)
1602
        tp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
1603
 
1604
      /* DEC c89 produces cross references to qualified aggregate types,
1605
         dereference them.  */
1606
      while (TYPE_CODE (tp) == TYPE_CODE_PTR
1607
             || TYPE_CODE (tp) == TYPE_CODE_ARRAY)
1608
        tp = tp->target_type;
1609
 
1610
      /* Make sure that TYPE_CODE(tp) has an expected type code.
1611
         Any type may be returned from cross_ref if file indirect entries
1612
         are corrupted.  */
1613
      if (TYPE_CODE (tp) != TYPE_CODE_STRUCT
1614
          && TYPE_CODE (tp) != TYPE_CODE_UNION
1615
          && TYPE_CODE (tp) != TYPE_CODE_ENUM)
1616
        {
1617
          complain (&unexpected_type_code_complaint, sym_name);
1618
        }
1619
      else
1620
        {
1621
 
1622
          /* Usually, TYPE_CODE(tp) is already type_code.  The main
1623
             exception is if we guessed wrong re struct/union/enum.
1624
             But for struct vs. union a wrong guess is harmless, so
1625
             don't complain().  */
1626
          if ((TYPE_CODE (tp) == TYPE_CODE_ENUM
1627
               && type_code != TYPE_CODE_ENUM)
1628
              || (TYPE_CODE (tp) != TYPE_CODE_ENUM
1629
                  && type_code == TYPE_CODE_ENUM))
1630
            {
1631
              complain (&bad_tag_guess_complaint, sym_name);
1632
            }
1633
 
1634
          if (TYPE_CODE (tp) != type_code)
1635
            {
1636
              TYPE_CODE (tp) = type_code;
1637
            }
1638
 
1639
          /* Do not set the tag name if it is a compiler generated tag name
1640
             (.Fxx or .xxfake or empty) for unnamed struct/union/enums.  */
1641
          if (name[0] == '.' || name[0] == '\0')
1642
            TYPE_TAG_NAME (tp) = NULL;
1643
          else if (TYPE_TAG_NAME (tp) == NULL
1644
                   || !STREQ (TYPE_TAG_NAME (tp), name))
1645
            TYPE_TAG_NAME (tp) = obsavestring (name, strlen (name),
1646
                                            &current_objfile->type_obstack);
1647
        }
1648
    }
1649
 
1650
  /* All these types really point to some (common) MIPS type
1651
     definition, and only the type-qualifiers fully identify
1652
     them.  We'll make the same effort at sharing.
1653
     FIXME: We are not doing any guessing on range types.  */
1654
  if (t->bt == btRange)
1655
    {
1656
      char *name;
1657
 
1658
      /* Try to cross reference this type, build new type on failure.  */
1659
      ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
1660
      if (tp == (struct type *) NULL)
1661
        tp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
1662
 
1663
      /* Make sure that TYPE_CODE(tp) has an expected type code.
1664
         Any type may be returned from cross_ref if file indirect entries
1665
         are corrupted.  */
1666
      if (TYPE_CODE (tp) != TYPE_CODE_RANGE)
1667
        {
1668
          complain (&unexpected_type_code_complaint, sym_name);
1669
        }
1670
      else
1671
        {
1672
          /* Usually, TYPE_CODE(tp) is already type_code.  The main
1673
             exception is if we guessed wrong re struct/union/enum. */
1674
          if (TYPE_CODE (tp) != type_code)
1675
            {
1676
              complain (&bad_tag_guess_complaint, sym_name);
1677
              TYPE_CODE (tp) = type_code;
1678
            }
1679
          if (TYPE_NAME (tp) == NULL || !STREQ (TYPE_NAME (tp), name))
1680
            TYPE_NAME (tp) = obsavestring (name, strlen (name),
1681
                                           &current_objfile->type_obstack);
1682
        }
1683
    }
1684
  if (t->bt == btTypedef)
1685
    {
1686
      char *name;
1687
 
1688
      /* Try to cross reference this type, it should succeed.  */
1689
      ax += cross_ref (fd, ax, &tp, type_code, &name, bigend, sym_name);
1690
      if (tp == (struct type *) NULL)
1691
        {
1692
          complain (&unable_to_cross_ref_complaint, sym_name);
1693
          tp = mdebug_type_int;
1694
        }
1695
    }
1696
 
1697
  /* Deal with range types */
1698
  if (t->bt == btRange)
1699
    {
1700
      TYPE_NFIELDS (tp) = 2;
1701
      TYPE_FIELDS (tp) = ((struct field *)
1702
                          TYPE_ALLOC (tp, 2 * sizeof (struct field)));
1703
      TYPE_FIELD_NAME (tp, 0) = obsavestring ("Low", strlen ("Low"),
1704
                                            &current_objfile->type_obstack);
1705
      TYPE_FIELD_BITPOS (tp, 0) = AUX_GET_DNLOW (bigend, ax);
1706
      ax++;
1707
      TYPE_FIELD_NAME (tp, 1) = obsavestring ("High", strlen ("High"),
1708
                                            &current_objfile->type_obstack);
1709
      TYPE_FIELD_BITPOS (tp, 1) = AUX_GET_DNHIGH (bigend, ax);
1710
      ax++;
1711
    }
1712
 
1713
  /* Parse all the type qualifiers now. If there are more
1714
     than 6 the game will continue in the next aux */
1715
 
1716
  while (1)
1717
    {
1718
#define PARSE_TQ(tq) \
1719
      if (t->tq != tqNil) \
1720
        ax += upgrade_type(fd, &tp, t->tq, ax, bigend, sym_name); \
1721
      else \
1722
        break;
1723
 
1724
      PARSE_TQ (tq0);
1725
      PARSE_TQ (tq1);
1726
      PARSE_TQ (tq2);
1727
      PARSE_TQ (tq3);
1728
      PARSE_TQ (tq4);
1729
      PARSE_TQ (tq5);
1730
#undef  PARSE_TQ
1731
 
1732
      /* mips cc 2.x and gcc never put out continued aux entries.  */
1733
      if (!t->continued)
1734
        break;
1735
 
1736
      (*debug_swap->swap_tir_in) (bigend, &ax->a_ti, t);
1737
      ax++;
1738
    }
1739
 
1740
  /* Complain for illegal continuations due to corrupt aux entries.  */
1741
  if (t->continued)
1742
    complain (&bad_continued_complaint, sym_name);
1743
 
1744
  return tp;
1745
}
1746
 
1747
/* Make up a complex type from a basic one.  Type is passed by
1748
   reference in TPP and side-effected as necessary. The type
1749
   qualifier TQ says how to handle the aux symbols at AX for
1750
   the symbol SX we are currently analyzing.  BIGEND says whether
1751
   aux symbols are big-endian or little-endian.
1752
   Returns the number of aux symbols we parsed. */
1753
 
1754
static int
1755
upgrade_type (int fd, struct type **tpp, int tq, union aux_ext *ax, int bigend,
1756
              char *sym_name)
1757
{
1758
  int off;
1759
  struct type *t;
1760
 
1761
  /* Used in array processing */
1762
  int rf, id;
1763
  FDR *fh;
1764
  struct type *range;
1765
  struct type *indx;
1766
  int lower, upper;
1767
  RNDXR rndx;
1768
 
1769
  switch (tq)
1770
    {
1771
    case tqPtr:
1772
      t = lookup_pointer_type (*tpp);
1773
      *tpp = t;
1774
      return 0;
1775
 
1776
    case tqProc:
1777
      t = lookup_function_type (*tpp);
1778
      *tpp = t;
1779
      return 0;
1780
 
1781
    case tqArray:
1782
      off = 0;
1783
 
1784
      /* Determine and record the domain type (type of index) */
1785
      (*debug_swap->swap_rndx_in) (bigend, &ax->a_rndx, &rndx);
1786
      id = rndx.index;
1787
      rf = rndx.rfd;
1788
      if (rf == 0xfff)
1789
        {
1790
          ax++;
1791
          rf = AUX_GET_ISYM (bigend, ax);
1792
          off++;
1793
        }
1794
      fh = get_rfd (fd, rf);
1795
 
1796
      indx = parse_type (fh - debug_info->fdr,
1797
                         debug_info->external_aux + fh->iauxBase,
1798
                         id, (int *) NULL, bigend, sym_name);
1799
 
1800
      /* The bounds type should be an integer type, but might be anything
1801
         else due to corrupt aux entries.  */
1802
      if (TYPE_CODE (indx) != TYPE_CODE_INT)
1803
        {
1804
          complain (&array_index_type_complaint, sym_name);
1805
          indx = mdebug_type_int;
1806
        }
1807
 
1808
      /* Get the bounds, and create the array type.  */
1809
      ax++;
1810
      lower = AUX_GET_DNLOW (bigend, ax);
1811
      ax++;
1812
      upper = AUX_GET_DNHIGH (bigend, ax);
1813
      ax++;
1814
      rf = AUX_GET_WIDTH (bigend, ax);  /* bit size of array element */
1815
 
1816
      range = create_range_type ((struct type *) NULL, indx,
1817
                                 lower, upper);
1818
 
1819
      t = create_array_type ((struct type *) NULL, *tpp, range);
1820
 
1821
      /* We used to fill in the supplied array element bitsize
1822
         here if the TYPE_LENGTH of the target type was zero.
1823
         This happens for a `pointer to an array of anonymous structs',
1824
         but in this case the array element bitsize is also zero,
1825
         so nothing is gained.
1826
         And we used to check the TYPE_LENGTH of the target type against
1827
         the supplied array element bitsize.
1828
         gcc causes a mismatch for `pointer to array of object',
1829
         since the sdb directives it uses do not have a way of
1830
         specifying the bitsize, but it does no harm (the
1831
         TYPE_LENGTH should be correct) and we should be able to
1832
         ignore the erroneous bitsize from the auxiliary entry safely.
1833
         dbx seems to ignore it too.  */
1834
 
1835
      /* TYPE_FLAG_TARGET_STUB now takes care of the zero TYPE_LENGTH
1836
         problem.  */
1837
      if (TYPE_LENGTH (*tpp) == 0)
1838
        {
1839
          TYPE_FLAGS (t) |= TYPE_FLAG_TARGET_STUB;
1840
        }
1841
 
1842
      *tpp = t;
1843
      return 4 + off;
1844
 
1845
    case tqVol:
1846
      /* Volatile -- currently ignored */
1847
      return 0;
1848
 
1849
    case tqConst:
1850
      /* Const -- currently ignored */
1851
      return 0;
1852
 
1853
    default:
1854
      complain (&unknown_type_qual_complaint, tq);
1855
      return 0;
1856
    }
1857
}
1858
 
1859
 
1860
/* Parse a procedure descriptor record PR.  Note that the procedure is
1861
   parsed _after_ the local symbols, now we just insert the extra
1862
   information we need into a MIPS_EFI_SYMBOL_NAME symbol that has
1863
   already been placed in the procedure's main block.  Note also that
1864
   images that have been partially stripped (ld -x) have been deprived
1865
   of local symbols, and we have to cope with them here.  FIRST_OFF is
1866
   the offset of the first procedure for this FDR; we adjust the
1867
   address by this amount, but I don't know why.  SEARCH_SYMTAB is the symtab
1868
   to look for the function which contains the MIPS_EFI_SYMBOL_NAME symbol
1869
   in question, or NULL to use top_stack->cur_block.  */
1870
 
1871
static void parse_procedure (PDR *, struct symtab *, struct partial_symtab *);
1872
 
1873
static void
1874
parse_procedure (PDR *pr, struct symtab *search_symtab,
1875
                 struct partial_symtab *pst)
1876
{
1877
  struct symbol *s, *i;
1878
  struct block *b;
1879
  struct mips_extra_func_info *e;
1880
  char *sh_name;
1881
 
1882
  /* Simple rule to find files linked "-x" */
1883
  if (cur_fdr->rss == -1)
1884
    {
1885
      if (pr->isym == -1)
1886
        {
1887
          /* Static procedure at address pr->adr.  Sigh. */
1888
          /* FIXME-32x64.  assuming pr->adr fits in long.  */
1889
          complain (&pdr_static_symbol_complaint, (unsigned long) pr->adr);
1890
          return;
1891
        }
1892
      else
1893
        {
1894
          /* external */
1895
          EXTR she;
1896
 
1897
          (*debug_swap->swap_ext_in) (cur_bfd,
1898
                                      ((char *) debug_info->external_ext
1899
                                       + (pr->isym
1900
                                          * debug_swap->external_ext_size)),
1901
                                      &she);
1902
          sh_name = debug_info->ssext + she.asym.iss;
1903
        }
1904
    }
1905
  else
1906
    {
1907
      /* Full symbols */
1908
      SYMR sh;
1909
 
1910
      (*debug_swap->swap_sym_in) (cur_bfd,
1911
                                  ((char *) debug_info->external_sym
1912
                                   + ((cur_fdr->isymBase + pr->isym)
1913
                                      * debug_swap->external_sym_size)),
1914
                                  &sh);
1915
      sh_name = debug_info->ss + cur_fdr->issBase + sh.iss;
1916
    }
1917
 
1918
  if (search_symtab != NULL)
1919
    {
1920
#if 0
1921
      /* This loses both in the case mentioned (want a static, find a global),
1922
         but also if we are looking up a non-mangled name which happens to
1923
         match the name of a mangled function.  */
1924
      /* We have to save the cur_fdr across the call to lookup_symbol.
1925
         If the pdr is for a static function and if a global function with
1926
         the same name exists, lookup_symbol will eventually read in the symtab
1927
         for the global function and clobber cur_fdr.  */
1928
      FDR *save_cur_fdr = cur_fdr;
1929
      s = lookup_symbol (sh_name, NULL, VAR_NAMESPACE, 0, NULL);
1930
      cur_fdr = save_cur_fdr;
1931
#else
1932
      s = mylookup_symbol
1933
        (sh_name,
1934
         BLOCKVECTOR_BLOCK (BLOCKVECTOR (search_symtab), STATIC_BLOCK),
1935
         VAR_NAMESPACE,
1936
         LOC_BLOCK);
1937
#endif
1938
    }
1939
  else
1940
    s = mylookup_symbol (sh_name, top_stack->cur_block,
1941
                         VAR_NAMESPACE, LOC_BLOCK);
1942
 
1943
  if (s != 0)
1944
    {
1945
      b = SYMBOL_BLOCK_VALUE (s);
1946
    }
1947
  else
1948
    {
1949
      complain (&pdr_for_nonsymbol_complaint, sh_name);
1950
#if 1
1951
      return;
1952
#else
1953
/* FIXME -- delete.  We can't do symbol allocation now; it's all done.  */
1954
      s = new_symbol (sh_name);
1955
      SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
1956
      SYMBOL_CLASS (s) = LOC_BLOCK;
1957
      /* Donno its type, hope int is ok */
1958
      SYMBOL_TYPE (s) = lookup_function_type (mdebug_type_int);
1959
      add_symbol (s, top_stack->cur_block);
1960
      /* Wont have symbols for this one */
1961
      b = new_block (2);
1962
      SYMBOL_BLOCK_VALUE (s) = b;
1963
      BLOCK_FUNCTION (b) = s;
1964
      BLOCK_START (b) = pr->adr;
1965
      /* BOUND used to be the end of procedure's text, but the
1966
         argument is no longer passed in.  */
1967
      BLOCK_END (b) = bound;
1968
      BLOCK_SUPERBLOCK (b) = top_stack->cur_block;
1969
      add_block (b, top_stack->cur_st);
1970
#endif
1971
    }
1972
 
1973
  i = mylookup_symbol (MIPS_EFI_SYMBOL_NAME, b, LABEL_NAMESPACE, LOC_CONST);
1974
 
1975
  if (i)
1976
    {
1977
      e = (struct mips_extra_func_info *) SYMBOL_VALUE (i);
1978
      e->pdr = *pr;
1979
      e->pdr.isym = (long) s;
1980
 
1981
      /* GDB expects the absolute function start address for the
1982
         procedure descriptor in e->pdr.adr.
1983
         As the address in the procedure descriptor is usually relative,
1984
         we would have to relocate e->pdr.adr with cur_fdr->adr and
1985
         ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (pst->objfile)).
1986
         Unfortunately cur_fdr->adr and e->pdr.adr are both absolute
1987
         in shared libraries on some systems, and on other systems
1988
         e->pdr.adr is sometimes offset by a bogus value.
1989
         To work around these problems, we replace e->pdr.adr with
1990
         the start address of the function.  */
1991
      e->pdr.adr = BLOCK_START (b);
1992
 
1993
      /* Correct incorrect setjmp procedure descriptor from the library
1994
         to make backtrace through setjmp work.  */
1995
      if (e->pdr.pcreg == 0 && STREQ (sh_name, "setjmp"))
1996
        {
1997
          complain (&bad_setjmp_pdr_complaint, 0);
1998
          e->pdr.pcreg = RA_REGNUM;
1999
          e->pdr.regmask = 0x80000000;
2000
          e->pdr.regoffset = -4;
2001
        }
2002
    }
2003
 
2004
  /* It would be reasonable that functions that have been compiled
2005
     without debugging info have a btNil type for their return value,
2006
     and functions that are void and are compiled with debugging info
2007
     have btVoid.
2008
     gcc and DEC f77 put out btNil types for both cases, so btNil is mapped
2009
     to TYPE_CODE_VOID in parse_type to get the `compiled with debugging info'
2010
     case right.
2011
     The glevel field in cur_fdr could be used to determine the presence
2012
     of debugging info, but GCC doesn't always pass the -g switch settings
2013
     to the assembler and GAS doesn't set the glevel field from the -g switch
2014
     settings.
2015
     To work around these problems, the return value type of a TYPE_CODE_VOID
2016
     function is adjusted accordingly if no debugging info was found in the
2017
     compilation unit.  */
2018
 
2019
  if (processing_gcc_compilation == 0
2020
      && found_ecoff_debugging_info == 0
2021
      && TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (s))) == TYPE_CODE_VOID)
2022
    SYMBOL_TYPE (s) = nodebug_func_symbol_type;
2023
}
2024
 
2025
/* Relocate the extra function info pointed to by the symbol table.  */
2026
 
2027
void
2028
ecoff_relocate_efi (struct symbol *sym, CORE_ADDR delta)
2029
{
2030
  struct mips_extra_func_info *e;
2031
 
2032
  e = (struct mips_extra_func_info *) SYMBOL_VALUE (sym);
2033
 
2034
  e->pdr.adr += delta;
2035
}
2036
 
2037
/* Parse the external symbol ES. Just call parse_symbol() after
2038
   making sure we know where the aux are for it.
2039
   BIGEND says whether aux entries are big-endian or little-endian.
2040
 
2041
   This routine clobbers top_stack->cur_block and ->cur_st. */
2042
 
2043
static void parse_external (EXTR *, int, struct section_offsets *,
2044
                            struct objfile *);
2045
 
2046
static void
2047
parse_external (EXTR *es, int bigend, struct section_offsets *section_offsets,
2048
                struct objfile *objfile)
2049
{
2050
  union aux_ext *ax;
2051
 
2052
  if (es->ifd != ifdNil)
2053
    {
2054
      cur_fd = es->ifd;
2055
      cur_fdr = debug_info->fdr + cur_fd;
2056
      ax = debug_info->external_aux + cur_fdr->iauxBase;
2057
    }
2058
  else
2059
    {
2060
      cur_fdr = debug_info->fdr;
2061
      ax = 0;
2062
    }
2063
 
2064
  /* Reading .o files */
2065
  if (SC_IS_UNDEF (es->asym.sc) || es->asym.sc == scNil)
2066
    {
2067
      char *what;
2068
      switch (es->asym.st)
2069
        {
2070
        case stNil:
2071
          /* These are generated for static symbols in .o files,
2072
             ignore them.  */
2073
          return;
2074
        case stStaticProc:
2075
        case stProc:
2076
          what = "procedure";
2077
          n_undef_procs++;
2078
          break;
2079
        case stGlobal:
2080
          what = "variable";
2081
          n_undef_vars++;
2082
          break;
2083
        case stLabel:
2084
          what = "label";
2085
          n_undef_labels++;
2086
          break;
2087
        default:
2088
          what = "symbol";
2089
          break;
2090
        }
2091
      n_undef_symbols++;
2092
      /* FIXME:  Turn this into a complaint? */
2093
      if (info_verbose)
2094
        printf_filtered ("Warning: %s `%s' is undefined (in %s)\n",
2095
                         what, debug_info->ssext + es->asym.iss,
2096
                         fdr_name (cur_fdr));
2097
      return;
2098
    }
2099
 
2100
  switch (es->asym.st)
2101
    {
2102
    case stProc:
2103
    case stStaticProc:
2104
      /* There is no need to parse the external procedure symbols.
2105
         If they are from objects compiled without -g, their index will
2106
         be indexNil, and the symbol definition from the minimal symbol
2107
         is preferrable (yielding a function returning int instead of int).
2108
         If the index points to a local procedure symbol, the local
2109
         symbol already provides the correct type.
2110
         Note that the index of the external procedure symbol points
2111
         to the local procedure symbol in the local symbol table, and
2112
         _not_ to the auxiliary symbol info.  */
2113
      break;
2114
    case stGlobal:
2115
    case stLabel:
2116
      /* Global common symbols are resolved by the runtime loader,
2117
         ignore them.  */
2118
      if (SC_IS_COMMON (es->asym.sc))
2119
        break;
2120
 
2121
      /* Note that the case of a symbol with indexNil must be handled
2122
         anyways by parse_symbol().  */
2123
      parse_symbol (&es->asym, ax, (char *) NULL, bigend, section_offsets, objfile);
2124
      break;
2125
    default:
2126
      break;
2127
    }
2128
}
2129
 
2130
/* Parse the line number info for file descriptor FH into
2131
   GDB's linetable LT.  MIPS' encoding requires a little bit
2132
   of magic to get things out.  Note also that MIPS' line
2133
   numbers can go back and forth, apparently we can live
2134
   with that and do not need to reorder our linetables */
2135
 
2136
static void parse_lines (FDR *, PDR *, struct linetable *, int,
2137
                         struct partial_symtab *, CORE_ADDR);
2138
 
2139
static void
2140
parse_lines (FDR *fh, PDR *pr, struct linetable *lt, int maxlines,
2141
             struct partial_symtab *pst, CORE_ADDR lowest_pdr_addr)
2142
{
2143
  unsigned char *base;
2144
  int j, k;
2145
  int delta, count, lineno = 0;
2146
 
2147
  if (fh->cbLine == 0)
2148
    return;
2149
 
2150
  /* Scan by procedure descriptors */
2151
  k = 0;
2152
  for (j = 0; j < fh->cpd; j++, pr++)
2153
    {
2154
      CORE_ADDR l;
2155
      CORE_ADDR adr;
2156
      unsigned char *halt;
2157
 
2158
      /* No code for this one */
2159
      if (pr->iline == ilineNil ||
2160
          pr->lnLow == -1 || pr->lnHigh == -1)
2161
        continue;
2162
 
2163
      /* Determine start and end address of compressed line bytes for
2164
         this procedure.  */
2165
      base = debug_info->line + fh->cbLineOffset;
2166
      if (j != (fh->cpd - 1))
2167
        halt = base + pr[1].cbLineOffset;
2168
      else
2169
        halt = base + fh->cbLine;
2170
      base += pr->cbLineOffset;
2171
 
2172
      adr = pst->textlow + pr->adr - lowest_pdr_addr;
2173
 
2174
      l = adr >> 2;             /* in words */
2175
      for (lineno = pr->lnLow; base < halt;)
2176
        {
2177
          count = *base & 0x0f;
2178
          delta = *base++ >> 4;
2179
          if (delta >= 8)
2180
            delta -= 16;
2181
          if (delta == -8)
2182
            {
2183
              delta = (base[0] << 8) | base[1];
2184
              if (delta >= 0x8000)
2185
                delta -= 0x10000;
2186
              base += 2;
2187
            }
2188
          lineno += delta;      /* first delta is 0 */
2189
 
2190
          /* Complain if the line table overflows. Could happen
2191
             with corrupt binaries.  */
2192
          if (lt->nitems >= maxlines)
2193
            {
2194
              complain (&bad_linetable_guess_complaint, fdr_name (fh));
2195
              break;
2196
            }
2197
          k = add_line (lt, lineno, l, k);
2198
          l += count + 1;
2199
        }
2200
    }
2201
}
2202
 
2203
/* Master parsing procedure for first-pass reading of file symbols
2204
   into a partial_symtab.  */
2205
 
2206
static void
2207
parse_partial_symbols (struct objfile *objfile)
2208
{
2209
  const bfd_size_type external_sym_size = debug_swap->external_sym_size;
2210
  const bfd_size_type external_rfd_size = debug_swap->external_rfd_size;
2211
  const bfd_size_type external_ext_size = debug_swap->external_ext_size;
2212
  void (*const swap_ext_in) (bfd *, PTR, EXTR *) = debug_swap->swap_ext_in;
2213
  void (*const swap_sym_in) (bfd *, PTR, SYMR *) = debug_swap->swap_sym_in;
2214
  void (*const swap_rfd_in) (bfd *, PTR, RFDT *) = debug_swap->swap_rfd_in;
2215
  int f_idx, s_idx;
2216
  HDRR *hdr = &debug_info->symbolic_header;
2217
  /* Running pointers */
2218
  FDR *fh;
2219
  char *ext_out;
2220
  char *ext_out_end;
2221
  EXTR *ext_block;
2222
  register EXTR *ext_in;
2223
  EXTR *ext_in_end;
2224
  SYMR sh;
2225
  struct partial_symtab *pst;
2226
  int textlow_not_set = 1;
2227
  int past_first_source_file = 0;
2228
 
2229
  /* List of current psymtab's include files */
2230
  char **psymtab_include_list;
2231
  int includes_allocated;
2232
  int includes_used;
2233
  EXTR *extern_tab;
2234
  struct pst_map *fdr_to_pst;
2235
  /* Index within current psymtab dependency list */
2236
  struct partial_symtab **dependency_list;
2237
  int dependencies_used, dependencies_allocated;
2238
  struct cleanup *old_chain;
2239
  char *name;
2240
  enum language prev_language;
2241
  asection *text_sect;
2242
  int relocatable = 0;
2243
 
2244
  /* Irix 5.2 shared libraries have a fh->adr field of zero, but
2245
     the shared libraries are prelinked at a high memory address.
2246
     We have to adjust the start address of the object file for this case,
2247
     by setting it to the start address of the first procedure in the file.
2248
     But we should do no adjustments if we are debugging a .o file, where
2249
     the text section (and fh->adr) really starts at zero.  */
2250
  text_sect = bfd_get_section_by_name (cur_bfd, ".text");
2251
  if (text_sect != NULL
2252
      && (bfd_get_section_flags (cur_bfd, text_sect) & SEC_RELOC))
2253
    relocatable = 1;
2254
 
2255
  extern_tab = (EXTR *) obstack_alloc (&objfile->psymbol_obstack,
2256
                                       sizeof (EXTR) * hdr->iextMax);
2257
 
2258
  includes_allocated = 30;
2259
  includes_used = 0;
2260
  psymtab_include_list = (char **) alloca (includes_allocated *
2261
                                           sizeof (char *));
2262
  next_symbol_text_func = mdebug_next_symbol_text;
2263
 
2264
  dependencies_allocated = 30;
2265
  dependencies_used = 0;
2266
  dependency_list =
2267
    (struct partial_symtab **) alloca (dependencies_allocated *
2268
                                       sizeof (struct partial_symtab *));
2269
 
2270
  last_source_file = NULL;
2271
 
2272
  /*
2273
   * Big plan:
2274
   *
2275
   * Only parse the Local and External symbols, and the Relative FDR.
2276
   * Fixup enough of the loader symtab to be able to use it.
2277
   * Allocate space only for the file's portions we need to
2278
   * look at. (XXX)
2279
   */
2280
 
2281
  max_gdbinfo = 0;
2282
  max_glevel = MIN_GLEVEL;
2283
 
2284
  /* Allocate the map FDR -> PST.
2285
     Minor hack: -O3 images might claim some global data belongs
2286
     to FDR -1. We`ll go along with that */
2287
  fdr_to_pst = (struct pst_map *) xzalloc ((hdr->ifdMax + 1) * sizeof *fdr_to_pst);
2288
  old_chain = make_cleanup (xfree, fdr_to_pst);
2289
  fdr_to_pst++;
2290
  {
2291
    struct partial_symtab *pst = new_psymtab ("", objfile);
2292
    fdr_to_pst[-1].pst = pst;
2293
    FDR_IDX (pst) = -1;
2294
  }
2295
 
2296
  /* Allocate the global pending list.  */
2297
  pending_list =
2298
    ((struct mdebug_pending **)
2299
     obstack_alloc (&objfile->psymbol_obstack,
2300
                    hdr->ifdMax * sizeof (struct mdebug_pending *)));
2301
  memset ((PTR) pending_list, 0,
2302
          hdr->ifdMax * sizeof (struct mdebug_pending *));
2303
 
2304
  /* Pass 0 over external syms: swap them in.  */
2305
  ext_block = (EXTR *) xmalloc (hdr->iextMax * sizeof (EXTR));
2306
  make_cleanup (xfree, ext_block);
2307
 
2308
  ext_out = (char *) debug_info->external_ext;
2309
  ext_out_end = ext_out + hdr->iextMax * external_ext_size;
2310
  ext_in = ext_block;
2311
  for (; ext_out < ext_out_end; ext_out += external_ext_size, ext_in++)
2312
    (*swap_ext_in) (cur_bfd, ext_out, ext_in);
2313
 
2314
  /* Pass 1 over external syms: Presize and partition the list */
2315
  ext_in = ext_block;
2316
  ext_in_end = ext_in + hdr->iextMax;
2317
  for (; ext_in < ext_in_end; ext_in++)
2318
    {
2319
      /* See calls to complain below.  */
2320
      if (ext_in->ifd >= -1
2321
          && ext_in->ifd < hdr->ifdMax
2322
          && ext_in->asym.iss >= 0
2323
          && ext_in->asym.iss < hdr->issExtMax)
2324
        fdr_to_pst[ext_in->ifd].n_globals++;
2325
    }
2326
 
2327
  /* Pass 1.5 over files:  partition out global symbol space */
2328
  s_idx = 0;
2329
  for (f_idx = -1; f_idx < hdr->ifdMax; f_idx++)
2330
    {
2331
      fdr_to_pst[f_idx].globals_offset = s_idx;
2332
      s_idx += fdr_to_pst[f_idx].n_globals;
2333
      fdr_to_pst[f_idx].n_globals = 0;
2334
    }
2335
 
2336
  /* ECOFF in ELF:
2337
 
2338
     For ECOFF in ELF, we skip the creation of the minimal symbols.
2339
     The ECOFF symbols should be a subset of the Elf symbols, and the
2340
     section information of the elf symbols will be more accurate.
2341
     FIXME!  What about Irix 5's native linker?
2342
 
2343
     By default, Elf sections which don't exist in ECOFF
2344
     get put in ECOFF's absolute section by the gnu linker.
2345
     Since absolute sections don't get relocated, we
2346
     end up calculating an address different from that of
2347
     the symbol's minimal symbol (created earlier from the
2348
     Elf symtab).
2349
 
2350
     To fix this, either :
2351
     1) don't create the duplicate symbol
2352
     (assumes ECOFF symtab is a subset of the ELF symtab;
2353
     assumes no side-effects result from ignoring ECOFF symbol)
2354
     2) create it, only if lookup for existing symbol in ELF's minimal
2355
     symbols fails
2356
     (inefficient;
2357
     assumes no side-effects result from ignoring ECOFF symbol)
2358
     3) create it, but lookup ELF's minimal symbol and use it's section
2359
     during relocation, then modify "uniqify" phase to merge and
2360
     eliminate the duplicate symbol
2361
     (highly inefficient)
2362
 
2363
     I've implemented #1 here...
2364
     Skip the creation of the minimal symbols based on the ECOFF
2365
     symbol table. */
2366
 
2367
  /* Pass 2 over external syms: fill in external symbols */
2368
  ext_in = ext_block;
2369
  ext_in_end = ext_in + hdr->iextMax;
2370
  for (; ext_in < ext_in_end; ext_in++)
2371
    {
2372
      enum minimal_symbol_type ms_type = mst_text;
2373
      CORE_ADDR svalue = ext_in->asym.value;
2374
 
2375
      /* The Irix 5 native tools seem to sometimes generate bogus
2376
         external symbols.  */
2377
      if (ext_in->ifd < -1 || ext_in->ifd >= hdr->ifdMax)
2378
        {
2379
          complain (&bad_ext_ifd_complaint, ext_in->ifd, hdr->ifdMax);
2380
          continue;
2381
        }
2382
      if (ext_in->asym.iss < 0 || ext_in->asym.iss >= hdr->issExtMax)
2383
        {
2384
          complain (&bad_ext_iss_complaint, ext_in->asym.iss,
2385
                    hdr->issExtMax);
2386
          continue;
2387
        }
2388
 
2389
      extern_tab[fdr_to_pst[ext_in->ifd].globals_offset
2390
                 + fdr_to_pst[ext_in->ifd].n_globals++] = *ext_in;
2391
 
2392
 
2393
      if (SC_IS_UNDEF (ext_in->asym.sc) || ext_in->asym.sc == scNil)
2394
        continue;
2395
 
2396
 
2397
      /* Pass 3 over files, over local syms: fill in static symbols */
2398
      name = debug_info->ssext + ext_in->asym.iss;
2399
 
2400
      /* Process ECOFF Symbol Types and Storage Classes */
2401
      switch (ext_in->asym.st)
2402
        {
2403
        case stProc:
2404
          /* Beginnning of Procedure */
2405
          svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2406
          break;
2407
        case stStaticProc:
2408
          /* Load time only static procs */
2409
          ms_type = mst_file_text;
2410
          svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2411
          break;
2412
        case stGlobal:
2413
          /* External symbol */
2414
          if (SC_IS_COMMON (ext_in->asym.sc))
2415
            {
2416
              /* The value of a common symbol is its size, not its address.
2417
                 Ignore it.  */
2418
              continue;
2419
            }
2420
          else if (SC_IS_DATA (ext_in->asym.sc))
2421
            {
2422
              ms_type = mst_data;
2423
              svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2424
            }
2425
          else if (SC_IS_BSS (ext_in->asym.sc))
2426
            {
2427
              ms_type = mst_bss;
2428
              svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
2429
            }
2430
          else
2431
            ms_type = mst_abs;
2432
          break;
2433
        case stLabel:
2434
          /* Label */
2435
          if (SC_IS_TEXT (ext_in->asym.sc))
2436
            {
2437
              ms_type = mst_file_text;
2438
              svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2439
            }
2440
          else if (SC_IS_DATA (ext_in->asym.sc))
2441
            {
2442
              ms_type = mst_file_data;
2443
              svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2444
            }
2445
          else if (SC_IS_BSS (ext_in->asym.sc))
2446
            {
2447
              ms_type = mst_file_bss;
2448
              svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
2449
            }
2450
          else
2451
            ms_type = mst_abs;
2452
          break;
2453
        case stLocal:
2454
        case stNil:
2455
          /* The alpha has the section start addresses in stLocal symbols
2456
             whose name starts with a `.'. Skip those but complain for all
2457
             other stLocal symbols.
2458
             Irix6 puts the section start addresses in stNil symbols, skip
2459
             those too. */
2460
          if (name[0] == '.')
2461
            continue;
2462
          /* Fall through.  */
2463
        default:
2464
          ms_type = mst_unknown;
2465
          complain (&unknown_ext_complaint, name);
2466
        }
2467
      if (!ECOFF_IN_ELF (cur_bfd))
2468
        prim_record_minimal_symbol (name, svalue, ms_type, objfile);
2469
    }
2470
 
2471
  /* Pass 3 over files, over local syms: fill in static symbols */
2472
  for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++)
2473
    {
2474
      struct partial_symtab *save_pst;
2475
      EXTR *ext_ptr;
2476
      CORE_ADDR textlow;
2477
 
2478
      cur_fdr = fh = debug_info->fdr + f_idx;
2479
 
2480
      if (fh->csym == 0)
2481
        {
2482
          fdr_to_pst[f_idx].pst = NULL;
2483
          continue;
2484
        }
2485
 
2486
      /* Determine the start address for this object file from the
2487
         file header and relocate it, except for Irix 5.2 zero fh->adr.  */
2488
      if (fh->cpd)
2489
        {
2490
          textlow = fh->adr;
2491
          if (relocatable || textlow != 0)
2492
            textlow += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2493
        }
2494
      else
2495
        textlow = 0;
2496
      pst = start_psymtab_common (objfile, objfile->section_offsets,
2497
                                  fdr_name (fh),
2498
                                  textlow,
2499
                                  objfile->global_psymbols.next,
2500
                                  objfile->static_psymbols.next);
2501
      pst->read_symtab_private = ((char *)
2502
                                  obstack_alloc (&objfile->psymbol_obstack,
2503
                                                 sizeof (struct symloc)));
2504
      memset ((PTR) pst->read_symtab_private, 0, sizeof (struct symloc));
2505
 
2506
      save_pst = pst;
2507
      FDR_IDX (pst) = f_idx;
2508
      CUR_BFD (pst) = cur_bfd;
2509
      DEBUG_SWAP (pst) = debug_swap;
2510
      DEBUG_INFO (pst) = debug_info;
2511
      PENDING_LIST (pst) = pending_list;
2512
 
2513
      /* The way to turn this into a symtab is to call... */
2514
      pst->read_symtab = mdebug_psymtab_to_symtab;
2515
 
2516
      /* Set up language for the pst.
2517
         The language from the FDR is used if it is unambigious (e.g. cfront
2518
         with native cc and g++ will set the language to C).
2519
         Otherwise we have to deduce the language from the filename.
2520
         Native ecoff has every header file in a separate FDR, so
2521
         deduce_language_from_filename will return language_unknown for
2522
         a header file, which is not what we want.
2523
         But the FDRs for the header files are after the FDR for the source
2524
         file, so we can assign the language of the source file to the
2525
         following header files. Then we save the language in the private
2526
         pst data so that we can reuse it when building symtabs.  */
2527
      prev_language = psymtab_language;
2528
 
2529
      switch (fh->lang)
2530
        {
2531
        case langCplusplusV2:
2532
          psymtab_language = language_cplus;
2533
          break;
2534
        default:
2535
          psymtab_language = deduce_language_from_filename (fdr_name (fh));
2536
          break;
2537
        }
2538
      if (psymtab_language == language_unknown)
2539
        psymtab_language = prev_language;
2540
      PST_PRIVATE (pst)->pst_language = psymtab_language;
2541
 
2542
      pst->texthigh = pst->textlow;
2543
 
2544
      /* For stabs-in-ecoff files, the second symbol must be @stab.
2545
         This symbol is emitted by mips-tfile to signal that the
2546
         current object file uses encapsulated stabs instead of mips
2547
         ecoff for local symbols.  (It is the second symbol because
2548
         the first symbol is the stFile used to signal the start of a
2549
         file). */
2550
      processing_gcc_compilation = 0;
2551
      if (fh->csym >= 2)
2552
        {
2553
          (*swap_sym_in) (cur_bfd,
2554
                          ((char *) debug_info->external_sym
2555
                           + (fh->isymBase + 1) * external_sym_size),
2556
                          &sh);
2557
          if (STREQ (debug_info->ss + fh->issBase + sh.iss, stabs_symbol))
2558
            processing_gcc_compilation = 2;
2559
        }
2560
 
2561
      if (processing_gcc_compilation != 0)
2562
        {
2563
          for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
2564
            {
2565
              int type_code;
2566
              char *namestring;
2567
 
2568
              (*swap_sym_in) (cur_bfd,
2569
                              (((char *) debug_info->external_sym)
2570
                            + (fh->isymBase + cur_sdx) * external_sym_size),
2571
                              &sh);
2572
              type_code = ECOFF_UNMARK_STAB (sh.index);
2573
              if (!ECOFF_IS_STAB (&sh))
2574
                {
2575
                  if (sh.st == stProc || sh.st == stStaticProc)
2576
                    {
2577
                      CORE_ADDR procaddr;
2578
                      long isym;
2579
 
2580
                      sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2581
                      if (sh.st == stStaticProc)
2582
                        {
2583
                          namestring = debug_info->ss + fh->issBase + sh.iss;
2584
                          prim_record_minimal_symbol_and_info (namestring,
2585
                                                               sh.value,
2586
                                                               mst_file_text,
2587
                                                               NULL,
2588
                                                               SECT_OFF_TEXT (objfile),
2589
                                                               NULL,
2590
                                                               objfile);
2591
                        }
2592
                      procaddr = sh.value;
2593
 
2594
                      isym = AUX_GET_ISYM (fh->fBigendian,
2595
                                           (debug_info->external_aux
2596
                                            + fh->iauxBase
2597
                                            + sh.index));
2598
                      (*swap_sym_in) (cur_bfd,
2599
                                      ((char *) debug_info->external_sym
2600
                                       + ((fh->isymBase + isym - 1)
2601
                                          * external_sym_size)),
2602
                                      &sh);
2603
                      if (sh.st == stEnd)
2604
                        {
2605
                          CORE_ADDR high = procaddr + sh.value;
2606
 
2607
                          /* Kludge for Irix 5.2 zero fh->adr.  */
2608
                          if (!relocatable
2609
                          && (pst->textlow == 0 || procaddr < pst->textlow))
2610
                            pst->textlow = procaddr;
2611
                          if (high > pst->texthigh)
2612
                            pst->texthigh = high;
2613
                        }
2614
                    }
2615
                  else if (sh.st == stStatic)
2616
                    {
2617
                      switch (sh.sc)
2618
                        {
2619
                        case scUndefined:
2620
                        case scSUndefined:
2621
                        case scNil:
2622
                        case scAbs:
2623
                          break;
2624
 
2625
                        case scData:
2626
                        case scSData:
2627
                        case scRData:
2628
                        case scPData:
2629
                        case scXData:
2630
                          namestring = debug_info->ss + fh->issBase + sh.iss;
2631
                          sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2632
                          prim_record_minimal_symbol_and_info (namestring,
2633
                                                               sh.value,
2634
                                                               mst_file_data,
2635
                                                               NULL,
2636
                                                               SECT_OFF_DATA (objfile),
2637
                                                               NULL,
2638
                                                               objfile);
2639
                          break;
2640
 
2641
                        default:
2642
                          /* FIXME!  Shouldn't this use cases for bss,
2643
                             then have the default be abs? */
2644
                          namestring = debug_info->ss + fh->issBase + sh.iss;
2645
                          sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
2646
                          prim_record_minimal_symbol_and_info (namestring,
2647
                                                               sh.value,
2648
                                                               mst_file_bss,
2649
                                                               NULL,
2650
                                                               SECT_OFF_BSS (objfile),
2651
                                                               NULL,
2652
                                                               objfile);
2653
                          break;
2654
                        }
2655
                    }
2656
                  continue;
2657
                }
2658
              /* Handle stabs continuation */
2659
              {
2660
                char *stabstring = debug_info->ss + fh->issBase + sh.iss;
2661
                int len = strlen (stabstring);
2662
                while (stabstring[len - 1] == '\\')
2663
                  {
2664
                    SYMR sh2;
2665
                    char *stabstring1 = stabstring;
2666
                    char *stabstring2;
2667
                    int len2;
2668
 
2669
                    /* Ignore continuation char from 1st string */
2670
                    len--;
2671
 
2672
                    /* Read next stabstring */
2673
                    cur_sdx++;
2674
                    (*swap_sym_in) (cur_bfd,
2675
                                    (((char *) debug_info->external_sym)
2676
                                     + (fh->isymBase + cur_sdx)
2677
                                     * external_sym_size),
2678
                                    &sh2);
2679
                    stabstring2 = debug_info->ss + fh->issBase + sh2.iss;
2680
                    len2 = strlen (stabstring2);
2681
 
2682
                    /* Concatinate stabstring2 with stabstring1 */
2683
                    if (stabstring
2684
                     && stabstring != debug_info->ss + fh->issBase + sh.iss)
2685
                      stabstring = xrealloc (stabstring, len + len2 + 1);
2686
                    else
2687
                      stabstring = xmalloc (len + len2 + 1);
2688
                    strcpy (stabstring, stabstring1);
2689
                    strcpy (stabstring + len, stabstring2);
2690
                    len += len2;
2691
                  }
2692
 
2693
#define SET_NAMESTRING() \
2694
  namestring = stabstring
2695
#define CUR_SYMBOL_TYPE type_code
2696
#define CUR_SYMBOL_VALUE sh.value
2697
#define START_PSYMTAB(ofile,fname,low,symoff,global_syms,static_syms)\
2698
  (pst = save_pst)
2699
#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set) (void)0
2700
#define HANDLE_RBRAC(val) \
2701
  if ((val) > save_pst->texthigh) save_pst->texthigh = (val);
2702
#include "partial-stab.h"
2703
 
2704
                if (stabstring
2705
                    && stabstring != debug_info->ss + fh->issBase + sh.iss)
2706
                  xfree (stabstring);
2707
              }
2708
              /* end - Handle continuation */
2709
            }
2710
        }
2711
      else
2712
        {
2713
          for (cur_sdx = 0; cur_sdx < fh->csym;)
2714
            {
2715
              char *name;
2716
              enum address_class class;
2717
 
2718
              (*swap_sym_in) (cur_bfd,
2719
                              ((char *) debug_info->external_sym
2720
                               + ((fh->isymBase + cur_sdx)
2721
                                  * external_sym_size)),
2722
                              &sh);
2723
 
2724
              if (ECOFF_IS_STAB (&sh))
2725
                {
2726
                  cur_sdx++;
2727
                  continue;
2728
                }
2729
 
2730
              /* Non absolute static symbols go into the minimal table.  */
2731
              if (SC_IS_UNDEF (sh.sc) || sh.sc == scNil
2732
                  || (sh.index == indexNil
2733
                      && (sh.st != stStatic || sh.sc == scAbs)))
2734
                {
2735
                  /* FIXME, premature? */
2736
                  cur_sdx++;
2737
                  continue;
2738
                }
2739
 
2740
              name = debug_info->ss + fh->issBase + sh.iss;
2741
 
2742
              switch (sh.sc)
2743
                {
2744
                case scText:
2745
                case scRConst:
2746
                  /* The value of a stEnd symbol is the displacement from the
2747
                     corresponding start symbol value, do not relocate it.  */
2748
                  if (sh.st != stEnd)
2749
                    sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2750
                  break;
2751
                case scData:
2752
                case scSData:
2753
                case scRData:
2754
                case scPData:
2755
                case scXData:
2756
                  sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2757
                  break;
2758
                case scBss:
2759
                case scSBss:
2760
                  sh.value += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
2761
                  break;
2762
                }
2763
 
2764
              switch (sh.st)
2765
                {
2766
                  CORE_ADDR high;
2767
                  CORE_ADDR procaddr;
2768
                  int new_sdx;
2769
 
2770
                case stStaticProc:
2771
                  prim_record_minimal_symbol_and_info (name, sh.value,
2772
                                                       mst_file_text, NULL,
2773
                                                       SECT_OFF_TEXT (objfile), NULL,
2774
                                                       objfile);
2775
 
2776
                  /* FALLTHROUGH */
2777
 
2778
                case stProc:
2779
                  /* Usually there is a local and a global stProc symbol
2780
                     for a function. This means that the function name
2781
                     has already been entered into the mimimal symbol table
2782
                     while processing the global symbols in pass 2 above.
2783
                     One notable exception is the PROGRAM name from
2784
                     f77 compiled executables, it is only put out as
2785
                     local stProc symbol, and a global MAIN__ stProc symbol
2786
                     points to it.  It doesn't matter though, as gdb is
2787
                     still able to find the PROGRAM name via the partial
2788
                     symbol table, and the MAIN__ symbol via the minimal
2789
                     symbol table.  */
2790
                  if (sh.st == stProc)
2791
                    add_psymbol_to_list (name, strlen (name),
2792
                                         VAR_NAMESPACE, LOC_BLOCK,
2793
                                         &objfile->global_psymbols,
2794
                                    0, sh.value, psymtab_language, objfile);
2795
                  else
2796
                    add_psymbol_to_list (name, strlen (name),
2797
                                         VAR_NAMESPACE, LOC_BLOCK,
2798
                                         &objfile->static_psymbols,
2799
                                    0, sh.value, psymtab_language, objfile);
2800
 
2801
                  /* Skip over procedure to next one. */
2802
                  if (sh.index >= hdr->iauxMax)
2803
                    {
2804
                      /* Should not happen, but does when cross-compiling
2805
                         with the MIPS compiler.  FIXME -- pull later.  */
2806
                      complain (&index_complaint, name);
2807
                      new_sdx = cur_sdx + 1;    /* Don't skip at all */
2808
                    }
2809
                  else
2810
                    new_sdx = AUX_GET_ISYM (fh->fBigendian,
2811
                                            (debug_info->external_aux
2812
                                             + fh->iauxBase
2813
                                             + sh.index));
2814
                  procaddr = sh.value;
2815
 
2816
                  if (new_sdx <= cur_sdx)
2817
                    {
2818
                      /* This should not happen either... FIXME.  */
2819
                      complain (&aux_index_complaint, name);
2820
                      new_sdx = cur_sdx + 1;    /* Don't skip backward */
2821
                    }
2822
 
2823
                  cur_sdx = new_sdx;
2824
                  (*swap_sym_in) (cur_bfd,
2825
                                  ((char *) debug_info->external_sym
2826
                                   + ((fh->isymBase + cur_sdx - 1)
2827
                                      * external_sym_size)),
2828
                                  &sh);
2829
                  if (sh.st != stEnd)
2830
                    continue;
2831
 
2832
                  /* Kludge for Irix 5.2 zero fh->adr.  */
2833
                  if (!relocatable
2834
                      && (pst->textlow == 0 || procaddr < pst->textlow))
2835
                    pst->textlow = procaddr;
2836
 
2837
                  high = procaddr + sh.value;
2838
                  if (high > pst->texthigh)
2839
                    pst->texthigh = high;
2840
                  continue;
2841
 
2842
                case stStatic:  /* Variable */
2843
                  if (SC_IS_DATA (sh.sc))
2844
                    prim_record_minimal_symbol_and_info (name, sh.value,
2845
                                                         mst_file_data, NULL,
2846
                                                         SECT_OFF_DATA (objfile),
2847
                                                         NULL,
2848
                                                         objfile);
2849
                  else
2850
                    prim_record_minimal_symbol_and_info (name, sh.value,
2851
                                                         mst_file_bss, NULL,
2852
                                                         SECT_OFF_BSS (objfile),
2853
                                                         NULL,
2854
                                                         objfile);
2855
                  class = LOC_STATIC;
2856
                  break;
2857
 
2858
                case stIndirect:        /* Irix5 forward declaration */
2859
                  /* Skip forward declarations from Irix5 cc */
2860
                  goto skip;
2861
 
2862
                case stTypedef: /* Typedef */
2863
                  /* Skip typedefs for forward declarations and opaque
2864
                     structs from alpha and mips cc.  */
2865
                  if (sh.iss == 0 || has_opaque_xref (fh, &sh))
2866
                    goto skip;
2867
                  class = LOC_TYPEDEF;
2868
                  break;
2869
 
2870
                case stConstant:        /* Constant decl */
2871
                  class = LOC_CONST;
2872
                  break;
2873
 
2874
                case stUnion:
2875
                case stStruct:
2876
                case stEnum:
2877
                case stBlock:   /* { }, str, un, enum */
2878
                  /* Do not create a partial symbol for cc unnamed aggregates
2879
                     and gcc empty aggregates. */
2880
                  if ((sh.sc == scInfo
2881
                       || SC_IS_COMMON (sh.sc))
2882
                      && sh.iss != 0
2883
                      && sh.index != cur_sdx + 2)
2884
                    {
2885
                      add_psymbol_to_list (name, strlen (name),
2886
                                           STRUCT_NAMESPACE, LOC_TYPEDEF,
2887
                                           &objfile->static_psymbols,
2888
                                           0, (CORE_ADDR) 0,
2889
                                           psymtab_language, objfile);
2890
                    }
2891
                  handle_psymbol_enumerators (objfile, fh, sh.st, sh.value);
2892
 
2893
                  /* Skip over the block */
2894
                  new_sdx = sh.index;
2895
                  if (new_sdx <= cur_sdx)
2896
                    {
2897
                      /* This happens with the Ultrix kernel. */
2898
                      complain (&block_index_complaint, name);
2899
                      new_sdx = cur_sdx + 1;    /* Don't skip backward */
2900
                    }
2901
                  cur_sdx = new_sdx;
2902
                  continue;
2903
 
2904
                case stFile:    /* File headers */
2905
                case stLabel:   /* Labels */
2906
                case stEnd:     /* Ends of files */
2907
                  goto skip;
2908
 
2909
                case stLocal:   /* Local variables */
2910
                  /* Normally these are skipped because we skip over
2911
                     all blocks we see.  However, these can occur
2912
                     as visible symbols in a .h file that contains code. */
2913
                  goto skip;
2914
 
2915
                default:
2916
                  /* Both complaints are valid:  one gives symbol name,
2917
                     the other the offending symbol type.  */
2918
                  complain (&unknown_sym_complaint, name);
2919
                  complain (&unknown_st_complaint, sh.st);
2920
                  cur_sdx++;
2921
                  continue;
2922
                }
2923
              /* Use this gdb symbol */
2924
              add_psymbol_to_list (name, strlen (name),
2925
                                   VAR_NAMESPACE, class,
2926
                                   &objfile->static_psymbols,
2927
                                   0, sh.value, psymtab_language, objfile);
2928
            skip:
2929
              cur_sdx++;        /* Go to next file symbol */
2930
            }
2931
 
2932
          /* Now do enter the external symbols. */
2933
          ext_ptr = &extern_tab[fdr_to_pst[f_idx].globals_offset];
2934
          cur_sdx = fdr_to_pst[f_idx].n_globals;
2935
          PST_PRIVATE (save_pst)->extern_count = cur_sdx;
2936
          PST_PRIVATE (save_pst)->extern_tab = ext_ptr;
2937
          for (; --cur_sdx >= 0; ext_ptr++)
2938
            {
2939
              enum address_class class;
2940
              SYMR *psh;
2941
              char *name;
2942
              CORE_ADDR svalue;
2943
 
2944
              if (ext_ptr->ifd != f_idx)
2945
                internal_error (__FILE__, __LINE__, "failed internal consistency check");
2946
              psh = &ext_ptr->asym;
2947
 
2948
              /* Do not add undefined symbols to the partial symbol table.  */
2949
              if (SC_IS_UNDEF (psh->sc) || psh->sc == scNil)
2950
                continue;
2951
 
2952
              svalue = psh->value;
2953
              switch (psh->sc)
2954
                {
2955
                case scText:
2956
                case scRConst:
2957
                  svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2958
                  break;
2959
                case scData:
2960
                case scSData:
2961
                case scRData:
2962
                case scPData:
2963
                case scXData:
2964
                  svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
2965
                  break;
2966
                case scBss:
2967
                case scSBss:
2968
                  svalue += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
2969
                  break;
2970
                }
2971
 
2972
              switch (psh->st)
2973
                {
2974
                case stNil:
2975
                  /* These are generated for static symbols in .o files,
2976
                     ignore them.  */
2977
                  continue;
2978
                case stProc:
2979
                case stStaticProc:
2980
                  /* External procedure symbols have been entered
2981
                     into the minimal symbol table in pass 2 above.
2982
                     Ignore them, as parse_external will ignore them too.  */
2983
                  continue;
2984
                case stLabel:
2985
                  class = LOC_LABEL;
2986
                  break;
2987
                default:
2988
                  complain (&unknown_ext_complaint,
2989
                            debug_info->ssext + psh->iss);
2990
                  /* Fall through, pretend it's global.  */
2991
                case stGlobal:
2992
                  /* Global common symbols are resolved by the runtime loader,
2993
                     ignore them.  */
2994
                  if (SC_IS_COMMON (psh->sc))
2995
                    continue;
2996
 
2997
                  class = LOC_STATIC;
2998
                  break;
2999
                }
3000
              name = debug_info->ssext + psh->iss;
3001
              add_psymbol_to_list (name, strlen (name),
3002
                                   VAR_NAMESPACE, class,
3003
                                   &objfile->global_psymbols,
3004
                                   0, svalue,
3005
                                   psymtab_language, objfile);
3006
            }
3007
        }
3008
 
3009
      /* Link pst to FDR. end_psymtab returns NULL if the psymtab was
3010
         empty and put on the free list.  */
3011
      fdr_to_pst[f_idx].pst = end_psymtab (save_pst,
3012
                                        psymtab_include_list, includes_used,
3013
                                           -1, save_pst->texthigh,
3014
                       dependency_list, dependencies_used, textlow_not_set);
3015
      includes_used = 0;
3016
      dependencies_used = 0;
3017
 
3018
      if (objfile->ei.entry_point >= save_pst->textlow &&
3019
          objfile->ei.entry_point < save_pst->texthigh)
3020
        {
3021
          objfile->ei.entry_file_lowpc = save_pst->textlow;
3022
          objfile->ei.entry_file_highpc = save_pst->texthigh;
3023
        }
3024
 
3025
      /* The objfile has its functions reordered if this partial symbol
3026
         table overlaps any other partial symbol table.
3027
         We cannot assume a reordered objfile if a partial symbol table
3028
         is contained within another partial symbol table, as partial symbol
3029
         tables for include files with executable code are contained
3030
         within the partial symbol table for the including source file,
3031
         and we do not want to flag the objfile reordered for these cases.
3032
 
3033
         This strategy works well for Irix-5.2 shared libraries, but we
3034
         might have to use a more elaborate (and slower) algorithm for
3035
         other cases.  */
3036
      save_pst = fdr_to_pst[f_idx].pst;
3037
      if (save_pst != NULL
3038
          && save_pst->textlow != 0
3039
          && !(objfile->flags & OBJF_REORDERED))
3040
        {
3041
          ALL_OBJFILE_PSYMTABS (objfile, pst)
3042
          {
3043
            if (save_pst != pst
3044
                && save_pst->textlow >= pst->textlow
3045
                && save_pst->textlow < pst->texthigh
3046
                && save_pst->texthigh > pst->texthigh)
3047
              {
3048
                objfile->flags |= OBJF_REORDERED;
3049
                break;
3050
              }
3051
          }
3052
        }
3053
    }
3054
 
3055
  /* Now scan the FDRs for dependencies */
3056
  for (f_idx = 0; f_idx < hdr->ifdMax; f_idx++)
3057
    {
3058
      fh = f_idx + debug_info->fdr;
3059
      pst = fdr_to_pst[f_idx].pst;
3060
 
3061
      if (pst == (struct partial_symtab *) NULL)
3062
        continue;
3063
 
3064
      /* This should catch stabs-in-ecoff. */
3065
      if (fh->crfd <= 1)
3066
        continue;
3067
 
3068
      /* Skip the first file indirect entry as it is a self dependency
3069
         for source files or a reverse .h -> .c dependency for header files.  */
3070
      pst->number_of_dependencies = 0;
3071
      pst->dependencies =
3072
        ((struct partial_symtab **)
3073
         obstack_alloc (&objfile->psymbol_obstack,
3074
                        ((fh->crfd - 1)
3075
                         * sizeof (struct partial_symtab *))));
3076
      for (s_idx = 1; s_idx < fh->crfd; s_idx++)
3077
        {
3078
          RFDT rh;
3079
 
3080
          (*swap_rfd_in) (cur_bfd,
3081
                          ((char *) debug_info->external_rfd
3082
                           + (fh->rfdBase + s_idx) * external_rfd_size),
3083
                          &rh);
3084
          if (rh < 0 || rh >= hdr->ifdMax)
3085
            {
3086
              complain (&bad_file_number_complaint, rh);
3087
              continue;
3088
            }
3089
 
3090
          /* Skip self dependencies of header files.  */
3091
          if (rh == f_idx)
3092
            continue;
3093
 
3094
          /* Do not add to dependeny list if psymtab was empty.  */
3095
          if (fdr_to_pst[rh].pst == (struct partial_symtab *) NULL)
3096
            continue;
3097
          pst->dependencies[pst->number_of_dependencies++] = fdr_to_pst[rh].pst;
3098
        }
3099
    }
3100
 
3101
  /* Remove the dummy psymtab created for -O3 images above, if it is
3102
     still empty, to enable the detection of stripped executables.  */
3103
  if (objfile->psymtabs->next == NULL
3104
      && objfile->psymtabs->number_of_dependencies == 0
3105
      && objfile->psymtabs->n_global_syms == 0
3106
      && objfile->psymtabs->n_static_syms == 0)
3107
    objfile->psymtabs = NULL;
3108
  do_cleanups (old_chain);
3109
}
3110
 
3111
/* If the current psymbol has an enumerated type, we need to add
3112
   all the the enum constants to the partial symbol table.  */
3113
 
3114
static void
3115
handle_psymbol_enumerators (struct objfile *objfile, FDR *fh, int stype,
3116
                            CORE_ADDR svalue)
3117
{
3118
  const bfd_size_type external_sym_size = debug_swap->external_sym_size;
3119
  void (*const swap_sym_in) (bfd *, PTR, SYMR *) = debug_swap->swap_sym_in;
3120
  char *ext_sym = ((char *) debug_info->external_sym
3121
                   + ((fh->isymBase + cur_sdx + 1) * external_sym_size));
3122
  SYMR sh;
3123
  TIR tir;
3124
 
3125
  switch (stype)
3126
    {
3127
    case stEnum:
3128
      break;
3129
 
3130
    case stBlock:
3131
      /* It is an enumerated type if the next symbol entry is a stMember
3132
         and its auxiliary index is indexNil or its auxiliary entry
3133
         is a plain btNil or btVoid.
3134
         Alpha cc -migrate enums are recognized by a zero index and
3135
         a zero symbol value.
3136
         DU 4.0 cc enums are recognized by a member type of btEnum without
3137
         qualifiers and a zero symbol value.  */
3138
      (*swap_sym_in) (cur_bfd, ext_sym, &sh);
3139
      if (sh.st != stMember)
3140
        return;
3141
 
3142
      if (sh.index == indexNil
3143
          || (sh.index == 0 && svalue == 0))
3144
        break;
3145
      (*debug_swap->swap_tir_in) (fh->fBigendian,
3146
                                  &(debug_info->external_aux
3147
                                    + fh->iauxBase + sh.index)->a_ti,
3148
                                  &tir);
3149
      if ((tir.bt != btNil
3150
           && tir.bt != btVoid
3151
           && (tir.bt != btEnum || svalue != 0))
3152
          || tir.tq0 != tqNil)
3153
        return;
3154
      break;
3155
 
3156
    default:
3157
      return;
3158
    }
3159
 
3160
  for (;;)
3161
    {
3162
      char *name;
3163
 
3164
      (*swap_sym_in) (cur_bfd, ext_sym, &sh);
3165
      if (sh.st != stMember)
3166
        break;
3167
      name = debug_info->ss + cur_fdr->issBase + sh.iss;
3168
 
3169
      /* Note that the value doesn't matter for enum constants
3170
         in psymtabs, just in symtabs.  */
3171
      add_psymbol_to_list (name, strlen (name),
3172
                           VAR_NAMESPACE, LOC_CONST,
3173
                           &objfile->static_psymbols, 0,
3174
                           (CORE_ADDR) 0, psymtab_language, objfile);
3175
      ext_sym += external_sym_size;
3176
    }
3177
}
3178
 
3179
/* Get the next symbol.  OBJFILE is unused. */
3180
 
3181
static char *
3182
mdebug_next_symbol_text (struct objfile *objfile)
3183
{
3184
  SYMR sh;
3185
 
3186
  cur_sdx++;
3187
  (*debug_swap->swap_sym_in) (cur_bfd,
3188
                              ((char *) debug_info->external_sym
3189
                               + ((cur_fdr->isymBase + cur_sdx)
3190
                                  * debug_swap->external_sym_size)),
3191
                              &sh);
3192
  return debug_info->ss + cur_fdr->issBase + sh.iss;
3193
}
3194
 
3195
/* Ancillary function to psymtab_to_symtab().  Does all the work
3196
   for turning the partial symtab PST into a symtab, recurring
3197
   first on all dependent psymtabs.  The argument FILENAME is
3198
   only passed so we can see in debug stack traces what file
3199
   is being read.
3200
 
3201
   This function has a split personality, based on whether the
3202
   symbol table contains ordinary ecoff symbols, or stabs-in-ecoff.
3203
   The flow of control and even the memory allocation differs.  FIXME.  */
3204
 
3205
static void
3206
psymtab_to_symtab_1 (struct partial_symtab *pst, char *filename)
3207
{
3208
  bfd_size_type external_sym_size;
3209
  bfd_size_type external_pdr_size;
3210
  void (*swap_sym_in) (bfd *, PTR, SYMR *);
3211
  void (*swap_pdr_in) (bfd *, PTR, PDR *);
3212
  int i;
3213
  struct symtab *st;
3214
  FDR *fh;
3215
  struct linetable *lines;
3216
  CORE_ADDR lowest_pdr_addr = 0;
3217
 
3218
  if (pst->readin)
3219
    return;
3220
  pst->readin = 1;
3221
 
3222
  /* Read in all partial symbtabs on which this one is dependent.
3223
     NOTE that we do have circular dependencies, sigh.  We solved
3224
     that by setting pst->readin before this point.  */
3225
 
3226
  for (i = 0; i < pst->number_of_dependencies; i++)
3227
    if (!pst->dependencies[i]->readin)
3228
      {
3229
        /* Inform about additional files to be read in.  */
3230
        if (info_verbose)
3231
          {
3232
            fputs_filtered (" ", gdb_stdout);
3233
            wrap_here ("");
3234
            fputs_filtered ("and ", gdb_stdout);
3235
            wrap_here ("");
3236
            printf_filtered ("%s...",
3237
                             pst->dependencies[i]->filename);
3238
            wrap_here ("");     /* Flush output */
3239
            gdb_flush (gdb_stdout);
3240
          }
3241
        /* We only pass the filename for debug purposes */
3242
        psymtab_to_symtab_1 (pst->dependencies[i],
3243
                             pst->dependencies[i]->filename);
3244
      }
3245
 
3246
  /* Do nothing if this is a dummy psymtab.  */
3247
 
3248
  if (pst->n_global_syms == 0 && pst->n_static_syms == 0
3249
      && pst->textlow == 0 && pst->texthigh == 0)
3250
    return;
3251
 
3252
  /* Now read the symbols for this symtab */
3253
 
3254
  cur_bfd = CUR_BFD (pst);
3255
  debug_swap = DEBUG_SWAP (pst);
3256
  debug_info = DEBUG_INFO (pst);
3257
  pending_list = PENDING_LIST (pst);
3258
  external_sym_size = debug_swap->external_sym_size;
3259
  external_pdr_size = debug_swap->external_pdr_size;
3260
  swap_sym_in = debug_swap->swap_sym_in;
3261
  swap_pdr_in = debug_swap->swap_pdr_in;
3262
  current_objfile = pst->objfile;
3263
  cur_fd = FDR_IDX (pst);
3264
  fh = ((cur_fd == -1)
3265
        ? (FDR *) NULL
3266
        : debug_info->fdr + cur_fd);
3267
  cur_fdr = fh;
3268
 
3269
  /* See comment in parse_partial_symbols about the @stabs sentinel. */
3270
  processing_gcc_compilation = 0;
3271
  if (fh != (FDR *) NULL && fh->csym >= 2)
3272
    {
3273
      SYMR sh;
3274
 
3275
      (*swap_sym_in) (cur_bfd,
3276
                      ((char *) debug_info->external_sym
3277
                       + (fh->isymBase + 1) * external_sym_size),
3278
                      &sh);
3279
      if (STREQ (debug_info->ss + fh->issBase + sh.iss,
3280
                 stabs_symbol))
3281
        {
3282
          /* We indicate that this is a GCC compilation so that certain
3283
             features will be enabled in stabsread/dbxread.  */
3284
          processing_gcc_compilation = 2;
3285
        }
3286
    }
3287
 
3288
  if (processing_gcc_compilation != 0)
3289
    {
3290
 
3291
      /* This symbol table contains stabs-in-ecoff entries.  */
3292
 
3293
      /* Parse local symbols first */
3294
 
3295
      if (fh->csym <= 2)        /* FIXME, this blows psymtab->symtab ptr */
3296
        {
3297
          current_objfile = NULL;
3298
          return;
3299
        }
3300
      for (cur_sdx = 2; cur_sdx < fh->csym; cur_sdx++)
3301
        {
3302
          SYMR sh;
3303
          char *name;
3304
          CORE_ADDR valu;
3305
 
3306
          (*swap_sym_in) (cur_bfd,
3307
                          (((char *) debug_info->external_sym)
3308
                           + (fh->isymBase + cur_sdx) * external_sym_size),
3309
                          &sh);
3310
          name = debug_info->ss + fh->issBase + sh.iss;
3311
          valu = sh.value;
3312
          /* XXX This is a hack.  It will go away!  */
3313
          if (ECOFF_IS_STAB (&sh) || (name[0] == '#'))
3314
            {
3315
              int type_code = ECOFF_UNMARK_STAB (sh.index);
3316
 
3317
              /* We should never get non N_STAB symbols here, but they
3318
                 should be harmless, so keep process_one_symbol from
3319
                 complaining about them.  */
3320
              if (type_code & N_STAB)
3321
                {
3322
                  process_one_symbol (type_code, 0, valu, name,
3323
                                      pst->section_offsets, pst->objfile);
3324
                }
3325
              /* Similarly a hack.  */
3326
              else if (name[0] == '#')
3327
                {
3328
                  process_one_symbol (N_SLINE, 0, valu, name,
3329
                                      pst->section_offsets, pst->objfile);
3330
                }
3331
              if (type_code == N_FUN)
3332
                {
3333
                  /* Make up special symbol to contain
3334
                     procedure specific info */
3335
                  struct mips_extra_func_info *e =
3336
                  ((struct mips_extra_func_info *)
3337
                   obstack_alloc (&current_objfile->symbol_obstack,
3338
                                  sizeof (struct mips_extra_func_info)));
3339
                  struct symbol *s = new_symbol (MIPS_EFI_SYMBOL_NAME);
3340
 
3341
                  memset ((PTR) e, 0, sizeof (struct mips_extra_func_info));
3342
                  SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
3343
                  SYMBOL_CLASS (s) = LOC_CONST;
3344
                  SYMBOL_TYPE (s) = mdebug_type_void;
3345
                  SYMBOL_VALUE (s) = (long) e;
3346
                  e->pdr.framereg = -1;
3347
                  add_symbol_to_list (s, &local_symbols);
3348
                }
3349
            }
3350
          else if (sh.st == stLabel)
3351
            {
3352
              if (sh.index == indexNil)
3353
                {
3354
                  /* This is what the gcc2_compiled and __gnu_compiled_*
3355
                     show up as.  So don't complain.  */
3356
                  ;
3357
                }
3358
              else
3359
                {
3360
                  /* Handle encoded stab line number. */
3361
                  valu += ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (pst->objfile));
3362
                  record_line (current_subfile, sh.index, valu);
3363
                }
3364
            }
3365
          else if (sh.st == stProc || sh.st == stStaticProc
3366
                   || sh.st == stStatic || sh.st == stEnd)
3367
            /* These are generated by gcc-2.x, do not complain */
3368
            ;
3369
          else
3370
            complain (&stab_unknown_complaint, name);
3371
        }
3372
      st = end_symtab (pst->texthigh, pst->objfile, SECT_OFF_TEXT (pst->objfile));
3373
      end_stabs ();
3374
 
3375
      /* Sort the symbol table now, we are done adding symbols to it.
3376
         We must do this before parse_procedure calls lookup_symbol.  */
3377
      sort_symtab_syms (st);
3378
 
3379
      /* There used to be a call to sort_blocks here, but this should not
3380
         be necessary for stabs symtabs.  And as sort_blocks modifies the
3381
         start address of the GLOBAL_BLOCK to the FIRST_LOCAL_BLOCK,
3382
         it did the wrong thing if the first procedure in a file was
3383
         generated via asm statements.  */
3384
 
3385
      /* Fill in procedure info next.  */
3386
      if (fh->cpd > 0)
3387
        {
3388
          PDR *pr_block;
3389
          struct cleanup *old_chain;
3390
          char *pdr_ptr;
3391
          char *pdr_end;
3392
          PDR *pdr_in;
3393
          PDR *pdr_in_end;
3394
 
3395
          pr_block = (PDR *) xmalloc (fh->cpd * sizeof (PDR));
3396
          old_chain = make_cleanup (xfree, pr_block);
3397
 
3398
          pdr_ptr = ((char *) debug_info->external_pdr
3399
                     + fh->ipdFirst * external_pdr_size);
3400
          pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
3401
          pdr_in = pr_block;
3402
          for (;
3403
               pdr_ptr < pdr_end;
3404
               pdr_ptr += external_pdr_size, pdr_in++)
3405
            {
3406
              (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
3407
 
3408
              /* Determine lowest PDR address, the PDRs are not always
3409
                 sorted.  */
3410
              if (pdr_in == pr_block)
3411
                lowest_pdr_addr = pdr_in->adr;
3412
              else if (pdr_in->adr < lowest_pdr_addr)
3413
                lowest_pdr_addr = pdr_in->adr;
3414
            }
3415
 
3416
          pdr_in = pr_block;
3417
          pdr_in_end = pdr_in + fh->cpd;
3418
          for (; pdr_in < pdr_in_end; pdr_in++)
3419
            parse_procedure (pdr_in, st, pst);
3420
 
3421
          do_cleanups (old_chain);
3422
        }
3423
    }
3424
  else
3425
    {
3426
      /* This symbol table contains ordinary ecoff entries.  */
3427
 
3428
      int f_max;
3429
      int maxlines;
3430
      EXTR *ext_ptr;
3431
 
3432
      /* How many symbols will we need */
3433
      /* FIXME, this does not count enum values. */
3434
      f_max = pst->n_global_syms + pst->n_static_syms;
3435
      if (fh == 0)
3436
        {
3437
          maxlines = 0;
3438
          st = new_symtab ("unknown", f_max, 0, pst->objfile);
3439
        }
3440
      else
3441
        {
3442
          f_max += fh->csym + fh->cpd;
3443
          maxlines = 2 * fh->cline;
3444
          st = new_symtab (pst->filename, 2 * f_max, maxlines, pst->objfile);
3445
 
3446
          /* The proper language was already determined when building
3447
             the psymtab, use it.  */
3448
          st->language = PST_PRIVATE (pst)->pst_language;
3449
        }
3450
 
3451
      psymtab_language = st->language;
3452
 
3453
      lines = LINETABLE (st);
3454
 
3455
      /* Get a new lexical context */
3456
 
3457
      push_parse_stack ();
3458
      top_stack->cur_st = st;
3459
      top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (st),
3460
                                                STATIC_BLOCK);
3461
      BLOCK_START (top_stack->cur_block) = pst->textlow;
3462
      BLOCK_END (top_stack->cur_block) = 0;
3463
      top_stack->blocktype = stFile;
3464
      top_stack->maxsyms = 2 * f_max;
3465
      top_stack->cur_type = 0;
3466
      top_stack->procadr = 0;
3467
      top_stack->numargs = 0;
3468
      found_ecoff_debugging_info = 0;
3469
 
3470
      if (fh)
3471
        {
3472
          char *sym_ptr;
3473
          char *sym_end;
3474
 
3475
          /* Parse local symbols first */
3476
          sym_ptr = ((char *) debug_info->external_sym
3477
                     + fh->isymBase * external_sym_size);
3478
          sym_end = sym_ptr + fh->csym * external_sym_size;
3479
          while (sym_ptr < sym_end)
3480
            {
3481
              SYMR sh;
3482
              int c;
3483
 
3484
              (*swap_sym_in) (cur_bfd, sym_ptr, &sh);
3485
              c = parse_symbol (&sh,
3486
                                debug_info->external_aux + fh->iauxBase,
3487
                                sym_ptr, fh->fBigendian, pst->section_offsets, pst->objfile);
3488
              sym_ptr += c * external_sym_size;
3489
            }
3490
 
3491
          /* Linenumbers.  At the end, check if we can save memory.
3492
             parse_lines has to look ahead an arbitrary number of PDR
3493
             structures, so we swap them all first.  */
3494
          if (fh->cpd > 0)
3495
            {
3496
              PDR *pr_block;
3497
              struct cleanup *old_chain;
3498
              char *pdr_ptr;
3499
              char *pdr_end;
3500
              PDR *pdr_in;
3501
              PDR *pdr_in_end;
3502
 
3503
              pr_block = (PDR *) xmalloc (fh->cpd * sizeof (PDR));
3504
 
3505
              old_chain = make_cleanup (xfree, pr_block);
3506
 
3507
              pdr_ptr = ((char *) debug_info->external_pdr
3508
                         + fh->ipdFirst * external_pdr_size);
3509
              pdr_end = pdr_ptr + fh->cpd * external_pdr_size;
3510
              pdr_in = pr_block;
3511
              for (;
3512
                   pdr_ptr < pdr_end;
3513
                   pdr_ptr += external_pdr_size, pdr_in++)
3514
                {
3515
                  (*swap_pdr_in) (cur_bfd, pdr_ptr, pdr_in);
3516
 
3517
                  /* Determine lowest PDR address, the PDRs are not always
3518
                     sorted.  */
3519
                  if (pdr_in == pr_block)
3520
                    lowest_pdr_addr = pdr_in->adr;
3521
                  else if (pdr_in->adr < lowest_pdr_addr)
3522
                    lowest_pdr_addr = pdr_in->adr;
3523
                }
3524
 
3525
              parse_lines (fh, pr_block, lines, maxlines, pst, lowest_pdr_addr);
3526
              if (lines->nitems < fh->cline)
3527
                lines = shrink_linetable (lines);
3528
 
3529
              /* Fill in procedure info next.  */
3530
              pdr_in = pr_block;
3531
              pdr_in_end = pdr_in + fh->cpd;
3532
              for (; pdr_in < pdr_in_end; pdr_in++)
3533
                parse_procedure (pdr_in, 0, pst);
3534
 
3535
              do_cleanups (old_chain);
3536
            }
3537
        }
3538
 
3539
      LINETABLE (st) = lines;
3540
 
3541
      /* .. and our share of externals.
3542
         XXX use the global list to speed up things here. how?
3543
         FIXME, Maybe quit once we have found the right number of ext's? */
3544
      top_stack->cur_st = st;
3545
      top_stack->cur_block = BLOCKVECTOR_BLOCK (BLOCKVECTOR (top_stack->cur_st),
3546
                                                GLOBAL_BLOCK);
3547
      top_stack->blocktype = stFile;
3548
      top_stack->maxsyms
3549
        = (debug_info->symbolic_header.isymMax
3550
           + debug_info->symbolic_header.ipdMax
3551
           + debug_info->symbolic_header.iextMax);
3552
 
3553
      ext_ptr = PST_PRIVATE (pst)->extern_tab;
3554
      for (i = PST_PRIVATE (pst)->extern_count; --i >= 0; ext_ptr++)
3555
        parse_external (ext_ptr, fh->fBigendian, pst->section_offsets, pst->objfile);
3556
 
3557
      /* If there are undefined symbols, tell the user.
3558
         The alpha has an undefined symbol for every symbol that is
3559
         from a shared library, so tell the user only if verbose is on.  */
3560
      if (info_verbose && n_undef_symbols)
3561
        {
3562
          printf_filtered ("File %s contains %d unresolved references:",
3563
                           st->filename, n_undef_symbols);
3564
          printf_filtered ("\n\t%4d variables\n\t%4d procedures\n\t%4d labels\n",
3565
                           n_undef_vars, n_undef_procs, n_undef_labels);
3566
          n_undef_symbols = n_undef_labels = n_undef_vars = n_undef_procs = 0;
3567
 
3568
        }
3569
      pop_parse_stack ();
3570
 
3571
      st->primary = 1;
3572
 
3573
      /* Sort the symbol table now, we are done adding symbols to it. */
3574
      sort_symtab_syms (st);
3575
 
3576
      sort_blocks (st);
3577
    }
3578
 
3579
  /* Now link the psymtab and the symtab.  */
3580
  pst->symtab = st;
3581
 
3582
  current_objfile = NULL;
3583
}
3584
 
3585
/* Ancillary parsing procedures. */
3586
 
3587
/* Return 1 if the symbol pointed to by SH has a cross reference
3588
   to an opaque aggregate type, else 0.  */
3589
 
3590
static int
3591
has_opaque_xref (FDR *fh, SYMR *sh)
3592
{
3593
  TIR tir;
3594
  union aux_ext *ax;
3595
  RNDXR rn[1];
3596
  unsigned int rf;
3597
 
3598
  if (sh->index == indexNil)
3599
    return 0;
3600
 
3601
  ax = debug_info->external_aux + fh->iauxBase + sh->index;
3602
  (*debug_swap->swap_tir_in) (fh->fBigendian, &ax->a_ti, &tir);
3603
  if (tir.bt != btStruct && tir.bt != btUnion && tir.bt != btEnum)
3604
    return 0;
3605
 
3606
  ax++;
3607
  (*debug_swap->swap_rndx_in) (fh->fBigendian, &ax->a_rndx, rn);
3608
  if (rn->rfd == 0xfff)
3609
    rf = AUX_GET_ISYM (fh->fBigendian, ax + 1);
3610
  else
3611
    rf = rn->rfd;
3612
  if (rf != -1)
3613
    return 0;
3614
  return 1;
3615
}
3616
 
3617
/* Lookup the type at relative index RN.  Return it in TPP
3618
   if found and in any event come up with its name PNAME.
3619
   BIGEND says whether aux symbols are big-endian or not (from fh->fBigendian).
3620
   Return value says how many aux symbols we ate. */
3621
 
3622
static int
3623
cross_ref (int fd, union aux_ext *ax, struct type **tpp, enum type_code type_code,      /* Use to alloc new type if none is found. */
3624
           char **pname, int bigend, char *sym_name)
3625
{
3626
  RNDXR rn[1];
3627
  unsigned int rf;
3628
  int result = 1;
3629
  FDR *fh;
3630
  char *esh;
3631
  SYMR sh;
3632
  int xref_fd;
3633
  struct mdebug_pending *pend;
3634
 
3635
  *tpp = (struct type *) NULL;
3636
 
3637
  (*debug_swap->swap_rndx_in) (bigend, &ax->a_rndx, rn);
3638
 
3639
  /* Escape index means 'the next one' */
3640
  if (rn->rfd == 0xfff)
3641
    {
3642
      result++;
3643
      rf = AUX_GET_ISYM (bigend, ax + 1);
3644
    }
3645
  else
3646
    {
3647
      rf = rn->rfd;
3648
    }
3649
 
3650
  /* mips cc uses a rf of -1 for opaque struct definitions.
3651
     Set TYPE_FLAG_STUB for these types so that check_typedef will
3652
     resolve them if the struct gets defined in another compilation unit.  */
3653
  if (rf == -1)
3654
    {
3655
      *pname = "<undefined>";
3656
      *tpp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
3657
      TYPE_FLAGS (*tpp) |= TYPE_FLAG_STUB;
3658
      return result;
3659
    }
3660
 
3661
  /* mips cc uses an escaped rn->index of 0 for struct return types
3662
     of procedures that were compiled without -g. These will always remain
3663
     undefined.  */
3664
  if (rn->rfd == 0xfff && rn->index == 0)
3665
    {
3666
      *pname = "<undefined>";
3667
      return result;
3668
    }
3669
 
3670
  /* Find the relative file descriptor and the symbol in it.  */
3671
  fh = get_rfd (fd, rf);
3672
  xref_fd = fh - debug_info->fdr;
3673
 
3674
  if (rn->index >= fh->csym)
3675
    {
3676
      /* File indirect entry is corrupt.  */
3677
      *pname = "<illegal>";
3678
      complain (&bad_rfd_entry_complaint,
3679
                sym_name, xref_fd, rn->index);
3680
      return result;
3681
    }
3682
 
3683
  /* If we have processed this symbol then we left a forwarding
3684
     pointer to the type in the pending list.  If not, we`ll put
3685
     it in a list of pending types, to be processed later when
3686
     the file will be.  In any event, we collect the name for the
3687
     type here.  */
3688
 
3689
  esh = ((char *) debug_info->external_sym
3690
         + ((fh->isymBase + rn->index)
3691
            * debug_swap->external_sym_size));
3692
  (*debug_swap->swap_sym_in) (cur_bfd, esh, &sh);
3693
 
3694
  /* Make sure that this type of cross reference can be handled.  */
3695
  if ((sh.sc != scInfo
3696
       || (sh.st != stBlock && sh.st != stTypedef && sh.st != stIndirect
3697
           && sh.st != stStruct && sh.st != stUnion
3698
           && sh.st != stEnum))
3699
      && (sh.st != stBlock || !SC_IS_COMMON (sh.sc)))
3700
    {
3701
      /* File indirect entry is corrupt.  */
3702
      *pname = "<illegal>";
3703
      complain (&bad_rfd_entry_complaint,
3704
                sym_name, xref_fd, rn->index);
3705
      return result;
3706
    }
3707
 
3708
  *pname = debug_info->ss + fh->issBase + sh.iss;
3709
 
3710
  pend = is_pending_symbol (fh, esh);
3711
  if (pend)
3712
    *tpp = pend->t;
3713
  else
3714
    {
3715
      /* We have not yet seen this type.  */
3716
 
3717
      if ((sh.iss == 0 && sh.st == stTypedef) || sh.st == stIndirect)
3718
        {
3719
          TIR tir;
3720
 
3721
          /* alpha cc puts out a stTypedef with a sh.iss of zero for
3722
             two cases:
3723
             a) forward declarations of structs/unions/enums which are not
3724
             defined in this compilation unit.
3725
             For these the type will be void. This is a bad design decision
3726
             as cross referencing across compilation units is impossible
3727
             due to the missing name.
3728
             b) forward declarations of structs/unions/enums/typedefs which
3729
             are defined later in this file or in another file in the same
3730
             compilation unit. Irix5 cc uses a stIndirect symbol for this.
3731
             Simply cross reference those again to get the true type.
3732
             The forward references are not entered in the pending list and
3733
             in the symbol table.  */
3734
 
3735
          (*debug_swap->swap_tir_in) (bigend,
3736
                                      &(debug_info->external_aux
3737
                                        + fh->iauxBase + sh.index)->a_ti,
3738
                                      &tir);
3739
          if (tir.tq0 != tqNil)
3740
            complain (&illegal_forward_tq0_complaint, sym_name);
3741
          switch (tir.bt)
3742
            {
3743
            case btVoid:
3744
              *tpp = init_type (type_code, 0, 0, (char *) NULL,
3745
                                current_objfile);
3746
              *pname = "<undefined>";
3747
              break;
3748
 
3749
            case btStruct:
3750
            case btUnion:
3751
            case btEnum:
3752
              cross_ref (xref_fd,
3753
                         (debug_info->external_aux
3754
                          + fh->iauxBase + sh.index + 1),
3755
                         tpp, type_code, pname,
3756
                         fh->fBigendian, sym_name);
3757
              break;
3758
 
3759
            case btTypedef:
3760
              /* Follow a forward typedef. This might recursively
3761
                 call cross_ref till we get a non typedef'ed type.
3762
                 FIXME: This is not correct behaviour, but gdb currently
3763
                 cannot handle typedefs without type copying. Type
3764
                 copying is impossible as we might have mutual forward
3765
                 references between two files and the copied type would not
3766
                 get filled in when we later parse its definition.  */
3767
              *tpp = parse_type (xref_fd,
3768
                                 debug_info->external_aux + fh->iauxBase,
3769
                                 sh.index,
3770
                                 (int *) NULL,
3771
                                 fh->fBigendian,
3772
                                 debug_info->ss + fh->issBase + sh.iss);
3773
              add_pending (fh, esh, *tpp);
3774
              break;
3775
 
3776
            default:
3777
              complain (&illegal_forward_bt_complaint, tir.bt, sym_name);
3778
              *tpp = init_type (type_code, 0, 0, (char *) NULL,
3779
                                current_objfile);
3780
              break;
3781
            }
3782
          return result;
3783
        }
3784
      else if (sh.st == stTypedef)
3785
        {
3786
          /* Parse the type for a normal typedef. This might recursively call
3787
             cross_ref till we get a non typedef'ed type.
3788
             FIXME: This is not correct behaviour, but gdb currently
3789
             cannot handle typedefs without type copying. But type copying is
3790
             impossible as we might have mutual forward references between
3791
             two files and the copied type would not get filled in when
3792
             we later parse its definition.   */
3793
          *tpp = parse_type (xref_fd,
3794
                             debug_info->external_aux + fh->iauxBase,
3795
                             sh.index,
3796
                             (int *) NULL,
3797
                             fh->fBigendian,
3798
                             debug_info->ss + fh->issBase + sh.iss);
3799
        }
3800
      else
3801
        {
3802
          /* Cross reference to a struct/union/enum which is defined
3803
             in another file in the same compilation unit but that file
3804
             has not been parsed yet.
3805
             Initialize the type only, it will be filled in when
3806
             it's definition is parsed.  */
3807
          *tpp = init_type (type_code, 0, 0, (char *) NULL, current_objfile);
3808
        }
3809
      add_pending (fh, esh, *tpp);
3810
    }
3811
 
3812
  /* We used one auxent normally, two if we got a "next one" rf. */
3813
  return result;
3814
}
3815
 
3816
 
3817
/* Quick&dirty lookup procedure, to avoid the MI ones that require
3818
   keeping the symtab sorted */
3819
 
3820
static struct symbol *
3821
mylookup_symbol (char *name, register struct block *block,
3822
                 namespace_enum namespace, enum address_class class)
3823
{
3824
  register int bot, top, inc;
3825
  register struct symbol *sym;
3826
 
3827
  bot = 0;
3828
  top = BLOCK_NSYMS (block);
3829
  inc = name[0];
3830
  while (bot < top)
3831
    {
3832
      sym = BLOCK_SYM (block, bot);
3833
      if (SYMBOL_NAME (sym)[0] == inc
3834
          && SYMBOL_NAMESPACE (sym) == namespace
3835
          && SYMBOL_CLASS (sym) == class
3836
          && strcmp (SYMBOL_NAME (sym), name) == 0)
3837
        return sym;
3838
      bot++;
3839
    }
3840
  block = BLOCK_SUPERBLOCK (block);
3841
  if (block)
3842
    return mylookup_symbol (name, block, namespace, class);
3843
  return 0;
3844
}
3845
 
3846
 
3847
/* Add a new symbol S to a block B.
3848
   Infrequently, we will need to reallocate the block to make it bigger.
3849
   We only detect this case when adding to top_stack->cur_block, since
3850
   that's the only time we know how big the block is.  FIXME.  */
3851
 
3852
static void
3853
add_symbol (struct symbol *s, struct block *b)
3854
{
3855
  int nsyms = BLOCK_NSYMS (b)++;
3856
  struct block *origb;
3857
  struct parse_stack *stackp;
3858
 
3859
  if (b == top_stack->cur_block &&
3860
      nsyms >= top_stack->maxsyms)
3861
    {
3862
      complain (&block_overflow_complaint, SYMBOL_NAME (s));
3863
      /* In this case shrink_block is actually grow_block, since
3864
         BLOCK_NSYMS(b) is larger than its current size.  */
3865
      origb = b;
3866
      b = shrink_block (top_stack->cur_block, top_stack->cur_st);
3867
 
3868
      /* Now run through the stack replacing pointers to the
3869
         original block.  shrink_block has already done this
3870
         for the blockvector and BLOCK_FUNCTION.  */
3871
      for (stackp = top_stack; stackp; stackp = stackp->next)
3872
        {
3873
          if (stackp->cur_block == origb)
3874
            {
3875
              stackp->cur_block = b;
3876
              stackp->maxsyms = BLOCK_NSYMS (b);
3877
            }
3878
        }
3879
    }
3880
  BLOCK_SYM (b, nsyms) = s;
3881
}
3882
 
3883
/* Add a new block B to a symtab S */
3884
 
3885
static void
3886
add_block (struct block *b, struct symtab *s)
3887
{
3888
  struct blockvector *bv = BLOCKVECTOR (s);
3889
 
3890
  bv = (struct blockvector *) xrealloc ((PTR) bv,
3891
                                        (sizeof (struct blockvector)
3892
                                         + BLOCKVECTOR_NBLOCKS (bv)
3893
                                         * sizeof (bv->block)));
3894
  if (bv != BLOCKVECTOR (s))
3895
    BLOCKVECTOR (s) = bv;
3896
 
3897
  BLOCKVECTOR_BLOCK (bv, BLOCKVECTOR_NBLOCKS (bv)++) = b;
3898
}
3899
 
3900
/* Add a new linenumber entry (LINENO,ADR) to a linevector LT.
3901
   MIPS' linenumber encoding might need more than one byte
3902
   to describe it, LAST is used to detect these continuation lines.
3903
 
3904
   Combining lines with the same line number seems like a bad idea.
3905
   E.g: There could be a line number entry with the same line number after the
3906
   prologue and GDB should not ignore it (this is a better way to find
3907
   a prologue than mips_skip_prologue).
3908
   But due to the compressed line table format there are line number entries
3909
   for the same line which are needed to bridge the gap to the next
3910
   line number entry. These entries have a bogus address info with them
3911
   and we are unable to tell them from intended duplicate line number
3912
   entries.
3913
   This is another reason why -ggdb debugging format is preferable.  */
3914
 
3915
static int
3916
add_line (struct linetable *lt, int lineno, CORE_ADDR adr, int last)
3917
{
3918
  /* DEC c89 sometimes produces zero linenos which confuse gdb.
3919
     Change them to something sensible. */
3920
  if (lineno == 0)
3921
    lineno = 1;
3922
  if (last == 0)
3923
    last = -2;                  /* make sure we record first line */
3924
 
3925
  if (last == lineno)           /* skip continuation lines */
3926
    return lineno;
3927
 
3928
  lt->item[lt->nitems].line = lineno;
3929
  lt->item[lt->nitems++].pc = adr << 2;
3930
  return lineno;
3931
}
3932
 
3933
/* Sorting and reordering procedures */
3934
 
3935
/* Blocks with a smaller low bound should come first */
3936
 
3937
static int
3938
compare_blocks (const PTR arg1, const PTR arg2)
3939
{
3940
  register int addr_diff;
3941
  struct block **b1 = (struct block **) arg1;
3942
  struct block **b2 = (struct block **) arg2;
3943
 
3944
  addr_diff = (BLOCK_START ((*b1))) - (BLOCK_START ((*b2)));
3945
  if (addr_diff == 0)
3946
    return (BLOCK_END ((*b2))) - (BLOCK_END ((*b1)));
3947
  return addr_diff;
3948
}
3949
 
3950
/* Sort the blocks of a symtab S.
3951
   Reorder the blocks in the blockvector by code-address,
3952
   as required by some MI search routines */
3953
 
3954
static void
3955
sort_blocks (struct symtab *s)
3956
{
3957
  struct blockvector *bv = BLOCKVECTOR (s);
3958
 
3959
  if (BLOCKVECTOR_NBLOCKS (bv) <= 2)
3960
    {
3961
      /* Cosmetic */
3962
      if (BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) == 0)
3963
        BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) = 0;
3964
      if (BLOCK_END (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) == 0)
3965
        BLOCK_START (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) = 0;
3966
      return;
3967
    }
3968
  /*
3969
   * This is very unfortunate: normally all functions are compiled in
3970
   * the order they are found, but if the file is compiled -O3 things
3971
   * are very different.  It would be nice to find a reliable test
3972
   * to detect -O3 images in advance.
3973
   */
3974
  if (BLOCKVECTOR_NBLOCKS (bv) > 3)
3975
    qsort (&BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK),
3976
           BLOCKVECTOR_NBLOCKS (bv) - FIRST_LOCAL_BLOCK,
3977
           sizeof (struct block *),
3978
           compare_blocks);
3979
 
3980
  {
3981
    register CORE_ADDR high = 0;
3982
    register int i, j = BLOCKVECTOR_NBLOCKS (bv);
3983
 
3984
    for (i = FIRST_LOCAL_BLOCK; i < j; i++)
3985
      if (high < BLOCK_END (BLOCKVECTOR_BLOCK (bv, i)))
3986
        high = BLOCK_END (BLOCKVECTOR_BLOCK (bv, i));
3987
    BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) = high;
3988
  }
3989
 
3990
  BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK)) =
3991
    BLOCK_START (BLOCKVECTOR_BLOCK (bv, FIRST_LOCAL_BLOCK));
3992
 
3993
  BLOCK_START (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) =
3994
    BLOCK_START (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
3995
  BLOCK_END (BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK)) =
3996
    BLOCK_END (BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK));
3997
}
3998
 
3999
 
4000
/* Constructor/restructor/destructor procedures */
4001
 
4002
/* Allocate a new symtab for NAME.  Needs an estimate of how many symbols
4003
   MAXSYMS and linenumbers MAXLINES we'll put in it */
4004
 
4005
static struct symtab *
4006
new_symtab (char *name, int maxsyms, int maxlines, struct objfile *objfile)
4007
{
4008
  struct symtab *s = allocate_symtab (name, objfile);
4009
 
4010
  LINETABLE (s) = new_linetable (maxlines);
4011
 
4012
  /* All symtabs must have at least two blocks */
4013
  BLOCKVECTOR (s) = new_bvect (2);
4014
  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK) = new_block (maxsyms);
4015
  BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK) = new_block (maxsyms);
4016
  BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK)) =
4017
    BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK);
4018
 
4019
  s->free_code = free_linetable;
4020
  s->debugformat = obsavestring ("ECOFF", 5,
4021
                                 &objfile->symbol_obstack);
4022
  return (s);
4023
}
4024
 
4025
/* Allocate a new partial_symtab NAME */
4026
 
4027
static struct partial_symtab *
4028
new_psymtab (char *name, struct objfile *objfile)
4029
{
4030
  struct partial_symtab *psymtab;
4031
 
4032
  psymtab = allocate_psymtab (name, objfile);
4033
  psymtab->section_offsets = objfile->section_offsets;
4034
 
4035
  /* Keep a backpointer to the file's symbols */
4036
 
4037
  psymtab->read_symtab_private = ((char *)
4038
                                  obstack_alloc (&objfile->psymbol_obstack,
4039
                                                 sizeof (struct symloc)));
4040
  memset ((PTR) psymtab->read_symtab_private, 0, sizeof (struct symloc));
4041
  CUR_BFD (psymtab) = cur_bfd;
4042
  DEBUG_SWAP (psymtab) = debug_swap;
4043
  DEBUG_INFO (psymtab) = debug_info;
4044
  PENDING_LIST (psymtab) = pending_list;
4045
 
4046
  /* The way to turn this into a symtab is to call... */
4047
  psymtab->read_symtab = mdebug_psymtab_to_symtab;
4048
  return (psymtab);
4049
}
4050
 
4051
 
4052
/* Allocate a linetable array of the given SIZE.  Since the struct
4053
   already includes one item, we subtract one when calculating the
4054
   proper size to allocate.  */
4055
 
4056
static struct linetable *
4057
new_linetable (int size)
4058
{
4059
  struct linetable *l;
4060
 
4061
  size = (size - 1) * sizeof (l->item) + sizeof (struct linetable);
4062
  l = (struct linetable *) xmalloc (size);
4063
  l->nitems = 0;
4064
  return l;
4065
}
4066
 
4067
/* Oops, too big. Shrink it.  This was important with the 2.4 linetables,
4068
   I am not so sure about the 3.4 ones.
4069
 
4070
   Since the struct linetable already includes one item, we subtract one when
4071
   calculating the proper size to allocate.  */
4072
 
4073
static struct linetable *
4074
shrink_linetable (struct linetable *lt)
4075
{
4076
 
4077
  return (struct linetable *) xrealloc ((PTR) lt,
4078
                                        (sizeof (struct linetable)
4079
                                         + ((lt->nitems - 1)
4080
                                            * sizeof (lt->item))));
4081
}
4082
 
4083
/* Allocate and zero a new blockvector of NBLOCKS blocks. */
4084
 
4085
static struct blockvector *
4086
new_bvect (int nblocks)
4087
{
4088
  struct blockvector *bv;
4089
  int size;
4090
 
4091
  size = sizeof (struct blockvector) + nblocks * sizeof (struct block *);
4092
  bv = (struct blockvector *) xzalloc (size);
4093
 
4094
  BLOCKVECTOR_NBLOCKS (bv) = nblocks;
4095
 
4096
  return bv;
4097
}
4098
 
4099
/* Allocate and zero a new block of MAXSYMS symbols */
4100
 
4101
static struct block *
4102
new_block (int maxsyms)
4103
{
4104
  int size = sizeof (struct block) + (maxsyms - 1) * sizeof (struct symbol *);
4105
 
4106
  return (struct block *) xzalloc (size);
4107
}
4108
 
4109
/* Ooops, too big. Shrink block B in symtab S to its minimal size.
4110
   Shrink_block can also be used by add_symbol to grow a block.  */
4111
 
4112
static struct block *
4113
shrink_block (struct block *b, struct symtab *s)
4114
{
4115
  struct block *new;
4116
  struct blockvector *bv = BLOCKVECTOR (s);
4117
  int i;
4118
 
4119
  /* Just reallocate it and fix references to the old one */
4120
 
4121
  new = (struct block *) xrealloc ((PTR) b,
4122
                                   (sizeof (struct block)
4123
                                    + ((BLOCK_NSYMS (b) - 1)
4124
                                       * sizeof (struct symbol *))));
4125
 
4126
  /* Should chase pointers to old one.  Fortunately, that`s just
4127
     the block`s function and inferior blocks */
4128
  if (BLOCK_FUNCTION (new) && SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) == b)
4129
    SYMBOL_BLOCK_VALUE (BLOCK_FUNCTION (new)) = new;
4130
  for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); i++)
4131
    if (BLOCKVECTOR_BLOCK (bv, i) == b)
4132
      BLOCKVECTOR_BLOCK (bv, i) = new;
4133
    else if (BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) == b)
4134
      BLOCK_SUPERBLOCK (BLOCKVECTOR_BLOCK (bv, i)) = new;
4135
  return new;
4136
}
4137
 
4138
/* Create a new symbol with printname NAME */
4139
 
4140
static struct symbol *
4141
new_symbol (char *name)
4142
{
4143
  struct symbol *s = ((struct symbol *)
4144
                      obstack_alloc (&current_objfile->symbol_obstack,
4145
                                     sizeof (struct symbol)));
4146
 
4147
  memset ((PTR) s, 0, sizeof (*s));
4148
  SYMBOL_NAME (s) = obsavestring (name, strlen (name),
4149
                                  &current_objfile->symbol_obstack);
4150
  SYMBOL_LANGUAGE (s) = psymtab_language;
4151
  SYMBOL_INIT_DEMANGLED_NAME (s, &current_objfile->symbol_obstack);
4152
  return s;
4153
}
4154
 
4155
/* Create a new type with printname NAME */
4156
 
4157
static struct type *
4158
new_type (char *name)
4159
{
4160
  struct type *t;
4161
 
4162
  t = alloc_type (current_objfile);
4163
  TYPE_NAME (t) = name;
4164
  TYPE_CPLUS_SPECIFIC (t) = (struct cplus_struct_type *) &cplus_struct_default;
4165
  return t;
4166
}
4167
 
4168
/* Read ECOFF debugging information from a BFD section.  This is
4169
   called from elfread.c.  It parses the section into a
4170
   ecoff_debug_info struct, and then lets the rest of the file handle
4171
   it as normal.  */
4172
 
4173
void
4174
elfmdebug_build_psymtabs (struct objfile *objfile,
4175
                          const struct ecoff_debug_swap *swap, asection *sec)
4176
{
4177
  bfd *abfd = objfile->obfd;
4178
  struct ecoff_debug_info *info;
4179
 
4180
  info = ((struct ecoff_debug_info *)
4181
          obstack_alloc (&objfile->psymbol_obstack,
4182
                         sizeof (struct ecoff_debug_info)));
4183
 
4184
  if (!(*swap->read_debug_info) (abfd, sec, info))
4185
    error ("Error reading ECOFF debugging information: %s",
4186
           bfd_errmsg (bfd_get_error ()));
4187
 
4188
  mdebug_build_psymtabs (objfile, swap, info);
4189
}
4190
 
4191
 
4192
/* Things used for calling functions in the inferior.
4193
   These functions are exported to our companion
4194
   mips-tdep.c file and are here because they play
4195
   with the symbol-table explicitly. */
4196
 
4197
/* Sigtramp: make sure we have all the necessary information
4198
   about the signal trampoline code. Since the official code
4199
   from MIPS does not do so, we make up that information ourselves.
4200
   If they fix the library (unlikely) this code will neutralize itself. */
4201
 
4202
/* FIXME: This function is called only by mips-tdep.c.  It needs to be
4203
   here because it calls functions defined in this file, but perhaps
4204
   this could be handled in a better way.  Only compile it in when
4205
   tm-mips.h is included. */
4206
 
4207
#ifdef TM_MIPS_H
4208
 
4209
void
4210
fixup_sigtramp (void)
4211
{
4212
  struct symbol *s;
4213
  struct symtab *st;
4214
  struct block *b, *b0 = NULL;
4215
 
4216
  sigtramp_address = -1;
4217
 
4218
  /* We have to handle the following cases here:
4219
     a) The Mips library has a sigtramp label within sigvec.
4220
     b) Irix has a _sigtramp which we want to use, but it also has sigvec.  */
4221
  s = lookup_symbol ("sigvec", 0, VAR_NAMESPACE, 0, NULL);
4222
  if (s != 0)
4223
    {
4224
      b0 = SYMBOL_BLOCK_VALUE (s);
4225
      s = lookup_symbol ("sigtramp", b0, VAR_NAMESPACE, 0, NULL);
4226
    }
4227
  if (s == 0)
4228
    {
4229
      /* No sigvec or no sigtramp inside sigvec, try _sigtramp.  */
4230
      s = lookup_symbol ("_sigtramp", 0, VAR_NAMESPACE, 0, NULL);
4231
    }
4232
 
4233
  /* But maybe this program uses its own version of sigvec */
4234
  if (s == 0)
4235
    return;
4236
 
4237
  /* Did we or MIPSco fix the library ? */
4238
  if (SYMBOL_CLASS (s) == LOC_BLOCK)
4239
    {
4240
      sigtramp_address = BLOCK_START (SYMBOL_BLOCK_VALUE (s));
4241
      sigtramp_end = BLOCK_END (SYMBOL_BLOCK_VALUE (s));
4242
      return;
4243
    }
4244
 
4245
  sigtramp_address = SYMBOL_VALUE (s);
4246
  sigtramp_end = sigtramp_address + 0x88;       /* black magic */
4247
 
4248
  /* But what symtab does it live in ? */
4249
  st = find_pc_symtab (SYMBOL_VALUE (s));
4250
 
4251
  /*
4252
   * Ok, there goes the fix: turn it into a procedure, with all the
4253
   * needed info.  Note we make it a nested procedure of sigvec,
4254
   * which is the way the (assembly) code is actually written.
4255
   */
4256
  SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
4257
  SYMBOL_CLASS (s) = LOC_BLOCK;
4258
  SYMBOL_TYPE (s) = init_type (TYPE_CODE_FUNC, 4, 0, (char *) NULL,
4259
                               st->objfile);
4260
  TYPE_TARGET_TYPE (SYMBOL_TYPE (s)) = mdebug_type_void;
4261
 
4262
  /* Need a block to allocate MIPS_EFI_SYMBOL_NAME in */
4263
  b = new_block (1);
4264
  SYMBOL_BLOCK_VALUE (s) = b;
4265
  BLOCK_START (b) = sigtramp_address;
4266
  BLOCK_END (b) = sigtramp_end;
4267
  BLOCK_FUNCTION (b) = s;
4268
  BLOCK_SUPERBLOCK (b) = BLOCK_SUPERBLOCK (b0);
4269
  add_block (b, st);
4270
  sort_blocks (st);
4271
 
4272
  /* Make a MIPS_EFI_SYMBOL_NAME entry for it */
4273
  {
4274
    struct mips_extra_func_info *e =
4275
    ((struct mips_extra_func_info *)
4276
     xzalloc (sizeof (struct mips_extra_func_info)));
4277
 
4278
    e->numargs = 0;              /* the kernel thinks otherwise */
4279
    e->pdr.frameoffset = 32;
4280
    e->pdr.framereg = SP_REGNUM;
4281
    /* Note that setting pcreg is no longer strictly necessary as
4282
       mips_frame_saved_pc is now aware of signal handler frames.  */
4283
    e->pdr.pcreg = PC_REGNUM;
4284
    e->pdr.regmask = -2;
4285
    /* Offset to saved r31, in the sigtramp case the saved registers
4286
       are above the frame in the sigcontext.
4287
       We have 4 alignment bytes, 12 bytes for onstack, mask and pc,
4288
       32 * 4 bytes for the general registers, 12 bytes for mdhi, mdlo, ownedfp
4289
       and 32 * 4 bytes for the floating point registers.  */
4290
    e->pdr.regoffset = 4 + 12 + 31 * 4;
4291
    e->pdr.fregmask = -1;
4292
    /* Offset to saved f30 (first saved *double* register).  */
4293
    e->pdr.fregoffset = 4 + 12 + 32 * 4 + 12 + 30 * 4;
4294
    e->pdr.isym = (long) s;
4295
    e->pdr.adr = sigtramp_address;
4296
 
4297
    current_objfile = st->objfile;      /* Keep new_symbol happy */
4298
    s = new_symbol (MIPS_EFI_SYMBOL_NAME);
4299
    SYMBOL_VALUE (s) = (long) e;
4300
    SYMBOL_NAMESPACE (s) = LABEL_NAMESPACE;
4301
    SYMBOL_CLASS (s) = LOC_CONST;
4302
    SYMBOL_TYPE (s) = mdebug_type_void;
4303
    current_objfile = NULL;
4304
  }
4305
 
4306
  BLOCK_SYM (b, BLOCK_NSYMS (b)++) = s;
4307
}
4308
 
4309
#endif /* TM_MIPS_H */
4310
 
4311
void
4312
_initialize_mdebugread (void)
4313
{
4314
  mdebug_type_void =
4315
    init_type (TYPE_CODE_VOID, 1,
4316
               0,
4317
               "void", (struct objfile *) NULL);
4318
  mdebug_type_char =
4319
    init_type (TYPE_CODE_INT, 1,
4320
               0,
4321
               "char", (struct objfile *) NULL);
4322
  mdebug_type_unsigned_char =
4323
    init_type (TYPE_CODE_INT, 1,
4324
               TYPE_FLAG_UNSIGNED,
4325
               "unsigned char", (struct objfile *) NULL);
4326
  mdebug_type_short =
4327
    init_type (TYPE_CODE_INT, 2,
4328
               0,
4329
               "short", (struct objfile *) NULL);
4330
  mdebug_type_unsigned_short =
4331
    init_type (TYPE_CODE_INT, 2,
4332
               TYPE_FLAG_UNSIGNED,
4333
               "unsigned short", (struct objfile *) NULL);
4334
  mdebug_type_int_32 =
4335
    init_type (TYPE_CODE_INT, 4,
4336
               0,
4337
               "int", (struct objfile *) NULL);
4338
  mdebug_type_unsigned_int_32 =
4339
    init_type (TYPE_CODE_INT, 4,
4340
               TYPE_FLAG_UNSIGNED,
4341
               "unsigned int", (struct objfile *) NULL);
4342
  mdebug_type_int_64 =
4343
    init_type (TYPE_CODE_INT, 8,
4344
               0,
4345
               "int", (struct objfile *) NULL);
4346
  mdebug_type_unsigned_int_64 =
4347
    init_type (TYPE_CODE_INT, 8,
4348
               TYPE_FLAG_UNSIGNED,
4349
               "unsigned int", (struct objfile *) NULL);
4350
  mdebug_type_long_32 =
4351
    init_type (TYPE_CODE_INT, 4,
4352
               0,
4353
               "long", (struct objfile *) NULL);
4354
  mdebug_type_unsigned_long_32 =
4355
    init_type (TYPE_CODE_INT, 4,
4356
               TYPE_FLAG_UNSIGNED,
4357
               "unsigned long", (struct objfile *) NULL);
4358
  mdebug_type_long_64 =
4359
    init_type (TYPE_CODE_INT, 8,
4360
               0,
4361
               "long", (struct objfile *) NULL);
4362
  mdebug_type_unsigned_long_64 =
4363
    init_type (TYPE_CODE_INT, 8,
4364
               TYPE_FLAG_UNSIGNED,
4365
               "unsigned long", (struct objfile *) NULL);
4366
  mdebug_type_long_long_64 =
4367
    init_type (TYPE_CODE_INT, 8,
4368
               0,
4369
               "long long", (struct objfile *) NULL);
4370
  mdebug_type_unsigned_long_long_64 =
4371
    init_type (TYPE_CODE_INT, 8,
4372
               TYPE_FLAG_UNSIGNED,
4373
               "unsigned long long", (struct objfile *) NULL);
4374
  mdebug_type_adr_32 =
4375
    init_type (TYPE_CODE_PTR, 4,
4376
               TYPE_FLAG_UNSIGNED,
4377
               "adr_32", (struct objfile *) NULL);
4378
  TYPE_TARGET_TYPE (mdebug_type_adr_32) = mdebug_type_void;
4379
  mdebug_type_adr_64 =
4380
    init_type (TYPE_CODE_PTR, 8,
4381
               TYPE_FLAG_UNSIGNED,
4382
               "adr_64", (struct objfile *) NULL);
4383
  TYPE_TARGET_TYPE (mdebug_type_adr_64) = mdebug_type_void;
4384
  mdebug_type_float =
4385
    init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
4386
               0,
4387
               "float", (struct objfile *) NULL);
4388
  mdebug_type_double =
4389
    init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
4390
               0,
4391
               "double", (struct objfile *) NULL);
4392
  mdebug_type_complex =
4393
    init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
4394
               0,
4395
               "complex", (struct objfile *) NULL);
4396
  TYPE_TARGET_TYPE (mdebug_type_complex) = mdebug_type_float;
4397
  mdebug_type_double_complex =
4398
    init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
4399
               0,
4400
               "double complex", (struct objfile *) NULL);
4401
  TYPE_TARGET_TYPE (mdebug_type_double_complex) = mdebug_type_double;
4402
 
4403
  /* Is a "string" the way btString means it the same as TYPE_CODE_STRING?
4404
     FIXME.  */
4405
  mdebug_type_string =
4406
    init_type (TYPE_CODE_STRING,
4407
               TARGET_CHAR_BIT / TARGET_CHAR_BIT,
4408
               0, "string",
4409
               (struct objfile *) NULL);
4410
 
4411
  /* We use TYPE_CODE_INT to print these as integers.  Does this do any
4412
     good?  Would we be better off with TYPE_CODE_ERROR?  Should
4413
     TYPE_CODE_ERROR print things in hex if it knows the size?  */
4414
  mdebug_type_fixed_dec =
4415
    init_type (TYPE_CODE_INT,
4416
               TARGET_INT_BIT / TARGET_CHAR_BIT,
4417
               0, "fixed decimal",
4418
               (struct objfile *) NULL);
4419
 
4420
  mdebug_type_float_dec =
4421
    init_type (TYPE_CODE_ERROR,
4422
               TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
4423
               0, "floating decimal",
4424
               (struct objfile *) NULL);
4425
 
4426
  nodebug_func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0,
4427
                                        "<function, no debug info>", NULL);
4428
  TYPE_TARGET_TYPE (nodebug_func_symbol_type) = mdebug_type_int;
4429
  nodebug_var_symbol_type =
4430
    init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0,
4431
               "<variable, no debug info>", NULL);
4432
}

powered by: WebSVN 2.1.0

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