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