* thread-db.c (check_event): Don't report an error if we encounter
[deliverable/binutils-gdb.git] / gdb / hpread.c
1 /* Read hp debug symbols and convert to internal format, for GDB.
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
21
22 Written by the Center for Software Science at the University of Utah
23 and by Cygnus Support. */
24
25 #include "defs.h"
26 #include "bfd.h"
27 #include "gdb_string.h"
28 #include "hp-symtab.h"
29 #include "syms.h"
30 #include "symtab.h"
31 #include "symfile.h"
32 #include "objfiles.h"
33 #include "buildsym.h"
34 #include "complaints.h"
35 #include "gdb-stabs.h"
36 #include "gdbtypes.h"
37 #include "demangle.h"
38
39 /* Private information attached to an objfile which we use to find
40 and internalize the HP C debug symbols within that objfile. */
41
42 struct hpread_symfile_info
43 {
44 /* The contents of each of the debug sections (there are 4 of them). */
45 char *gntt;
46 char *lntt;
47 char *slt;
48 char *vt;
49
50 /* We keep the size of the $VT$ section for range checking. */
51 unsigned int vt_size;
52
53 /* Some routines still need to know the number of symbols in the
54 main debug sections ($LNTT$ and $GNTT$). */
55 unsigned int lntt_symcount;
56 unsigned int gntt_symcount;
57
58 /* To keep track of all the types we've processed. */
59 struct type **type_vector;
60 int type_vector_length;
61
62 /* Keeps track of the beginning of a range of source lines. */
63 sltpointer sl_index;
64
65 /* Some state variables we'll need. */
66 int within_function;
67
68 /* Keep track of the current function's address. We may need to look
69 up something based on this address. */
70 unsigned int current_function_value;
71 };
72
73 /* Accessor macros to get at the fields. */
74 #define HPUX_SYMFILE_INFO(o) \
75 ((struct hpread_symfile_info *)((o)->sym_private))
76 #define GNTT(o) (HPUX_SYMFILE_INFO(o)->gntt)
77 #define LNTT(o) (HPUX_SYMFILE_INFO(o)->lntt)
78 #define SLT(o) (HPUX_SYMFILE_INFO(o)->slt)
79 #define VT(o) (HPUX_SYMFILE_INFO(o)->vt)
80 #define VT_SIZE(o) (HPUX_SYMFILE_INFO(o)->vt_size)
81 #define LNTT_SYMCOUNT(o) (HPUX_SYMFILE_INFO(o)->lntt_symcount)
82 #define GNTT_SYMCOUNT(o) (HPUX_SYMFILE_INFO(o)->gntt_symcount)
83 #define TYPE_VECTOR(o) (HPUX_SYMFILE_INFO(o)->type_vector)
84 #define TYPE_VECTOR_LENGTH(o) (HPUX_SYMFILE_INFO(o)->type_vector_length)
85 #define SL_INDEX(o) (HPUX_SYMFILE_INFO(o)->sl_index)
86 #define WITHIN_FUNCTION(o) (HPUX_SYMFILE_INFO(o)->within_function)
87 #define CURRENT_FUNCTION_VALUE(o) (HPUX_SYMFILE_INFO(o)->current_function_value)
88
89 /* Given the native debug symbol SYM, set NAMEP to the name associated
90 with the debug symbol. Note we may be called with a debug symbol which
91 has no associated name, in that case we return an empty string.
92
93 Also note we "know" that the name for any symbol is always in the
94 same place. Hence we don't have to conditionalize on the symbol type. */
95 #define SET_NAMESTRING(SYM, NAMEP, OBJFILE) \
96 if (! hpread_has_name ((SYM)->dblock.kind)) \
97 *NAMEP = ""; \
98 else if (((unsigned)(SYM)->dsfile.name) >= VT_SIZE (OBJFILE)) \
99 { \
100 complain (&string_table_offset_complaint, (char *) symnum); \
101 *NAMEP = ""; \
102 } \
103 else \
104 *NAMEP = (SYM)->dsfile.name + VT (OBJFILE)
105 \f
106 /* We put a pointer to this structure in the read_symtab_private field
107 of the psymtab. */
108
109 struct symloc
110 {
111 /* The offset within the file symbol table of first local symbol for
112 this file. */
113
114 int ldsymoff;
115
116 /* Length (in bytes) of the section of the symbol table devoted to
117 this file's symbols (actually, the section bracketed may contain
118 more than just this file's symbols). If ldsymlen is 0, the only
119 reason for this thing's existence is the dependency list.
120 Nothing else will happen when it is read in. */
121
122 int ldsymlen;
123 };
124
125 #define LDSYMOFF(p) (((struct symloc *)((p)->read_symtab_private))->ldsymoff)
126 #define LDSYMLEN(p) (((struct symloc *)((p)->read_symtab_private))->ldsymlen)
127 #define SYMLOC(p) ((struct symloc *)((p)->read_symtab_private))
128 \f
129 /* FIXME: Shouldn't this stuff be in a .h file somewhere? */
130 /* Nonzero means give verbose info on gdb action. */
131 extern int info_verbose;
132
133 /* Complaints about the symbols we have encountered. */
134 extern struct complaint string_table_offset_complaint;
135 extern struct complaint lbrac_unmatched_complaint;
136 extern struct complaint lbrac_mismatch_complaint;
137 \f
138
139 void hpread_symfile_init (struct objfile *);
140
141 static struct type *hpread_read_array_type (dnttpointer, union dnttentry *,
142 struct objfile *);
143
144 static struct type *hpread_alloc_type (dnttpointer, struct objfile *);
145
146 static struct type **hpread_lookup_type (dnttpointer, struct objfile *);
147
148 static struct type *hpread_read_enum_type
149 (dnttpointer, union dnttentry *, struct objfile *);
150
151 static struct type *hpread_read_set_type
152 (dnttpointer, union dnttentry *, struct objfile *);
153
154 static struct type *hpread_read_subrange_type
155 (dnttpointer, union dnttentry *, struct objfile *);
156
157 static struct type *hpread_read_struct_type
158 (dnttpointer, union dnttentry *, struct objfile *);
159
160 void hpread_build_psymtabs (struct objfile *, int);
161
162 void hpread_symfile_finish (struct objfile *);
163
164 static struct partial_symtab *hpread_start_psymtab
165 (struct objfile *, char *, CORE_ADDR, int,
166 struct partial_symbol **, struct partial_symbol **);
167
168 static struct partial_symtab *hpread_end_psymtab
169 (struct partial_symtab *, char **, int, int, CORE_ADDR,
170 struct partial_symtab **, int);
171
172 static struct symtab *hpread_expand_symtab
173 (struct objfile *, int, int, CORE_ADDR, int,
174 struct section_offsets *, char *);
175
176 static void hpread_process_one_debug_symbol
177 (union dnttentry *, char *, struct section_offsets *,
178 struct objfile *, CORE_ADDR, int, char *, int);
179
180 static sltpointer hpread_record_lines
181 (struct subfile *, sltpointer, sltpointer, struct objfile *, CORE_ADDR);
182
183 static struct type *hpread_read_function_type
184 (dnttpointer, union dnttentry *, struct objfile *);
185
186 static struct type *hpread_type_lookup (dnttpointer, struct objfile *);
187
188 static unsigned long hpread_get_depth (sltpointer, struct objfile *);
189
190 static unsigned long hpread_get_line (sltpointer, struct objfile *);
191
192 static CORE_ADDR hpread_get_location (sltpointer, struct objfile *);
193
194 static int hpread_type_translate (dnttpointer);
195 static unsigned long hpread_get_textlow (int, int, struct objfile *);
196 static union dnttentry *hpread_get_gntt (int, struct objfile *);
197 static union dnttentry *hpread_get_lntt (int, struct objfile *);
198 static union sltentry *hpread_get_slt (int, struct objfile *);
199 static void hpread_psymtab_to_symtab (struct partial_symtab *);
200 static void hpread_psymtab_to_symtab_1 (struct partial_symtab *);
201 static int hpread_has_name (enum dntt_entry_type);
202 \f
203
204 /* Initialization for reading native HP C debug symbols from OBJFILE.
205
206 It's only purpose in life is to set up the symbol reader's private
207 per-objfile data structures, and read in the raw contents of the debug
208 sections (attaching pointers to the debug info into the private data
209 structures).
210
211 Since BFD doesn't know how to read debug symbols in a format-independent
212 way (and may never do so...), we have to do it ourselves. Note we may
213 be called on a file without native HP C debugging symbols.
214 FIXME, there should be a cleaner peephole into the BFD environment here. */
215
216 void
217 hpread_symfile_init (struct objfile *objfile)
218 {
219 asection *vt_section, *slt_section, *lntt_section, *gntt_section;
220
221 /* Allocate struct to keep track of the symfile */
222 objfile->sym_private = (PTR)
223 xmmalloc (objfile->md, sizeof (struct hpread_symfile_info));
224 memset (objfile->sym_private, 0, sizeof (struct hpread_symfile_info));
225
226 /* We haven't read in any types yet. */
227 TYPE_VECTOR (objfile) = 0;
228
229 /* Read in data from the $GNTT$ subspace. */
230 gntt_section = bfd_get_section_by_name (objfile->obfd, "$GNTT$");
231 if (!gntt_section)
232 return;
233
234 GNTT (objfile)
235 = obstack_alloc (&objfile->symbol_obstack,
236 bfd_section_size (objfile->obfd, gntt_section));
237
238 bfd_get_section_contents (objfile->obfd, gntt_section, GNTT (objfile),
239 0, bfd_section_size (objfile->obfd, gntt_section));
240
241 GNTT_SYMCOUNT (objfile)
242 = bfd_section_size (objfile->obfd, gntt_section)
243 / sizeof (struct dntt_type_block);
244
245 /* Read in data from the $LNTT$ subspace. Also keep track of the number
246 of LNTT symbols. */
247 lntt_section = bfd_get_section_by_name (objfile->obfd, "$LNTT$");
248 if (!lntt_section)
249 return;
250
251 LNTT (objfile)
252 = obstack_alloc (&objfile->symbol_obstack,
253 bfd_section_size (objfile->obfd, lntt_section));
254
255 bfd_get_section_contents (objfile->obfd, lntt_section, LNTT (objfile),
256 0, bfd_section_size (objfile->obfd, lntt_section));
257
258 LNTT_SYMCOUNT (objfile)
259 = bfd_section_size (objfile->obfd, lntt_section)
260 / sizeof (struct dntt_type_block);
261
262 /* Read in data from the $SLT$ subspace. $SLT$ contains information
263 on source line numbers. */
264 slt_section = bfd_get_section_by_name (objfile->obfd, "$SLT$");
265 if (!slt_section)
266 return;
267
268 SLT (objfile) =
269 obstack_alloc (&objfile->symbol_obstack,
270 bfd_section_size (objfile->obfd, slt_section));
271
272 bfd_get_section_contents (objfile->obfd, slt_section, SLT (objfile),
273 0, bfd_section_size (objfile->obfd, slt_section));
274
275 /* Read in data from the $VT$ subspace. $VT$ contains things like
276 names and constants. Keep track of the number of symbols in the VT. */
277 vt_section = bfd_get_section_by_name (objfile->obfd, "$VT$");
278 if (!vt_section)
279 return;
280
281 VT_SIZE (objfile) = bfd_section_size (objfile->obfd, vt_section);
282
283 VT (objfile) =
284 (char *) obstack_alloc (&objfile->symbol_obstack,
285 VT_SIZE (objfile));
286
287 bfd_get_section_contents (objfile->obfd, vt_section, VT (objfile),
288 0, VT_SIZE (objfile));
289 }
290
291 /* Scan and build partial symbols for a symbol file.
292
293 The minimal symbol table (either SOM or HP a.out) has already been
294 read in; all we need to do is setup partial symbols based on the
295 native debugging information.
296
297 We assume hpread_symfile_init has been called to initialize the
298 symbol reader's private data structures.
299
300 MAINLINE is true if we are reading the main symbol
301 table (as opposed to a shared lib or dynamically loaded file). */
302
303 void
304 hpread_build_psymtabs (struct objfile *objfile, int mainline)
305 {
306 char *namestring;
307 int past_first_source_file = 0;
308 struct cleanup *old_chain;
309
310 int hp_symnum, symcount, i;
311
312 union dnttentry *dn_bufp;
313 unsigned long valu;
314 char *p;
315 int texthigh = 0;
316 int have_name = 0;
317
318 /* Current partial symtab */
319 struct partial_symtab *pst;
320
321 /* List of current psymtab's include files */
322 char **psymtab_include_list;
323 int includes_allocated;
324 int includes_used;
325
326 /* Index within current psymtab dependency list */
327 struct partial_symtab **dependency_list;
328 int dependencies_used, dependencies_allocated;
329
330 /* Just in case the stabs reader left turds lying around. */
331 free_pending_blocks ();
332 make_cleanup (really_free_pendings, 0);
333
334 pst = (struct partial_symtab *) 0;
335
336 /* We shouldn't use alloca, instead use malloc/free. Doing so avoids
337 a number of problems with cross compilation and creating useless holes
338 in the stack when we have to allocate new entries. FIXME. */
339
340 includes_allocated = 30;
341 includes_used = 0;
342 psymtab_include_list = (char **) alloca (includes_allocated *
343 sizeof (char *));
344
345 dependencies_allocated = 30;
346 dependencies_used = 0;
347 dependency_list =
348 (struct partial_symtab **) alloca (dependencies_allocated *
349 sizeof (struct partial_symtab *));
350
351 old_chain = make_cleanup_free_objfile (objfile);
352
353 last_source_file = 0;
354
355 /* Make two passes, one ofr the GNTT symbols, the other for the
356 LNTT symbols. */
357 for (i = 0; i < 1; i++)
358 {
359 int within_function = 0;
360
361 if (i)
362 symcount = GNTT_SYMCOUNT (objfile);
363 else
364 symcount = LNTT_SYMCOUNT (objfile);
365
366 for (hp_symnum = 0; hp_symnum < symcount; hp_symnum++)
367 {
368 QUIT;
369 if (i)
370 dn_bufp = hpread_get_gntt (hp_symnum, objfile);
371 else
372 dn_bufp = hpread_get_lntt (hp_symnum, objfile);
373
374 if (dn_bufp->dblock.extension)
375 continue;
376
377 /* Only handle things which are necessary for minimal symbols.
378 everything else is ignored. */
379 switch (dn_bufp->dblock.kind)
380 {
381 case DNTT_TYPE_SRCFILE:
382 {
383 /* A source file of some kind. Note this may simply
384 be an included file. */
385 SET_NAMESTRING (dn_bufp, &namestring, objfile);
386
387 /* Check if this is the source file we are already working
388 with. */
389 if (pst && !strcmp (namestring, pst->filename))
390 continue;
391
392 /* Check if this is an include file, if so check if we have
393 already seen it. Add it to the include list */
394 p = strrchr (namestring, '.');
395 if (!strcmp (p, ".h"))
396 {
397 int j, found;
398
399 found = 0;
400 for (j = 0; j < includes_used; j++)
401 if (!strcmp (namestring, psymtab_include_list[j]))
402 {
403 found = 1;
404 break;
405 }
406 if (found)
407 continue;
408
409 /* Add it to the list of includes seen so far and
410 allocate more include space if necessary. */
411 psymtab_include_list[includes_used++] = namestring;
412 if (includes_used >= includes_allocated)
413 {
414 char **orig = psymtab_include_list;
415
416 psymtab_include_list = (char **)
417 alloca ((includes_allocated *= 2) *
418 sizeof (char *));
419 memcpy ((PTR) psymtab_include_list, (PTR) orig,
420 includes_used * sizeof (char *));
421 }
422 continue;
423 }
424
425
426 if (pst)
427 {
428 if (!have_name)
429 {
430 pst->filename = (char *)
431 obstack_alloc (&pst->objfile->psymbol_obstack,
432 strlen (namestring) + 1);
433 strcpy (pst->filename, namestring);
434 have_name = 1;
435 continue;
436 }
437 continue;
438 }
439
440 /* This is a bonafide new source file.
441 End the current partial symtab and start a new one. */
442
443 if (pst && past_first_source_file)
444 {
445 hpread_end_psymtab (pst, psymtab_include_list,
446 includes_used,
447 (hp_symnum
448 * sizeof (struct dntt_type_block)),
449 texthigh,
450 dependency_list, dependencies_used);
451 pst = (struct partial_symtab *) 0;
452 includes_used = 0;
453 dependencies_used = 0;
454 }
455 else
456 past_first_source_file = 1;
457
458 valu = hpread_get_textlow (i, hp_symnum, objfile);
459 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
460 pst = hpread_start_psymtab (objfile,
461 namestring, valu,
462 (hp_symnum
463 * sizeof (struct dntt_type_block)),
464 objfile->global_psymbols.next,
465 objfile->static_psymbols.next);
466 texthigh = valu;
467 have_name = 1;
468 continue;
469 }
470
471 case DNTT_TYPE_MODULE:
472 /* A source file. It's still unclear to me what the
473 real difference between a DNTT_TYPE_SRCFILE and DNTT_TYPE_MODULE
474 is supposed to be. */
475 SET_NAMESTRING (dn_bufp, &namestring, objfile);
476 valu = hpread_get_textlow (i, hp_symnum, objfile);
477 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
478 if (!pst)
479 {
480 pst = hpread_start_psymtab (objfile,
481 namestring, valu,
482 (hp_symnum
483 * sizeof (struct dntt_type_block)),
484 objfile->global_psymbols.next,
485 objfile->static_psymbols.next);
486 texthigh = valu;
487 have_name = 0;
488 }
489 continue;
490 case DNTT_TYPE_FUNCTION:
491 case DNTT_TYPE_ENTRY:
492 /* The beginning of a function. DNTT_TYPE_ENTRY may also denote
493 a secondary entry point. */
494 valu = dn_bufp->dfunc.hiaddr + ANOFFSET (objfile->section_offsets,
495 SECT_OFF_TEXT (objfile));
496 if (valu > texthigh)
497 texthigh = valu;
498 valu = dn_bufp->dfunc.lowaddr +
499 ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
500 SET_NAMESTRING (dn_bufp, &namestring, objfile);
501 add_psymbol_to_list (namestring, strlen (namestring),
502 VAR_NAMESPACE, LOC_BLOCK,
503 &objfile->static_psymbols, valu,
504 0, language_unknown, objfile);
505 within_function = 1;
506 continue;
507 case DNTT_TYPE_BEGIN:
508 case DNTT_TYPE_END:
509 /* Scope block begin/end. We only care about function
510 and file blocks right now. */
511 if (dn_bufp->dend.endkind == DNTT_TYPE_MODULE)
512 {
513 hpread_end_psymtab (pst, psymtab_include_list, includes_used,
514 (hp_symnum
515 * sizeof (struct dntt_type_block)),
516 texthigh,
517 dependency_list, dependencies_used);
518 pst = (struct partial_symtab *) 0;
519 includes_used = 0;
520 dependencies_used = 0;
521 have_name = 0;
522 }
523 if (dn_bufp->dend.endkind == DNTT_TYPE_FUNCTION)
524 within_function = 0;
525 continue;
526 case DNTT_TYPE_SVAR:
527 case DNTT_TYPE_DVAR:
528 case DNTT_TYPE_TYPEDEF:
529 case DNTT_TYPE_TAGDEF:
530 {
531 /* Variables, typedefs an the like. */
532 enum address_class storage;
533 namespace_enum namespace;
534
535 /* Don't add locals to the partial symbol table. */
536 if (within_function
537 && (dn_bufp->dblock.kind == DNTT_TYPE_SVAR
538 || dn_bufp->dblock.kind == DNTT_TYPE_DVAR))
539 continue;
540
541 /* TAGDEFs go into the structure namespace. */
542 if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF)
543 namespace = STRUCT_NAMESPACE;
544 else
545 namespace = VAR_NAMESPACE;
546
547 /* What kind of "storage" does this use? */
548 if (dn_bufp->dblock.kind == DNTT_TYPE_SVAR)
549 storage = LOC_STATIC;
550 else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR
551 && dn_bufp->ddvar.regvar)
552 storage = LOC_REGISTER;
553 else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR)
554 storage = LOC_LOCAL;
555 else
556 storage = LOC_UNDEF;
557
558 SET_NAMESTRING (dn_bufp, &namestring, objfile);
559 if (!pst)
560 {
561 pst = hpread_start_psymtab (objfile,
562 "globals", 0,
563 (hp_symnum
564 * sizeof (struct dntt_type_block)),
565 objfile->global_psymbols.next,
566 objfile->static_psymbols.next);
567 }
568 if (dn_bufp->dsvar.global)
569 {
570 add_psymbol_to_list (namestring, strlen (namestring),
571 namespace, storage,
572 &objfile->global_psymbols,
573 dn_bufp->dsvar.location,
574 0, language_unknown, objfile);
575 }
576 else
577 {
578 add_psymbol_to_list (namestring, strlen (namestring),
579 namespace, storage,
580 &objfile->static_psymbols,
581 dn_bufp->dsvar.location,
582 0, language_unknown, objfile);
583 }
584 continue;
585 }
586 case DNTT_TYPE_MEMENUM:
587 case DNTT_TYPE_CONST:
588 /* Constants and members of enumerated types. */
589 SET_NAMESTRING (dn_bufp, &namestring, objfile);
590 if (!pst)
591 {
592 pst = hpread_start_psymtab (objfile,
593 "globals", 0,
594 (hp_symnum
595 * sizeof (struct dntt_type_block)),
596 objfile->global_psymbols.next,
597 objfile->static_psymbols.next);
598 }
599 add_psymbol_to_list (namestring, strlen (namestring),
600 VAR_NAMESPACE, LOC_CONST,
601 &objfile->static_psymbols, 0,
602 0, language_unknown, objfile);
603 continue;
604 default:
605 continue;
606 }
607 }
608 }
609
610 /* End any pending partial symbol table. */
611 if (pst)
612 {
613 hpread_end_psymtab (pst, psymtab_include_list, includes_used,
614 hp_symnum * sizeof (struct dntt_type_block),
615 0, dependency_list, dependencies_used);
616 }
617
618 discard_cleanups (old_chain);
619 }
620
621 /* Perform any local cleanups required when we are done with a particular
622 objfile. I.E, we are in the process of discarding all symbol information
623 for an objfile, freeing up all memory held for it, and unlinking the
624 objfile struct from the global list of known objfiles. */
625
626 void
627 hpread_symfile_finish (struct objfile *objfile)
628 {
629 if (objfile->sym_private != NULL)
630 {
631 mfree (objfile->md, objfile->sym_private);
632 }
633 }
634 \f
635
636 /* The remaining functions are all for internal use only. */
637
638 /* Various small functions to get entries in the debug symbol sections. */
639
640 static union dnttentry *
641 hpread_get_lntt (int index, struct objfile *objfile)
642 {
643 return (union dnttentry *)
644 &(LNTT (objfile)[(index * sizeof (struct dntt_type_block))]);
645 }
646
647 static union dnttentry *
648 hpread_get_gntt (int index, struct objfile *objfile)
649 {
650 return (union dnttentry *)
651 &(GNTT (objfile)[(index * sizeof (struct dntt_type_block))]);
652 }
653
654 static union sltentry *
655 hpread_get_slt (int index, struct objfile *objfile)
656 {
657 return (union sltentry *) &(SLT (objfile)[index * sizeof (union sltentry)]);
658 }
659
660 /* Get the low address associated with some symbol (typically the start
661 of a particular source file or module). Since that information is not
662 stored as part of the DNTT_TYPE_MODULE or DNTT_TYPE_SRCFILE symbol we
663 must infer it from the existence of DNTT_TYPE_FUNCTION symbols. */
664
665 static unsigned long
666 hpread_get_textlow (int global, int index, struct objfile *objfile)
667 {
668 union dnttentry *dn_bufp;
669 struct minimal_symbol *msymbol;
670
671 /* Look for a DNTT_TYPE_FUNCTION symbol. */
672 do
673 {
674 if (global)
675 dn_bufp = hpread_get_gntt (index++, objfile);
676 else
677 dn_bufp = hpread_get_lntt (index++, objfile);
678 }
679 while (dn_bufp->dblock.kind != DNTT_TYPE_FUNCTION
680 && dn_bufp->dblock.kind != DNTT_TYPE_END);
681
682 /* Avoid going past a DNTT_TYPE_END when looking for a DNTT_TYPE_FUNCTION. This
683 might happen when a sourcefile has no functions. */
684 if (dn_bufp->dblock.kind == DNTT_TYPE_END)
685 return 0;
686
687 /* The minimal symbols are typically more accurate for some reason. */
688 msymbol = lookup_minimal_symbol (dn_bufp->dfunc.name + VT (objfile), NULL,
689 objfile);
690 if (msymbol)
691 return SYMBOL_VALUE_ADDRESS (msymbol);
692 else
693 return dn_bufp->dfunc.lowaddr;
694 }
695
696 /* Get the nesting depth for the source line identified by INDEX. */
697
698 static unsigned long
699 hpread_get_depth (sltpointer index, struct objfile *objfile)
700 {
701 union sltentry *sl_bufp;
702
703 sl_bufp = hpread_get_slt (index, objfile);
704 return sl_bufp->sspec.backptr.dnttp.index;
705 }
706
707 /* Get the source line number the the line identified by INDEX. */
708
709 static unsigned long
710 hpread_get_line (sltpointer index, struct objfile *objfile)
711 {
712 union sltentry *sl_bufp;
713
714 sl_bufp = hpread_get_slt (index, objfile);
715 return sl_bufp->snorm.line;
716 }
717
718 static CORE_ADDR
719 hpread_get_location (sltpointer index, struct objfile *objfile)
720 {
721 union sltentry *sl_bufp;
722 int i;
723
724 /* code location of special sltentrys is determined from context */
725 sl_bufp = hpread_get_slt (index, objfile);
726
727 if (sl_bufp->snorm.sltdesc == SLT_END)
728 {
729 /* find previous normal sltentry and get address */
730 for (i = 0; ((sl_bufp->snorm.sltdesc != SLT_NORMAL) &&
731 (sl_bufp->snorm.sltdesc != SLT_EXIT)); i++)
732 sl_bufp = hpread_get_slt (index - i, objfile);
733 return sl_bufp->snorm.address;
734 }
735
736 /* find next normal sltentry and get address */
737 for (i = 0; ((sl_bufp->snorm.sltdesc != SLT_NORMAL) &&
738 (sl_bufp->snorm.sltdesc != SLT_EXIT)); i++)
739 sl_bufp = hpread_get_slt (index + i, objfile);
740 return sl_bufp->snorm.address;
741 }
742 \f
743
744 /* Return 1 if an HP debug symbol of type KIND has a name associated with
745 it, else return 0. */
746
747 static int
748 hpread_has_name (enum dntt_entry_type kind)
749 {
750 switch (kind)
751 {
752 case DNTT_TYPE_SRCFILE:
753 case DNTT_TYPE_MODULE:
754 case DNTT_TYPE_FUNCTION:
755 case DNTT_TYPE_ENTRY:
756 case DNTT_TYPE_IMPORT:
757 case DNTT_TYPE_LABEL:
758 case DNTT_TYPE_FPARAM:
759 case DNTT_TYPE_SVAR:
760 case DNTT_TYPE_DVAR:
761 case DNTT_TYPE_CONST:
762 case DNTT_TYPE_TYPEDEF:
763 case DNTT_TYPE_TAGDEF:
764 case DNTT_TYPE_MEMENUM:
765 case DNTT_TYPE_FIELD:
766 case DNTT_TYPE_SA:
767 return 1;
768
769 case DNTT_TYPE_BEGIN:
770 case DNTT_TYPE_END:
771 case DNTT_TYPE_WITH:
772 case DNTT_TYPE_COMMON:
773 case DNTT_TYPE_POINTER:
774 case DNTT_TYPE_ENUM:
775 case DNTT_TYPE_SET:
776 case DNTT_TYPE_SUBRANGE:
777 case DNTT_TYPE_ARRAY:
778 case DNTT_TYPE_STRUCT:
779 case DNTT_TYPE_UNION:
780 case DNTT_TYPE_VARIANT:
781 case DNTT_TYPE_FILE:
782 case DNTT_TYPE_FUNCTYPE:
783 case DNTT_TYPE_COBSTRUCT:
784 case DNTT_TYPE_XREF:
785 case DNTT_TYPE_MACRO:
786 default:
787 return 0;
788 }
789 }
790
791 /* Allocate and partially fill a partial symtab. It will be
792 completely filled at the end of the symbol list.
793
794 SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
795 is the address relative to which its symbols are (incremental) or 0
796 (normal). */
797
798 static struct partial_symtab *
799 hpread_start_psymtab (struct objfile *objfile, char *filename,
800 CORE_ADDR textlow, int ldsymoff,
801 struct partial_symbol **global_syms,
802 struct partial_symbol **static_syms)
803 {
804 struct partial_symtab *result =
805 start_psymtab_common (objfile, section_offsets,
806 filename, textlow, global_syms, static_syms);
807
808 result->read_symtab_private = (char *)
809 obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
810 LDSYMOFF (result) = ldsymoff;
811 result->read_symtab = hpread_psymtab_to_symtab;
812
813 return result;
814 }
815 \f
816
817 /* Close off the current usage of PST.
818 Returns PST or NULL if the partial symtab was empty and thrown away.
819
820 FIXME: List variables and peculiarities of same. */
821
822 static struct partial_symtab *
823 hpread_end_psymtab (struct partial_symtab *pst, char **include_list,
824 int num_includes, int capping_symbol_offset,
825 CORE_ADDR capping_text,
826 struct partial_symtab **dependency_list,
827 int number_dependencies)
828 {
829 int i;
830 struct objfile *objfile = pst->objfile;
831
832 if (capping_symbol_offset != -1)
833 LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
834 pst->texthigh = capping_text;
835
836 pst->n_global_syms =
837 objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
838 pst->n_static_syms =
839 objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
840
841 pst->number_of_dependencies = number_dependencies;
842 if (number_dependencies)
843 {
844 pst->dependencies = (struct partial_symtab **)
845 obstack_alloc (&objfile->psymbol_obstack,
846 number_dependencies * sizeof (struct partial_symtab *));
847 memcpy (pst->dependencies, dependency_list,
848 number_dependencies * sizeof (struct partial_symtab *));
849 }
850 else
851 pst->dependencies = 0;
852
853 for (i = 0; i < num_includes; i++)
854 {
855 struct partial_symtab *subpst =
856 allocate_psymtab (include_list[i], objfile);
857
858 subpst->section_offsets = pst->section_offsets;
859 subpst->read_symtab_private =
860 (char *) obstack_alloc (&objfile->psymbol_obstack,
861 sizeof (struct symloc));
862 LDSYMOFF (subpst) =
863 LDSYMLEN (subpst) =
864 subpst->textlow =
865 subpst->texthigh = 0;
866
867 /* We could save slight bits of space by only making one of these,
868 shared by the entire set of include files. FIXME-someday. */
869 subpst->dependencies = (struct partial_symtab **)
870 obstack_alloc (&objfile->psymbol_obstack,
871 sizeof (struct partial_symtab *));
872 subpst->dependencies[0] = pst;
873 subpst->number_of_dependencies = 1;
874
875 subpst->globals_offset =
876 subpst->n_global_syms =
877 subpst->statics_offset =
878 subpst->n_static_syms = 0;
879
880 subpst->readin = 0;
881 subpst->symtab = 0;
882 subpst->read_symtab = pst->read_symtab;
883 }
884
885 sort_pst_symbols (pst);
886
887 /* If there is already a psymtab or symtab for a file of this name, remove it.
888 (If there is a symtab, more drastic things also happen.)
889 This happens in VxWorks. */
890 free_named_symtabs (pst->filename);
891
892 if (num_includes == 0
893 && number_dependencies == 0
894 && pst->n_global_syms == 0
895 && pst->n_static_syms == 0)
896 {
897 /* Throw away this psymtab, it's empty. We can't deallocate it, since
898 it is on the obstack, but we can forget to chain it on the list. */
899 /* Empty psymtabs happen as a result of header files which don't have
900 any symbols in them. There can be a lot of them. But this check
901 is wrong, in that a psymtab with N_SLINE entries but nothing else
902 is not empty, but we don't realize that. Fixing that without slowing
903 things down might be tricky. */
904
905 discard_psymtab (pst);
906
907 /* Indicate that psymtab was thrown away. */
908 pst = (struct partial_symtab *) NULL;
909 }
910 return pst;
911 }
912 \f
913 /* Do the dirty work of reading in the full symbol from a partial symbol
914 table. */
915
916 static void
917 hpread_psymtab_to_symtab_1 (struct partial_symtab *pst)
918 {
919 struct cleanup *old_chain;
920 int i;
921
922 /* Get out quick if passed junk. */
923 if (!pst)
924 return;
925
926 /* Complain if we've already read in this symbol table. */
927 if (pst->readin)
928 {
929 fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
930 pst->filename);
931 return;
932 }
933
934 /* Read in all partial symtabs on which this one is dependent */
935 for (i = 0; i < pst->number_of_dependencies; i++)
936 if (!pst->dependencies[i]->readin)
937 {
938 /* Inform about additional files that need to be read in. */
939 if (info_verbose)
940 {
941 fputs_filtered (" ", gdb_stdout);
942 wrap_here ("");
943 fputs_filtered ("and ", gdb_stdout);
944 wrap_here ("");
945 printf_filtered ("%s...", pst->dependencies[i]->filename);
946 wrap_here (""); /* Flush output */
947 gdb_flush (gdb_stdout);
948 }
949 hpread_psymtab_to_symtab_1 (pst->dependencies[i]);
950 }
951
952 /* If it's real... */
953 if (LDSYMLEN (pst))
954 {
955 /* Init stuff necessary for reading in symbols */
956 buildsym_init ();
957 old_chain = make_cleanup (really_free_pendings, 0);
958
959 pst->symtab =
960 hpread_expand_symtab (pst->objfile, LDSYMOFF (pst), LDSYMLEN (pst),
961 pst->textlow, pst->texthigh - pst->textlow,
962 pst->section_offsets, pst->filename);
963 sort_symtab_syms (pst->symtab);
964
965 do_cleanups (old_chain);
966 }
967
968 pst->readin = 1;
969 }
970
971 /* Read in all of the symbols for a given psymtab for real.
972 Be verbose about it if the user wants that. */
973
974 static void
975 hpread_psymtab_to_symtab (struct partial_symtab *pst)
976 {
977 /* Get out quick if given junk. */
978 if (!pst)
979 return;
980
981 /* Sanity check. */
982 if (pst->readin)
983 {
984 fprintf (stderr, "Psymtab for %s already read in. Shouldn't happen.\n",
985 pst->filename);
986 return;
987 }
988
989 if (LDSYMLEN (pst) || pst->number_of_dependencies)
990 {
991 /* Print the message now, before reading the string table,
992 to avoid disconcerting pauses. */
993 if (info_verbose)
994 {
995 printf_filtered ("Reading in symbols for %s...", pst->filename);
996 gdb_flush (gdb_stdout);
997 }
998
999 hpread_psymtab_to_symtab_1 (pst);
1000
1001 /* Match with global symbols. This only needs to be done once,
1002 after all of the symtabs and dependencies have been read in. */
1003 scan_file_globals (pst->objfile);
1004
1005 /* Finish up the debug error message. */
1006 if (info_verbose)
1007 printf_filtered ("done.\n");
1008 }
1009 }
1010 /* Read in a defined section of a specific object file's symbols.
1011
1012 DESC is the file descriptor for the file, positioned at the
1013 beginning of the symtab
1014 SYM_OFFSET is the offset within the file of
1015 the beginning of the symbols we want to read
1016 SYM_SIZE is the size of the symbol info to read in.
1017 TEXT_OFFSET is the beginning of the text segment we are reading symbols for
1018 TEXT_SIZE is the size of the text segment read in.
1019 SECTION_OFFSETS are the relocation offsets which get added to each symbol. */
1020
1021 static struct symtab *
1022 hpread_expand_symtab (struct objfile *objfile, int sym_offset, int sym_size,
1023 CORE_ADDR text_offset, int text_size,
1024 struct section_offsets *section_offsets, char *filename)
1025 {
1026 char *namestring;
1027 union dnttentry *dn_bufp;
1028 unsigned max_symnum;
1029
1030 int sym_index = sym_offset / sizeof (struct dntt_type_block);
1031
1032 current_objfile = objfile;
1033 subfile_stack = 0;
1034
1035 last_source_file = 0;
1036
1037 dn_bufp = hpread_get_lntt (sym_index, objfile);
1038 if (!((dn_bufp->dblock.kind == (unsigned char) DNTT_TYPE_SRCFILE) ||
1039 (dn_bufp->dblock.kind == (unsigned char) DNTT_TYPE_MODULE)))
1040 {
1041 start_symtab ("globals", NULL, 0);
1042 record_debugformat ("HP");
1043 }
1044
1045 max_symnum = sym_size / sizeof (struct dntt_type_block);
1046
1047 /* Read in and process each debug symbol within the specified range. */
1048 for (symnum = 0;
1049 symnum < max_symnum;
1050 symnum++)
1051 {
1052 QUIT; /* Allow this to be interruptable */
1053 dn_bufp = hpread_get_lntt (sym_index + symnum, objfile);
1054
1055 if (dn_bufp->dblock.extension)
1056 continue;
1057
1058 /* Yow! We call SET_NAMESTRING on things without names! */
1059 SET_NAMESTRING (dn_bufp, &namestring, objfile);
1060
1061 hpread_process_one_debug_symbol (dn_bufp, namestring, section_offsets,
1062 objfile, text_offset, text_size,
1063 filename, symnum + sym_index);
1064 }
1065
1066 current_objfile = NULL;
1067
1068 return end_symtab (text_offset + text_size, objfile, SECT_OFF_TEXT (objfile));
1069 }
1070 \f
1071
1072 /* Convert basic types from HP debug format into GDB internal format. */
1073
1074 static int
1075 hpread_type_translate (dnttpointer typep)
1076 {
1077 if (!typep.dntti.immediate)
1078 internal_error (__FILE__, __LINE__, "failed internal consistency check");
1079
1080 switch (typep.dntti.type)
1081 {
1082 case HP_TYPE_BOOLEAN:
1083 case HP_TYPE_BOOLEAN_S300_COMPAT:
1084 case HP_TYPE_BOOLEAN_VAX_COMPAT:
1085 return FT_BOOLEAN;
1086 /* Ugh. No way to distinguish between signed and unsigned chars. */
1087 case HP_TYPE_CHAR:
1088 case HP_TYPE_WIDE_CHAR:
1089 return FT_CHAR;
1090 case HP_TYPE_INT:
1091 if (typep.dntti.bitlength <= 8)
1092 return FT_CHAR;
1093 if (typep.dntti.bitlength <= 16)
1094 return FT_SHORT;
1095 if (typep.dntti.bitlength <= 32)
1096 return FT_INTEGER;
1097 return FT_LONG_LONG;
1098 case HP_TYPE_LONG:
1099 return FT_LONG;
1100 case HP_TYPE_UNSIGNED_LONG:
1101 if (typep.dntti.bitlength <= 8)
1102 return FT_UNSIGNED_CHAR;
1103 if (typep.dntti.bitlength <= 16)
1104 return FT_UNSIGNED_SHORT;
1105 if (typep.dntti.bitlength <= 32)
1106 return FT_UNSIGNED_LONG;
1107 return FT_UNSIGNED_LONG_LONG;
1108 case HP_TYPE_UNSIGNED_INT:
1109 if (typep.dntti.bitlength <= 8)
1110 return FT_UNSIGNED_CHAR;
1111 if (typep.dntti.bitlength <= 16)
1112 return FT_UNSIGNED_SHORT;
1113 if (typep.dntti.bitlength <= 32)
1114 return FT_UNSIGNED_INTEGER;
1115 return FT_UNSIGNED_LONG_LONG;
1116 case HP_TYPE_REAL:
1117 case HP_TYPE_REAL_3000:
1118 case HP_TYPE_DOUBLE:
1119 if (typep.dntti.bitlength == 64)
1120 return FT_DBL_PREC_FLOAT;
1121 if (typep.dntti.bitlength == 128)
1122 return FT_EXT_PREC_FLOAT;
1123 return FT_FLOAT;
1124 case HP_TYPE_COMPLEX:
1125 case HP_TYPE_COMPLEXS3000:
1126 if (typep.dntti.bitlength == 128)
1127 return FT_DBL_PREC_COMPLEX;
1128 if (typep.dntti.bitlength == 192)
1129 return FT_EXT_PREC_COMPLEX;
1130 return FT_COMPLEX;
1131 case HP_TYPE_STRING200:
1132 case HP_TYPE_LONGSTRING200:
1133 case HP_TYPE_FTN_STRING_SPEC:
1134 case HP_TYPE_MOD_STRING_SPEC:
1135 case HP_TYPE_MOD_STRING_3000:
1136 case HP_TYPE_FTN_STRING_S300_COMPAT:
1137 case HP_TYPE_FTN_STRING_VAX_COMPAT:
1138 return FT_STRING;
1139 default:
1140 internal_error (__FILE__, __LINE__, "failed internal consistency check");
1141 }
1142 }
1143
1144 /* Return the type associated with the index found in HP_TYPE. */
1145
1146 static struct type **
1147 hpread_lookup_type (dnttpointer hp_type, struct objfile *objfile)
1148 {
1149 unsigned old_len;
1150 int index = hp_type.dnttp.index;
1151
1152 if (hp_type.dntti.immediate)
1153 return NULL;
1154
1155 if (index < LNTT_SYMCOUNT (objfile))
1156 {
1157 if (index >= TYPE_VECTOR_LENGTH (objfile))
1158 {
1159 old_len = TYPE_VECTOR_LENGTH (objfile);
1160 if (old_len == 0)
1161 {
1162 TYPE_VECTOR_LENGTH (objfile) = 100;
1163 TYPE_VECTOR (objfile) = (struct type **)
1164 xmmalloc (objfile->md,
1165 TYPE_VECTOR_LENGTH (objfile) * sizeof (struct type *));
1166 }
1167 while (index >= TYPE_VECTOR_LENGTH (objfile))
1168 TYPE_VECTOR_LENGTH (objfile) *= 2;
1169 TYPE_VECTOR (objfile) = (struct type **)
1170 xmrealloc (objfile->md,
1171 (char *) TYPE_VECTOR (objfile),
1172 (TYPE_VECTOR_LENGTH (objfile) * sizeof (struct type *)));
1173 memset (&TYPE_VECTOR (objfile)[old_len], 0,
1174 (TYPE_VECTOR_LENGTH (objfile) - old_len) *
1175 sizeof (struct type *));
1176 }
1177 return &TYPE_VECTOR (objfile)[index];
1178 }
1179 else
1180 return NULL;
1181 }
1182
1183 /* Possibly allocate a GDB internal type so we can internalize HP_TYPE.
1184 Note we'll just return the address of a GDB internal type if we already
1185 have it lying around. */
1186
1187 static struct type *
1188 hpread_alloc_type (dnttpointer hp_type, struct objfile *objfile)
1189 {
1190 struct type **type_addr;
1191
1192 type_addr = hpread_lookup_type (hp_type, objfile);
1193 if (*type_addr == 0)
1194 *type_addr = alloc_type (objfile);
1195
1196 TYPE_CPLUS_SPECIFIC (*type_addr)
1197 = (struct cplus_struct_type *) &cplus_struct_default;
1198 return *type_addr;
1199 }
1200
1201 /* Read a native enumerated type and return it in GDB internal form. */
1202
1203 static struct type *
1204 hpread_read_enum_type (dnttpointer hp_type, union dnttentry *dn_bufp,
1205 struct objfile *objfile)
1206 {
1207 struct type *type;
1208 struct pending **symlist, *osyms, *syms;
1209 int o_nsyms, nsyms = 0;
1210 dnttpointer mem;
1211 union dnttentry *memp;
1212 char *name;
1213 long n;
1214 struct symbol *sym;
1215
1216 type = hpread_alloc_type (hp_type, objfile);
1217 TYPE_LENGTH (type) = 4;
1218
1219 symlist = &file_symbols;
1220 osyms = *symlist;
1221 o_nsyms = osyms ? osyms->nsyms : 0;
1222
1223 /* Get a name for each member and add it to our list of members. */
1224 mem = dn_bufp->denum.firstmem;
1225 while (mem.dnttp.extension && mem.word != DNTTNIL)
1226 {
1227 memp = hpread_get_lntt (mem.dnttp.index, objfile);
1228
1229 name = VT (objfile) + memp->dmember.name;
1230 sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
1231 sizeof (struct symbol));
1232 memset (sym, 0, sizeof (struct symbol));
1233 SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
1234 &objfile->symbol_obstack);
1235 SYMBOL_CLASS (sym) = LOC_CONST;
1236 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1237 SYMBOL_VALUE (sym) = memp->dmember.value;
1238 add_symbol_to_list (sym, symlist);
1239 nsyms++;
1240 mem = memp->dmember.nextmem;
1241 }
1242
1243 /* Now that we know more about the enum, fill in more info. */
1244 TYPE_CODE (type) = TYPE_CODE_ENUM;
1245 TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB;
1246 TYPE_NFIELDS (type) = nsyms;
1247 TYPE_FIELDS (type) = (struct field *)
1248 obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nsyms);
1249
1250 /* Find the symbols for the members and put them into the type.
1251 The symbols can be found in the symlist that we put them on
1252 to cause them to be defined. osyms contains the old value
1253 of that symlist; everything up to there was defined by us.
1254
1255 Note that we preserve the order of the enum constants, so
1256 that in something like "enum {FOO, LAST_THING=FOO}" we print
1257 FOO, not LAST_THING. */
1258 for (syms = *symlist, n = 0; syms; syms = syms->next)
1259 {
1260 int j = 0;
1261 if (syms == osyms)
1262 j = o_nsyms;
1263 for (; j < syms->nsyms; j++, n++)
1264 {
1265 struct symbol *xsym = syms->symbol[j];
1266 SYMBOL_TYPE (xsym) = type;
1267 TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym);
1268 TYPE_FIELD_BITPOS (type, n) = SYMBOL_VALUE (xsym);
1269 TYPE_FIELD_BITSIZE (type, n) = 0;
1270 }
1271 if (syms == osyms)
1272 break;
1273 }
1274
1275 return type;
1276 }
1277
1278 /* Read and internalize a native function debug symbol. */
1279
1280 static struct type *
1281 hpread_read_function_type (dnttpointer hp_type, union dnttentry *dn_bufp,
1282 struct objfile *objfile)
1283 {
1284 struct type *type, *type1;
1285 struct pending **symlist, *osyms, *syms;
1286 int o_nsyms, nsyms = 0;
1287 dnttpointer param;
1288 union dnttentry *paramp;
1289 char *name;
1290 long n;
1291 struct symbol *sym;
1292
1293 param = dn_bufp->dfunc.firstparam;
1294
1295 /* See if we've already read in this type. */
1296 type = hpread_alloc_type (hp_type, objfile);
1297 if (TYPE_CODE (type) == TYPE_CODE_FUNC)
1298 return type;
1299
1300 /* Nope, so read it in and store it away. */
1301 type1 = lookup_function_type (hpread_type_lookup (dn_bufp->dfunc.retval,
1302 objfile));
1303 memcpy ((char *) type, (char *) type1, sizeof (struct type));
1304
1305 symlist = &local_symbols;
1306 osyms = *symlist;
1307 o_nsyms = osyms ? osyms->nsyms : 0;
1308
1309 /* Now examine each parameter noting its type, location, and a
1310 wealth of other information. */
1311 while (param.word && param.word != DNTTNIL)
1312 {
1313 paramp = hpread_get_lntt (param.dnttp.index, objfile);
1314 nsyms++;
1315 param = paramp->dfparam.nextparam;
1316
1317 /* Get the name. */
1318 name = VT (objfile) + paramp->dfparam.name;
1319 sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
1320 sizeof (struct symbol));
1321 (void) memset (sym, 0, sizeof (struct symbol));
1322 SYMBOL_NAME (sym) = obsavestring (name, strlen (name),
1323 &objfile->symbol_obstack);
1324
1325 /* Figure out where it lives. */
1326 if (paramp->dfparam.regparam)
1327 SYMBOL_CLASS (sym) = LOC_REGPARM;
1328 else if (paramp->dfparam.indirect)
1329 SYMBOL_CLASS (sym) = LOC_REF_ARG;
1330 else
1331 SYMBOL_CLASS (sym) = LOC_ARG;
1332 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1333 if (paramp->dfparam.copyparam)
1334 {
1335 SYMBOL_VALUE (sym) = paramp->dfparam.location;
1336 #ifdef HPREAD_ADJUST_STACK_ADDRESS
1337 SYMBOL_VALUE (sym)
1338 += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
1339 #endif
1340 /* This is likely a pass-by-invisible reference parameter,
1341 Hack on the symbol class to make GDB happy. */
1342 SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
1343 }
1344 else
1345 SYMBOL_VALUE (sym) = paramp->dfparam.location;
1346
1347 /* Get its type. */
1348 SYMBOL_TYPE (sym) = hpread_type_lookup (paramp->dfparam.type, objfile);
1349
1350 /* Add it to the list. */
1351 add_symbol_to_list (sym, symlist);
1352 }
1353
1354 /* Note how many parameters we found. */
1355 TYPE_NFIELDS (type) = nsyms;
1356 TYPE_FIELDS (type) = (struct field *)
1357 obstack_alloc (&objfile->type_obstack,
1358 sizeof (struct field) * nsyms);
1359
1360 /* Find the symbols for the values and put them into the type.
1361 The symbols can be found in the symlist that we put them on
1362 to cause them to be defined. osyms contains the old value
1363 of that symlist; everything up to there was defined by us. */
1364 /* Note that we preserve the order of the parameters, so
1365 that in something like "enum {FOO, LAST_THING=FOO}" we print
1366 FOO, not LAST_THING. */
1367 for (syms = *symlist, n = 0; syms; syms = syms->next)
1368 {
1369 int j = 0;
1370 if (syms == osyms)
1371 j = o_nsyms;
1372 for (; j < syms->nsyms; j++, n++)
1373 {
1374 struct symbol *xsym = syms->symbol[j];
1375 TYPE_FIELD_NAME (type, n) = SYMBOL_NAME (xsym);
1376 TYPE_FIELD_TYPE (type, n) = SYMBOL_TYPE (xsym);
1377 TYPE_FIELD_BITPOS (type, n) = n;
1378 TYPE_FIELD_BITSIZE (type, n) = 0;
1379 }
1380 if (syms == osyms)
1381 break;
1382 }
1383 return type;
1384 }
1385
1386 /* Read in and internalize a structure definition. */
1387
1388 static struct type *
1389 hpread_read_struct_type (dnttpointer hp_type, union dnttentry *dn_bufp,
1390 struct objfile *objfile)
1391 {
1392 struct nextfield
1393 {
1394 struct nextfield *next;
1395 struct field field;
1396 };
1397
1398 struct type *type;
1399 struct nextfield *list = 0;
1400 struct nextfield *new;
1401 int n, nfields = 0;
1402 dnttpointer field;
1403 union dnttentry *fieldp;
1404
1405 /* Is it something we've already dealt with? */
1406 type = hpread_alloc_type (hp_type, objfile);
1407 if ((TYPE_CODE (type) == TYPE_CODE_STRUCT) ||
1408 (TYPE_CODE (type) == TYPE_CODE_UNION))
1409 return type;
1410
1411 /* Get the basic type correct. */
1412 if (dn_bufp->dblock.kind == DNTT_TYPE_STRUCT)
1413 {
1414 TYPE_CODE (type) = TYPE_CODE_STRUCT;
1415 TYPE_LENGTH (type) = dn_bufp->dstruct.bitlength / 8;
1416 }
1417 else if (dn_bufp->dblock.kind == DNTT_TYPE_UNION)
1418 {
1419 TYPE_CODE (type) = TYPE_CODE_UNION;
1420 TYPE_LENGTH (type) = dn_bufp->dunion.bitlength / 8;
1421 }
1422 else
1423 return type;
1424
1425
1426 TYPE_FLAGS (type) &= ~TYPE_FLAG_STUB;
1427
1428 /* Read in and internalize all the fields. */
1429 field = dn_bufp->dstruct.firstfield;
1430 while (field.word != DNTTNIL && field.dnttp.extension)
1431 {
1432 fieldp = hpread_get_lntt (field.dnttp.index, objfile);
1433
1434 /* Get space to record the next field's data. */
1435 new = (struct nextfield *) alloca (sizeof (struct nextfield));
1436 new->next = list;
1437 list = new;
1438
1439 list->field.name = VT (objfile) + fieldp->dfield.name;
1440 FIELD_BITPOS (list->field) = fieldp->dfield.bitoffset;
1441 if (fieldp->dfield.bitlength % 8)
1442 FIELD_BITSIZE (list->field) = fieldp->dfield.bitlength;
1443 else
1444 FIELD_BITSIZE (list->field) = 0;
1445 nfields++;
1446 field = fieldp->dfield.nextfield;
1447 FIELD_TYPE (list->field) = hpread_type_lookup (fieldp->dfield.type,
1448 objfile);
1449 }
1450
1451 TYPE_NFIELDS (type) = nfields;
1452 TYPE_FIELDS (type) = (struct field *)
1453 obstack_alloc (&objfile->type_obstack, sizeof (struct field) * nfields);
1454
1455 /* Copy the saved-up fields into the field vector. */
1456 for (n = nfields; list; list = list->next)
1457 {
1458 n -= 1;
1459 TYPE_FIELD (type, n) = list->field;
1460 }
1461 return type;
1462 }
1463
1464 /* Read in and internalize a set debug symbol. */
1465
1466 static struct type *
1467 hpread_read_set_type (dnttpointer hp_type, union dnttentry *dn_bufp,
1468 struct objfile *objfile)
1469 {
1470 struct type *type;
1471
1472 /* See if it's something we've already deal with. */
1473 type = hpread_alloc_type (hp_type, objfile);
1474 if (TYPE_CODE (type) == TYPE_CODE_SET)
1475 return type;
1476
1477 /* Nope. Fill in the appropriate fields. */
1478 TYPE_CODE (type) = TYPE_CODE_SET;
1479 TYPE_LENGTH (type) = dn_bufp->dset.bitlength / 8;
1480 TYPE_NFIELDS (type) = 0;
1481 TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->dset.subtype,
1482 objfile);
1483 return type;
1484 }
1485
1486 /* Read in and internalize an array debug symbol. */
1487
1488 static struct type *
1489 hpread_read_array_type (dnttpointer hp_type, union dnttentry *dn_bufp,
1490 struct objfile *objfile)
1491 {
1492 struct type *type;
1493 union dnttentry save;
1494 save = *dn_bufp;
1495
1496 /* Why no check here? Because it kept us from properly determining
1497 the size of the array! */
1498 type = hpread_alloc_type (hp_type, objfile);
1499
1500 TYPE_CODE (type) = TYPE_CODE_ARRAY;
1501
1502 /* values are not normalized. */
1503 if (!((dn_bufp->darray.arrayisbytes && dn_bufp->darray.elemisbytes)
1504 || (!dn_bufp->darray.arrayisbytes && !dn_bufp->darray.elemisbytes)))
1505 internal_error (__FILE__, __LINE__, "failed internal consistency check");
1506 else if (dn_bufp->darray.arraylength == 0x7fffffff)
1507 {
1508 /* The HP debug format represents char foo[]; as an array with
1509 length 0x7fffffff. Internally GDB wants to represent this
1510 as an array of length zero. */
1511 TYPE_LENGTH (type) = 0;
1512 }
1513 else
1514 TYPE_LENGTH (type) = dn_bufp->darray.arraylength / 8;
1515
1516 TYPE_NFIELDS (type) = 1;
1517 TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->darray.elemtype,
1518 objfile);
1519 dn_bufp = &save;
1520 TYPE_FIELDS (type) = (struct field *)
1521 obstack_alloc (&objfile->type_obstack, sizeof (struct field));
1522 TYPE_FIELD_TYPE (type, 0) = hpread_type_lookup (dn_bufp->darray.indextype,
1523 objfile);
1524 return type;
1525 }
1526
1527 /* Read in and internalize a subrange debug symbol. */
1528 static struct type *
1529 hpread_read_subrange_type (dnttpointer hp_type, union dnttentry *dn_bufp,
1530 struct objfile *objfile)
1531 {
1532 struct type *type;
1533
1534 /* Is it something we've already dealt with. */
1535 type = hpread_alloc_type (hp_type, objfile);
1536 if (TYPE_CODE (type) == TYPE_CODE_RANGE)
1537 return type;
1538
1539 /* Nope, internalize it. */
1540 TYPE_CODE (type) = TYPE_CODE_RANGE;
1541 TYPE_LENGTH (type) = dn_bufp->dsubr.bitlength / 8;
1542 TYPE_NFIELDS (type) = 2;
1543 TYPE_FIELDS (type)
1544 = (struct field *) obstack_alloc (&objfile->type_obstack,
1545 2 * sizeof (struct field));
1546
1547 if (dn_bufp->dsubr.dyn_low)
1548 TYPE_FIELD_BITPOS (type, 0) = 0;
1549 else
1550 TYPE_FIELD_BITPOS (type, 0) = dn_bufp->dsubr.lowbound;
1551
1552 if (dn_bufp->dsubr.dyn_high)
1553 TYPE_FIELD_BITPOS (type, 1) = -1;
1554 else
1555 TYPE_FIELD_BITPOS (type, 1) = dn_bufp->dsubr.highbound;
1556 TYPE_TARGET_TYPE (type) = hpread_type_lookup (dn_bufp->dsubr.subtype,
1557 objfile);
1558 return type;
1559 }
1560
1561 static struct type *
1562 hpread_type_lookup (dnttpointer hp_type, struct objfile *objfile)
1563 {
1564 union dnttentry *dn_bufp;
1565
1566 /* First see if it's a simple builtin type. */
1567 if (hp_type.dntti.immediate)
1568 return lookup_fundamental_type (objfile, hpread_type_translate (hp_type));
1569
1570 /* Not a builtin type. We'll have to read it in. */
1571 if (hp_type.dnttp.index < LNTT_SYMCOUNT (objfile))
1572 dn_bufp = hpread_get_lntt (hp_type.dnttp.index, objfile);
1573 else
1574 return lookup_fundamental_type (objfile, FT_VOID);
1575
1576 switch (dn_bufp->dblock.kind)
1577 {
1578 case DNTT_TYPE_SRCFILE:
1579 case DNTT_TYPE_MODULE:
1580 case DNTT_TYPE_FUNCTION:
1581 case DNTT_TYPE_ENTRY:
1582 case DNTT_TYPE_BEGIN:
1583 case DNTT_TYPE_END:
1584 case DNTT_TYPE_IMPORT:
1585 case DNTT_TYPE_LABEL:
1586 case DNTT_TYPE_WITH:
1587 case DNTT_TYPE_COMMON:
1588 case DNTT_TYPE_FPARAM:
1589 case DNTT_TYPE_SVAR:
1590 case DNTT_TYPE_DVAR:
1591 case DNTT_TYPE_CONST:
1592 /* Opps. Something went very wrong. */
1593 return lookup_fundamental_type (objfile, FT_VOID);
1594
1595 case DNTT_TYPE_TYPEDEF:
1596 {
1597 struct type *structtype = hpread_type_lookup (dn_bufp->dtype.type,
1598 objfile);
1599 char *suffix;
1600 suffix = VT (objfile) + dn_bufp->dtype.name;
1601
1602 TYPE_CPLUS_SPECIFIC (structtype)
1603 = (struct cplus_struct_type *) &cplus_struct_default;
1604 TYPE_NAME (structtype) = suffix;
1605 return structtype;
1606 }
1607
1608 case DNTT_TYPE_TAGDEF:
1609 {
1610 /* Just a little different from above. We have to tack on
1611 an identifier of some kind (struct, union, enum, etc). */
1612 struct type *structtype = hpread_type_lookup (dn_bufp->dtype.type,
1613 objfile);
1614 char *prefix, *suffix;
1615 suffix = VT (objfile) + dn_bufp->dtype.name;
1616
1617 /* Lookup the next type in the list. It should be a structure,
1618 union, or enum type. We will need to attach that to our name. */
1619 if (dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile))
1620 dn_bufp = hpread_get_lntt (dn_bufp->dtype.type.dnttp.index, objfile);
1621 else
1622 internal_error (__FILE__, __LINE__, "failed internal consistency check");
1623
1624 if (dn_bufp->dblock.kind == DNTT_TYPE_STRUCT)
1625 prefix = "struct ";
1626 else if (dn_bufp->dblock.kind == DNTT_TYPE_UNION)
1627 prefix = "union ";
1628 else
1629 prefix = "enum ";
1630
1631 /* Build the correct name. */
1632 structtype->name
1633 = (char *) obstack_alloc (&objfile->type_obstack,
1634 strlen (prefix) + strlen (suffix) + 1);
1635 TYPE_NAME (structtype) = strcpy (TYPE_NAME (structtype), prefix);
1636 TYPE_NAME (structtype) = strcat (TYPE_NAME (structtype), suffix);
1637 TYPE_TAG_NAME (structtype) = suffix;
1638
1639 TYPE_CPLUS_SPECIFIC (structtype)
1640 = (struct cplus_struct_type *) &cplus_struct_default;
1641
1642 return structtype;
1643 }
1644 case DNTT_TYPE_POINTER:
1645 return lookup_pointer_type (hpread_type_lookup (dn_bufp->dptr.pointsto,
1646 objfile));
1647 case DNTT_TYPE_ENUM:
1648 return hpread_read_enum_type (hp_type, dn_bufp, objfile);
1649 case DNTT_TYPE_MEMENUM:
1650 return lookup_fundamental_type (objfile, FT_VOID);
1651 case DNTT_TYPE_SET:
1652 return hpread_read_set_type (hp_type, dn_bufp, objfile);
1653 case DNTT_TYPE_SUBRANGE:
1654 return hpread_read_subrange_type (hp_type, dn_bufp, objfile);
1655 case DNTT_TYPE_ARRAY:
1656 return hpread_read_array_type (hp_type, dn_bufp, objfile);
1657 case DNTT_TYPE_STRUCT:
1658 case DNTT_TYPE_UNION:
1659 return hpread_read_struct_type (hp_type, dn_bufp, objfile);
1660 case DNTT_TYPE_FIELD:
1661 return hpread_type_lookup (dn_bufp->dfield.type, objfile);
1662 case DNTT_TYPE_VARIANT:
1663 case DNTT_TYPE_FILE:
1664 return lookup_fundamental_type (objfile, FT_VOID);
1665 case DNTT_TYPE_FUNCTYPE:
1666 return lookup_function_type (hpread_type_lookup (dn_bufp->dfunctype.retval,
1667 objfile));
1668 case DNTT_TYPE_COBSTRUCT:
1669 case DNTT_TYPE_XREF:
1670 case DNTT_TYPE_SA:
1671 case DNTT_TYPE_MACRO:
1672 default:
1673 return lookup_fundamental_type (objfile, FT_VOID);
1674 }
1675 }
1676
1677 static sltpointer
1678 hpread_record_lines (struct subfile *subfile, sltpointer s_idx,
1679 sltpointer e_idx, struct objfile *objfile,
1680 CORE_ADDR offset)
1681 {
1682 union sltentry *sl_bufp;
1683
1684 while (s_idx <= e_idx)
1685 {
1686 sl_bufp = hpread_get_slt (s_idx, objfile);
1687 /* Only record "normal" entries in the SLT. */
1688 if (sl_bufp->snorm.sltdesc == SLT_NORMAL
1689 || sl_bufp->snorm.sltdesc == SLT_EXIT)
1690 record_line (subfile, sl_bufp->snorm.line,
1691 sl_bufp->snorm.address + offset);
1692 s_idx++;
1693 }
1694 return e_idx;
1695 }
1696
1697 /* Internalize one native debug symbol. */
1698
1699 static void
1700 hpread_process_one_debug_symbol (union dnttentry *dn_bufp, char *name,
1701 struct section_offsets *section_offsets,
1702 struct objfile *objfile, CORE_ADDR text_offset,
1703 int text_size, char *filename, int index)
1704 {
1705 unsigned long desc;
1706 int type;
1707 CORE_ADDR valu;
1708 int offset = ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile));
1709 union dnttentry *dn_temp;
1710 dnttpointer hp_type;
1711 struct symbol *sym;
1712 struct context_stack *new;
1713
1714 /* Allocate one GDB debug symbol and fill in some default values. */
1715 sym = (struct symbol *) obstack_alloc (&objfile->symbol_obstack,
1716 sizeof (struct symbol));
1717 memset (sym, 0, sizeof (struct symbol));
1718 SYMBOL_NAME (sym) = obsavestring (name, strlen (name), &objfile->symbol_obstack);
1719 SYMBOL_LANGUAGE (sym) = language_auto;
1720 SYMBOL_INIT_DEMANGLED_NAME (sym, &objfile->symbol_obstack);
1721 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1722 SYMBOL_LINE (sym) = 0;
1723 SYMBOL_VALUE (sym) = 0;
1724 SYMBOL_CLASS (sym) = LOC_TYPEDEF;
1725
1726 hp_type.dnttp.extension = 1;
1727 hp_type.dnttp.immediate = 0;
1728 hp_type.dnttp.global = 0;
1729 hp_type.dnttp.index = index;
1730
1731 type = dn_bufp->dblock.kind;
1732
1733 switch (type)
1734 {
1735 case DNTT_TYPE_SRCFILE:
1736 /* This type of symbol indicates from which source file or include file
1737 the following data comes. If there are no modules it also may
1738 indicate the start of a new source file, in which case we must
1739 finish the symbol table of the previous source file
1740 (if any) and start accumulating a new symbol table. */
1741
1742 valu = text_offset;
1743 if (!last_source_file)
1744 {
1745 start_symtab (name, NULL, valu);
1746 record_debugformat ("HP");
1747 SL_INDEX (objfile) = dn_bufp->dsfile.address;
1748 }
1749 else
1750 {
1751 SL_INDEX (objfile) = hpread_record_lines (current_subfile,
1752 SL_INDEX (objfile),
1753 dn_bufp->dsfile.address,
1754 objfile, offset);
1755 }
1756 start_subfile (name, NULL);
1757 break;
1758
1759 case DNTT_TYPE_MODULE:
1760 /* No need to do anything with these DNTT_TYPE_MODULE symbols anymore. */
1761 break;
1762
1763 case DNTT_TYPE_FUNCTION:
1764 case DNTT_TYPE_ENTRY:
1765 /* A function or secondary entry point. */
1766 valu = dn_bufp->dfunc.lowaddr + offset;
1767 SL_INDEX (objfile) = hpread_record_lines (current_subfile,
1768 SL_INDEX (objfile),
1769 dn_bufp->dfunc.address,
1770 objfile, offset);
1771
1772 WITHIN_FUNCTION (objfile) = 1;
1773 CURRENT_FUNCTION_VALUE (objfile) = valu;
1774
1775 /* Stack must be empty now. */
1776 if (context_stack_depth != 0)
1777 complain (&lbrac_unmatched_complaint, (char *) symnum);
1778 new = push_context (0, valu);
1779
1780 SYMBOL_CLASS (sym) = LOC_BLOCK;
1781 SYMBOL_TYPE (sym) = hpread_read_function_type (hp_type, dn_bufp, objfile);
1782 if (dn_bufp->dfunc.global)
1783 add_symbol_to_list (sym, &global_symbols);
1784 else
1785 add_symbol_to_list (sym, &file_symbols);
1786 new->name = sym;
1787
1788 /* Search forward to the next scope beginning. */
1789 while (dn_bufp->dblock.kind != DNTT_TYPE_BEGIN)
1790 {
1791 dn_bufp = hpread_get_lntt (++index, objfile);
1792 if (dn_bufp->dblock.extension)
1793 continue;
1794 }
1795 SL_INDEX (objfile) = hpread_record_lines (current_subfile,
1796 SL_INDEX (objfile),
1797 dn_bufp->dbegin.address,
1798 objfile, offset);
1799 SYMBOL_LINE (sym) = hpread_get_line (dn_bufp->dbegin.address, objfile);
1800 record_line (current_subfile, SYMBOL_LINE (sym), valu);
1801 break;
1802
1803 case DNTT_TYPE_BEGIN:
1804 /* Begin a new scope. */
1805 SL_INDEX (objfile) = hpread_record_lines (current_subfile,
1806 SL_INDEX (objfile),
1807 dn_bufp->dbegin.address,
1808 objfile, offset);
1809 valu = hpread_get_location (dn_bufp->dbegin.address, objfile);
1810 valu += offset; /* Relocate for dynamic loading */
1811 desc = hpread_get_depth (dn_bufp->dbegin.address, objfile);
1812 new = push_context (desc, valu);
1813 break;
1814
1815 case DNTT_TYPE_END:
1816 /* End a scope. */
1817 SL_INDEX (objfile) = hpread_record_lines (current_subfile,
1818 SL_INDEX (objfile),
1819 dn_bufp->dend.address + 1,
1820 objfile, offset);
1821 switch (dn_bufp->dend.endkind)
1822 {
1823 case DNTT_TYPE_MODULE:
1824 /* Ending a module ends the symbol table for that module. */
1825 valu = text_offset + text_size + offset;
1826 (void) end_symtab (valu, objfile, SECT_OFF_TEXT (objfile));
1827 break;
1828
1829 case DNTT_TYPE_FUNCTION:
1830 /* Ending a function, well, ends the function's scope. */
1831 dn_temp = hpread_get_lntt (dn_bufp->dend.beginscope.dnttp.index,
1832 objfile);
1833 valu = dn_temp->dfunc.hiaddr + offset;
1834 new = pop_context ();
1835 /* Make a block for the local symbols within. */
1836 finish_block (new->name, &local_symbols, new->old_blocks,
1837 new->start_addr, valu, objfile);
1838 WITHIN_FUNCTION (objfile) = 0;
1839 break;
1840 case DNTT_TYPE_BEGIN:
1841 /* Just ending a local scope. */
1842 valu = hpread_get_location (dn_bufp->dend.address, objfile);
1843 /* Why in the hell is this needed? */
1844 valu += offset + 9; /* Relocate for dynamic loading */
1845 new = pop_context ();
1846 desc = dn_bufp->dend.beginscope.dnttp.index;
1847 if (desc != new->depth)
1848 complain (&lbrac_mismatch_complaint, (char *) symnum);
1849 /* Make a block for the local symbols within. */
1850 finish_block (new->name, &local_symbols, new->old_blocks,
1851 new->start_addr, valu, objfile);
1852 local_symbols = new->locals;
1853 break;
1854 }
1855 break;
1856 case DNTT_TYPE_LABEL:
1857 SYMBOL_NAMESPACE (sym) = LABEL_NAMESPACE;
1858 break;
1859 case DNTT_TYPE_FPARAM:
1860 /* Function parameters. */
1861 if (dn_bufp->dfparam.regparam)
1862 SYMBOL_CLASS (sym) = LOC_REGISTER;
1863 else
1864 SYMBOL_CLASS (sym) = LOC_LOCAL;
1865 if (dn_bufp->dfparam.copyparam)
1866 {
1867 SYMBOL_VALUE (sym) = dn_bufp->dfparam.location;
1868 #ifdef HPREAD_ADJUST_STACK_ADDRESS
1869 SYMBOL_VALUE (sym)
1870 += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
1871 #endif
1872 }
1873 else
1874 SYMBOL_VALUE (sym) = dn_bufp->dfparam.location;
1875 SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dfparam.type, objfile);
1876 add_symbol_to_list (sym, &local_symbols);
1877 break;
1878 case DNTT_TYPE_SVAR:
1879 /* Static variables. */
1880 SYMBOL_CLASS (sym) = LOC_STATIC;
1881 SYMBOL_VALUE_ADDRESS (sym) = dn_bufp->dsvar.location;
1882 SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dsvar.type, objfile);
1883 if (dn_bufp->dsvar.global)
1884 add_symbol_to_list (sym, &global_symbols);
1885 else if (WITHIN_FUNCTION (objfile))
1886 add_symbol_to_list (sym, &local_symbols);
1887 else
1888 add_symbol_to_list (sym, &file_symbols);
1889 break;
1890 case DNTT_TYPE_DVAR:
1891 /* Dynamic variables. */
1892 if (dn_bufp->ddvar.regvar)
1893 SYMBOL_CLASS (sym) = LOC_REGISTER;
1894 else
1895 SYMBOL_CLASS (sym) = LOC_LOCAL;
1896 SYMBOL_VALUE (sym) = dn_bufp->ddvar.location;
1897 #ifdef HPREAD_ADJUST_STACK_ADDRESS
1898 SYMBOL_VALUE (sym)
1899 += HPREAD_ADJUST_STACK_ADDRESS (CURRENT_FUNCTION_VALUE (objfile));
1900 #endif
1901 SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->ddvar.type, objfile);
1902 if (dn_bufp->ddvar.global)
1903 add_symbol_to_list (sym, &global_symbols);
1904 else if (WITHIN_FUNCTION (objfile))
1905 add_symbol_to_list (sym, &local_symbols);
1906 else
1907 add_symbol_to_list (sym, &file_symbols);
1908 break;
1909 case DNTT_TYPE_CONST:
1910 /* A constant (pascal?). */
1911 SYMBOL_CLASS (sym) = LOC_CONST;
1912 SYMBOL_VALUE (sym) = dn_bufp->dconst.location;
1913 SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dconst.type, objfile);
1914 if (dn_bufp->dconst.global)
1915 add_symbol_to_list (sym, &global_symbols);
1916 else if (WITHIN_FUNCTION (objfile))
1917 add_symbol_to_list (sym, &local_symbols);
1918 else
1919 add_symbol_to_list (sym, &file_symbols);
1920 break;
1921 case DNTT_TYPE_TYPEDEF:
1922 SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
1923 SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dtype.type, objfile);
1924 if (dn_bufp->dtype.global)
1925 add_symbol_to_list (sym, &global_symbols);
1926 else if (WITHIN_FUNCTION (objfile))
1927 add_symbol_to_list (sym, &local_symbols);
1928 else
1929 add_symbol_to_list (sym, &file_symbols);
1930 break;
1931 case DNTT_TYPE_TAGDEF:
1932 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1933 SYMBOL_TYPE (sym) = hpread_type_lookup (dn_bufp->dtype.type, objfile);
1934 TYPE_NAME (sym->type) = SYMBOL_NAME (sym);
1935 TYPE_TAG_NAME (sym->type) = SYMBOL_NAME (sym);
1936 if (dn_bufp->dtype.global)
1937 add_symbol_to_list (sym, &global_symbols);
1938 else if (WITHIN_FUNCTION (objfile))
1939 add_symbol_to_list (sym, &local_symbols);
1940 else
1941 add_symbol_to_list (sym, &file_symbols);
1942 break;
1943 case DNTT_TYPE_POINTER:
1944 SYMBOL_TYPE (sym) = lookup_pointer_type (hpread_type_lookup
1945 (dn_bufp->dptr.pointsto,
1946 objfile));
1947 add_symbol_to_list (sym, &file_symbols);
1948 break;
1949 case DNTT_TYPE_ENUM:
1950 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1951 SYMBOL_TYPE (sym) = hpread_read_enum_type (hp_type, dn_bufp, objfile);
1952 add_symbol_to_list (sym, &file_symbols);
1953 break;
1954 case DNTT_TYPE_MEMENUM:
1955 break;
1956 case DNTT_TYPE_SET:
1957 SYMBOL_TYPE (sym) = hpread_read_set_type (hp_type, dn_bufp, objfile);
1958 add_symbol_to_list (sym, &file_symbols);
1959 break;
1960 case DNTT_TYPE_SUBRANGE:
1961 SYMBOL_TYPE (sym) = hpread_read_subrange_type (hp_type, dn_bufp,
1962 objfile);
1963 add_symbol_to_list (sym, &file_symbols);
1964 break;
1965 case DNTT_TYPE_ARRAY:
1966 SYMBOL_TYPE (sym) = hpread_read_array_type (hp_type, dn_bufp, objfile);
1967 add_symbol_to_list (sym, &file_symbols);
1968 break;
1969 case DNTT_TYPE_STRUCT:
1970 case DNTT_TYPE_UNION:
1971 SYMBOL_NAMESPACE (sym) = STRUCT_NAMESPACE;
1972 SYMBOL_TYPE (sym) = hpread_read_struct_type (hp_type, dn_bufp, objfile);
1973 add_symbol_to_list (sym, &file_symbols);
1974 break;
1975 default:
1976 break;
1977 }
1978 }
This page took 0.103292 seconds and 4 git commands to generate.