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

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [xcoffread.c] - Blame information for rev 1768

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

Line No. Rev Author Line
1 578 markom
/* Read AIX xcoff symbol tables and convert to internal format, for GDB.
2
   Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3
   1996, 1997, 1998, 1999, 2000
4
   Free Software Foundation, Inc.
5
   Derived from coffread.c, dbxread.c, and a lot of hacking.
6
   Contributed by IBM Corporation.
7
 
8
   This file is part of GDB.
9
 
10
   This program is free software; you can redistribute it and/or modify
11
   it under the terms of the GNU General Public License as published by
12
   the Free Software Foundation; either version 2 of the License, or
13
   (at your option) any later version.
14
 
15
   This program is distributed in the hope that it will be useful,
16
   but WITHOUT ANY WARRANTY; without even the implied warranty of
17
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
   GNU General Public License for more details.
19
 
20
   You should have received a copy of the GNU General Public License
21
   along with this program; if not, write to the Free Software
22
   Foundation, Inc., 59 Temple Place - Suite 330,
23
   Boston, MA 02111-1307, USA.  */
24
 
25
#include "defs.h"
26
#include "bfd.h"
27
 
28
#include <sys/types.h>
29
#include <fcntl.h>
30
#include <ctype.h>
31
#include "gdb_string.h"
32
 
33
#include <sys/param.h>
34
#ifndef NO_SYS_FILE
35
#include <sys/file.h>
36
#endif
37
#include "gdb_stat.h"
38
 
39
#include "coff/internal.h"
40
#include "libcoff.h"            /* FIXME, internal data from BFD */
41
#include "coff/rs6000.h"
42
 
43
#include "symtab.h"
44
#include "gdbtypes.h"
45
#include "symfile.h"
46
#include "objfiles.h"
47
#include "buildsym.h"
48
#include "stabsread.h"
49
#include "expression.h"
50
#include "language.h"           /* Needed inside partial-stab.h */
51
#include "complaints.h"
52
 
53
#include "gdb-stabs.h"
54
 
55
/* For interface with stabsread.c.  */
56
#include "aout/stab_gnu.h"
57
 
58
/* For interface with partial-stab.h.  */
59
#define N_UNDF  0                /* Undefined symbol */
60
#undef N_ABS
61
#define N_ABS 2
62
#define N_TEXT  4               /* Text sym -- defined at offset in text seg */
63
#define N_DATA  6               /* Data sym -- defined at offset in data seg */
64
#define N_BSS   8               /* BSS  sym -- defined at offset in zero'd seg */
65
#define N_COMM  0x12            /* Common symbol (visible after shared lib dynlink) */
66
#define N_FN    0x1f            /* File name of .o file */
67
#define N_FN_SEQ 0x0C           /* N_FN from Sequent compilers (sigh) */
68
/* Note: N_EXT can only be usefully OR-ed with N_UNDF, N_ABS, N_TEXT,
69
   N_DATA, or N_BSS.  When the low-order bit of other types is set,
70
   (e.g. N_WARNING versus N_FN), they are two different types.  */
71
#define N_EXT   1               /* External symbol (as opposed to local-to-this-file) */
72
#define N_INDR 0x0a
73
 
74
/* The following symbols refer to set elements.
75
   All the N_SET[ATDB] symbols with the same name form one set.
76
   Space is allocated for the set in the text section, and each set
77
   elements value is stored into one word of the space.
78
   The first word of the space is the length of the set (number of elements).
79
 
80
   The address of the set is made into an N_SETV symbol
81
   whose name is the same as the name of the set.
82
   This symbol acts like a N_DATA global symbol
83
   in that it can satisfy undefined external references.  */
84
 
85
/* These appear as input to LD, in a .o file.  */
86
#define N_SETA  0x14            /* Absolute set element symbol */
87
#define N_SETT  0x16            /* Text set element symbol */
88
#define N_SETD  0x18            /* Data set element symbol */
89
#define N_SETB  0x1A            /* Bss set element symbol */
90
 
91
/* This is output from LD.  */
92
#define N_SETV  0x1C            /* Pointer to set vector in data area.  */
93
 
94
/* We put a pointer to this structure in the read_symtab_private field
95
   of the psymtab.  */
96
 
97
struct symloc
98
  {
99
 
100
    /* First symbol number for this file.  */
101
 
102
    int first_symnum;
103
 
104
    /* Number of symbols in the section of the symbol table devoted to
105
       this file's symbols (actually, the section bracketed may contain
106
       more than just this file's symbols).  If numsyms is 0, the only
107
       reason for this thing's existence is the dependency list.  Nothing
108
       else will happen when it is read in.  */
109
 
110
    int numsyms;
111
 
112
    /* Position of the start of the line number information for this psymtab.  */
113
    unsigned int lineno_off;
114
  };
115
 
116
/* Remember what we deduced to be the source language of this psymtab. */
117
 
118
static enum language psymtab_language = language_unknown;
119
 
120
 
121
/* Simplified internal version of coff symbol table information */
122
 
123
struct coff_symbol
124
  {
125
    char *c_name;
126
    int c_symnum;               /* symbol number of this entry */
127
    int c_naux;                 /* 0 if syment only, 1 if syment + auxent */
128
    long c_value;
129
    unsigned char c_sclass;
130
    int c_secnum;
131
    unsigned int c_type;
132
  };
133
 
134
/* last function's saved coff symbol `cs' */
135
 
136
static struct coff_symbol fcn_cs_saved;
137
 
138
static bfd *symfile_bfd;
139
 
140
/* Core address of start and end of text of current source file.
141
   This is calculated from the first function seen after a C_FILE
142
   symbol. */
143
 
144
 
145
static CORE_ADDR cur_src_end_addr;
146
 
147
/* Core address of the end of the first object file.  */
148
 
149
static CORE_ADDR first_object_file_end;
150
 
151
/* initial symbol-table-debug-string vector length */
152
 
153
#define INITIAL_STABVECTOR_LENGTH       40
154
 
155
/* Nonzero if within a function (so symbols should be local,
156
   if nothing says specifically).  */
157
 
158
int within_function;
159
 
160
/* Size of a COFF symbol.  I think it is always 18, so I'm not sure
161
   there is any reason not to just use a #define, but might as well
162
   ask BFD for the size and store it here, I guess.  */
163
 
164
static unsigned local_symesz;
165
 
166
struct coff_symfile_info
167
  {
168
    file_ptr min_lineno_offset; /* Where in file lowest line#s are */
169
    file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
170
 
171
    /* Pointer to the string table.  */
172
    char *strtbl;
173
 
174
    /* Pointer to debug section.  */
175
    char *debugsec;
176
 
177
    /* Pointer to the a.out symbol table.  */
178
    char *symtbl;
179
 
180
    /* Number of symbols in symtbl.  */
181
    int symtbl_num_syms;
182
 
183
    /* Offset in data section to TOC anchor.  */
184
    CORE_ADDR toc_offset;
185
  };
186
 
187
static struct complaint storclass_complaint =
188
{"Unexpected storage class: %d", 0, 0};
189
 
190
static struct complaint bf_notfound_complaint =
191
{"line numbers off, `.bf' symbol not found", 0, 0};
192
 
193
static struct complaint ef_complaint =
194
{"Mismatched .ef symbol ignored starting at symnum %d", 0, 0};
195
 
196
static struct complaint eb_complaint =
197
{"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
198
 
199
static void xcoff_initial_scan (struct objfile *, int);
200
 
201
static void scan_xcoff_symtab (struct objfile *);
202
 
203
static char *xcoff_next_symbol_text (struct objfile *);
204
 
205
static void record_include_begin (struct coff_symbol *);
206
 
207
static void
208
enter_line_range (struct subfile *, unsigned, unsigned,
209
                  CORE_ADDR, CORE_ADDR, unsigned *);
210
 
211
static void init_stringtab (bfd *, file_ptr, struct objfile *);
212
 
213
static void xcoff_symfile_init (struct objfile *);
214
 
215
static void xcoff_new_init (struct objfile *);
216
 
217
static void xcoff_symfile_finish (struct objfile *);
218
 
219
static void
220
xcoff_symfile_offsets (struct objfile *, struct section_addr_info *addrs);
221
 
222
static void find_linenos (bfd *, sec_ptr, PTR);
223
 
224
static char *coff_getfilename (union internal_auxent *, struct objfile *);
225
 
226
static void read_symbol (struct internal_syment *, int);
227
 
228
static int read_symbol_lineno (int);
229
 
230
static CORE_ADDR read_symbol_nvalue (int);
231
 
232
static struct symbol *process_xcoff_symbol (struct coff_symbol *,
233
                                            struct objfile *);
234
 
235
static void read_xcoff_symtab (struct partial_symtab *);
236
 
237
#if 0
238
static void add_stab_to_list (char *, struct pending_stabs **);
239
#endif
240
 
241
static int compare_lte (const void *, const void *);
242
 
243
static struct linetable *arrange_linetable (struct linetable *);
244
 
245
static void record_include_end (struct coff_symbol *);
246
 
247
static void process_linenos (CORE_ADDR, CORE_ADDR);
248
 
249
 
250
/* Translate from a COFF section number (target_index) to a SECT_OFF_*
251
   code.  */
252
static int secnum_to_section (int, struct objfile *);
253
static asection *secnum_to_bfd_section (int, struct objfile *);
254
 
255
struct find_targ_sec_arg
256
  {
257
    int targ_index;
258
    int *resultp;
259
    asection **bfd_sect;
260
    struct objfile *objfile;
261
  };
262
 
263
static void find_targ_sec (bfd *, asection *, void *);
264
 
265
static void
266
find_targ_sec (bfd *abfd, asection *sect, PTR obj)
267
{
268
  struct find_targ_sec_arg *args = (struct find_targ_sec_arg *) obj;
269
  struct objfile *objfile = args->objfile;
270
  if (sect->target_index == args->targ_index)
271
    {
272
      /* This is the section.  Figure out what SECT_OFF_* code it is.  */
273
      if (bfd_get_section_flags (abfd, sect) & SEC_CODE)
274
        *args->resultp = SECT_OFF_TEXT (objfile);
275
      else if (bfd_get_section_flags (abfd, sect) & SEC_LOAD)
276
        *args->resultp = SECT_OFF_DATA (objfile);
277
      else
278
        *args->resultp = sect->index;
279
      *args->bfd_sect = sect;
280
    }
281
}
282
 
283
/* Return the section number (SECT_OFF_*) that CS points to.  */
284
static int
285
secnum_to_section (int secnum, struct objfile *objfile)
286
{
287
  int off = SECT_OFF_TEXT (objfile);
288
  asection *sect = NULL;
289
  struct find_targ_sec_arg args;
290
  args.targ_index = secnum;
291
  args.resultp = &off;
292
  args.bfd_sect = &sect;
293
  args.objfile = objfile;
294
  bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
295
  return off;
296
}
297
 
298
/* Return the BFD section that CS points to.  */
299
static asection *
300
secnum_to_bfd_section (int secnum, struct objfile *objfile)
301
{
302
  int off = SECT_OFF_TEXT (objfile);
303
  asection *sect = NULL;
304
  struct find_targ_sec_arg args;
305
  args.targ_index = secnum;
306
  args.resultp = &off;
307
  args.bfd_sect = &sect;
308
  args.objfile = objfile;
309
  bfd_map_over_sections (objfile->obfd, find_targ_sec, &args);
310
  return sect;
311
}
312
 
313
/* add a given stab string into given stab vector. */
314
 
315
#if 0
316
 
317
static void
318
add_stab_to_list (char *stabname, struct pending_stabs **stabvector)
319
{
320
  if (*stabvector == NULL)
321
    {
322
      *stabvector = (struct pending_stabs *)
323
        xmalloc (sizeof (struct pending_stabs) +
324
                 INITIAL_STABVECTOR_LENGTH * sizeof (char *));
325
      (*stabvector)->count = 0;
326
      (*stabvector)->length = INITIAL_STABVECTOR_LENGTH;
327
    }
328
  else if ((*stabvector)->count >= (*stabvector)->length)
329
    {
330
      (*stabvector)->length += INITIAL_STABVECTOR_LENGTH;
331
      *stabvector = (struct pending_stabs *)
332
        xrealloc ((char *) *stabvector, sizeof (struct pending_stabs) +
333
                    (*stabvector)->length * sizeof (char *));
334
    }
335
  (*stabvector)->stab[(*stabvector)->count++] = stabname;
336
}
337
 
338
#endif
339
/* *INDENT-OFF* */
340
/* Linenos are processed on a file-by-file basis.
341
 
342
   Two reasons:
343
 
344
   1) xlc (IBM's native c compiler) postpones static function code
345
   emission to the end of a compilation unit. This way it can
346
   determine if those functions (statics) are needed or not, and
347
   can do some garbage collection (I think). This makes line
348
   numbers and corresponding addresses unordered, and we end up
349
   with a line table like:
350
 
351
 
352
   lineno       addr
353
   foo()          10    0x100
354
   20   0x200
355
   30   0x300
356
 
357
   foo3()         70    0x400
358
   80   0x500
359
   90   0x600
360
 
361
   static foo2()
362
   40   0x700
363
   50   0x800
364
   60   0x900
365
 
366
   and that breaks gdb's binary search on line numbers, if the
367
   above table is not sorted on line numbers. And that sort
368
   should be on function based, since gcc can emit line numbers
369
   like:
370
 
371
   10   0x100   - for the init/test part of a for stmt.
372
   20   0x200
373
   30   0x300
374
   10   0x400   - for the increment part of a for stmt.
375
 
376
   arrange_linetable() will do this sorting.
377
 
378
   2)   aix symbol table might look like:
379
 
380
   c_file               // beginning of a new file
381
   .bi          // beginning of include file
382
   .ei          // end of include file
383
   .bi
384
   .ei
385
 
386
   basically, .bi/.ei pairs do not necessarily encapsulate
387
   their scope. They need to be recorded, and processed later
388
   on when we come the end of the compilation unit.
389
   Include table (inclTable) and process_linenos() handle
390
   that.  */
391
/* *INDENT-ON* */
392
 
393
 
394
 
395
/* compare line table entry addresses. */
396
 
397
static int
398
compare_lte (const void *lte1p, const void *lte2p)
399
{
400
  struct linetable_entry *lte1 = (struct linetable_entry *) lte1p;
401
  struct linetable_entry *lte2 = (struct linetable_entry *) lte2p;
402
  return lte1->pc - lte2->pc;
403
}
404
 
405
/* Given a line table with function entries are marked, arrange its functions
406
   in ascending order and strip off function entry markers and return it in
407
   a newly created table. If the old one is good enough, return the old one. */
408
/* FIXME: I think all this stuff can be replaced by just passing
409
   sort_linevec = 1 to end_symtab.  */
410
 
411
static struct linetable *
412
arrange_linetable (struct linetable *oldLineTb)
413
{
414
  int ii, jj, newline,          /* new line count */
415
    function_count;             /* # of functions */
416
 
417
  struct linetable_entry *fentry;       /* function entry vector */
418
  int fentry_size;              /* # of function entries */
419
  struct linetable *newLineTb;  /* new line table */
420
 
421
#define NUM_OF_FUNCTIONS 20
422
 
423
  fentry_size = NUM_OF_FUNCTIONS;
424
  fentry = (struct linetable_entry *)
425
    xmalloc (fentry_size * sizeof (struct linetable_entry));
426
 
427
  for (function_count = 0, ii = 0; ii < oldLineTb->nitems; ++ii)
428
    {
429
 
430
      if (oldLineTb->item[ii].line == 0)
431
        {                       /* function entry found. */
432
 
433
          if (function_count >= fentry_size)
434
            {                   /* make sure you have room. */
435
              fentry_size *= 2;
436
              fentry = (struct linetable_entry *)
437
                xrealloc (fentry, fentry_size * sizeof (struct linetable_entry));
438
            }
439
          fentry[function_count].line = ii;
440
          fentry[function_count].pc = oldLineTb->item[ii].pc;
441
          ++function_count;
442
        }
443
    }
444
 
445
  if (function_count == 0)
446
    {
447
      xfree (fentry);
448
      return oldLineTb;
449
    }
450
  else if (function_count > 1)
451
    qsort (fentry, function_count, sizeof (struct linetable_entry), compare_lte);
452
 
453
  /* allocate a new line table. */
454
  newLineTb = (struct linetable *)
455
    xmalloc
456
    (sizeof (struct linetable) +
457
    (oldLineTb->nitems - function_count) * sizeof (struct linetable_entry));
458
 
459
  /* if line table does not start with a function beginning, copy up until
460
     a function begin. */
461
 
462
  newline = 0;
463
  if (oldLineTb->item[0].line != 0)
464
    for (newline = 0;
465
    newline < oldLineTb->nitems && oldLineTb->item[newline].line; ++newline)
466
      newLineTb->item[newline] = oldLineTb->item[newline];
467
 
468
  /* Now copy function lines one by one. */
469
 
470
  for (ii = 0; ii < function_count; ++ii)
471
    {
472
      for (jj = fentry[ii].line + 1;
473
           jj < oldLineTb->nitems && oldLineTb->item[jj].line != 0;
474
           ++jj, ++newline)
475
        newLineTb->item[newline] = oldLineTb->item[jj];
476
    }
477
  xfree (fentry);
478
  newLineTb->nitems = oldLineTb->nitems - function_count;
479
  return newLineTb;
480
}
481
 
482
/* include file support: C_BINCL/C_EINCL pairs will be kept in the
483
   following `IncludeChain'. At the end of each symtab (end_symtab),
484
   we will determine if we should create additional symtab's to
485
   represent if (the include files. */
486
 
487
 
488
typedef struct _inclTable
489
{
490
  char *name;                   /* include filename */
491
 
492
  /* Offsets to the line table.  end points to the last entry which is
493
     part of this include file.  */
494
  int begin, end;
495
 
496
  struct subfile *subfile;
497
  unsigned funStartLine;        /* start line # of its function */
498
}
499
InclTable;
500
 
501
#define INITIAL_INCLUDE_TABLE_LENGTH    20
502
static InclTable *inclTable;    /* global include table */
503
static int inclIndx;            /* last entry to table */
504
static int inclLength;          /* table length */
505
static int inclDepth;           /* nested include depth */
506
 
507
static void allocate_include_entry (void);
508
 
509
static void
510
record_include_begin (struct coff_symbol *cs)
511
{
512
  if (inclDepth)
513
    {
514
      /* In xcoff, we assume include files cannot be nested (not in .c files
515
         of course, but in corresponding .s files.).  */
516
 
517
      /* This can happen with old versions of GCC.
518
         GCC 2.3.3-930426 does not exhibit this on a test case which
519
         a user said produced the message for him.  */
520
      static struct complaint msg =
521
      {"Nested C_BINCL symbols", 0, 0};
522
      complain (&msg);
523
    }
524
  ++inclDepth;
525
 
526
  allocate_include_entry ();
527
 
528
  inclTable[inclIndx].name = cs->c_name;
529
  inclTable[inclIndx].begin = cs->c_value;
530
}
531
 
532
static void
533
record_include_end (struct coff_symbol *cs)
534
{
535
  InclTable *pTbl;
536
 
537
  if (inclDepth == 0)
538
    {
539
      static struct complaint msg =
540
      {"Mismatched C_BINCL/C_EINCL pair", 0, 0};
541
      complain (&msg);
542
    }
543
 
544
  allocate_include_entry ();
545
 
546
  pTbl = &inclTable[inclIndx];
547
  pTbl->end = cs->c_value;
548
 
549
  --inclDepth;
550
  ++inclIndx;
551
}
552
 
553
static void
554
allocate_include_entry (void)
555
{
556
  if (inclTable == NULL)
557
    {
558
      inclTable = (InclTable *)
559
        xmalloc (sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
560
      memset (inclTable,
561
              '\0', sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
562
      inclLength = INITIAL_INCLUDE_TABLE_LENGTH;
563
      inclIndx = 0;
564
    }
565
  else if (inclIndx >= inclLength)
566
    {
567
      inclLength += INITIAL_INCLUDE_TABLE_LENGTH;
568
      inclTable = (InclTable *)
569
        xrealloc (inclTable, sizeof (InclTable) * inclLength);
570
      memset (inclTable + inclLength - INITIAL_INCLUDE_TABLE_LENGTH,
571
              '\0', sizeof (InclTable) * INITIAL_INCLUDE_TABLE_LENGTH);
572
    }
573
}
574
 
575
/* Global variable to pass the psymtab down to all the routines involved
576
   in psymtab to symtab processing.  */
577
static struct partial_symtab *this_symtab_psymtab;
578
 
579
/* given the start and end addresses of a compilation unit (or a csect,
580
   at times) process its lines and create appropriate line vectors. */
581
 
582
static void
583
process_linenos (CORE_ADDR start, CORE_ADDR end)
584
{
585
  int offset, ii;
586
  file_ptr max_offset =
587
  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
588
  ->max_lineno_offset;
589
 
590
  /* subfile structure for the main compilation unit.  */
591
  struct subfile main_subfile;
592
 
593
  /* In the main source file, any time we see a function entry, we
594
     reset this variable to function's absolute starting line number.
595
     All the following line numbers in the function are relative to
596
     this, and we record absolute line numbers in record_line().  */
597
 
598
  unsigned int main_source_baseline = 0;
599
 
600
  unsigned *firstLine;
601
 
602
  offset =
603
    ((struct symloc *) this_symtab_psymtab->read_symtab_private)->lineno_off;
604
  if (offset == 0)
605
    goto return_after_cleanup;
606
 
607
  memset (&main_subfile, '\0', sizeof (main_subfile));
608
 
609
  if (inclIndx == 0)
610
    /* All source lines were in the main source file. None in include files. */
611
 
612
    enter_line_range (&main_subfile, offset, 0, start, end,
613
                      &main_source_baseline);
614
 
615
  else
616
    {
617
      /* There was source with line numbers in include files.  */
618
 
619
      int linesz =
620
        coff_data (this_symtab_psymtab->objfile->obfd)->local_linesz;
621
      main_source_baseline = 0;
622
 
623
      for (ii = 0; ii < inclIndx; ++ii)
624
        {
625
          struct subfile *tmpSubfile;
626
 
627
          /* If there is main file source before include file, enter it.  */
628
          if (offset < inclTable[ii].begin)
629
            {
630
              enter_line_range
631
                (&main_subfile, offset, inclTable[ii].begin - linesz,
632
                 start, 0, &main_source_baseline);
633
            }
634
 
635
          /* Have a new subfile for the include file.  */
636
 
637
          tmpSubfile = inclTable[ii].subfile =
638
            (struct subfile *) xmalloc (sizeof (struct subfile));
639
 
640
          memset (tmpSubfile, '\0', sizeof (struct subfile));
641
          firstLine = &(inclTable[ii].funStartLine);
642
 
643
          /* Enter include file's lines now.  */
644
          enter_line_range (tmpSubfile, inclTable[ii].begin,
645
                            inclTable[ii].end, start, 0, firstLine);
646
 
647
          if (offset <= inclTable[ii].end)
648
            offset = inclTable[ii].end + linesz;
649
        }
650
 
651
      /* All the include files' line have been processed at this point.  Now,
652
         enter remaining lines of the main file, if any left.  */
653
      if (offset < max_offset + 1 - linesz)
654
        {
655
          enter_line_range (&main_subfile, offset, 0, start, end,
656
                            &main_source_baseline);
657
        }
658
    }
659
 
660
  /* Process main file's line numbers.  */
661
  if (main_subfile.line_vector)
662
    {
663
      struct linetable *lineTb, *lv;
664
 
665
      lv = main_subfile.line_vector;
666
 
667
      /* Line numbers are not necessarily ordered. xlc compilation will
668
         put static function to the end. */
669
 
670
      lineTb = arrange_linetable (lv);
671
      if (lv == lineTb)
672
        {
673
          current_subfile->line_vector = (struct linetable *)
674
            xrealloc (lv, (sizeof (struct linetable)
675
                           + lv->nitems * sizeof (struct linetable_entry)));
676
        }
677
      else
678
        {
679
          xfree (lv);
680
          current_subfile->line_vector = lineTb;
681
        }
682
 
683
      current_subfile->line_vector_length =
684
        current_subfile->line_vector->nitems;
685
    }
686
 
687
  /* Now, process included files' line numbers.  */
688
 
689
  for (ii = 0; ii < inclIndx; ++ii)
690
    {
691
      if ((inclTable[ii].subfile)->line_vector)         /* Useless if!!! FIXMEmgo */
692
        {
693
          struct linetable *lineTb, *lv;
694
 
695
          lv = (inclTable[ii].subfile)->line_vector;
696
 
697
          /* Line numbers are not necessarily ordered. xlc compilation will
698
             put static function to the end. */
699
 
700
          lineTb = arrange_linetable (lv);
701
 
702
          push_subfile ();
703
 
704
          /* For the same include file, we might want to have more than one
705
             subfile.  This happens if we have something like:
706
 
707
             ......
708
             #include "foo.h"
709
             ......
710
             #include "foo.h"
711
             ......
712
 
713
             while foo.h including code in it. (stupid but possible)
714
             Since start_subfile() looks at the name and uses an
715
             existing one if finds, we need to provide a fake name and
716
             fool it.  */
717
 
718
#if 0
719
          start_subfile (inclTable[ii].name, (char *) 0);
720
#else
721
          {
722
            /* Pick a fake name that will produce the same results as this
723
               one when passed to deduce_language_from_filename.  Kludge on
724
               top of kludge.  */
725
            char *fakename = strrchr (inclTable[ii].name, '.');
726
            if (fakename == NULL)
727
              fakename = " ?";
728
            start_subfile (fakename, (char *) 0);
729
            xfree (current_subfile->name);
730
          }
731
          current_subfile->name = xstrdup (inclTable[ii].name);
732
#endif
733
 
734
          if (lv == lineTb)
735
            {
736
              current_subfile->line_vector =
737
                (struct linetable *) xrealloc
738
                (lv, (sizeof (struct linetable)
739
                      + lv->nitems * sizeof (struct linetable_entry)));
740
 
741
            }
742
          else
743
            {
744
              xfree (lv);
745
              current_subfile->line_vector = lineTb;
746
            }
747
 
748
          current_subfile->line_vector_length =
749
            current_subfile->line_vector->nitems;
750
          start_subfile (pop_subfile (), (char *) 0);
751
        }
752
    }
753
 
754
return_after_cleanup:
755
 
756
  /* We don't want to keep alloc/free'ing the global include file table.  */
757
  inclIndx = 0;
758
 
759
  /* Start with a fresh subfile structure for the next file.  */
760
  memset (&main_subfile, '\0', sizeof (struct subfile));
761
}
762
 
763
void
764
aix_process_linenos (void)
765
{
766
  /* process line numbers and enter them into line vector */
767
  process_linenos (last_source_start_addr, cur_src_end_addr);
768
}
769
 
770
 
771
/* Enter a given range of lines into the line vector.
772
   can be called in the following two ways:
773
   enter_line_range (subfile, beginoffset, endoffset, startaddr, 0, firstLine)  or
774
   enter_line_range (subfile, beginoffset, 0, startaddr, endaddr, firstLine)
775
 
776
   endoffset points to the last line table entry that we should pay
777
   attention to.  */
778
 
779
static void
780
enter_line_range (struct subfile *subfile, unsigned beginoffset, unsigned endoffset,    /* offsets to line table */
781
                  CORE_ADDR startaddr,  /* offsets to line table */
782
                  CORE_ADDR endaddr, unsigned *firstLine)
783
{
784
  unsigned int curoffset;
785
  CORE_ADDR addr;
786
  void *ext_lnno;
787
  struct internal_lineno int_lnno;
788
  unsigned int limit_offset;
789
  bfd *abfd;
790
  int linesz;
791
 
792
  if (endoffset == 0 && startaddr == 0 && endaddr == 0)
793
    return;
794
  curoffset = beginoffset;
795
  limit_offset =
796
    ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
797
    ->max_lineno_offset;
798
 
799
  if (endoffset != 0)
800
    {
801
      if (endoffset >= limit_offset)
802
        {
803
          static struct complaint msg =
804
          {"Bad line table offset in C_EINCL directive", 0, 0};
805
          complain (&msg);
806
          return;
807
        }
808
      limit_offset = endoffset;
809
    }
810
  else
811
    limit_offset -= 1;
812
 
813
  abfd = this_symtab_psymtab->objfile->obfd;
814
  linesz = coff_data (abfd)->local_linesz;
815
  ext_lnno = alloca (linesz);
816
 
817
  while (curoffset <= limit_offset)
818
    {
819
      bfd_seek (abfd, curoffset, SEEK_SET);
820
      bfd_read (ext_lnno, linesz, 1, abfd);
821
      bfd_coff_swap_lineno_in (abfd, ext_lnno, &int_lnno);
822
 
823
      /* Find the address this line represents.  */
824
      addr = (int_lnno.l_lnno
825
              ? int_lnno.l_addr.l_paddr
826
              : read_symbol_nvalue (int_lnno.l_addr.l_symndx));
827
      addr += ANOFFSET (this_symtab_psymtab->objfile->section_offsets,
828
                        SECT_OFF_TEXT (this_symtab_psymtab->objfile));
829
 
830
      if (addr < startaddr || (endaddr && addr >= endaddr))
831
        return;
832
 
833
      if (int_lnno.l_lnno == 0)
834
        {
835
          *firstLine = read_symbol_lineno (int_lnno.l_addr.l_symndx);
836
          record_line (subfile, 0, addr);
837
          --(*firstLine);
838
        }
839
      else
840
        record_line (subfile, *firstLine + int_lnno.l_lnno, addr);
841
      curoffset += linesz;
842
    }
843
}
844
 
845
 
846
/* Save the vital information for use when closing off the current file.
847
   NAME is the file name the symbols came from, START_ADDR is the first
848
   text address for the file, and SIZE is the number of bytes of text.  */
849
 
850
#define complete_symtab(name, start_addr) {     \
851
  last_source_file = savestring (name, strlen (name));  \
852
  last_source_start_addr = start_addr;                  \
853
}
854
 
855
 
856
/* Refill the symbol table input buffer
857
   and set the variables that control fetching entries from it.
858
   Reports an error if no data available.
859
   This function can read past the end of the symbol table
860
   (into the string table) but this does no harm.  */
861
 
862
/* Reading symbol table has to be fast! Keep the followings as macros, rather
863
   than functions. */
864
 
865
#define RECORD_MINIMAL_SYMBOL(NAME, ADDR, TYPE, SECTION, OBJFILE) \
866
{                                               \
867
  char *namestr;                                \
868
  namestr = (NAME); \
869
  if (namestr[0] == '.') ++namestr; \
870
  prim_record_minimal_symbol_and_info (namestr, (ADDR), (TYPE), \
871
                                       (char *)NULL, (SECTION), (asection *)NULL, (OBJFILE)); \
872
  misc_func_recorded = 1;                                       \
873
}
874
 
875
 
876
/* xcoff has static blocks marked in `.bs', `.es' pairs. They cannot be
877
   nested. At any given time, a symbol can only be in one static block.
878
   This is the base address of current static block, zero if non exists. */
879
 
880
static int static_block_base = 0;
881
 
882
/* Section number for the current static block.  */
883
 
884
static int static_block_section = -1;
885
 
886
/* true if space for symbol name has been allocated. */
887
 
888
static int symname_alloced = 0;
889
 
890
/* Next symbol to read.  Pointer into raw seething symbol table.  */
891
 
892
static char *raw_symbol;
893
 
894
/* This is the function which stabsread.c calls to get symbol
895
   continuations.  */
896
 
897
static char *
898
xcoff_next_symbol_text (struct objfile *objfile)
899
{
900
  struct internal_syment symbol;
901
  static struct complaint msg =
902
  {"Unexpected symbol continuation", 0, 0};
903
  char *retval;
904
  /* FIXME: is this the same as the passed arg? */
905
  objfile = this_symtab_psymtab->objfile;
906
 
907
  bfd_coff_swap_sym_in (objfile->obfd, raw_symbol, &symbol);
908
  if (symbol.n_zeroes)
909
    {
910
      complain (&msg);
911
 
912
      /* Return something which points to '\0' and hope the symbol reading
913
         code does something reasonable.  */
914
      retval = "";
915
    }
916
  else if (symbol.n_sclass & 0x80)
917
    {
918
      retval =
919
        ((struct coff_symfile_info *) objfile->sym_private)->debugsec
920
        + symbol.n_offset;
921
      raw_symbol +=
922
        coff_data (objfile->obfd)->local_symesz;
923
      ++symnum;
924
    }
925
  else
926
    {
927
      complain (&msg);
928
 
929
      /* Return something which points to '\0' and hope the symbol reading
930
         code does something reasonable.  */
931
      retval = "";
932
    }
933
  return retval;
934
}
935
 
936
/* Read symbols for a given partial symbol table.  */
937
 
938
static void
939
read_xcoff_symtab (struct partial_symtab *pst)
940
{
941
  struct objfile *objfile = pst->objfile;
942
  bfd *abfd = objfile->obfd;
943
  char *raw_auxptr;             /* Pointer to first raw aux entry for sym */
944
  char *strtbl = ((struct coff_symfile_info *) objfile->sym_private)->strtbl;
945
  char *debugsec =
946
  ((struct coff_symfile_info *) objfile->sym_private)->debugsec;
947
  char *debugfmt = xcoff_data (abfd)->xcoff64 ? "XCOFF64" : "XCOFF";
948
 
949
  struct internal_syment symbol[1];
950
  union internal_auxent main_aux;
951
  struct coff_symbol cs[1];
952
  CORE_ADDR file_start_addr = 0;
953
  CORE_ADDR file_end_addr = 0;
954
 
955
  int next_file_symnum = -1;
956
  unsigned int max_symnum;
957
  int just_started = 1;
958
  int depth = 0;
959
  int fcn_start_addr = 0;
960
 
961
  struct coff_symbol fcn_stab_saved;
962
 
963
  /* fcn_cs_saved is global because process_xcoff_symbol needs it. */
964
  union internal_auxent fcn_aux_saved;
965
  struct context_stack *new;
966
 
967
  char *filestring = " _start_ ";       /* Name of the current file. */
968
 
969
  char *last_csect_name;        /* last seen csect's name and value */
970
  CORE_ADDR last_csect_val;
971
  int last_csect_sec;
972
 
973
  this_symtab_psymtab = pst;
974
 
975
  /* Get the appropriate COFF "constants" related to the file we're
976
     handling. */
977
  local_symesz = coff_data (abfd)->local_symesz;
978
 
979
  last_source_file = NULL;
980
  last_csect_name = 0;
981
  last_csect_val = 0;
982
 
983
  start_stabs ();
984
  start_symtab (filestring, (char *) NULL, file_start_addr);
985
  record_debugformat (debugfmt);
986
  symnum = ((struct symloc *) pst->read_symtab_private)->first_symnum;
987
  max_symnum =
988
    symnum + ((struct symloc *) pst->read_symtab_private)->numsyms;
989
  first_object_file_end = 0;
990
 
991
  raw_symbol =
992
    ((struct coff_symfile_info *) objfile->sym_private)->symtbl
993
    + symnum * local_symesz;
994
 
995
  while (symnum < max_symnum)
996
    {
997
 
998
      QUIT;                     /* make this command interruptable.  */
999
 
1000
      /* READ_ONE_SYMBOL (symbol, cs, symname_alloced); */
1001
      /* read one symbol into `cs' structure. After processing the
1002
         whole symbol table, only string table will be kept in memory,
1003
         symbol table and debug section of xcoff will be freed. Thus
1004
         we can mark symbols with names in string table as
1005
         `alloced'. */
1006
      {
1007
        int ii;
1008
 
1009
        /* Swap and align the symbol into a reasonable C structure.  */
1010
        bfd_coff_swap_sym_in (abfd, raw_symbol, symbol);
1011
 
1012
        cs->c_symnum = symnum;
1013
        cs->c_naux = symbol->n_numaux;
1014
        if (symbol->n_zeroes)
1015
          {
1016
            symname_alloced = 0;
1017
            /* We must use the original, unswapped, name here so the name field
1018
               pointed to by cs->c_name will persist throughout xcoffread.  If
1019
               we use the new field, it gets overwritten for each symbol.  */
1020
            cs->c_name = ((struct external_syment *) raw_symbol)->e.e_name;
1021
            /* If it's exactly E_SYMNMLEN characters long it isn't
1022
               '\0'-terminated.  */
1023
            if (cs->c_name[E_SYMNMLEN - 1] != '\0')
1024
              {
1025
                char *p;
1026
                p = obstack_alloc (&objfile->symbol_obstack, E_SYMNMLEN + 1);
1027
                strncpy (p, cs->c_name, E_SYMNMLEN);
1028
                p[E_SYMNMLEN] = '\0';
1029
                cs->c_name = p;
1030
                symname_alloced = 1;
1031
              }
1032
          }
1033
        else if (symbol->n_sclass & 0x80)
1034
          {
1035
            cs->c_name = debugsec + symbol->n_offset;
1036
            symname_alloced = 0;
1037
          }
1038
        else
1039
          {
1040
            /* in string table */
1041
            cs->c_name = strtbl + (int) symbol->n_offset;
1042
            symname_alloced = 1;
1043
          }
1044
        cs->c_value = symbol->n_value;
1045
        cs->c_sclass = symbol->n_sclass;
1046
        cs->c_secnum = symbol->n_scnum;
1047
        cs->c_type = (unsigned) symbol->n_type;
1048
 
1049
        raw_symbol += local_symesz;
1050
        ++symnum;
1051
 
1052
        /* Save addr of first aux entry.  */
1053
        raw_auxptr = raw_symbol;
1054
 
1055
        /* Skip all the auxents associated with this symbol.  */
1056
        for (ii = symbol->n_numaux; ii; --ii)
1057
          {
1058
            raw_symbol += coff_data (abfd)->local_auxesz;
1059
            ++symnum;
1060
          }
1061
      }
1062
 
1063
      /* if symbol name starts with ".$" or "$", ignore it. */
1064
      if (cs->c_name[0] == '$'
1065
          || (cs->c_name[1] == '$' && cs->c_name[0] == '.'))
1066
        continue;
1067
 
1068
      if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
1069
        {
1070
          if (last_source_file)
1071
            {
1072
              pst->symtab =
1073
                end_symtab (cur_src_end_addr, objfile, SECT_OFF_TEXT (objfile));
1074
              end_stabs ();
1075
            }
1076
 
1077
          start_stabs ();
1078
          start_symtab ("_globals_", (char *) NULL, (CORE_ADDR) 0);
1079
          record_debugformat (debugfmt);
1080
          cur_src_end_addr = first_object_file_end;
1081
          /* done with all files, everything from here on is globals */
1082
        }
1083
 
1084
      if ((cs->c_sclass == C_EXT || cs->c_sclass == C_HIDEXT)
1085
          && cs->c_naux == 1)
1086
        {
1087
          /* Dealing with a symbol with a csect entry.  */
1088
 
1089
#define CSECT(PP) ((PP)->x_csect)
1090
#define CSECT_LEN(PP) (CSECT(PP).x_scnlen.l)
1091
#define CSECT_ALIGN(PP) (SMTYP_ALIGN(CSECT(PP).x_smtyp))
1092
#define CSECT_SMTYP(PP) (SMTYP_SMTYP(CSECT(PP).x_smtyp))
1093
#define CSECT_SCLAS(PP) (CSECT(PP).x_smclas)
1094
 
1095
          /* Convert the auxent to something we can access.  */
1096
          bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1097
                                0, cs->c_naux, &main_aux);
1098
 
1099
          switch (CSECT_SMTYP (&main_aux))
1100
            {
1101
 
1102
            case XTY_ER:
1103
              /* Ignore all external references.  */
1104
              continue;
1105
 
1106
            case XTY_SD:
1107
              /* A section description.  */
1108
              {
1109
                switch (CSECT_SCLAS (&main_aux))
1110
                  {
1111
 
1112
                  case XMC_PR:
1113
                    {
1114
 
1115
                      /* A program csect is seen.  We have to allocate one
1116
                         symbol table for each program csect.  Normally gdb
1117
                         prefers one symtab for each source file.  In case
1118
                         of AIX, one source file might include more than one
1119
                         [PR] csect, and they don't have to be adjacent in
1120
                         terms of the space they occupy in memory. Thus, one
1121
                         single source file might get fragmented in the
1122
                         memory and gdb's file start and end address
1123
                         approach does not work!  GCC (and I think xlc) seem
1124
                         to put all the code in the unnamed program csect.  */
1125
 
1126
                      if (last_csect_name)
1127
                        {
1128
                          complete_symtab (filestring, file_start_addr);
1129
                          cur_src_end_addr = file_end_addr;
1130
                          end_symtab (file_end_addr, objfile, SECT_OFF_TEXT (objfile));
1131
                          end_stabs ();
1132
                          start_stabs ();
1133
                          /* Give all csects for this source file the same
1134
                             name.  */
1135
                          start_symtab (filestring, NULL, (CORE_ADDR) 0);
1136
                          record_debugformat (debugfmt);
1137
                        }
1138
 
1139
                      /* If this is the very first csect seen,
1140
                         basically `__start'. */
1141
                      if (just_started)
1142
                        {
1143
                          first_object_file_end
1144
                            = cs->c_value + CSECT_LEN (&main_aux);
1145
                          just_started = 0;
1146
                        }
1147
 
1148
                      file_start_addr =
1149
                        cs->c_value + ANOFFSET (objfile->section_offsets,
1150
                                                SECT_OFF_TEXT (objfile));
1151
                      file_end_addr = file_start_addr + CSECT_LEN (&main_aux);
1152
 
1153
                      if (cs->c_name && (cs->c_name[0] == '.'
1154
                                         || cs->c_name[0] == '@'))
1155
                        {
1156
                          last_csect_name = cs->c_name;
1157
                          last_csect_val = cs->c_value;
1158
                          last_csect_sec = secnum_to_section (cs->c_secnum, objfile);
1159
                        }
1160
                    }
1161
                    continue;
1162
 
1163
                    /* All other symbols are put into the minimal symbol
1164
                       table only.  */
1165
 
1166
                  case XMC_RW:
1167
                    continue;
1168
 
1169
                  case XMC_TC0:
1170
                    continue;
1171
 
1172
                  case XMC_TC:
1173
                    continue;
1174
 
1175
                  default:
1176
                    /* Ignore the symbol.  */
1177
                    continue;
1178
                  }
1179
              }
1180
              break;
1181
 
1182
            case XTY_LD:
1183
 
1184
              switch (CSECT_SCLAS (&main_aux))
1185
                {
1186
                case XMC_PR:
1187
                  /* a function entry point. */
1188
                function_entry_point:
1189
 
1190
                  fcn_start_addr = cs->c_value;
1191
 
1192
                  /* save the function header info, which will be used
1193
                     when `.bf' is seen. */
1194
                  fcn_cs_saved = *cs;
1195
                  fcn_aux_saved = main_aux;
1196
                  continue;
1197
 
1198
                case XMC_GL:
1199
                  /* shared library function trampoline code entry point. */
1200
                  continue;
1201
 
1202
                case XMC_DS:
1203
                  /* The symbols often have the same names as debug symbols for
1204
                     functions, and confuse lookup_symbol.  */
1205
                  continue;
1206
 
1207
                default:
1208
                  /* xlc puts each variable in a separate csect, so we get
1209
                     an XTY_SD for each variable.  But gcc puts several
1210
                     variables in a csect, so that each variable only gets
1211
                     an XTY_LD. This will typically be XMC_RW; I suspect
1212
                     XMC_RO and XMC_BS might be possible too.
1213
                     These variables are put in the minimal symbol table
1214
                     only.  */
1215
                  continue;
1216
                }
1217
              break;
1218
 
1219
            case XTY_CM:
1220
              /* Common symbols are put into the minimal symbol table only.  */
1221
              continue;
1222
 
1223
            default:
1224
              break;
1225
            }
1226
        }
1227
 
1228
      /* If explicitly specified as a function, treat is as one.  This check
1229
         evaluates to true for @FIX* bigtoc CSECT symbols, so it must occur
1230
         after the above CSECT check.  */
1231
      if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
1232
        {
1233
          bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1234
                                0, cs->c_naux, &main_aux);
1235
          goto function_entry_point;
1236
        }
1237
 
1238
      switch (cs->c_sclass)
1239
        {
1240
 
1241
        case C_FILE:
1242
 
1243
          /* c_value field contains symnum of next .file entry in table
1244
             or symnum of first global after last .file. */
1245
 
1246
          next_file_symnum = cs->c_value;
1247
 
1248
          /* Complete symbol table for last object file containing
1249
             debugging information. */
1250
 
1251
          /* Whether or not there was a csect in the previous file, we
1252
             have to call `end_stabs' and `start_stabs' to reset
1253
             type_vector, line_vector, etc. structures.  */
1254
 
1255
          complete_symtab (filestring, file_start_addr);
1256
          cur_src_end_addr = file_end_addr;
1257
          end_symtab (file_end_addr, objfile, SECT_OFF_TEXT (objfile));
1258
          end_stabs ();
1259
 
1260
          /* XCOFF, according to the AIX 3.2 documentation, puts the filename
1261
             in cs->c_name.  But xlc 1.3.0.2 has decided to do things the
1262
             standard COFF way and put it in the auxent.  We use the auxent if
1263
             the symbol is ".file" and an auxent exists, otherwise use the symbol
1264
             itself.  Simple enough.  */
1265
          if (!strcmp (cs->c_name, ".file") && cs->c_naux > 0)
1266
            {
1267
              bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1268
                                    0, cs->c_naux, &main_aux);
1269
              filestring = coff_getfilename (&main_aux, objfile);
1270
            }
1271
          else
1272
            filestring = cs->c_name;
1273
 
1274
          start_stabs ();
1275
          start_symtab (filestring, (char *) NULL, (CORE_ADDR) 0);
1276
          record_debugformat (debugfmt);
1277
          last_csect_name = 0;
1278
 
1279
          /* reset file start and end addresses. A compilation unit with no text
1280
             (only data) should have zero file boundaries. */
1281
          file_start_addr = file_end_addr = 0;
1282
          break;
1283
 
1284
        case C_FUN:
1285
          fcn_stab_saved = *cs;
1286
          break;
1287
 
1288
        case C_FCN:
1289
          if (STREQ (cs->c_name, ".bf"))
1290
            {
1291
              CORE_ADDR off = ANOFFSET (objfile->section_offsets,
1292
                                        SECT_OFF_TEXT (objfile));
1293
              bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1294
                                    0, cs->c_naux, &main_aux);
1295
 
1296
              within_function = 1;
1297
 
1298
              new = push_context (0, fcn_start_addr + off);
1299
 
1300
              new->name = define_symbol
1301
                (fcn_cs_saved.c_value + off,
1302
                 fcn_stab_saved.c_name, 0, 0, objfile);
1303
              if (new->name != NULL)
1304
                SYMBOL_SECTION (new->name) = SECT_OFF_TEXT (objfile);
1305
            }
1306
          else if (STREQ (cs->c_name, ".ef"))
1307
            {
1308
 
1309
              bfd_coff_swap_aux_in (abfd, raw_auxptr, cs->c_type, cs->c_sclass,
1310
                                    0, cs->c_naux, &main_aux);
1311
 
1312
              /* The value of .ef is the address of epilogue code;
1313
                 not useful for gdb.  */
1314
              /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1315
                 contains number of lines to '}' */
1316
 
1317
              if (context_stack_depth <= 0)
1318
                {               /* We attempted to pop an empty context stack */
1319
                  complain (&ef_complaint, cs->c_symnum);
1320
                  within_function = 0;
1321
                  break;
1322
                }
1323
              new = pop_context ();
1324
              /* Stack must be empty now.  */
1325
              if (context_stack_depth > 0 || new == NULL)
1326
                {
1327
                  complain (&ef_complaint, cs->c_symnum);
1328
                  within_function = 0;
1329
                  break;
1330
                }
1331
 
1332
              finish_block (new->name, &local_symbols, new->old_blocks,
1333
                            new->start_addr,
1334
                            (fcn_cs_saved.c_value
1335
                             + fcn_aux_saved.x_sym.x_misc.x_fsize
1336
                             + ANOFFSET (objfile->section_offsets,
1337
                                         SECT_OFF_TEXT (objfile))),
1338
                            objfile);
1339
              within_function = 0;
1340
            }
1341
          break;
1342
 
1343
        case C_BSTAT:
1344
          /* Begin static block.  */
1345
          {
1346
            struct internal_syment symbol;
1347
 
1348
            read_symbol (&symbol, cs->c_value);
1349
            static_block_base = symbol.n_value;
1350
            static_block_section =
1351
              secnum_to_section (symbol.n_scnum, objfile);
1352
          }
1353
          break;
1354
 
1355
        case C_ESTAT:
1356
          /* End of static block.  */
1357
          static_block_base = 0;
1358
          static_block_section = -1;
1359
          break;
1360
 
1361
        case C_ARG:
1362
        case C_REGPARM:
1363
        case C_REG:
1364
        case C_TPDEF:
1365
        case C_STRTAG:
1366
        case C_UNTAG:
1367
        case C_ENTAG:
1368
          {
1369
            static struct complaint msg =
1370
            {"Unrecognized storage class %d.", 0, 0};
1371
            complain (&msg, cs->c_sclass);
1372
          }
1373
          break;
1374
 
1375
        case C_LABEL:
1376
        case C_NULL:
1377
          /* Ignore these.  */
1378
          break;
1379
 
1380
        case C_HIDEXT:
1381
        case C_STAT:
1382
          break;
1383
 
1384
        case C_BINCL:
1385
          /* beginning of include file */
1386
          /* In xlc output, C_BINCL/C_EINCL pair doesn't show up in sorted
1387
             order. Thus, when wee see them, we might not know enough info
1388
             to process them. Thus, we'll be saving them into a table
1389
             (inclTable) and postpone their processing. */
1390
 
1391
          record_include_begin (cs);
1392
          break;
1393
 
1394
        case C_EINCL:
1395
          /* End of include file.  */
1396
          /* See the comment after case C_BINCL.  */
1397
          record_include_end (cs);
1398
          break;
1399
 
1400
        case C_BLOCK:
1401
          if (STREQ (cs->c_name, ".bb"))
1402
            {
1403
              depth++;
1404
              new = push_context (depth,
1405
                                  (cs->c_value
1406
                                   + ANOFFSET (objfile->section_offsets,
1407
                                               SECT_OFF_TEXT (objfile))));
1408
            }
1409
          else if (STREQ (cs->c_name, ".eb"))
1410
            {
1411
              if (context_stack_depth <= 0)
1412
                {               /* We attempted to pop an empty context stack */
1413
                  complain (&eb_complaint, cs->c_symnum);
1414
                  break;
1415
                }
1416
              new = pop_context ();
1417
              if (depth-- != new->depth)
1418
                {
1419
                  complain (&eb_complaint, cs->c_symnum);
1420
                  break;
1421
                }
1422
              if (local_symbols && context_stack_depth > 0)
1423
                {
1424
                  /* Make a block for the local symbols within.  */
1425
                  finish_block (new->name, &local_symbols, new->old_blocks,
1426
                                new->start_addr,
1427
                                (cs->c_value
1428
                                 + ANOFFSET (objfile->section_offsets,
1429
                                             SECT_OFF_TEXT (objfile))),
1430
                                objfile);
1431
                }
1432
              local_symbols = new->locals;
1433
            }
1434
          break;
1435
 
1436
        default:
1437
          process_xcoff_symbol (cs, objfile);
1438
          break;
1439
        }
1440
    }
1441
 
1442
  if (last_source_file)
1443
    {
1444
      struct symtab *s;
1445
 
1446
      complete_symtab (filestring, file_start_addr);
1447
      cur_src_end_addr = file_end_addr;
1448
      s = end_symtab (file_end_addr, objfile, SECT_OFF_TEXT (objfile));
1449
      /* When reading symbols for the last C_FILE of the objfile, try
1450
         to make sure that we set pst->symtab to the symtab for the
1451
         file, not to the _globals_ symtab.  I'm not sure whether this
1452
         actually works right or when/if it comes up.  */
1453
      if (pst->symtab == NULL)
1454
        pst->symtab = s;
1455
      end_stabs ();
1456
    }
1457
}
1458
 
1459
#define SYMBOL_DUP(SYMBOL1, SYMBOL2)    \
1460
  (SYMBOL2) = (struct symbol *)         \
1461
        obstack_alloc (&objfile->symbol_obstack, sizeof (struct symbol)); \
1462
  *(SYMBOL2) = *(SYMBOL1);
1463
 
1464
 
1465
#define SYMNAME_ALLOC(NAME, ALLOCED)    \
1466
  (ALLOCED) ? (NAME) : obsavestring ((NAME), strlen (NAME), &objfile->symbol_obstack);
1467
 
1468
 
1469
static struct type *func_symbol_type;
1470
static struct type *var_symbol_type;
1471
 
1472
/* process one xcoff symbol. */
1473
 
1474
static struct symbol *
1475
process_xcoff_symbol (register struct coff_symbol *cs, struct objfile *objfile)
1476
{
1477
  struct symbol onesymbol;
1478
  register struct symbol *sym = &onesymbol;
1479
  struct symbol *sym2 = NULL;
1480
  char *name, *pp;
1481
 
1482
  int sec;
1483
  CORE_ADDR off;
1484
 
1485
  if (cs->c_secnum < 0)
1486
    {
1487
      /* The value is a register number, offset within a frame, etc.,
1488
         and does not get relocated.  */
1489
      off = 0;
1490
      sec = -1;
1491
    }
1492
  else
1493
    {
1494
      sec = secnum_to_section (cs->c_secnum, objfile);
1495
      off = ANOFFSET (objfile->section_offsets, sec);
1496
    }
1497
 
1498
  name = cs->c_name;
1499
  if (name[0] == '.')
1500
    ++name;
1501
 
1502
  memset (sym, '\0', sizeof (struct symbol));
1503
 
1504
  /* default assumptions */
1505
  SYMBOL_VALUE_ADDRESS (sym) = cs->c_value + off;
1506
  SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1507
  SYMBOL_SECTION (sym) = secnum_to_section (cs->c_secnum, objfile);
1508
 
1509
  if (ISFCN (cs->c_type))
1510
    {
1511
      /* At this point, we don't know the type of the function.  This
1512
         will be patched with the type from its stab entry later on in
1513
         patch_block_stabs (), unless the file was compiled without -g.  */
1514
 
1515
      SYMBOL_NAME (sym) = SYMNAME_ALLOC (name, symname_alloced);
1516
      SYMBOL_TYPE (sym) = func_symbol_type;
1517
 
1518
      SYMBOL_CLASS (sym) = LOC_BLOCK;
1519
      SYMBOL_DUP (sym, sym2);
1520
 
1521
      if (cs->c_sclass == C_EXT)
1522
        add_symbol_to_list (sym2, &global_symbols);
1523
      else if (cs->c_sclass == C_HIDEXT || cs->c_sclass == C_STAT)
1524
        add_symbol_to_list (sym2, &file_symbols);
1525
    }
1526
  else
1527
    {
1528
      /* In case we can't figure out the type, provide default. */
1529
      SYMBOL_TYPE (sym) = var_symbol_type;
1530
 
1531
      switch (cs->c_sclass)
1532
        {
1533
#if 0
1534
          /* The values of functions and global symbols are now resolved
1535
             via the global_sym_chain in stabsread.c.  */
1536
        case C_FUN:
1537
          if (fcn_cs_saved.c_sclass == C_EXT)
1538
            add_stab_to_list (name, &global_stabs);
1539
          else
1540
            add_stab_to_list (name, &file_stabs);
1541
          break;
1542
 
1543
        case C_GSYM:
1544
          add_stab_to_list (name, &global_stabs);
1545
          break;
1546
#endif
1547
 
1548
        case C_BCOMM:
1549
          common_block_start (cs->c_name, objfile);
1550
          break;
1551
 
1552
        case C_ECOMM:
1553
          common_block_end (objfile);
1554
          break;
1555
 
1556
        default:
1557
          complain (&storclass_complaint, cs->c_sclass);
1558
          /* FALLTHROUGH */
1559
 
1560
        case C_DECL:
1561
        case C_PSYM:
1562
        case C_RPSYM:
1563
        case C_ECOML:
1564
        case C_LSYM:
1565
        case C_RSYM:
1566
        case C_GSYM:
1567
 
1568
          {
1569
            sym = define_symbol (cs->c_value + off, cs->c_name, 0, 0, objfile);
1570
            if (sym != NULL)
1571
              {
1572
                SYMBOL_SECTION (sym) = sec;
1573
              }
1574
            return sym;
1575
          }
1576
 
1577
        case C_STSYM:
1578
 
1579
          /* For xlc (not GCC), the 'V' symbol descriptor is used for
1580
             all statics and we need to distinguish file-scope versus
1581
             function-scope using within_function.  We do this by
1582
             changing the string we pass to define_symbol to use 'S'
1583
             where we need to, which is not necessarily super-clean,
1584
             but seems workable enough.  */
1585
 
1586
          if (*name == ':' || (pp = (char *) strchr (name, ':')) == NULL)
1587
            return NULL;
1588
 
1589
          ++pp;
1590
          if (*pp == 'V' && !within_function)
1591
            *pp = 'S';
1592
          sym = define_symbol ((cs->c_value
1593
                                + ANOFFSET (objfile->section_offsets,
1594
                                            static_block_section)),
1595
                               cs->c_name, 0, 0, objfile);
1596
          if (sym != NULL)
1597
            {
1598
              SYMBOL_VALUE_ADDRESS (sym) += static_block_base;
1599
              SYMBOL_SECTION (sym) = static_block_section;
1600
            }
1601
          return sym;
1602
 
1603
        }
1604
    }
1605
  return sym2;
1606
}
1607
 
1608
/* Extract the file name from the aux entry of a C_FILE symbol.
1609
   Result is in static storage and is only good for temporary use.  */
1610
 
1611
static char *
1612
coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile)
1613
{
1614
  static char buffer[BUFSIZ];
1615
 
1616
  if (aux_entry->x_file.x_n.x_zeroes == 0)
1617
    strcpy (buffer,
1618
            ((struct coff_symfile_info *) objfile->sym_private)->strtbl
1619
            + aux_entry->x_file.x_n.x_offset);
1620
  else
1621
    {
1622
      strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1623
      buffer[FILNMLEN] = '\0';
1624
    }
1625
  return (buffer);
1626
}
1627
 
1628
/* Set *SYMBOL to symbol number symno in symtbl.  */
1629
static void
1630
read_symbol (struct internal_syment *symbol, int symno)
1631
{
1632
  int nsyms =
1633
  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
1634
  ->symtbl_num_syms;
1635
  char *stbl =
1636
  ((struct coff_symfile_info *) this_symtab_psymtab->objfile->sym_private)
1637
  ->symtbl;
1638
  if (symno < 0 || symno >= nsyms)
1639
    {
1640
      static struct complaint msg =
1641
      {"Invalid symbol offset", 0, 0};
1642
      complain (&msg);
1643
      symbol->n_value = 0;
1644
      symbol->n_scnum = -1;
1645
      return;
1646
    }
1647
  bfd_coff_swap_sym_in (this_symtab_psymtab->objfile->obfd,
1648
                        stbl + (symno * local_symesz),
1649
                        symbol);
1650
}
1651
 
1652
/* Get value corresponding to symbol number symno in symtbl.  */
1653
 
1654
static CORE_ADDR
1655
read_symbol_nvalue (int symno)
1656
{
1657
  struct internal_syment symbol[1];
1658
 
1659
  read_symbol (symbol, symno);
1660
  return symbol->n_value;
1661
}
1662
 
1663
 
1664
/* Find the address of the function corresponding to symno, where
1665
   symno is the symbol pointed to by the linetable.  */
1666
 
1667
static int
1668
read_symbol_lineno (int symno)
1669
{
1670
  struct objfile *objfile = this_symtab_psymtab->objfile;
1671
  boolean xcoff64 = xcoff_data (objfile->obfd)->xcoff64;
1672
 
1673
  struct coff_symfile_info *info =
1674
    (struct coff_symfile_info *)objfile->sym_private;
1675
  int nsyms = info->symtbl_num_syms;
1676
  char *stbl = info->symtbl;
1677
  char *strtbl = info->strtbl;
1678
 
1679
  struct internal_syment symbol[1];
1680
  union internal_auxent main_aux[1];
1681
 
1682
  if (symno < 0)
1683
    {
1684
      complain (&bf_notfound_complaint);
1685
      return 0;
1686
    }
1687
 
1688
  /* Note that just searching for a short distance (e.g. 50 symbols)
1689
     is not enough, at least in the following case.
1690
 
1691
     .extern foo
1692
     [many .stabx entries]
1693
     [a few functions, referring to foo]
1694
     .globl foo
1695
     .bf
1696
 
1697
     What happens here is that the assembler moves the .stabx entries
1698
     to right before the ".bf" for foo, but the symbol for "foo" is before
1699
     all the stabx entries.  See PR gdb/2222.  */
1700
 
1701
  /* Maintaining a table of .bf entries might be preferable to this search.
1702
     If I understand things correctly it would need to be done only for
1703
     the duration of a single psymtab to symtab conversion.  */
1704
  while (symno < nsyms)
1705
    {
1706
      bfd_coff_swap_sym_in (symfile_bfd,
1707
                            stbl + (symno * local_symesz), symbol);
1708
      if (symbol->n_sclass == C_FCN)
1709
        {
1710
          char *name = xcoff64 ? strtbl + symbol->n_offset : symbol->n_name;
1711
          if (STREQ (name, ".bf"))
1712
            goto gotit;
1713
        }
1714
      symno += symbol->n_numaux + 1;
1715
    }
1716
 
1717
  complain (&bf_notfound_complaint);
1718
  return 0;
1719
 
1720
gotit:
1721
  /* take aux entry and return its lineno */
1722
  symno++;
1723
  bfd_coff_swap_aux_in (objfile->obfd, stbl + symno * local_symesz,
1724
                        symbol->n_type, symbol->n_sclass,
1725
                        0, symbol->n_numaux, main_aux);
1726
 
1727
  return main_aux->x_sym.x_misc.x_lnsz.x_lnno;
1728
}
1729
 
1730
/* Support for line number handling */
1731
 
1732
/* This function is called for every section; it finds the outer limits
1733
 * of the line table (minimum and maximum file offset) so that the
1734
 * mainline code can read the whole thing for efficiency.
1735
 */
1736
static void
1737
find_linenos (bfd *abfd, sec_ptr asect, PTR vpinfo)
1738
{
1739
  struct coff_symfile_info *info;
1740
  int size, count;
1741
  file_ptr offset, maxoff;
1742
 
1743
  count = asect->lineno_count;
1744
 
1745
  if (!STREQ (asect->name, ".text") || count == 0)
1746
    return;
1747
 
1748
  size = count * coff_data (abfd)->local_linesz;
1749
  info = (struct coff_symfile_info *) vpinfo;
1750
  offset = asect->line_filepos;
1751
  maxoff = offset + size;
1752
 
1753
  if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
1754
    info->min_lineno_offset = offset;
1755
 
1756
  if (maxoff > info->max_lineno_offset)
1757
    info->max_lineno_offset = maxoff;
1758
}
1759
 
1760
static void xcoff_psymtab_to_symtab_1 (struct partial_symtab *);
1761
 
1762
static void
1763
xcoff_psymtab_to_symtab_1 (struct partial_symtab *pst)
1764
{
1765
  struct cleanup *old_chain;
1766
  int i;
1767
 
1768
  if (!pst)
1769
    return;
1770
 
1771
  if (pst->readin)
1772
    {
1773
      fprintf_unfiltered
1774
        (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1775
         pst->filename);
1776
      return;
1777
    }
1778
 
1779
  /* Read in all partial symtabs on which this one is dependent */
1780
  for (i = 0; i < pst->number_of_dependencies; i++)
1781
    if (!pst->dependencies[i]->readin)
1782
      {
1783
        /* Inform about additional files that need to be read in.  */
1784
        if (info_verbose)
1785
          {
1786
            fputs_filtered (" ", gdb_stdout);
1787
            wrap_here ("");
1788
            fputs_filtered ("and ", gdb_stdout);
1789
            wrap_here ("");
1790
            printf_filtered ("%s...", pst->dependencies[i]->filename);
1791
            wrap_here ("");     /* Flush output */
1792
            gdb_flush (gdb_stdout);
1793
          }
1794
        xcoff_psymtab_to_symtab_1 (pst->dependencies[i]);
1795
      }
1796
 
1797
  if (((struct symloc *) pst->read_symtab_private)->numsyms != 0)
1798
    {
1799
      /* Init stuff necessary for reading in symbols.  */
1800
      stabsread_init ();
1801
      buildsym_init ();
1802
      old_chain = make_cleanup (really_free_pendings, 0);
1803
 
1804
      read_xcoff_symtab (pst);
1805
      sort_symtab_syms (pst->symtab);
1806
 
1807
      do_cleanups (old_chain);
1808
    }
1809
 
1810
  pst->readin = 1;
1811
}
1812
 
1813
static void xcoff_psymtab_to_symtab (struct partial_symtab *);
1814
 
1815
/* Read in all of the symbols for a given psymtab for real.
1816
   Be verbose about it if the user wants that.  */
1817
 
1818
static void
1819
xcoff_psymtab_to_symtab (struct partial_symtab *pst)
1820
{
1821
  bfd *sym_bfd;
1822
 
1823
  if (!pst)
1824
    return;
1825
 
1826
  if (pst->readin)
1827
    {
1828
      fprintf_unfiltered
1829
        (gdb_stderr, "Psymtab for %s already read in.  Shouldn't happen.\n",
1830
         pst->filename);
1831
      return;
1832
    }
1833
 
1834
  if (((struct symloc *) pst->read_symtab_private)->numsyms != 0
1835
      || pst->number_of_dependencies)
1836
    {
1837
      /* Print the message now, before reading the string table,
1838
         to avoid disconcerting pauses.  */
1839
      if (info_verbose)
1840
        {
1841
          printf_filtered ("Reading in symbols for %s...", pst->filename);
1842
          gdb_flush (gdb_stdout);
1843
        }
1844
 
1845
      sym_bfd = pst->objfile->obfd;
1846
 
1847
      next_symbol_text_func = xcoff_next_symbol_text;
1848
 
1849
      xcoff_psymtab_to_symtab_1 (pst);
1850
 
1851
      /* Match with global symbols.  This only needs to be done once,
1852
         after all of the symtabs and dependencies have been read in.   */
1853
      scan_file_globals (pst->objfile);
1854
 
1855
      /* Finish up the debug error message.  */
1856
      if (info_verbose)
1857
        printf_filtered ("done.\n");
1858
    }
1859
}
1860
 
1861
static void
1862
xcoff_new_init (struct objfile *objfile)
1863
{
1864
  stabsread_new_init ();
1865
  buildsym_new_init ();
1866
}
1867
 
1868
/* Do initialization in preparation for reading symbols from OBJFILE.
1869
 
1870
   We will only be called if this is an XCOFF or XCOFF-like file.
1871
   BFD handles figuring out the format of the file, and code in symfile.c
1872
   uses BFD's determination to vector to us.  */
1873
 
1874
static void
1875
xcoff_symfile_init (struct objfile *objfile)
1876
{
1877
  /* Allocate struct to keep track of the symfile */
1878
  objfile->sym_private = xmmalloc (objfile->md,
1879
                                   sizeof (struct coff_symfile_info));
1880
 
1881
  /* XCOFF objects may be reordered, so set OBJF_REORDERED.  If we
1882
     find this causes a significant slowdown in gdb then we could
1883
     set it in the debug symbol readers only when necessary.  */
1884
  objfile->flags |= OBJF_REORDERED;
1885
 
1886
  init_entry_point_info (objfile);
1887
}
1888
 
1889
/* Perform any local cleanups required when we are done with a particular
1890
   objfile.  I.E, we are in the process of discarding all symbol information
1891
   for an objfile, freeing up all memory held for it, and unlinking the
1892
   objfile struct from the global list of known objfiles. */
1893
 
1894
static void
1895
xcoff_symfile_finish (struct objfile *objfile)
1896
{
1897
  if (objfile->sym_private != NULL)
1898
    {
1899
      mfree (objfile->md, objfile->sym_private);
1900
    }
1901
 
1902
  /* Start with a fresh include table for the next objfile.  */
1903
  if (inclTable)
1904
    {
1905
      xfree (inclTable);
1906
      inclTable = NULL;
1907
    }
1908
  inclIndx = inclLength = inclDepth = 0;
1909
}
1910
 
1911
 
1912
static void
1913
init_stringtab (bfd *abfd, file_ptr offset, struct objfile *objfile)
1914
{
1915
  long length;
1916
  int val;
1917
  unsigned char lengthbuf[4];
1918
  char *strtbl;
1919
 
1920
  ((struct coff_symfile_info *) objfile->sym_private)->strtbl = NULL;
1921
 
1922
  if (bfd_seek (abfd, offset, SEEK_SET) < 0)
1923
    error ("cannot seek to string table in %s: %s",
1924
           bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
1925
 
1926
  val = bfd_read ((char *) lengthbuf, 1, sizeof lengthbuf, abfd);
1927
  length = bfd_h_get_32 (abfd, lengthbuf);
1928
 
1929
  /* If no string table is needed, then the file may end immediately
1930
     after the symbols.  Just return with `strtbl' set to NULL.  */
1931
 
1932
  if (val != sizeof lengthbuf || length < sizeof lengthbuf)
1933
    return;
1934
 
1935
  /* Allocate string table from symbol_obstack. We will need this table
1936
     as long as we have its symbol table around. */
1937
 
1938
  strtbl = (char *) obstack_alloc (&objfile->symbol_obstack, length);
1939
  ((struct coff_symfile_info *) objfile->sym_private)->strtbl = strtbl;
1940
 
1941
  /* Copy length buffer, the first byte is usually zero and is
1942
     used for stabs with a name length of zero.  */
1943
  memcpy (strtbl, lengthbuf, sizeof lengthbuf);
1944
  if (length == sizeof lengthbuf)
1945
    return;
1946
 
1947
  val = bfd_read (strtbl + sizeof lengthbuf, 1, length - sizeof lengthbuf,
1948
                  abfd);
1949
 
1950
  if (val != length - sizeof lengthbuf)
1951
    error ("cannot read string table from %s: %s",
1952
           bfd_get_filename (abfd), bfd_errmsg (bfd_get_error ()));
1953
  if (strtbl[length - 1] != '\0')
1954
    error ("bad symbol file: string table does not end with null character");
1955
 
1956
  return;
1957
}
1958
 
1959
/* If we have not yet seen a function for this psymtab, this is 0.  If we
1960
   have seen one, it is the offset in the line numbers of the line numbers
1961
   for the psymtab.  */
1962
static unsigned int first_fun_line_offset;
1963
 
1964
static struct partial_symtab *xcoff_start_psymtab
1965
  (struct objfile *, char *, int,
1966
   struct partial_symbol **, struct partial_symbol **);
1967
 
1968
/* Allocate and partially fill a partial symtab.  It will be
1969
   completely filled at the end of the symbol list.
1970
 
1971
   SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
1972
   is the address relative to which its symbols are (incremental) or 0
1973
   (normal). */
1974
 
1975
static struct partial_symtab *
1976
xcoff_start_psymtab (struct objfile *objfile, char *filename, int first_symnum,
1977
                     struct partial_symbol **global_syms,
1978
                     struct partial_symbol **static_syms)
1979
{
1980
  struct partial_symtab *result =
1981
  start_psymtab_common (objfile, objfile->section_offsets,
1982
                        filename,
1983
                        /* We fill in textlow later.  */
1984
                        0,
1985
                        global_syms, static_syms);
1986
 
1987
  result->read_symtab_private = (char *)
1988
    obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
1989
  ((struct symloc *) result->read_symtab_private)->first_symnum = first_symnum;
1990
  result->read_symtab = xcoff_psymtab_to_symtab;
1991
 
1992
  /* Deduce the source language from the filename for this psymtab. */
1993
  psymtab_language = deduce_language_from_filename (filename);
1994
 
1995
  return result;
1996
}
1997
 
1998
static struct partial_symtab *xcoff_end_psymtab
1999
  (struct partial_symtab *, char **, int, int,
2000
   struct partial_symtab **, int, int);
2001
 
2002
/* Close off the current usage of PST.
2003
   Returns PST, or NULL if the partial symtab was empty and thrown away.
2004
 
2005
   CAPPING_SYMBOL_NUMBER is the end of pst (exclusive).
2006
 
2007
   INCLUDE_LIST, NUM_INCLUDES, DEPENDENCY_LIST, and NUMBER_DEPENDENCIES
2008
   are the information for includes and dependencies.  */
2009
 
2010
static struct partial_symtab *
2011
xcoff_end_psymtab (struct partial_symtab *pst, char **include_list,
2012
                   int num_includes, int capping_symbol_number,
2013
                   struct partial_symtab **dependency_list,
2014
                   int number_dependencies, int textlow_not_set)
2015
{
2016
  int i;
2017
  struct objfile *objfile = pst->objfile;
2018
 
2019
  if (capping_symbol_number != -1)
2020
    ((struct symloc *) pst->read_symtab_private)->numsyms =
2021
      capping_symbol_number
2022
      - ((struct symloc *) pst->read_symtab_private)->first_symnum;
2023
  ((struct symloc *) pst->read_symtab_private)->lineno_off =
2024
    first_fun_line_offset;
2025
  first_fun_line_offset = 0;
2026
  pst->n_global_syms =
2027
    objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
2028
  pst->n_static_syms =
2029
    objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
2030
 
2031
  pst->number_of_dependencies = number_dependencies;
2032
  if (number_dependencies)
2033
    {
2034
      pst->dependencies = (struct partial_symtab **)
2035
        obstack_alloc (&objfile->psymbol_obstack,
2036
                    number_dependencies * sizeof (struct partial_symtab *));
2037
      memcpy (pst->dependencies, dependency_list,
2038
              number_dependencies * sizeof (struct partial_symtab *));
2039
    }
2040
  else
2041
    pst->dependencies = 0;
2042
 
2043
  for (i = 0; i < num_includes; i++)
2044
    {
2045
      struct partial_symtab *subpst =
2046
      allocate_psymtab (include_list[i], objfile);
2047
 
2048
      subpst->section_offsets = pst->section_offsets;
2049
      subpst->read_symtab_private =
2050
        (char *) obstack_alloc (&objfile->psymbol_obstack,
2051
                                sizeof (struct symloc));
2052
      ((struct symloc *) subpst->read_symtab_private)->first_symnum = 0;
2053
      ((struct symloc *) subpst->read_symtab_private)->numsyms = 0;
2054
      subpst->textlow = 0;
2055
      subpst->texthigh = 0;
2056
 
2057
      /* We could save slight bits of space by only making one of these,
2058
         shared by the entire set of include files.  FIXME-someday.  */
2059
      subpst->dependencies = (struct partial_symtab **)
2060
        obstack_alloc (&objfile->psymbol_obstack,
2061
                       sizeof (struct partial_symtab *));
2062
      subpst->dependencies[0] = pst;
2063
      subpst->number_of_dependencies = 1;
2064
 
2065
      subpst->globals_offset =
2066
        subpst->n_global_syms =
2067
        subpst->statics_offset =
2068
        subpst->n_static_syms = 0;
2069
 
2070
      subpst->readin = 0;
2071
      subpst->symtab = 0;
2072
      subpst->read_symtab = pst->read_symtab;
2073
    }
2074
 
2075
  sort_pst_symbols (pst);
2076
 
2077
  /* If there is already a psymtab or symtab for a file of this name,
2078
     remove it.  (If there is a symtab, more drastic things also
2079
     happen.)  This happens in VxWorks.  */
2080
  free_named_symtabs (pst->filename);
2081
 
2082
  if (num_includes == 0
2083
      && number_dependencies == 0
2084
      && pst->n_global_syms == 0
2085
      && pst->n_static_syms == 0)
2086
    {
2087
      /* Throw away this psymtab, it's empty.  We can't deallocate it, since
2088
         it is on the obstack, but we can forget to chain it on the list.  */
2089
      /* Empty psymtabs happen as a result of header files which don't have
2090
         any symbols in them.  There can be a lot of them.  */
2091
 
2092
      discard_psymtab (pst);
2093
 
2094
      /* Indicate that psymtab was thrown away.  */
2095
      pst = (struct partial_symtab *) NULL;
2096
    }
2097
  return pst;
2098
}
2099
 
2100
static void swap_sym (struct internal_syment *,
2101
                      union internal_auxent *, char **, char **,
2102
                      unsigned int *, struct objfile *);
2103
 
2104
/* Swap raw symbol at *RAW and put the name in *NAME, the symbol in
2105
   *SYMBOL, the first auxent in *AUX.  Advance *RAW and *SYMNUMP over
2106
   the symbol and its auxents.  */
2107
 
2108
static void
2109
swap_sym (struct internal_syment *symbol, union internal_auxent *aux,
2110
          char **name, char **raw, unsigned int *symnump,
2111
          struct objfile *objfile)
2112
{
2113
  bfd_coff_swap_sym_in (objfile->obfd, *raw, symbol);
2114
  if (symbol->n_zeroes)
2115
    {
2116
      /* If it's exactly E_SYMNMLEN characters long it isn't
2117
         '\0'-terminated.  */
2118
      if (symbol->n_name[E_SYMNMLEN - 1] != '\0')
2119
        {
2120
          /* FIXME: wastes memory for symbols which we don't end up putting
2121
             into the minimal symbols.  */
2122
          char *p;
2123
          p = obstack_alloc (&objfile->psymbol_obstack, E_SYMNMLEN + 1);
2124
          strncpy (p, symbol->n_name, E_SYMNMLEN);
2125
          p[E_SYMNMLEN] = '\0';
2126
          *name = p;
2127
        }
2128
      else
2129
        /* Point to the unswapped name as that persists as long as the
2130
           objfile does.  */
2131
        *name = ((struct external_syment *) *raw)->e.e_name;
2132
    }
2133
  else if (symbol->n_sclass & 0x80)
2134
    {
2135
      *name = ((struct coff_symfile_info *) objfile->sym_private)->debugsec
2136
        + symbol->n_offset;
2137
    }
2138
  else
2139
    {
2140
      *name = ((struct coff_symfile_info *) objfile->sym_private)->strtbl
2141
        + symbol->n_offset;
2142
    }
2143
  ++*symnump;
2144
  *raw += coff_data (objfile->obfd)->local_symesz;
2145
  if (symbol->n_numaux > 0)
2146
    {
2147
      bfd_coff_swap_aux_in (objfile->obfd, *raw, symbol->n_type,
2148
                            symbol->n_sclass, 0, symbol->n_numaux, aux);
2149
 
2150
      *symnump += symbol->n_numaux;
2151
      *raw += coff_data (objfile->obfd)->local_symesz * symbol->n_numaux;
2152
    }
2153
}
2154
 
2155
static void
2156
scan_xcoff_symtab (struct objfile *objfile)
2157
{
2158
  CORE_ADDR toc_offset = 0;      /* toc offset value in data section. */
2159
  char *filestring = NULL;
2160
 
2161
  char *namestring;
2162
  int past_first_source_file = 0;
2163
  bfd *abfd;
2164
  asection *bfd_sect;
2165
  unsigned int nsyms;
2166
 
2167
  /* Current partial symtab */
2168
  struct partial_symtab *pst;
2169
 
2170
  /* List of current psymtab's include files */
2171
  char **psymtab_include_list;
2172
  int includes_allocated;
2173
  int includes_used;
2174
 
2175
  /* Index within current psymtab dependency list */
2176
  struct partial_symtab **dependency_list;
2177
  int dependencies_used, dependencies_allocated;
2178
 
2179
  char *sraw_symbol;
2180
  struct internal_syment symbol;
2181
  union internal_auxent main_aux[5];
2182
  unsigned int ssymnum;
2183
 
2184
  char *last_csect_name = NULL; /* last seen csect's name and value */
2185
  CORE_ADDR last_csect_val = 0;
2186
  int last_csect_sec = 0;
2187
  int misc_func_recorded = 0;    /* true if any misc. function */
2188
  int textlow_not_set = 1;
2189
 
2190
  pst = (struct partial_symtab *) 0;
2191
 
2192
  includes_allocated = 30;
2193
  includes_used = 0;
2194
  psymtab_include_list = (char **) alloca (includes_allocated *
2195
                                           sizeof (char *));
2196
 
2197
  dependencies_allocated = 30;
2198
  dependencies_used = 0;
2199
  dependency_list =
2200
    (struct partial_symtab **) alloca (dependencies_allocated *
2201
                                       sizeof (struct partial_symtab *));
2202
 
2203
  last_source_file = NULL;
2204
 
2205
  abfd = objfile->obfd;
2206
 
2207
  sraw_symbol = ((struct coff_symfile_info *) objfile->sym_private)->symtbl;
2208
  nsyms = ((struct coff_symfile_info *) objfile->sym_private)->symtbl_num_syms;
2209
  ssymnum = 0;
2210
  while (ssymnum < nsyms)
2211
    {
2212
      int sclass;
2213
      /* This is the type we pass to partial-stab.h.  A less kludgy solution
2214
         would be to break out partial-stab.h into its various parts--shuffle
2215
         off the DBXREAD_ONLY stuff to dbxread.c, and make separate
2216
         pstab-norm.h (for most types), pstab-sol.h (for N_SOL), etc.  */
2217
      int stype;
2218
 
2219
      QUIT;
2220
 
2221
      bfd_coff_swap_sym_in (abfd, sraw_symbol, &symbol);
2222
      sclass = symbol.n_sclass;
2223
 
2224
      switch (sclass)
2225
        {
2226
        case C_EXT:
2227
        case C_HIDEXT:
2228
          {
2229
            /* The CSECT auxent--always the last auxent.  */
2230
            union internal_auxent csect_aux;
2231
            unsigned int symnum_before = ssymnum;
2232
 
2233
            swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2234
                      &ssymnum, objfile);
2235
            if (symbol.n_numaux > 1)
2236
              {
2237
                bfd_coff_swap_aux_in
2238
                  (objfile->obfd,
2239
                   sraw_symbol - coff_data (abfd)->local_symesz,
2240
                   symbol.n_type,
2241
                   symbol.n_sclass,
2242
                   symbol.n_numaux - 1,
2243
                   symbol.n_numaux,
2244
                   &csect_aux);
2245
              }
2246
            else
2247
              csect_aux = main_aux[0];
2248
 
2249
            /* If symbol name starts with ".$" or "$", ignore it.  */
2250
            if (namestring[0] == '$'
2251
                || (namestring[0] == '.' && namestring[1] == '$'))
2252
              break;
2253
 
2254
            switch (csect_aux.x_csect.x_smtyp & 0x7)
2255
              {
2256
              case XTY_SD:
2257
                switch (csect_aux.x_csect.x_smclas)
2258
                  {
2259
                  case XMC_PR:
2260
                    if (last_csect_name)
2261
                      {
2262
                        /* If no misc. function recorded in the last
2263
                           seen csect, enter it as a function. This
2264
                           will take care of functions like strcmp()
2265
                           compiled by xlc.  */
2266
 
2267
                        if (!misc_func_recorded)
2268
                          {
2269
                            RECORD_MINIMAL_SYMBOL
2270
                              (last_csect_name, last_csect_val,
2271
                               mst_text, last_csect_sec,
2272
                               objfile);
2273
                          }
2274
 
2275
                        if (pst != NULL)
2276
                          {
2277
                            /* We have to allocate one psymtab for
2278
                               each program csect, because their text
2279
                               sections need not be adjacent.  */
2280
                            xcoff_end_psymtab
2281
                              (pst, psymtab_include_list, includes_used,
2282
                               symnum_before, dependency_list,
2283
                               dependencies_used, textlow_not_set);
2284
                            includes_used = 0;
2285
                            dependencies_used = 0;
2286
                            /* Give all psymtabs for this source file the same
2287
                               name.  */
2288
                            pst = xcoff_start_psymtab
2289
                              (objfile,
2290
                               filestring,
2291
                               symnum_before,
2292
                               objfile->global_psymbols.next,
2293
                               objfile->static_psymbols.next);
2294
                          }
2295
                      }
2296
                    /* Activate the misc_func_recorded mechanism for
2297
                       compiler- and linker-generated CSECTs like ".strcmp"
2298
                       and "@FIX1".  */
2299
                    if (namestring && (namestring[0] == '.'
2300
                                       || namestring[0] == '@'))
2301
                      {
2302
                        last_csect_name = namestring;
2303
                        last_csect_val = symbol.n_value;
2304
                        last_csect_sec =
2305
                          secnum_to_section (symbol.n_scnum, objfile);
2306
                      }
2307
                    if (pst != NULL)
2308
                      {
2309
                        CORE_ADDR highval =
2310
                        symbol.n_value + csect_aux.x_csect.x_scnlen.l;
2311
                        if (highval > pst->texthigh)
2312
                          pst->texthigh = highval;
2313
                        if (pst->textlow == 0 || symbol.n_value < pst->textlow)
2314
                          pst->textlow = symbol.n_value;
2315
                      }
2316
                    misc_func_recorded = 0;
2317
                    break;
2318
 
2319
                  case XMC_RW:
2320
                    /* Data variables are recorded in the minimal symbol
2321
                       table, except for section symbols.  */
2322
                    if (*namestring != '.')
2323
                      prim_record_minimal_symbol_and_info
2324
                        (namestring, symbol.n_value,
2325
                         sclass == C_HIDEXT ? mst_file_data : mst_data,
2326
                         NULL, secnum_to_section (symbol.n_scnum, objfile),
2327
                         NULL, objfile);
2328
                    break;
2329
 
2330
                  case XMC_TC0:
2331
                    if (toc_offset)
2332
                      warning ("More than one XMC_TC0 symbol found.");
2333
                    toc_offset = symbol.n_value;
2334
 
2335
                    /* Make TOC offset relative to start address of section.  */
2336
                    bfd_sect = secnum_to_bfd_section (symbol.n_scnum, objfile);
2337
                    if (bfd_sect)
2338
                      toc_offset -= bfd_section_vma (objfile->obfd, bfd_sect);
2339
                    break;
2340
 
2341
                  case XMC_TC:
2342
                    /* These symbols tell us where the TOC entry for a
2343
                       variable is, not the variable itself.  */
2344
                    break;
2345
 
2346
                  default:
2347
                    break;
2348
                  }
2349
                break;
2350
 
2351
              case XTY_LD:
2352
                switch (csect_aux.x_csect.x_smclas)
2353
                  {
2354
                  case XMC_PR:
2355
                    /* A function entry point.  */
2356
 
2357
                    if (first_fun_line_offset == 0 && symbol.n_numaux > 1)
2358
                      first_fun_line_offset =
2359
                        main_aux[0].x_sym.x_fcnary.x_fcn.x_lnnoptr;
2360
                    RECORD_MINIMAL_SYMBOL
2361
                      (namestring, symbol.n_value,
2362
                       sclass == C_HIDEXT ? mst_file_text : mst_text,
2363
                       secnum_to_section (symbol.n_scnum, objfile),
2364
                       objfile);
2365
                    break;
2366
 
2367
                  case XMC_GL:
2368
                    /* shared library function trampoline code entry
2369
                       point. */
2370
 
2371
                    /* record trampoline code entries as
2372
                       mst_solib_trampoline symbol.  When we lookup mst
2373
                       symbols, we will choose mst_text over
2374
                       mst_solib_trampoline. */
2375
                    RECORD_MINIMAL_SYMBOL
2376
                      (namestring, symbol.n_value,
2377
                       mst_solib_trampoline,
2378
                       secnum_to_section (symbol.n_scnum, objfile),
2379
                       objfile);
2380
                    break;
2381
 
2382
                  case XMC_DS:
2383
                    /* The symbols often have the same names as
2384
                       debug symbols for functions, and confuse
2385
                       lookup_symbol.  */
2386
                    break;
2387
 
2388
                  default:
2389
 
2390
                    /* xlc puts each variable in a separate csect,
2391
                       so we get an XTY_SD for each variable.  But
2392
                       gcc puts several variables in a csect, so
2393
                       that each variable only gets an XTY_LD.  We
2394
                       still need to record them.  This will
2395
                       typically be XMC_RW; I suspect XMC_RO and
2396
                       XMC_BS might be possible too.  */
2397
                    if (*namestring != '.')
2398
                      prim_record_minimal_symbol_and_info
2399
                        (namestring, symbol.n_value,
2400
                         sclass == C_HIDEXT ? mst_file_data : mst_data,
2401
                         NULL, secnum_to_section (symbol.n_scnum, objfile),
2402
                         NULL, objfile);
2403
                    break;
2404
                  }
2405
                break;
2406
 
2407
              case XTY_CM:
2408
                switch (csect_aux.x_csect.x_smclas)
2409
                  {
2410
                  case XMC_RW:
2411
                  case XMC_BS:
2412
                    /* Common variables are recorded in the minimal symbol
2413
                       table, except for section symbols.  */
2414
                    if (*namestring != '.')
2415
                      prim_record_minimal_symbol_and_info
2416
                        (namestring, symbol.n_value,
2417
                         sclass == C_HIDEXT ? mst_file_bss : mst_bss,
2418
                         NULL, secnum_to_section (symbol.n_scnum, objfile),
2419
                         NULL, objfile);
2420
                    break;
2421
                  }
2422
                break;
2423
 
2424
              default:
2425
                break;
2426
              }
2427
          }
2428
          break;
2429
        case C_FILE:
2430
          {
2431
            unsigned int symnum_before;
2432
 
2433
            symnum_before = ssymnum;
2434
            swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2435
                      &ssymnum, objfile);
2436
 
2437
            /* See if the last csect needs to be recorded.  */
2438
 
2439
            if (last_csect_name && !misc_func_recorded)
2440
              {
2441
 
2442
                /* If no misc. function recorded in the last seen csect, enter
2443
                   it as a function.  This will take care of functions like
2444
                   strcmp() compiled by xlc.  */
2445
 
2446
                RECORD_MINIMAL_SYMBOL
2447
                  (last_csect_name, last_csect_val,
2448
                   mst_text, last_csect_sec, objfile);
2449
              }
2450
 
2451
            if (pst)
2452
              {
2453
                xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2454
                                   symnum_before, dependency_list,
2455
                                   dependencies_used, textlow_not_set);
2456
                includes_used = 0;
2457
                dependencies_used = 0;
2458
              }
2459
            first_fun_line_offset = 0;
2460
 
2461
            /* XCOFF, according to the AIX 3.2 documentation, puts the
2462
               filename in cs->c_name.  But xlc 1.3.0.2 has decided to
2463
               do things the standard COFF way and put it in the auxent.
2464
               We use the auxent if the symbol is ".file" and an auxent
2465
               exists, otherwise use the symbol itself.  */
2466
            if (!strcmp (namestring, ".file") && symbol.n_numaux > 0)
2467
              {
2468
                filestring = coff_getfilename (&main_aux[0], objfile);
2469
              }
2470
            else
2471
              filestring = namestring;
2472
 
2473
            pst = xcoff_start_psymtab (objfile,
2474
                                       filestring,
2475
                                       symnum_before,
2476
                                       objfile->global_psymbols.next,
2477
                                       objfile->static_psymbols.next);
2478
            last_csect_name = NULL;
2479
          }
2480
          break;
2481
 
2482
        default:
2483
          {
2484
            static struct complaint msg =
2485
            {"Storage class %d not recognized during scan", 0, 0};
2486
            complain (&msg, sclass);
2487
          }
2488
          /* FALLTHROUGH */
2489
 
2490
          /* C_FCN is .bf and .ef symbols.  I think it is sufficient
2491
             to handle only the C_FUN and C_EXT.  */
2492
        case C_FCN:
2493
 
2494
        case C_BSTAT:
2495
        case C_ESTAT:
2496
        case C_ARG:
2497
        case C_REGPARM:
2498
        case C_REG:
2499
        case C_TPDEF:
2500
        case C_STRTAG:
2501
        case C_UNTAG:
2502
        case C_ENTAG:
2503
        case C_LABEL:
2504
        case C_NULL:
2505
 
2506
          /* C_EINCL means we are switching back to the main file.  But there
2507
             is no reason to care; the only thing we want to know about
2508
             includes is the names of all the included (.h) files.  */
2509
        case C_EINCL:
2510
 
2511
        case C_BLOCK:
2512
 
2513
          /* I don't think C_STAT is used in xcoff; C_HIDEXT appears to be
2514
             used instead.  */
2515
        case C_STAT:
2516
 
2517
          /* I don't think the name of the common block (as opposed to the
2518
             variables within it) is something which is user visible
2519
             currently.  */
2520
        case C_BCOMM:
2521
        case C_ECOMM:
2522
 
2523
        case C_PSYM:
2524
        case C_RPSYM:
2525
 
2526
          /* I think we can ignore C_LSYM; types on xcoff seem to use C_DECL
2527
             so C_LSYM would appear to be only for locals.  */
2528
        case C_LSYM:
2529
 
2530
        case C_AUTO:
2531
        case C_RSYM:
2532
          {
2533
            /* We probably could save a few instructions by assuming that
2534
               C_LSYM, C_PSYM, etc., never have auxents.  */
2535
            int naux1 = symbol.n_numaux + 1;
2536
            ssymnum += naux1;
2537
            sraw_symbol += bfd_coff_symesz (abfd) * naux1;
2538
          }
2539
          break;
2540
 
2541
        case C_BINCL:
2542
          stype = N_SOL;
2543
          goto pstab;
2544
 
2545
        case C_FUN:
2546
          /* The value of the C_FUN is not the address of the function (it
2547
             appears to be the address before linking), but as long as it
2548
             is smaller than the actual address, then find_pc_partial_function
2549
             will use the minimal symbols instead.  I hope.  */
2550
 
2551
        case C_GSYM:
2552
        case C_ECOML:
2553
        case C_DECL:
2554
        case C_STSYM:
2555
          stype = N_LSYM;
2556
        pstab:
2557
          swap_sym (&symbol, &main_aux[0], &namestring, &sraw_symbol,
2558
                    &ssymnum, objfile);
2559
#define CUR_SYMBOL_TYPE stype
2560
#define CUR_SYMBOL_VALUE symbol.n_value
2561
 
2562
/* START_PSYMTAB and END_PSYMTAB are never used, because they are only
2563
   called from DBXREAD_ONLY or N_SO code.  Likewise for the symnum
2564
   variable.  */
2565
#define START_PSYMTAB(ofile,fname,low,symoff,global_syms,static_syms) 0
2566
#define END_PSYMTAB(pst,ilist,ninc,c_off,c_text,dep_list,n_deps,textlow_not_set)\
2567
  do {} while (0)
2568
/* We have already set the namestring.  */
2569
#define SET_NAMESTRING()        /* */
2570
 
2571
#include "partial-stab.h"
2572
        }
2573
    }
2574
 
2575
  if (pst)
2576
    {
2577
      xcoff_end_psymtab (pst, psymtab_include_list, includes_used,
2578
                         ssymnum, dependency_list,
2579
                         dependencies_used, textlow_not_set);
2580
    }
2581
 
2582
  /* Record the toc offset value of this symbol table into objfile structure.
2583
     If no XMC_TC0 is found, toc_offset should be zero. Another place to obtain
2584
     this information would be file auxiliary header. */
2585
 
2586
  ((struct coff_symfile_info *) objfile->sym_private)->toc_offset = toc_offset;
2587
}
2588
 
2589
/* Return the toc offset value for a given objfile.  */
2590
 
2591
CORE_ADDR
2592
get_toc_offset (struct objfile *objfile)
2593
{
2594
  if (objfile)
2595
    return ((struct coff_symfile_info *) objfile->sym_private)->toc_offset;
2596
  return 0;
2597
}
2598
 
2599
/* Scan and build partial symbols for a symbol file.
2600
   We have been initialized by a call to dbx_symfile_init, which
2601
   put all the relevant info into a "struct dbx_symfile_info",
2602
   hung off the objfile structure.
2603
 
2604
   SECTION_OFFSETS contains offsets relative to which the symbols in the
2605
   various sections are (depending where the sections were actually loaded).
2606
   MAINLINE is true if we are reading the main symbol
2607
   table (as opposed to a shared lib or dynamically loaded file).  */
2608
 
2609
static void
2610
xcoff_initial_scan (struct objfile *objfile, int mainline)
2611
{
2612
  bfd *abfd;
2613
  int val;
2614
  struct cleanup *back_to;
2615
  int num_symbols;              /* # of symbols */
2616
  file_ptr symtab_offset;       /* symbol table and */
2617
  file_ptr stringtab_offset;    /* string table file offsets */
2618
  struct coff_symfile_info *info;
2619
  char *name;
2620
  unsigned int size;
2621
 
2622
  info = (struct coff_symfile_info *) objfile->sym_private;
2623
  symfile_bfd = abfd = objfile->obfd;
2624
  name = objfile->name;
2625
 
2626
  num_symbols = bfd_get_symcount (abfd);        /* # of symbols */
2627
  symtab_offset = obj_sym_filepos (abfd);       /* symbol table file offset */
2628
  stringtab_offset = symtab_offset +
2629
    num_symbols * coff_data (abfd)->local_symesz;
2630
 
2631
  info->min_lineno_offset = 0;
2632
  info->max_lineno_offset = 0;
2633
  bfd_map_over_sections (abfd, find_linenos, info);
2634
 
2635
  if (num_symbols > 0)
2636
    {
2637
      /* Read the string table.  */
2638
      init_stringtab (abfd, stringtab_offset, objfile);
2639
 
2640
      /* Read the .debug section, if present.  */
2641
      {
2642
        sec_ptr secp;
2643
        bfd_size_type length;
2644
        char *debugsec = NULL;
2645
 
2646
        secp = bfd_get_section_by_name (abfd, ".debug");
2647
        if (secp)
2648
          {
2649
            length = bfd_section_size (abfd, secp);
2650
            if (length)
2651
              {
2652
                debugsec =
2653
                  (char *) obstack_alloc (&objfile->symbol_obstack, length);
2654
 
2655
                if (!bfd_get_section_contents (abfd, secp, debugsec,
2656
                                               (file_ptr) 0, length))
2657
                  {
2658
                    error ("Error reading .debug section of `%s': %s",
2659
                           name, bfd_errmsg (bfd_get_error ()));
2660
                  }
2661
              }
2662
          }
2663
        ((struct coff_symfile_info *) objfile->sym_private)->debugsec =
2664
          debugsec;
2665
      }
2666
    }
2667
 
2668
  /* Read the symbols.  We keep them in core because we will want to
2669
     access them randomly in read_symbol*.  */
2670
  val = bfd_seek (abfd, symtab_offset, SEEK_SET);
2671
  if (val < 0)
2672
    error ("Error reading symbols from %s: %s",
2673
           name, bfd_errmsg (bfd_get_error ()));
2674
  size = coff_data (abfd)->local_symesz * num_symbols;
2675
  ((struct coff_symfile_info *) objfile->sym_private)->symtbl =
2676
    obstack_alloc (&objfile->symbol_obstack, size);
2677
  ((struct coff_symfile_info *) objfile->sym_private)->symtbl_num_syms =
2678
    num_symbols;
2679
 
2680
  val = bfd_read (((struct coff_symfile_info *) objfile->sym_private)->symtbl,
2681
                  size, 1, abfd);
2682
  if (val != size)
2683
    perror_with_name ("reading symbol table");
2684
 
2685
  /* If we are reinitializing, or if we have never loaded syms yet, init */
2686
  if (mainline
2687
      || objfile->global_psymbols.size == 0
2688
      || objfile->static_psymbols.size == 0)
2689
    /* I'm not sure how how good num_symbols is; the rule of thumb in
2690
       init_psymbol_list was developed for a.out.  On the one hand,
2691
       num_symbols includes auxents.  On the other hand, it doesn't
2692
       include N_SLINE.  */
2693
    init_psymbol_list (objfile, num_symbols);
2694
 
2695
  free_pending_blocks ();
2696
  back_to = make_cleanup (really_free_pendings, 0);
2697
 
2698
  init_minimal_symbol_collection ();
2699
  make_cleanup_discard_minimal_symbols ();
2700
 
2701
  /* Now that the symbol table data of the executable file are all in core,
2702
     process them and define symbols accordingly.  */
2703
 
2704
  scan_xcoff_symtab (objfile);
2705
 
2706
  /* Install any minimal symbols that have been collected as the current
2707
     minimal symbols for this objfile. */
2708
 
2709
  install_minimal_symbols (objfile);
2710
 
2711
  do_cleanups (back_to);
2712
}
2713
 
2714
static void
2715
xcoff_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
2716
{
2717
  asection *sect = NULL;
2718
  int i;
2719
 
2720
  objfile->num_sections = SECT_OFF_MAX;
2721
  objfile->section_offsets = (struct section_offsets *)
2722
    obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS);
2723
 
2724
  /* Initialize the section indexes for future use. */
2725
  sect = bfd_get_section_by_name (objfile->obfd, ".text");
2726
  if (sect)
2727
    objfile->sect_index_text = sect->index;
2728
 
2729
  sect = bfd_get_section_by_name (objfile->obfd, ".data");
2730
  if (sect)
2731
    objfile->sect_index_data = sect->index;
2732
 
2733
  sect = bfd_get_section_by_name (objfile->obfd, ".bss");
2734
  if (sect)
2735
    objfile->sect_index_bss = sect->index;
2736
 
2737
  sect = bfd_get_section_by_name (objfile->obfd, ".rodata");
2738
  if (sect)
2739
    objfile->sect_index_rodata = sect->index;
2740
 
2741
  for (i = 0; i < objfile->num_sections; ++i)
2742
    {
2743
      /* syms_from_objfile kindly subtracts from addr the
2744
         bfd_section_vma of the .text section.  This strikes me as
2745
         wrong--whether the offset to be applied to symbol reading is
2746
         relative to the start address of the section depends on the
2747
         symbol format.  In any event, this whole "addr" concept is
2748
         pretty broken (it doesn't handle any section but .text
2749
         sensibly), so just ignore the addr parameter and use 0.
2750
         rs6000-nat.c will set the correct section offsets via
2751
         objfile_relocate.  */
2752
        (objfile->section_offsets)->offsets[i] = 0;
2753
    }
2754
}
2755
 
2756
/* Register our ability to parse symbols for xcoff BFD files.  */
2757
 
2758
static struct sym_fns xcoff_sym_fns =
2759
{
2760
 
2761
  /* It is possible that coff and xcoff should be merged as
2762
     they do have fundamental similarities (for example, the extra storage
2763
     classes used for stabs could presumably be recognized in any COFF file).
2764
     However, in addition to obvious things like all the csect hair, there are
2765
     some subtler differences between xcoffread.c and coffread.c, notably
2766
     the fact that coffread.c has no need to read in all the symbols, but
2767
     xcoffread.c reads all the symbols and does in fact randomly access them
2768
     (in C_BSTAT and line number processing).  */
2769
 
2770
  bfd_target_xcoff_flavour,
2771
 
2772
  xcoff_new_init,               /* sym_new_init: init anything gbl to entire symtab */
2773
  xcoff_symfile_init,           /* sym_init: read initial info, setup for sym_read() */
2774
  xcoff_initial_scan,           /* sym_read: read a symbol file into symtab */
2775
  xcoff_symfile_finish,         /* sym_finish: finished with file, cleanup */
2776
  xcoff_symfile_offsets,        /* sym_offsets: xlate offsets ext->int form */
2777
  NULL                          /* next: pointer to next struct sym_fns */
2778
};
2779
 
2780
void
2781
_initialize_xcoffread (void)
2782
{
2783
  add_symtab_fns (&xcoff_sym_fns);
2784
 
2785
  func_symbol_type = init_type (TYPE_CODE_FUNC, 1, 0,
2786
                                "<function, no debug info>", NULL);
2787
  TYPE_TARGET_TYPE (func_symbol_type) = builtin_type_int;
2788
  var_symbol_type =
2789
    init_type (TYPE_CODE_INT, TARGET_INT_BIT / HOST_CHAR_BIT, 0,
2790
               "<variable, no debug info>", NULL);
2791
}

powered by: WebSVN 2.1.0

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