* defs.h (STRCMP, STREQ, STREQN): New macros.
[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 */
1ab3bf1b 392 subfile->name = 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
FF
590 END_ADDR is the address of the end of the file's text.
591
592 Note that it is possible for end_symtab() to return NULL. In particular,
593 for the DWARF case at least, it will return NULL when it finds a
594 compilation unit that has exactly one DIE, a TAG_compile_unit DIE. This
595 can happen when we link in an object file that was compiled from an empty
596 source file. Returning NULL is probably not the correct thing to do,
597 because then gdb will never know about this empty file (FIXME). */
c0302457
JG
598
599struct symtab *
a048c8f5 600end_symtab (end_addr, sort_pending, sort_linevec, objfile)
c0302457 601 CORE_ADDR end_addr;
4137c5fc
JG
602 int sort_pending;
603 int sort_linevec;
a048c8f5 604 struct objfile *objfile;
c0302457
JG
605{
606 register struct symtab *symtab;
607 register struct blockvector *blockvector;
608 register struct subfile *subfile;
d07734e3 609 register struct context_stack *cstk;
c0302457
JG
610 struct subfile *nextsub;
611
612 /* Finish the lexical context of the last function in the file;
613 pop the context stack. */
614
615 if (context_stack_depth > 0)
616 {
c0302457
JG
617 context_stack_depth--;
618 cstk = &context_stack[context_stack_depth];
619 /* Make a block for the local symbols within. */
620 finish_block (cstk->name, &local_symbols, cstk->old_blocks,
1ab3bf1b 621 cstk->start_addr, end_addr, objfile);
a048c8f5 622
d07734e3
FF
623 /* Debug: if context stack still has something in it,
624 we are in trouble. */
a048c8f5 625 if (context_stack_depth > 0)
d07734e3
FF
626 {
627 abort ();
628 }
c0302457
JG
629 }
630
9b280a7f 631 /* It is unfortunate that in xcoff, pending blocks might not be ordered
4137c5fc
JG
632 in this stage. Especially, blocks for static functions will show up at
633 the end. We need to sort them, so tools like `find_pc_function' and
634 `find_pc_block' can work reliably. */
d07734e3
FF
635
636 if (sort_pending && pending_blocks)
637 {
638 /* FIXME! Remove this horrid bubble sort and use qsort!!! */
639 int swapped;
640 do
641 {
642 struct pending_block *pb, *pbnext;
643
644 pb = pending_blocks;
645 pbnext = pb->next;
646 swapped = 0;
647
648 while (pbnext)
649 {
650 /* swap blocks if unordered! */
651
652 if (BLOCK_START(pb->block) < BLOCK_START(pbnext->block))
653 {
654 struct block *tmp = pb->block;
655 pb->block = pbnext->block;
656 pbnext->block = tmp;
657 swapped = 1;
658 }
659 pb = pbnext;
660 pbnext = pbnext->next;
661 }
662 } while (swapped);
663 }
4137c5fc 664
c0302457
JG
665 /* Cleanup any undefined types that have been left hanging around
666 (this needs to be done before the finish_blocks so that
d07734e3
FF
667 file_symbols is still good).
668 FIXME: Stabs specific. */
c0302457 669 cleanup_undefined_types ();
d07734e3 670 finish_global_stabs (objfile);
c0302457 671
d07734e3
FF
672 if (pending_blocks == NULL
673 && file_symbols == NULL
674 && global_symbols == NULL)
675 {
676 /* Ignore symtabs that have no functions with real debugging info */
677 blockvector = NULL;
678 }
679 else
680 {
681 /* Define the STATIC_BLOCK & GLOBAL_BLOCK, and build the blockvector. */
682 finish_block (0, &file_symbols, 0, last_source_start_addr, end_addr,
683 objfile);
684 finish_block (0, &global_symbols, 0, last_source_start_addr, end_addr,
685 objfile);
686 blockvector = make_blockvector (objfile);
687 }
c0302457 688
818de002 689#ifdef PROCESS_LINENUMBER_HOOK
9b280a7f 690 PROCESS_LINENUMBER_HOOK (); /* Needed for xcoff. */
818de002
PB
691#endif
692
c0302457
JG
693 /* Now create the symtab objects proper, one for each subfile. */
694 /* (The main file is the last one on the chain.) */
695
696 for (subfile = subfiles; subfile; subfile = nextsub)
697 {
1ab3bf1b 698 int linetablesize;
a048c8f5
JG
699 /* If we have blocks of symbols, make a symtab.
700 Otherwise, just ignore this file and any line number info in it. */
d07734e3
FF
701 symtab = NULL;
702 if (blockvector)
703 {
704 if (subfile->line_vector)
705 {
706 /* First, shrink the linetable to make more memory. */
707 linetablesize = sizeof (struct linetable) +
708 subfile->line_vector->nitems * sizeof (struct linetable_entry);
709 subfile->line_vector = (struct linetable *)
710 xrealloc ((char *) subfile->line_vector, linetablesize);
711
712 if (sort_linevec)
713 qsort (subfile->line_vector->item,
714 subfile->line_vector->nitems,
715 sizeof (struct linetable_entry), compare_line_numbers);
716 }
717
718 /* Now, allocate a symbol table. */
719 symtab = allocate_symtab (subfile->name, objfile);
4137c5fc 720
d07734e3
FF
721 /* Fill in its components. */
722 symtab->blockvector = blockvector;
723 if (subfile->line_vector)
724 {
725 /* Reallocate the line table on the symbol obstack */
726 symtab->linetable = (struct linetable *)
727 obstack_alloc (&objfile -> symbol_obstack, linetablesize);
728 memcpy (symtab->linetable, subfile->line_vector, linetablesize);
729 }
730 else
731 {
732 symtab->linetable = NULL;
733 }
8275e802
FF
734 if (subfile->dirname)
735 {
736 /* Reallocate the dirname on the symbol obstack */
737 symtab->dirname = (char *)
738 obstack_alloc (&objfile -> symbol_obstack,
739 strlen (subfile -> dirname) + 1);
740 strcpy (symtab->dirname, subfile->dirname);
741 }
742 else
743 {
744 symtab->dirname = NULL;
745 }
d07734e3
FF
746 symtab->free_code = free_linetable;
747 symtab->free_ptr = NULL;
2b5a8d9c 748
2e4964ad
FF
749 /* Use whatever language we have been using for this subfile,
750 not the one that was deduced in allocate_symtab from the
751 filename. We already did our own deducing when we created
752 the subfile, and we may have altered our opinion of what
753 language it is from things we found in the symbols. */
754 symtab->language = subfile->language;
755
1eeba686 756#ifdef IBM6000_TARGET
d07734e3
FF
757 /* In case we need to duplicate symbol tables (to represent include
758 files), and in case our system needs relocation, we want to
759 relocate the main symbol table node only (for the main file,
760 not for the include files). */
2b5a8d9c 761
d07734e3 762 symtab->nonreloc = TRUE;
2b5a8d9c 763#endif
d07734e3 764 }
3416d90b
FF
765 if (subfile->name != NULL)
766 {
767 free ((PTR) subfile->name);
768 }
769 if (subfile->dirname != NULL)
770 {
771 free ((PTR) subfile->dirname);
772 }
773 if (subfile->line_vector != NULL)
d07734e3 774 {
3416d90b 775 free ((PTR) subfile->line_vector);
d07734e3 776 }
4137c5fc 777
c0302457 778 nextsub = subfile->next;
84ffdec2 779 free ((PTR)subfile);
c0302457
JG
780 }
781
1eeba686 782#ifdef IBM6000_TARGET
2b5a8d9c
PB
783 /* all include symbol tables are non-relocatable, except the main source
784 file's. */
1eeba686 785 if (symtab)
d07734e3
FF
786 {
787 symtab->nonreloc = FALSE;
788 }
2b5a8d9c
PB
789#endif
790
d07734e3
FF
791 last_source_file = NULL;
792 current_subfile = NULL;
4137c5fc 793
d07734e3 794 return (symtab);
c0302457 795}
a048c8f5
JG
796
797
798/* Push a context block. Args are an identifying nesting level (checkable
799 when you pop it), and the starting PC address of this context. */
800
801struct context_stack *
802push_context (desc, valu)
803 int desc;
804 CORE_ADDR valu;
805{
806 register struct context_stack *new;
807
808 if (context_stack_depth == context_stack_size)
809 {
810 context_stack_size *= 2;
811 context_stack = (struct context_stack *)
1ab3bf1b
JG
812 xrealloc ((char *) context_stack,
813 (context_stack_size * sizeof (struct context_stack)));
a048c8f5
JG
814 }
815
816 new = &context_stack[context_stack_depth++];
817 new->depth = desc;
818 new->locals = local_symbols;
819 new->old_blocks = pending_blocks;
820 new->start_addr = valu;
d07734e3 821 new->name = NULL;
a048c8f5 822
d07734e3 823 local_symbols = NULL;
a048c8f5 824
d07734e3 825 return (new);
a048c8f5 826}
d07734e3 827
c0302457
JG
828\f
829/* Initialize anything that needs initializing when starting to read
830 a fresh piece of a symbol file, e.g. reading in the stuff corresponding
831 to a psymtab. */
832
833void
834buildsym_init ()
835{
d07734e3
FF
836 free_pendings = NULL;
837 file_symbols = NULL;
838 global_symbols = NULL;
839 pending_blocks = NULL;
c0302457
JG
840}
841
842/* Initialize anything that needs initializing when a completely new
843 symbol file is specified (not just adding some symbols from another
844 file, e.g. a shared library). */
845
846void
847buildsym_new_init ()
848{
c0302457
JG
849 buildsym_init ();
850}
851
d07734e3 852/* Initializer for this module */
095db7ce 853
c0302457
JG
854void
855_initialize_buildsym ()
856{
c0302457 857}
This page took 0.146194 seconds and 4 git commands to generate.