* objfiles.h, infcmd.c, symfile.c: Add comments about how various
[deliverable/binutils-gdb.git] / gdb / paread.c
CommitLineData
684a832f
SG
1/* Read HP PA/Risc object files for GDB.
2 Copyright 1991, 1992 Free Software Foundation, Inc.
3 Written by Fred Fish at Cygnus Support.
4
5This file is part of GDB.
6
7This program is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
11
12This program is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with this program; if not, write to the Free Software
19Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20
684a832f
SG
21#include "defs.h"
22#include "bfd.h"
1225fcbd 23#include <time.h> /* For time_t in libbfd.h. */
ddf5d7e8 24#include <sys/types.h> /* For time_t, if not in time.h. */
684a832f 25#include "libbfd.h"
61a29659 26#include "som.h"
003ccb90 27#include "libhppa.h"
684a832f
SG
28#include <syms.h>
29#include "symtab.h"
30#include "symfile.h"
31#include "objfiles.h"
32#include "buildsym.h"
2731625a 33#include "stabsread.h"
684a832f
SG
34#include "gdb-stabs.h"
35#include "complaints.h"
36#include <string.h>
37#include "demangle.h"
38#include <sys/file.h>
1225fcbd
JK
39
40/* Size of n_value and n_strx fields in a stab symbol. */
41#define BYTES_IN_WORD 4
42
0213d96f 43#include "aout/aout64.h"
684a832f
SG
44
45/* Various things we might complain about... */
46
47static void
48pa_symfile_init PARAMS ((struct objfile *));
49
50static void
51pa_new_init PARAMS ((struct objfile *));
52
fa9265e5
SG
53static void
54read_unwind_info PARAMS ((struct objfile *));
55
684a832f
SG
56static void
57pa_symfile_read PARAMS ((struct objfile *, struct section_offsets *, int));
58
59static void
60pa_symfile_finish PARAMS ((struct objfile *));
61
62static void
63pa_symtab_read PARAMS ((bfd *, CORE_ADDR, struct objfile *));
64
65static void
66free_painfo PARAMS ((PTR));
67
68static struct section_offsets *
69pa_symfile_offsets PARAMS ((struct objfile *, CORE_ADDR));
70
71static void
72record_minimal_symbol PARAMS ((char *, CORE_ADDR,
73 enum minimal_symbol_type,
74 struct objfile *));
75
76static void
77record_minimal_symbol (name, address, ms_type, objfile)
78 char *name;
79 CORE_ADDR address;
80 enum minimal_symbol_type ms_type;
81 struct objfile *objfile;
82{
83 name = obsavestring (name, strlen (name), &objfile -> symbol_obstack);
84 prim_record_minimal_symbol (name, address, ms_type);
85}
86
87/*
88
89LOCAL FUNCTION
90
91 pa_symtab_read -- read the symbol table of a PA file
92
93SYNOPSIS
94
95 void pa_symtab_read (bfd *abfd, CORE_ADDR addr,
96 struct objfile *objfile)
97
98DESCRIPTION
99
100 Given an open bfd, a base address to relocate symbols to, and a
101 flag that specifies whether or not this bfd is for an executable
102 or not (may be shared library for example), add all the global
103 function and data symbols to the minimal symbol table.
104*/
105
106static void
107pa_symtab_read (abfd, addr, objfile)
108 bfd *abfd;
109 CORE_ADDR addr;
110 struct objfile *objfile;
111{
112 unsigned int number_of_symbols;
113 unsigned int i;
114 int val;
115 char *stringtab;
3cde1ffa
JK
116 struct symbol_dictionary_record *buf, *bufp, *endbufp;
117 char *symname;
0213d96f 118 CONST int symsize = sizeof (struct symbol_dictionary_record);
684a832f 119
0213d96f 120 number_of_symbols = bfd_get_symcount (abfd);
684a832f 121
0213d96f 122 buf = alloca (symsize * number_of_symbols);
003ccb90 123 bfd_seek (abfd, obj_som_sym_filepos (abfd), L_SET);
0213d96f
SG
124 val = bfd_read (buf, symsize * number_of_symbols, 1, abfd);
125 if (val != symsize * number_of_symbols)
684a832f
SG
126 error ("Couldn't read symbol dictionary!");
127
003ccb90
KR
128 stringtab = alloca (obj_som_stringtab_size (abfd));
129 bfd_seek (abfd, obj_som_str_filepos (abfd), L_SET);
130 val = bfd_read (stringtab, obj_som_stringtab_size (abfd), 1, abfd);
131 if (val != obj_som_stringtab_size (abfd))
684a832f 132 error ("Can't read in HP string table.");
3cde1ffa
JK
133
134 endbufp = buf + number_of_symbols;
135 for (bufp = buf; bufp < endbufp; ++bufp)
684a832f
SG
136 {
137 enum minimal_symbol_type ms_type;
138
139 QUIT;
140
3cde1ffa
JK
141 switch (bufp->symbol_scope)
142 {
143 case SS_UNIVERSAL:
144 switch (bufp->symbol_type)
145 {
146 case ST_SYM_EXT:
147 case ST_ARG_EXT:
148 continue;
149
150 case ST_CODE:
151 case ST_PRI_PROG:
152 case ST_SEC_PROG:
153 case ST_ENTRY:
154 case ST_MILLICODE:
155 symname = bufp->name.n_strx + stringtab;
156 ms_type = mst_text;
157 bufp->symbol_value &= ~0x3; /* clear out permission bits */
158 break;
159 case ST_DATA:
160 symname = bufp->name.n_strx + stringtab;
161 ms_type = mst_data;
162 break;
163 default:
164 continue;
165 }
166 break;
167
247145e6
JK
168#if 0
169 /* SS_GLOBAL and SS_LOCAL are two names for the same thing (!). */
3cde1ffa 170 case SS_GLOBAL:
247145e6 171#endif
3cde1ffa
JK
172 case SS_LOCAL:
173 switch (bufp->symbol_type)
174 {
175 case ST_SYM_EXT:
176 case ST_ARG_EXT:
177 continue;
178
179 case ST_CODE:
180 symname = bufp->name.n_strx + stringtab;
247145e6
JK
181 ms_type = mst_file_text;
182 bufp->symbol_value &= ~0x3; /* clear out permission bits */
183
184 check_strange_names:
3cde1ffa
JK
185 /* GAS leaves symbols with the prefixes "LS$", "LBB$",
186 and "LBE$" in .o files after assembling. And thus
187 they appear in the final executable. This can
188 cause problems if these special symbols have the
247145e6 189 same value as real symbols. So ignore them. Also "LC$". */
3cde1ffa 190 if (*symname == 'L'
247145e6 191 && (symname[2] == '$' || symname[3] == '$'))
3cde1ffa 192 continue;
3cde1ffa
JK
193 break;
194
195 case ST_PRI_PROG:
196 case ST_SEC_PROG:
197 case ST_ENTRY:
198 case ST_MILLICODE:
199 symname = bufp->name.n_strx + stringtab;
200 ms_type = mst_file_text;
201 bufp->symbol_value &= ~0x3; /* clear out permission bits */
202 break;
247145e6 203
3cde1ffa
JK
204 case ST_DATA:
205 symname = bufp->name.n_strx + stringtab;
206 ms_type = mst_file_data;
247145e6
JK
207 goto check_strange_names;
208
3cde1ffa
JK
209 default:
210 continue;
211 }
247145e6
JK
212 break;
213
3cde1ffa
JK
214 default:
215 continue;
216 }
684a832f 217
003ccb90 218 if (bufp->name.n_strx > obj_som_stringtab_size (abfd))
684a832f
SG
219 error ("Invalid symbol data; bad HP string table offset: %d",
220 bufp->name.n_strx);
221
3cde1ffa 222 record_minimal_symbol (symname,
684a832f
SG
223 bufp->symbol_value, ms_type,
224 objfile);
225 }
226
227 install_minimal_symbols (objfile);
228}
229
fa9265e5
SG
230/* Read in the backtrace information stored in the `$UNWIND_START$' section of
231 the object file. This info is used mainly by find_unwind_entry() to find
232 out the stack frame size and frame pointer used by procedures. We put
233 everything on the psymbol obstack in the objfile so that it automatically
234 gets freed when the objfile is destroyed. */
235
236static void
237read_unwind_info (objfile)
238 struct objfile *objfile;
239{
240 asection *unwind_sec;
241 struct obj_unwind_info *ui;
242
243 ui = obstack_alloc (&objfile->psymbol_obstack,
244 sizeof (struct obj_unwind_info));
245
246 ui->table = NULL;
247 ui->cache = NULL;
248 ui->last = -1;
249
250 unwind_sec = bfd_get_section_by_name (objfile->obfd,
251 "$UNWIND_START$");
252 if (unwind_sec)
253 {
254 int size;
255 int i, *ip;
256
257 size = bfd_section_size (objfile->obfd, unwind_sec);
258 ui->table = obstack_alloc (&objfile->psymbol_obstack, size);
259 ui->last = size / sizeof (struct unwind_table_entry) - 1;
260
261 bfd_get_section_contents (objfile->obfd, unwind_sec, ui->table,
262 0, size);
263
264 OBJ_UNWIND_INFO (objfile) = ui;
265 }
266}
267
684a832f
SG
268/* Scan and build partial symbols for a symbol file.
269 We have been initialized by a call to pa_symfile_init, which
270 currently does nothing.
271
272 SECTION_OFFSETS is a set of offsets to apply to relocate the symbols
273 in each section. This is ignored, as it isn't needed for the PA.
274
275 MAINLINE is true if we are reading the main symbol
276 table (as opposed to a shared lib or dynamically loaded file).
277
278 This function only does the minimum work necessary for letting the
279 user "name" things symbolically; it does not read the entire symtab.
280 Instead, it reads the external and static symbols and puts them in partial
281 symbol tables. When more extensive information is requested of a
282 file, the corresponding partial symbol table is mutated into a full
283 fledged symbol table by going back and reading the symbols
284 for real.
285
286 We look for sections with specific names, to tell us what debug
287 format to look for: FIXME!!!
288
289 pastab_build_psymtabs() handles STABS symbols.
290
291 Note that PA files have a "minimal" symbol table, which is vaguely
292 reminiscent of a COFF symbol table, but has only the minimal information
293 necessary for linking. We process this also, and use the information to
294 build gdb's minimal symbol table. This gives us some minimal debugging
295 capability even for files compiled without -g. */
296
297static void
298pa_symfile_read (objfile, section_offsets, mainline)
299 struct objfile *objfile;
300 struct section_offsets *section_offsets;
301 int mainline;
302{
303 bfd *abfd = objfile->obfd;
304 struct cleanup *back_to;
305 CORE_ADDR offset;
306
307 init_minimal_symbol_collection ();
308 back_to = make_cleanup (discard_minimal_symbols, 0);
309
310 make_cleanup (free_painfo, (PTR) objfile);
311
312 /* Process the normal PA symbol table first. */
313
314 /* FIXME, should take a section_offsets param, not just an offset. */
315
316 offset = ANOFFSET (section_offsets, 0);
317 pa_symtab_read (abfd, offset, objfile);
318
319 /* Now process debugging information, which is contained in
320 special PA sections. */
321
322 pastab_build_psymtabs (objfile, section_offsets, mainline);
323
fa9265e5
SG
324 read_unwind_info(objfile);
325
684a832f
SG
326 do_cleanups (back_to);
327}
328
965a5c32 329/* This cleans up the objfile's sym_stab_info pointer, and the chain of
684a832f
SG
330 stab_section_info's, that might be dangling from it. */
331
332static void
333free_painfo (objp)
334 PTR objp;
335{
336 struct objfile *objfile = (struct objfile *)objp;
337 struct dbx_symfile_info *dbxinfo = (struct dbx_symfile_info *)
965a5c32 338 objfile->sym_stab_info;
684a832f
SG
339 struct stab_section_info *ssi, *nssi;
340
341 ssi = dbxinfo->stab_section_info;
342 while (ssi)
343 {
344 nssi = ssi->next;
345 mfree (objfile->md, ssi);
346 ssi = nssi;
347 }
348
349 dbxinfo->stab_section_info = 0; /* Just say No mo info about this. */
350}
351
352/* Initialize anything that needs initializing when a completely new symbol
353 file is specified (not just adding some symbols from another file, e.g. a
354 shared library).
355
356 We reinitialize buildsym, since we may be reading stabs from a PA file. */
357
358static void
359pa_new_init (ignore)
360 struct objfile *ignore;
361{
362 stabsread_new_init ();
363 buildsym_new_init ();
364}
365
366/* Perform any local cleanups required when we are done with a particular
367 objfile. I.E, we are in the process of discarding all symbol information
368 for an objfile, freeing up all memory held for it, and unlinking the
369 objfile struct from the global list of known objfiles. */
370
371static void
372pa_symfile_finish (objfile)
373 struct objfile *objfile;
374{
965a5c32 375 if (objfile -> sym_stab_info != NULL)
684a832f 376 {
965a5c32 377 mfree (objfile -> md, objfile -> sym_stab_info);
684a832f
SG
378 }
379}
380
684a832f
SG
381/* PA specific initialization routine for reading symbols.
382
383 It is passed a pointer to a struct sym_fns which contains, among other
384 things, the BFD for the file whose symbols are being read, and a slot for
385 a pointer to "private data" which we can fill with goodies.
386
387 This routine is almost a complete ripoff of dbx_symfile_init. The
388 common parts of these routines should be extracted and used instead of
389 duplicating this code. FIXME. */
390
391static void
392pa_symfile_init (objfile)
393 struct objfile *objfile;
394{
395 int val;
396 bfd *sym_bfd = objfile->obfd;
397 char *name = bfd_get_filename (sym_bfd);
0213d96f
SG
398 asection *stabsect; /* Section containing symbol table entries */
399 asection *stringsect; /* Section containing symbol name strings */
400
401 stabsect = bfd_get_section_by_name (sym_bfd, "$GDB_SYMBOLS$");
402 stringsect = bfd_get_section_by_name (sym_bfd, "$GDB_STRINGS$");
684a832f
SG
403
404 /* Allocate struct to keep track of the symfile */
965a5c32 405 objfile->sym_stab_info = (PTR)
684a832f
SG
406 xmmalloc (objfile -> md, sizeof (struct dbx_symfile_info));
407
965a5c32 408 memset ((PTR) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info));
0213d96f
SG
409
410 if (!stabsect)
411 return;
412
413 if (!stringsect)
414 error ("Found stabs, but not string section");
415
684a832f 416 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
0213d96f
SG
417#define STRING_TABLE_OFFSET (stringsect->filepos)
418#define SYMBOL_TABLE_OFFSET (stabsect->filepos)
684a832f
SG
419
420 /* FIXME POKING INSIDE BFD DATA STRUCTURES */
421
422 DBX_SYMFILE_INFO (objfile)->stab_section_info = NULL;
423 DBX_TEXT_SECT (objfile) = bfd_get_section_by_name (sym_bfd, ".text");
424 if (!DBX_TEXT_SECT (objfile))
425 error ("Can't find .text section in symbol file");
426
1225fcbd
JK
427 /* FIXME: I suspect this should be external_nlist. The size of host
428 types like long and bfd_vma should not affect how we read the
429 file. */
0213d96f
SG
430 DBX_SYMBOL_SIZE (objfile) = sizeof (struct internal_nlist);
431 DBX_SYMCOUNT (objfile) = bfd_section_size (sym_bfd, stabsect)
432 / DBX_SYMBOL_SIZE (objfile);
684a832f
SG
433 DBX_SYMTAB_OFFSET (objfile) = SYMBOL_TABLE_OFFSET;
434
435 /* Read the string table and stash it away in the psymbol_obstack. It is
436 only needed as long as we need to expand psymbols into full symbols,
437 so when we blow away the psymbol the string table goes away as well.
438 Note that gdb used to use the results of attempting to malloc the
439 string table, based on the size it read, as a form of sanity check
440 for botched byte swapping, on the theory that a byte swapped string
441 table size would be so totally bogus that the malloc would fail. Now
442 that we put in on the psymbol_obstack, we can't do this since gdb gets
443 a fatal error (out of virtual memory) if the size is bogus. We can
444 however at least check to see if the size is zero or some negative
445 value. */
446
0213d96f 447 DBX_STRINGTAB_SIZE (objfile) = bfd_section_size (sym_bfd, stringsect);
684a832f
SG
448
449 if (DBX_SYMCOUNT (objfile) == 0
450 || DBX_STRINGTAB_SIZE (objfile) == 0)
451 return;
452
453 if (DBX_STRINGTAB_SIZE (objfile) <= 0
454 || DBX_STRINGTAB_SIZE (objfile) > bfd_get_size (sym_bfd))
455 error ("ridiculous string table size (%d bytes).",
456 DBX_STRINGTAB_SIZE (objfile));
457
458 DBX_STRINGTAB (objfile) =
459 (char *) obstack_alloc (&objfile -> psymbol_obstack,
460 DBX_STRINGTAB_SIZE (objfile));
461
462 /* Now read in the string table in one big gulp. */
463
464 val = bfd_seek (sym_bfd, STRING_TABLE_OFFSET, L_SET);
465 if (val < 0)
466 perror_with_name (name);
467 val = bfd_read (DBX_STRINGTAB (objfile), DBX_STRINGTAB_SIZE (objfile), 1,
468 sym_bfd);
93af329a
JK
469 if (val == 0)
470 error ("End of file reading string table");
471 else if (val < 0)
472 /* It's possible bfd_read should be setting bfd_error, and we should be
473 checking that. But currently it doesn't set bfd_error. */
684a832f 474 perror_with_name (name);
93af329a
JK
475 else if (val != DBX_STRINGTAB_SIZE (objfile))
476 error ("Short read reading string table");
684a832f
SG
477}
478
479/* PA specific parsing routine for section offsets.
480
481 Plain and simple for now. */
482
483static struct section_offsets *
484pa_symfile_offsets (objfile, addr)
485 struct objfile *objfile;
486 CORE_ADDR addr;
487{
488 struct section_offsets *section_offsets;
489 int i;
4d57c599
JK
490
491 objfile->num_sections = SECT_OFF_MAX;
684a832f
SG
492 section_offsets = (struct section_offsets *)
493 obstack_alloc (&objfile -> psymbol_obstack,
4d57c599
JK
494 sizeof (struct section_offsets)
495 + sizeof (section_offsets->offsets) * (SECT_OFF_MAX-1));
684a832f
SG
496
497 for (i = 0; i < SECT_OFF_MAX; i++)
498 ANOFFSET (section_offsets, i) = addr;
4d57c599 499
684a832f
SG
500 return section_offsets;
501}
502\f
4d57c599
JK
503/* Register that we are able to handle SOM object file formats (does this
504 work for hp300, or just PA? I suspect the latter). */
684a832f 505
684a832f
SG
506static struct sym_fns pa_sym_fns =
507{
003ccb90
KR
508 "som", /* sym_name: name or name prefix of BFD target type */
509 3, /* sym_namelen: number of significant sym_name chars */
684a832f
SG
510 pa_new_init, /* sym_new_init: init anything gbl to entire symtab */
511 pa_symfile_init, /* sym_init: read initial info, setup for sym_read() */
512 pa_symfile_read, /* sym_read: read a symbol file into symtab */
513 pa_symfile_finish, /* sym_finish: finished with file, cleanup */
514 pa_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */
515 NULL /* next: pointer to next struct sym_fns */
516};
517
518void
519_initialize_paread ()
520{
521 add_symtab_fns (&pa_sym_fns);
522}
This page took 0.096935 seconds and 4 git commands to generate.