gdb-3.5
[deliverable/binutils-gdb.git] / gdb / coffread.c
1 /* Read coff symbol tables and convert to internal format, for GDB.
2 Design and support routines derived from dbxread.c, and UMAX COFF
3 specific routines written 9/1/87 by David D. Johnson, Brown University.
4 Revised 11/27/87 ddj@cs.brown.edu
5 Copyright (C) 1987, 1988, 1989 Free Software Foundation, Inc.
6
7 This file is part of GDB.
8
9 GDB is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 1, or (at your option)
12 any later version.
13
14 GDB is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with GDB; see the file COPYING. If not, write to
21 the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
22 \f
23 #include <stdio.h>
24 #include "defs.h"
25 #include "param.h"
26 #ifdef COFF_FORMAT
27 #include "symtab.h"
28
29 #ifdef USG
30 #include <sys/types.h>
31 #include <fcntl.h>
32 #endif
33
34 #include <a.out.h>
35 #include <obstack.h>
36 #include <sys/param.h>
37 #include <sys/file.h>
38
39 static void add_symbol_to_list ();
40 static void read_coff_symtab ();
41 static void patch_opaque_types ();
42 static struct type *decode_function_type ();
43 static struct type *decode_type ();
44 static struct type *decode_base_type ();
45 static struct type *read_enum_type ();
46 static struct type *read_struct_type ();
47 static void finish_block ();
48 static struct blockvector *make_blockvector ();
49 static struct symbol *process_coff_symbol ();
50 static int init_stringtab ();
51 static void free_stringtab ();
52 static char *getfilename ();
53 static char *getsymname ();
54 static int init_lineno ();
55 static void enter_linenos ();
56
57 extern int fclose ();
58 extern void free_all_symtabs ();
59 extern void free_all_psymtabs ();
60
61
62 /* Name of source file whose symbol data we are now processing.
63 This comes from a symbol named ".file". */
64
65 static char *last_source_file;
66
67 /* Core address of start and end of text of current source file.
68 This comes from a ".text" symbol where x_nlinno > 0. */
69
70 static CORE_ADDR cur_src_start_addr;
71 static CORE_ADDR cur_src_end_addr;
72
73 /* Core address of the end of the first object file. */
74 static CORE_ADDR first_object_file_end;
75
76 /* End of the text segment of the executable file,
77 as found in the symbol _etext. */
78
79 static CORE_ADDR end_of_text_addr;
80
81 /* The addresses of the symbol table stream and number of symbols
82 of the object file we are reading (as copied into core). */
83
84 static FILE *nlist_stream_global;
85 static int nlist_nsyms_global;
86
87 /* The file, a.out and text section headers of the symbol file */
88
89 static FILHDR file_hdr;
90 static SCNHDR text_hdr;
91 static AOUTHDR aout_hdr;
92
93 /* The index in the symbol table of the last coff symbol that was processed. */
94
95 static int symnum;
96
97 /* Vector of types defined so far, indexed by their coff symnum. */
98
99 static struct typevector *type_vector;
100
101 /* Number of elements allocated for type_vector currently. */
102
103 static int type_vector_length;
104
105 /* Vector of line number information. */
106
107 static struct linetable *line_vector;
108
109 /* Index of next entry to go in line_vector_index. */
110
111 static int line_vector_index;
112
113 /* Last line number recorded in the line vector. */
114
115 static int prev_line_number;
116
117 /* Number of elements allocated for line_vector currently. */
118
119 static int line_vector_length;
120
121 /* Chain of typedefs of pointers to empty struct/union types.
122 They are chained thru the SYMBOL_VALUE. */
123
124 #define HASHSIZE 127
125 static struct symbol *opaque_type_chain[HASHSIZE];
126
127 /* Record the symbols defined for each context in a list.
128 We don't create a struct block for the context until we
129 know how long to make it. */
130
131 struct pending
132 {
133 struct pending *next;
134 struct symbol *symbol;
135 };
136
137 /* Here are the three lists that symbols are put on. */
138
139 struct pending *file_symbols; /* static at top level, and types */
140
141 struct pending *global_symbols; /* global functions and variables */
142
143 struct pending *local_symbols; /* everything local to lexical context */
144
145 /* List of unclosed lexical contexts
146 (that will become blocks, eventually). */
147
148 struct context_stack
149 {
150 struct context_stack *next;
151 struct pending *locals;
152 struct pending_block *old_blocks;
153 struct symbol *name;
154 CORE_ADDR start_addr;
155 int depth;
156 };
157
158 struct context_stack *context_stack;
159
160 /* Nonzero if within a function (so symbols should be local,
161 if nothing says specifically). */
162
163 int within_function;
164
165 /* List of blocks already made (lexical contexts already closed).
166 This is used at the end to make the blockvector. */
167
168 struct pending_block
169 {
170 struct pending_block *next;
171 struct block *block;
172 };
173
174 struct pending_block *pending_blocks;
175
176 extern CORE_ADDR startup_file_start; /* From blockframe.c */
177 extern CORE_ADDR startup_file_end; /* From blockframe.c */
178
179 /* File name symbols were loaded from. */
180
181 static char *symfile;
182 \f
183 /* Look up a coff type-number index. Return the address of the slot
184 where the type for that index is stored.
185 The type-number is in INDEX.
186
187 This can be used for finding the type associated with that index
188 or for associating a new type with the index. */
189
190 static struct type **
191 coff_lookup_type (index)
192 register int index;
193 {
194 if (index >= type_vector_length)
195 {
196 int old_vector_length = type_vector_length;
197
198 type_vector_length *= 2;
199 if (type_vector_length < index) {
200 type_vector_length = index * 2;
201 }
202 type_vector = (struct typevector *)
203 xrealloc (type_vector, sizeof (struct typevector)
204 + type_vector_length * sizeof (struct type *));
205 bzero (&type_vector->type[ old_vector_length ],
206 (type_vector_length - old_vector_length) * sizeof(struct type *));
207 }
208 return &type_vector->type[index];
209 }
210
211 /* Make sure there is a type allocated for type number index
212 and return the type object.
213 This can create an empty (zeroed) type object. */
214
215 static struct type *
216 coff_alloc_type (index)
217 int index;
218 {
219 register struct type **type_addr = coff_lookup_type (index);
220 register struct type *type = *type_addr;
221
222 /* If we are referring to a type not known at all yet,
223 allocate an empty type for it.
224 We will fill it in later if we find out how. */
225 if (type == 0)
226 {
227 type = (struct type *) obstack_alloc (symbol_obstack,
228 sizeof (struct type));
229 bzero (type, sizeof (struct type));
230 *type_addr = type;
231 }
232 return type;
233 }
234 \f
235 /* maintain the lists of symbols and blocks */
236
237 /* Add a symbol to one of the lists of symbols. */
238 static void
239 add_symbol_to_list (symbol, listhead)
240 struct symbol *symbol;
241 struct pending **listhead;
242 {
243 register struct pending *link
244 = (struct pending *) xmalloc (sizeof (struct pending));
245
246 link->next = *listhead;
247 link->symbol = symbol;
248 *listhead = link;
249 }
250
251 /* Take one of the lists of symbols and make a block from it.
252 Put the block on the list of pending blocks. */
253
254 static void
255 finish_block (symbol, listhead, old_blocks, start, end)
256 struct symbol *symbol;
257 struct pending **listhead;
258 struct pending_block *old_blocks;
259 CORE_ADDR start, end;
260 {
261 register struct pending *next, *next1;
262 register struct block *block;
263 register struct pending_block *pblock;
264 struct pending_block *opblock;
265 register int i;
266
267 /* Count the length of the list of symbols. */
268
269 for (next = *listhead, i = 0; next; next = next->next, i++);
270
271 block = (struct block *)
272 obstack_alloc (symbol_obstack, sizeof (struct block) + (i - 1) * sizeof (struct symbol *));
273
274 /* Copy the symbols into the block. */
275
276 BLOCK_NSYMS (block) = i;
277 for (next = *listhead; next; next = next->next)
278 BLOCK_SYM (block, --i) = next->symbol;
279
280 BLOCK_START (block) = start;
281 BLOCK_END (block) = end;
282 BLOCK_SUPERBLOCK (block) = 0; /* Filled in when containing block is made */
283
284 /* Put the block in as the value of the symbol that names it. */
285
286 if (symbol)
287 {
288 SYMBOL_BLOCK_VALUE (symbol) = block;
289 BLOCK_FUNCTION (block) = symbol;
290 }
291 else
292 BLOCK_FUNCTION (block) = 0;
293
294 /* Now free the links of the list, and empty the list. */
295
296 for (next = *listhead; next; next = next1)
297 {
298 next1 = next->next;
299 free (next);
300 }
301 *listhead = 0;
302
303 /* Install this block as the superblock
304 of all blocks made since the start of this scope
305 that don't have superblocks yet. */
306
307 opblock = 0;
308 for (pblock = pending_blocks; pblock != old_blocks; pblock = pblock->next)
309 {
310 if (BLOCK_SUPERBLOCK (pblock->block) == 0)
311 BLOCK_SUPERBLOCK (pblock->block) = block;
312 opblock = pblock;
313 }
314
315 /* Record this block on the list of all blocks in the file.
316 Put it after opblock, or at the beginning if opblock is 0.
317 This puts the block in the list after all its subblocks. */
318
319 pblock = (struct pending_block *) xmalloc (sizeof (struct pending_block));
320 pblock->block = block;
321 if (opblock)
322 {
323 pblock->next = opblock->next;
324 opblock->next = pblock;
325 }
326 else
327 {
328 pblock->next = pending_blocks;
329 pending_blocks = pblock;
330 }
331 }
332
333 static struct blockvector *
334 make_blockvector ()
335 {
336 register struct pending_block *next, *next1;
337 register struct blockvector *blockvector;
338 register int i;
339
340 /* Count the length of the list of blocks. */
341
342 for (next = pending_blocks, i = 0; next; next = next->next, i++);
343
344 blockvector = (struct blockvector *)
345 obstack_alloc (symbol_obstack, sizeof (struct blockvector) + (i - 1) * sizeof (struct block *));
346
347 /* Copy the blocks into the blockvector.
348 This is done in reverse order, which happens to put
349 the blocks into the proper order (ascending starting address).
350 finish_block has hair to insert each block into the list
351 after its subblocks in order to make sure this is true. */
352
353 BLOCKVECTOR_NBLOCKS (blockvector) = i;
354 for (next = pending_blocks; next; next = next->next)
355 BLOCKVECTOR_BLOCK (blockvector, --i) = next->block;
356
357 /* Now free the links of the list, and empty the list. */
358
359 for (next = pending_blocks; next; next = next1)
360 {
361 next1 = next->next;
362 free (next);
363 }
364 pending_blocks = 0;
365
366 return blockvector;
367 }
368
369 /* Manage the vector of line numbers. */
370
371 static
372 record_line (line, pc)
373 int line;
374 CORE_ADDR pc;
375 {
376 struct linetable_entry *e;
377 /* Make sure line vector is big enough. */
378
379 if (line_vector_index + 2 >= line_vector_length)
380 {
381 line_vector_length *= 2;
382 line_vector = (struct linetable *)
383 xrealloc (line_vector, sizeof (struct linetable)
384 + (line_vector_length
385 * sizeof (struct linetable_entry)));
386 }
387
388 e = line_vector->item + line_vector_index++;
389 e->line = line; e->pc = pc;
390 }
391 \f
392 /* Start a new symtab for a new source file.
393 This is called when a COFF ".file" symbol is seen;
394 it indicates the start of data for one original source file. */
395
396 static void
397 start_symtab ()
398 {
399 file_symbols = 0;
400 global_symbols = 0;
401 context_stack = 0;
402 within_function = 0;
403 last_source_file = 0;
404
405 /* Initialize the source file information for this file. */
406
407 line_vector_index = 0;
408 line_vector_length = 1000;
409 prev_line_number = -2; /* Force first line number to be explicit */
410 line_vector = (struct linetable *)
411 xmalloc (sizeof (struct linetable)
412 + line_vector_length * sizeof (struct linetable_entry));
413 }
414
415 /* Save the vital information for use when closing off the current file.
416 NAME is the file name the symbols came from, START_ADDR is the first
417 text address for the file, and SIZE is the number of bytes of text. */
418
419 static void
420 complete_symtab (name, start_addr, size)
421 char *name;
422 CORE_ADDR start_addr;
423 unsigned int size;
424 {
425 last_source_file = savestring (name, strlen (name));
426 cur_src_start_addr = start_addr;
427 cur_src_end_addr = start_addr + size;
428
429 if (aout_hdr.entry < cur_src_end_addr
430 && aout_hdr.entry >= cur_src_start_addr)
431 {
432 startup_file_start = cur_src_start_addr;
433 startup_file_end = cur_src_end_addr;
434 }
435 }
436
437 /* Finish the symbol definitions for one main source file,
438 close off all the lexical contexts for that file
439 (creating struct block's for them), then make the
440 struct symtab for that file and put it in the list of all such. */
441
442 static void
443 end_symtab ()
444 {
445 register struct symtab *symtab;
446 register struct context_stack *cstk;
447 register struct blockvector *blockvector;
448 register struct linetable *lv;
449
450 /* Finish the lexical context of the last function in the file. */
451
452 if (context_stack)
453 {
454 cstk = context_stack;
455 context_stack = 0;
456 /* Make a block for the local symbols within. */
457 finish_block (cstk->name, &local_symbols, cstk->old_blocks,
458 cstk->start_addr, cur_src_end_addr);
459 free (cstk);
460 }
461
462 /* Ignore a file that has no functions with real debugging info. */
463 if (pending_blocks == 0 && file_symbols == 0 && global_symbols == 0)
464 {
465 free (line_vector);
466 line_vector = 0;
467 line_vector_length = -1;
468 last_source_file = 0;
469 return;
470 }
471
472 /* Create the two top-level blocks for this file. */
473 finish_block (0, &file_symbols, 0, cur_src_start_addr, cur_src_end_addr);
474 finish_block (0, &global_symbols, 0, cur_src_start_addr, cur_src_end_addr);
475
476 /* Create the blockvector that points to all the file's blocks. */
477 blockvector = make_blockvector ();
478
479 /* Now create the symtab object for this source file. */
480 symtab = (struct symtab *) xmalloc (sizeof (struct symtab));
481 symtab->free_ptr = 0;
482
483 /* Fill in its components. */
484 symtab->blockvector = blockvector;
485 symtab->free_code = free_linetable;
486 symtab->filename = last_source_file;
487 lv = line_vector;
488 lv->nitems = line_vector_index;
489 symtab->linetable = (struct linetable *)
490 xrealloc (lv, (sizeof (struct linetable)
491 + lv->nitems * sizeof (struct linetable_entry)));
492 symtab->nlines = 0;
493 symtab->line_charpos = 0;
494
495 /* Link the new symtab into the list of such. */
496 symtab->next = symtab_list;
497 symtab_list = symtab;
498
499 /* Reinitialize for beginning of new file. */
500 line_vector = 0;
501 line_vector_length = -1;
502 last_source_file = 0;
503 }
504 \f
505 /* Accumulate the misc functions in bunches of 127.
506 At the end, copy them all into one newly allocated structure. */
507
508 #define MISC_BUNCH_SIZE 127
509
510 struct misc_bunch
511 {
512 struct misc_bunch *next;
513 struct misc_function contents[MISC_BUNCH_SIZE];
514 };
515
516 /* Bunch currently being filled up.
517 The next field points to chain of filled bunches. */
518
519 static struct misc_bunch *misc_bunch;
520
521 /* Number of slots filled in current bunch. */
522
523 static int misc_bunch_index;
524
525 /* Total number of misc functions recorded so far. */
526
527 static int misc_count;
528
529 static void
530 init_misc_functions ()
531 {
532 misc_count = 0;
533 misc_bunch = 0;
534 misc_bunch_index = MISC_BUNCH_SIZE;
535 }
536
537 static void
538 record_misc_function (name, address)
539 char *name;
540 CORE_ADDR address;
541 {
542 register struct misc_bunch *new;
543
544 if (misc_bunch_index == MISC_BUNCH_SIZE)
545 {
546 new = (struct misc_bunch *) xmalloc (sizeof (struct misc_bunch));
547 misc_bunch_index = 0;
548 new->next = misc_bunch;
549 misc_bunch = new;
550 }
551 misc_bunch->contents[misc_bunch_index].name = savestring (name, strlen (name));
552 misc_bunch->contents[misc_bunch_index].address = address;
553 misc_bunch->contents[misc_bunch_index].type = mf_unknown;
554 misc_bunch_index++;
555 misc_count++;
556 }
557
558 /* if we see a function symbol, we do record_misc_function.
559 * however, if it turns out the next symbol is '.bf', then
560 * we call here to undo the misc definition
561 */
562 static void
563 unrecord_misc_function ()
564 {
565 if (misc_bunch_index == 0)
566 error ("Internal error processing symbol table, at symbol %d.",
567 symnum);
568 misc_bunch_index--;
569 misc_count--;
570 }
571
572
573 static int
574 compare_misc_functions (fn1, fn2)
575 struct misc_function *fn1, *fn2;
576 {
577 /* Return a signed result based on unsigned comparisons
578 so that we sort into unsigned numeric order. */
579 if (fn1->address < fn2->address)
580 return -1;
581 if (fn1->address > fn2->address)
582 return 1;
583 return 0;
584 }
585
586 static void
587 discard_misc_bunches ()
588 {
589 register struct misc_bunch *next;
590
591 while (misc_bunch)
592 {
593 next = misc_bunch->next;
594 free (misc_bunch);
595 misc_bunch = next;
596 }
597 }
598
599 static void
600 condense_misc_bunches ()
601 {
602 register int i, j;
603 register struct misc_bunch *bunch;
604 #ifdef NAMES_HAVE_UNDERSCORE
605 int offset = 1;
606 #else
607 int offset = 0;
608 #endif
609
610 misc_function_vector
611 = (struct misc_function *)
612 xmalloc (misc_count * sizeof (struct misc_function));
613
614 j = 0;
615 bunch = misc_bunch;
616 while (bunch)
617 {
618 for (i = 0; i < misc_bunch_index; i++)
619 {
620 register char *tmp;
621
622 misc_function_vector[j] = bunch->contents[i];
623 tmp = misc_function_vector[j].name;
624 misc_function_vector[j].name = (tmp[0] == '_' ? tmp + offset : tmp);
625 j++;
626 }
627 bunch = bunch->next;
628 misc_bunch_index = MISC_BUNCH_SIZE;
629 }
630
631 misc_function_count = j;
632
633 /* Sort the misc functions by address. */
634
635 qsort (misc_function_vector, j, sizeof (struct misc_function),
636 compare_misc_functions);
637 }
638
639 /* Call sort_syms to sort alphabetically
640 the symbols of each block of each symtab. */
641
642 static int
643 compare_symbols (s1, s2)
644 struct symbol **s1, **s2;
645 {
646 /* Names that are less should come first. */
647 register int namediff = strcmp (SYMBOL_NAME (*s1), SYMBOL_NAME (*s2));
648 if (namediff != 0) return namediff;
649 /* For symbols of the same name, registers should come first. */
650 return ((SYMBOL_CLASS (*s2) == LOC_REGISTER)
651 - (SYMBOL_CLASS (*s1) == LOC_REGISTER));
652 }
653
654 static void
655 sort_syms ()
656 {
657 register struct symtab *s;
658 register int i, nbl;
659 register struct blockvector *bv;
660 register struct block *b;
661
662 for (s = symtab_list; s; s = s->next)
663 {
664 bv = BLOCKVECTOR (s);
665 nbl = BLOCKVECTOR_NBLOCKS (bv);
666 for (i = 0; i < nbl; i++)
667 {
668 b = BLOCKVECTOR_BLOCK (bv, i);
669 if (BLOCK_SHOULD_SORT (b))
670 qsort (&BLOCK_SYM (b, 0), BLOCK_NSYMS (b),
671 sizeof (struct symbol *), compare_symbols);
672 }
673 }
674 }
675 \f
676 /* This is the symbol-file command. Read the file, analyze its symbols,
677 and add a struct symtab to symtab_list. */
678
679 void
680 symbol_file_command (name)
681 char *name;
682 {
683 int desc;
684 int num_symbols;
685 int num_sections;
686 int symtab_offset;
687 extern void close ();
688 register int val;
689 struct cleanup *old_chain;
690
691 dont_repeat ();
692
693 if (name == 0)
694 {
695 if (symtab_list && !query ("Discard symbol table? ", 0))
696 error ("Not confirmed.");
697 if (symfile)
698 free (symfile);
699 symfile = 0;
700 free_all_symtabs ();
701 return;
702 }
703
704 name = tilde_expand (name);
705 make_cleanup (free, name);
706
707 if (symtab_list && !query ("Load new symbol table from \"%s\"? ", name))
708 error ("Not confirmed.");
709
710 if (symfile)
711 free (symfile);
712 symfile = 0;
713
714 {
715 char *absolute_name;
716
717 desc = openp (getenv ("PATH"), 1, name, O_RDONLY, 0, &absolute_name);
718 if (desc < 0)
719 perror_with_name (name);
720 else
721 name = absolute_name;
722 }
723
724 old_chain = make_cleanup (close, desc);
725 make_cleanup (free_current_contents, &name);
726
727 if ((num_symbols = read_file_hdr (desc, &file_hdr)) < 0)
728 error ("File \"%s\" not in executable format.", name);
729
730 /* If an a.out header is present, read it in. If not (e.g. a .o file)
731 deal with its absence. */
732 if (file_hdr.f_opthdr == 0
733 || read_aout_hdr (desc, &aout_hdr, file_hdr.f_opthdr) < 0)
734 {
735 /* We will not actually be able to run code, since backtraces would
736 fly off the bottom of the stack (there is no way to reliably
737 detect bottom of stack), but that's fine since the kernel won't
738 run something without an a.out header anyway. Passive examination
739 of .o files is one place this might make sense. */
740 /* ~0 will not be in any file. */
741 aout_hdr.entry = ~0;
742 /* set the startup file to be an empty range. */
743 startup_file_start = 0;
744 startup_file_end = 0;
745 }
746
747 if (num_symbols == 0)
748 {
749 free_all_symtabs ();
750 error ("%s does not have a symbol-table.\n", name);
751 }
752
753 printf ("Reading symbol data from %s...", name);
754 fflush (stdout);
755
756 /* Throw away the old symbol table. */
757
758 free_all_symtabs ();
759 free_all_psymtabs (); /* Make sure that partial_symtab_list */
760 /* is 0 also. */
761
762 num_sections = file_hdr.f_nscns;
763 symtab_offset = file_hdr.f_symptr;
764
765 if (read_section_hdr (desc, _TEXT, &text_hdr, num_sections,
766 file_hdr.f_opthdr) < 0)
767 error ("\"%s\": can't read text section header", name);
768
769 /* Read the line number table, all at once. */
770
771 val = init_lineno (desc, text_hdr.s_lnnoptr, text_hdr.s_nlnno);
772 if (val < 0)
773 error ("\"%s\": error reading line numbers\n", name);
774
775 /* Now read the string table, all at once. */
776
777 val = init_stringtab (desc, symtab_offset + num_symbols * SYMESZ);
778 if (val < 0)
779 {
780 free_all_symtabs ();
781 printf ("\"%s\": can't get string table", name);
782 fflush (stdout);
783 return;
784 }
785 make_cleanup (free_stringtab, 0);
786
787 /* Position to read the symbol table. Do not read it all at once. */
788 val = lseek (desc, (long)symtab_offset, 0);
789 if (val < 0)
790 perror_with_name (name);
791
792 init_misc_functions ();
793 make_cleanup (discard_misc_bunches, 0);
794
795 /* Now that the executable file is positioned at symbol table,
796 process it and define symbols accordingly. */
797
798 read_coff_symtab (desc, num_symbols);
799
800 patch_opaque_types ();
801
802 /* Sort symbols alphabetically within each block. */
803
804 sort_syms ();
805
806 /* Go over the misc functions and install them in vector. */
807
808 condense_misc_bunches ();
809
810 /* Don't allow char * to have a typename (else would get caddr_t.) */
811
812 TYPE_NAME (lookup_pointer_type (builtin_type_char)) = 0;
813
814 /* Make a default for file to list. */
815
816 select_source_symtab (0);
817
818 symfile = savestring (name, strlen (name));
819
820 do_cleanups (old_chain);
821
822 printf ("done.\n");
823 fflush (stdout);
824 }
825
826 /* Return name of file symbols were loaded from, or 0 if none.. */
827
828 char *
829 get_sym_file ()
830 {
831 return symfile;
832 }
833 \f
834 /* Simplified internal version of coff symbol table information */
835
836 struct coff_symbol {
837 char *c_name;
838 int c_symnum; /* symbol number of this entry */
839 int c_nsyms; /* 1 if syment only, 2 if syment + auxent */
840 long c_value;
841 int c_sclass;
842 int c_secnum;
843 unsigned int c_type;
844 };
845
846 /* Given pointers to a symbol table in coff style exec file,
847 analyze them and create struct symtab's describing the symbols.
848 NSYMS is the number of symbols in the symbol table.
849 We read them one at a time using read_one_sym (). */
850
851 static void
852 read_coff_symtab (desc, nsyms)
853 int desc;
854 int nsyms;
855 {
856 int newfd; /* Avoid multiple closes on same desc */
857 FILE *stream;
858 register struct context_stack *new;
859 struct coff_symbol coff_symbol;
860 register struct coff_symbol *cs = &coff_symbol;
861 static SYMENT main_sym;
862 static AUXENT main_aux;
863 struct coff_symbol fcn_cs_saved;
864 static SYMENT fcn_sym_saved;
865 static AUXENT fcn_aux_saved;
866
867 int num_object_files = 0;
868 int next_file_symnum = -1;
869
870 /* Name of the current file. */
871 char *filestring = "";
872 int depth;
873 int fcn_first_line;
874 int fcn_last_line;
875 int fcn_start_addr;
876 long fcn_line_ptr;
877 struct cleanup *old_chain;
878
879
880 newfd = dup (desc);
881 if (newfd == -1)
882 fatal ("Too many open files");
883 stream = fdopen (newfd, "r");
884
885 old_chain = make_cleanup (free_all_symtabs, 0);
886 make_cleanup (fclose, stream);
887 nlist_stream_global = stream;
888 nlist_nsyms_global = nsyms;
889 last_source_file = 0;
890 bzero (opaque_type_chain, sizeof opaque_type_chain);
891
892 type_vector_length = 160;
893 type_vector = (struct typevector *)
894 xmalloc (sizeof (struct typevector)
895 + type_vector_length * sizeof (struct type *));
896 bzero (type_vector->type, type_vector_length * sizeof (struct type *));
897
898 start_symtab ();
899
900 symnum = 0;
901 while (symnum < nsyms)
902 {
903 QUIT; /* Make this command interruptable. */
904 read_one_sym (cs, &main_sym, &main_aux);
905
906 if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
907 {
908 CORE_ADDR last_file_end = cur_src_end_addr;
909
910 if (last_source_file)
911 end_symtab ();
912
913 start_symtab ();
914 complete_symtab ("_globals_", 0, first_object_file_end);
915 /* done with all files, everything from here on out is globals */
916 }
917
918 /* Special case for file with type declarations only, no text. */
919 if (!last_source_file && cs->c_type != T_NULL && cs->c_secnum == N_DEBUG)
920 complete_symtab (filestring, 0, 0);
921
922 /* Typedefs should not be treated as symbol definitions. */
923 if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
924 {
925 /* record as misc function. if we get '.bf' next,
926 * then we undo this step
927 */
928 record_misc_function (cs->c_name, cs->c_value);
929
930 fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
931 fcn_start_addr = cs->c_value;
932 fcn_cs_saved = *cs;
933 fcn_sym_saved = main_sym;
934 fcn_aux_saved = main_aux;
935 continue;
936 }
937
938 switch (cs->c_sclass)
939 {
940 case C_EFCN:
941 case C_EXTDEF:
942 case C_ULABEL:
943 case C_USTATIC:
944 case C_LINE:
945 case C_ALIAS:
946 case C_HIDDEN:
947 printf ("Bad n_sclass = %d\n", cs->c_sclass);
948 break;
949
950 case C_FILE:
951 /*
952 * c_value field contains symnum of next .file entry in table
953 * or symnum of first global after last .file.
954 */
955 next_file_symnum = cs->c_value;
956 filestring = getfilename (&main_aux);
957 /*
958 * Complete symbol table for last object file
959 * containing debugging information.
960 */
961 if (last_source_file)
962 {
963 end_symtab ();
964 start_symtab ();
965 }
966 num_object_files++;
967 break;
968
969 case C_STAT:
970 if (cs->c_name[0] == '.') {
971 if (strcmp (cs->c_name, _TEXT) == 0) {
972 if (num_object_files == 1) {
973 /* last address of startup file */
974 first_object_file_end = cs->c_value +
975 main_aux.x_scn.x_scnlen;
976 }
977 /* for some reason the old code didn't do
978 * this if this section entry had
979 * main_aux.x_scn.x_nlinno equal to 0
980 */
981 complete_symtab (filestring, cs->c_value,
982 main_aux.x_scn.x_scnlen);
983 }
984 /* flush rest of '.' symbols */
985 break;
986 }
987 /* fall in for static symbols that don't start with '.' */
988 case C_EXT:
989 if (cs->c_sclass == C_EXT &&
990 cs->c_secnum == N_ABS &&
991 strcmp (cs->c_name, _ETEXT) == 0)
992 end_of_text_addr = cs->c_value;
993 if (cs->c_type == T_NULL) {
994 if (cs->c_secnum <= 1) { /* text or abs */
995 record_misc_function (cs->c_name, cs->c_value);
996 break;
997 } else {
998 cs->c_type = T_INT;
999 }
1000 }
1001 (void) process_coff_symbol (cs, &main_aux);
1002 break;
1003
1004 case C_FCN:
1005 if (strcmp (cs->c_name, ".bf") == 0)
1006 {
1007 #if 0
1008 /* Don't do this; we want all functions to be on the
1009 mfl now. */
1010 unrecord_misc_function ();
1011 #endif
1012
1013 within_function = 1;
1014
1015 /* value contains address of first non-init type code */
1016 /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
1017 contains line number of '{' } */
1018 fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1019
1020 new = (struct context_stack *)
1021 xmalloc (sizeof (struct context_stack));
1022 new->depth = depth = 0;
1023 new->next = 0;
1024 context_stack = new;
1025 new->locals = 0;
1026 new->old_blocks = pending_blocks;
1027 new->start_addr = fcn_start_addr;
1028 fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
1029 new->name = process_coff_symbol (&fcn_cs_saved,
1030 &fcn_aux_saved);
1031 }
1032 else if (strcmp (cs->c_name, ".ef") == 0)
1033 {
1034 /* the value of .ef is the address of epilogue code;
1035 * not useful for gdb
1036 */
1037 /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1038 contains number of lines to '}' */
1039 fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1040 enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line);
1041 new = context_stack;
1042
1043 if (new == 0)
1044 error ("Invalid symbol data; .bf/.ef/.bb/.eb symbol mismatch, at symbol %d.",
1045 symnum);
1046
1047 finish_block (new->name, &local_symbols, new->old_blocks,
1048 new->start_addr,
1049 fcn_cs_saved.c_value +
1050 fcn_aux_saved.x_sym.x_misc.x_fsize);
1051 context_stack = 0;
1052 within_function = 0;
1053 free (new);
1054 }
1055 break;
1056
1057 case C_BLOCK:
1058 if (strcmp (cs->c_name, ".bb") == 0)
1059 {
1060 new = (struct context_stack *)
1061 xmalloc (sizeof (struct context_stack));
1062 depth++;
1063 new->depth = depth;
1064 new->next = context_stack;
1065 context_stack = new;
1066 new->locals = local_symbols;
1067 new->old_blocks = pending_blocks;
1068 new->start_addr = cs->c_value;
1069 new->name = 0;
1070 local_symbols = 0;
1071 }
1072 else if (strcmp (cs->c_name, ".eb") == 0)
1073 {
1074 new = context_stack;
1075 if (new == 0 || depth != new->depth)
1076 error ("Invalid symbol data: .bb/.eb symbol mismatch at symbol %d.",
1077 symnum);
1078 if (local_symbols && context_stack->next)
1079 {
1080 /* Make a block for the local symbols within. */
1081 finish_block (0, &local_symbols, new->old_blocks,
1082 new->start_addr, cs->c_value);
1083 }
1084 depth--;
1085 local_symbols = new->locals;
1086 context_stack = new->next;
1087 free (new);
1088 }
1089 break;
1090
1091 default:
1092 (void) process_coff_symbol (cs, &main_aux);
1093 break;
1094 }
1095 }
1096
1097 if (last_source_file)
1098 end_symtab ();
1099 fclose (stream);
1100 discard_cleanups (old_chain);
1101 }
1102 \f
1103 /* Routines for reading headers and symbols from executable. */
1104
1105 /* Read COFF file header, check magic number,
1106 and return number of symbols. */
1107 read_file_hdr (chan, file_hdr)
1108 int chan;
1109 FILHDR *file_hdr;
1110 {
1111 lseek (chan, 0L, 0);
1112 if (myread (chan, (char *)file_hdr, FILHSZ) < 0)
1113 return -1;
1114
1115 switch (file_hdr->f_magic)
1116 {
1117 #ifdef MC68MAGIC
1118 case MC68MAGIC:
1119 #endif
1120 #ifdef NS32GMAGIC
1121 case NS32GMAGIC:
1122 case NS32SMAGIC:
1123 #endif
1124 #ifdef I386MAGIC
1125 case I386MAGIC:
1126 #endif
1127 #ifdef CLIPPERMAGIC
1128 case CLIPPERMAGIC:
1129 #endif
1130 return file_hdr->f_nsyms;
1131
1132 default:
1133 #ifdef BADMAG
1134 if (BADMAG(file_hdr))
1135 return -1;
1136 else
1137 return file_hdr->f_nsyms;
1138 #else
1139 return -1;
1140 #endif
1141 }
1142 }
1143
1144 read_aout_hdr (chan, aout_hdr, size)
1145 int chan;
1146 AOUTHDR *aout_hdr;
1147 int size;
1148 {
1149 lseek (chan, (long)FILHSZ, 0);
1150 if (size != sizeof (AOUTHDR))
1151 return -1;
1152 if (myread (chan, (char *)aout_hdr, size) != size)
1153 return -1;
1154 return 0;
1155 }
1156
1157 /* Read a section header. OPTIONAL_HEADER_SIZE is the size of the
1158 optional header (normally f_opthdr from the file header).
1159
1160 Return nonnegative for success, -1 for failure. */
1161 int
1162 read_section_hdr (chan, section_name, section_hdr, nsects,
1163 optional_header_size)
1164 register int chan;
1165 register char *section_name;
1166 SCNHDR *section_hdr;
1167 register int nsects;
1168 int optional_header_size;
1169 {
1170 register int i;
1171
1172 if (lseek (chan, FILHSZ + optional_header_size, 0) < 0)
1173 return -1;
1174
1175 for (i = 0; i < nsects; i++)
1176 {
1177 if (myread (chan, (char *)section_hdr, SCNHSZ) < 0)
1178 return -1;
1179 if (strncmp (section_hdr->s_name, section_name, 8) == 0)
1180 return 0;
1181 }
1182 return -1;
1183 }
1184
1185 read_one_sym (cs, sym, aux)
1186 register struct coff_symbol *cs;
1187 register SYMENT *sym;
1188 register AUXENT *aux;
1189 {
1190 cs->c_symnum = symnum;
1191 fread ((char *)sym, SYMESZ, 1, nlist_stream_global);
1192 cs->c_nsyms = (sym->n_numaux & 0xff) + 1;
1193 if (cs->c_nsyms == 2)
1194 {
1195 /* doc for coff says there is either no aux entry or just one */
1196 fread ((char *)aux, AUXESZ, 1, nlist_stream_global);
1197 }
1198 else if (cs->c_nsyms > 2)
1199 error ("more than one aux symbol table entry at symnum=%d\n", symnum);
1200
1201 cs->c_name = getsymname (sym);
1202 cs->c_value = sym->n_value;
1203 cs->c_sclass = (sym->n_sclass & 0xff);
1204 cs->c_secnum = sym->n_scnum;
1205 cs->c_type = (unsigned) sym->n_type;
1206
1207 symnum += cs->c_nsyms;
1208 }
1209 \f
1210 /* Support for string table handling */
1211
1212 static char *stringtab = NULL;
1213
1214 static int
1215 init_stringtab (chan, offset)
1216 int chan;
1217 long offset;
1218 {
1219 long buffer;
1220 int val;
1221
1222 if (stringtab)
1223 {
1224 free (stringtab);
1225 stringtab = NULL;
1226 }
1227
1228 if (lseek (chan, offset, 0) < 0)
1229 return -1;
1230
1231 val = myread (chan, (char *)&buffer, sizeof buffer);
1232
1233 /* If no string table is needed, then the file may end immediately
1234 after the symbols. Just return with `stringtab' set to null. */
1235 if (val != sizeof buffer || buffer == 0)
1236 return 0;
1237
1238 stringtab = (char *) xmalloc (buffer);
1239 if (stringtab == NULL)
1240 return -1;
1241
1242 bcopy (&buffer, stringtab, sizeof buffer);
1243
1244 val = myread (chan, stringtab + sizeof buffer, buffer - sizeof buffer);
1245 if (val != buffer - sizeof buffer || stringtab[buffer - 1] != '\0')
1246 return -1;
1247
1248 return 0;
1249 }
1250
1251 static void
1252 free_stringtab ()
1253 {
1254 if (stringtab)
1255 free (stringtab);
1256 stringtab = NULL;
1257 }
1258
1259 static char *
1260 getsymname (symbol_entry)
1261 SYMENT *symbol_entry;
1262 {
1263 static char buffer[SYMNMLEN+1];
1264 char *result;
1265
1266 if (symbol_entry->n_zeroes == 0)
1267 {
1268 result = stringtab + symbol_entry->n_offset;
1269 }
1270 else
1271 {
1272 strncpy (buffer, symbol_entry->n_name, SYMNMLEN);
1273 buffer[SYMNMLEN] = '\0';
1274 result = buffer;
1275 }
1276 return result;
1277 }
1278
1279 static char *
1280 getfilename (aux_entry)
1281 AUXENT *aux_entry;
1282 {
1283 static char buffer[BUFSIZ];
1284 register char *temp;
1285 char *result;
1286 extern char *rindex ();
1287
1288 #ifndef COFF_NO_LONG_FILE_NAMES
1289 if (aux_entry->x_file.x_foff != 0)
1290 strcpy (buffer, stringtab + aux_entry->x_file.x_foff);
1291 else
1292 #endif
1293 {
1294 strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1295 buffer[FILNMLEN] = '\0';
1296 }
1297 result = buffer;
1298 if ((temp = rindex (result, '/')) != NULL)
1299 result = temp + 1;
1300 return (result);
1301 }
1302
1303 /* Support for line number handling */
1304 static char *linetab = NULL;
1305 static long linetab_offset;
1306 static int linetab_count;
1307
1308 static int
1309 init_lineno (chan, offset, count)
1310 int chan;
1311 long offset;
1312 int count;
1313 {
1314 int val;
1315
1316 if (lseek (chan, offset, 0) < 0)
1317 return -1;
1318
1319 if (linetab)
1320 free (linetab);
1321 linetab = (char *) xmalloc (count * LINESZ);
1322
1323 val = myread (chan, linetab, count * LINESZ);
1324 if (val != count * LINESZ)
1325 return -1;
1326
1327 linetab_offset = offset;
1328 linetab_count = count;
1329 return 0;
1330 }
1331
1332 static void
1333 enter_linenos (file_offset, first_line, last_line)
1334 long file_offset;
1335 register int first_line;
1336 register int last_line;
1337 {
1338 register char *rawptr = &linetab[file_offset - linetab_offset];
1339 struct lineno lptr;
1340
1341 /* skip first line entry for each function */
1342 rawptr += LINESZ;
1343 /* line numbers start at one for the first line of the function */
1344 first_line--;
1345
1346 /* Bcopy since occaisionally rawptr isn't pointing at long
1347 boundaries. */
1348 for (bcopy (rawptr, &lptr, LINESZ);
1349 lptr.l_lnno && lptr.l_lnno <= last_line;
1350 rawptr += LINESZ, bcopy (rawptr, &lptr, LINESZ))
1351 {
1352 record_line (first_line + lptr.l_lnno, lptr.l_addr.l_paddr);
1353 }
1354 }
1355 \f
1356 static int
1357 hashname (name)
1358 char *name;
1359 {
1360 register char *p = name;
1361 register int total = p[0];
1362 register int c;
1363
1364 c = p[1];
1365 total += c << 2;
1366 if (c)
1367 {
1368 c = p[2];
1369 total += c << 4;
1370 if (c)
1371 total += p[3] << 6;
1372 }
1373
1374 return total % HASHSIZE;
1375 }
1376
1377 static void
1378 patch_type (type, real_type)
1379 struct type *type;
1380 struct type *real_type;
1381 {
1382 register struct type *target = TYPE_TARGET_TYPE (type);
1383 register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1384 int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1385
1386 TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1387 TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1388 TYPE_FIELDS (target) = (struct field *)
1389 obstack_alloc (symbol_obstack, field_size);
1390
1391 bcopy (TYPE_FIELDS (real_target), TYPE_FIELDS (target), field_size);
1392
1393 if (TYPE_NAME (real_target))
1394 {
1395 if (TYPE_NAME (target))
1396 free (TYPE_NAME (target));
1397 TYPE_NAME (target) = concat (TYPE_NAME (real_target), "", "");
1398 }
1399 }
1400
1401 /* Patch up all appropriate typdef symbols in the opaque_type_chains
1402 so that they can be used to print out opaque data structures properly */
1403
1404 static void
1405 patch_opaque_types ()
1406 {
1407 struct symtab *s;
1408
1409 /* Look at each symbol in the per-file block of each symtab. */
1410 for (s = symtab_list; s; s = s->next)
1411 {
1412 register struct block *b;
1413 register int i;
1414
1415 /* Go through the per-file symbols only */
1416 b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1);
1417 for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--)
1418 {
1419 register struct symbol *real_sym;
1420
1421 /* Find completed typedefs to use to fix opaque ones.
1422 Remove syms from the chain when their types are stored,
1423 but search the whole chain, as there may be several syms
1424 from different files with the same name. */
1425 real_sym = BLOCK_SYM (b, i);
1426 if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1427 SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE &&
1428 TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1429 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1430 {
1431 register char *name = SYMBOL_NAME (real_sym);
1432 register int hash = hashname (name);
1433 register struct symbol *sym, *prev;
1434
1435 prev = 0;
1436 for (sym = opaque_type_chain[hash]; sym;)
1437 {
1438 if (name[0] == SYMBOL_NAME (sym)[0] &&
1439 !strcmp (name + 1, SYMBOL_NAME (sym) + 1))
1440 {
1441 if (prev)
1442 SYMBOL_VALUE (prev) = SYMBOL_VALUE (sym);
1443 else
1444 opaque_type_chain[hash]
1445 = (struct symbol *) SYMBOL_VALUE (sym);
1446
1447 patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1448
1449 if (prev)
1450 sym = (struct symbol *) SYMBOL_VALUE (prev);
1451 else
1452 sym = opaque_type_chain[hash];
1453 }
1454 else
1455 {
1456 prev = sym;
1457 sym = (struct symbol *) SYMBOL_VALUE (sym);
1458 }
1459 }
1460 }
1461 }
1462 }
1463 }
1464 \f
1465 static struct symbol *
1466 process_coff_symbol (cs, aux)
1467 register struct coff_symbol *cs;
1468 register AUXENT *aux;
1469 {
1470 register struct symbol *sym
1471 = (struct symbol *) obstack_alloc (symbol_obstack, sizeof (struct symbol));
1472 char *name;
1473 char *dot;
1474 #ifdef NAMES_HAVE_UNDERSCORE
1475 int offset = 1;
1476 #else
1477 int offset = 0;
1478 #endif
1479
1480 bzero (sym, sizeof (struct symbol));
1481 name = cs->c_name;
1482 name = (name[0] == '_' ? name + offset : name);
1483 SYMBOL_NAME (sym) = obstack_copy0 (symbol_obstack, name, strlen (name));
1484
1485 /* default assumptions */
1486 SYMBOL_VALUE (sym) = cs->c_value;
1487 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1488
1489 if (ISFCN (cs->c_type))
1490 {
1491 SYMBOL_TYPE (sym) =
1492 lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1493 SYMBOL_CLASS (sym) = LOC_BLOCK;
1494 if (cs->c_sclass == C_STAT)
1495 add_symbol_to_list (sym, &file_symbols);
1496 else if (cs->c_sclass == C_EXT)
1497 add_symbol_to_list (sym, &global_symbols);
1498 }
1499 else
1500 {
1501 SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1502 switch (cs->c_sclass)
1503 {
1504 case C_NULL:
1505 break;
1506
1507 case C_AUTO:
1508 SYMBOL_CLASS (sym) = LOC_LOCAL;
1509 add_symbol_to_list (sym, &local_symbols);
1510 break;
1511
1512 case C_EXT:
1513 SYMBOL_CLASS (sym) = LOC_STATIC;
1514 add_symbol_to_list (sym, &global_symbols);
1515 break;
1516
1517 case C_STAT:
1518 SYMBOL_CLASS (sym) = LOC_STATIC;
1519 if (within_function) {
1520 /* Static symbol of local scope */
1521 add_symbol_to_list (sym, &local_symbols);
1522 }
1523 else {
1524 /* Static symbol at top level of file */
1525 add_symbol_to_list (sym, &file_symbols);
1526 }
1527 break;
1528
1529 case C_REG:
1530 SYMBOL_CLASS (sym) = LOC_REGISTER;
1531 add_symbol_to_list (sym, &local_symbols);
1532 break;
1533
1534 case C_LABEL:
1535 break;
1536
1537 case C_ARG:
1538 SYMBOL_CLASS (sym) = LOC_ARG;
1539 add_symbol_to_list (sym, &local_symbols);
1540 #ifndef clipper
1541 /* If PCC says a parameter is a short or a char,
1542 it is really an int. */
1543 if (SYMBOL_TYPE (sym) == builtin_type_char
1544 || SYMBOL_TYPE (sym) == builtin_type_short)
1545 SYMBOL_TYPE (sym) = builtin_type_int;
1546 else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
1547 || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
1548 SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
1549 #endif
1550 break;
1551
1552 case C_REGPARM:
1553 SYMBOL_CLASS (sym) = LOC_REGPARM;
1554 add_symbol_to_list (sym, &local_symbols);
1555 #ifndef clipper
1556 /* If PCC says a parameter is a short or a char,
1557 it is really an int. */
1558 if (SYMBOL_TYPE (sym) == builtin_type_char
1559 || SYMBOL_TYPE (sym) == builtin_type_short)
1560 SYMBOL_TYPE (sym) = builtin_type_int;
1561 else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
1562 || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
1563 SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
1564 #endif
1565 break;
1566
1567 case C_TPDEF:
1568 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1569 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1570
1571 /* If type has no name, give it one */
1572 if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
1573 && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
1574 TYPE_NAME (SYMBOL_TYPE (sym))
1575 = concat (SYMBOL_NAME (sym), "", "");
1576
1577 /* Keep track of any type which points to empty structured type,
1578 so it can be filled from a definition from another file */
1579 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1580 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0)
1581 {
1582 register int i = hashname (SYMBOL_NAME (sym));
1583
1584 SYMBOL_VALUE (sym) = (int) opaque_type_chain[i];
1585 opaque_type_chain[i] = sym;
1586 }
1587 add_symbol_to_list (sym, &file_symbols);
1588 break;
1589
1590 case C_STRTAG:
1591 case C_UNTAG:
1592 case C_ENTAG:
1593 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1594 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1595 if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
1596 && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
1597 TYPE_NAME (SYMBOL_TYPE (sym))
1598 = concat ("",
1599 (cs->c_sclass == C_ENTAG
1600 ? "enum "
1601 : (cs->c_sclass == C_STRTAG
1602 ? "struct " : "union ")),
1603 SYMBOL_NAME (sym));
1604 add_symbol_to_list (sym, &file_symbols);
1605 break;
1606
1607 default:
1608 break;
1609 }
1610 }
1611 return sym;
1612 }
1613 \f
1614 /* Decode a coff type specifier;
1615 return the type that is meant. */
1616
1617 static
1618 struct type *
1619 decode_type (cs, c_type, aux)
1620 register struct coff_symbol *cs;
1621 unsigned int c_type;
1622 register AUXENT *aux;
1623 {
1624 register struct type *type = 0;
1625 register int n;
1626 unsigned int new_c_type;
1627
1628 if (c_type & ~N_BTMASK)
1629 {
1630 new_c_type = DECREF (c_type);
1631 if (ISPTR (c_type))
1632 {
1633 type = decode_type (cs, new_c_type, aux);
1634 type = lookup_pointer_type (type);
1635 }
1636 else if (ISFCN (c_type))
1637 {
1638 type = decode_type (cs, new_c_type, aux);
1639 type = lookup_function_type (type);
1640 }
1641 else if (ISARY (c_type))
1642 {
1643 int i, n;
1644 register unsigned short *dim;
1645 struct type *base_type;
1646
1647 /* Define an array type. */
1648 /* auxent refers to array, not base type */
1649 if (aux->x_sym.x_tagndx == 0)
1650 cs->c_nsyms = 1;
1651
1652 /* shift the indices down */
1653 dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1654 i = 1;
1655 n = dim[0];
1656 for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1657 *dim = *(dim + 1);
1658 *dim = 0;
1659
1660 type = (struct type *)
1661 obstack_alloc (symbol_obstack, sizeof (struct type));
1662 bzero (type, sizeof (struct type));
1663
1664 base_type = decode_type (cs, new_c_type, aux);
1665
1666 TYPE_CODE (type) = TYPE_CODE_ARRAY;
1667 TYPE_TARGET_TYPE (type) = base_type;
1668 TYPE_LENGTH (type) = n * TYPE_LENGTH (base_type);
1669 }
1670 return type;
1671 }
1672
1673 /* Reference to existing type */
1674 if (cs->c_nsyms > 1 && aux->x_sym.x_tagndx != 0)
1675 {
1676 type = coff_alloc_type (aux->x_sym.x_tagndx);
1677 return type;
1678 }
1679
1680 return decode_base_type (cs, BTYPE (c_type), aux);
1681 }
1682
1683 /* Decode a coff type specifier for function definition;
1684 return the type that the function returns. */
1685
1686 static
1687 struct type *
1688 decode_function_type (cs, c_type, aux)
1689 register struct coff_symbol *cs;
1690 unsigned int c_type;
1691 register AUXENT *aux;
1692 {
1693 if (aux->x_sym.x_tagndx == 0)
1694 cs->c_nsyms = 1; /* auxent refers to function, not base type */
1695
1696 return decode_type (cs, DECREF (cs->c_type), aux);
1697 }
1698 \f
1699 /* basic C types */
1700
1701 static
1702 struct type *
1703 decode_base_type (cs, c_type, aux)
1704 register struct coff_symbol *cs;
1705 unsigned int c_type;
1706 register AUXENT *aux;
1707 {
1708 struct type *type;
1709
1710 switch (c_type)
1711 {
1712 case T_NULL:
1713 /* shows up with "void (*foo)();" structure members */
1714 return builtin_type_void;
1715
1716 case T_ARG:
1717 /* shouldn't show up here */
1718 break;
1719
1720 case T_CHAR:
1721 return builtin_type_char;
1722
1723 case T_SHORT:
1724 return builtin_type_short;
1725
1726 case T_INT:
1727 return builtin_type_int;
1728
1729 case T_LONG:
1730 return builtin_type_long;
1731
1732 case T_FLOAT:
1733 return builtin_type_float;
1734
1735 case T_DOUBLE:
1736 return builtin_type_double;
1737
1738 case T_STRUCT:
1739 if (cs->c_nsyms != 2)
1740 {
1741 /* anonymous structure type */
1742 type = coff_alloc_type (cs->c_symnum);
1743 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1744 TYPE_NAME (type) = concat ("struct ", "<opaque>", "");
1745 TYPE_LENGTH (type) = 0;
1746 TYPE_FIELDS (type) = 0;
1747 TYPE_NFIELDS (type) = 0;
1748 }
1749 else
1750 {
1751 type = read_struct_type (cs->c_symnum,
1752 aux->x_sym.x_misc.x_lnsz.x_size,
1753 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1754 }
1755 return type;
1756
1757 case T_UNION:
1758 if (cs->c_nsyms != 2)
1759 {
1760 /* anonymous union type */
1761 type = coff_alloc_type (cs->c_symnum);
1762 TYPE_NAME (type) = concat ("union ", "<opaque>", "");
1763 TYPE_LENGTH (type) = 0;
1764 TYPE_FIELDS (type) = 0;
1765 TYPE_NFIELDS (type) = 0;
1766 }
1767 else
1768 {
1769 type = read_struct_type (cs->c_symnum,
1770 aux->x_sym.x_misc.x_lnsz.x_size,
1771 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1772 }
1773 TYPE_CODE (type) = TYPE_CODE_UNION;
1774 return type;
1775
1776 case T_ENUM:
1777 return read_enum_type (cs->c_symnum,
1778 aux->x_sym.x_misc.x_lnsz.x_size,
1779 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1780
1781 case T_MOE:
1782 /* shouldn't show up here */
1783 break;
1784
1785 case T_UCHAR:
1786 return builtin_type_unsigned_char;
1787
1788 case T_USHORT:
1789 return builtin_type_unsigned_short;
1790
1791 case T_UINT:
1792 return builtin_type_unsigned_int;
1793
1794 case T_ULONG:
1795 return builtin_type_unsigned_long;
1796 }
1797 printf ("unexpected type %d at symnum %d\n", c_type, cs->c_symnum);
1798 return builtin_type_void;
1799 }
1800 \f
1801 /* This page contains subroutines of read_type. */
1802
1803 /* Read the description of a structure (or union type)
1804 and return an object describing the type. */
1805
1806 static struct type *
1807 read_struct_type (index, length, lastsym)
1808 int index;
1809 int length;
1810 int lastsym;
1811 {
1812 struct nextfield
1813 {
1814 struct nextfield *next;
1815 struct field field;
1816 };
1817
1818 register struct type *type;
1819 register struct nextfield *list = 0;
1820 struct nextfield *new;
1821 int nfields = 0;
1822 register int n;
1823 char *name;
1824 #ifdef NAMES_HAVE_UNDERSCORE
1825 int offset = 1;
1826 #else
1827 int offset = 0;
1828 #endif
1829 struct coff_symbol member_sym;
1830 register struct coff_symbol *ms = &member_sym;
1831 SYMENT sub_sym;
1832 AUXENT sub_aux;
1833 int done = 0;
1834
1835 type = coff_alloc_type (index);
1836 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1837 TYPE_LENGTH (type) = length;
1838
1839 while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1840 {
1841 read_one_sym (ms, &sub_sym, &sub_aux);
1842 name = ms->c_name;
1843 name = (name[0] == '_' ? name + offset : name);
1844
1845 switch (ms->c_sclass)
1846 {
1847 case C_MOS:
1848 case C_MOU:
1849
1850 /* Get space to record the next field's data. */
1851 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1852 new->next = list;
1853 list = new;
1854
1855 /* Save the data. */
1856 list->field.name = savestring (name, strlen (name));
1857 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1858 list->field.bitpos = 8 * ms->c_value;
1859 list->field.bitsize = 0;
1860 nfields++;
1861 break;
1862
1863 case C_FIELD:
1864
1865 /* Get space to record the next field's data. */
1866 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1867 new->next = list;
1868 list = new;
1869
1870 /* Save the data. */
1871 list->field.name = savestring (name, strlen (name));
1872 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1873 list->field.bitpos = ms->c_value;
1874 list->field.bitsize = sub_aux.x_sym.x_misc.x_lnsz.x_size;
1875 nfields++;
1876 break;
1877
1878 case C_EOS:
1879 done = 1;
1880 break;
1881 }
1882 }
1883 /* Now create the vector of fields, and record how big it is. */
1884
1885 TYPE_NFIELDS (type) = nfields;
1886 TYPE_FIELDS (type) = (struct field *)
1887 obstack_alloc (symbol_obstack, sizeof (struct field) * nfields);
1888
1889 /* Copy the saved-up fields into the field vector. */
1890
1891 for (n = nfields; list; list = list->next)
1892 TYPE_FIELD (type, --n) = list->field;
1893
1894 return type;
1895 }
1896 \f
1897 /* Read a definition of an enumeration type,
1898 and create and return a suitable type object.
1899 Also defines the symbols that represent the values of the type. */
1900
1901 static struct type *
1902 read_enum_type (index, length, lastsym)
1903 int index;
1904 int length;
1905 int lastsym;
1906 {
1907 register struct symbol *sym;
1908 register struct type *type;
1909 int nsyms = 0;
1910 struct pending **symlist;
1911 struct coff_symbol member_sym;
1912 register struct coff_symbol *ms = &member_sym;
1913 SYMENT sub_sym;
1914 AUXENT sub_aux;
1915 struct pending *osyms, *syms;
1916 register int n;
1917 char *name;
1918 #ifdef NAMES_HAVE_UNDERSCORE
1919 int offset = 1;
1920 #else
1921 int offset = 0;
1922 #endif
1923
1924 type = coff_alloc_type (index);
1925 if (within_function)
1926 symlist = &local_symbols;
1927 else
1928 symlist = &file_symbols;
1929 osyms = *symlist;
1930
1931 while (symnum < lastsym && symnum < nlist_nsyms_global)
1932 {
1933 read_one_sym (ms, &sub_sym, &sub_aux);
1934 name = ms->c_name;
1935 name = (name[0] == '_' ? name + offset : name);
1936
1937 switch (ms->c_sclass)
1938 {
1939 case C_MOE:
1940 sym = (struct symbol *) xmalloc (sizeof (struct symbol));
1941 bzero (sym, sizeof (struct symbol));
1942
1943 SYMBOL_NAME (sym) = savestring (name, strlen (name));
1944 SYMBOL_CLASS (sym) = LOC_CONST;
1945 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1946 SYMBOL_VALUE (sym) = ms->c_value;
1947 add_symbol_to_list (sym, symlist);
1948 nsyms++;
1949 break;
1950
1951 case C_EOS:
1952 break;
1953 }
1954 }
1955
1956 /* Now fill in the fields of the type-structure. */
1957
1958 TYPE_LENGTH (type) = sizeof (int);
1959 TYPE_CODE (type) = TYPE_CODE_ENUM;
1960 TYPE_NFIELDS (type) = nsyms;
1961 TYPE_FIELDS (type) = (struct field *)
1962 obstack_alloc (symbol_obstack, sizeof (struct field) * nsyms);
1963
1964 /* Find the symbols for the values and put them into the type.
1965 The symbols can be found in the symlist that we put them on
1966 to cause them to be defined. osyms contains the old value
1967 of that symlist; everything up to there was defined by us. */
1968
1969 for (syms = *symlist, n = nsyms; syms != osyms; syms = syms->next)
1970 {
1971 SYMBOL_TYPE (syms->symbol) = type;
1972 TYPE_FIELD_NAME (type, --n) = SYMBOL_NAME (syms->symbol);
1973 TYPE_FIELD_VALUE (type, n) = 0;
1974 TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (syms->symbol);
1975 TYPE_FIELD_BITSIZE (type, n) = 0;
1976 }
1977 return type;
1978 }
1979
1980 /* This function is really horrible, but to avoid it, there would need
1981 to be more filling in of forward references. THIS SHOULD BE MOVED
1982 OUT OF COFFREAD.C AND DBXREAD.C TO SOME PLACE WHERE IT CAN BE SHARED. */
1983 int
1984 fill_in_vptr_fieldno (type)
1985 struct type *type;
1986 {
1987 if (TYPE_VPTR_FIELDNO (type) < 0)
1988 TYPE_VPTR_FIELDNO (type) =
1989 fill_in_vptr_fieldno (TYPE_BASECLASS (type, 1));
1990 return TYPE_VPTR_FIELDNO (type);
1991 }
1992
1993 /* partial symbol tables are not implemented in coff, therefore
1994 block_for_pc() (and others) will never decide to call this. */
1995
1996 extern struct symtab *
1997 psymtab_to_symtab ()
1998 {
1999 fatal ("error: Someone called psymtab_to_symtab\n");
2000 }
2001
2002 /* These will stay zero all the time */
2003 struct psymbol_allocation_list global_psymbols, static_psymbols;
2004
2005 _initialize_coff ()
2006 {
2007 symfile = 0;
2008
2009 bzero (&global_psymbols, sizeof (global_psymbols));
2010 bzero (&static_psymbols, sizeof (static_psymbols));
2011
2012 add_com ("symbol-file", class_files, symbol_file_command,
2013 "Load symbol table (in coff format) from executable file FILE.");
2014 }
2015
2016
2017 #endif /* COFF_FORMAT */
2018
This page took 0.130412 seconds and 4 git commands to generate.