1e93f7393Sniklas /* Support routines for building symbol tables in GDB's internal format.
2b725ae77Skettenis Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
3b725ae77Skettenis 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004
4e93f7393Sniklas Free Software Foundation, Inc.
5e93f7393Sniklas
6e93f7393Sniklas This file is part of GDB.
7e93f7393Sniklas
8e93f7393Sniklas This program is free software; you can redistribute it and/or modify
9e93f7393Sniklas it under the terms of the GNU General Public License as published by
10e93f7393Sniklas the Free Software Foundation; either version 2 of the License, or
11e93f7393Sniklas (at your option) any later version.
12e93f7393Sniklas
13e93f7393Sniklas This program is distributed in the hope that it will be useful,
14e93f7393Sniklas but WITHOUT ANY WARRANTY; without even the implied warranty of
15e93f7393Sniklas MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16e93f7393Sniklas GNU General Public License for more details.
17e93f7393Sniklas
18e93f7393Sniklas You should have received a copy of the GNU General Public License
19e93f7393Sniklas along with this program; if not, write to the Free Software
20b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330,
21b725ae77Skettenis Boston, MA 02111-1307, USA. */
22e93f7393Sniklas
23e93f7393Sniklas /* This module provides subroutines used for creating and adding to
24e93f7393Sniklas the symbol table. These routines are called from various symbol-
25e93f7393Sniklas file-reading routines.
26e93f7393Sniklas
27e93f7393Sniklas Routines to support specific debugging information formats (stabs,
28e93f7393Sniklas DWARF, etc) belong somewhere else. */
29e93f7393Sniklas
30e93f7393Sniklas #include "defs.h"
31e93f7393Sniklas #include "bfd.h"
32b725ae77Skettenis #include "gdb_obstack.h"
33e93f7393Sniklas #include "symtab.h"
34b725ae77Skettenis #include "symfile.h"
35e93f7393Sniklas #include "objfiles.h"
36e93f7393Sniklas #include "gdbtypes.h"
37b725ae77Skettenis #include "gdb_assert.h"
38e93f7393Sniklas #include "complaints.h"
39e93f7393Sniklas #include "gdb_string.h"
40b725ae77Skettenis #include "expression.h" /* For "enum exp_opcode" used by... */
41b725ae77Skettenis #include "bcache.h"
42b725ae77Skettenis #include "filenames.h" /* For DOSish file names */
43b725ae77Skettenis #include "macrotab.h"
44b725ae77Skettenis #include "demangle.h" /* Needed by SYMBOL_INIT_DEMANGLED_NAME. */
45b725ae77Skettenis #include "block.h"
46b725ae77Skettenis #include "cp-support.h"
47b725ae77Skettenis #include "dictionary.h"
48e93f7393Sniklas
49e93f7393Sniklas /* Ask buildsym.h to define the vars it normally declares `extern'. */
50b725ae77Skettenis #define EXTERN
51b725ae77Skettenis /**/
52e93f7393Sniklas #include "buildsym.h" /* Our own declarations */
53e93f7393Sniklas #undef EXTERN
54e93f7393Sniklas
55e93f7393Sniklas /* For cleanup_undefined_types and finish_global_stabs (somewhat
56e93f7393Sniklas questionable--see comment where we call them). */
57b725ae77Skettenis
58e93f7393Sniklas #include "stabsread.h"
59e93f7393Sniklas
60e93f7393Sniklas /* List of free `struct pending' structures for reuse. */
61e93f7393Sniklas
62e93f7393Sniklas static struct pending *free_pendings;
63e93f7393Sniklas
64b725ae77Skettenis /* Non-zero if symtab has line number info. This prevents an
65b725ae77Skettenis otherwise empty symtab from being tossed. */
66e93f7393Sniklas
67b725ae77Skettenis static int have_line_numbers;
68e93f7393Sniklas
69b725ae77Skettenis static int compare_line_numbers (const void *ln1p, const void *ln2p);
70b725ae77Skettenis
71b725ae77Skettenis
72b725ae77Skettenis /* Initial sizes of data structures. These are realloc'd larger if
73b725ae77Skettenis needed, and realloc'd down to the size actually used, when
74b725ae77Skettenis completed. */
75e93f7393Sniklas
76e93f7393Sniklas #define INITIAL_CONTEXT_STACK_SIZE 10
77e93f7393Sniklas #define INITIAL_LINE_VECTOR_LENGTH 1000
78e93f7393Sniklas
79e93f7393Sniklas
80e93f7393Sniklas /* maintain the lists of symbols and blocks */
81e93f7393Sniklas
82b725ae77Skettenis /* Add a pending list to free_pendings. */
83b725ae77Skettenis void
add_free_pendings(struct pending * list)84b725ae77Skettenis add_free_pendings (struct pending *list)
85b725ae77Skettenis {
86b725ae77Skettenis struct pending *link = list;
87b725ae77Skettenis
88b725ae77Skettenis if (list)
89b725ae77Skettenis {
90b725ae77Skettenis while (link->next) link = link->next;
91b725ae77Skettenis link->next = free_pendings;
92b725ae77Skettenis free_pendings = list;
93b725ae77Skettenis }
94b725ae77Skettenis }
95b725ae77Skettenis
96b725ae77Skettenis /* Add a symbol to one of the lists of symbols. While we're at it, if
97b725ae77Skettenis we're in the C++ case and don't have full namespace debugging info,
98b725ae77Skettenis check to see if it references an anonymous namespace; if so, add an
99b725ae77Skettenis appropriate using directive. */
100e93f7393Sniklas
101e93f7393Sniklas void
add_symbol_to_list(struct symbol * symbol,struct pending ** listhead)102b725ae77Skettenis add_symbol_to_list (struct symbol *symbol, struct pending **listhead)
103e93f7393Sniklas {
104b725ae77Skettenis struct pending *link;
105e93f7393Sniklas
106b725ae77Skettenis /* If this is an alias for another symbol, don't add it. */
107b725ae77Skettenis if (symbol->ginfo.name && symbol->ginfo.name[0] == '#')
108b725ae77Skettenis return;
109b725ae77Skettenis
110b725ae77Skettenis /* We keep PENDINGSIZE symbols in each link of the list. If we
111b725ae77Skettenis don't have a link with room in it, add a new link. */
112e93f7393Sniklas if (*listhead == NULL || (*listhead)->nsyms == PENDINGSIZE)
113e93f7393Sniklas {
114e93f7393Sniklas if (free_pendings)
115e93f7393Sniklas {
116e93f7393Sniklas link = free_pendings;
117e93f7393Sniklas free_pendings = link->next;
118e93f7393Sniklas }
119e93f7393Sniklas else
120e93f7393Sniklas {
121e93f7393Sniklas link = (struct pending *) xmalloc (sizeof (struct pending));
122e93f7393Sniklas }
123e93f7393Sniklas
124e93f7393Sniklas link->next = *listhead;
125e93f7393Sniklas *listhead = link;
126e93f7393Sniklas link->nsyms = 0;
127e93f7393Sniklas }
128e93f7393Sniklas
129e93f7393Sniklas (*listhead)->symbol[(*listhead)->nsyms++] = symbol;
130b725ae77Skettenis
131b725ae77Skettenis /* Check to see if we might need to look for a mention of anonymous
132b725ae77Skettenis namespaces. */
133b725ae77Skettenis
134b725ae77Skettenis if (SYMBOL_LANGUAGE (symbol) == language_cplus)
135b725ae77Skettenis cp_scan_for_anonymous_namespaces (symbol);
136e93f7393Sniklas }
137e93f7393Sniklas
138b725ae77Skettenis /* Find a symbol named NAME on a LIST. NAME need not be
139b725ae77Skettenis '\0'-terminated; LENGTH is the length of the name. */
140e93f7393Sniklas
141e93f7393Sniklas struct symbol *
find_symbol_in_list(struct pending * list,char * name,int length)142b725ae77Skettenis find_symbol_in_list (struct pending *list, char *name, int length)
143e93f7393Sniklas {
144e93f7393Sniklas int j;
145e93f7393Sniklas char *pp;
146e93f7393Sniklas
147e93f7393Sniklas while (list != NULL)
148e93f7393Sniklas {
149e93f7393Sniklas for (j = list->nsyms; --j >= 0;)
150e93f7393Sniklas {
151b725ae77Skettenis pp = DEPRECATED_SYMBOL_NAME (list->symbol[j]);
152e93f7393Sniklas if (*pp == *name && strncmp (pp, name, length) == 0 &&
153e93f7393Sniklas pp[length] == '\0')
154e93f7393Sniklas {
155e93f7393Sniklas return (list->symbol[j]);
156e93f7393Sniklas }
157e93f7393Sniklas }
158e93f7393Sniklas list = list->next;
159e93f7393Sniklas }
160e93f7393Sniklas return (NULL);
161e93f7393Sniklas }
162e93f7393Sniklas
163b725ae77Skettenis /* At end of reading syms, or in case of quit, really free as many
164b725ae77Skettenis `struct pending's as we can easily find. */
165e93f7393Sniklas
166e93f7393Sniklas void
really_free_pendings(void * dummy)167b725ae77Skettenis really_free_pendings (void *dummy)
168e93f7393Sniklas {
169e93f7393Sniklas struct pending *next, *next1;
170e93f7393Sniklas
171e93f7393Sniklas for (next = free_pendings; next; next = next1)
172e93f7393Sniklas {
173e93f7393Sniklas next1 = next->next;
174b725ae77Skettenis xfree ((void *) next);
175e93f7393Sniklas }
176e93f7393Sniklas free_pendings = NULL;
177e93f7393Sniklas
178e93f7393Sniklas free_pending_blocks ();
179e93f7393Sniklas
180e93f7393Sniklas for (next = file_symbols; next != NULL; next = next1)
181e93f7393Sniklas {
182e93f7393Sniklas next1 = next->next;
183b725ae77Skettenis xfree ((void *) next);
184e93f7393Sniklas }
185e93f7393Sniklas file_symbols = NULL;
186e93f7393Sniklas
187e93f7393Sniklas for (next = global_symbols; next != NULL; next = next1)
188e93f7393Sniklas {
189e93f7393Sniklas next1 = next->next;
190b725ae77Skettenis xfree ((void *) next);
191e93f7393Sniklas }
192e93f7393Sniklas global_symbols = NULL;
193b725ae77Skettenis
194b725ae77Skettenis if (pending_macros)
195b725ae77Skettenis free_macro_table (pending_macros);
196e93f7393Sniklas }
197e93f7393Sniklas
198e93f7393Sniklas /* This function is called to discard any pending blocks. */
199e93f7393Sniklas
200e93f7393Sniklas void
free_pending_blocks(void)201b725ae77Skettenis free_pending_blocks (void)
202e93f7393Sniklas {
203b725ae77Skettenis #if 0 /* Now we make the links in the
204b725ae77Skettenis objfile_obstack, so don't free
205b725ae77Skettenis them. */
206e93f7393Sniklas struct pending_block *bnext, *bnext1;
207e93f7393Sniklas
208e93f7393Sniklas for (bnext = pending_blocks; bnext; bnext = bnext1)
209e93f7393Sniklas {
210e93f7393Sniklas bnext1 = bnext->next;
211b725ae77Skettenis xfree ((void *) bnext);
212e93f7393Sniklas }
213e93f7393Sniklas #endif
214e93f7393Sniklas pending_blocks = NULL;
215e93f7393Sniklas }
216e93f7393Sniklas
217b725ae77Skettenis /* Take one of the lists of symbols and make a block from it. Keep
218b725ae77Skettenis the order the symbols have in the list (reversed from the input
219b725ae77Skettenis file). Put the block on the list of pending blocks. */
220e93f7393Sniklas
221e93f7393Sniklas void
finish_block(struct symbol * symbol,struct pending ** listhead,struct pending_block * old_blocks,CORE_ADDR start,CORE_ADDR end,struct objfile * objfile)222b725ae77Skettenis finish_block (struct symbol *symbol, struct pending **listhead,
223b725ae77Skettenis struct pending_block *old_blocks,
224b725ae77Skettenis CORE_ADDR start, CORE_ADDR end,
225b725ae77Skettenis struct objfile *objfile)
226e93f7393Sniklas {
227b725ae77Skettenis struct pending *next, *next1;
228b725ae77Skettenis struct block *block;
229b725ae77Skettenis struct pending_block *pblock;
230e93f7393Sniklas struct pending_block *opblock;
231e93f7393Sniklas
232b725ae77Skettenis block = allocate_block (&objfile->objfile_obstack);
233e93f7393Sniklas
234b725ae77Skettenis if (symbol)
235e93f7393Sniklas {
236b725ae77Skettenis BLOCK_DICT (block) = dict_create_linear (&objfile->objfile_obstack,
237b725ae77Skettenis *listhead);
238e93f7393Sniklas }
239b725ae77Skettenis else
240e93f7393Sniklas {
241b725ae77Skettenis BLOCK_DICT (block) = dict_create_hashed (&objfile->objfile_obstack,
242b725ae77Skettenis *listhead);
243e93f7393Sniklas }
244e93f7393Sniklas
245e93f7393Sniklas BLOCK_START (block) = start;
246e93f7393Sniklas BLOCK_END (block) = end;
247e93f7393Sniklas /* Superblock filled in when containing block is made */
248e93f7393Sniklas BLOCK_SUPERBLOCK (block) = NULL;
249b725ae77Skettenis BLOCK_NAMESPACE (block) = NULL;
250b725ae77Skettenis
251e93f7393Sniklas BLOCK_GCC_COMPILED (block) = processing_gcc_compilation;
252e93f7393Sniklas
253e93f7393Sniklas /* Put the block in as the value of the symbol that names it. */
254e93f7393Sniklas
255e93f7393Sniklas if (symbol)
256e93f7393Sniklas {
257e93f7393Sniklas struct type *ftype = SYMBOL_TYPE (symbol);
258b725ae77Skettenis struct dict_iterator iter;
259e93f7393Sniklas SYMBOL_BLOCK_VALUE (symbol) = block;
260e93f7393Sniklas BLOCK_FUNCTION (block) = symbol;
261e93f7393Sniklas
262e93f7393Sniklas if (TYPE_NFIELDS (ftype) <= 0)
263e93f7393Sniklas {
264b725ae77Skettenis /* No parameter type information is recorded with the
265b725ae77Skettenis function's type. Set that from the type of the
266b725ae77Skettenis parameter symbols. */
267e93f7393Sniklas int nparams = 0, iparams;
268e93f7393Sniklas struct symbol *sym;
269b725ae77Skettenis ALL_BLOCK_SYMBOLS (block, iter, sym)
270e93f7393Sniklas {
271e93f7393Sniklas switch (SYMBOL_CLASS (sym))
272e93f7393Sniklas {
273e93f7393Sniklas case LOC_ARG:
274e93f7393Sniklas case LOC_REF_ARG:
275e93f7393Sniklas case LOC_REGPARM:
276e93f7393Sniklas case LOC_REGPARM_ADDR:
277e93f7393Sniklas case LOC_BASEREG_ARG:
278e93f7393Sniklas case LOC_LOCAL_ARG:
279b725ae77Skettenis case LOC_COMPUTED_ARG:
280e93f7393Sniklas nparams++;
281e93f7393Sniklas break;
282e93f7393Sniklas case LOC_UNDEF:
283e93f7393Sniklas case LOC_CONST:
284e93f7393Sniklas case LOC_STATIC:
285b725ae77Skettenis case LOC_INDIRECT:
286e93f7393Sniklas case LOC_REGISTER:
287e93f7393Sniklas case LOC_LOCAL:
288e93f7393Sniklas case LOC_TYPEDEF:
289e93f7393Sniklas case LOC_LABEL:
290e93f7393Sniklas case LOC_BLOCK:
291e93f7393Sniklas case LOC_CONST_BYTES:
292e93f7393Sniklas case LOC_BASEREG:
293e93f7393Sniklas case LOC_UNRESOLVED:
294e93f7393Sniklas case LOC_OPTIMIZED_OUT:
295b725ae77Skettenis case LOC_COMPUTED:
296e93f7393Sniklas default:
297e93f7393Sniklas break;
298e93f7393Sniklas }
299e93f7393Sniklas }
300e93f7393Sniklas if (nparams > 0)
301e93f7393Sniklas {
302e93f7393Sniklas TYPE_NFIELDS (ftype) = nparams;
303e93f7393Sniklas TYPE_FIELDS (ftype) = (struct field *)
304e93f7393Sniklas TYPE_ALLOC (ftype, nparams * sizeof (struct field));
305e93f7393Sniklas
306b725ae77Skettenis iparams = 0;
307b725ae77Skettenis ALL_BLOCK_SYMBOLS (block, iter, sym)
308e93f7393Sniklas {
309b725ae77Skettenis if (iparams == nparams)
310b725ae77Skettenis break;
311b725ae77Skettenis
312e93f7393Sniklas switch (SYMBOL_CLASS (sym))
313e93f7393Sniklas {
314e93f7393Sniklas case LOC_ARG:
315e93f7393Sniklas case LOC_REF_ARG:
316e93f7393Sniklas case LOC_REGPARM:
317e93f7393Sniklas case LOC_REGPARM_ADDR:
318e93f7393Sniklas case LOC_BASEREG_ARG:
319e93f7393Sniklas case LOC_LOCAL_ARG:
320b725ae77Skettenis case LOC_COMPUTED_ARG:
321e93f7393Sniklas TYPE_FIELD_TYPE (ftype, iparams) = SYMBOL_TYPE (sym);
322b725ae77Skettenis TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
323e93f7393Sniklas iparams++;
324e93f7393Sniklas break;
325e93f7393Sniklas case LOC_UNDEF:
326e93f7393Sniklas case LOC_CONST:
327e93f7393Sniklas case LOC_STATIC:
328b725ae77Skettenis case LOC_INDIRECT:
329e93f7393Sniklas case LOC_REGISTER:
330e93f7393Sniklas case LOC_LOCAL:
331e93f7393Sniklas case LOC_TYPEDEF:
332e93f7393Sniklas case LOC_LABEL:
333e93f7393Sniklas case LOC_BLOCK:
334e93f7393Sniklas case LOC_CONST_BYTES:
335e93f7393Sniklas case LOC_BASEREG:
336e93f7393Sniklas case LOC_UNRESOLVED:
337e93f7393Sniklas case LOC_OPTIMIZED_OUT:
338b725ae77Skettenis case LOC_COMPUTED:
339e93f7393Sniklas default:
340e93f7393Sniklas break;
341e93f7393Sniklas }
342e93f7393Sniklas }
343e93f7393Sniklas }
344e93f7393Sniklas }
345b725ae77Skettenis
346b725ae77Skettenis /* If we're in the C++ case, set the block's scope. */
347b725ae77Skettenis if (SYMBOL_LANGUAGE (symbol) == language_cplus)
348b725ae77Skettenis {
349b725ae77Skettenis cp_set_block_scope (symbol, block, &objfile->objfile_obstack);
350b725ae77Skettenis }
351e93f7393Sniklas }
352e93f7393Sniklas else
353e93f7393Sniklas {
354e93f7393Sniklas BLOCK_FUNCTION (block) = NULL;
355e93f7393Sniklas }
356e93f7393Sniklas
357e93f7393Sniklas /* Now "free" the links of the list, and empty the list. */
358e93f7393Sniklas
359e93f7393Sniklas for (next = *listhead; next; next = next1)
360e93f7393Sniklas {
361e93f7393Sniklas next1 = next->next;
362e93f7393Sniklas next->next = free_pendings;
363e93f7393Sniklas free_pendings = next;
364e93f7393Sniklas }
365e93f7393Sniklas *listhead = NULL;
366e93f7393Sniklas
367e93f7393Sniklas #if 1
368e93f7393Sniklas /* Check to be sure that the blocks have an end address that is
369e93f7393Sniklas greater than starting address */
370e93f7393Sniklas
371e93f7393Sniklas if (BLOCK_END (block) < BLOCK_START (block))
372e93f7393Sniklas {
373e93f7393Sniklas if (symbol)
374e93f7393Sniklas {
375b725ae77Skettenis complaint (&symfile_complaints,
376b725ae77Skettenis "block end address less than block start address in %s (patched it)",
377b725ae77Skettenis SYMBOL_PRINT_NAME (symbol));
378e93f7393Sniklas }
379e93f7393Sniklas else
380e93f7393Sniklas {
381b725ae77Skettenis complaint (&symfile_complaints,
382b725ae77Skettenis "block end address 0x%s less than block start address 0x%s (patched it)",
383b725ae77Skettenis paddr_nz (BLOCK_END (block)), paddr_nz (BLOCK_START (block)));
384e93f7393Sniklas }
385e93f7393Sniklas /* Better than nothing */
386e93f7393Sniklas BLOCK_END (block) = BLOCK_START (block);
387e93f7393Sniklas }
388e93f7393Sniklas #endif
389e93f7393Sniklas
390b725ae77Skettenis /* Install this block as the superblock of all blocks made since the
391b725ae77Skettenis start of this scope that don't have superblocks yet. */
392e93f7393Sniklas
393e93f7393Sniklas opblock = NULL;
394b725ae77Skettenis for (pblock = pending_blocks;
395b725ae77Skettenis pblock && pblock != old_blocks;
396b725ae77Skettenis pblock = pblock->next)
397e93f7393Sniklas {
398e93f7393Sniklas if (BLOCK_SUPERBLOCK (pblock->block) == NULL)
399e93f7393Sniklas {
400e93f7393Sniklas #if 1
401b725ae77Skettenis /* Check to be sure the blocks are nested as we receive
402b725ae77Skettenis them. If the compiler/assembler/linker work, this just
403b725ae77Skettenis burns a small amount of time. */
404e93f7393Sniklas if (BLOCK_START (pblock->block) < BLOCK_START (block) ||
405e93f7393Sniklas BLOCK_END (pblock->block) > BLOCK_END (block))
406e93f7393Sniklas {
407e93f7393Sniklas if (symbol)
408e93f7393Sniklas {
409b725ae77Skettenis complaint (&symfile_complaints,
410b725ae77Skettenis "inner block not inside outer block in %s",
411b725ae77Skettenis SYMBOL_PRINT_NAME (symbol));
412e93f7393Sniklas }
413e93f7393Sniklas else
414e93f7393Sniklas {
415b725ae77Skettenis complaint (&symfile_complaints,
416b725ae77Skettenis "inner block (0x%s-0x%s) not inside outer block (0x%s-0x%s)",
417b725ae77Skettenis paddr_nz (BLOCK_START (pblock->block)),
418b725ae77Skettenis paddr_nz (BLOCK_END (pblock->block)),
419b725ae77Skettenis paddr_nz (BLOCK_START (block)),
420b725ae77Skettenis paddr_nz (BLOCK_END (block)));
421e93f7393Sniklas }
422b725ae77Skettenis if (BLOCK_START (pblock->block) < BLOCK_START (block))
423e93f7393Sniklas BLOCK_START (pblock->block) = BLOCK_START (block);
424b725ae77Skettenis if (BLOCK_END (pblock->block) > BLOCK_END (block))
425e93f7393Sniklas BLOCK_END (pblock->block) = BLOCK_END (block);
426e93f7393Sniklas }
427e93f7393Sniklas #endif
428e93f7393Sniklas BLOCK_SUPERBLOCK (pblock->block) = block;
429e93f7393Sniklas }
430e93f7393Sniklas opblock = pblock;
431e93f7393Sniklas }
432e93f7393Sniklas
433e93f7393Sniklas record_pending_block (objfile, block, opblock);
434e93f7393Sniklas }
435e93f7393Sniklas
436e93f7393Sniklas
437b725ae77Skettenis /* Record BLOCK on the list of all blocks in the file. Put it after
438b725ae77Skettenis OPBLOCK, or at the beginning if opblock is NULL. This puts the
439b725ae77Skettenis block in the list after all its subblocks.
440b725ae77Skettenis
441b725ae77Skettenis Allocate the pending block struct in the objfile_obstack to save
442e93f7393Sniklas time. This wastes a little space. FIXME: Is it worth it? */
443e93f7393Sniklas
444e93f7393Sniklas void
record_pending_block(struct objfile * objfile,struct block * block,struct pending_block * opblock)445b725ae77Skettenis record_pending_block (struct objfile *objfile, struct block *block,
446b725ae77Skettenis struct pending_block *opblock)
447e93f7393Sniklas {
448b725ae77Skettenis struct pending_block *pblock;
449e93f7393Sniklas
450e93f7393Sniklas pblock = (struct pending_block *)
451b725ae77Skettenis obstack_alloc (&objfile->objfile_obstack, sizeof (struct pending_block));
452e93f7393Sniklas pblock->block = block;
453e93f7393Sniklas if (opblock)
454e93f7393Sniklas {
455e93f7393Sniklas pblock->next = opblock->next;
456e93f7393Sniklas opblock->next = pblock;
457e93f7393Sniklas }
458e93f7393Sniklas else
459e93f7393Sniklas {
460e93f7393Sniklas pblock->next = pending_blocks;
461e93f7393Sniklas pending_blocks = pblock;
462e93f7393Sniklas }
463e93f7393Sniklas }
464e93f7393Sniklas
465b725ae77Skettenis static struct blockvector *
make_blockvector(struct objfile * objfile)466b725ae77Skettenis make_blockvector (struct objfile *objfile)
467e93f7393Sniklas {
468b725ae77Skettenis struct pending_block *next;
469b725ae77Skettenis struct blockvector *blockvector;
470b725ae77Skettenis int i;
471e93f7393Sniklas
472e93f7393Sniklas /* Count the length of the list of blocks. */
473e93f7393Sniklas
474b725ae77Skettenis for (next = pending_blocks, i = 0; next; next = next->next, i++)
475b725ae77Skettenis {;
476b725ae77Skettenis }
477e93f7393Sniklas
478e93f7393Sniklas blockvector = (struct blockvector *)
479b725ae77Skettenis obstack_alloc (&objfile->objfile_obstack,
480e93f7393Sniklas (sizeof (struct blockvector)
481e93f7393Sniklas + (i - 1) * sizeof (struct block *)));
482e93f7393Sniklas
483b725ae77Skettenis /* Copy the blocks into the blockvector. This is done in reverse
484b725ae77Skettenis order, which happens to put the blocks into the proper order
485b725ae77Skettenis (ascending starting address). finish_block has hair to insert
486b725ae77Skettenis each block into the list after its subblocks in order to make
487b725ae77Skettenis sure this is true. */
488e93f7393Sniklas
489e93f7393Sniklas BLOCKVECTOR_NBLOCKS (blockvector) = i;
490e93f7393Sniklas for (next = pending_blocks; next; next = next->next)
491e93f7393Sniklas {
492e93f7393Sniklas BLOCKVECTOR_BLOCK (blockvector, --i) = next->block;
493e93f7393Sniklas }
494e93f7393Sniklas
495b725ae77Skettenis #if 0 /* Now we make the links in the
496b725ae77Skettenis obstack, so don't free them. */
497e93f7393Sniklas /* Now free the links of the list, and empty the list. */
498e93f7393Sniklas
499e93f7393Sniklas for (next = pending_blocks; next; next = next1)
500e93f7393Sniklas {
501e93f7393Sniklas next1 = next->next;
502b725ae77Skettenis xfree (next);
503e93f7393Sniklas }
504e93f7393Sniklas #endif
505e93f7393Sniklas pending_blocks = NULL;
506e93f7393Sniklas
507b725ae77Skettenis #if 1 /* FIXME, shut this off after a while
508b725ae77Skettenis to speed up symbol reading. */
509b725ae77Skettenis /* Some compilers output blocks in the wrong order, but we depend on
510b725ae77Skettenis their being in the right order so we can binary search. Check the
511b725ae77Skettenis order and moan about it. FIXME. */
512e93f7393Sniklas if (BLOCKVECTOR_NBLOCKS (blockvector) > 1)
513e93f7393Sniklas {
514e93f7393Sniklas for (i = 1; i < BLOCKVECTOR_NBLOCKS (blockvector); i++)
515e93f7393Sniklas {
516e93f7393Sniklas if (BLOCK_START (BLOCKVECTOR_BLOCK (blockvector, i - 1))
517e93f7393Sniklas > BLOCK_START (BLOCKVECTOR_BLOCK (blockvector, i)))
518e93f7393Sniklas {
519b725ae77Skettenis CORE_ADDR start
520b725ae77Skettenis = BLOCK_START (BLOCKVECTOR_BLOCK (blockvector, i));
521e93f7393Sniklas
522b725ae77Skettenis complaint (&symfile_complaints, "block at %s out of order",
523*63addd46Skettenis hex_string ((LONGEST) start));
524e93f7393Sniklas }
525e93f7393Sniklas }
526e93f7393Sniklas }
527e93f7393Sniklas #endif
528e93f7393Sniklas
529e93f7393Sniklas return (blockvector);
530e93f7393Sniklas }
531e93f7393Sniklas
532b725ae77Skettenis /* Start recording information about source code that came from an
533b725ae77Skettenis included (or otherwise merged-in) source file with a different
534b725ae77Skettenis name. NAME is the name of the file (cannot be NULL), DIRNAME is
535b725ae77Skettenis the directory in which it resides (or NULL if not known). */
536e93f7393Sniklas
537e93f7393Sniklas void
start_subfile(char * name,char * dirname)538b725ae77Skettenis start_subfile (char *name, char *dirname)
539e93f7393Sniklas {
540b725ae77Skettenis struct subfile *subfile;
541e93f7393Sniklas
542b725ae77Skettenis /* See if this subfile is already known as a subfile of the current
543b725ae77Skettenis main source file. */
544e93f7393Sniklas
545e93f7393Sniklas for (subfile = subfiles; subfile; subfile = subfile->next)
546e93f7393Sniklas {
547b725ae77Skettenis if (FILENAME_CMP (subfile->name, name) == 0)
548e93f7393Sniklas {
549e93f7393Sniklas current_subfile = subfile;
550e93f7393Sniklas return;
551e93f7393Sniklas }
552e93f7393Sniklas }
553e93f7393Sniklas
554b725ae77Skettenis /* This subfile is not known. Add an entry for it. Make an entry
555b725ae77Skettenis for this subfile in the list of all subfiles of the current main
556b725ae77Skettenis source file. */
557e93f7393Sniklas
558e93f7393Sniklas subfile = (struct subfile *) xmalloc (sizeof (struct subfile));
559b725ae77Skettenis memset ((char *) subfile, 0, sizeof (struct subfile));
560e93f7393Sniklas subfile->next = subfiles;
561e93f7393Sniklas subfiles = subfile;
562e93f7393Sniklas current_subfile = subfile;
563e93f7393Sniklas
564e93f7393Sniklas /* Save its name and compilation directory name */
565e93f7393Sniklas subfile->name = (name == NULL) ? NULL : savestring (name, strlen (name));
566e93f7393Sniklas subfile->dirname =
567e93f7393Sniklas (dirname == NULL) ? NULL : savestring (dirname, strlen (dirname));
568e93f7393Sniklas
569e93f7393Sniklas /* Initialize line-number recording for this subfile. */
570e93f7393Sniklas subfile->line_vector = NULL;
571e93f7393Sniklas
572b725ae77Skettenis /* Default the source language to whatever can be deduced from the
573b725ae77Skettenis filename. If nothing can be deduced (such as for a C/C++ include
574b725ae77Skettenis file with a ".h" extension), then inherit whatever language the
575b725ae77Skettenis previous subfile had. This kludgery is necessary because there
576b725ae77Skettenis is no standard way in some object formats to record the source
577b725ae77Skettenis language. Also, when symtabs are allocated we try to deduce a
578b725ae77Skettenis language then as well, but it is too late for us to use that
579b725ae77Skettenis information while reading symbols, since symtabs aren't allocated
580b725ae77Skettenis until after all the symbols have been processed for a given
581b725ae77Skettenis source file. */
582e93f7393Sniklas
583e93f7393Sniklas subfile->language = deduce_language_from_filename (subfile->name);
584e93f7393Sniklas if (subfile->language == language_unknown &&
585e93f7393Sniklas subfile->next != NULL)
586e93f7393Sniklas {
587e93f7393Sniklas subfile->language = subfile->next->language;
588e93f7393Sniklas }
589e93f7393Sniklas
590b725ae77Skettenis /* Initialize the debug format string to NULL. We may supply it
591b725ae77Skettenis later via a call to record_debugformat. */
592b725ae77Skettenis subfile->debugformat = NULL;
593e93f7393Sniklas
594b725ae77Skettenis /* If the filename of this subfile ends in .C, then change the
595b725ae77Skettenis language of any pending subfiles from C to C++. We also accept
596b725ae77Skettenis any other C++ suffixes accepted by deduce_language_from_filename. */
597e93f7393Sniklas /* Likewise for f2c. */
598e93f7393Sniklas
599e93f7393Sniklas if (subfile->name)
600e93f7393Sniklas {
601e93f7393Sniklas struct subfile *s;
602e93f7393Sniklas enum language sublang = deduce_language_from_filename (subfile->name);
603e93f7393Sniklas
604e93f7393Sniklas if (sublang == language_cplus || sublang == language_fortran)
605e93f7393Sniklas for (s = subfiles; s != NULL; s = s->next)
606e93f7393Sniklas if (s->language == language_c)
607e93f7393Sniklas s->language = sublang;
608e93f7393Sniklas }
609e93f7393Sniklas
610e93f7393Sniklas /* And patch up this file if necessary. */
611e93f7393Sniklas if (subfile->language == language_c
612e93f7393Sniklas && subfile->next != NULL
613e93f7393Sniklas && (subfile->next->language == language_cplus
614e93f7393Sniklas || subfile->next->language == language_fortran))
615e93f7393Sniklas {
616e93f7393Sniklas subfile->language = subfile->next->language;
617e93f7393Sniklas }
618e93f7393Sniklas }
619e93f7393Sniklas
620b725ae77Skettenis /* For stabs readers, the first N_SO symbol is assumed to be the
621b725ae77Skettenis source file name, and the subfile struct is initialized using that
622b725ae77Skettenis assumption. If another N_SO symbol is later seen, immediately
623b725ae77Skettenis following the first one, then the first one is assumed to be the
624b725ae77Skettenis directory name and the second one is really the source file name.
625e93f7393Sniklas
626b725ae77Skettenis So we have to patch up the subfile struct by moving the old name
627b725ae77Skettenis value to dirname and remembering the new name. Some sanity
628b725ae77Skettenis checking is performed to ensure that the state of the subfile
629b725ae77Skettenis struct is reasonable and that the old name we are assuming to be a
630b725ae77Skettenis directory name actually is (by checking for a trailing '/'). */
631e93f7393Sniklas
632e93f7393Sniklas void
patch_subfile_names(struct subfile * subfile,char * name)633b725ae77Skettenis patch_subfile_names (struct subfile *subfile, char *name)
634e93f7393Sniklas {
635e93f7393Sniklas if (subfile != NULL && subfile->dirname == NULL && subfile->name != NULL
636e93f7393Sniklas && subfile->name[strlen (subfile->name) - 1] == '/')
637e93f7393Sniklas {
638e93f7393Sniklas subfile->dirname = subfile->name;
639e93f7393Sniklas subfile->name = savestring (name, strlen (name));
640e93f7393Sniklas last_source_file = name;
641e93f7393Sniklas
642e93f7393Sniklas /* Default the source language to whatever can be deduced from
643e93f7393Sniklas the filename. If nothing can be deduced (such as for a C/C++
644e93f7393Sniklas include file with a ".h" extension), then inherit whatever
645b725ae77Skettenis language the previous subfile had. This kludgery is
646b725ae77Skettenis necessary because there is no standard way in some object
647b725ae77Skettenis formats to record the source language. Also, when symtabs
648b725ae77Skettenis are allocated we try to deduce a language then as well, but
649b725ae77Skettenis it is too late for us to use that information while reading
650b725ae77Skettenis symbols, since symtabs aren't allocated until after all the
651b725ae77Skettenis symbols have been processed for a given source file. */
652e93f7393Sniklas
653e93f7393Sniklas subfile->language = deduce_language_from_filename (subfile->name);
654e93f7393Sniklas if (subfile->language == language_unknown &&
655e93f7393Sniklas subfile->next != NULL)
656e93f7393Sniklas {
657e93f7393Sniklas subfile->language = subfile->next->language;
658e93f7393Sniklas }
659e93f7393Sniklas }
660e93f7393Sniklas }
661e93f7393Sniklas
662b725ae77Skettenis /* Handle the N_BINCL and N_EINCL symbol types that act like N_SOL for
663b725ae77Skettenis switching source files (different subfiles, as we call them) within
664b725ae77Skettenis one object file, but using a stack rather than in an arbitrary
665b725ae77Skettenis order. */
666e93f7393Sniklas
667e93f7393Sniklas void
push_subfile(void)668b725ae77Skettenis push_subfile (void)
669e93f7393Sniklas {
670b725ae77Skettenis struct subfile_stack *tem
671e93f7393Sniklas = (struct subfile_stack *) xmalloc (sizeof (struct subfile_stack));
672e93f7393Sniklas
673e93f7393Sniklas tem->next = subfile_stack;
674e93f7393Sniklas subfile_stack = tem;
675e93f7393Sniklas if (current_subfile == NULL || current_subfile->name == NULL)
676e93f7393Sniklas {
677b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
678e93f7393Sniklas }
679e93f7393Sniklas tem->name = current_subfile->name;
680e93f7393Sniklas }
681e93f7393Sniklas
682e93f7393Sniklas char *
pop_subfile(void)683b725ae77Skettenis pop_subfile (void)
684e93f7393Sniklas {
685b725ae77Skettenis char *name;
686b725ae77Skettenis struct subfile_stack *link = subfile_stack;
687e93f7393Sniklas
688e93f7393Sniklas if (link == NULL)
689e93f7393Sniklas {
690b725ae77Skettenis internal_error (__FILE__, __LINE__, "failed internal consistency check");
691e93f7393Sniklas }
692e93f7393Sniklas name = link->name;
693e93f7393Sniklas subfile_stack = link->next;
694b725ae77Skettenis xfree ((void *) link);
695e93f7393Sniklas return (name);
696e93f7393Sniklas }
697e93f7393Sniklas
698b725ae77Skettenis /* Add a linetable entry for line number LINE and address PC to the
699b725ae77Skettenis line vector for SUBFILE. */
700e93f7393Sniklas
701e93f7393Sniklas void
record_line(struct subfile * subfile,int line,CORE_ADDR pc)702b725ae77Skettenis record_line (struct subfile *subfile, int line, CORE_ADDR pc)
703e93f7393Sniklas {
704e93f7393Sniklas struct linetable_entry *e;
705e93f7393Sniklas /* Ignore the dummy line number in libg.o */
706e93f7393Sniklas
707e93f7393Sniklas if (line == 0xffff)
708e93f7393Sniklas {
709e93f7393Sniklas return;
710e93f7393Sniklas }
711e93f7393Sniklas
712e93f7393Sniklas /* Make sure line vector exists and is big enough. */
713e93f7393Sniklas if (!subfile->line_vector)
714e93f7393Sniklas {
715e93f7393Sniklas subfile->line_vector_length = INITIAL_LINE_VECTOR_LENGTH;
716e93f7393Sniklas subfile->line_vector = (struct linetable *)
717e93f7393Sniklas xmalloc (sizeof (struct linetable)
718e93f7393Sniklas + subfile->line_vector_length * sizeof (struct linetable_entry));
719e93f7393Sniklas subfile->line_vector->nitems = 0;
720b725ae77Skettenis have_line_numbers = 1;
721e93f7393Sniklas }
722e93f7393Sniklas
723e93f7393Sniklas if (subfile->line_vector->nitems + 1 >= subfile->line_vector_length)
724e93f7393Sniklas {
725e93f7393Sniklas subfile->line_vector_length *= 2;
726e93f7393Sniklas subfile->line_vector = (struct linetable *)
727b725ae77Skettenis xrealloc ((char *) subfile->line_vector,
728b725ae77Skettenis (sizeof (struct linetable)
729b725ae77Skettenis + (subfile->line_vector_length
730b725ae77Skettenis * sizeof (struct linetable_entry))));
731e93f7393Sniklas }
732e93f7393Sniklas
733e93f7393Sniklas e = subfile->line_vector->item + subfile->line_vector->nitems++;
734b725ae77Skettenis e->line = line;
735b725ae77Skettenis e->pc = ADDR_BITS_REMOVE(pc);
736e93f7393Sniklas }
737e93f7393Sniklas
738e93f7393Sniklas /* Needed in order to sort line tables from IBM xcoff files. Sigh! */
739e93f7393Sniklas
740e93f7393Sniklas static int
compare_line_numbers(const void * ln1p,const void * ln2p)741b725ae77Skettenis compare_line_numbers (const void *ln1p, const void *ln2p)
742e93f7393Sniklas {
743e93f7393Sniklas struct linetable_entry *ln1 = (struct linetable_entry *) ln1p;
744e93f7393Sniklas struct linetable_entry *ln2 = (struct linetable_entry *) ln2p;
745e93f7393Sniklas
746e93f7393Sniklas /* Note: this code does not assume that CORE_ADDRs can fit in ints.
747e93f7393Sniklas Please keep it that way. */
748e93f7393Sniklas if (ln1->pc < ln2->pc)
749e93f7393Sniklas return -1;
750e93f7393Sniklas
751e93f7393Sniklas if (ln1->pc > ln2->pc)
752e93f7393Sniklas return 1;
753e93f7393Sniklas
754e93f7393Sniklas /* If pc equal, sort by line. I'm not sure whether this is optimum
755e93f7393Sniklas behavior (see comment at struct linetable in symtab.h). */
756e93f7393Sniklas return ln1->line - ln2->line;
757e93f7393Sniklas }
758e93f7393Sniklas
759b725ae77Skettenis /* Start a new symtab for a new source file. Called, for example,
760b725ae77Skettenis when a stabs symbol of type N_SO is seen, or when a DWARF
761b725ae77Skettenis TAG_compile_unit DIE is seen. It indicates the start of data for
762b725ae77Skettenis one original source file. */
763e93f7393Sniklas
764e93f7393Sniklas void
start_symtab(char * name,char * dirname,CORE_ADDR start_addr)765b725ae77Skettenis start_symtab (char *name, char *dirname, CORE_ADDR start_addr)
766e93f7393Sniklas {
767e93f7393Sniklas
768e93f7393Sniklas last_source_file = name;
769e93f7393Sniklas last_source_start_addr = start_addr;
770e93f7393Sniklas file_symbols = NULL;
771e93f7393Sniklas global_symbols = NULL;
772e93f7393Sniklas within_function = 0;
773b725ae77Skettenis have_line_numbers = 0;
774e93f7393Sniklas
775b725ae77Skettenis /* Context stack is initially empty. Allocate first one with room
776b725ae77Skettenis for 10 levels; reuse it forever afterward. */
777e93f7393Sniklas if (context_stack == NULL)
778e93f7393Sniklas {
779e93f7393Sniklas context_stack_size = INITIAL_CONTEXT_STACK_SIZE;
780e93f7393Sniklas context_stack = (struct context_stack *)
781e93f7393Sniklas xmalloc (context_stack_size * sizeof (struct context_stack));
782e93f7393Sniklas }
783e93f7393Sniklas context_stack_depth = 0;
784e93f7393Sniklas
785b725ae77Skettenis /* Set up support for C++ namespace support, in case we need it. */
786b725ae77Skettenis
787b725ae77Skettenis cp_initialize_namespace ();
788b725ae77Skettenis
789b725ae77Skettenis /* Initialize the list of sub source files with one entry for this
790b725ae77Skettenis file (the top-level source file). */
791e93f7393Sniklas
792e93f7393Sniklas subfiles = NULL;
793e93f7393Sniklas current_subfile = NULL;
794e93f7393Sniklas start_subfile (name, dirname);
795e93f7393Sniklas }
796e93f7393Sniklas
797b725ae77Skettenis /* Finish the symbol definitions for one main source file, close off
798b725ae77Skettenis all the lexical contexts for that file (creating struct block's for
799b725ae77Skettenis them), then make the struct symtab for that file and put it in the
800b725ae77Skettenis list of all such.
801e93f7393Sniklas
802b725ae77Skettenis END_ADDR is the address of the end of the file's text. SECTION is
803b725ae77Skettenis the section number (in objfile->section_offsets) of the blockvector
804b725ae77Skettenis and linetable.
805e93f7393Sniklas
806b725ae77Skettenis Note that it is possible for end_symtab() to return NULL. In
807b725ae77Skettenis particular, for the DWARF case at least, it will return NULL when
808b725ae77Skettenis it finds a compilation unit that has exactly one DIE, a
809b725ae77Skettenis TAG_compile_unit DIE. This can happen when we link in an object
810b725ae77Skettenis file that was compiled from an empty source file. Returning NULL
811b725ae77Skettenis is probably not the correct thing to do, because then gdb will
812b725ae77Skettenis never know about this empty file (FIXME). */
813e93f7393Sniklas
814e93f7393Sniklas struct symtab *
end_symtab(CORE_ADDR end_addr,struct objfile * objfile,int section)815b725ae77Skettenis end_symtab (CORE_ADDR end_addr, struct objfile *objfile, int section)
816e93f7393Sniklas {
817b725ae77Skettenis struct symtab *symtab = NULL;
818b725ae77Skettenis struct blockvector *blockvector;
819b725ae77Skettenis struct subfile *subfile;
820b725ae77Skettenis struct context_stack *cstk;
821e93f7393Sniklas struct subfile *nextsub;
822e93f7393Sniklas
823b725ae77Skettenis /* Finish the lexical context of the last function in the file; pop
824b725ae77Skettenis the context stack. */
825e93f7393Sniklas
826e93f7393Sniklas if (context_stack_depth > 0)
827e93f7393Sniklas {
828e93f7393Sniklas cstk = pop_context ();
829e93f7393Sniklas /* Make a block for the local symbols within. */
830e93f7393Sniklas finish_block (cstk->name, &local_symbols, cstk->old_blocks,
831e93f7393Sniklas cstk->start_addr, end_addr, objfile);
832e93f7393Sniklas
833e93f7393Sniklas if (context_stack_depth > 0)
834e93f7393Sniklas {
835b725ae77Skettenis /* This is said to happen with SCO. The old coffread.c
836b725ae77Skettenis code simply emptied the context stack, so we do the
837b725ae77Skettenis same. FIXME: Find out why it is happening. This is not
838b725ae77Skettenis believed to happen in most cases (even for coffread.c);
839b725ae77Skettenis it used to be an abort(). */
840b725ae77Skettenis complaint (&symfile_complaints,
841b725ae77Skettenis "Context stack not empty in end_symtab");
842e93f7393Sniklas context_stack_depth = 0;
843e93f7393Sniklas }
844e93f7393Sniklas }
845e93f7393Sniklas
846e93f7393Sniklas /* Reordered executables may have out of order pending blocks; if
847e93f7393Sniklas OBJF_REORDERED is true, then sort the pending blocks. */
848e93f7393Sniklas if ((objfile->flags & OBJF_REORDERED) && pending_blocks)
849e93f7393Sniklas {
850b725ae77Skettenis /* FIXME! Remove this horrid bubble sort and use merge sort!!! */
851e93f7393Sniklas int swapped;
852e93f7393Sniklas do
853e93f7393Sniklas {
854e93f7393Sniklas struct pending_block *pb, *pbnext;
855e93f7393Sniklas
856e93f7393Sniklas pb = pending_blocks;
857e93f7393Sniklas pbnext = pb->next;
858e93f7393Sniklas swapped = 0;
859e93f7393Sniklas
860e93f7393Sniklas while (pbnext)
861e93f7393Sniklas {
862e93f7393Sniklas /* swap blocks if unordered! */
863e93f7393Sniklas
864e93f7393Sniklas if (BLOCK_START (pb->block) < BLOCK_START (pbnext->block))
865e93f7393Sniklas {
866e93f7393Sniklas struct block *tmp = pb->block;
867e93f7393Sniklas pb->block = pbnext->block;
868e93f7393Sniklas pbnext->block = tmp;
869e93f7393Sniklas swapped = 1;
870e93f7393Sniklas }
871e93f7393Sniklas pb = pbnext;
872e93f7393Sniklas pbnext = pbnext->next;
873e93f7393Sniklas }
874b725ae77Skettenis }
875b725ae77Skettenis while (swapped);
876e93f7393Sniklas }
877e93f7393Sniklas
878e93f7393Sniklas /* Cleanup any undefined types that have been left hanging around
879e93f7393Sniklas (this needs to be done before the finish_blocks so that
880e93f7393Sniklas file_symbols is still good).
881e93f7393Sniklas
882e93f7393Sniklas Both cleanup_undefined_types and finish_global_stabs are stabs
883e93f7393Sniklas specific, but harmless for other symbol readers, since on gdb
884e93f7393Sniklas startup or when finished reading stabs, the state is set so these
885e93f7393Sniklas are no-ops. FIXME: Is this handled right in case of QUIT? Can
886e93f7393Sniklas we make this cleaner? */
887e93f7393Sniklas
888e93f7393Sniklas cleanup_undefined_types ();
889e93f7393Sniklas finish_global_stabs (objfile);
890e93f7393Sniklas
891e93f7393Sniklas if (pending_blocks == NULL
892e93f7393Sniklas && file_symbols == NULL
893b725ae77Skettenis && global_symbols == NULL
894b725ae77Skettenis && have_line_numbers == 0
895b725ae77Skettenis && pending_macros == NULL)
896e93f7393Sniklas {
897b725ae77Skettenis /* Ignore symtabs that have no functions with real debugging
898b725ae77Skettenis info. */
899e93f7393Sniklas blockvector = NULL;
900e93f7393Sniklas }
901e93f7393Sniklas else
902e93f7393Sniklas {
903b725ae77Skettenis /* Define the STATIC_BLOCK & GLOBAL_BLOCK, and build the
904b725ae77Skettenis blockvector. */
905e93f7393Sniklas finish_block (0, &file_symbols, 0, last_source_start_addr, end_addr,
906e93f7393Sniklas objfile);
907e93f7393Sniklas finish_block (0, &global_symbols, 0, last_source_start_addr, end_addr,
908e93f7393Sniklas objfile);
909e93f7393Sniklas blockvector = make_blockvector (objfile);
910b725ae77Skettenis cp_finalize_namespace (BLOCKVECTOR_BLOCK (blockvector, STATIC_BLOCK),
911b725ae77Skettenis &objfile->objfile_obstack);
912e93f7393Sniklas }
913e93f7393Sniklas
914b725ae77Skettenis #ifndef PROCESS_LINENUMBER_HOOK
915b725ae77Skettenis #define PROCESS_LINENUMBER_HOOK()
916e93f7393Sniklas #endif
917b725ae77Skettenis PROCESS_LINENUMBER_HOOK (); /* Needed for xcoff. */
918e93f7393Sniklas
919e93f7393Sniklas /* Now create the symtab objects proper, one for each subfile. */
920e93f7393Sniklas /* (The main file is the last one on the chain.) */
921e93f7393Sniklas
922e93f7393Sniklas for (subfile = subfiles; subfile; subfile = nextsub)
923e93f7393Sniklas {
924e93f7393Sniklas int linetablesize = 0;
925e93f7393Sniklas symtab = NULL;
926b725ae77Skettenis
927b725ae77Skettenis /* If we have blocks of symbols, make a symtab. Otherwise, just
928b725ae77Skettenis ignore this file and any line number info in it. */
929e93f7393Sniklas if (blockvector)
930e93f7393Sniklas {
931e93f7393Sniklas if (subfile->line_vector)
932e93f7393Sniklas {
933e93f7393Sniklas linetablesize = sizeof (struct linetable) +
934e93f7393Sniklas subfile->line_vector->nitems * sizeof (struct linetable_entry);
935e93f7393Sniklas #if 0
936b725ae77Skettenis /* I think this is artifact from before it went on the
937b725ae77Skettenis obstack. I doubt we'll need the memory between now
938b725ae77Skettenis and when we free it later in this function. */
939e93f7393Sniklas /* First, shrink the linetable to make more memory. */
940e93f7393Sniklas subfile->line_vector = (struct linetable *)
941e93f7393Sniklas xrealloc ((char *) subfile->line_vector, linetablesize);
942e93f7393Sniklas #endif
943e93f7393Sniklas
944b725ae77Skettenis /* Like the pending blocks, the line table may be
945b725ae77Skettenis scrambled in reordered executables. Sort it if
946b725ae77Skettenis OBJF_REORDERED is true. */
947e93f7393Sniklas if (objfile->flags & OBJF_REORDERED)
948e93f7393Sniklas qsort (subfile->line_vector->item,
949e93f7393Sniklas subfile->line_vector->nitems,
950e93f7393Sniklas sizeof (struct linetable_entry), compare_line_numbers);
951e93f7393Sniklas }
952e93f7393Sniklas
953e93f7393Sniklas /* Now, allocate a symbol table. */
954e93f7393Sniklas symtab = allocate_symtab (subfile->name, objfile);
955e93f7393Sniklas
956e93f7393Sniklas /* Fill in its components. */
957e93f7393Sniklas symtab->blockvector = blockvector;
958b725ae77Skettenis symtab->macro_table = pending_macros;
959e93f7393Sniklas if (subfile->line_vector)
960e93f7393Sniklas {
961e93f7393Sniklas /* Reallocate the line table on the symbol obstack */
962e93f7393Sniklas symtab->linetable = (struct linetable *)
963b725ae77Skettenis obstack_alloc (&objfile->objfile_obstack, linetablesize);
964e93f7393Sniklas memcpy (symtab->linetable, subfile->line_vector, linetablesize);
965e93f7393Sniklas }
966e93f7393Sniklas else
967e93f7393Sniklas {
968e93f7393Sniklas symtab->linetable = NULL;
969e93f7393Sniklas }
970e93f7393Sniklas symtab->block_line_section = section;
971e93f7393Sniklas if (subfile->dirname)
972e93f7393Sniklas {
973e93f7393Sniklas /* Reallocate the dirname on the symbol obstack */
974e93f7393Sniklas symtab->dirname = (char *)
975b725ae77Skettenis obstack_alloc (&objfile->objfile_obstack,
976e93f7393Sniklas strlen (subfile->dirname) + 1);
977e93f7393Sniklas strcpy (symtab->dirname, subfile->dirname);
978e93f7393Sniklas }
979e93f7393Sniklas else
980e93f7393Sniklas {
981e93f7393Sniklas symtab->dirname = NULL;
982e93f7393Sniklas }
983e93f7393Sniklas symtab->free_code = free_linetable;
984b725ae77Skettenis symtab->free_func = NULL;
985e93f7393Sniklas
986b725ae77Skettenis /* Use whatever language we have been using for this
987b725ae77Skettenis subfile, not the one that was deduced in allocate_symtab
988b725ae77Skettenis from the filename. We already did our own deducing when
989b725ae77Skettenis we created the subfile, and we may have altered our
990b725ae77Skettenis opinion of what language it is from things we found in
991b725ae77Skettenis the symbols. */
992e93f7393Sniklas symtab->language = subfile->language;
993e93f7393Sniklas
994b725ae77Skettenis /* Save the debug format string (if any) in the symtab */
995b725ae77Skettenis if (subfile->debugformat != NULL)
996b725ae77Skettenis {
997b725ae77Skettenis symtab->debugformat = obsavestring (subfile->debugformat,
998b725ae77Skettenis strlen (subfile->debugformat),
999b725ae77Skettenis &objfile->objfile_obstack);
1000b725ae77Skettenis }
1001b725ae77Skettenis
1002e93f7393Sniklas /* All symtabs for the main file and the subfiles share a
1003b725ae77Skettenis blockvector, so we need to clear primary for everything
1004b725ae77Skettenis but the main file. */
1005e93f7393Sniklas
1006e93f7393Sniklas symtab->primary = 0;
1007e93f7393Sniklas }
1008e93f7393Sniklas if (subfile->name != NULL)
1009e93f7393Sniklas {
1010b725ae77Skettenis xfree ((void *) subfile->name);
1011e93f7393Sniklas }
1012e93f7393Sniklas if (subfile->dirname != NULL)
1013e93f7393Sniklas {
1014b725ae77Skettenis xfree ((void *) subfile->dirname);
1015e93f7393Sniklas }
1016e93f7393Sniklas if (subfile->line_vector != NULL)
1017e93f7393Sniklas {
1018b725ae77Skettenis xfree ((void *) subfile->line_vector);
1019b725ae77Skettenis }
1020b725ae77Skettenis if (subfile->debugformat != NULL)
1021b725ae77Skettenis {
1022b725ae77Skettenis xfree ((void *) subfile->debugformat);
1023e93f7393Sniklas }
1024e93f7393Sniklas
1025e93f7393Sniklas nextsub = subfile->next;
1026b725ae77Skettenis xfree ((void *) subfile);
1027e93f7393Sniklas }
1028e93f7393Sniklas
1029e93f7393Sniklas /* Set this for the main source file. */
1030e93f7393Sniklas if (symtab)
1031e93f7393Sniklas {
1032e93f7393Sniklas symtab->primary = 1;
1033e93f7393Sniklas }
1034e93f7393Sniklas
1035e93f7393Sniklas last_source_file = NULL;
1036e93f7393Sniklas current_subfile = NULL;
1037b725ae77Skettenis pending_macros = NULL;
1038e93f7393Sniklas
1039b725ae77Skettenis return symtab;
1040e93f7393Sniklas }
1041e93f7393Sniklas
1042b725ae77Skettenis /* Push a context block. Args are an identifying nesting level
1043b725ae77Skettenis (checkable when you pop it), and the starting PC address of this
1044b725ae77Skettenis context. */
1045e93f7393Sniklas
1046e93f7393Sniklas struct context_stack *
push_context(int desc,CORE_ADDR valu)1047b725ae77Skettenis push_context (int desc, CORE_ADDR valu)
1048e93f7393Sniklas {
1049b725ae77Skettenis struct context_stack *new;
1050e93f7393Sniklas
1051e93f7393Sniklas if (context_stack_depth == context_stack_size)
1052e93f7393Sniklas {
1053e93f7393Sniklas context_stack_size *= 2;
1054e93f7393Sniklas context_stack = (struct context_stack *)
1055e93f7393Sniklas xrealloc ((char *) context_stack,
1056e93f7393Sniklas (context_stack_size * sizeof (struct context_stack)));
1057e93f7393Sniklas }
1058e93f7393Sniklas
1059e93f7393Sniklas new = &context_stack[context_stack_depth++];
1060e93f7393Sniklas new->depth = desc;
1061e93f7393Sniklas new->locals = local_symbols;
1062b725ae77Skettenis new->params = param_symbols;
1063e93f7393Sniklas new->old_blocks = pending_blocks;
1064e93f7393Sniklas new->start_addr = valu;
1065e93f7393Sniklas new->name = NULL;
1066e93f7393Sniklas
1067e93f7393Sniklas local_symbols = NULL;
1068b725ae77Skettenis param_symbols = NULL;
1069e93f7393Sniklas
1070b725ae77Skettenis return new;
1071b725ae77Skettenis }
1072b725ae77Skettenis
1073b725ae77Skettenis /* Pop a context block. Returns the address of the context block just
1074b725ae77Skettenis popped. */
1075b725ae77Skettenis
1076b725ae77Skettenis struct context_stack *
pop_context(void)1077b725ae77Skettenis pop_context (void)
1078b725ae77Skettenis {
1079b725ae77Skettenis gdb_assert (context_stack_depth > 0);
1080b725ae77Skettenis return (&context_stack[--context_stack_depth]);
1081e93f7393Sniklas }
1082e93f7393Sniklas
1083e93f7393Sniklas
1084b725ae77Skettenis
1085e93f7393Sniklas /* Compute a small integer hash code for the given name. */
1086e93f7393Sniklas
1087e93f7393Sniklas int
hashname(char * name)1088b725ae77Skettenis hashname (char *name)
1089e93f7393Sniklas {
1090b725ae77Skettenis return (hash(name,strlen(name)) % HASHSIZE);
1091e93f7393Sniklas }
1092e93f7393Sniklas
1093e93f7393Sniklas
1094e93f7393Sniklas void
record_debugformat(char * format)1095b725ae77Skettenis record_debugformat (char *format)
1096b725ae77Skettenis {
1097b725ae77Skettenis current_subfile->debugformat = savestring (format, strlen (format));
1098b725ae77Skettenis }
1099b725ae77Skettenis
1100b725ae77Skettenis /* Merge the first symbol list SRCLIST into the second symbol list
1101b725ae77Skettenis TARGETLIST by repeated calls to add_symbol_to_list(). This
1102b725ae77Skettenis procedure "frees" each link of SRCLIST by adding it to the
1103b725ae77Skettenis free_pendings list. Caller must set SRCLIST to a null list after
1104b725ae77Skettenis calling this function.
1105b725ae77Skettenis
1106b725ae77Skettenis Void return. */
1107b725ae77Skettenis
1108b725ae77Skettenis void
merge_symbol_lists(struct pending ** srclist,struct pending ** targetlist)1109b725ae77Skettenis merge_symbol_lists (struct pending **srclist, struct pending **targetlist)
1110b725ae77Skettenis {
1111b725ae77Skettenis int i;
1112b725ae77Skettenis
1113b725ae77Skettenis if (!srclist || !*srclist)
1114b725ae77Skettenis return;
1115b725ae77Skettenis
1116b725ae77Skettenis /* Merge in elements from current link. */
1117b725ae77Skettenis for (i = 0; i < (*srclist)->nsyms; i++)
1118b725ae77Skettenis add_symbol_to_list ((*srclist)->symbol[i], targetlist);
1119b725ae77Skettenis
1120b725ae77Skettenis /* Recurse on next. */
1121b725ae77Skettenis merge_symbol_lists (&(*srclist)->next, targetlist);
1122b725ae77Skettenis
1123b725ae77Skettenis /* "Free" the current link. */
1124b725ae77Skettenis (*srclist)->next = free_pendings;
1125b725ae77Skettenis free_pendings = (*srclist);
1126b725ae77Skettenis }
1127b725ae77Skettenis
1128b725ae77Skettenis /* Initialize anything that needs initializing when starting to read a
1129b725ae77Skettenis fresh piece of a symbol file, e.g. reading in the stuff
1130b725ae77Skettenis corresponding to a psymtab. */
1131b725ae77Skettenis
1132b725ae77Skettenis void
buildsym_init(void)1133b725ae77Skettenis buildsym_init (void)
1134e93f7393Sniklas {
1135e93f7393Sniklas free_pendings = NULL;
1136e93f7393Sniklas file_symbols = NULL;
1137e93f7393Sniklas global_symbols = NULL;
1138e93f7393Sniklas pending_blocks = NULL;
1139b725ae77Skettenis pending_macros = NULL;
1140e93f7393Sniklas }
1141e93f7393Sniklas
1142e93f7393Sniklas /* Initialize anything that needs initializing when a completely new
1143e93f7393Sniklas symbol file is specified (not just adding some symbols from another
1144e93f7393Sniklas file, e.g. a shared library). */
1145e93f7393Sniklas
1146e93f7393Sniklas void
buildsym_new_init(void)1147b725ae77Skettenis buildsym_new_init (void)
1148e93f7393Sniklas {
1149e93f7393Sniklas buildsym_init ();
1150e93f7393Sniklas }
1151