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