766868274150f0b58839abe00dc94368e12cc8ec
[deliverable/binutils-gdb.git] / gdb / coffread.c
1 /* Read coff symbol tables and convert to internal format, for GDB.
2 Contributed by David D. Johnson, Brown University (ddj@cs.brown.edu).
3 Copyright 1987, 1988, 1989, 1990, 1991, 1992, 1993
4 Free Software Foundation, Inc.
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 2 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, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21
22 #include "defs.h"
23 #include "symtab.h"
24 #include "gdbtypes.h"
25 #include "breakpoint.h"
26 #include "bfd.h"
27 #include "symfile.h"
28 #include "objfiles.h"
29 #include "buildsym.h"
30 #include "complaints.h"
31 #include <obstack.h>
32
33 #include <string.h>
34
35 #include "libbfd.h" /* FIXME secret internal data from BFD */
36 #include "coff/internal.h" /* Internal format of COFF symbols in BFD */
37 #include "libcoff.h" /* FIXME secret internal data from BFD */
38
39 /* Translate an external name string into a user-visible name. */
40 #define EXTERNAL_NAME(string, abfd) \
41 (string[0] == bfd_get_symbol_leading_char(abfd)? string+1: string)
42
43 /* To be an sdb debug type, type must have at least a basic or primary
44 derived type. Using this rather than checking against T_NULL is
45 said to prevent core dumps if we try to operate on Michael Bloom
46 dbx-in-coff file. */
47
48 #define SDB_TYPE(type) (BTYPE(type) | (type & N_TMASK))
49
50 /*
51 * Convert from an sdb register number to an internal gdb register number.
52 * This should be defined in tm.h, if REGISTER_NAMES is not set up
53 * to map one to one onto the sdb register numbers.
54 */
55 #ifndef SDB_REG_TO_REGNUM
56 # define SDB_REG_TO_REGNUM(value) (value)
57 #endif
58
59 /* Core address of start and end of text of current source file.
60 This comes from a ".text" symbol where x_nlinno > 0. */
61
62 static CORE_ADDR cur_src_start_addr;
63 static CORE_ADDR cur_src_end_addr;
64
65 /* Core address of the end of the first object file. */
66 static CORE_ADDR first_object_file_end;
67
68 /* The addresses of the symbol table stream and number of symbols
69 of the object file we are reading (as copied into core). */
70
71 static FILE *nlist_stream_global;
72 static int nlist_nsyms_global;
73
74 /* Vector of line number information. */
75
76 static struct linetable *line_vector;
77
78 /* Index of next entry to go in line_vector_index. */
79
80 static int line_vector_index;
81
82 /* Last line number recorded in the line vector. */
83
84 static int prev_line_number;
85
86 /* Number of elements allocated for line_vector currently. */
87
88 static int line_vector_length;
89
90 /* Pointers to scratch storage, used for reading raw symbols and auxents. */
91
92 static char *temp_sym;
93 static char *temp_aux;
94
95 /* Local variables that hold the shift and mask values for the
96 COFF file that we are currently reading. These come back to us
97 from BFD, and are referenced by their macro names, as well as
98 internally to the BTYPE, ISPTR, ISFCN, ISARY, ISTAG, and DECREF
99 macros from ../internalcoff.h . */
100
101 static unsigned local_n_btmask;
102 static unsigned local_n_btshft;
103 static unsigned local_n_tmask;
104 static unsigned local_n_tshift;
105
106 #define N_BTMASK local_n_btmask
107 #define N_BTSHFT local_n_btshft
108 #define N_TMASK local_n_tmask
109 #define N_TSHIFT local_n_tshift
110
111 /* Local variables that hold the sizes in the file of various COFF structures.
112 (We only need to know this to read them from the file -- BFD will then
113 translate the data in them, into `internal_xxx' structs in the right
114 byte order, alignment, etc.) */
115
116 static unsigned local_linesz;
117 static unsigned local_symesz;
118 static unsigned local_auxesz;
119
120
121 /* Chain of typedefs of pointers to empty struct/union types.
122 They are chained thru the SYMBOL_VALUE_CHAIN. */
123
124 static struct symbol *opaque_type_chain[HASHSIZE];
125
126 #if 0
127 /* The type of the function we are currently reading in. This is
128 used by define_symbol to record the type of arguments to a function. */
129
130 struct type *in_function_type;
131 #endif
132
133 struct pending_block *pending_blocks;
134
135 /* Complaints about various problems in the file being read */
136
137 struct complaint ef_complaint =
138 {"Unmatched .ef symbol(s) ignored starting at symnum %d", 0, 0};
139
140 struct complaint bf_no_aux_complaint =
141 {"`.bf' symbol %d has no aux entry", 0, 0};
142
143 struct complaint ef_no_aux_complaint =
144 {"`.ef' symbol %d has no aux entry", 0, 0};
145
146 struct complaint lineno_complaint =
147 {"Line number pointer %d lower than start of line numbers", 0, 0};
148
149 struct complaint unexpected_type_complaint =
150 {"Unexpected type for symbol %s", 0, 0};
151
152 struct complaint bad_sclass_complaint =
153 {"Bad n_sclass for symbol %s", 0, 0};
154
155 struct complaint misordered_blocks_complaint =
156 {"Blocks out of order at address %x", 0, 0};
157
158 struct complaint tagndx_bad_complaint =
159 {"Symbol table entry for %s has bad tagndx value", 0, 0};
160
161 struct complaint eb_complaint =
162 {"Mismatched .eb symbol ignored starting at symnum %d", 0, 0};
163
164 /* Simplified internal version of coff symbol table information */
165
166 struct coff_symbol {
167 char *c_name;
168 int c_symnum; /* symbol number of this entry */
169 int c_naux; /* 0 if syment only, 1 if syment + auxent, etc */
170 long c_value;
171 int c_sclass;
172 int c_secnum;
173 unsigned int c_type;
174 };
175
176 static struct type *
177 coff_read_struct_type PARAMS ((int, int, int));
178
179 static struct type *
180 decode_base_type PARAMS ((struct coff_symbol *, unsigned int,
181 union internal_auxent *));
182
183 static struct type *
184 decode_type PARAMS ((struct coff_symbol *, unsigned int,
185 union internal_auxent *));
186
187 static struct type *
188 decode_function_type PARAMS ((struct coff_symbol *, unsigned int,
189 union internal_auxent *));
190
191 static struct type *
192 coff_read_enum_type PARAMS ((int, int, int));
193
194 static struct symbol *
195 process_coff_symbol PARAMS ((struct coff_symbol *, union internal_auxent *,
196 struct objfile *));
197
198 static void
199 patch_opaque_types PARAMS ((struct symtab *));
200
201 static void
202 patch_type PARAMS ((struct type *, struct type *));
203
204 static void
205 enter_linenos PARAMS ((long, int, int));
206
207 static void
208 free_linetab PARAMS ((void));
209
210 static int
211 init_lineno PARAMS ((int, long, int));
212
213 static char *
214 getfilename PARAMS ((union internal_auxent *));
215
216 static char *
217 getsymname PARAMS ((struct internal_syment *));
218
219 static void
220 free_stringtab PARAMS ((void));
221
222 static int
223 init_stringtab PARAMS ((int, long));
224
225 static void
226 read_one_sym PARAMS ((struct coff_symbol *, struct internal_syment *,
227 union internal_auxent *));
228
229 static void
230 read_coff_symtab PARAMS ((long, int, struct objfile *));
231
232 static void
233 find_linenos PARAMS ((bfd *, sec_ptr, PTR));
234
235 static void
236 coff_symfile_init PARAMS ((struct objfile *));
237
238 static void
239 coff_new_init PARAMS ((struct objfile *));
240
241 static void
242 coff_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
243
244 static void
245 coff_symfile_finish PARAMS ((struct objfile *));
246
247 static void
248 record_minimal_symbol PARAMS ((char *, CORE_ADDR, enum minimal_symbol_type));
249
250 static void
251 coff_end_symtab PARAMS ((struct objfile *));
252
253 static void
254 complete_symtab PARAMS ((char *, CORE_ADDR, unsigned int));
255
256 static void
257 coff_start_symtab PARAMS ((void));
258
259 static void
260 coff_record_line PARAMS ((int, CORE_ADDR));
261
262 static struct type *
263 coff_alloc_type PARAMS ((int));
264
265 static struct type **
266 coff_lookup_type PARAMS ((int));
267
268 \f
269 /* Look up a coff type-number index. Return the address of the slot
270 where the type for that index is stored.
271 The type-number is in INDEX.
272
273 This can be used for finding the type associated with that index
274 or for associating a new type with the index. */
275
276 static struct type **
277 coff_lookup_type (index)
278 register int index;
279 {
280 if (index >= type_vector_length)
281 {
282 int old_vector_length = type_vector_length;
283
284 type_vector_length *= 2;
285 if (index /* is still */ >= type_vector_length) {
286 type_vector_length = index * 2;
287 }
288 type_vector = (struct type **)
289 xrealloc ((char *) type_vector,
290 type_vector_length * sizeof (struct type *));
291 memset (&type_vector[old_vector_length], 0,
292 (type_vector_length - old_vector_length) * sizeof(struct type *));
293 }
294 return &type_vector[index];
295 }
296
297 /* Make sure there is a type allocated for type number index
298 and return the type object.
299 This can create an empty (zeroed) type object. */
300
301 static struct type *
302 coff_alloc_type (index)
303 int index;
304 {
305 register struct type **type_addr = coff_lookup_type (index);
306 register struct type *type = *type_addr;
307
308 /* If we are referring to a type not known at all yet,
309 allocate an empty type for it.
310 We will fill it in later if we find out how. */
311 if (type == NULL)
312 {
313 type = alloc_type (current_objfile);
314 *type_addr = type;
315 }
316 return type;
317 }
318 \f
319 /* Manage the vector of line numbers. */
320
321 static void
322 coff_record_line (line, pc)
323 int line;
324 CORE_ADDR pc;
325 {
326 struct linetable_entry *e;
327 /* Make sure line vector is big enough. */
328
329 if (line_vector_index + 2 >= line_vector_length)
330 {
331 line_vector_length *= 2;
332 line_vector = (struct linetable *)
333 xrealloc ((char *) line_vector, sizeof (struct linetable)
334 + (line_vector_length
335 * sizeof (struct linetable_entry)));
336 }
337
338 e = line_vector->item + line_vector_index++;
339 e->line = line; e->pc = pc;
340 }
341 \f
342 /* Start a new symtab for a new source file.
343 This is called when a COFF ".file" symbol is seen;
344 it indicates the start of data for one original source file. */
345
346 static void
347 coff_start_symtab ()
348 {
349 start_symtab (
350 /* We fill in the filename later. start_symtab
351 puts this pointer into last_source file and in
352 coff_end_symtab we assume we can free() it.
353 FIXME: leaks memory. */
354 savestring ("", 0),
355 /* We never know the directory name for COFF. */
356 NULL,
357 /* The start address is irrelevant, since we set
358 last_source_start_addr in coff_end_symtab. */
359 0);
360
361 /* Initialize the source file line number information for this file. */
362
363 if (line_vector) /* Unlikely, but maybe possible? */
364 free ((PTR)line_vector);
365 line_vector_index = 0;
366 line_vector_length = 1000;
367 prev_line_number = -2; /* Force first line number to be explicit */
368 line_vector = (struct linetable *)
369 xmalloc (sizeof (struct linetable)
370 + line_vector_length * sizeof (struct linetable_entry));
371 }
372
373 /* Save the vital information from when starting to read a file,
374 for use when closing off the current file.
375 NAME is the file name the symbols came from, START_ADDR is the first
376 text address for the file, and SIZE is the number of bytes of text. */
377
378 static void
379 complete_symtab (name, start_addr, size)
380 char *name;
381 CORE_ADDR start_addr;
382 unsigned int size;
383 {
384 last_source_file = savestring (name, strlen (name));
385 cur_src_start_addr = start_addr;
386 cur_src_end_addr = start_addr + size;
387
388 if (current_objfile -> ei.entry_point >= cur_src_start_addr &&
389 current_objfile -> ei.entry_point < cur_src_end_addr)
390 {
391 current_objfile -> ei.entry_file_lowpc = cur_src_start_addr;
392 current_objfile -> ei.entry_file_highpc = cur_src_end_addr;
393 }
394 }
395
396 /* Finish the symbol definitions for one main source file,
397 close off all the lexical contexts for that file
398 (creating struct block's for them), then make the
399 struct symtab for that file and put it in the list of all such. */
400
401 static void
402 coff_end_symtab (objfile)
403 struct objfile *objfile;
404 {
405 struct symtab *symtab;
406
407 last_source_start_addr = cur_src_start_addr;
408
409 /* For COFF, we only have one subfile, so we can just look at
410 subfiles and not worry about there being other elements in the
411 chain. We fill in various fields now because we didn't know them
412 before (or because doing it now is simply an artifact of how this
413 file used to be written). */
414 subfiles->line_vector = line_vector;
415 subfiles->name = last_source_file;
416
417 /* sort_pending is needed for amdcoff, at least.
418 sort_linevec is needed for the SCO compiler. */
419 symtab = end_symtab (cur_src_end_addr, 1, 1, objfile, 0);
420
421 if (symtab != NULL)
422 free_named_symtabs (symtab->filename);
423
424 /* Reinitialize for beginning of new file. */
425 line_vector = 0;
426 line_vector_length = -1;
427 last_source_file = NULL;
428 }
429 \f
430 static void
431 record_minimal_symbol (name, address, type)
432 char *name;
433 CORE_ADDR address;
434 enum minimal_symbol_type type;
435 {
436 /* We don't want TDESC entry points in the minimal symbol table */
437 if (name[0] == '@') return;
438
439 prim_record_minimal_symbol (savestring (name, strlen (name)), address, type);
440 }
441 \f
442 /* coff_symfile_init ()
443 is the coff-specific initialization routine for reading symbols.
444 It is passed a struct objfile which contains, among other things,
445 the BFD for the file whose symbols are being read, and a slot for
446 a pointer to "private data" which we fill with cookies and other
447 treats for coff_symfile_read ().
448
449 We will only be called if this is a COFF or COFF-like file.
450 BFD handles figuring out the format of the file, and code in symtab.c
451 uses BFD's determination to vector to us.
452
453 The ultimate result is a new symtab (or, FIXME, eventually a psymtab). */
454
455 struct coff_symfile_info {
456 file_ptr min_lineno_offset; /* Where in file lowest line#s are */
457 file_ptr max_lineno_offset; /* 1+last byte of line#s in file */
458 };
459
460 static int text_bfd_scnum;
461
462 static void
463 coff_symfile_init (objfile)
464 struct objfile *objfile;
465 {
466 asection *section;
467 bfd *abfd = objfile->obfd;
468
469 /* Allocate struct to keep track of the symfile */
470 objfile -> sym_private = xmmalloc (objfile -> md,
471 sizeof (struct coff_symfile_info));
472
473 init_entry_point_info (objfile);
474
475 /* Save the section number for the text section */
476 section = bfd_get_section_by_name(abfd,".text");
477 if (section)
478 text_bfd_scnum = section->index;
479 else
480 text_bfd_scnum = -1;
481 }
482
483 /* This function is called for every section; it finds the outer limits
484 of the line table (minimum and maximum file offset) so that the
485 mainline code can read the whole thing for efficiency. */
486
487 /* ARGSUSED */
488 static void
489 find_linenos (abfd, asect, vpinfo)
490 bfd *abfd;
491 sec_ptr asect;
492 PTR vpinfo;
493 {
494 struct coff_symfile_info *info;
495 int size, count;
496 file_ptr offset, maxoff;
497
498 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
499 count = asect->lineno_count;
500 /* End of warning */
501
502 if (count == 0)
503 return;
504 size = count * local_linesz;
505
506 info = (struct coff_symfile_info *)vpinfo;
507 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
508 offset = asect->line_filepos;
509 /* End of warning */
510
511 if (offset < info->min_lineno_offset || info->min_lineno_offset == 0)
512 info->min_lineno_offset = offset;
513
514 maxoff = offset + size;
515 if (maxoff > info->max_lineno_offset)
516 info->max_lineno_offset = maxoff;
517 }
518
519
520 /* The BFD for this file -- only good while we're actively reading
521 symbols into a psymtab or a symtab. */
522
523 static bfd *symfile_bfd;
524
525 /* Read a symbol file, after initialization by coff_symfile_init. */
526 /* FIXME! Addr and Mainline are not used yet -- this will not work for
527 shared libraries or add_file! */
528
529 /* ARGSUSED */
530 static void
531 coff_symfile_read (objfile, section_offsets, mainline)
532 struct objfile *objfile;
533 struct section_offsets *section_offsets;
534 int mainline;
535 {
536 struct coff_symfile_info *info;
537 bfd *abfd = objfile->obfd;
538 coff_data_type *cdata = coff_data (abfd);
539 char *name = bfd_get_filename (abfd);
540 int desc;
541 register int val;
542 int num_symbols;
543 int symtab_offset;
544 int stringtab_offset;
545 struct cleanup *back_to;
546
547 info = (struct coff_symfile_info *) objfile -> sym_private;
548 symfile_bfd = abfd; /* Kludge for swap routines */
549
550 /* WARNING WILL ROBINSON! ACCESSING BFD-PRIVATE DATA HERE! FIXME! */
551 desc = fileno ((FILE *)(abfd->iostream)); /* File descriptor */
552 num_symbols = bfd_get_symcount (abfd); /* How many syms */
553 symtab_offset = cdata->sym_filepos; /* Symbol table file offset */
554 stringtab_offset = symtab_offset + /* String table file offset */
555 num_symbols * cdata->local_symesz;
556
557 /* Set a few file-statics that give us specific information about
558 the particular COFF file format we're reading. */
559 local_linesz = cdata->local_linesz;
560 local_n_btmask = cdata->local_n_btmask;
561 local_n_btshft = cdata->local_n_btshft;
562 local_n_tmask = cdata->local_n_tmask;
563 local_n_tshift = cdata->local_n_tshift;
564 local_linesz = cdata->local_linesz;
565 local_symesz = cdata->local_symesz;
566 local_auxesz = cdata->local_auxesz;
567
568 /* Allocate space for raw symbol and aux entries, based on their
569 space requirements as reported by BFD. */
570 temp_sym = (char *) xmalloc
571 (cdata->local_symesz + cdata->local_auxesz);
572 temp_aux = temp_sym + cdata->local_symesz;
573 back_to = make_cleanup (free_current_contents, &temp_sym);
574 /* End of warning */
575
576 /* Read the line number table, all at once. */
577 info->min_lineno_offset = 0;
578 info->max_lineno_offset = 0;
579 bfd_map_over_sections (abfd, find_linenos, (PTR)info);
580
581 make_cleanup (free_linetab, 0);
582 val = init_lineno (desc, info->min_lineno_offset,
583 info->max_lineno_offset - info->min_lineno_offset);
584 if (val < 0)
585 error ("\"%s\": error reading line numbers\n", name);
586
587 /* Now read the string table, all at once. */
588
589 make_cleanup (free_stringtab, 0);
590 val = init_stringtab (desc, stringtab_offset);
591 if (val < 0)
592 error ("\"%s\": can't get string table", name);
593
594 init_minimal_symbol_collection ();
595 make_cleanup (discard_minimal_symbols, 0);
596
597 /* Now that the executable file is positioned at symbol table,
598 process it and define symbols accordingly. */
599
600 read_coff_symtab ((long)symtab_offset, num_symbols, objfile);
601
602 /* Sort symbols alphabetically within each block. */
603
604 sort_all_symtab_syms ();
605
606 /* Install any minimal symbols that have been collected as the current
607 minimal symbols for this objfile. */
608
609 install_minimal_symbols (objfile);
610
611 do_cleanups (back_to);
612 }
613
614 static void
615 coff_new_init (ignore)
616 struct objfile *ignore;
617 {
618 /* Nothin' to do */
619 }
620
621 /* Perform any local cleanups required when we are done with a particular
622 objfile. I.E, we are in the process of discarding all symbol information
623 for an objfile, freeing up all memory held for it, and unlinking the
624 objfile struct from the global list of known objfiles. */
625
626 static void
627 coff_symfile_finish (objfile)
628 struct objfile *objfile;
629 {
630 if (objfile -> sym_private != NULL)
631 {
632 mfree (objfile -> md, objfile -> sym_private);
633 }
634 }
635
636 \f
637 /* Given pointers to a symbol table in coff style exec file,
638 analyze them and create struct symtab's describing the symbols.
639 NSYMS is the number of symbols in the symbol table.
640 We read them one at a time using read_one_sym (). */
641
642 static void
643 read_coff_symtab (symtab_offset, nsyms, objfile)
644 long symtab_offset;
645 int nsyms;
646 struct objfile *objfile;
647 {
648 FILE *stream;
649 register struct context_stack *new;
650 struct coff_symbol coff_symbol;
651 register struct coff_symbol *cs = &coff_symbol;
652 static struct internal_syment main_sym;
653 static union internal_auxent main_aux;
654 struct coff_symbol fcn_cs_saved;
655 static struct internal_syment fcn_sym_saved;
656 static union internal_auxent fcn_aux_saved;
657 struct symtab *s;
658
659 /* A .file is open. */
660 int in_source_file = 0;
661 int num_object_files = 0;
662 int next_file_symnum = -1;
663
664 /* Name of the current file. */
665 char *filestring = "";
666 int depth = 0;
667 int fcn_first_line = 0;
668 int fcn_last_line = 0;
669 int fcn_start_addr = 0;
670 long fcn_line_ptr = 0;
671 int val;
672
673 stream = bfd_cache_lookup(objfile->obfd);
674 if (!stream)
675 perror_with_name(objfile->name);
676
677 /* Work around a stdio bug in SunOS4.1.1 (this makes me nervous....
678 it's hard to know I've really worked around it. The fix should be
679 harmless, anyway). The symptom of the bug is that the first
680 fread (in read_one_sym), will (in my example) actually get data
681 from file offset 268, when the fseek was to 264 (and ftell shows
682 264). This causes all hell to break loose. I was unable to
683 reproduce this on a short test program which operated on the same
684 file, performing (I think) the same sequence of operations.
685
686 It stopped happening when I put in this rewind().
687
688 FIXME: Find out if this has been reported to Sun, whether it has
689 been fixed in a later release, etc. */
690
691 rewind (stream);
692
693 /* Position to read the symbol table. */
694 val = fseek (stream, (long)symtab_offset, 0);
695 if (val < 0)
696 perror_with_name (objfile->name);
697
698 current_objfile = objfile;
699 nlist_stream_global = stream;
700 nlist_nsyms_global = nsyms;
701 last_source_file = NULL;
702 memset (opaque_type_chain, 0, sizeof opaque_type_chain);
703
704 if (type_vector) /* Get rid of previous one */
705 free ((PTR)type_vector);
706 type_vector_length = 160;
707 type_vector = (struct type **)
708 xmalloc (type_vector_length * sizeof (struct type *));
709 memset (type_vector, 0, type_vector_length * sizeof (struct type *));
710
711 coff_start_symtab ();
712
713 symnum = 0;
714 while (symnum < nsyms)
715 {
716 QUIT; /* Make this command interruptable. */
717 read_one_sym (cs, &main_sym, &main_aux);
718
719 #ifdef SEM
720 temp_sem_val = cs->c_name[0] << 24 | cs->c_name[1] << 16 |
721 cs->c_name[2] << 8 | cs->c_name[3];
722 if (int_sem_val == temp_sem_val)
723 last_coffsem = (int) strtol (cs->c_name+4, (char **) NULL, 10);
724 #endif
725
726 if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
727 {
728 if (last_source_file)
729 coff_end_symtab (objfile);
730
731 coff_start_symtab ();
732 complete_symtab ("_globals_", 0, first_object_file_end);
733 /* done with all files, everything from here on out is globals */
734 }
735
736 /* Special case for file with type declarations only, no text. */
737 if (!last_source_file && SDB_TYPE (cs->c_type)
738 && cs->c_secnum == N_DEBUG)
739 complete_symtab (filestring, 0, 0);
740
741 /* Typedefs should not be treated as symbol definitions. */
742 if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
743 {
744 /* Record all functions -- external and static -- in minsyms. */
745 record_minimal_symbol (cs->c_name, cs->c_value, mst_text);
746
747 fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
748 fcn_start_addr = cs->c_value;
749 fcn_cs_saved = *cs;
750 fcn_sym_saved = main_sym;
751 fcn_aux_saved = main_aux;
752 continue;
753 }
754
755 switch (cs->c_sclass)
756 {
757 case C_EFCN:
758 case C_EXTDEF:
759 case C_ULABEL:
760 case C_USTATIC:
761 case C_LINE:
762 case C_ALIAS:
763 case C_HIDDEN:
764 complain (&bad_sclass_complaint, cs->c_name);
765 break;
766
767 case C_FILE:
768 /*
769 * c_value field contains symnum of next .file entry in table
770 * or symnum of first global after last .file.
771 */
772 next_file_symnum = cs->c_value;
773 filestring = getfilename (&main_aux);
774 /*
775 * Complete symbol table for last object file
776 * containing debugging information.
777 */
778 if (last_source_file)
779 {
780 coff_end_symtab (objfile);
781 coff_start_symtab ();
782 }
783 in_source_file = 1;
784 break;
785
786 case C_STAT:
787 if (cs->c_name[0] == '.') {
788 if (STREQ (cs->c_name, ".text")) {
789 /* FIXME: don't wire in ".text" as section name
790 or symbol name! */
791 if (++num_object_files == 1) {
792 /* last address of startup file */
793 first_object_file_end = cs->c_value +
794 main_aux.x_scn.x_scnlen;
795 }
796 /* Check for in_source_file deals with case of
797 a file with debugging symbols
798 followed by a later file with no symbols. */
799 if (in_source_file)
800 complete_symtab (filestring, cs->c_value,
801 main_aux.x_scn.x_scnlen);
802 in_source_file = 0;
803 }
804 /* flush rest of '.' symbols */
805 break;
806 }
807 else if (!SDB_TYPE (cs->c_type)
808 && cs->c_name[0] == 'L'
809 && (strncmp (cs->c_name, "LI%", 3) == 0
810 || strncmp (cs->c_name, "LF%", 3) == 0
811 || strncmp (cs->c_name,"LC%",3) == 0
812 || strncmp (cs->c_name,"LP%",3) == 0
813 || strncmp (cs->c_name,"LPB%",4) == 0
814 || strncmp (cs->c_name,"LBB%",4) == 0
815 || strncmp (cs->c_name,"LBE%",4) == 0
816 || strncmp (cs->c_name,"LPBX%",5) == 0))
817 /* At least on a 3b1, gcc generates swbeg and string labels
818 that look like this. Ignore them. */
819 break;
820 /* fall in for static symbols that don't start with '.' */
821 case C_EXT:
822 /* Record external symbols in minsyms if we don't have debug
823 info for them. FIXME, this is probably the wrong thing
824 to do. Why don't we record them even if we do have
825 debug symbol info? What really belongs in the minsyms
826 anyway? Fred!?? */
827 if (!SDB_TYPE (cs->c_type)) {
828 /* FIXME: This is BOGUS Will Robinson!
829 Coff should provide the SEC_CODE flag for executable sections,
830 then if we could look up sections by section number we
831 could see if the flags indicate SEC_CODE. If so, then
832 record this symbol as a function in the minimal symbol table.
833 But why are absolute syms recorded as functions, anyway? */
834 if (cs->c_secnum <= text_bfd_scnum+1) {/* text or abs */
835 record_minimal_symbol (cs->c_name, cs->c_value,
836 mst_text);
837 break;
838 } else {
839 record_minimal_symbol (cs->c_name, cs->c_value,
840 mst_data);
841 break;
842 }
843 }
844 process_coff_symbol (cs, &main_aux, objfile);
845 break;
846
847 case C_FCN:
848 if (STREQ (cs->c_name, ".bf"))
849 {
850 within_function = 1;
851
852 /* value contains address of first non-init type code */
853 /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
854 contains line number of '{' } */
855 if (cs->c_naux != 1)
856 complain (&bf_no_aux_complaint, cs->c_symnum);
857 fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
858
859 /* Might want to check that locals are 0 and
860 context_stack_depth is zero, and complain if not. */
861
862 depth = 0;
863 new = push_context (depth, fcn_start_addr);
864 fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
865 new->name = process_coff_symbol (&fcn_cs_saved,
866 &fcn_aux_saved, objfile);
867 }
868 else if (STREQ (cs->c_name, ".ef"))
869 {
870 /* the value of .ef is the address of epilogue code;
871 not useful for gdb. */
872 /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
873 contains number of lines to '}' */
874 new = pop_context ();
875 /* Stack must be empty now. */
876 if (context_stack_depth > 0 || new == NULL)
877 {
878 complain (&ef_complaint, cs->c_symnum);
879 within_function = 0;
880 break;
881 }
882 if (cs->c_naux != 1)
883 {
884 complain (&ef_no_aux_complaint, cs->c_symnum);
885 fcn_last_line = 0x7FFFFFFF;
886 }
887 else
888 {
889 fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
890 }
891 enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line);
892
893 finish_block (new->name, &local_symbols, new->old_blocks,
894 new->start_addr,
895 #if defined (FUNCTION_EPILOGUE_SIZE)
896 /* This macro should be defined only on
897 machines where the
898 fcn_aux_saved.x_sym.x_misc.x_fsize
899 field is always zero.
900 So use the .bf record information that
901 points to the epilogue and add the size
902 of the epilogue. */
903 cs->c_value + FUNCTION_EPILOGUE_SIZE,
904 #else
905 fcn_cs_saved.c_value +
906 fcn_aux_saved.x_sym.x_misc.x_fsize,
907 #endif
908 objfile
909 );
910 within_function = 0;
911 }
912 break;
913
914 case C_BLOCK:
915 if (STREQ (cs->c_name, ".bb"))
916 {
917 push_context (++depth, cs->c_value);
918 }
919 else if (STREQ (cs->c_name, ".eb"))
920 {
921 new = pop_context ();
922 if (depth-- != new->depth)
923 {
924 complain (&eb_complaint, (char *)symnum);
925 break;
926 }
927 if (local_symbols && context_stack_depth > 0)
928 {
929 /* Make a block for the local symbols within. */
930 finish_block (0, &local_symbols, new->old_blocks,
931 new->start_addr, cs->c_value, objfile);
932 }
933 /* Now pop locals of block just finished. */
934 local_symbols = new->locals;
935 }
936 break;
937
938 default:
939 process_coff_symbol (cs, &main_aux, objfile);
940 break;
941 }
942 }
943
944 if (last_source_file)
945 coff_end_symtab (objfile);
946
947 /* Patch up any opaque types (references to types that are not defined
948 in the file where they are referenced, e.g. "struct foo *bar"). */
949 ALL_OBJFILE_SYMTABS (objfile, s)
950 patch_opaque_types (s);
951
952 current_objfile = NULL;
953 }
954 \f
955 /* Routines for reading headers and symbols from executable. */
956
957 #ifdef FIXME
958 /* Move these XXXMAGIC symbol defns into BFD! */
959
960 /* Read COFF file header, check magic number,
961 and return number of symbols. */
962 read_file_hdr (chan, file_hdr)
963 int chan;
964 FILHDR *file_hdr;
965 {
966 lseek (chan, 0L, 0);
967 if (myread (chan, (char *)file_hdr, FILHSZ) < 0)
968 return -1;
969
970 switch (file_hdr->f_magic)
971 {
972 #ifdef MC68MAGIC
973 case MC68MAGIC:
974 #endif
975 #ifdef NS32GMAGIC
976 case NS32GMAGIC:
977 case NS32SMAGIC:
978 #endif
979 #ifdef I386MAGIC
980 case I386MAGIC:
981 #endif
982 #ifdef CLIPPERMAGIC
983 case CLIPPERMAGIC:
984 #endif
985 #if defined (MC68KWRMAGIC) \
986 && (!defined (MC68MAGIC) || MC68KWRMAGIC != MC68MAGIC)
987 case MC68KWRMAGIC:
988 #endif
989 #ifdef MC68KROMAGIC
990 case MC68KROMAGIC:
991 case MC68KPGMAGIC:
992 #endif
993 #ifdef MC88DGMAGIC
994 case MC88DGMAGIC:
995 #endif
996 #ifdef MC88MAGIC
997 case MC88MAGIC:
998 #endif
999 #ifdef I960ROMAGIC
1000 case I960ROMAGIC: /* Intel 960 */
1001 #endif
1002 #ifdef I960RWMAGIC
1003 case I960RWMAGIC: /* Intel 960 */
1004 #endif
1005 return file_hdr->f_nsyms;
1006
1007 default:
1008 #ifdef BADMAG
1009 if (BADMAG(file_hdr))
1010 return -1;
1011 else
1012 return file_hdr->f_nsyms;
1013 #else
1014 return -1;
1015 #endif
1016 }
1017 }
1018 #endif
1019
1020 /* Read the next symbol, swap it, and return it in both internal_syment
1021 form, and coff_symbol form. Also return its first auxent, if any,
1022 in internal_auxent form, and skip any other auxents. */
1023
1024 static void
1025 read_one_sym (cs, sym, aux)
1026 register struct coff_symbol *cs;
1027 register struct internal_syment *sym;
1028 register union internal_auxent *aux;
1029 {
1030 int i;
1031
1032 cs->c_symnum = symnum;
1033 fread (temp_sym, local_symesz, 1, nlist_stream_global);
1034 bfd_coff_swap_sym_in (symfile_bfd, temp_sym, (char *)sym);
1035 cs->c_naux = sym->n_numaux & 0xff;
1036 if (cs->c_naux >= 1)
1037 {
1038 fread (temp_aux, local_auxesz, 1, nlist_stream_global);
1039 bfd_coff_swap_aux_in (symfile_bfd, temp_aux, sym->n_type, sym->n_sclass,
1040 (char *)aux);
1041 /* If more than one aux entry, read past it (only the first aux
1042 is important). */
1043 for (i = 1; i < cs->c_naux; i++)
1044 fread (temp_aux, local_auxesz, 1, nlist_stream_global);
1045 }
1046 cs->c_name = getsymname (sym);
1047 cs->c_value = sym->n_value;
1048 cs->c_sclass = (sym->n_sclass & 0xff);
1049 cs->c_secnum = sym->n_scnum;
1050 cs->c_type = (unsigned) sym->n_type;
1051 if (!SDB_TYPE (cs->c_type))
1052 cs->c_type = 0;
1053
1054 symnum += 1 + cs->c_naux;
1055 }
1056 \f
1057 /* Support for string table handling */
1058
1059 static char *stringtab = NULL;
1060
1061 static int
1062 init_stringtab (chan, offset)
1063 int chan;
1064 long offset;
1065 {
1066 long length;
1067 int val;
1068 unsigned char lengthbuf[4];
1069
1070 free_stringtab ();
1071
1072 if (lseek (chan, offset, 0) < 0)
1073 return -1;
1074
1075 val = myread (chan, (char *)lengthbuf, sizeof lengthbuf);
1076 length = bfd_h_get_32 (symfile_bfd, lengthbuf);
1077
1078 /* If no string table is needed, then the file may end immediately
1079 after the symbols. Just return with `stringtab' set to null. */
1080 if (val != sizeof lengthbuf || length < sizeof lengthbuf)
1081 return 0;
1082
1083 stringtab = (char *) xmalloc (length);
1084 memcpy (stringtab, &length, sizeof length);
1085 if (length == sizeof length) /* Empty table -- just the count */
1086 return 0;
1087
1088 val = myread (chan, stringtab + sizeof lengthbuf, length - sizeof lengthbuf);
1089 if (val != length - sizeof lengthbuf || stringtab[length - 1] != '\0')
1090 return -1;
1091
1092 return 0;
1093 }
1094
1095 static void
1096 free_stringtab ()
1097 {
1098 if (stringtab)
1099 free (stringtab);
1100 stringtab = NULL;
1101 }
1102
1103 static char *
1104 getsymname (symbol_entry)
1105 struct internal_syment *symbol_entry;
1106 {
1107 static char buffer[SYMNMLEN+1];
1108 char *result;
1109
1110 if (symbol_entry->_n._n_n._n_zeroes == 0)
1111 {
1112 result = stringtab + symbol_entry->_n._n_n._n_offset;
1113 }
1114 else
1115 {
1116 strncpy (buffer, symbol_entry->_n._n_name, SYMNMLEN);
1117 buffer[SYMNMLEN] = '\0';
1118 result = buffer;
1119 }
1120 return result;
1121 }
1122
1123 /* Extract the file name from the aux entry of a C_FILE symbol. Return
1124 only the last component of the name. Result is in static storage and
1125 is only good for temporary use. */
1126
1127 static char *
1128 getfilename (aux_entry)
1129 union internal_auxent *aux_entry;
1130 {
1131 static char buffer[BUFSIZ];
1132 register char *temp;
1133 char *result;
1134
1135 if (aux_entry->x_file.x_n.x_zeroes == 0)
1136 strcpy (buffer, stringtab + aux_entry->x_file.x_n.x_offset);
1137 else
1138 {
1139 strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1140 buffer[FILNMLEN] = '\0';
1141 }
1142 result = buffer;
1143 if ((temp = strrchr (result, '/')) != NULL)
1144 result = temp + 1;
1145 return (result);
1146 }
1147 \f
1148 /* Support for line number handling */
1149 static char *linetab = NULL;
1150 static long linetab_offset;
1151 static unsigned long linetab_size;
1152
1153 /* Read in all the line numbers for fast lookups later. Leave them in
1154 external (unswapped) format in memory; we'll swap them as we enter
1155 them into GDB's data structures. */
1156
1157 static int
1158 init_lineno (chan, offset, size)
1159 int chan;
1160 long offset;
1161 int size;
1162 {
1163 int val;
1164
1165 linetab_offset = offset;
1166 linetab_size = size;
1167
1168 free_linetab();
1169
1170 if (size == 0)
1171 return 0;
1172
1173 if (lseek (chan, offset, 0) < 0)
1174 return -1;
1175
1176 /* Allocate the desired table, plus a sentinel */
1177 linetab = (char *) xmalloc (size + local_linesz);
1178
1179 val = myread (chan, linetab, size);
1180 if (val != size)
1181 return -1;
1182
1183 /* Terminate it with an all-zero sentinel record */
1184 memset (linetab + size, 0, local_linesz);
1185
1186 return 0;
1187 }
1188
1189 static void
1190 free_linetab ()
1191 {
1192 if (linetab)
1193 free (linetab);
1194 linetab = NULL;
1195 }
1196
1197 #if !defined (L_LNNO32)
1198 #define L_LNNO32(lp) ((lp)->l_lnno)
1199 #endif
1200
1201 static void
1202 enter_linenos (file_offset, first_line, last_line)
1203 long file_offset;
1204 register int first_line;
1205 register int last_line;
1206 {
1207 register char *rawptr;
1208 struct internal_lineno lptr;
1209
1210 if (file_offset < linetab_offset)
1211 {
1212 complain (&lineno_complaint, file_offset);
1213 if (file_offset > linetab_size) /* Too big to be an offset? */
1214 return;
1215 file_offset += linetab_offset; /* Try reading at that linetab offset */
1216 }
1217
1218 rawptr = &linetab[file_offset - linetab_offset];
1219
1220 /* skip first line entry for each function */
1221 rawptr += local_linesz;
1222 /* line numbers start at one for the first line of the function */
1223 first_line--;
1224
1225 for (;;) {
1226 bfd_coff_swap_lineno_in (symfile_bfd, rawptr, &lptr);
1227 rawptr += local_linesz;
1228 /* The next function, or the sentinel, will have L_LNNO32 zero; we exit. */
1229 if (L_LNNO32 (&lptr) && L_LNNO32 (&lptr) <= last_line)
1230 coff_record_line (first_line + L_LNNO32 (&lptr), lptr.l_addr.l_paddr);
1231 else
1232 break;
1233 }
1234 }
1235 \f
1236 static void
1237 patch_type (type, real_type)
1238 struct type *type;
1239 struct type *real_type;
1240 {
1241 register struct type *target = TYPE_TARGET_TYPE (type);
1242 register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1243 int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1244
1245 TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1246 TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1247 TYPE_FIELDS (target) = (struct field *) TYPE_ALLOC (target, field_size);
1248
1249 memcpy (TYPE_FIELDS (target), TYPE_FIELDS (real_target), field_size);
1250
1251 if (TYPE_NAME (real_target))
1252 {
1253 if (TYPE_NAME (target))
1254 free (TYPE_NAME (target));
1255 TYPE_NAME (target) = concat (TYPE_NAME (real_target), NULL);
1256 }
1257 }
1258
1259 /* Patch up all appropriate typedef symbols in the opaque_type_chains
1260 so that they can be used to print out opaque data structures properly. */
1261
1262 static void
1263 patch_opaque_types (s)
1264 struct symtab *s;
1265 {
1266 register struct block *b;
1267 register int i;
1268 register struct symbol *real_sym;
1269
1270 /* Go through the per-file symbols only */
1271 b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), STATIC_BLOCK);
1272 for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--)
1273 {
1274 /* Find completed typedefs to use to fix opaque ones.
1275 Remove syms from the chain when their types are stored,
1276 but search the whole chain, as there may be several syms
1277 from different files with the same name. */
1278 real_sym = BLOCK_SYM (b, i);
1279 if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1280 SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE &&
1281 TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1282 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1283 {
1284 register char *name = SYMBOL_NAME (real_sym);
1285 register int hash = hashname (name);
1286 register struct symbol *sym, *prev;
1287
1288 prev = 0;
1289 for (sym = opaque_type_chain[hash]; sym;)
1290 {
1291 if (name[0] == SYMBOL_NAME (sym)[0] &&
1292 STREQ (name + 1, SYMBOL_NAME (sym) + 1))
1293 {
1294 if (prev)
1295 {
1296 SYMBOL_VALUE_CHAIN (prev) = SYMBOL_VALUE_CHAIN (sym);
1297 }
1298 else
1299 {
1300 opaque_type_chain[hash] = SYMBOL_VALUE_CHAIN (sym);
1301 }
1302
1303 patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1304
1305 if (prev)
1306 {
1307 sym = SYMBOL_VALUE_CHAIN (prev);
1308 }
1309 else
1310 {
1311 sym = opaque_type_chain[hash];
1312 }
1313 }
1314 else
1315 {
1316 prev = sym;
1317 sym = SYMBOL_VALUE_CHAIN (sym);
1318 }
1319 }
1320 }
1321 }
1322 }
1323 \f
1324 static struct symbol *
1325 process_coff_symbol (cs, aux, objfile)
1326 register struct coff_symbol *cs;
1327 register union internal_auxent *aux;
1328 struct objfile *objfile;
1329 {
1330 register struct symbol *sym
1331 = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
1332 sizeof (struct symbol));
1333 char *name;
1334 struct type *temptype;
1335
1336 memset (sym, 0, sizeof (struct symbol));
1337 name = cs->c_name;
1338 name = EXTERNAL_NAME (name, objfile->obfd);
1339 SYMBOL_NAME (sym) = obstack_copy0 (&objfile->symbol_obstack, name,
1340 strlen (name));
1341
1342 /* default assumptions */
1343 SYMBOL_VALUE (sym) = cs->c_value;
1344 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1345
1346 if (ISFCN (cs->c_type))
1347 {
1348 #if 0
1349 /* FIXME: This has NOT been tested. The DBX version has.. */
1350 /* Generate a template for the type of this function. The
1351 types of the arguments will be added as we read the symbol
1352 table. */
1353 struct type *new = (struct type *)
1354 obstack_alloc (&objfile->symbol_obstack, sizeof (struct type));
1355
1356 memcpy (new, lookup_function_type (decode_function_type (cs, cs->c_type, aux)),
1357 sizeof(struct type));
1358 SYMBOL_TYPE (sym) = new;
1359 in_function_type = SYMBOL_TYPE(sym);
1360 #else
1361 SYMBOL_TYPE(sym) =
1362 lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1363 #endif
1364
1365 SYMBOL_CLASS (sym) = LOC_BLOCK;
1366 if (cs->c_sclass == C_STAT)
1367 add_symbol_to_list (sym, &file_symbols);
1368 else if (cs->c_sclass == C_EXT)
1369 add_symbol_to_list (sym, &global_symbols);
1370 }
1371 else
1372 {
1373 SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1374 switch (cs->c_sclass)
1375 {
1376 case C_NULL:
1377 break;
1378
1379 case C_AUTO:
1380 SYMBOL_CLASS (sym) = LOC_LOCAL;
1381 add_symbol_to_list (sym, &local_symbols);
1382 break;
1383
1384 case C_EXT:
1385 SYMBOL_CLASS (sym) = LOC_STATIC;
1386 SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1387 add_symbol_to_list (sym, &global_symbols);
1388 break;
1389
1390 case C_STAT:
1391 SYMBOL_CLASS (sym) = LOC_STATIC;
1392 SYMBOL_VALUE_ADDRESS (sym) = (CORE_ADDR) cs->c_value;
1393 if (within_function) {
1394 /* Static symbol of local scope */
1395 add_symbol_to_list (sym, &local_symbols);
1396 }
1397 else {
1398 /* Static symbol at top level of file */
1399 add_symbol_to_list (sym, &file_symbols);
1400 }
1401 break;
1402
1403 #ifdef C_GLBLREG /* AMD coff */
1404 case C_GLBLREG:
1405 #endif
1406 case C_REG:
1407 SYMBOL_CLASS (sym) = LOC_REGISTER;
1408 SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
1409 add_symbol_to_list (sym, &local_symbols);
1410 break;
1411
1412 case C_LABEL:
1413 break;
1414
1415 case C_ARG:
1416 SYMBOL_CLASS (sym) = LOC_ARG;
1417 #if 0
1418 /* FIXME: This has not been tested. */
1419 /* Add parameter to function. */
1420 add_param_to_type(&in_function_type,sym);
1421 #endif
1422 add_symbol_to_list (sym, &local_symbols);
1423 #if !defined (BELIEVE_PCC_PROMOTION) && (TARGET_BYTE_ORDER == BIG_ENDIAN)
1424 /* If PCC says a parameter is a short or a char,
1425 aligned on an int boundary, realign it to the "little end"
1426 of the int. */
1427 temptype = lookup_fundamental_type (current_objfile, FT_INTEGER);
1428 if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1429 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT
1430 && 0 == SYMBOL_VALUE (sym) % TYPE_LENGTH (temptype))
1431 {
1432 SYMBOL_VALUE (sym) += TYPE_LENGTH (temptype)
1433 - TYPE_LENGTH (SYMBOL_TYPE (sym));
1434 }
1435 #endif
1436 break;
1437
1438 case C_REGPARM:
1439 SYMBOL_CLASS (sym) = LOC_REGPARM;
1440 SYMBOL_VALUE (sym) = SDB_REG_TO_REGNUM(cs->c_value);
1441 add_symbol_to_list (sym, &local_symbols);
1442 #if !defined (BELIEVE_PCC_PROMOTION)
1443 /* FIXME: This should retain the current type, since it's just
1444 a register value. gnu@adobe, 26Feb93 */
1445 /* If PCC says a parameter is a short or a char,
1446 it is really an int. */
1447 temptype = lookup_fundamental_type (current_objfile, FT_INTEGER);
1448 if (TYPE_LENGTH (SYMBOL_TYPE (sym)) < TYPE_LENGTH (temptype)
1449 && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_INT)
1450 {
1451 SYMBOL_TYPE (sym) = TYPE_UNSIGNED (SYMBOL_TYPE (sym))
1452 ? lookup_fundamental_type (current_objfile,
1453 FT_UNSIGNED_INTEGER)
1454 : temptype;
1455 }
1456 #endif
1457 break;
1458
1459 case C_TPDEF:
1460 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1461 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1462
1463 /* If type has no name, give it one */
1464 if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
1465 TYPE_NAME (SYMBOL_TYPE (sym)) = concat (SYMBOL_NAME (sym), NULL);
1466
1467 /* Keep track of any type which points to empty structured type,
1468 so it can be filled from a definition from another file. A
1469 simple forward reference (TYPE_CODE_UNDEF) is not an
1470 empty structured type, though; the forward references
1471 work themselves out via the magic of coff_lookup_type. */
1472 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1473 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0 &&
1474 TYPE_CODE (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) !=
1475 TYPE_CODE_UNDEF)
1476 {
1477 register int i = hashname (SYMBOL_NAME (sym));
1478
1479 SYMBOL_VALUE_CHAIN (sym) = opaque_type_chain[i];
1480 opaque_type_chain[i] = sym;
1481 }
1482 add_symbol_to_list (sym, &file_symbols);
1483 break;
1484
1485 case C_STRTAG:
1486 case C_UNTAG:
1487 case C_ENTAG:
1488 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1489 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1490
1491 /* Some compilers try to be helpful by inventing "fake"
1492 names for anonymous enums, structures, and unions, like
1493 "~0fake" or ".0fake". Thanks, but no thanks... */
1494 if (TYPE_TAG_NAME (SYMBOL_TYPE (sym)) == 0)
1495 if (SYMBOL_NAME(sym) != NULL
1496 && *SYMBOL_NAME(sym) != '~'
1497 && *SYMBOL_NAME(sym) != '.')
1498 TYPE_TAG_NAME (SYMBOL_TYPE (sym)) =
1499 concat (SYMBOL_NAME (sym), NULL);
1500
1501 add_symbol_to_list (sym, &file_symbols);
1502 break;
1503
1504 default:
1505 break;
1506 }
1507 }
1508 return sym;
1509 }
1510 \f
1511 /* Decode a coff type specifier;
1512 return the type that is meant. */
1513
1514 static
1515 struct type *
1516 decode_type (cs, c_type, aux)
1517 register struct coff_symbol *cs;
1518 unsigned int c_type;
1519 register union internal_auxent *aux;
1520 {
1521 register struct type *type = 0;
1522 unsigned int new_c_type;
1523
1524 if (c_type & ~N_BTMASK)
1525 {
1526 new_c_type = DECREF (c_type);
1527 if (ISPTR (c_type))
1528 {
1529 type = decode_type (cs, new_c_type, aux);
1530 type = lookup_pointer_type (type);
1531 }
1532 else if (ISFCN (c_type))
1533 {
1534 type = decode_type (cs, new_c_type, aux);
1535 type = lookup_function_type (type);
1536 }
1537 else if (ISARY (c_type))
1538 {
1539 int i, n;
1540 register unsigned short *dim;
1541 struct type *base_type, *index_type, *range_type;
1542
1543 /* Define an array type. */
1544 /* auxent refers to array, not base type */
1545 if (aux->x_sym.x_tagndx.l == 0)
1546 cs->c_naux = 0;
1547
1548 /* shift the indices down */
1549 dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1550 i = 1;
1551 n = dim[0];
1552 for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1553 *dim = *(dim + 1);
1554 *dim = 0;
1555
1556 base_type = decode_type (cs, new_c_type, aux);
1557 index_type = lookup_fundamental_type (current_objfile, FT_INTEGER);
1558 range_type =
1559 create_range_type ((struct type *) NULL, index_type, 0, n - 1);
1560 type =
1561 create_array_type ((struct type *) NULL, base_type, range_type);
1562 }
1563 return type;
1564 }
1565
1566 /* Reference to existing type. This only occurs with the
1567 struct, union, and enum types. EPI a29k coff
1568 fakes us out by producing aux entries with a nonzero
1569 x_tagndx for definitions of structs, unions, and enums, so we
1570 have to check the c_sclass field. SCO 3.2v4 cc gets confused
1571 with pointers to pointers to defined structs, and generates
1572 negative x_tagndx fields. */
1573 if (cs->c_naux > 0 && aux->x_sym.x_tagndx.l != 0)
1574 {
1575 if (cs->c_sclass != C_STRTAG
1576 && cs->c_sclass != C_UNTAG
1577 && cs->c_sclass != C_ENTAG
1578 && aux->x_sym.x_tagndx.l >= 0)
1579 {
1580 type = coff_alloc_type (aux->x_sym.x_tagndx.l);
1581 return type;
1582 } else {
1583 complain (&tagndx_bad_complaint, cs->c_name);
1584 /* And fall through to decode_base_type... */
1585 }
1586 }
1587
1588 return decode_base_type (cs, BTYPE (c_type), aux);
1589 }
1590
1591 /* Decode a coff type specifier for function definition;
1592 return the type that the function returns. */
1593
1594 static
1595 struct type *
1596 decode_function_type (cs, c_type, aux)
1597 register struct coff_symbol *cs;
1598 unsigned int c_type;
1599 register union internal_auxent *aux;
1600 {
1601 if (aux->x_sym.x_tagndx.l == 0)
1602 cs->c_naux = 0; /* auxent refers to function, not base type */
1603
1604 return decode_type (cs, DECREF (c_type), aux);
1605 }
1606 \f
1607 /* basic C types */
1608
1609 static
1610 struct type *
1611 decode_base_type (cs, c_type, aux)
1612 register struct coff_symbol *cs;
1613 unsigned int c_type;
1614 register union internal_auxent *aux;
1615 {
1616 struct type *type;
1617
1618 switch (c_type)
1619 {
1620 case T_NULL:
1621 /* shows up with "void (*foo)();" structure members */
1622 return lookup_fundamental_type (current_objfile, FT_VOID);
1623
1624 #if 0
1625 /* DGUX actually defines both T_ARG and T_VOID to the same value. */
1626 #ifdef T_ARG
1627 case T_ARG:
1628 /* Shows up in DGUX, I think. Not sure where. */
1629 return lookup_fundamental_type (current_objfile, FT_VOID); /* shouldn't show up here */
1630 #endif
1631 #endif /* 0 */
1632
1633 #ifdef T_VOID
1634 case T_VOID:
1635 /* Intel 960 COFF has this symbol and meaning. */
1636 return lookup_fundamental_type (current_objfile, FT_VOID);
1637 #endif
1638
1639 case T_CHAR:
1640 return lookup_fundamental_type (current_objfile, FT_CHAR);
1641
1642 case T_SHORT:
1643 return lookup_fundamental_type (current_objfile, FT_SHORT);
1644
1645 case T_INT:
1646 return lookup_fundamental_type (current_objfile, FT_INTEGER);
1647
1648 case T_LONG:
1649 return lookup_fundamental_type (current_objfile, FT_LONG);
1650
1651 case T_FLOAT:
1652 return lookup_fundamental_type (current_objfile, FT_FLOAT);
1653
1654 case T_DOUBLE:
1655 return lookup_fundamental_type (current_objfile, FT_DBL_PREC_FLOAT);
1656
1657 case T_STRUCT:
1658 if (cs->c_naux != 1)
1659 {
1660 /* anonymous structure type */
1661 type = coff_alloc_type (cs->c_symnum);
1662 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1663 TYPE_NAME (type) = NULL;
1664 /* This used to set the tag to "<opaque>". But I think setting it
1665 to NULL is right, and the printing code can print it as
1666 "struct {...}". */
1667 TYPE_TAG_NAME (type) = NULL;
1668 INIT_CPLUS_SPECIFIC(type);
1669 TYPE_LENGTH (type) = 0;
1670 TYPE_FIELDS (type) = 0;
1671 TYPE_NFIELDS (type) = 0;
1672 }
1673 else
1674 {
1675 type = coff_read_struct_type (cs->c_symnum,
1676 aux->x_sym.x_misc.x_lnsz.x_size,
1677 aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1678 }
1679 return type;
1680
1681 case T_UNION:
1682 if (cs->c_naux != 1)
1683 {
1684 /* anonymous union type */
1685 type = coff_alloc_type (cs->c_symnum);
1686 TYPE_NAME (type) = NULL;
1687 /* This used to set the tag to "<opaque>". But I think setting it
1688 to NULL is right, and the printing code can print it as
1689 "union {...}". */
1690 TYPE_TAG_NAME (type) = NULL;
1691 INIT_CPLUS_SPECIFIC(type);
1692 TYPE_LENGTH (type) = 0;
1693 TYPE_FIELDS (type) = 0;
1694 TYPE_NFIELDS (type) = 0;
1695 }
1696 else
1697 {
1698 type = coff_read_struct_type (cs->c_symnum,
1699 aux->x_sym.x_misc.x_lnsz.x_size,
1700 aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1701 }
1702 TYPE_CODE (type) = TYPE_CODE_UNION;
1703 return type;
1704
1705 case T_ENUM:
1706 if (cs->c_naux != 1)
1707 {
1708 /* anonymous enum type */
1709 type = coff_alloc_type (cs->c_symnum);
1710 TYPE_CODE (type) = TYPE_CODE_ENUM;
1711 TYPE_NAME (type) = NULL;
1712 /* This used to set the tag to "<opaque>". But I think setting it
1713 to NULL is right, and the printing code can print it as
1714 "enum {...}". */
1715 TYPE_TAG_NAME (type) = NULL;
1716 TYPE_LENGTH (type) = 0;
1717 TYPE_FIELDS (type) = 0;
1718 TYPE_NFIELDS(type) = 0;
1719 }
1720 else
1721 {
1722 type = coff_read_enum_type (cs->c_symnum,
1723 aux->x_sym.x_misc.x_lnsz.x_size,
1724 aux->x_sym.x_fcnary.x_fcn.x_endndx.l);
1725 }
1726 return type;
1727
1728 case T_MOE:
1729 /* shouldn't show up here */
1730 break;
1731
1732 case T_UCHAR:
1733 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_CHAR);
1734
1735 case T_USHORT:
1736 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_SHORT);
1737
1738 case T_UINT:
1739 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_INTEGER);
1740
1741 case T_ULONG:
1742 return lookup_fundamental_type (current_objfile, FT_UNSIGNED_LONG);
1743 }
1744 complain (&unexpected_type_complaint, cs->c_name);
1745 return lookup_fundamental_type (current_objfile, FT_VOID);
1746 }
1747 \f
1748 /* This page contains subroutines of read_type. */
1749
1750 /* Read the description of a structure (or union type)
1751 and return an object describing the type. */
1752
1753 static struct type *
1754 coff_read_struct_type (index, length, lastsym)
1755 int index;
1756 int length;
1757 int lastsym;
1758 {
1759 struct nextfield
1760 {
1761 struct nextfield *next;
1762 struct field field;
1763 };
1764
1765 register struct type *type;
1766 register struct nextfield *list = 0;
1767 struct nextfield *new;
1768 int nfields = 0;
1769 register int n;
1770 char *name;
1771 struct coff_symbol member_sym;
1772 register struct coff_symbol *ms = &member_sym;
1773 struct internal_syment sub_sym;
1774 union internal_auxent sub_aux;
1775 int done = 0;
1776
1777 type = coff_alloc_type (index);
1778 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1779 INIT_CPLUS_SPECIFIC(type);
1780 TYPE_LENGTH (type) = length;
1781
1782 while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1783 {
1784 read_one_sym (ms, &sub_sym, &sub_aux);
1785 name = ms->c_name;
1786 name = EXTERNAL_NAME (name, current_objfile->obfd);
1787
1788 switch (ms->c_sclass)
1789 {
1790 case C_MOS:
1791 case C_MOU:
1792
1793 /* Get space to record the next field's data. */
1794 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1795 new->next = list;
1796 list = new;
1797
1798 /* Save the data. */
1799 list->field.name = savestring (name, strlen (name));
1800 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1801 list->field.bitpos = 8 * ms->c_value;
1802 list->field.bitsize = 0;
1803 nfields++;
1804 break;
1805
1806 case C_FIELD:
1807
1808 /* Get space to record the next field's data. */
1809 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1810 new->next = list;
1811 list = new;
1812
1813 /* Save the data. */
1814 list->field.name = savestring (name, strlen (name));
1815 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1816 list->field.bitpos = ms->c_value;
1817 list->field.bitsize = sub_aux.x_sym.x_misc.x_lnsz.x_size;
1818 nfields++;
1819 break;
1820
1821 case C_EOS:
1822 done = 1;
1823 break;
1824 }
1825 }
1826 /* Now create the vector of fields, and record how big it is. */
1827
1828 TYPE_NFIELDS (type) = nfields;
1829 TYPE_FIELDS (type) = (struct field *)
1830 TYPE_ALLOC (type, sizeof (struct field) * nfields);
1831
1832 /* Copy the saved-up fields into the field vector. */
1833
1834 for (n = nfields; list; list = list->next)
1835 TYPE_FIELD (type, --n) = list->field;
1836
1837 return type;
1838 }
1839 \f
1840 /* Read a definition of an enumeration type,
1841 and create and return a suitable type object.
1842 Also defines the symbols that represent the values of the type. */
1843
1844 /* ARGSUSED */
1845 static struct type *
1846 coff_read_enum_type (index, length, lastsym)
1847 int index;
1848 int length;
1849 int lastsym;
1850 {
1851 register struct symbol *sym;
1852 register struct type *type;
1853 int nsyms = 0;
1854 int done = 0;
1855 struct pending **symlist;
1856 struct coff_symbol member_sym;
1857 register struct coff_symbol *ms = &member_sym;
1858 struct internal_syment sub_sym;
1859 union internal_auxent sub_aux;
1860 struct pending *osyms, *syms;
1861 int o_nsyms;
1862 register int n;
1863 char *name;
1864
1865 type = coff_alloc_type (index);
1866 if (within_function)
1867 symlist = &local_symbols;
1868 else
1869 symlist = &file_symbols;
1870 osyms = *symlist;
1871 o_nsyms = osyms ? osyms->nsyms : 0;
1872
1873 while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1874 {
1875 read_one_sym (ms, &sub_sym, &sub_aux);
1876 name = ms->c_name;
1877 name = EXTERNAL_NAME (name, current_objfile->obfd);
1878
1879 switch (ms->c_sclass)
1880 {
1881 case C_MOE:
1882 sym = (struct symbol *) xmalloc (sizeof (struct symbol));
1883 memset (sym, 0, sizeof (struct symbol));
1884
1885 SYMBOL_NAME (sym) = savestring (name, strlen (name));
1886 SYMBOL_CLASS (sym) = LOC_CONST;
1887 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1888 SYMBOL_VALUE (sym) = ms->c_value;
1889 add_symbol_to_list (sym, symlist);
1890 nsyms++;
1891 break;
1892
1893 case C_EOS:
1894 /* Sometimes the linker (on 386/ix 2.0.2 at least) screws
1895 up the count of how many symbols to read. So stop
1896 on .eos. */
1897 done = 1;
1898 break;
1899 }
1900 }
1901
1902 /* Now fill in the fields of the type-structure. */
1903
1904 if (length > 0)
1905 TYPE_LENGTH (type) = length;
1906 else
1907 TYPE_LENGTH (type) = TARGET_INT_BIT / TARGET_CHAR_BIT; /* Assume ints */
1908 TYPE_CODE (type) = TYPE_CODE_ENUM;
1909 TYPE_NFIELDS (type) = nsyms;
1910 TYPE_FIELDS (type) = (struct field *)
1911 TYPE_ALLOC (type, sizeof (struct field) * nsyms);
1912
1913 /* Find the symbols for the values and put them into the type.
1914 The symbols can be found in the symlist that we put them on
1915 to cause them to be defined. osyms contains the old value
1916 of that symlist; everything up to there was defined by us. */
1917 /* Note that we preserve the order of the enum constants, so
1918 that in something like "enum {FOO, LAST_THING=FOO}" we print
1919 FOO, not LAST_THING. */
1920
1921 for (syms = *symlist, n = 0; syms; syms = syms->next)
1922 {
1923 int j = 0;
1924 if (syms == osyms)
1925 j = o_nsyms;
1926 for (; j < syms->nsyms; j++,n++)
1927 {
1928 struct symbol *xsym = syms->symbol[j];
1929 SYMBOL_TYPE (xsym) = type;
1930 TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym);
1931 TYPE_FIELD_VALUE (type, n) = 0;
1932 TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym);
1933 TYPE_FIELD_BITSIZE (type, n) = 0;
1934 }
1935 if (syms == osyms)
1936 break;
1937 }
1938
1939 #if 0
1940 /* This screws up perfectly good C programs with enums. FIXME. */
1941 /* Is this Modula-2's BOOLEAN type? Flag it as such if so. */
1942 if(TYPE_NFIELDS(type) == 2 &&
1943 ((STREQ(TYPE_FIELD_NAME(type,0),"TRUE") &&
1944 STREQ(TYPE_FIELD_NAME(type,1),"FALSE")) ||
1945 (STREQ(TYPE_FIELD_NAME(type,1),"TRUE") &&
1946 STREQ(TYPE_FIELD_NAME(type,0),"FALSE"))))
1947 TYPE_CODE(type) = TYPE_CODE_BOOL;
1948 #endif
1949 return type;
1950 }
1951
1952 /* Fake up support for relocating symbol addresses. FIXME. */
1953
1954 struct section_offsets coff_symfile_faker = {0};
1955
1956 struct section_offsets *
1957 coff_symfile_offsets (objfile, addr)
1958 struct objfile *objfile;
1959 CORE_ADDR addr;
1960 {
1961 return &coff_symfile_faker;
1962 }
1963
1964 /* Register our ability to parse symbols for coff BFD files */
1965
1966 static struct sym_fns coff_sym_fns =
1967 {
1968 "coff", /* sym_name: name or name prefix of BFD target type */
1969 4, /* sym_namelen: number of significant sym_name chars */
1970 coff_new_init, /* sym_new_init: init anything gbl to entire symtab */
1971 coff_symfile_init, /* sym_init: read initial info, setup for sym_read() */
1972 coff_symfile_read, /* sym_read: read a symbol file into symtab */
1973 coff_symfile_finish, /* sym_finish: finished with file, cleanup */
1974 coff_symfile_offsets, /* sym_offsets: xlate external to internal form */
1975 NULL /* next: pointer to next struct sym_fns */
1976 };
1977
1978 void
1979 _initialize_coffread ()
1980 {
1981 add_symtab_fns(&coff_sym_fns);
1982 }
This page took 0.082389 seconds and 4 git commands to generate.