gdb-3.4
[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 "defs.h"
24 #include "param.h"
25 #ifdef COFF_FORMAT
26 #include "symtab.h"
27
28 #ifdef USG
29 #include <sys/types.h>
30 #include <fcntl.h>
31 #endif
32
33 #include <a.out.h>
34 #include <stdio.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) < 0)
766 error ("\"%s\": can't read text section header", name);
767
768 /* Read the line number table, all at once. */
769
770 val = init_lineno (desc, text_hdr.s_lnnoptr, text_hdr.s_nlnno);
771 if (val < 0)
772 error ("\"%s\": error reading line numbers\n", name);
773
774 /* Now read the string table, all at once. */
775
776 val = init_stringtab (desc, symtab_offset + num_symbols * SYMESZ);
777 if (val < 0)
778 {
779 free_all_symtabs ();
780 printf ("\"%s\": can't get string table", name);
781 fflush (stdout);
782 return;
783 }
784 make_cleanup (free_stringtab, 0);
785
786 /* Position to read the symbol table. Do not read it all at once. */
787 val = lseek (desc, (long)symtab_offset, 0);
788 if (val < 0)
789 perror_with_name (name);
790
791 init_misc_functions ();
792 make_cleanup (discard_misc_bunches, 0);
793
794 /* Now that the executable file is positioned at symbol table,
795 process it and define symbols accordingly. */
796
797 read_coff_symtab (desc, num_symbols);
798
799 patch_opaque_types ();
800
801 /* Sort symbols alphabetically within each block. */
802
803 sort_syms ();
804
805 /* Go over the misc functions and install them in vector. */
806
807 condense_misc_bunches ();
808
809 /* Don't allow char * to have a typename (else would get caddr_t.) */
810
811 TYPE_NAME (lookup_pointer_type (builtin_type_char)) = 0;
812
813 /* Make a default for file to list. */
814
815 select_source_symtab (0);
816
817 symfile = savestring (name, strlen (name));
818
819 do_cleanups (old_chain);
820
821 printf ("done.\n");
822 fflush (stdout);
823 }
824
825 /* Return name of file symbols were loaded from, or 0 if none.. */
826
827 char *
828 get_sym_file ()
829 {
830 return symfile;
831 }
832 \f
833 /* Simplified internal version of coff symbol table information */
834
835 struct coff_symbol {
836 char *c_name;
837 int c_symnum; /* symbol number of this entry */
838 int c_nsyms; /* 1 if syment only, 2 if syment + auxent */
839 long c_value;
840 int c_sclass;
841 int c_secnum;
842 unsigned int c_type;
843 };
844
845 /* Given pointers to a symbol table in coff style exec file,
846 analyze them and create struct symtab's describing the symbols.
847 NSYMS is the number of symbols in the symbol table.
848 We read them one at a time using read_one_sym (). */
849
850 static void
851 read_coff_symtab (desc, nsyms)
852 int desc;
853 int nsyms;
854 {
855 int newfd; /* Avoid multiple closes on same desc */
856 FILE *stream;
857 register struct context_stack *new;
858 struct coff_symbol coff_symbol;
859 register struct coff_symbol *cs = &coff_symbol;
860 static SYMENT main_sym;
861 static AUXENT main_aux;
862 struct coff_symbol fcn_cs_saved;
863 static SYMENT fcn_sym_saved;
864 static AUXENT fcn_aux_saved;
865
866 int num_object_files = 0;
867 int next_file_symnum = -1;
868 char *filestring;
869 int depth;
870 int fcn_first_line;
871 int fcn_last_line;
872 int fcn_start_addr;
873 long fcn_line_ptr;
874 struct cleanup *old_chain;
875
876
877 newfd = dup (desc);
878 if (newfd == -1)
879 fatal ("Too many open files");
880 stream = fdopen (newfd, "r");
881
882 old_chain = make_cleanup (free_all_symtabs, 0);
883 make_cleanup (fclose, stream);
884 nlist_stream_global = stream;
885 nlist_nsyms_global = nsyms;
886 last_source_file = 0;
887 bzero (opaque_type_chain, sizeof opaque_type_chain);
888
889 type_vector_length = 160;
890 type_vector = (struct typevector *)
891 xmalloc (sizeof (struct typevector)
892 + type_vector_length * sizeof (struct type *));
893 bzero (type_vector->type, type_vector_length * sizeof (struct type *));
894
895 start_symtab ();
896
897 symnum = 0;
898 while (symnum < nsyms)
899 {
900 QUIT; /* Make this command interruptable. */
901 read_one_sym (cs, &main_sym, &main_aux);
902
903 if (cs->c_symnum == next_file_symnum && cs->c_sclass != C_FILE)
904 {
905 CORE_ADDR last_file_end = cur_src_end_addr;
906
907 if (last_source_file)
908 end_symtab ();
909
910 start_symtab ();
911 complete_symtab ("_globals_", 0, first_object_file_end);
912 /* done with all files, everything from here on out is globals */
913 }
914
915 /* Special case for file with type declarations only, no text. */
916 if (!last_source_file && cs->c_type != T_NULL && cs->c_secnum == N_DEBUG)
917 complete_symtab (filestring, 0, 0);
918
919 /* Typedefs should not be treated as symbol definitions. */
920 if (ISFCN (cs->c_type) && cs->c_sclass != C_TPDEF)
921 {
922 /* record as misc function. if we get '.bf' next,
923 * then we undo this step
924 */
925 record_misc_function (cs->c_name, cs->c_value);
926
927 fcn_line_ptr = main_aux.x_sym.x_fcnary.x_fcn.x_lnnoptr;
928 fcn_start_addr = cs->c_value;
929 fcn_cs_saved = *cs;
930 fcn_sym_saved = main_sym;
931 fcn_aux_saved = main_aux;
932 continue;
933 }
934
935 switch (cs->c_sclass)
936 {
937 case C_EFCN:
938 case C_EXTDEF:
939 case C_ULABEL:
940 case C_USTATIC:
941 case C_LINE:
942 case C_ALIAS:
943 case C_HIDDEN:
944 printf ("Bad n_sclass = %d\n", cs->c_sclass);
945 break;
946
947 case C_FILE:
948 /*
949 * c_value field contains symnum of next .file entry in table
950 * or symnum of first global after last .file.
951 */
952 next_file_symnum = cs->c_value;
953 filestring = getfilename (&main_aux);
954 /*
955 * Complete symbol table for last object file
956 * containing debugging information.
957 */
958 if (last_source_file)
959 {
960 end_symtab ();
961 start_symtab ();
962 }
963 num_object_files++;
964 break;
965
966 case C_STAT:
967 if (cs->c_name[0] == '.') {
968 if (strcmp (cs->c_name, _TEXT) == 0) {
969 if (num_object_files == 1) {
970 /* last address of startup file */
971 first_object_file_end = cs->c_value +
972 main_aux.x_scn.x_scnlen;
973 }
974 /* for some reason the old code didn't do
975 * this if this section entry had
976 * main_aux.x_scn.x_nlinno equal to 0
977 */
978 complete_symtab (filestring, cs->c_value,
979 main_aux.x_scn.x_scnlen);
980 }
981 /* flush rest of '.' symbols */
982 break;
983 }
984 /* fall in for static symbols that don't start with '.' */
985 case C_EXT:
986 if (cs->c_sclass == C_EXT &&
987 cs->c_secnum == N_ABS &&
988 strcmp (cs->c_name, _ETEXT) == 0)
989 end_of_text_addr = cs->c_value;
990 if (cs->c_type == T_NULL) {
991 if (cs->c_secnum <= 1) { /* text or abs */
992 record_misc_function (cs->c_name, cs->c_value);
993 break;
994 } else {
995 cs->c_type = T_INT;
996 }
997 }
998 (void) process_coff_symbol (cs, &main_aux);
999 break;
1000
1001 case C_FCN:
1002 if (strcmp (cs->c_name, ".bf") == 0)
1003 {
1004 #if 0
1005 /* Don't do this; we want all functions to be on the
1006 mfl now. */
1007 unrecord_misc_function ();
1008 #endif
1009
1010 within_function = 1;
1011
1012 /* value contains address of first non-init type code */
1013 /* main_aux.x_sym.x_misc.x_lnsz.x_lnno
1014 contains line number of '{' } */
1015 fcn_first_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1016
1017 new = (struct context_stack *)
1018 xmalloc (sizeof (struct context_stack));
1019 new->depth = depth = 0;
1020 new->next = 0;
1021 context_stack = new;
1022 new->locals = 0;
1023 new->old_blocks = pending_blocks;
1024 new->start_addr = fcn_start_addr;
1025 fcn_cs_saved.c_name = getsymname (&fcn_sym_saved);
1026 new->name = process_coff_symbol (&fcn_cs_saved,
1027 &fcn_aux_saved);
1028 }
1029 else if (strcmp (cs->c_name, ".ef") == 0)
1030 {
1031 /* the value of .ef is the address of epilogue code;
1032 * not useful for gdb
1033 */
1034 /* { main_aux.x_sym.x_misc.x_lnsz.x_lnno
1035 contains number of lines to '}' */
1036 fcn_last_line = main_aux.x_sym.x_misc.x_lnsz.x_lnno;
1037 enter_linenos (fcn_line_ptr, fcn_first_line, fcn_last_line);
1038 new = context_stack;
1039
1040 if (new == 0)
1041 error ("Invalid symbol data; .bf/.ef/.bb/.eb symbol mismatch, at symbol %d.",
1042 symnum);
1043
1044 finish_block (new->name, &local_symbols, new->old_blocks,
1045 new->start_addr,
1046 fcn_cs_saved.c_value +
1047 fcn_aux_saved.x_sym.x_misc.x_fsize);
1048 context_stack = 0;
1049 within_function = 0;
1050 free (new);
1051 }
1052 break;
1053
1054 case C_BLOCK:
1055 if (strcmp (cs->c_name, ".bb") == 0)
1056 {
1057 new = (struct context_stack *)
1058 xmalloc (sizeof (struct context_stack));
1059 depth++;
1060 new->depth = depth;
1061 new->next = context_stack;
1062 context_stack = new;
1063 new->locals = local_symbols;
1064 new->old_blocks = pending_blocks;
1065 new->start_addr = cs->c_value;
1066 new->name = 0;
1067 local_symbols = 0;
1068 }
1069 else if (strcmp (cs->c_name, ".eb") == 0)
1070 {
1071 new = context_stack;
1072 if (new == 0 || depth != new->depth)
1073 error ("Invalid symbol data: .bb/.eb symbol mismatch at symbol %d.",
1074 symnum);
1075 if (local_symbols && context_stack->next)
1076 {
1077 /* Make a block for the local symbols within. */
1078 finish_block (0, &local_symbols, new->old_blocks,
1079 new->start_addr, cs->c_value);
1080 }
1081 depth--;
1082 local_symbols = new->locals;
1083 context_stack = new->next;
1084 free (new);
1085 }
1086 break;
1087
1088 default:
1089 (void) process_coff_symbol (cs, &main_aux);
1090 break;
1091 }
1092 }
1093
1094 if (last_source_file)
1095 end_symtab ();
1096 fclose (stream);
1097 discard_cleanups (old_chain);
1098 }
1099 \f
1100 /* Routines for reading headers and symbols from executable. */
1101
1102 /* Read COFF file header, check magic number,
1103 and return number of symbols. */
1104 read_file_hdr (chan, file_hdr)
1105 int chan;
1106 FILHDR *file_hdr;
1107 {
1108 lseek (chan, 0L, 0);
1109 if (myread (chan, (char *)file_hdr, FILHSZ) < 0)
1110 return -1;
1111
1112 switch (file_hdr->f_magic)
1113 {
1114 #ifdef MC68MAGIC
1115 case MC68MAGIC:
1116 #endif
1117 #ifdef NS32GMAGIC
1118 case NS32GMAGIC:
1119 case NS32SMAGIC:
1120 #endif
1121 #ifdef I386MAGIC
1122 case I386MAGIC:
1123 #endif
1124 #ifdef CLIPPERMAGIC
1125 case CLIPPERMAGIC:
1126 #endif
1127 return file_hdr->f_nsyms;
1128
1129 default:
1130 #ifdef BADMAG
1131 if (BADMAG(file_hdr))
1132 return -1;
1133 else
1134 return file_hdr->f_nsyms;
1135 #else
1136 return -1;
1137 #endif
1138 }
1139 }
1140
1141 read_aout_hdr (chan, aout_hdr, size)
1142 int chan;
1143 AOUTHDR *aout_hdr;
1144 int size;
1145 {
1146 lseek (chan, (long)FILHSZ, 0);
1147 if (size != sizeof (AOUTHDR))
1148 return -1;
1149 if (myread (chan, (char *)aout_hdr, size) != size)
1150 return -1;
1151 return 0;
1152 }
1153
1154 read_section_hdr (chan, section_name, section_hdr, nsects)
1155 register int chan;
1156 register char *section_name;
1157 SCNHDR *section_hdr;
1158 register int nsects;
1159 {
1160 register int i;
1161
1162 if (lseek (chan, FILHSZ + sizeof (AOUTHDR), 0) < 0)
1163 return -1;
1164
1165 for (i = 0; i < nsects; i++)
1166 {
1167 if (myread (chan, (char *)section_hdr, SCNHSZ) < 0)
1168 return -1;
1169 if (strncmp (section_hdr->s_name, section_name, 8) == 0)
1170 return 0;
1171 }
1172 return -1;
1173 }
1174
1175 read_one_sym (cs, sym, aux)
1176 register struct coff_symbol *cs;
1177 register SYMENT *sym;
1178 register AUXENT *aux;
1179 {
1180 cs->c_symnum = symnum;
1181 fread ((char *)sym, SYMESZ, 1, nlist_stream_global);
1182 cs->c_nsyms = (sym->n_numaux & 0xff) + 1;
1183 if (cs->c_nsyms == 2)
1184 {
1185 /* doc for coff says there is either no aux entry or just one */
1186 fread ((char *)aux, AUXESZ, 1, nlist_stream_global);
1187 }
1188 else if (cs->c_nsyms > 2)
1189 error ("more than one aux symbol table entry at symnum=%d\n", symnum);
1190
1191 cs->c_name = getsymname (sym);
1192 cs->c_value = sym->n_value;
1193 cs->c_sclass = (sym->n_sclass & 0xff);
1194 cs->c_secnum = sym->n_scnum;
1195 cs->c_type = (unsigned) sym->n_type;
1196
1197 symnum += cs->c_nsyms;
1198 }
1199 \f
1200 /* Support for string table handling */
1201
1202 static char *stringtab = NULL;
1203
1204 static int
1205 init_stringtab (chan, offset)
1206 int chan;
1207 long offset;
1208 {
1209 long buffer;
1210 int val;
1211
1212 if (stringtab)
1213 {
1214 free (stringtab);
1215 stringtab = NULL;
1216 }
1217
1218 if (lseek (chan, offset, 0) < 0)
1219 return -1;
1220
1221 val = myread (chan, (char *)&buffer, sizeof buffer);
1222
1223 /* If no string table is needed, then the file may end immediately
1224 after the symbols. Just return with `stringtab' set to null. */
1225 if (val != sizeof buffer || buffer == 0)
1226 return 0;
1227
1228 stringtab = (char *) xmalloc (buffer);
1229 if (stringtab == NULL)
1230 return -1;
1231
1232 bcopy (&buffer, stringtab, sizeof buffer);
1233
1234 val = myread (chan, stringtab + sizeof buffer, buffer - sizeof buffer);
1235 if (val != buffer - sizeof buffer || stringtab[buffer - 1] != '\0')
1236 return -1;
1237
1238 return 0;
1239 }
1240
1241 static void
1242 free_stringtab ()
1243 {
1244 if (stringtab)
1245 free (stringtab);
1246 stringtab = NULL;
1247 }
1248
1249 static char *
1250 getsymname (symbol_entry)
1251 SYMENT *symbol_entry;
1252 {
1253 static char buffer[SYMNMLEN+1];
1254 char *result;
1255
1256 if (symbol_entry->n_zeroes == 0)
1257 {
1258 result = stringtab + symbol_entry->n_offset;
1259 }
1260 else
1261 {
1262 strncpy (buffer, symbol_entry->n_name, SYMNMLEN);
1263 buffer[SYMNMLEN] = '\0';
1264 result = buffer;
1265 }
1266 return result;
1267 }
1268
1269 static char *
1270 getfilename (aux_entry)
1271 AUXENT *aux_entry;
1272 {
1273 static char buffer[BUFSIZ];
1274 register char *temp;
1275 char *result;
1276 extern char *rindex ();
1277
1278 #ifndef COFF_NO_LONG_FILE_NAMES
1279 if (aux_entry->x_file.x_foff != 0)
1280 strcpy (buffer, stringtab + aux_entry->x_file.x_foff);
1281 else
1282 #endif
1283 {
1284 strncpy (buffer, aux_entry->x_file.x_fname, FILNMLEN);
1285 buffer[FILNMLEN] = '\0';
1286 }
1287 result = buffer;
1288 if ((temp = rindex (result, '/')) != NULL)
1289 result = temp + 1;
1290 return (result);
1291 }
1292
1293 /* Support for line number handling */
1294 static char *linetab = NULL;
1295 static long linetab_offset;
1296 static int linetab_count;
1297
1298 static int
1299 init_lineno (chan, offset, count)
1300 int chan;
1301 long offset;
1302 int count;
1303 {
1304 int val;
1305
1306 if (lseek (chan, offset, 0) < 0)
1307 return -1;
1308
1309 if (linetab)
1310 free (linetab);
1311 linetab = (char *) xmalloc (count * LINESZ);
1312
1313 val = myread (chan, linetab, count * LINESZ);
1314 if (val != count * LINESZ)
1315 return -1;
1316
1317 linetab_offset = offset;
1318 linetab_count = count;
1319 return 0;
1320 }
1321
1322 static void
1323 enter_linenos (file_offset, first_line, last_line)
1324 long file_offset;
1325 register int first_line;
1326 register int last_line;
1327 {
1328 register char *rawptr = &linetab[file_offset - linetab_offset];
1329 struct lineno lptr;
1330
1331 /* skip first line entry for each function */
1332 rawptr += LINESZ;
1333 /* line numbers start at one for the first line of the function */
1334 first_line--;
1335
1336 /* Bcopy since occaisionally rawptr isn't pointing at long
1337 boundaries. */
1338 for (bcopy (rawptr, &lptr, LINESZ);
1339 lptr.l_lnno && lptr.l_lnno <= last_line;
1340 rawptr += LINESZ, bcopy (rawptr, &lptr, LINESZ))
1341 {
1342 record_line (first_line + lptr.l_lnno, lptr.l_addr.l_paddr);
1343 }
1344 }
1345 \f
1346 static int
1347 hashname (name)
1348 char *name;
1349 {
1350 register char *p = name;
1351 register int total = p[0];
1352 register int c;
1353
1354 c = p[1];
1355 total += c << 2;
1356 if (c)
1357 {
1358 c = p[2];
1359 total += c << 4;
1360 if (c)
1361 total += p[3] << 6;
1362 }
1363
1364 return total % HASHSIZE;
1365 }
1366
1367 static void
1368 patch_type (type, real_type)
1369 struct type *type;
1370 struct type *real_type;
1371 {
1372 register struct type *target = TYPE_TARGET_TYPE (type);
1373 register struct type *real_target = TYPE_TARGET_TYPE (real_type);
1374 int field_size = TYPE_NFIELDS (real_target) * sizeof (struct field);
1375
1376 TYPE_LENGTH (target) = TYPE_LENGTH (real_target);
1377 TYPE_NFIELDS (target) = TYPE_NFIELDS (real_target);
1378 TYPE_FIELDS (target) = (struct field *)
1379 obstack_alloc (symbol_obstack, field_size);
1380
1381 bcopy (TYPE_FIELDS (real_target), TYPE_FIELDS (target), field_size);
1382
1383 if (TYPE_NAME (real_target))
1384 {
1385 if (TYPE_NAME (target))
1386 free (TYPE_NAME (target));
1387 TYPE_NAME (target) = concat (TYPE_NAME (real_target), "", "");
1388 }
1389 }
1390
1391 /* Patch up all appropriate typdef symbols in the opaque_type_chains
1392 so that they can be used to print out opaque data structures properly */
1393
1394 static void
1395 patch_opaque_types ()
1396 {
1397 struct symtab *s;
1398
1399 /* Look at each symbol in the per-file block of each symtab. */
1400 for (s = symtab_list; s; s = s->next)
1401 {
1402 register struct block *b;
1403 register int i;
1404
1405 /* Go through the per-file symbols only */
1406 b = BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), 1);
1407 for (i = BLOCK_NSYMS (b) - 1; i >= 0; i--)
1408 {
1409 register struct symbol *real_sym;
1410
1411 /* Find completed typedefs to use to fix opaque ones.
1412 Remove syms from the chain when their types are stored,
1413 but search the whole chain, as there may be several syms
1414 from different files with the same name. */
1415 real_sym = BLOCK_SYM (b, i);
1416 if (SYMBOL_CLASS (real_sym) == LOC_TYPEDEF &&
1417 SYMBOL_NAMESPACE (real_sym) == VAR_NAMESPACE &&
1418 TYPE_CODE (SYMBOL_TYPE (real_sym)) == TYPE_CODE_PTR &&
1419 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (real_sym))) != 0)
1420 {
1421 register char *name = SYMBOL_NAME (real_sym);
1422 register int hash = hashname (name);
1423 register struct symbol *sym, *prev;
1424
1425 prev = 0;
1426 for (sym = opaque_type_chain[hash]; sym;)
1427 {
1428 if (name[0] == SYMBOL_NAME (sym)[0] &&
1429 !strcmp (name + 1, SYMBOL_NAME (sym) + 1))
1430 {
1431 if (prev)
1432 SYMBOL_VALUE (prev) = SYMBOL_VALUE (sym);
1433 else
1434 opaque_type_chain[hash]
1435 = (struct symbol *) SYMBOL_VALUE (sym);
1436
1437 patch_type (SYMBOL_TYPE (sym), SYMBOL_TYPE (real_sym));
1438
1439 if (prev)
1440 sym = (struct symbol *) SYMBOL_VALUE (prev);
1441 else
1442 sym = opaque_type_chain[hash];
1443 }
1444 else
1445 {
1446 prev = sym;
1447 sym = (struct symbol *) SYMBOL_VALUE (sym);
1448 }
1449 }
1450 }
1451 }
1452 }
1453 }
1454 \f
1455 static struct symbol *
1456 process_coff_symbol (cs, aux)
1457 register struct coff_symbol *cs;
1458 register AUXENT *aux;
1459 {
1460 register struct symbol *sym
1461 = (struct symbol *) obstack_alloc (symbol_obstack, sizeof (struct symbol));
1462 char *name;
1463 char *dot;
1464 #ifdef NAMES_HAVE_UNDERSCORE
1465 int offset = 1;
1466 #else
1467 int offset = 0;
1468 #endif
1469
1470 bzero (sym, sizeof (struct symbol));
1471 name = cs->c_name;
1472 name = (name[0] == '_' ? name + offset : name);
1473 SYMBOL_NAME (sym) = obstack_copy0 (symbol_obstack, name, strlen (name));
1474
1475 /* default assumptions */
1476 SYMBOL_VALUE (sym) = cs->c_value;
1477 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1478
1479 if (ISFCN (cs->c_type))
1480 {
1481 SYMBOL_TYPE (sym) =
1482 lookup_function_type (decode_function_type (cs, cs->c_type, aux));
1483 SYMBOL_CLASS (sym) = LOC_BLOCK;
1484 if (cs->c_sclass == C_STAT)
1485 add_symbol_to_list (sym, &file_symbols);
1486 else if (cs->c_sclass == C_EXT)
1487 add_symbol_to_list (sym, &global_symbols);
1488 }
1489 else
1490 {
1491 SYMBOL_TYPE (sym) = decode_type (cs, cs->c_type, aux);
1492 switch (cs->c_sclass)
1493 {
1494 case C_NULL:
1495 break;
1496
1497 case C_AUTO:
1498 SYMBOL_CLASS (sym) = LOC_LOCAL;
1499 add_symbol_to_list (sym, &local_symbols);
1500 break;
1501
1502 case C_EXT:
1503 SYMBOL_CLASS (sym) = LOC_STATIC;
1504 add_symbol_to_list (sym, &global_symbols);
1505 break;
1506
1507 case C_STAT:
1508 SYMBOL_CLASS (sym) = LOC_STATIC;
1509 if (within_function) {
1510 /* Static symbol of local scope */
1511 add_symbol_to_list (sym, &local_symbols);
1512 }
1513 else {
1514 /* Static symbol at top level of file */
1515 add_symbol_to_list (sym, &file_symbols);
1516 }
1517 break;
1518
1519 case C_REG:
1520 SYMBOL_CLASS (sym) = LOC_REGISTER;
1521 add_symbol_to_list (sym, &local_symbols);
1522 break;
1523
1524 case C_LABEL:
1525 break;
1526
1527 case C_ARG:
1528 SYMBOL_CLASS (sym) = LOC_ARG;
1529 add_symbol_to_list (sym, &local_symbols);
1530 #ifndef clipper
1531 /* If PCC says a parameter is a short or a char,
1532 it is really an int. */
1533 if (SYMBOL_TYPE (sym) == builtin_type_char
1534 || SYMBOL_TYPE (sym) == builtin_type_short)
1535 SYMBOL_TYPE (sym) = builtin_type_int;
1536 else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
1537 || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
1538 SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
1539 #endif
1540 break;
1541
1542 case C_REGPARM:
1543 SYMBOL_CLASS (sym) = LOC_REGPARM;
1544 add_symbol_to_list (sym, &local_symbols);
1545 #ifndef clipper
1546 /* If PCC says a parameter is a short or a char,
1547 it is really an int. */
1548 if (SYMBOL_TYPE (sym) == builtin_type_char
1549 || SYMBOL_TYPE (sym) == builtin_type_short)
1550 SYMBOL_TYPE (sym) = builtin_type_int;
1551 else if (SYMBOL_TYPE (sym) == builtin_type_unsigned_char
1552 || SYMBOL_TYPE (sym) == builtin_type_unsigned_short)
1553 SYMBOL_TYPE (sym) = builtin_type_unsigned_int;
1554 #endif
1555 break;
1556
1557 case C_TPDEF:
1558 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1559 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1560
1561 /* If type has no name, give it one */
1562 if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
1563 && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
1564 TYPE_NAME (SYMBOL_TYPE (sym))
1565 = concat (SYMBOL_NAME (sym), "", "");
1566
1567 /* Keep track of any type which points to empty structured type,
1568 so it can be filled from a definition from another file */
1569 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_PTR &&
1570 TYPE_LENGTH (TYPE_TARGET_TYPE (SYMBOL_TYPE (sym))) == 0)
1571 {
1572 register int i = hashname (SYMBOL_NAME (sym));
1573
1574 SYMBOL_VALUE (sym) = (int) opaque_type_chain[i];
1575 opaque_type_chain[i] = sym;
1576 }
1577 add_symbol_to_list (sym, &file_symbols);
1578 break;
1579
1580 case C_STRTAG:
1581 case C_UNTAG:
1582 case C_ENTAG:
1583 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1584 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1585 if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0
1586 && (TYPE_FLAGS (SYMBOL_TYPE (sym)) & TYPE_FLAG_PERM) == 0)
1587 TYPE_NAME (SYMBOL_TYPE (sym))
1588 = concat ("",
1589 (cs->c_sclass == C_ENTAG
1590 ? "enum "
1591 : (cs->c_sclass == C_STRTAG
1592 ? "struct " : "union ")),
1593 SYMBOL_NAME (sym));
1594 add_symbol_to_list (sym, &file_symbols);
1595 break;
1596
1597 default:
1598 break;
1599 }
1600 }
1601 return sym;
1602 }
1603 \f
1604 /* Decode a coff type specifier;
1605 return the type that is meant. */
1606
1607 static
1608 struct type *
1609 decode_type (cs, c_type, aux)
1610 register struct coff_symbol *cs;
1611 unsigned int c_type;
1612 register AUXENT *aux;
1613 {
1614 register struct type *type = 0;
1615 register int n;
1616 unsigned int new_c_type;
1617
1618 if (c_type & ~N_BTMASK)
1619 {
1620 new_c_type = DECREF (c_type);
1621 if (ISPTR (c_type))
1622 {
1623 type = decode_type (cs, new_c_type, aux);
1624 type = lookup_pointer_type (type);
1625 }
1626 else if (ISFCN (c_type))
1627 {
1628 type = decode_type (cs, new_c_type, aux);
1629 type = lookup_function_type (type);
1630 }
1631 else if (ISARY (c_type))
1632 {
1633 int i, n;
1634 register unsigned short *dim;
1635 struct type *base_type;
1636
1637 /* Define an array type. */
1638 /* auxent refers to array, not base type */
1639 if (aux->x_sym.x_tagndx == 0)
1640 cs->c_nsyms = 1;
1641
1642 /* shift the indices down */
1643 dim = &aux->x_sym.x_fcnary.x_ary.x_dimen[0];
1644 i = 1;
1645 n = dim[0];
1646 for (i = 0; *dim && i < DIMNUM - 1; i++, dim++)
1647 *dim = *(dim + 1);
1648 *dim = 0;
1649
1650 type = (struct type *)
1651 obstack_alloc (symbol_obstack, sizeof (struct type));
1652 bzero (type, sizeof (struct type));
1653
1654 base_type = decode_type (cs, new_c_type, aux);
1655
1656 TYPE_CODE (type) = TYPE_CODE_ARRAY;
1657 TYPE_TARGET_TYPE (type) = base_type;
1658 TYPE_LENGTH (type) = n * TYPE_LENGTH (base_type);
1659 }
1660 return type;
1661 }
1662
1663 /* Reference to existing type */
1664 if (cs->c_nsyms > 1 && aux->x_sym.x_tagndx != 0)
1665 {
1666 type = coff_alloc_type (aux->x_sym.x_tagndx);
1667 return type;
1668 }
1669
1670 return decode_base_type (cs, BTYPE (c_type), aux);
1671 }
1672
1673 /* Decode a coff type specifier for function definition;
1674 return the type that the function returns. */
1675
1676 static
1677 struct type *
1678 decode_function_type (cs, c_type, aux)
1679 register struct coff_symbol *cs;
1680 unsigned int c_type;
1681 register AUXENT *aux;
1682 {
1683 if (aux->x_sym.x_tagndx == 0)
1684 cs->c_nsyms = 1; /* auxent refers to function, not base type */
1685
1686 return decode_type (cs, DECREF (cs->c_type), aux);
1687 }
1688 \f
1689 /* basic C types */
1690
1691 static
1692 struct type *
1693 decode_base_type (cs, c_type, aux)
1694 register struct coff_symbol *cs;
1695 unsigned int c_type;
1696 register AUXENT *aux;
1697 {
1698 struct type *type;
1699
1700 switch (c_type)
1701 {
1702 case T_NULL:
1703 /* shows up with "void (*foo)();" structure members */
1704 return builtin_type_void;
1705
1706 case T_ARG:
1707 /* shouldn't show up here */
1708 break;
1709
1710 case T_CHAR:
1711 return builtin_type_char;
1712
1713 case T_SHORT:
1714 return builtin_type_short;
1715
1716 case T_INT:
1717 return builtin_type_int;
1718
1719 case T_LONG:
1720 return builtin_type_long;
1721
1722 case T_FLOAT:
1723 return builtin_type_float;
1724
1725 case T_DOUBLE:
1726 return builtin_type_double;
1727
1728 case T_STRUCT:
1729 if (cs->c_nsyms != 2)
1730 {
1731 /* anonymous structure type */
1732 type = coff_alloc_type (cs->c_symnum);
1733 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1734 TYPE_NAME (type) = concat ("struct ", "<opaque>", "");
1735 TYPE_LENGTH (type) = 0;
1736 TYPE_FIELDS (type) = 0;
1737 TYPE_NFIELDS (type) = 0;
1738 }
1739 else
1740 {
1741 type = read_struct_type (cs->c_symnum,
1742 aux->x_sym.x_misc.x_lnsz.x_size,
1743 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1744 }
1745 return type;
1746
1747 case T_UNION:
1748 if (cs->c_nsyms != 2)
1749 {
1750 /* anonymous union type */
1751 type = coff_alloc_type (cs->c_symnum);
1752 TYPE_NAME (type) = concat ("union ", "<opaque>", "");
1753 TYPE_LENGTH (type) = 0;
1754 TYPE_FIELDS (type) = 0;
1755 TYPE_NFIELDS (type) = 0;
1756 }
1757 else
1758 {
1759 type = read_struct_type (cs->c_symnum,
1760 aux->x_sym.x_misc.x_lnsz.x_size,
1761 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1762 }
1763 TYPE_CODE (type) = TYPE_CODE_UNION;
1764 return type;
1765
1766 case T_ENUM:
1767 return read_enum_type (cs->c_symnum,
1768 aux->x_sym.x_misc.x_lnsz.x_size,
1769 aux->x_sym.x_fcnary.x_fcn.x_endndx);
1770
1771 case T_MOE:
1772 /* shouldn't show up here */
1773 break;
1774
1775 case T_UCHAR:
1776 return builtin_type_unsigned_char;
1777
1778 case T_USHORT:
1779 return builtin_type_unsigned_short;
1780
1781 case T_UINT:
1782 return builtin_type_unsigned_int;
1783
1784 case T_ULONG:
1785 return builtin_type_unsigned_long;
1786 }
1787 printf ("unexpected type %d at symnum %d\n", c_type, cs->c_symnum);
1788 return builtin_type_void;
1789 }
1790 \f
1791 /* This page contains subroutines of read_type. */
1792
1793 /* Read the description of a structure (or union type)
1794 and return an object describing the type. */
1795
1796 static struct type *
1797 read_struct_type (index, length, lastsym)
1798 int index;
1799 int length;
1800 int lastsym;
1801 {
1802 struct nextfield
1803 {
1804 struct nextfield *next;
1805 struct field field;
1806 };
1807
1808 register struct type *type;
1809 register struct nextfield *list = 0;
1810 struct nextfield *new;
1811 int nfields = 0;
1812 register int n;
1813 char *name;
1814 #ifdef NAMES_HAVE_UNDERSCORE
1815 int offset = 1;
1816 #else
1817 int offset = 0;
1818 #endif
1819 struct coff_symbol member_sym;
1820 register struct coff_symbol *ms = &member_sym;
1821 SYMENT sub_sym;
1822 AUXENT sub_aux;
1823 int done = 0;
1824
1825 type = coff_alloc_type (index);
1826 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1827 TYPE_LENGTH (type) = length;
1828
1829 while (!done && symnum < lastsym && symnum < nlist_nsyms_global)
1830 {
1831 read_one_sym (ms, &sub_sym, &sub_aux);
1832 name = ms->c_name;
1833 name = (name[0] == '_' ? name + offset : name);
1834
1835 switch (ms->c_sclass)
1836 {
1837 case C_MOS:
1838 case C_MOU:
1839
1840 /* Get space to record the next field's data. */
1841 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1842 new->next = list;
1843 list = new;
1844
1845 /* Save the data. */
1846 list->field.name = savestring (name, strlen (name));
1847 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1848 list->field.bitpos = 8 * ms->c_value;
1849 list->field.bitsize = 0;
1850 nfields++;
1851 break;
1852
1853 case C_FIELD:
1854
1855 /* Get space to record the next field's data. */
1856 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1857 new->next = list;
1858 list = new;
1859
1860 /* Save the data. */
1861 list->field.name = savestring (name, strlen (name));
1862 list->field.type = decode_type (ms, ms->c_type, &sub_aux);
1863 list->field.bitpos = ms->c_value;
1864 list->field.bitsize = sub_aux.x_sym.x_misc.x_lnsz.x_size;
1865 nfields++;
1866 break;
1867
1868 case C_EOS:
1869 done = 1;
1870 break;
1871 }
1872 }
1873 /* Now create the vector of fields, and record how big it is. */
1874
1875 TYPE_NFIELDS (type) = nfields;
1876 TYPE_FIELDS (type) = (struct field *)
1877 obstack_alloc (symbol_obstack, sizeof (struct field) * nfields);
1878
1879 /* Copy the saved-up fields into the field vector. */
1880
1881 for (n = nfields; list; list = list->next)
1882 TYPE_FIELD (type, --n) = list->field;
1883
1884 return type;
1885 }
1886 \f
1887 /* Read a definition of an enumeration type,
1888 and create and return a suitable type object.
1889 Also defines the symbols that represent the values of the type. */
1890
1891 static struct type *
1892 read_enum_type (index, length, lastsym)
1893 int index;
1894 int length;
1895 int lastsym;
1896 {
1897 register struct symbol *sym;
1898 register struct type *type;
1899 int nsyms = 0;
1900 struct pending **symlist;
1901 struct coff_symbol member_sym;
1902 register struct coff_symbol *ms = &member_sym;
1903 SYMENT sub_sym;
1904 AUXENT sub_aux;
1905 struct pending *osyms, *syms;
1906 register int n;
1907 char *name;
1908 #ifdef NAMES_HAVE_UNDERSCORE
1909 int offset = 1;
1910 #else
1911 int offset = 0;
1912 #endif
1913
1914 type = coff_alloc_type (index);
1915 if (within_function)
1916 symlist = &local_symbols;
1917 else
1918 symlist = &file_symbols;
1919 osyms = *symlist;
1920
1921 while (symnum < lastsym && symnum < nlist_nsyms_global)
1922 {
1923 read_one_sym (ms, &sub_sym, &sub_aux);
1924 name = ms->c_name;
1925 name = (name[0] == '_' ? name + offset : name);
1926
1927 switch (ms->c_sclass)
1928 {
1929 case C_MOE:
1930 sym = (struct symbol *) xmalloc (sizeof (struct symbol));
1931 bzero (sym, sizeof (struct symbol));
1932
1933 SYMBOL_NAME (sym) = savestring (name, strlen (name));
1934 SYMBOL_CLASS (sym) = LOC_CONST;
1935 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1936 SYMBOL_VALUE (sym) = ms->c_value;
1937 add_symbol_to_list (sym, symlist);
1938 nsyms++;
1939 break;
1940
1941 case C_EOS:
1942 break;
1943 }
1944 }
1945
1946 /* Now fill in the fields of the type-structure. */
1947
1948 TYPE_LENGTH (type) = sizeof (int);
1949 TYPE_CODE (type) = TYPE_CODE_ENUM;
1950 TYPE_NFIELDS (type) = nsyms;
1951 TYPE_FIELDS (type) = (struct field *)
1952 obstack_alloc (symbol_obstack, sizeof (struct field) * nsyms);
1953
1954 /* Find the symbols for the values and put them into the type.
1955 The symbols can be found in the symlist that we put them on
1956 to cause them to be defined. osyms contains the old value
1957 of that symlist; everything up to there was defined by us. */
1958
1959 for (syms = *symlist, n = nsyms; syms != osyms; syms = syms->next)
1960 {
1961 SYMBOL_TYPE (syms->symbol) = type;
1962 TYPE_FIELD_NAME (type, --n) = SYMBOL_NAME (syms->symbol);
1963 TYPE_FIELD_VALUE (type, n) = 0;
1964 TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (syms->symbol);
1965 TYPE_FIELD_BITSIZE (type, n) = 0;
1966 }
1967 return type;
1968 }
1969
1970 /* This function is really horrible, but to avoid it, there would need
1971 to be more filling in of forward references. THIS SHOULD BE MOVED
1972 OUT OF COFFREAD.C AND DBXREAD.C TO SOME PLACE WHERE IT CAN BE SHARED. */
1973 int
1974 fill_in_vptr_fieldno (type)
1975 struct type *type;
1976 {
1977 if (TYPE_VPTR_FIELDNO (type) < 0)
1978 TYPE_VPTR_FIELDNO (type) =
1979 fill_in_vptr_fieldno (TYPE_BASECLASS (type, 1));
1980 return TYPE_VPTR_FIELDNO (type);
1981 }
1982
1983 /* partial symbol tables are not implemented in coff, therefore
1984 block_for_pc() (and others) will never decide to call this. */
1985
1986 extern struct symtab *
1987 psymtab_to_symtab ()
1988 {
1989 fatal ("error: Someone called psymtab_to_symtab\n");
1990 }
1991
1992 /* These will stay zero all the time */
1993 struct psymbol_allocation_list global_psymbols, static_psymbols;
1994
1995 _initialize_coff ()
1996 {
1997 symfile = 0;
1998
1999 bzero (&global_psymbols, sizeof (global_psymbols));
2000 bzero (&static_psymbols, sizeof (static_psymbols));
2001
2002 add_com ("symbol-file", class_files, symbol_file_command,
2003 "Load symbol table (in coff format) from executable file FILE.");
2004 }
2005
2006
2007 #endif /* COFF_FORMAT */
2008
This page took 0.070339 seconds and 5 git commands to generate.