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