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