xref: /openbsd-src/gnu/usr.bin/binutils/gdb/buildsym.c (revision 63addd46c1e40ca0f49488ddcdc4ab598023b0c1)
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