Introduce MOD2 switch to segregate material on Modula-2; eventually
[deliverable/binutils-gdb.git] / gdb / buildsym.c
CommitLineData
d07734e3 1/* Support routines for building symbol tables in GDB's internal format.
93297ea0
JG
2 Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992
3 Free Software Foundation, Inc.
c0302457
JG
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
21/* This module provides subroutines used for creating and adding to
22 the symbol table. These routines are called from various symbol-
d07734e3 23 file-reading routines.
c0302457 24
d07734e3
FF
25 Routines to support specific debugging information formats (stabs,
26 DWARF, etc) belong somewhere else. */
c0302457
JG
27
28#include "defs.h"
d07734e3 29#include "bfd.h"
c0302457
JG
30#include "obstack.h"
31#include "symtab.h"
c0302457 32#include "symfile.h" /* Needed for "struct complaint" */
5e2e79f8 33#include "objfiles.h"
51b80b00 34#include "complaints.h"
c0302457 35#include <string.h>
c0302457
JG
36
37/* Ask buildsym.h to define the vars it normally declares `extern'. */
38#define EXTERN /**/
39#include "buildsym.h" /* Our own declarations */
40#undef EXTERN
41
1ab3bf1b
JG
42static int
43compare_line_numbers PARAMS ((const void *, const void *));
44
45static struct blockvector *
46make_blockvector PARAMS ((struct objfile *));
47
1ab3bf1b 48\f
4137c5fc
JG
49/* Initial sizes of data structures. These are realloc'd larger if needed,
50 and realloc'd down to the size actually used, when completed. */
51
52#define INITIAL_CONTEXT_STACK_SIZE 10
4137c5fc 53#define INITIAL_LINE_VECTOR_LENGTH 1000
d07734e3 54
c0302457
JG
55\f
56/* Complaints about the symbols we have encountered. */
57
58struct complaint innerblock_complaint =
59 {"inner block not inside outer block in %s", 0, 0};
60
76512886
JG
61struct complaint innerblock_anon_complaint =
62 {"inner block not inside outer block", 0, 0};
63
c0302457 64struct complaint blockvector_complaint =
76512886 65 {"block at 0x%x out of order", 0, 0};
c0302457 66
c0302457
JG
67\f
68/* maintain the lists of symbols and blocks */
69
70/* Add a symbol to one of the lists of symbols. */
d07734e3 71
c0302457
JG
72void
73add_symbol_to_list (symbol, listhead)
74 struct symbol *symbol;
75 struct pending **listhead;
76{
d07734e3
FF
77 register struct pending *link;
78
c0302457
JG
79 /* We keep PENDINGSIZE symbols in each link of the list.
80 If we don't have a link with room in it, add a new link. */
d07734e3 81 if (*listhead == NULL || (*listhead)->nsyms == PENDINGSIZE)
c0302457 82 {
c0302457
JG
83 if (free_pendings)
84 {
85 link = free_pendings;
86 free_pendings = link->next;
87 }
88 else
d07734e3
FF
89 {
90 link = (struct pending *) xmalloc (sizeof (struct pending));
91 }
c0302457
JG
92
93 link->next = *listhead;
94 *listhead = link;
95 link->nsyms = 0;
96 }
97
98 (*listhead)->symbol[(*listhead)->nsyms++] = symbol;
99}
100
a048c8f5 101/* Find a symbol on a pending list. */
d07734e3 102
a048c8f5
JG
103struct symbol *
104find_symbol_in_list (list, name, length)
105 struct pending *list;
106 char *name;
107 int length;
108{
109 int j;
d07734e3 110 char *pp;
a048c8f5 111
d07734e3
FF
112 while (list != NULL)
113 {
114 for (j = list->nsyms; --j >= 0; )
115 {
116 pp = SYMBOL_NAME (list->symbol[j]);
117 if (*pp == *name && strncmp (pp, name, length) == 0 &&
118 pp[length] == '\0')
119 {
120 return (list->symbol[j]);
121 }
122 }
123 list = list->next;
a048c8f5 124 }
d07734e3 125 return (NULL);
a048c8f5
JG
126}
127
c0302457 128/* At end of reading syms, or in case of quit,
d07734e3 129 really free as many `struct pending's as we can easily find. */
c0302457
JG
130
131/* ARGSUSED */
132void
133really_free_pendings (foo)
134 int foo;
135{
136 struct pending *next, *next1;
137#if 0
138 struct pending_block *bnext, *bnext1;
139#endif
140
141 for (next = free_pendings; next; next = next1)
142 {
143 next1 = next->next;
84ffdec2 144 free ((PTR)next);
c0302457 145 }
d07734e3 146 free_pendings = NULL;
c0302457
JG
147
148#if 0 /* Now we make the links in the symbol_obstack, so don't free them. */
149 for (bnext = pending_blocks; bnext; bnext = bnext1)
150 {
151 bnext1 = bnext->next;
84ffdec2 152 free ((PTR)bnext);
c0302457
JG
153 }
154#endif
d07734e3 155 pending_blocks = NULL;
c0302457 156
d07734e3 157 for (next = file_symbols; next != NULL; next = next1)
c0302457
JG
158 {
159 next1 = next->next;
84ffdec2 160 free ((PTR)next);
c0302457 161 }
d07734e3 162 file_symbols = NULL;
c0302457 163
d07734e3 164 for (next = global_symbols; next != NULL; next = next1)
c0302457
JG
165 {
166 next1 = next->next;
84ffdec2 167 free ((PTR)next);
c0302457 168 }
d07734e3 169 global_symbols = NULL;
c0302457
JG
170}
171
172/* Take one of the lists of symbols and make a block from it.
173 Keep the order the symbols have in the list (reversed from the input file).
174 Put the block on the list of pending blocks. */
175
176void
1ab3bf1b 177finish_block (symbol, listhead, old_blocks, start, end, objfile)
c0302457
JG
178 struct symbol *symbol;
179 struct pending **listhead;
180 struct pending_block *old_blocks;
181 CORE_ADDR start, end;
1ab3bf1b 182 struct objfile *objfile;
c0302457
JG
183{
184 register struct pending *next, *next1;
185 register struct block *block;
186 register struct pending_block *pblock;
187 struct pending_block *opblock;
188 register int i;
d07734e3 189 register int j;
c0302457
JG
190
191 /* Count the length of the list of symbols. */
192
cd46ffad
FF
193 for (next = *listhead, i = 0;
194 next;
195 i += next->nsyms, next = next->next)
d07734e3
FF
196 {
197 /*EMPTY*/;
198 }
c0302457 199
1ab3bf1b 200 block = (struct block *) obstack_alloc (&objfile -> symbol_obstack,
a048c8f5 201 (sizeof (struct block) + ((i - 1) * sizeof (struct symbol *))));
c0302457
JG
202
203 /* Copy the symbols into the block. */
204
205 BLOCK_NSYMS (block) = i;
206 for (next = *listhead; next; next = next->next)
207 {
c0302457 208 for (j = next->nsyms - 1; j >= 0; j--)
d07734e3
FF
209 {
210 BLOCK_SYM (block, --i) = next->symbol[j];
211 }
c0302457
JG
212 }
213
214 BLOCK_START (block) = start;
215 BLOCK_END (block) = end;
d07734e3
FF
216 /* Superblock filled in when containing block is made */
217 BLOCK_SUPERBLOCK (block) = NULL;
c0302457
JG
218 BLOCK_GCC_COMPILED (block) = processing_gcc_compilation;
219
220 /* Put the block in as the value of the symbol that names it. */
221
222 if (symbol)
223 {
224 SYMBOL_BLOCK_VALUE (symbol) = block;
225 BLOCK_FUNCTION (block) = symbol;
226 }
227 else
d07734e3
FF
228 {
229 BLOCK_FUNCTION (block) = NULL;
230 }
c0302457
JG
231
232 /* Now "free" the links of the list, and empty the list. */
233
234 for (next = *listhead; next; next = next1)
235 {
236 next1 = next->next;
237 next->next = free_pendings;
238 free_pendings = next;
239 }
d07734e3 240 *listhead = NULL;
c0302457
JG
241
242 /* Install this block as the superblock
243 of all blocks made since the start of this scope
244 that don't have superblocks yet. */
245
d07734e3 246 opblock = NULL;
c0302457
JG
247 for (pblock = pending_blocks; pblock != old_blocks; pblock = pblock->next)
248 {
d07734e3
FF
249 if (BLOCK_SUPERBLOCK (pblock->block) == NULL)
250 {
c0302457 251#if 1
d07734e3
FF
252 /* Check to be sure the blocks are nested as we receive them.
253 If the compiler/assembler/linker work, this just burns a small
254 amount of time. */
255 if (BLOCK_START (pblock->block) < BLOCK_START (block) ||
256 BLOCK_END (pblock->block) > BLOCK_END (block))
257 {
258 if (symbol)
259 {
2e4964ad
FF
260 complain (&innerblock_complaint,
261 SYMBOL_SOURCE_NAME (symbol));
d07734e3
FF
262 }
263 else
264 {
51b80b00 265 complain (&innerblock_anon_complaint);
d07734e3
FF
266 }
267 BLOCK_START (pblock->block) = BLOCK_START (block);
268 BLOCK_END (pblock->block) = BLOCK_END (block);
269 }
c0302457 270#endif
d07734e3
FF
271 BLOCK_SUPERBLOCK (pblock->block) = block;
272 }
c0302457
JG
273 opblock = pblock;
274 }
275
276 /* Record this block on the list of all blocks in the file.
277 Put it after opblock, or at the beginning if opblock is 0.
278 This puts the block in the list after all its subblocks. */
279
280 /* Allocate in the symbol_obstack to save time.
281 It wastes a little space. */
282 pblock = (struct pending_block *)
1ab3bf1b 283 obstack_alloc (&objfile -> symbol_obstack,
c0302457
JG
284 sizeof (struct pending_block));
285 pblock->block = block;
286 if (opblock)
287 {
288 pblock->next = opblock->next;
289 opblock->next = pblock;
290 }
291 else
292 {
293 pblock->next = pending_blocks;
294 pending_blocks = pblock;
295 }
296}
297
1ab3bf1b
JG
298static struct blockvector *
299make_blockvector (objfile)
300 struct objfile *objfile;
c0302457
JG
301{
302 register struct pending_block *next;
303 register struct blockvector *blockvector;
304 register int i;
305
306 /* Count the length of the list of blocks. */
307
d07734e3 308 for (next = pending_blocks, i = 0; next; next = next->next, i++) {;}
c0302457
JG
309
310 blockvector = (struct blockvector *)
1ab3bf1b 311 obstack_alloc (&objfile -> symbol_obstack,
c0302457
JG
312 (sizeof (struct blockvector)
313 + (i - 1) * sizeof (struct block *)));
314
315 /* Copy the blocks into the blockvector.
316 This is done in reverse order, which happens to put
317 the blocks into the proper order (ascending starting address).
318 finish_block has hair to insert each block into the list
319 after its subblocks in order to make sure this is true. */
320
321 BLOCKVECTOR_NBLOCKS (blockvector) = i;
d07734e3
FF
322 for (next = pending_blocks; next; next = next->next)
323 {
324 BLOCKVECTOR_BLOCK (blockvector, --i) = next->block;
325 }
c0302457
JG
326
327#if 0 /* Now we make the links in the obstack, so don't free them. */
328 /* Now free the links of the list, and empty the list. */
329
330 for (next = pending_blocks; next; next = next1)
331 {
332 next1 = next->next;
333 free (next);
334 }
335#endif
d07734e3 336 pending_blocks = NULL;
c0302457
JG
337
338#if 1 /* FIXME, shut this off after a while to speed up symbol reading. */
339 /* Some compilers output blocks in the wrong order, but we depend
340 on their being in the right order so we can binary search.
341 Check the order and moan about it. FIXME. */
342 if (BLOCKVECTOR_NBLOCKS (blockvector) > 1)
d07734e3
FF
343 {
344 for (i = 1; i < BLOCKVECTOR_NBLOCKS (blockvector); i++)
345 {
346 if (BLOCK_START(BLOCKVECTOR_BLOCK (blockvector, i-1))
347 > BLOCK_START(BLOCKVECTOR_BLOCK (blockvector, i)))
348 {
349 complain (&blockvector_complaint,
51b80b00 350 BLOCK_START(BLOCKVECTOR_BLOCK (blockvector, i)));
d07734e3
FF
351 }
352 }
c0302457
JG
353 }
354#endif
355
d07734e3 356 return (blockvector);
c0302457 357}
d07734e3 358
c0302457 359\f
4137c5fc
JG
360/* Start recording information about source code that came from an included
361 (or otherwise merged-in) source file with a different name. */
c0302457
JG
362
363void
4137c5fc
JG
364start_subfile (name, dirname)
365 char *name;
366 char *dirname;
367{
368 register struct subfile *subfile;
369
370 /* See if this subfile is already known as a subfile of the
371 current main source file. */
372
373 for (subfile = subfiles; subfile; subfile = subfile->next)
374 {
2e4964ad 375 if (STREQ (subfile->name, name))
4137c5fc
JG
376 {
377 current_subfile = subfile;
378 return;
379 }
380 }
381
382 /* This subfile is not known. Add an entry for it.
383 Make an entry for this subfile in the list of all subfiles
384 of the current main source file. */
385
386 subfile = (struct subfile *) xmalloc (sizeof (struct subfile));
387 subfile->next = subfiles;
388 subfiles = subfile;
389 current_subfile = subfile;
390
391 /* Save its name and compilation directory name */
7c622b41 392 subfile->name = (name == NULL)? NULL : strdup (name);
3416d90b 393 subfile->dirname = (dirname == NULL) ? NULL : strdup (dirname);
4137c5fc
JG
394
395 /* Initialize line-number recording for this subfile. */
d07734e3 396 subfile->line_vector = NULL;
2e4964ad
FF
397
398 /* Default the source language to whatever can be deduced from
399 the filename. If nothing can be deduced (such as for a C/C++
400 include file with a ".h" extension), then inherit whatever
401 language the previous subfile had. This kludgery is necessary
402 because there is no standard way in some object formats to
403 record the source language. Also, when symtabs are allocated
404 we try to deduce a language then as well, but it is too late
405 for us to use that information while reading symbols, since
406 symtabs aren't allocated until after all the symbols have
407 been processed for a given source file. */
408
409 subfile->language = deduce_language_from_filename (subfile->name);
410 if (subfile->language == language_unknown &&
411 subfile->next != NULL)
412 {
413 subfile->language = subfile->next->language;
414 }
4137c5fc 415}
d07734e3 416
3416d90b
FF
417/* For stabs readers, the first N_SO symbol is assumed to be the source
418 file name, and the subfile struct is initialized using that assumption.
419 If another N_SO symbol is later seen, immediately following the first
420 one, then the first one is assumed to be the directory name and the
421 second one is really the source file name.
422
423 So we have to patch up the subfile struct by moving the old name value to
424 dirname and remembering the new name. Some sanity checking is performed
425 to ensure that the state of the subfile struct is reasonable and that the
426 old name we are assuming to be a directory name actually is (by checking
427 for a trailing '/'). */
428
429void
430patch_subfile_names (subfile, name)
431 struct subfile *subfile;
432 char *name;
433{
434 if (subfile != NULL && subfile->dirname == NULL && subfile->name != NULL
435 && subfile->name[strlen(subfile->name)-1] == '/')
436 {
437 subfile->dirname = subfile->name;
438 subfile->name = strdup (name);
2e4964ad
FF
439
440 /* Default the source language to whatever can be deduced from
441 the filename. If nothing can be deduced (such as for a C/C++
442 include file with a ".h" extension), then inherit whatever
443 language the previous subfile had. This kludgery is necessary
444 because there is no standard way in some object formats to
445 record the source language. Also, when symtabs are allocated
446 we try to deduce a language then as well, but it is too late
447 for us to use that information while reading symbols, since
448 symtabs aren't allocated until after all the symbols have
449 been processed for a given source file. */
450
451 subfile->language = deduce_language_from_filename (subfile->name);
452 if (subfile->language == language_unknown &&
453 subfile->next != NULL)
454 {
455 subfile->language = subfile->next->language;
456 }
3416d90b
FF
457 }
458}
459
4137c5fc 460\f
a048c8f5
JG
461/* Handle the N_BINCL and N_EINCL symbol types
462 that act like N_SOL for switching source files
463 (different subfiles, as we call them) within one object file,
464 but using a stack rather than in an arbitrary order. */
465
466void
467push_subfile ()
468{
469 register struct subfile_stack *tem
470 = (struct subfile_stack *) xmalloc (sizeof (struct subfile_stack));
471
472 tem->next = subfile_stack;
473 subfile_stack = tem;
d07734e3
FF
474 if (current_subfile == NULL || current_subfile->name == NULL)
475 {
476 abort ();
477 }
a048c8f5 478 tem->name = current_subfile->name;
a048c8f5
JG
479}
480
481char *
482pop_subfile ()
483{
484 register char *name;
485 register struct subfile_stack *link = subfile_stack;
486
d07734e3
FF
487 if (link == NULL)
488 {
489 abort ();
490 }
a048c8f5
JG
491 name = link->name;
492 subfile_stack = link->next;
84ffdec2 493 free ((PTR)link);
d07734e3 494 return (name);
a048c8f5 495}
d07734e3 496
a048c8f5 497\f
4137c5fc
JG
498/* Manage the vector of line numbers for each subfile. */
499
500void
501record_line (subfile, line, pc)
502 register struct subfile *subfile;
c0302457
JG
503 int line;
504 CORE_ADDR pc;
505{
506 struct linetable_entry *e;
507 /* Ignore the dummy line number in libg.o */
508
509 if (line == 0xffff)
d07734e3
FF
510 {
511 return;
512 }
c0302457 513
4137c5fc 514 /* Make sure line vector exists and is big enough. */
d07734e3
FF
515 if (!subfile->line_vector)
516 {
517 subfile->line_vector_length = INITIAL_LINE_VECTOR_LENGTH;
518 subfile->line_vector = (struct linetable *)
4137c5fc
JG
519 xmalloc (sizeof (struct linetable)
520 + subfile->line_vector_length * sizeof (struct linetable_entry));
d07734e3
FF
521 subfile->line_vector->nitems = 0;
522 }
c0302457 523
4137c5fc 524 if (subfile->line_vector->nitems + 1 >= subfile->line_vector_length)
c0302457 525 {
4137c5fc
JG
526 subfile->line_vector_length *= 2;
527 subfile->line_vector = (struct linetable *)
1ab3bf1b 528 xrealloc ((char *) subfile->line_vector, (sizeof (struct linetable)
d07734e3 529 + subfile->line_vector_length * sizeof (struct linetable_entry)));
c0302457
JG
530 }
531
4137c5fc 532 e = subfile->line_vector->item + subfile->line_vector->nitems++;
c0302457
JG
533 e->line = line; e->pc = pc;
534}
4137c5fc
JG
535
536
537/* Needed in order to sort line tables from IBM xcoff files. Sigh! */
538
1ab3bf1b
JG
539static int
540compare_line_numbers (ln1p, ln2p)
541 const PTR ln1p;
542 const PTR ln2p;
4137c5fc 543{
1ab3bf1b
JG
544 return (((struct linetable_entry *) ln1p) -> line -
545 ((struct linetable_entry *) ln2p) -> line);
4137c5fc 546}
1ab3bf1b 547
c0302457
JG
548\f
549/* Start a new symtab for a new source file.
d07734e3
FF
550 Called, for example, when a stabs symbol of type N_SO is seen, or when
551 a DWARF TAG_compile_unit DIE is seen.
552 It indicates the start of data for one original source file. */
c0302457
JG
553
554void
555start_symtab (name, dirname, start_addr)
556 char *name;
557 char *dirname;
558 CORE_ADDR start_addr;
559{
560
561 last_source_file = name;
562 last_source_start_addr = start_addr;
d07734e3
FF
563 file_symbols = NULL;
564 global_symbols = NULL;
c0302457
JG
565 within_function = 0;
566
a048c8f5
JG
567 /* Context stack is initially empty. Allocate first one with room for
568 10 levels; reuse it forever afterward. */
d07734e3
FF
569 if (context_stack == NULL)
570 {
571 context_stack_size = INITIAL_CONTEXT_STACK_SIZE;
572 context_stack = (struct context_stack *)
573 xmalloc (context_stack_size * sizeof (struct context_stack));
574 }
c0302457
JG
575 context_stack_depth = 0;
576
c0302457
JG
577 /* Initialize the list of sub source files with one entry
578 for this file (the top-level source file). */
579
d07734e3
FF
580 subfiles = NULL;
581 current_subfile = NULL;
c0302457
JG
582 start_subfile (name, dirname);
583}
584
585/* Finish the symbol definitions for one main source file,
586 close off all the lexical contexts for that file
587 (creating struct block's for them), then make the struct symtab
588 for that file and put it in the list of all such.
589
7b5d9650 590 END_ADDR is the address of the end of the file's text.
3c02636b
JK
591 SECTION is the section number (in objfile->section_offsets) of
592 the blockvector and linetable.
7b5d9650
FF
593
594 Note that it is possible for end_symtab() to return NULL. In particular,
595 for the DWARF case at least, it will return NULL when it finds a
596 compilation unit that has exactly one DIE, a TAG_compile_unit DIE. This
597 can happen when we link in an object file that was compiled from an empty
598 source file. Returning NULL is probably not the correct thing to do,
599 because then gdb will never know about this empty file (FIXME). */
c0302457
JG
600
601struct symtab *
3c02636b 602end_symtab (end_addr, sort_pending, sort_linevec, objfile, section)
c0302457 603 CORE_ADDR end_addr;
4137c5fc
JG
604 int sort_pending;
605 int sort_linevec;
a048c8f5 606 struct objfile *objfile;
3c02636b 607 int section;
c0302457
JG
608{
609 register struct symtab *symtab;
610 register struct blockvector *blockvector;
611 register struct subfile *subfile;
d07734e3 612 register struct context_stack *cstk;
c0302457
JG
613 struct subfile *nextsub;
614
615 /* Finish the lexical context of the last function in the file;
616 pop the context stack. */
617
618 if (context_stack_depth > 0)
619 {
c0302457
JG
620 context_stack_depth--;
621 cstk = &context_stack[context_stack_depth];
622 /* Make a block for the local symbols within. */
623 finish_block (cstk->name, &local_symbols, cstk->old_blocks,
1ab3bf1b 624 cstk->start_addr, end_addr, objfile);
a048c8f5 625
d07734e3
FF
626 /* Debug: if context stack still has something in it,
627 we are in trouble. */
a048c8f5 628 if (context_stack_depth > 0)
d07734e3
FF
629 {
630 abort ();
631 }
c0302457
JG
632 }
633
9b280a7f 634 /* It is unfortunate that in xcoff, pending blocks might not be ordered
4137c5fc
JG
635 in this stage. Especially, blocks for static functions will show up at
636 the end. We need to sort them, so tools like `find_pc_function' and
637 `find_pc_block' can work reliably. */
d07734e3
FF
638
639 if (sort_pending && pending_blocks)
640 {
641 /* FIXME! Remove this horrid bubble sort and use qsort!!! */
642 int swapped;
643 do
644 {
645 struct pending_block *pb, *pbnext;
646
647 pb = pending_blocks;
648 pbnext = pb->next;
649 swapped = 0;
650
651 while (pbnext)
652 {
653 /* swap blocks if unordered! */
654
655 if (BLOCK_START(pb->block) < BLOCK_START(pbnext->block))
656 {
657 struct block *tmp = pb->block;
658 pb->block = pbnext->block;
659 pbnext->block = tmp;
660 swapped = 1;
661 }
662 pb = pbnext;
663 pbnext = pbnext->next;
664 }
665 } while (swapped);
666 }
4137c5fc 667
c0302457
JG
668 /* Cleanup any undefined types that have been left hanging around
669 (this needs to be done before the finish_blocks so that
d07734e3
FF
670 file_symbols is still good).
671 FIXME: Stabs specific. */
c0302457 672 cleanup_undefined_types ();
d07734e3 673 finish_global_stabs (objfile);
c0302457 674
d07734e3
FF
675 if (pending_blocks == NULL
676 && file_symbols == NULL
677 && global_symbols == NULL)
678 {
679 /* Ignore symtabs that have no functions with real debugging info */
680 blockvector = NULL;
681 }
682 else
683 {
684 /* Define the STATIC_BLOCK & GLOBAL_BLOCK, and build the blockvector. */
685 finish_block (0, &file_symbols, 0, last_source_start_addr, end_addr,
686 objfile);
687 finish_block (0, &global_symbols, 0, last_source_start_addr, end_addr,
688 objfile);
689 blockvector = make_blockvector (objfile);
690 }
c0302457 691
818de002 692#ifdef PROCESS_LINENUMBER_HOOK
9b280a7f 693 PROCESS_LINENUMBER_HOOK (); /* Needed for xcoff. */
818de002
PB
694#endif
695
c0302457
JG
696 /* Now create the symtab objects proper, one for each subfile. */
697 /* (The main file is the last one on the chain.) */
698
699 for (subfile = subfiles; subfile; subfile = nextsub)
700 {
1ab3bf1b 701 int linetablesize;
a048c8f5
JG
702 /* If we have blocks of symbols, make a symtab.
703 Otherwise, just ignore this file and any line number info in it. */
d07734e3
FF
704 symtab = NULL;
705 if (blockvector)
706 {
707 if (subfile->line_vector)
708 {
709 /* First, shrink the linetable to make more memory. */
710 linetablesize = sizeof (struct linetable) +
711 subfile->line_vector->nitems * sizeof (struct linetable_entry);
712 subfile->line_vector = (struct linetable *)
713 xrealloc ((char *) subfile->line_vector, linetablesize);
714
715 if (sort_linevec)
716 qsort (subfile->line_vector->item,
717 subfile->line_vector->nitems,
718 sizeof (struct linetable_entry), compare_line_numbers);
719 }
720
721 /* Now, allocate a symbol table. */
722 symtab = allocate_symtab (subfile->name, objfile);
4137c5fc 723
d07734e3
FF
724 /* Fill in its components. */
725 symtab->blockvector = blockvector;
726 if (subfile->line_vector)
727 {
728 /* Reallocate the line table on the symbol obstack */
729 symtab->linetable = (struct linetable *)
730 obstack_alloc (&objfile -> symbol_obstack, linetablesize);
731 memcpy (symtab->linetable, subfile->line_vector, linetablesize);
732 }
733 else
734 {
735 symtab->linetable = NULL;
736 }
3c02636b 737 symtab->block_line_section = section;
8275e802
FF
738 if (subfile->dirname)
739 {
740 /* Reallocate the dirname on the symbol obstack */
741 symtab->dirname = (char *)
742 obstack_alloc (&objfile -> symbol_obstack,
743 strlen (subfile -> dirname) + 1);
744 strcpy (symtab->dirname, subfile->dirname);
745 }
746 else
747 {
748 symtab->dirname = NULL;
749 }
d07734e3
FF
750 symtab->free_code = free_linetable;
751 symtab->free_ptr = NULL;
2b5a8d9c 752
2e4964ad
FF
753 /* Use whatever language we have been using for this subfile,
754 not the one that was deduced in allocate_symtab from the
755 filename. We already did our own deducing when we created
756 the subfile, and we may have altered our opinion of what
757 language it is from things we found in the symbols. */
758 symtab->language = subfile->language;
759
3c02636b
JK
760 /* All symtabs for the main file and the subfiles share a
761 blockvector, so we need to clear primary for everything but
762 the main file. */
2b5a8d9c 763
3c02636b 764 symtab->primary = 0;
d07734e3 765 }
3416d90b
FF
766 if (subfile->name != NULL)
767 {
768 free ((PTR) subfile->name);
769 }
770 if (subfile->dirname != NULL)
771 {
772 free ((PTR) subfile->dirname);
773 }
774 if (subfile->line_vector != NULL)
d07734e3 775 {
3416d90b 776 free ((PTR) subfile->line_vector);
d07734e3 777 }
4137c5fc 778
c0302457 779 nextsub = subfile->next;
84ffdec2 780 free ((PTR)subfile);
c0302457
JG
781 }
782
3c02636b 783 /* Set this for the main source file. */
1eeba686 784 if (symtab)
d07734e3 785 {
3c02636b 786 symtab->primary = 1;
d07734e3 787 }
2b5a8d9c 788
d07734e3
FF
789 last_source_file = NULL;
790 current_subfile = NULL;
4137c5fc 791
d07734e3 792 return (symtab);
c0302457 793}
a048c8f5
JG
794
795
796/* Push a context block. Args are an identifying nesting level (checkable
797 when you pop it), and the starting PC address of this context. */
798
799struct context_stack *
800push_context (desc, valu)
801 int desc;
802 CORE_ADDR valu;
803{
804 register struct context_stack *new;
805
806 if (context_stack_depth == context_stack_size)
807 {
808 context_stack_size *= 2;
809 context_stack = (struct context_stack *)
1ab3bf1b
JG
810 xrealloc ((char *) context_stack,
811 (context_stack_size * sizeof (struct context_stack)));
a048c8f5
JG
812 }
813
814 new = &context_stack[context_stack_depth++];
815 new->depth = desc;
816 new->locals = local_symbols;
817 new->old_blocks = pending_blocks;
818 new->start_addr = valu;
d07734e3 819 new->name = NULL;
a048c8f5 820
d07734e3 821 local_symbols = NULL;
a048c8f5 822
d07734e3 823 return (new);
a048c8f5 824}
d07734e3 825
c0302457
JG
826\f
827/* Initialize anything that needs initializing when starting to read
828 a fresh piece of a symbol file, e.g. reading in the stuff corresponding
829 to a psymtab. */
830
831void
832buildsym_init ()
833{
d07734e3
FF
834 free_pendings = NULL;
835 file_symbols = NULL;
836 global_symbols = NULL;
837 pending_blocks = NULL;
c0302457
JG
838}
839
840/* Initialize anything that needs initializing when a completely new
841 symbol file is specified (not just adding some symbols from another
842 file, e.g. a shared library). */
843
844void
845buildsym_new_init ()
846{
c0302457
JG
847 buildsym_init ();
848}
849
d07734e3 850/* Initializer for this module */
095db7ce 851
c0302457
JG
852void
853_initialize_buildsym ()
854{
c0302457 855}
This page took 0.133626 seconds and 4 git commands to generate.