Protoization.
[deliverable/binutils-gdb.git] / gdb / hp-psymtab-read.c
1 /* Read hp debug symbols and convert to internal format, for GDB.
2 Copyright 1993, 1996, 1998, 1999 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
20
21 Written by the Center for Software Science at the University of Utah
22 and by Cygnus Support. */
23
24 /* Common include file for hp_symtab_read.c and hp_psymtab_read.c.
25 This has nested includes of a bunch of stuff. */
26 #include "hpread.h"
27 #include "demangle.h"
28
29 /* To generate dumping code, uncomment this define. The dumping
30 itself is controlled by routine-local statics called "dumping". */
31 /* #define DUMPING 1 */
32
33 /* To use the quick look-up tables, uncomment this define. */
34 #define QUICK_LOOK_UP 1
35
36 /* To call PXDB to process un-processed files, uncomment this define. */
37 #define USE_PXDB 1
38
39 /* Forward procedure declarations */
40
41 void hpread_symfile_init (struct objfile *);
42
43 void do_pxdb (bfd *);
44
45 void hpread_build_psymtabs (struct objfile *, int);
46
47 void hpread_symfile_finish (struct objfile *);
48
49 static union dnttentry *hpread_get_gntt (int, struct objfile *);
50
51 static unsigned long hpread_get_textlow (int, int, struct objfile *, int);
52
53 static struct partial_symtab *hpread_start_psymtab
54 (struct objfile *, char *, CORE_ADDR, int,
55 struct partial_symbol **, struct partial_symbol **);
56
57 static struct partial_symtab *hpread_end_psymtab
58 (struct partial_symtab *, char **, int, int, CORE_ADDR,
59 struct partial_symtab **, int);
60
61 /* End of forward routine declarations */
62
63 #ifdef USE_PXDB
64
65 /* NOTE use of system files! May not be portable. */
66
67 #define PXDB_SVR4 "/opt/langtools/bin/pxdb"
68 #define PXDB_BSD "/usr/bin/pxdb"
69
70 #include <stdlib.h>
71 #include <string.h>
72
73 /* check for the existance of a file, given its full pathname */
74 int
75 file_exists (char *filename)
76 {
77 if (filename)
78 return (access (filename, F_OK) == 0);
79 return 0;
80 }
81
82
83 /* Translate from the "hp_language" enumeration in hp-symtab.h
84 used in the debug info to gdb's generic enumeration in defs.h. */
85 static enum language
86 trans_lang (enum hp_language in_lang)
87 {
88 if (in_lang == HP_LANGUAGE_C)
89 return language_c;
90
91 else if (in_lang == HP_LANGUAGE_CPLUSPLUS)
92 return language_cplus;
93
94 else if (in_lang == HP_LANGUAGE_FORTRAN)
95 return language_fortran;
96
97 else
98 return language_unknown;
99 }
100
101 static char main_string[] = "main";
102 \f
103 /* Call PXDB to process our file.
104
105 Approach copied from DDE's "dbgk_run_pxdb". Note: we
106 don't check for BSD location of pxdb, nor for existance
107 of pxdb itself, etc.
108
109 NOTE: uses system function and string functions directly.
110
111 Return value: 1 if ok, 0 if not */
112 int
113 hpread_call_pxdb (char *file_name)
114 {
115 char *p;
116 int status;
117 int retval;
118
119 if (file_exists (PXDB_SVR4))
120 {
121 p = malloc (strlen (PXDB_SVR4) + strlen (file_name) + 2);
122 strcpy (p, PXDB_SVR4);
123 strcat (p, " ");
124 strcat (p, file_name);
125
126 warning ("File not processed by pxdb--about to process now.\n");
127 status = system (p);
128
129 retval = (status == 0);
130 }
131 else
132 {
133 warning ("pxdb not found at standard location: /opt/langtools/bin\ngdb will not be able to debug %s.\nPlease install pxdb at the above location and then restart gdb.\nYou can also run pxdb on %s with the command\n\"pxdb %s\" and then restart gdb.", file_name, file_name, file_name);
134
135 retval = 0;
136 }
137 return retval;
138 } /* hpread_call_pxdb */
139 \f
140
141 /* Return 1 if the file turns out to need pre-processing
142 by PXDB, and we have thus called PXDB to do this processing
143 and the file therefore needs to be re-loaded. Otherwise
144 return 0. */
145 int
146 hpread_pxdb_needed (bfd *sym_bfd)
147 {
148 asection *pinfo_section, *debug_section, *header_section;
149 unsigned int do_pxdb;
150 char *buf;
151 bfd_size_type header_section_size;
152
153 unsigned long tmp;
154 unsigned int pxdbed;
155
156 header_section = bfd_get_section_by_name (sym_bfd, "$HEADER$");
157 if (!header_section)
158 {
159 return 0; /* No header at all, can't recover... */
160 }
161
162 debug_section = bfd_get_section_by_name (sym_bfd, "$DEBUG$");
163 pinfo_section = bfd_get_section_by_name (sym_bfd, "$PINFO$");
164
165 if (pinfo_section && !debug_section)
166 {
167 /* Debug info with DOC, has different header format.
168 this only happens if the file was pxdbed and compiled optimized
169 otherwise the PINFO section is not there. */
170 header_section_size = bfd_section_size (objfile->obfd, header_section);
171
172 if (header_section_size == (bfd_size_type) sizeof (DOC_info_PXDB_header))
173 {
174 buf = alloca (sizeof (DOC_info_PXDB_header));
175
176 if (!bfd_get_section_contents (sym_bfd,
177 header_section,
178 buf, 0,
179 header_section_size))
180 error ("bfd_get_section_contents\n");
181
182 tmp = bfd_get_32 (sym_bfd, (bfd_byte *) (buf + sizeof (int) * 4));
183 pxdbed = (tmp >> 31) & 0x1;
184
185 if (!pxdbed)
186 error ("file debug header info invalid\n");
187 do_pxdb = 0;
188 }
189
190 else
191 error ("invalid $HEADER$ size in executable \n");
192 }
193
194 else
195 {
196
197 /* this can be three different cases:
198 1. pxdbed and not doc
199 - DEBUG and HEADER sections are there
200 - header is PXDB_header type
201 - pxdbed flag is set to 1
202
203 2. not pxdbed and doc
204 - DEBUG and HEADER sections are there
205 - header is DOC_info_header type
206 - pxdbed flag is set to 0
207
208 3. not pxdbed and not doc
209 - DEBUG and HEADER sections are there
210 - header is XDB_header type
211 - pxdbed flag is set to 0
212
213 NOTE: the pxdbed flag is meaningful also in the not
214 already pxdb processed version of the header,
215 because in case on non-already processed by pxdb files
216 that same bit in the header would be always zero.
217 Why? Because the bit is the leftmost bit of a word
218 which contains a 'length' which is always a positive value
219 so that bit is never set to 1 (otherwise it would be negative)
220
221 Given the above, we have two choices : either we ignore the
222 size of the header itself and just look at the pxdbed field,
223 or we check the size and then we (for safety and paranoia related
224 issues) check the bit.
225 The first solution is used by DDE, the second by PXDB itself.
226 I am using the second one here, because I already wrote it,
227 and it is the end of a long day.
228 Also, using the first approach would still involve size issues
229 because we need to read in the contents of the header section, and
230 give the correct amount of stuff we want to read to the
231 get_bfd_section_contents function. */
232
233 /* decide which case depending on the size of the header section.
234 The size is as defined in hp-symtab.h */
235
236 header_section_size = bfd_section_size (objfile->obfd, header_section);
237
238 if (header_section_size == (bfd_size_type) sizeof (PXDB_header)) /* pxdb and not doc */
239 {
240
241 buf = alloca (sizeof (PXDB_header));
242 if (!bfd_get_section_contents (sym_bfd,
243 header_section,
244 buf, 0,
245 header_section_size))
246 error ("bfd_get_section_contents\n");
247
248 tmp = bfd_get_32 (sym_bfd, (bfd_byte *) (buf + sizeof (int) * 3));
249 pxdbed = (tmp >> 31) & 0x1;
250
251 if (pxdbed)
252 do_pxdb = 0;
253 else
254 error ("file debug header invalid\n");
255 }
256 else /*not pxdbed and doc OR not pxdbed and non doc */
257 do_pxdb = 1;
258 }
259
260 if (do_pxdb)
261 {
262 return 1;
263 }
264 else
265 {
266 return 0;
267 }
268 } /* hpread_pxdb_needed */
269
270 #endif
271
272 /* Check whether the file needs to be preprocessed by pxdb.
273 If so, call pxdb. */
274
275 void
276 do_pxdb (bfd *sym_bfd)
277 {
278 /* The following code is HP-specific. The "right" way of
279 doing this is unknown, but we bet would involve a target-
280 specific pre-file-load check using a generic mechanism. */
281
282 /* This code will not be executed if the file is not in SOM
283 format (i.e. if compiled with gcc) */
284 if (hpread_pxdb_needed (sym_bfd))
285 {
286 /*This file has not been pre-processed. Preprocess now */
287
288 if (hpread_call_pxdb (sym_bfd->filename))
289 {
290 /* The call above has changed the on-disk file,
291 we can close the file anyway, because the
292 symbols will be reread in when the target is run */
293 bfd_close (sym_bfd);
294 }
295 }
296 }
297 \f
298
299
300 #ifdef QUICK_LOOK_UP
301
302 /* Code to handle quick lookup-tables follows. */
303
304
305 /* Some useful macros */
306 #define VALID_FILE(i) ((i) < pxdb_header_p->fd_entries)
307 #define VALID_MODULE(i) ((i) < pxdb_header_p->md_entries)
308 #define VALID_PROC(i) ((i) < pxdb_header_p->pd_entries)
309 #define VALID_CLASS(i) ((i) < pxdb_header_p->cd_entries)
310
311 #define FILE_START(i) (qFD[i].adrStart)
312 #define MODULE_START(i) (qMD[i].adrStart)
313 #define PROC_START(i) (qPD[i].adrStart)
314
315 #define FILE_END(i) (qFD[i].adrEnd)
316 #define MODULE_END(i) (qMD[i].adrEnd)
317 #define PROC_END(i) (qPD[i].adrEnd)
318
319 #define FILE_ISYM(i) (qFD[i].isym)
320 #define MODULE_ISYM(i) (qMD[i].isym)
321 #define PROC_ISYM(i) (qPD[i].isym)
322
323 #define VALID_CURR_FILE (curr_fd < pxdb_header_p->fd_entries)
324 #define VALID_CURR_MODULE (curr_md < pxdb_header_p->md_entries)
325 #define VALID_CURR_PROC (curr_pd < pxdb_header_p->pd_entries)
326 #define VALID_CURR_CLASS (curr_cd < pxdb_header_p->cd_entries)
327
328 #define CURR_FILE_START (qFD[curr_fd].adrStart)
329 #define CURR_MODULE_START (qMD[curr_md].adrStart)
330 #define CURR_PROC_START (qPD[curr_pd].adrStart)
331
332 #define CURR_FILE_END (qFD[curr_fd].adrEnd)
333 #define CURR_MODULE_END (qMD[curr_md].adrEnd)
334 #define CURR_PROC_END (qPD[curr_pd].adrEnd)
335
336 #define CURR_FILE_ISYM (qFD[curr_fd].isym)
337 #define CURR_MODULE_ISYM (qMD[curr_md].isym)
338 #define CURR_PROC_ISYM (qPD[curr_pd].isym)
339
340 #define TELL_OBJFILE \
341 do { \
342 if( !told_objfile ) { \
343 told_objfile = 1; \
344 warning ("\nIn object file \"%s\":\n", \
345 objfile->name); \
346 } \
347 } while (0)
348 \f
349
350
351 /* Keeping track of the start/end symbol table (LNTT) indices of
352 psymtabs created so far */
353
354 typedef struct
355 {
356 int start;
357 int end;
358 }
359 pst_syms_struct;
360
361 static pst_syms_struct *pst_syms_array = 0;
362
363 static pst_syms_count = 0;
364 static pst_syms_size = 0;
365
366 /* used by the TELL_OBJFILE macro */
367 static boolean told_objfile = 0;
368
369 /* Set up psymtab symbol index stuff */
370 static void
371 init_pst_syms (void)
372 {
373 pst_syms_count = 0;
374 pst_syms_size = 20;
375 pst_syms_array = (pst_syms_struct *) xmalloc (20 * sizeof (pst_syms_struct));
376 }
377
378 /* Clean up psymtab symbol index stuff */
379 static void
380 clear_pst_syms (void)
381 {
382 pst_syms_count = 0;
383 pst_syms_size = 0;
384 free (pst_syms_array);
385 pst_syms_array = 0;
386 }
387
388 /* Add information about latest psymtab to symbol index table */
389 static void
390 record_pst_syms (int start_sym, int end_sym)
391 {
392 if (++pst_syms_count > pst_syms_size)
393 {
394 pst_syms_array = (pst_syms_struct *) xrealloc (pst_syms_array,
395 2 * pst_syms_size * sizeof (pst_syms_struct));
396 pst_syms_size *= 2;
397 }
398 pst_syms_array[pst_syms_count - 1].start = start_sym;
399 pst_syms_array[pst_syms_count - 1].end = end_sym;
400 }
401
402 /* Find a suitable symbol table index which can serve as the upper
403 bound of a psymtab that starts at INDEX
404
405 This scans backwards in the psymtab symbol index table to find a
406 "hole" in which the given index can fit. This is a heuristic!!
407 We don't search the entire table to check for multiple holes,
408 we don't care about overlaps, etc.
409
410 Return 0 => not found */
411 static int
412 find_next_pst_start (int index)
413 {
414 int i;
415
416 for (i = pst_syms_count - 1; i >= 0; i--)
417 if (pst_syms_array[i].end <= index)
418 return (i == pst_syms_count - 1) ? 0 : pst_syms_array[i + 1].start - 1;
419
420 if (pst_syms_array[0].start > index)
421 return pst_syms_array[0].start - 1;
422
423 return 0;
424 }
425 \f
426
427
428 /* Utility functions to find the ending symbol index for a psymtab */
429
430 /* Find the next file entry that begins beyond INDEX, and return
431 its starting symbol index - 1.
432 QFD is the file table, CURR_FD is the file entry from where to start,
433 PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
434
435 Return 0 => not found */
436 static int
437 find_next_file_isym (int index, quick_file_entry *qFD, int curr_fd,
438 PXDB_header_ptr pxdb_header_p)
439 {
440 while (VALID_CURR_FILE)
441 {
442 if (CURR_FILE_ISYM >= index)
443 return CURR_FILE_ISYM - 1;
444 curr_fd++;
445 }
446 return 0;
447 }
448
449 /* Find the next procedure entry that begins beyond INDEX, and return
450 its starting symbol index - 1.
451 QPD is the procedure table, CURR_PD is the proc entry from where to start,
452 PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
453
454 Return 0 => not found */
455 static int
456 find_next_proc_isym (int index, quick_procedure_entry *qPD, int curr_pd,
457 PXDB_header_ptr pxdb_header_p)
458 {
459 while (VALID_CURR_PROC)
460 {
461 if (CURR_PROC_ISYM >= index)
462 return CURR_PROC_ISYM - 1;
463 curr_pd++;
464 }
465 return 0;
466 }
467
468 /* Find the next module entry that begins beyond INDEX, and return
469 its starting symbol index - 1.
470 QMD is the module table, CURR_MD is the modue entry from where to start,
471 PXDB_HEADER_P as in hpread_quick_traverse (to allow macros to work).
472
473 Return 0 => not found */
474 static int
475 find_next_module_isym (int index, quick_module_entry *qMD, int curr_md,
476 PXDB_header_ptr pxdb_header_p)
477 {
478 while (VALID_CURR_MODULE)
479 {
480 if (CURR_MODULE_ISYM >= index)
481 return CURR_MODULE_ISYM - 1;
482 curr_md++;
483 }
484 return 0;
485 }
486
487 /* Scan and record partial symbols for all functions starting from index
488 pointed to by CURR_PD_P, and between code addresses START_ADR and END_ADR.
489 Other parameters are explained in comments below. */
490
491 /* This used to be inline in hpread_quick_traverse, but now that we do essentially the
492 same thing for two different cases (modules and module-less files), it's better
493 organized in a separate routine, although it does take lots of arguments. pai/1997-10-08 */
494
495 static int
496 scan_procs (curr_pd_p, qPD, max_procs, start_adr, end_adr, pst, vt_bits, objfile)
497 int *curr_pd_p; /* pointer to current proc index */
498 quick_procedure_entry *qPD; /* the procedure quick lookup table */
499 int max_procs; /* number of entries in proc. table */
500 CORE_ADDR start_adr; /* beginning of code range for current psymtab */
501 CORE_ADDR end_adr; /* end of code range for current psymtab */
502 struct partial_symtab *pst; /* current psymtab */
503 char *vt_bits; /* strings table of SOM debug space */
504 struct objfile *objfile; /* current object file */
505 {
506 union dnttentry *dn_bufp;
507 int symbol_count = 0; /* Total number of symbols in this psymtab */
508 int curr_pd = *curr_pd_p; /* Convenience variable -- avoid dereferencing pointer all the time */
509
510 #ifdef DUMPING
511 /* Turn this on for lots of debugging information in this routine */
512 static int dumping = 0;
513 #endif
514
515 #ifdef DUMPING
516 if (dumping)
517 {
518 printf ("Scan_procs called, addresses %x to %x, proc %x\n", start_adr, end_adr, curr_pd);
519 }
520 #endif
521
522 while ((CURR_PROC_START <= end_adr) && (curr_pd < max_procs))
523 {
524
525 char *rtn_name; /* mangled name */
526 char *rtn_dem_name; /* qualified demangled name */
527 char *class_name;
528 int class;
529
530 if ((trans_lang ((enum hp_language) qPD[curr_pd].language) == language_cplus) &&
531 vt_bits[(long) qPD[curr_pd].sbAlias]) /* not a null string */
532 {
533 /* Get mangled name for the procedure, and demangle it */
534 rtn_name = &vt_bits[(long) qPD[curr_pd].sbAlias];
535 rtn_dem_name = cplus_demangle (rtn_name, DMGL_ANSI | DMGL_PARAMS);
536 }
537 else
538 {
539 rtn_name = &vt_bits[(long) qPD[curr_pd].sbProc];
540 rtn_dem_name = NULL;
541 }
542
543 /* Hack to get around HP C/C++ compilers' insistence on providing
544 "_MAIN_" as an alternate name for "main" */
545 if ((strcmp (rtn_name, "_MAIN_") == 0) &&
546 (strcmp (&vt_bits[(long) qPD[curr_pd].sbProc], "main") == 0))
547 rtn_dem_name = rtn_name = main_string;
548
549 #ifdef DUMPING
550 if (dumping)
551 {
552 printf ("..add %s (demangled %s), index %x to this psymtab\n", rtn_name, rtn_dem_name, curr_pd);
553 }
554 #endif
555
556 /* Check for module-spanning routines. */
557 if (CURR_PROC_END > end_adr)
558 {
559 TELL_OBJFILE;
560 warning ("Procedure \"%s\" [0x%x] spans file or module boundaries.", rtn_name, curr_pd);
561 }
562
563 /* Add this routine symbol to the list in the objfile.
564 Unfortunately we have to go to the LNTT to determine the
565 correct list to put it on. An alternative (which the
566 code used to do) would be to not check and always throw
567 it on the "static" list. But if we go that route, then
568 symbol_lookup() needs to be tweaked a bit to account
569 for the fact that the function might not be found on
570 the correct list in the psymtab. - RT */
571 dn_bufp = hpread_get_lntt (qPD[curr_pd].isym, objfile);
572 if (dn_bufp->dfunc.global)
573 add_psymbol_with_dem_name_to_list (rtn_name,
574 strlen (rtn_name),
575 rtn_dem_name,
576 strlen (rtn_dem_name),
577 VAR_NAMESPACE,
578 LOC_BLOCK, /* "I am a routine" */
579 &objfile->global_psymbols,
580 (qPD[curr_pd].adrStart + /* Starting address of rtn */
581 ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))),
582 0, /* core addr?? */
583 trans_lang ((enum hp_language) qPD[curr_pd].language),
584 objfile);
585 else
586 add_psymbol_with_dem_name_to_list (rtn_name,
587 strlen (rtn_name),
588 rtn_dem_name,
589 strlen (rtn_dem_name),
590 VAR_NAMESPACE,
591 LOC_BLOCK, /* "I am a routine" */
592 &objfile->static_psymbols,
593 (qPD[curr_pd].adrStart + /* Starting address of rtn */
594 ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))),
595 0, /* core addr?? */
596 trans_lang ((enum hp_language) qPD[curr_pd].language),
597 objfile);
598
599 symbol_count++;
600 *curr_pd_p = ++curr_pd; /* bump up count & reflect in caller */
601 } /* loop over procedures */
602
603 #ifdef DUMPING
604 if (dumping)
605 {
606 if (symbol_count == 0)
607 printf ("Scan_procs: no symbols found!\n");
608 }
609 #endif
610
611 return symbol_count;
612 }
613
614
615 /* Traverse the quick look-up tables, building a set of psymtabs.
616
617 This constructs a psymtab for modules and files in the quick lookup
618 tables.
619
620 Mostly, modules correspond to compilation units, so we try to
621 create psymtabs that correspond to modules; however, in some cases
622 a file can result in a compiled object which does not have a module
623 entry for it, so in such cases we create a psymtab for the file. */
624
625 int
626 hpread_quick_traverse (objfile, gntt_bits, vt_bits, pxdb_header_p)
627 struct objfile *objfile; /* The object file descriptor */
628 char *gntt_bits; /* GNTT entries, loaded in from the file */
629 char *vt_bits; /* VT (string) entries ditto. */
630 PXDB_header_ptr pxdb_header_p; /* Pointer to pxdb header ditto */
631 {
632 struct partial_symtab *pst;
633
634 char *addr;
635
636 quick_procedure_entry *qPD;
637 quick_file_entry *qFD;
638 quick_module_entry *qMD;
639 quick_class_entry *qCD;
640
641 int idx;
642 int i;
643 CORE_ADDR start_adr; /* current psymtab's starting code addr */
644 CORE_ADDR end_adr; /* current psymtab's ending code addr */
645 CORE_ADDR next_mod_adr; /* next module's starting code addr */
646 int curr_pd; /* current procedure */
647 int curr_fd; /* current file */
648 int curr_md; /* current module */
649 int start_sym; /* current psymtab's starting symbol index */
650 int end_sym; /* current psymtab's ending symbol index */
651 int max_LNTT_sym_index;
652 int syms_in_pst;
653 B_TYPE *class_entered;
654
655 struct partial_symbol **global_syms; /* We'll be filling in the "global" */
656 struct partial_symbol **static_syms; /* and "static" tables in the objfile
657 as we go, so we need a pair of
658 current pointers. */
659
660 #ifdef DUMPING
661 /* Turn this on for lots of debugging information in this routine.
662 You get a blow-by-blow account of quick lookup table reading */
663 static int dumping = 0;
664 #endif
665
666 pst = (struct partial_symtab *) 0;
667
668 /* Clear out some globals */
669 init_pst_syms ();
670 told_objfile = 0;
671
672 /* Demangling style -- if EDG style already set, don't change it,
673 as HP style causes some problems with the KAI EDG compiler */
674 if (current_demangling_style != edg_demangling)
675 {
676 /* Otherwise, ensure that we are using HP style demangling */
677 set_demangling_style (HP_DEMANGLING_STYLE_STRING);
678 }
679
680 /* First we need to find the starting points of the quick
681 look-up tables in the GNTT. */
682
683 addr = gntt_bits;
684
685 qPD = (quick_procedure_entry_ptr) addr;
686 addr += pxdb_header_p->pd_entries * sizeof (quick_procedure_entry);
687
688 #ifdef DUMPING
689 if (dumping)
690 {
691 printf ("\n Printing routines as we see them\n");
692 for (i = 0; VALID_PROC (i); i++)
693 {
694 idx = (long) qPD[i].sbProc;
695 printf ("%s %x..%x\n", &vt_bits[idx],
696 (int) PROC_START (i),
697 (int) PROC_END (i));
698 }
699 }
700 #endif
701
702 qFD = (quick_file_entry_ptr) addr;
703 addr += pxdb_header_p->fd_entries * sizeof (quick_file_entry);
704
705 #ifdef DUMPING
706 if (dumping)
707 {
708 printf ("\n Printing files as we see them\n");
709 for (i = 0; VALID_FILE (i); i++)
710 {
711 idx = (long) qFD[i].sbFile;
712 printf ("%s %x..%x\n", &vt_bits[idx],
713 (int) FILE_START (i),
714 (int) FILE_END (i));
715 }
716 }
717 #endif
718
719 qMD = (quick_module_entry_ptr) addr;
720 addr += pxdb_header_p->md_entries * sizeof (quick_module_entry);
721
722 #ifdef DUMPING
723 if (dumping)
724 {
725 printf ("\n Printing modules as we see them\n");
726 for (i = 0; i < pxdb_header_p->md_entries; i++)
727 {
728 idx = (long) qMD[i].sbMod;
729 printf ("%s\n", &vt_bits[idx]);
730 }
731 }
732 #endif
733
734 qCD = (quick_class_entry_ptr) addr;
735 addr += pxdb_header_p->cd_entries * sizeof (quick_class_entry);
736
737 #ifdef DUMPING
738 if (dumping)
739 {
740 printf ("\n Printing classes as we see them\n");
741 for (i = 0; VALID_CLASS (i); i++)
742 {
743 idx = (long) qCD[i].sbClass;
744 printf ("%s\n", &vt_bits[idx]);
745 }
746
747 printf ("\n Done with dump, on to build!\n");
748 }
749 #endif
750
751 /* We need this index only while hp-symtab-read.c expects
752 a byte offset to the end of the LNTT entries for a given
753 psymtab. Thus the need for it should go away someday.
754
755 When it goes away, then we won't have any need to load the
756 LNTT from the objfile at psymtab-time, and start-up will be
757 faster. To make that work, we'll need some way to create
758 a null pst for the "globals" pseudo-module. */
759 max_LNTT_sym_index = LNTT_SYMCOUNT (objfile);
760
761 /* Scan the module descriptors and make a psymtab for each.
762
763 We know the MDs, FDs and the PDs are in order by starting
764 address. We use that fact to traverse all three arrays in
765 parallel, knowing when the next PD is in a new file
766 and we need to create a new psymtab. */
767 curr_pd = 0; /* Current procedure entry */
768 curr_fd = 0; /* Current file entry */
769 curr_md = 0; /* Current module entry */
770
771 start_adr = 0; /* Current psymtab code range */
772 end_adr = 0;
773
774 start_sym = 0; /* Current psymtab symbol range */
775 end_sym = 0;
776
777 syms_in_pst = 0; /* Symbol count for psymtab */
778
779 /* Psts actually just have pointers into the objfile's
780 symbol table, not their own symbol tables. */
781 global_syms = objfile->global_psymbols.list;
782 static_syms = objfile->static_psymbols.list;
783
784
785 /* First skip over pseudo-entries with address 0. These represent inlined
786 routines and abstract (uninstantiated) template routines.
787 FIXME: These should be read in and available -- even if we can't set
788 breakpoints, etc., there's some information that can be presented
789 to the user. pai/1997-10-08 */
790
791 while (VALID_CURR_PROC && (CURR_PROC_START == 0))
792 curr_pd++;
793
794 /* Loop over files, modules, and procedures in code address order. Each
795 time we enter an iteration of this loop, curr_pd points to the first
796 unprocessed procedure, curr_fd points to the first unprocessed file, and
797 curr_md to the first unprocessed module. Each iteration of this loop
798 updates these as required -- any or all of them may be bumpd up
799 each time around. When we exit this loop, we are done with all files
800 and modules in the tables -- there may still be some procedures, however.
801
802 Note: This code used to loop only over module entries, under the assumption
803 that files can occur via inclusions and are thus unreliable, while a
804 compiled object always corresponds to a module. With CTTI in the HP aCC
805 compiler, it turns out that compiled objects may have only files and no
806 modules; so we have to loop over files and modules, creating psymtabs for
807 either as appropriate. Unfortunately there are some problems (notably:
808 1. the lack of "SRC_FILE_END" entries in the LNTT, 2. the lack of pointers
809 to the ending symbol indices of a module or a file) which make it quite hard
810 to do this correctly. Currently it uses a bunch of heuristics to start and
811 end psymtabs; they seem to work well with most objects generated by aCC, but
812 who knows when that will change... */
813
814 while (VALID_CURR_FILE || VALID_CURR_MODULE)
815 {
816
817 char *mod_name_string;
818 char *full_name_string;
819
820 /* First check for modules like "version.c", which have no code
821 in them but still have qMD entries. They also have no qFD or
822 qPD entries. Their start address is -1 and their end address
823 is 0. */
824 if (VALID_CURR_MODULE && (CURR_MODULE_START == -1) && (CURR_MODULE_END == 0))
825 {
826
827 mod_name_string = &vt_bits[(long) qMD[curr_md].sbMod];
828
829 #ifdef DUMPING
830 if (dumping)
831 printf ("Module with data only %s\n", mod_name_string);
832 #endif
833
834 /* We'll skip the rest (it makes error-checking easier), and
835 just make an empty pst. Right now empty psts are not put
836 in the pst chain, so all this is for naught, but later it
837 might help. */
838
839 pst = hpread_start_psymtab (objfile,
840 mod_name_string,
841 CURR_MODULE_START, /* Low text address: bogus! */
842 (CURR_MODULE_ISYM * sizeof (struct dntt_type_block)),
843 /* ldsymoff */
844 global_syms,
845 static_syms);
846
847 pst = hpread_end_psymtab (pst,
848 NULL, /* psymtab_include_list */
849 0, /* includes_used */
850 end_sym * sizeof (struct dntt_type_block),
851 /* byte index in LNTT of end
852 = capping symbol offset
853 = LDSYMOFF of nextfile */
854 0, /* text high */
855 NULL, /* dependency_list */
856 0); /* dependencies_used */
857
858 global_syms = objfile->global_psymbols.next;
859 static_syms = objfile->static_psymbols.next;
860
861 curr_md++;
862 }
863 else if (VALID_CURR_MODULE &&
864 ((CURR_MODULE_START == 0) || (CURR_MODULE_START == -1) ||
865 (CURR_MODULE_END == 0) || (CURR_MODULE_END == -1)))
866 {
867 TELL_OBJFILE;
868 warning ("Module \"%s\" [0x%x] has non-standard addresses. It starts at 0x%x, ends at 0x%x, and will be skipped.",
869 mod_name_string, curr_md, start_adr, end_adr);
870 /* On to next module */
871 curr_md++;
872 }
873 else
874 {
875 /* First check if we are looking at a file with code in it
876 that does not overlap the current module's code range */
877
878 if (VALID_CURR_FILE ? (VALID_CURR_MODULE ? (CURR_FILE_END < CURR_MODULE_START) : 1) : 0)
879 {
880
881 /* Looking at file not corresponding to any module,
882 create a psymtab for it */
883 full_name_string = &vt_bits[(long) qFD[curr_fd].sbFile];
884 start_adr = CURR_FILE_START;
885 end_adr = CURR_FILE_END;
886 start_sym = CURR_FILE_ISYM;
887
888 /* Check if there are any procedures not handled until now, that
889 begin before the start address of this file, and if so, adjust
890 this module's start address to include them. This handles routines that
891 are in between file or module ranges for some reason (probably
892 indicates a compiler bug */
893
894 if (CURR_PROC_START < start_adr)
895 {
896 TELL_OBJFILE;
897 warning ("Found procedure \"%s\" [0x%x] that is not in any file or module.",
898 &vt_bits[(long) qPD[curr_pd].sbProc], curr_pd);
899 start_adr = CURR_PROC_START;
900 if (CURR_PROC_ISYM < start_sym)
901 start_sym = CURR_PROC_ISYM;
902 }
903
904 /* Sometimes (compiler bug -- COBOL) the module end address is higher
905 than the start address of the next module, so check for that and
906 adjust accordingly */
907
908 if (VALID_FILE (curr_fd + 1) && (FILE_START (curr_fd + 1) <= end_adr))
909 {
910 TELL_OBJFILE;
911 warning ("File \"%s\" [0x%x] has ending address after starting address of next file; adjusting ending address down.",
912 full_name_string, curr_fd);
913 end_adr = FILE_START (curr_fd + 1) - 1; /* Is -4 (or -8 for 64-bit) better? */
914 }
915 if (VALID_MODULE (curr_md) && (CURR_MODULE_START <= end_adr))
916 {
917 TELL_OBJFILE;
918 warning ("File \"%s\" [0x%x] has ending address after starting address of next module; adjusting ending address down.",
919 full_name_string, curr_fd);
920 end_adr = CURR_MODULE_START - 1; /* Is -4 (or -8 for 64-bit) better? */
921 }
922
923
924 #ifdef DUMPING
925 if (dumping)
926 {
927 printf ("Make new psymtab for file %s (%x to %x).\n",
928 full_name_string, start_adr, end_adr);
929 }
930 #endif
931 /* Create the basic psymtab, connecting it in the list
932 for this objfile and pointing its symbol entries
933 to the current end of the symbol areas in the objfile.
934
935 The "ldsymoff" parameter is the byte offset in the LNTT
936 of the first symbol in this file. Some day we should
937 turn this into an index (fix in hp-symtab-read.c as well).
938 And it's not even the right byte offset, as we're using
939 the size of a union! FIXME! */
940 pst = hpread_start_psymtab (objfile,
941 full_name_string,
942 start_adr, /* Low text address */
943 (start_sym * sizeof (struct dntt_type_block)),
944 /* ldsymoff */
945 global_syms,
946 static_syms);
947
948 /* Set up to only enter each class referenced in this module once. */
949 class_entered = malloc (B_BYTES (pxdb_header_p->cd_entries));
950 B_CLRALL (class_entered, pxdb_header_p->cd_entries);
951
952 /* Scan the procedure descriptors for procedures in the current
953 file, based on the starting addresses. */
954
955 syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries,
956 start_adr, end_adr, pst, vt_bits, objfile);
957
958 /* Get ending symbol offset */
959
960 end_sym = 0;
961 /* First check for starting index before previous psymtab */
962 if (pst_syms_count && start_sym < pst_syms_array[pst_syms_count - 1].end)
963 {
964 end_sym = find_next_pst_start (start_sym);
965 }
966 /* Look for next start index of a file or module, or procedure */
967 if (!end_sym)
968 {
969 int next_file_isym = find_next_file_isym (start_sym, qFD, curr_fd + 1, pxdb_header_p);
970 int next_module_isym = find_next_module_isym (start_sym, qMD, curr_md, pxdb_header_p);
971 int next_proc_isym = find_next_proc_isym (start_sym, qPD, curr_pd, pxdb_header_p);
972
973 if (next_file_isym && next_module_isym)
974 {
975 /* pick lower of next file or module start index */
976 end_sym = min (next_file_isym, next_module_isym);
977 }
978 else
979 {
980 /* one of them is zero, pick the other */
981 end_sym = max (next_file_isym, next_module_isym);
982 }
983
984 /* As a precaution, check next procedure index too */
985 if (!end_sym)
986 end_sym = next_proc_isym;
987 else
988 end_sym = min (end_sym, next_proc_isym);
989 }
990
991 /* Couldn't find procedure, file, or module, use globals as default */
992 if (!end_sym)
993 end_sym = pxdb_header_p->globals;
994
995 #ifdef DUMPING
996 if (dumping)
997 {
998 printf ("File psymtab indices: %x to %x\n", start_sym, end_sym);
999 }
1000 #endif
1001
1002 pst = hpread_end_psymtab (pst,
1003 NULL, /* psymtab_include_list */
1004 0, /* includes_used */
1005 end_sym * sizeof (struct dntt_type_block),
1006 /* byte index in LNTT of end
1007 = capping symbol offset
1008 = LDSYMOFF of nextfile */
1009 end_adr, /* text high */
1010 NULL, /* dependency_list */
1011 0); /* dependencies_used */
1012
1013 record_pst_syms (start_sym, end_sym);
1014
1015 if (NULL == pst)
1016 warning ("No symbols in psymtab for file \"%s\" [0x%x].", full_name_string, curr_fd);
1017
1018 #ifdef DUMPING
1019 if (dumping)
1020 {
1021 printf ("Made new psymtab for file %s (%x to %x), sym %x to %x.\n",
1022 full_name_string, start_adr, end_adr, CURR_FILE_ISYM, end_sym);
1023 }
1024 #endif
1025 /* Prepare for the next psymtab. */
1026 global_syms = objfile->global_psymbols.next;
1027 static_syms = objfile->static_psymbols.next;
1028 free (class_entered);
1029
1030 curr_fd++;
1031 } /* Psymtab for file */
1032 else
1033 {
1034 /* We have a module for which we create a psymtab */
1035
1036 mod_name_string = &vt_bits[(long) qMD[curr_md].sbMod];
1037
1038 /* We will include the code ranges of any files that happen to
1039 overlap with this module */
1040
1041 /* So, first pick the lower of the file's and module's start addresses */
1042 start_adr = CURR_MODULE_START;
1043 if (VALID_CURR_FILE)
1044 {
1045 if (CURR_FILE_START < CURR_MODULE_START)
1046 {
1047 TELL_OBJFILE;
1048 warning ("File \"%s\" [0x%x] crosses beginning of module \"%s\".",
1049 &vt_bits[(long) qFD[curr_fd].sbFile],
1050 curr_fd, mod_name_string);
1051
1052 start_adr = CURR_FILE_START;
1053 }
1054 }
1055
1056 /* Also pick the lower of the file's and the module's start symbol indices */
1057 start_sym = CURR_MODULE_ISYM;
1058 if (VALID_CURR_FILE && (CURR_FILE_ISYM < CURR_MODULE_ISYM))
1059 start_sym = CURR_FILE_ISYM;
1060
1061 /* For the end address, we scan through the files till we find one
1062 that overlaps the current module but ends beyond it; if no such file exists we
1063 simply use the module's start address.
1064 (Note, if file entries themselves overlap
1065 we take the longest overlapping extension beyond the end of the module...)
1066 We assume that modules never overlap. */
1067
1068 end_adr = CURR_MODULE_END;
1069
1070 if (VALID_CURR_FILE)
1071 {
1072 while (VALID_CURR_FILE && (CURR_FILE_START < end_adr))
1073 {
1074
1075 #ifdef DUMPING
1076 if (dumping)
1077 printf ("Maybe skipping file %s which overlaps with module %s\n",
1078 &vt_bits[(long) qFD[curr_fd].sbFile], mod_name_string);
1079 #endif
1080 if (CURR_FILE_END > end_adr)
1081 {
1082 TELL_OBJFILE;
1083 warning ("File \"%s\" [0x%x] crosses end of module \"%s\".",
1084 &vt_bits[(long) qFD[curr_fd].sbFile],
1085 curr_fd, mod_name_string);
1086 end_adr = CURR_FILE_END;
1087 }
1088 curr_fd++;
1089 }
1090 curr_fd--; /* back up after going too far */
1091 }
1092
1093 /* Sometimes (compiler bug -- COBOL) the module end address is higher
1094 than the start address of the next module, so check for that and
1095 adjust accordingly */
1096
1097 if (VALID_MODULE (curr_md + 1) && (MODULE_START (curr_md + 1) <= end_adr))
1098 {
1099 TELL_OBJFILE;
1100 warning ("Module \"%s\" [0x%x] has ending address after starting address of next module; adjusting ending address down.",
1101 mod_name_string, curr_md);
1102 end_adr = MODULE_START (curr_md + 1) - 1; /* Is -4 (or -8 for 64-bit) better? */
1103 }
1104 if (VALID_FILE (curr_fd + 1) && (FILE_START (curr_fd + 1) <= end_adr))
1105 {
1106 TELL_OBJFILE;
1107 warning ("Module \"%s\" [0x%x] has ending address after starting address of next file; adjusting ending address down.",
1108 mod_name_string, curr_md);
1109 end_adr = FILE_START (curr_fd + 1) - 1; /* Is -4 (or -8 for 64-bit) better? */
1110 }
1111
1112 /* Use one file to get the full name for the module. This
1113 situation can arise if there is executable code in a #include
1114 file. Each file with code in it gets a qFD. Files which don't
1115 contribute code don't get a qFD, even if they include files
1116 which do, e.g.:
1117
1118 body.c: rtn.h:
1119 int x; int main() {
1120 #include "rtn.h" return x;
1121 }
1122
1123 There will a qFD for "rtn.h",and a qMD for "body.c",
1124 but no qMD for "rtn.h" or qFD for "body.c"!
1125
1126 We pick the name of the last file to overlap with this
1127 module. C convention is to put include files first. In a
1128 perfect world, we could check names and use the file whose full
1129 path name ends with the module name. */
1130
1131 if (VALID_CURR_FILE)
1132 full_name_string = &vt_bits[(long) qFD[curr_fd].sbFile];
1133 else
1134 full_name_string = mod_name_string;
1135
1136 /* Check if there are any procedures not handled until now, that
1137 begin before the start address we have now, and if so, adjust
1138 this psymtab's start address to include them. This handles routines that
1139 are in between file or module ranges for some reason (probably
1140 indicates a compiler bug */
1141
1142 if (CURR_PROC_START < start_adr)
1143 {
1144 TELL_OBJFILE;
1145 warning ("Found procedure \"%s\" [0x%x] that is not in any file or module.",
1146 &vt_bits[(long) qPD[curr_pd].sbProc], curr_pd);
1147 start_adr = CURR_PROC_START;
1148 if (CURR_PROC_ISYM < start_sym)
1149 start_sym = CURR_PROC_ISYM;
1150 }
1151
1152 #ifdef DUMPING
1153 if (dumping)
1154 {
1155 printf ("Make new psymtab for module %s (%x to %x), using file %s\n",
1156 mod_name_string, start_adr, end_adr, full_name_string);
1157 }
1158 #endif
1159 /* Create the basic psymtab, connecting it in the list
1160 for this objfile and pointing its symbol entries
1161 to the current end of the symbol areas in the objfile.
1162
1163 The "ldsymoff" parameter is the byte offset in the LNTT
1164 of the first symbol in this file. Some day we should
1165 turn this into an index (fix in hp-symtab-read.c as well).
1166 And it's not even the right byte offset, as we're using
1167 the size of a union! FIXME! */
1168 pst = hpread_start_psymtab (objfile,
1169 full_name_string,
1170 start_adr, /* Low text address */
1171 (start_sym * sizeof (struct dntt_type_block)),
1172 /* ldsymoff */
1173 global_syms,
1174 static_syms);
1175
1176 /* Set up to only enter each class referenced in this module once. */
1177 class_entered = malloc (B_BYTES (pxdb_header_p->cd_entries));
1178 B_CLRALL (class_entered, pxdb_header_p->cd_entries);
1179
1180 /* Scan the procedure descriptors for procedures in the current
1181 module, based on the starting addresses. */
1182
1183 syms_in_pst = scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries,
1184 start_adr, end_adr, pst, vt_bits, objfile);
1185
1186 /* Get ending symbol offset */
1187
1188 end_sym = 0;
1189 /* First check for starting index before previous psymtab */
1190 if (pst_syms_count && start_sym < pst_syms_array[pst_syms_count - 1].end)
1191 {
1192 end_sym = find_next_pst_start (start_sym);
1193 }
1194 /* Look for next start index of a file or module, or procedure */
1195 if (!end_sym)
1196 {
1197 int next_file_isym = find_next_file_isym (start_sym, qFD, curr_fd + 1, pxdb_header_p);
1198 int next_module_isym = find_next_module_isym (start_sym, qMD, curr_md + 1, pxdb_header_p);
1199 int next_proc_isym = find_next_proc_isym (start_sym, qPD, curr_pd, pxdb_header_p);
1200
1201 if (next_file_isym && next_module_isym)
1202 {
1203 /* pick lower of next file or module start index */
1204 end_sym = min (next_file_isym, next_module_isym);
1205 }
1206 else
1207 {
1208 /* one of them is zero, pick the other */
1209 end_sym = max (next_file_isym, next_module_isym);
1210 }
1211
1212 /* As a precaution, check next procedure index too */
1213 if (!end_sym)
1214 end_sym = next_proc_isym;
1215 else
1216 end_sym = min (end_sym, next_proc_isym);
1217 }
1218
1219 /* Couldn't find procedure, file, or module, use globals as default */
1220 if (!end_sym)
1221 end_sym = pxdb_header_p->globals;
1222
1223 #ifdef DUMPING
1224 if (dumping)
1225 {
1226 printf ("Module psymtab indices: %x to %x\n", start_sym, end_sym);
1227 }
1228 #endif
1229
1230 pst = hpread_end_psymtab (pst,
1231 NULL, /* psymtab_include_list */
1232 0, /* includes_used */
1233 end_sym * sizeof (struct dntt_type_block),
1234 /* byte index in LNTT of end
1235 = capping symbol offset
1236 = LDSYMOFF of nextfile */
1237 end_adr, /* text high */
1238 NULL, /* dependency_list */
1239 0); /* dependencies_used */
1240
1241 record_pst_syms (start_sym, end_sym);
1242
1243 if (NULL == pst)
1244 warning ("No symbols in psymtab for module \"%s\" [0x%x].", mod_name_string, curr_md);
1245
1246 #ifdef DUMPING
1247 if (dumping)
1248 {
1249 printf ("Made new psymtab for module %s (%x to %x), sym %x to %x.\n",
1250 mod_name_string, start_adr, end_adr, CURR_MODULE_ISYM, end_sym);
1251 }
1252 #endif
1253
1254 /* Prepare for the next psymtab. */
1255 global_syms = objfile->global_psymbols.next;
1256 static_syms = objfile->static_psymbols.next;
1257 free (class_entered);
1258
1259 curr_md++;
1260 curr_fd++;
1261 } /* psymtab for module */
1262 } /* psymtab for non-bogus file or module */
1263 } /* End of while loop over all files & modules */
1264
1265 /* There may be some routines after all files and modules -- these will get
1266 inserted in a separate new module of their own */
1267 if (VALID_CURR_PROC)
1268 {
1269 start_adr = CURR_PROC_START;
1270 end_adr = qPD[pxdb_header_p->pd_entries - 1].adrEnd;
1271 TELL_OBJFILE;
1272 warning ("Found functions beyond end of all files and modules [0x%x].", curr_pd);
1273 #ifdef DUMPING
1274 if (dumping)
1275 {
1276 printf ("Orphan functions at end, PD %d and beyond (%x to %x)\n",
1277 curr_pd, start_adr, end_adr);
1278 }
1279 #endif
1280 pst = hpread_start_psymtab (objfile,
1281 "orphans",
1282 start_adr, /* Low text address */
1283 (CURR_PROC_ISYM * sizeof (struct dntt_type_block)),
1284 /* ldsymoff */
1285 global_syms,
1286 static_syms);
1287
1288 scan_procs (&curr_pd, qPD, pxdb_header_p->pd_entries,
1289 start_adr, end_adr, pst, vt_bits, objfile);
1290
1291 pst = hpread_end_psymtab (pst,
1292 NULL, /* psymtab_include_list */
1293 0, /* includes_used */
1294 pxdb_header_p->globals * sizeof (struct dntt_type_block),
1295 /* byte index in LNTT of end
1296 = capping symbol offset
1297 = LDSYMOFF of nextfile */
1298 end_adr, /* text high */
1299 NULL, /* dependency_list */
1300 0); /* dependencies_used */
1301 }
1302
1303
1304 #ifdef NEVER_NEVER
1305 /* Now build psts for non-module things (in the tail of
1306 the LNTT, after the last END MODULE entry).
1307
1308 If null psts were kept on the chain, this would be
1309 a solution. FIXME */
1310 pst = hpread_start_psymtab (objfile,
1311 "globals",
1312 0,
1313 (pxdb_header_p->globals
1314 * sizeof (struct dntt_type_block)),
1315 objfile->global_psymbols.next,
1316 objfile->static_psymbols.next);
1317 hpread_end_psymtab (pst,
1318 NULL, 0,
1319 (max_LNTT_sym_index * sizeof (struct dntt_type_block)),
1320 0,
1321 NULL, 0);
1322 #endif
1323
1324 clear_pst_syms ();
1325
1326 return 1;
1327
1328 } /* End of hpread_quick_traverse. */
1329 \f
1330
1331 /* Get appropriate header, based on pxdb type.
1332 Return value: 1 if ok, 0 if not */
1333 int
1334 hpread_get_header (struct objfile *objfile, PXDB_header_ptr pxdb_header_p)
1335 {
1336 asection *pinfo_section, *debug_section, *header_section;
1337
1338 #ifdef DUMPING
1339 /* Turn on for debugging information */
1340 static int dumping = 0;
1341 #endif
1342
1343 header_section = bfd_get_section_by_name (objfile->obfd, "$HEADER$");
1344 if (!header_section)
1345 {
1346 /* We don't have either PINFO or DEBUG sections. But
1347 stuff like "libc.sl" has no debug info. There's no
1348 need to warn the user of this, as it may be ok. The
1349 caller will figure it out and issue any needed
1350 messages. */
1351 #ifdef DUMPING
1352 if (dumping)
1353 printf ("==No debug info at all for %s.\n", objfile->name);
1354 #endif
1355
1356 return 0;
1357 }
1358
1359 /* We would like either a $DEBUG$ or $PINFO$ section.
1360 Once we know which, we can understand the header
1361 data (which we have defined to suit the more common
1362 $DEBUG$ case). */
1363 debug_section = bfd_get_section_by_name (objfile->obfd, "$DEBUG$");
1364 pinfo_section = bfd_get_section_by_name (objfile->obfd, "$PINFO$");
1365 if (debug_section)
1366 {
1367 /* The expected case: normal pxdb header. */
1368 bfd_get_section_contents (objfile->obfd, header_section,
1369 pxdb_header_p, 0, sizeof (PXDB_header));
1370
1371 if (!pxdb_header_p->pxdbed)
1372 {
1373 /* This shouldn't happen if we check in "symfile.c". */
1374 return 0;
1375 } /* DEBUG section */
1376 }
1377
1378 else if (pinfo_section)
1379 {
1380 /* The DOC case; we need to translate this into a
1381 regular header. */
1382 DOC_info_PXDB_header doc_header;
1383
1384 #ifdef DUMPING
1385 if (dumping)
1386 {
1387 printf ("==OOps, PINFO, let's try to handle this, %s.\n", objfile->name);
1388 }
1389 #endif
1390
1391 bfd_get_section_contents (objfile->obfd,
1392 header_section,
1393 &doc_header, 0,
1394 sizeof (DOC_info_PXDB_header));
1395
1396 if (!doc_header.pxdbed)
1397 {
1398 /* This shouldn't happen if we check in "symfile.c". */
1399 warning ("File \"%s\" not processed by pxdb!", objfile->name);
1400 return 0;
1401 }
1402
1403 /* Copy relevent fields to standard header passed in. */
1404 pxdb_header_p->pd_entries = doc_header.pd_entries;
1405 pxdb_header_p->fd_entries = doc_header.fd_entries;
1406 pxdb_header_p->md_entries = doc_header.md_entries;
1407 pxdb_header_p->pxdbed = doc_header.pxdbed;
1408 pxdb_header_p->bighdr = doc_header.bighdr;
1409 pxdb_header_p->sa_header = doc_header.sa_header;
1410 pxdb_header_p->inlined = doc_header.inlined;
1411 pxdb_header_p->globals = doc_header.globals;
1412 pxdb_header_p->time = doc_header.time;
1413 pxdb_header_p->pg_entries = doc_header.pg_entries;
1414 pxdb_header_p->functions = doc_header.functions;
1415 pxdb_header_p->files = doc_header.files;
1416 pxdb_header_p->cd_entries = doc_header.cd_entries;
1417 pxdb_header_p->aa_entries = doc_header.aa_entries;
1418 pxdb_header_p->oi_entries = doc_header.oi_entries;
1419 pxdb_header_p->version = doc_header.version;
1420 } /* PINFO section */
1421
1422 else
1423 {
1424 #ifdef DUMPING
1425 if (dumping)
1426 printf ("==No debug info at all for %s.\n", objfile->name);
1427 #endif
1428
1429 return 0;
1430
1431 }
1432
1433 return 1;
1434 } /* End of hpread_get_header */
1435 #endif /* QUICK_LOOK_UP */
1436 \f
1437
1438 /* Initialization for reading native HP C debug symbols from OBJFILE.
1439
1440 Its only purpose in life is to set up the symbol reader's private
1441 per-objfile data structures, and read in the raw contents of the debug
1442 sections (attaching pointers to the debug info into the private data
1443 structures).
1444
1445 Since BFD doesn't know how to read debug symbols in a format-independent
1446 way (and may never do so...), we have to do it ourselves. Note we may
1447 be called on a file without native HP C debugging symbols.
1448
1449 FIXME, there should be a cleaner peephole into the BFD environment
1450 here. */
1451 void
1452 hpread_symfile_init (struct objfile *objfile)
1453 {
1454 asection *vt_section, *slt_section, *lntt_section, *gntt_section;
1455
1456 /* Allocate struct to keep track of the symfile */
1457 objfile->sym_private = (PTR)
1458 xmmalloc (objfile->md, sizeof (struct hpread_symfile_info));
1459 memset (objfile->sym_private, 0, sizeof (struct hpread_symfile_info));
1460
1461 /* We haven't read in any types yet. */
1462 TYPE_VECTOR (objfile) = 0;
1463
1464 /* Read in data from the $GNTT$ subspace. */
1465 gntt_section = bfd_get_section_by_name (objfile->obfd, "$GNTT$");
1466 if (!gntt_section)
1467 return;
1468
1469 GNTT (objfile)
1470 = obstack_alloc (&objfile->symbol_obstack,
1471 bfd_section_size (objfile->obfd, gntt_section));
1472
1473 bfd_get_section_contents (objfile->obfd, gntt_section, GNTT (objfile),
1474 0, bfd_section_size (objfile->obfd, gntt_section));
1475
1476 GNTT_SYMCOUNT (objfile)
1477 = bfd_section_size (objfile->obfd, gntt_section)
1478 / sizeof (struct dntt_type_block);
1479
1480 /* Read in data from the $LNTT$ subspace. Also keep track of the number
1481 of LNTT symbols.
1482
1483 FIXME: this could be moved into the psymtab-to-symtab expansion
1484 code, and save startup time. At the moment this data is
1485 still used, though. We'd need a way to tell hp-symtab-read.c
1486 whether or not to load the LNTT. */
1487 lntt_section = bfd_get_section_by_name (objfile->obfd, "$LNTT$");
1488 if (!lntt_section)
1489 return;
1490
1491 LNTT (objfile)
1492 = obstack_alloc (&objfile->symbol_obstack,
1493 bfd_section_size (objfile->obfd, lntt_section));
1494
1495 bfd_get_section_contents (objfile->obfd, lntt_section, LNTT (objfile),
1496 0, bfd_section_size (objfile->obfd, lntt_section));
1497
1498 LNTT_SYMCOUNT (objfile)
1499 = bfd_section_size (objfile->obfd, lntt_section)
1500 / sizeof (struct dntt_type_block);
1501
1502 /* Read in data from the $SLT$ subspace. $SLT$ contains information
1503 on source line numbers. */
1504 slt_section = bfd_get_section_by_name (objfile->obfd, "$SLT$");
1505 if (!slt_section)
1506 return;
1507
1508 SLT (objfile) =
1509 obstack_alloc (&objfile->symbol_obstack,
1510 bfd_section_size (objfile->obfd, slt_section));
1511
1512 bfd_get_section_contents (objfile->obfd, slt_section, SLT (objfile),
1513 0, bfd_section_size (objfile->obfd, slt_section));
1514
1515 /* Read in data from the $VT$ subspace. $VT$ contains things like
1516 names and constants. Keep track of the number of symbols in the VT. */
1517 vt_section = bfd_get_section_by_name (objfile->obfd, "$VT$");
1518 if (!vt_section)
1519 return;
1520
1521 VT_SIZE (objfile) = bfd_section_size (objfile->obfd, vt_section);
1522
1523 VT (objfile) =
1524 (char *) obstack_alloc (&objfile->symbol_obstack,
1525 VT_SIZE (objfile));
1526
1527 bfd_get_section_contents (objfile->obfd, vt_section, VT (objfile),
1528 0, VT_SIZE (objfile));
1529 }
1530
1531 /* Scan and build partial symbols for a symbol file.
1532
1533 The minimal symbol table (either SOM or HP a.out) has already been
1534 read in; all we need to do is setup partial symbols based on the
1535 native debugging information.
1536
1537 Note that the minimal table is produced by the linker, and has
1538 only global routines in it; the psymtab is based on compiler-
1539 generated debug information and has non-global
1540 routines in it as well as files and class information.
1541
1542 We assume hpread_symfile_init has been called to initialize the
1543 symbol reader's private data structures.
1544
1545 MAINLINE is true if we are reading the main symbol table (as
1546 opposed to a shared lib or dynamically loaded file). */
1547
1548 void
1549 hpread_build_psymtabs (struct objfile *objfile, int mainline)
1550 {
1551
1552 #ifdef DUMPING
1553 /* Turn this on to get debugging output. */
1554 static int dumping = 0;
1555 #endif
1556
1557 char *namestring;
1558 int past_first_source_file = 0;
1559 struct cleanup *old_chain;
1560
1561 int hp_symnum, symcount, i;
1562 int scan_start = 0;
1563
1564 union dnttentry *dn_bufp;
1565 unsigned long valu;
1566 char *p;
1567 int texthigh = 0;
1568 int have_name = 0;
1569
1570 /* Current partial symtab */
1571 struct partial_symtab *pst;
1572
1573 /* List of current psymtab's include files */
1574 char **psymtab_include_list;
1575 int includes_allocated;
1576 int includes_used;
1577
1578 /* Index within current psymtab dependency list */
1579 struct partial_symtab **dependency_list;
1580 int dependencies_used, dependencies_allocated;
1581
1582 /* Just in case the stabs reader left turds lying around. */
1583 free_pending_blocks ();
1584 make_cleanup (really_free_pendings, 0);
1585
1586 pst = (struct partial_symtab *) 0;
1587
1588 /* We shouldn't use alloca, instead use malloc/free. Doing so avoids
1589 a number of problems with cross compilation and creating useless holes
1590 in the stack when we have to allocate new entries. FIXME. */
1591
1592 includes_allocated = 30;
1593 includes_used = 0;
1594 psymtab_include_list = (char **) alloca (includes_allocated *
1595 sizeof (char *));
1596
1597 dependencies_allocated = 30;
1598 dependencies_used = 0;
1599 dependency_list =
1600 (struct partial_symtab **) alloca (dependencies_allocated *
1601 sizeof (struct partial_symtab *));
1602
1603 old_chain = make_cleanup_free_objfile (objfile);
1604
1605 last_source_file = 0;
1606
1607 #ifdef QUICK_LOOK_UP
1608 {
1609 /* Begin code for new-style loading of quick look-up tables. */
1610
1611 /* elz: this checks whether the file has beeen processed by pxdb.
1612 If not we would like to try to read the psymbols in
1613 anyway, but it turns out to be not so easy. So this could
1614 actually be commented out, but I leave it in, just in case
1615 we decide to add support for non-pxdb-ed stuff in the future. */
1616 PXDB_header pxdb_header;
1617 int found_modules_in_program;
1618
1619 if (hpread_get_header (objfile, &pxdb_header))
1620 {
1621 /* Build a minimal table. No types, no global variables,
1622 no include files.... */
1623 #ifdef DUMPING
1624 if (dumping)
1625 printf ("\nNew method for %s\n", objfile->name);
1626 #endif
1627
1628 /* elz: quick_traverse returns true if it found
1629 some modules in the main source file, other
1630 than those in end.c
1631 In C and C++, all the files have MODULES entries
1632 in the LNTT, and the quick table traverse is all
1633 based on finding these MODULES entries. Without
1634 those it cannot work.
1635 It happens that F77 programs don't have MODULES
1636 so the quick traverse gets confused. F90 programs
1637 have modules, and the quick method still works.
1638 So, if modules (other than those in end.c) are
1639 not found we give up on the quick table stuff,
1640 and fall back on the slower method */
1641 found_modules_in_program = hpread_quick_traverse (objfile,
1642 GNTT (objfile),
1643 VT (objfile),
1644 &pxdb_header);
1645
1646 discard_cleanups (old_chain);
1647
1648 /* Set up to scan the global section of the LNTT.
1649
1650 This field is not always correct: if there are
1651 no globals, it will point to the last record in
1652 the regular LNTT, which is usually an END MODULE.
1653
1654 Since it might happen that there could be a file
1655 with just one global record, there's no way to
1656 tell other than by looking at the record, so that's
1657 done below. */
1658 if (found_modules_in_program)
1659 scan_start = pxdb_header.globals;
1660 }
1661 #ifdef DUMPING
1662 else
1663 {
1664 if (dumping)
1665 printf ("\nGoing on to old method for %s\n", objfile->name);
1666 }
1667 #endif
1668 }
1669 #endif /* QUICK_LOOK_UP */
1670
1671 /* Make two passes, one over the GNTT symbols, the other for the
1672 LNTT symbols.
1673
1674 JB comment: above isn't true--they only make one pass, over
1675 the LNTT. */
1676 for (i = 0; i < 1; i++)
1677 {
1678 int within_function = 0;
1679
1680 if (i)
1681 symcount = GNTT_SYMCOUNT (objfile);
1682 else
1683 symcount = LNTT_SYMCOUNT (objfile);
1684
1685
1686 for (hp_symnum = scan_start; hp_symnum < symcount; hp_symnum++)
1687 {
1688 QUIT;
1689 if (i)
1690 dn_bufp = hpread_get_gntt (hp_symnum, objfile);
1691 else
1692 dn_bufp = hpread_get_lntt (hp_symnum, objfile);
1693
1694 if (dn_bufp->dblock.extension)
1695 continue;
1696
1697 /* Only handle things which are necessary for minimal symbols.
1698 everything else is ignored. */
1699 switch (dn_bufp->dblock.kind)
1700 {
1701 case DNTT_TYPE_SRCFILE:
1702 {
1703 #ifdef QUICK_LOOK_UP
1704 if (scan_start == hp_symnum
1705 && symcount == hp_symnum + 1)
1706 {
1707 /* If there are NO globals in an executable,
1708 PXDB's index to the globals will point to
1709 the last record in the file, which
1710 could be this record. (this happened for F77 libraries)
1711 ignore it and be done! */
1712 continue;
1713 }
1714 #endif /* QUICK_LOOK_UP */
1715
1716 /* A source file of some kind. Note this may simply
1717 be an included file. */
1718 SET_NAMESTRING (dn_bufp, &namestring, objfile);
1719
1720 /* Check if this is the source file we are already working
1721 with. */
1722 if (pst && !strcmp (namestring, pst->filename))
1723 continue;
1724
1725 /* Check if this is an include file, if so check if we have
1726 already seen it. Add it to the include list */
1727 p = strrchr (namestring, '.');
1728 if (!strcmp (p, ".h"))
1729 {
1730 int j, found;
1731
1732 found = 0;
1733 for (j = 0; j < includes_used; j++)
1734 if (!strcmp (namestring, psymtab_include_list[j]))
1735 {
1736 found = 1;
1737 break;
1738 }
1739 if (found)
1740 continue;
1741
1742 /* Add it to the list of includes seen so far and
1743 allocate more include space if necessary. */
1744 psymtab_include_list[includes_used++] = namestring;
1745 if (includes_used >= includes_allocated)
1746 {
1747 char **orig = psymtab_include_list;
1748
1749 psymtab_include_list = (char **)
1750 alloca ((includes_allocated *= 2) *
1751 sizeof (char *));
1752 memcpy ((PTR) psymtab_include_list, (PTR) orig,
1753 includes_used * sizeof (char *));
1754 }
1755 continue;
1756 }
1757
1758 if (pst)
1759 {
1760 if (!have_name)
1761 {
1762 pst->filename = (char *)
1763 obstack_alloc (&pst->objfile->psymbol_obstack,
1764 strlen (namestring) + 1);
1765 strcpy (pst->filename, namestring);
1766 have_name = 1;
1767 continue;
1768 }
1769 continue;
1770 }
1771
1772 /* This is a bonafide new source file.
1773 End the current partial symtab and start a new one. */
1774
1775 if (pst && past_first_source_file)
1776 {
1777 hpread_end_psymtab (pst, psymtab_include_list,
1778 includes_used,
1779 (hp_symnum
1780 * sizeof (struct dntt_type_block)),
1781 texthigh,
1782 dependency_list, dependencies_used);
1783 pst = (struct partial_symtab *) 0;
1784 includes_used = 0;
1785 dependencies_used = 0;
1786 }
1787 else
1788 past_first_source_file = 1;
1789
1790 valu = hpread_get_textlow (i, hp_symnum, objfile, symcount);
1791 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1792 pst = hpread_start_psymtab (objfile,
1793 namestring, valu,
1794 (hp_symnum
1795 * sizeof (struct dntt_type_block)),
1796 objfile->global_psymbols.next,
1797 objfile->static_psymbols.next);
1798 texthigh = valu;
1799 have_name = 1;
1800 continue;
1801 }
1802
1803 case DNTT_TYPE_MODULE:
1804 /* A source file. It's still unclear to me what the
1805 real difference between a DNTT_TYPE_SRCFILE and DNTT_TYPE_MODULE
1806 is supposed to be. */
1807
1808 /* First end the previous psymtab */
1809 if (pst)
1810 {
1811 hpread_end_psymtab (pst, psymtab_include_list, includes_used,
1812 ((hp_symnum - 1)
1813 * sizeof (struct dntt_type_block)),
1814 texthigh,
1815 dependency_list, dependencies_used);
1816 pst = (struct partial_symtab *) 0;
1817 includes_used = 0;
1818 dependencies_used = 0;
1819 have_name = 0;
1820 }
1821
1822 /* Now begin a new module and a new psymtab for it */
1823 SET_NAMESTRING (dn_bufp, &namestring, objfile);
1824 valu = hpread_get_textlow (i, hp_symnum, objfile, symcount);
1825 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1826 if (!pst)
1827 {
1828 pst = hpread_start_psymtab (objfile,
1829 namestring, valu,
1830 (hp_symnum
1831 * sizeof (struct dntt_type_block)),
1832 objfile->global_psymbols.next,
1833 objfile->static_psymbols.next);
1834 texthigh = valu;
1835 have_name = 0;
1836 }
1837 continue;
1838
1839 case DNTT_TYPE_FUNCTION:
1840 case DNTT_TYPE_ENTRY:
1841 /* The beginning of a function. DNTT_TYPE_ENTRY may also denote
1842 a secondary entry point. */
1843 valu = dn_bufp->dfunc.hiaddr + ANOFFSET (objfile->section_offsets,
1844 SECT_OFF_TEXT (objfile));
1845 if (valu > texthigh)
1846 texthigh = valu;
1847 valu = dn_bufp->dfunc.lowaddr +
1848 ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1849 SET_NAMESTRING (dn_bufp, &namestring, objfile);
1850 if (dn_bufp->dfunc.global)
1851 add_psymbol_to_list (namestring, strlen (namestring),
1852 VAR_NAMESPACE, LOC_BLOCK,
1853 &objfile->global_psymbols, valu,
1854 0, language_unknown, objfile);
1855 else
1856 add_psymbol_to_list (namestring, strlen (namestring),
1857 VAR_NAMESPACE, LOC_BLOCK,
1858 &objfile->static_psymbols, valu,
1859 0, language_unknown, objfile);
1860 within_function = 1;
1861 continue;
1862
1863 case DNTT_TYPE_DOC_FUNCTION:
1864 valu = dn_bufp->ddocfunc.hiaddr + ANOFFSET (objfile->section_offsets,
1865 SECT_OFF_TEXT (objfile));
1866 if (valu > texthigh)
1867 texthigh = valu;
1868 valu = dn_bufp->ddocfunc.lowaddr +
1869 ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
1870 SET_NAMESTRING (dn_bufp, &namestring, objfile);
1871 if (dn_bufp->ddocfunc.global)
1872 add_psymbol_to_list (namestring, strlen (namestring),
1873 VAR_NAMESPACE, LOC_BLOCK,
1874 &objfile->global_psymbols, valu,
1875 0, language_unknown, objfile);
1876 else
1877 add_psymbol_to_list (namestring, strlen (namestring),
1878 VAR_NAMESPACE, LOC_BLOCK,
1879 &objfile->static_psymbols, valu,
1880 0, language_unknown, objfile);
1881 within_function = 1;
1882 continue;
1883
1884 case DNTT_TYPE_BEGIN:
1885 case DNTT_TYPE_END:
1886 /* We don't check MODULE end here, because there can be
1887 symbols beyond the module end which properly belong to the
1888 current psymtab -- so we wait till the next MODULE start */
1889
1890
1891 #ifdef QUICK_LOOK_UP
1892 if (scan_start == hp_symnum
1893 && symcount == hp_symnum + 1)
1894 {
1895 /* If there are NO globals in an executable,
1896 PXDB's index to the globals will point to
1897 the last record in the file, which is
1898 probably an END MODULE, i.e. this record.
1899 ignore it and be done! */
1900 continue;
1901 }
1902 #endif /* QUICK_LOOK_UP */
1903
1904 /* Scope block begin/end. We only care about function
1905 and file blocks right now. */
1906
1907 if ((dn_bufp->dend.endkind == DNTT_TYPE_FUNCTION) ||
1908 (dn_bufp->dend.endkind == DNTT_TYPE_DOC_FUNCTION))
1909 within_function = 0;
1910 continue;
1911
1912 case DNTT_TYPE_SVAR:
1913 case DNTT_TYPE_DVAR:
1914 case DNTT_TYPE_TYPEDEF:
1915 case DNTT_TYPE_TAGDEF:
1916 {
1917 /* Variables, typedefs an the like. */
1918 enum address_class storage;
1919 namespace_enum namespace;
1920
1921 /* Don't add locals to the partial symbol table. */
1922 if (within_function
1923 && (dn_bufp->dblock.kind == DNTT_TYPE_SVAR
1924 || dn_bufp->dblock.kind == DNTT_TYPE_DVAR))
1925 continue;
1926
1927 /* TAGDEFs go into the structure namespace. */
1928 if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF)
1929 namespace = STRUCT_NAMESPACE;
1930 else
1931 namespace = VAR_NAMESPACE;
1932
1933 /* What kind of "storage" does this use? */
1934 if (dn_bufp->dblock.kind == DNTT_TYPE_SVAR)
1935 storage = LOC_STATIC;
1936 else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR
1937 && dn_bufp->ddvar.regvar)
1938 storage = LOC_REGISTER;
1939 else if (dn_bufp->dblock.kind == DNTT_TYPE_DVAR)
1940 storage = LOC_LOCAL;
1941 else
1942 storage = LOC_UNDEF;
1943
1944 SET_NAMESTRING (dn_bufp, &namestring, objfile);
1945 if (!pst)
1946 {
1947 pst = hpread_start_psymtab (objfile,
1948 "globals", 0,
1949 (hp_symnum
1950 * sizeof (struct dntt_type_block)),
1951 objfile->global_psymbols.next,
1952 objfile->static_psymbols.next);
1953 }
1954
1955 /* Compute address of the data symbol */
1956 valu = dn_bufp->dsvar.location;
1957 /* Relocate in case it's in a shared library */
1958 if (storage == LOC_STATIC)
1959 valu += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
1960
1961 /* Luckily, dvar, svar, typedef, and tagdef all
1962 have their "global" bit in the same place, so it works
1963 (though it's bad programming practice) to reference
1964 "dsvar.global" even though we may be looking at
1965 any of the above four types. */
1966 if (dn_bufp->dsvar.global)
1967 {
1968 add_psymbol_to_list (namestring, strlen (namestring),
1969 namespace, storage,
1970 &objfile->global_psymbols,
1971 valu,
1972 0, language_unknown, objfile);
1973 }
1974 else
1975 {
1976 add_psymbol_to_list (namestring, strlen (namestring),
1977 namespace, storage,
1978 &objfile->static_psymbols,
1979 valu,
1980 0, language_unknown, objfile);
1981 }
1982
1983 /* For TAGDEF's, the above code added the tagname to the
1984 struct namespace. This will cause tag "t" to be found
1985 on a reference of the form "(struct t) x". But for
1986 C++ classes, "t" will also be a typename, which we
1987 want to find on a reference of the form "ptype t".
1988 Therefore, we also add "t" to the var namespace.
1989 Do the same for enum's due to the way aCC generates
1990 debug info for these (see more extended comment
1991 in hp-symtab-read.c).
1992 We do the same for templates, so that "ptype t"
1993 where "t" is a template also works. */
1994 if (dn_bufp->dblock.kind == DNTT_TYPE_TAGDEF &&
1995 dn_bufp->dtype.type.dnttp.index < LNTT_SYMCOUNT (objfile))
1996 {
1997 int global = dn_bufp->dtag.global;
1998 /* Look ahead to see if it's a C++ class */
1999 dn_bufp = hpread_get_lntt (dn_bufp->dtype.type.dnttp.index, objfile);
2000 if (dn_bufp->dblock.kind == DNTT_TYPE_CLASS ||
2001 dn_bufp->dblock.kind == DNTT_TYPE_ENUM ||
2002 dn_bufp->dblock.kind == DNTT_TYPE_TEMPLATE)
2003 {
2004 if (global)
2005 {
2006 add_psymbol_to_list (namestring, strlen (namestring),
2007 VAR_NAMESPACE, storage,
2008 &objfile->global_psymbols,
2009 dn_bufp->dsvar.location,
2010 0, language_unknown, objfile);
2011 }
2012 else
2013 {
2014 add_psymbol_to_list (namestring, strlen (namestring),
2015 VAR_NAMESPACE, storage,
2016 &objfile->static_psymbols,
2017 dn_bufp->dsvar.location,
2018 0, language_unknown, objfile);
2019 }
2020 }
2021 }
2022 }
2023 continue;
2024
2025 case DNTT_TYPE_MEMENUM:
2026 case DNTT_TYPE_CONST:
2027 /* Constants and members of enumerated types. */
2028 SET_NAMESTRING (dn_bufp, &namestring, objfile);
2029 if (!pst)
2030 {
2031 pst = hpread_start_psymtab (objfile,
2032 "globals", 0,
2033 (hp_symnum
2034 * sizeof (struct dntt_type_block)),
2035 objfile->global_psymbols.next,
2036 objfile->static_psymbols.next);
2037 }
2038 if (dn_bufp->dconst.global)
2039 add_psymbol_to_list (namestring, strlen (namestring),
2040 VAR_NAMESPACE, LOC_CONST,
2041 &objfile->global_psymbols, 0,
2042 0, language_unknown, objfile);
2043 else
2044 add_psymbol_to_list (namestring, strlen (namestring),
2045 VAR_NAMESPACE, LOC_CONST,
2046 &objfile->static_psymbols, 0,
2047 0, language_unknown, objfile);
2048 continue;
2049 default:
2050 continue;
2051 }
2052 }
2053 }
2054
2055 /* End any pending partial symbol table. */
2056 if (pst)
2057 {
2058 hpread_end_psymtab (pst, psymtab_include_list, includes_used,
2059 hp_symnum * sizeof (struct dntt_type_block),
2060 0, dependency_list, dependencies_used);
2061 }
2062
2063 discard_cleanups (old_chain);
2064 }
2065
2066 /* Perform any local cleanups required when we are done with a particular
2067 objfile. I.E, we are in the process of discarding all symbol information
2068 for an objfile, freeing up all memory held for it, and unlinking the
2069 objfile struct from the global list of known objfiles. */
2070
2071 void
2072 hpread_symfile_finish (struct objfile *objfile)
2073 {
2074 if (objfile->sym_private != NULL)
2075 {
2076 mfree (objfile->md, objfile->sym_private);
2077 }
2078 }
2079 \f
2080
2081 /* The remaining functions are all for internal use only. */
2082
2083 /* Various small functions to get entries in the debug symbol sections. */
2084
2085 union dnttentry *
2086 hpread_get_lntt (int index, struct objfile *objfile)
2087 {
2088 return (union dnttentry *)
2089 &(LNTT (objfile)[(index * sizeof (struct dntt_type_block))]);
2090 }
2091
2092 static union dnttentry *
2093 hpread_get_gntt (int index, struct objfile *objfile)
2094 {
2095 return (union dnttentry *)
2096 &(GNTT (objfile)[(index * sizeof (struct dntt_type_block))]);
2097 }
2098
2099 union sltentry *
2100 hpread_get_slt (int index, struct objfile *objfile)
2101 {
2102 return (union sltentry *) &(SLT (objfile)[index * sizeof (union sltentry)]);
2103 }
2104
2105 /* Get the low address associated with some symbol (typically the start
2106 of a particular source file or module). Since that information is not
2107 stored as part of the DNTT_TYPE_MODULE or DNTT_TYPE_SRCFILE symbol we must infer it from
2108 the existance of DNTT_TYPE_FUNCTION symbols. */
2109
2110 static unsigned long
2111 hpread_get_textlow (int global, int index, struct objfile *objfile,
2112 int symcount)
2113 {
2114 union dnttentry *dn_bufp;
2115 struct minimal_symbol *msymbol;
2116
2117 /* Look for a DNTT_TYPE_FUNCTION symbol. */
2118 if (index < symcount) /* symcount is the number of symbols in */
2119 { /* the dbinfo, LNTT table */
2120 do
2121 {
2122 if (global)
2123 dn_bufp = hpread_get_gntt (index++, objfile);
2124 else
2125 dn_bufp = hpread_get_lntt (index++, objfile);
2126 }
2127 while (dn_bufp->dblock.kind != DNTT_TYPE_FUNCTION
2128 && dn_bufp->dblock.kind != DNTT_TYPE_DOC_FUNCTION
2129 && dn_bufp->dblock.kind != DNTT_TYPE_END
2130 && index < symcount);
2131 }
2132
2133 /* Avoid going past a DNTT_TYPE_END when looking for a DNTT_TYPE_FUNCTION. This
2134 might happen when a sourcefile has no functions. */
2135 if (dn_bufp->dblock.kind == DNTT_TYPE_END)
2136 return 0;
2137
2138 /* Avoid going past the end of the LNTT file */
2139 if (index == symcount)
2140 return 0;
2141
2142 /* The minimal symbols are typically more accurate for some reason. */
2143 if (dn_bufp->dblock.kind == DNTT_TYPE_FUNCTION)
2144 msymbol = lookup_minimal_symbol (dn_bufp->dfunc.name + VT (objfile), NULL,
2145 objfile);
2146 else /* must be a DNTT_TYPE_DOC_FUNCTION */
2147 msymbol = lookup_minimal_symbol (dn_bufp->ddocfunc.name + VT (objfile), NULL,
2148 objfile);
2149
2150 if (msymbol)
2151 return SYMBOL_VALUE_ADDRESS (msymbol);
2152 else
2153 return dn_bufp->dfunc.lowaddr;
2154 }
2155
2156 /* Allocate and partially fill a partial symtab. It will be
2157 completely filled at the end of the symbol list.
2158
2159 SYMFILE_NAME is the name of the symbol-file we are reading from, and ADDR
2160 is the address relative to which its symbols are (incremental) or 0
2161 (normal). */
2162
2163 static struct partial_symtab *
2164 hpread_start_psymtab (struct objfile *objfile, char *filename,
2165 CORE_ADDR textlow, int ldsymoff,
2166 struct partial_symbol **global_syms,
2167 struct partial_symbol **static_syms)
2168 {
2169 int offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
2170 extern void hpread_psymtab_to_symtab ();
2171 struct partial_symtab *result =
2172 start_psymtab_common (objfile, objfile->section_offsets,
2173 filename, textlow, global_syms, static_syms);
2174
2175 result->textlow += offset;
2176 result->read_symtab_private = (char *)
2177 obstack_alloc (&objfile->psymbol_obstack, sizeof (struct symloc));
2178 LDSYMOFF (result) = ldsymoff;
2179 result->read_symtab = hpread_psymtab_to_symtab;
2180
2181 return result;
2182 }
2183 \f
2184
2185 /* Close off the current usage of PST.
2186 Returns PST or NULL if the partial symtab was empty and thrown away.
2187
2188 capping_symbol_offset --Byte index in LNTT or GNTT of the
2189 last symbol processed during the build
2190 of the previous pst.
2191
2192 FIXME: List variables and peculiarities of same. */
2193
2194 static struct partial_symtab *
2195 hpread_end_psymtab (struct partial_symtab *pst, char **include_list,
2196 int num_includes, int capping_symbol_offset,
2197 CORE_ADDR capping_text,
2198 struct partial_symtab **dependency_list,
2199 int number_dependencies)
2200 {
2201 int i;
2202 struct objfile *objfile = pst->objfile;
2203 int offset = ANOFFSET (pst->section_offsets, SECT_OFF_TEXT (objfile));
2204
2205 #ifdef DUMPING
2206 /* Turn on to see what kind of a psymtab we've built. */
2207 static int dumping = 0;
2208 #endif
2209
2210 if (capping_symbol_offset != -1)
2211 LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
2212 else
2213 LDSYMLEN (pst) = 0;
2214 pst->texthigh = capping_text + offset;
2215
2216 pst->n_global_syms =
2217 objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
2218 pst->n_static_syms =
2219 objfile->static_psymbols.next - (objfile->static_psymbols.list + pst->statics_offset);
2220
2221 #ifdef DUMPING
2222 if (dumping)
2223 {
2224 printf ("\nPst %s, LDSYMOFF %x (%x), LDSYMLEN %x (%x), globals %d, statics %d\n",
2225 pst->filename,
2226 LDSYMOFF (pst),
2227 LDSYMOFF (pst) / sizeof (struct dntt_type_block),
2228 LDSYMLEN (pst),
2229 LDSYMLEN (pst) / sizeof (struct dntt_type_block),
2230 pst->n_global_syms, pst->n_static_syms);
2231 }
2232 #endif
2233
2234 pst->number_of_dependencies = number_dependencies;
2235 if (number_dependencies)
2236 {
2237 pst->dependencies = (struct partial_symtab **)
2238 obstack_alloc (&objfile->psymbol_obstack,
2239 number_dependencies * sizeof (struct partial_symtab *));
2240 memcpy (pst->dependencies, dependency_list,
2241 number_dependencies * sizeof (struct partial_symtab *));
2242 }
2243 else
2244 pst->dependencies = 0;
2245
2246 for (i = 0; i < num_includes; i++)
2247 {
2248 struct partial_symtab *subpst =
2249 allocate_psymtab (include_list[i], objfile);
2250
2251 subpst->section_offsets = pst->section_offsets;
2252 subpst->read_symtab_private =
2253 (char *) obstack_alloc (&objfile->psymbol_obstack,
2254 sizeof (struct symloc));
2255 LDSYMOFF (subpst) =
2256 LDSYMLEN (subpst) =
2257 subpst->textlow =
2258 subpst->texthigh = 0;
2259
2260 /* We could save slight bits of space by only making one of these,
2261 shared by the entire set of include files. FIXME-someday. */
2262 subpst->dependencies = (struct partial_symtab **)
2263 obstack_alloc (&objfile->psymbol_obstack,
2264 sizeof (struct partial_symtab *));
2265 subpst->dependencies[0] = pst;
2266 subpst->number_of_dependencies = 1;
2267
2268 subpst->globals_offset =
2269 subpst->n_global_syms =
2270 subpst->statics_offset =
2271 subpst->n_static_syms = 0;
2272
2273 subpst->readin = 0;
2274 subpst->symtab = 0;
2275 subpst->read_symtab = pst->read_symtab;
2276 }
2277
2278 sort_pst_symbols (pst);
2279
2280 /* If there is already a psymtab or symtab for a file of this name, remove it.
2281 (If there is a symtab, more drastic things also happen.)
2282 This happens in VxWorks. */
2283 free_named_symtabs (pst->filename);
2284
2285 if (num_includes == 0
2286 && number_dependencies == 0
2287 && pst->n_global_syms == 0
2288 && pst->n_static_syms == 0)
2289 {
2290 /* Throw away this psymtab, it's empty. We can't deallocate it, since
2291 it is on the obstack, but we can forget to chain it on the list.
2292 Empty psymtabs happen as a result of header files which don't have
2293 any symbols in them. There can be a lot of them. But this check
2294 is wrong, in that a psymtab with N_SLINE entries but nothing else
2295 is not empty, but we don't realize that. Fixing that without slowing
2296 things down might be tricky.
2297 It's also wrong if we're using the quick look-up tables, as
2298 we can get empty psymtabs from modules with no routines in
2299 them. */
2300
2301 discard_psymtab (pst);
2302
2303 /* Indicate that psymtab was thrown away. */
2304 pst = (struct partial_symtab *) NULL;
2305
2306 }
2307 return pst;
2308 }
2309
2310
2311 /* End of hp-psymtab-read.c */
2312
2313 /* Set indentation to 4 spaces for Emacs; this file is
2314 mostly non-GNU-ish in its style :-( */
2315 #if 0
2316 ***Local Variables:
2317 ***c - basic - offset:4
2318 *** End:
2319 #endif
This page took 0.08135 seconds and 4 git commands to generate.