xref: /dflybsd-src/contrib/gdb-7/gdb/psymtab.c (revision cf7f2e2d389e8012d562650bd94d7e433f449d6e)
1*cf7f2e2dSJohn Marino /* Partial symbol tables.
2*cf7f2e2dSJohn Marino 
3*cf7f2e2dSJohn Marino    Copyright (C) 2009, 2010 Free Software Foundation, Inc.
4*cf7f2e2dSJohn Marino 
5*cf7f2e2dSJohn Marino    This file is part of GDB.
6*cf7f2e2dSJohn Marino 
7*cf7f2e2dSJohn Marino    This program is free software; you can redistribute it and/or modify
8*cf7f2e2dSJohn Marino    it under the terms of the GNU General Public License as published by
9*cf7f2e2dSJohn Marino    the Free Software Foundation; either version 3 of the License, or
10*cf7f2e2dSJohn Marino    (at your option) any later version.
11*cf7f2e2dSJohn Marino 
12*cf7f2e2dSJohn Marino    This program is distributed in the hope that it will be useful,
13*cf7f2e2dSJohn Marino    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*cf7f2e2dSJohn Marino    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*cf7f2e2dSJohn Marino    GNU General Public License for more details.
16*cf7f2e2dSJohn Marino 
17*cf7f2e2dSJohn Marino    You should have received a copy of the GNU General Public License
18*cf7f2e2dSJohn Marino    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19*cf7f2e2dSJohn Marino 
20*cf7f2e2dSJohn Marino #include "defs.h"
21*cf7f2e2dSJohn Marino #include "symtab.h"
22*cf7f2e2dSJohn Marino #include "psympriv.h"
23*cf7f2e2dSJohn Marino #include "objfiles.h"
24*cf7f2e2dSJohn Marino #include "gdb_assert.h"
25*cf7f2e2dSJohn Marino #include "block.h"
26*cf7f2e2dSJohn Marino #include "filenames.h"
27*cf7f2e2dSJohn Marino #include "source.h"
28*cf7f2e2dSJohn Marino #include "addrmap.h"
29*cf7f2e2dSJohn Marino #include "gdbtypes.h"
30*cf7f2e2dSJohn Marino #include "bcache.h"
31*cf7f2e2dSJohn Marino #include "ui-out.h"
32*cf7f2e2dSJohn Marino #include "command.h"
33*cf7f2e2dSJohn Marino #include "readline/readline.h"
34*cf7f2e2dSJohn Marino #include "gdb_regex.h"
35*cf7f2e2dSJohn Marino 
36*cf7f2e2dSJohn Marino #ifndef DEV_TTY
37*cf7f2e2dSJohn Marino #define DEV_TTY "/dev/tty"
38*cf7f2e2dSJohn Marino #endif
39*cf7f2e2dSJohn Marino 
40*cf7f2e2dSJohn Marino /* A fast way to get from a psymtab to its symtab (after the first time).  */
41*cf7f2e2dSJohn Marino #define PSYMTAB_TO_SYMTAB(pst)  \
42*cf7f2e2dSJohn Marino     ((pst) -> symtab != NULL ? (pst) -> symtab : psymtab_to_symtab (pst))
43*cf7f2e2dSJohn Marino 
44*cf7f2e2dSJohn Marino /* Lookup a partial symbol.  */
45*cf7f2e2dSJohn Marino static struct partial_symbol *lookup_partial_symbol (struct partial_symtab *,
46*cf7f2e2dSJohn Marino 						     const char *, int,
47*cf7f2e2dSJohn Marino 						     domain_enum);
48*cf7f2e2dSJohn Marino 
49*cf7f2e2dSJohn Marino static char *psymtab_to_fullname (struct partial_symtab *ps);
50*cf7f2e2dSJohn Marino 
51*cf7f2e2dSJohn Marino static struct partial_symbol *find_pc_sect_psymbol (struct partial_symtab *,
52*cf7f2e2dSJohn Marino 						    CORE_ADDR,
53*cf7f2e2dSJohn Marino 						    struct obj_section *);
54*cf7f2e2dSJohn Marino 
55*cf7f2e2dSJohn Marino static struct partial_symbol *fixup_psymbol_section (struct partial_symbol
56*cf7f2e2dSJohn Marino 						     *psym,
57*cf7f2e2dSJohn Marino 						     struct objfile *objfile);
58*cf7f2e2dSJohn Marino 
59*cf7f2e2dSJohn Marino static struct symtab *psymtab_to_symtab (struct partial_symtab *pst);
60*cf7f2e2dSJohn Marino 
61*cf7f2e2dSJohn Marino /* Lookup the partial symbol table of a source file named NAME.
62*cf7f2e2dSJohn Marino    *If* there is no '/' in the name, a match after a '/'
63*cf7f2e2dSJohn Marino    in the psymtab filename will also work.  */
64*cf7f2e2dSJohn Marino 
65*cf7f2e2dSJohn Marino static struct partial_symtab *
66*cf7f2e2dSJohn Marino lookup_partial_symtab (struct objfile *objfile, const char *name,
67*cf7f2e2dSJohn Marino 		       const char *full_path, const char *real_path)
68*cf7f2e2dSJohn Marino {
69*cf7f2e2dSJohn Marino   struct partial_symtab *pst;
70*cf7f2e2dSJohn Marino 
71*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, pst)
72*cf7f2e2dSJohn Marino   {
73*cf7f2e2dSJohn Marino     if (FILENAME_CMP (name, pst->filename) == 0)
74*cf7f2e2dSJohn Marino       {
75*cf7f2e2dSJohn Marino 	return (pst);
76*cf7f2e2dSJohn Marino       }
77*cf7f2e2dSJohn Marino 
78*cf7f2e2dSJohn Marino     /* If the user gave us an absolute path, try to find the file in
79*cf7f2e2dSJohn Marino        this symtab and use its absolute path.  */
80*cf7f2e2dSJohn Marino     if (full_path != NULL)
81*cf7f2e2dSJohn Marino       {
82*cf7f2e2dSJohn Marino 	psymtab_to_fullname (pst);
83*cf7f2e2dSJohn Marino 	if (pst->fullname != NULL
84*cf7f2e2dSJohn Marino 	    && FILENAME_CMP (full_path, pst->fullname) == 0)
85*cf7f2e2dSJohn Marino 	  {
86*cf7f2e2dSJohn Marino 	    return pst;
87*cf7f2e2dSJohn Marino 	  }
88*cf7f2e2dSJohn Marino       }
89*cf7f2e2dSJohn Marino 
90*cf7f2e2dSJohn Marino     if (real_path != NULL)
91*cf7f2e2dSJohn Marino       {
92*cf7f2e2dSJohn Marino         char *rp = NULL;
93*cf7f2e2dSJohn Marino 	psymtab_to_fullname (pst);
94*cf7f2e2dSJohn Marino         if (pst->fullname != NULL)
95*cf7f2e2dSJohn Marino           {
96*cf7f2e2dSJohn Marino             rp = gdb_realpath (pst->fullname);
97*cf7f2e2dSJohn Marino             make_cleanup (xfree, rp);
98*cf7f2e2dSJohn Marino           }
99*cf7f2e2dSJohn Marino 	if (rp != NULL && FILENAME_CMP (real_path, rp) == 0)
100*cf7f2e2dSJohn Marino 	  {
101*cf7f2e2dSJohn Marino 	    return pst;
102*cf7f2e2dSJohn Marino 	  }
103*cf7f2e2dSJohn Marino       }
104*cf7f2e2dSJohn Marino   }
105*cf7f2e2dSJohn Marino 
106*cf7f2e2dSJohn Marino   /* Now, search for a matching tail (only if name doesn't have any dirs) */
107*cf7f2e2dSJohn Marino 
108*cf7f2e2dSJohn Marino   if (lbasename (name) == name)
109*cf7f2e2dSJohn Marino     ALL_OBJFILE_PSYMTABS (objfile, pst)
110*cf7f2e2dSJohn Marino     {
111*cf7f2e2dSJohn Marino       if (FILENAME_CMP (lbasename (pst->filename), name) == 0)
112*cf7f2e2dSJohn Marino 	return (pst);
113*cf7f2e2dSJohn Marino     }
114*cf7f2e2dSJohn Marino 
115*cf7f2e2dSJohn Marino   return (NULL);
116*cf7f2e2dSJohn Marino }
117*cf7f2e2dSJohn Marino 
118*cf7f2e2dSJohn Marino static int
119*cf7f2e2dSJohn Marino lookup_symtab_via_partial_symtab (struct objfile *objfile, const char *name,
120*cf7f2e2dSJohn Marino 				  const char *full_path, const char *real_path,
121*cf7f2e2dSJohn Marino 				  struct symtab **result)
122*cf7f2e2dSJohn Marino {
123*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
124*cf7f2e2dSJohn Marino 
125*cf7f2e2dSJohn Marino   ps = lookup_partial_symtab (objfile, name, full_path, real_path);
126*cf7f2e2dSJohn Marino   if (!ps)
127*cf7f2e2dSJohn Marino     return 0;
128*cf7f2e2dSJohn Marino 
129*cf7f2e2dSJohn Marino   if (ps->readin)
130*cf7f2e2dSJohn Marino     error (_("Internal: readin %s pst for `%s' found when no symtab found."),
131*cf7f2e2dSJohn Marino 	   ps->filename, name);
132*cf7f2e2dSJohn Marino 
133*cf7f2e2dSJohn Marino   *result = PSYMTAB_TO_SYMTAB (ps);
134*cf7f2e2dSJohn Marino   return 1;
135*cf7f2e2dSJohn Marino }
136*cf7f2e2dSJohn Marino 
137*cf7f2e2dSJohn Marino /* Find which partial symtab contains PC and SECTION starting at psymtab PST.
138*cf7f2e2dSJohn Marino    We may find a different psymtab than PST.  See FIND_PC_SECT_PSYMTAB.  */
139*cf7f2e2dSJohn Marino 
140*cf7f2e2dSJohn Marino static struct partial_symtab *
141*cf7f2e2dSJohn Marino find_pc_sect_psymtab_closer (CORE_ADDR pc, struct obj_section *section,
142*cf7f2e2dSJohn Marino 			     struct partial_symtab *pst,
143*cf7f2e2dSJohn Marino 			     struct minimal_symbol *msymbol)
144*cf7f2e2dSJohn Marino {
145*cf7f2e2dSJohn Marino   struct objfile *objfile = pst->objfile;
146*cf7f2e2dSJohn Marino   struct partial_symtab *tpst;
147*cf7f2e2dSJohn Marino   struct partial_symtab *best_pst = pst;
148*cf7f2e2dSJohn Marino   CORE_ADDR best_addr = pst->textlow;
149*cf7f2e2dSJohn Marino 
150*cf7f2e2dSJohn Marino   /* An objfile that has its functions reordered might have
151*cf7f2e2dSJohn Marino      many partial symbol tables containing the PC, but
152*cf7f2e2dSJohn Marino      we want the partial symbol table that contains the
153*cf7f2e2dSJohn Marino      function containing the PC.  */
154*cf7f2e2dSJohn Marino   if (!(objfile->flags & OBJF_REORDERED) &&
155*cf7f2e2dSJohn Marino       section == 0)	/* can't validate section this way */
156*cf7f2e2dSJohn Marino     return pst;
157*cf7f2e2dSJohn Marino 
158*cf7f2e2dSJohn Marino   if (msymbol == NULL)
159*cf7f2e2dSJohn Marino     return (pst);
160*cf7f2e2dSJohn Marino 
161*cf7f2e2dSJohn Marino   /* The code range of partial symtabs sometimes overlap, so, in
162*cf7f2e2dSJohn Marino      the loop below, we need to check all partial symtabs and
163*cf7f2e2dSJohn Marino      find the one that fits better for the given PC address. We
164*cf7f2e2dSJohn Marino      select the partial symtab that contains a symbol whose
165*cf7f2e2dSJohn Marino      address is closest to the PC address.  By closest we mean
166*cf7f2e2dSJohn Marino      that find_pc_sect_symbol returns the symbol with address
167*cf7f2e2dSJohn Marino      that is closest and still less than the given PC.  */
168*cf7f2e2dSJohn Marino   for (tpst = pst; tpst != NULL; tpst = tpst->next)
169*cf7f2e2dSJohn Marino     {
170*cf7f2e2dSJohn Marino       if (pc >= tpst->textlow && pc < tpst->texthigh)
171*cf7f2e2dSJohn Marino 	{
172*cf7f2e2dSJohn Marino 	  struct partial_symbol *p;
173*cf7f2e2dSJohn Marino 	  CORE_ADDR this_addr;
174*cf7f2e2dSJohn Marino 
175*cf7f2e2dSJohn Marino 	  /* NOTE: This assumes that every psymbol has a
176*cf7f2e2dSJohn Marino 	     corresponding msymbol, which is not necessarily
177*cf7f2e2dSJohn Marino 	     true; the debug info might be much richer than the
178*cf7f2e2dSJohn Marino 	     object's symbol table.  */
179*cf7f2e2dSJohn Marino 	  p = find_pc_sect_psymbol (tpst, pc, section);
180*cf7f2e2dSJohn Marino 	  if (p != NULL
181*cf7f2e2dSJohn Marino 	      && SYMBOL_VALUE_ADDRESS (p)
182*cf7f2e2dSJohn Marino 	      == SYMBOL_VALUE_ADDRESS (msymbol))
183*cf7f2e2dSJohn Marino 	    return tpst;
184*cf7f2e2dSJohn Marino 
185*cf7f2e2dSJohn Marino 	  /* Also accept the textlow value of a psymtab as a
186*cf7f2e2dSJohn Marino 	     "symbol", to provide some support for partial
187*cf7f2e2dSJohn Marino 	     symbol tables with line information but no debug
188*cf7f2e2dSJohn Marino 	     symbols (e.g. those produced by an assembler).  */
189*cf7f2e2dSJohn Marino 	  if (p != NULL)
190*cf7f2e2dSJohn Marino 	    this_addr = SYMBOL_VALUE_ADDRESS (p);
191*cf7f2e2dSJohn Marino 	  else
192*cf7f2e2dSJohn Marino 	    this_addr = tpst->textlow;
193*cf7f2e2dSJohn Marino 
194*cf7f2e2dSJohn Marino 	  /* Check whether it is closer than our current
195*cf7f2e2dSJohn Marino 	     BEST_ADDR.  Since this symbol address is
196*cf7f2e2dSJohn Marino 	     necessarily lower or equal to PC, the symbol closer
197*cf7f2e2dSJohn Marino 	     to PC is the symbol which address is the highest.
198*cf7f2e2dSJohn Marino 	     This way we return the psymtab which contains such
199*cf7f2e2dSJohn Marino 	     best match symbol. This can help in cases where the
200*cf7f2e2dSJohn Marino 	     symbol information/debuginfo is not complete, like
201*cf7f2e2dSJohn Marino 	     for instance on IRIX6 with gcc, where no debug info
202*cf7f2e2dSJohn Marino 	     is emitted for statics. (See also the nodebug.exp
203*cf7f2e2dSJohn Marino 	     testcase.) */
204*cf7f2e2dSJohn Marino 	  if (this_addr > best_addr)
205*cf7f2e2dSJohn Marino 	    {
206*cf7f2e2dSJohn Marino 	      best_addr = this_addr;
207*cf7f2e2dSJohn Marino 	      best_pst = tpst;
208*cf7f2e2dSJohn Marino 	    }
209*cf7f2e2dSJohn Marino 	}
210*cf7f2e2dSJohn Marino     }
211*cf7f2e2dSJohn Marino   return best_pst;
212*cf7f2e2dSJohn Marino }
213*cf7f2e2dSJohn Marino 
214*cf7f2e2dSJohn Marino /* Find which partial symtab contains PC and SECTION.  Return 0 if
215*cf7f2e2dSJohn Marino    none.  We return the psymtab that contains a symbol whose address
216*cf7f2e2dSJohn Marino    exactly matches PC, or, if we cannot find an exact match, the
217*cf7f2e2dSJohn Marino    psymtab that contains a symbol whose address is closest to PC.  */
218*cf7f2e2dSJohn Marino static struct partial_symtab *
219*cf7f2e2dSJohn Marino find_pc_sect_psymtab (struct objfile *objfile, CORE_ADDR pc,
220*cf7f2e2dSJohn Marino 		      struct obj_section *section,
221*cf7f2e2dSJohn Marino 		      struct minimal_symbol *msymbol)
222*cf7f2e2dSJohn Marino {
223*cf7f2e2dSJohn Marino   struct partial_symtab *pst;
224*cf7f2e2dSJohn Marino 
225*cf7f2e2dSJohn Marino   /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity
226*cf7f2e2dSJohn Marino      than the later used TEXTLOW/TEXTHIGH one.  */
227*cf7f2e2dSJohn Marino 
228*cf7f2e2dSJohn Marino   if (objfile->psymtabs_addrmap != NULL)
229*cf7f2e2dSJohn Marino     {
230*cf7f2e2dSJohn Marino       pst = addrmap_find (objfile->psymtabs_addrmap, pc);
231*cf7f2e2dSJohn Marino       if (pst != NULL)
232*cf7f2e2dSJohn Marino 	{
233*cf7f2e2dSJohn Marino 	  /* FIXME: addrmaps currently do not handle overlayed sections,
234*cf7f2e2dSJohn Marino 	     so fall back to the non-addrmap case if we're debugging
235*cf7f2e2dSJohn Marino 	     overlays and the addrmap returned the wrong section.  */
236*cf7f2e2dSJohn Marino 	  if (overlay_debugging && msymbol && section)
237*cf7f2e2dSJohn Marino 	    {
238*cf7f2e2dSJohn Marino 	      struct partial_symbol *p;
239*cf7f2e2dSJohn Marino 
240*cf7f2e2dSJohn Marino 	      /* NOTE: This assumes that every psymbol has a
241*cf7f2e2dSJohn Marino 		 corresponding msymbol, which is not necessarily
242*cf7f2e2dSJohn Marino 		 true; the debug info might be much richer than the
243*cf7f2e2dSJohn Marino 		 object's symbol table.  */
244*cf7f2e2dSJohn Marino 	      p = find_pc_sect_psymbol (pst, pc, section);
245*cf7f2e2dSJohn Marino 	      if (!p
246*cf7f2e2dSJohn Marino 		  || SYMBOL_VALUE_ADDRESS (p)
247*cf7f2e2dSJohn Marino 		  != SYMBOL_VALUE_ADDRESS (msymbol))
248*cf7f2e2dSJohn Marino 		goto next;
249*cf7f2e2dSJohn Marino 	    }
250*cf7f2e2dSJohn Marino 
251*cf7f2e2dSJohn Marino 	  /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as
252*cf7f2e2dSJohn Marino 	     PSYMTABS_ADDRMAP we used has already the best 1-byte
253*cf7f2e2dSJohn Marino 	     granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into
254*cf7f2e2dSJohn Marino 	     a worse chosen section due to the TEXTLOW/TEXTHIGH ranges
255*cf7f2e2dSJohn Marino 	     overlap.  */
256*cf7f2e2dSJohn Marino 
257*cf7f2e2dSJohn Marino 	  return pst;
258*cf7f2e2dSJohn Marino 	}
259*cf7f2e2dSJohn Marino     }
260*cf7f2e2dSJohn Marino 
261*cf7f2e2dSJohn Marino  next:
262*cf7f2e2dSJohn Marino 
263*cf7f2e2dSJohn Marino   /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs
264*cf7f2e2dSJohn Marino      which still have no corresponding full SYMTABs read.  But it is not
265*cf7f2e2dSJohn Marino      present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB
266*cf7f2e2dSJohn Marino      so far.  */
267*cf7f2e2dSJohn Marino 
268*cf7f2e2dSJohn Marino   /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of
269*cf7f2e2dSJohn Marino      its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying
270*cf7f2e2dSJohn Marino      debug info type in single OBJFILE.  */
271*cf7f2e2dSJohn Marino 
272*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, pst)
273*cf7f2e2dSJohn Marino     if (pc >= pst->textlow && pc < pst->texthigh)
274*cf7f2e2dSJohn Marino       {
275*cf7f2e2dSJohn Marino 	struct partial_symtab *best_pst;
276*cf7f2e2dSJohn Marino 
277*cf7f2e2dSJohn Marino 	best_pst = find_pc_sect_psymtab_closer (pc, section, pst, msymbol);
278*cf7f2e2dSJohn Marino 	if (best_pst != NULL)
279*cf7f2e2dSJohn Marino 	  return best_pst;
280*cf7f2e2dSJohn Marino       }
281*cf7f2e2dSJohn Marino 
282*cf7f2e2dSJohn Marino   return NULL;
283*cf7f2e2dSJohn Marino }
284*cf7f2e2dSJohn Marino 
285*cf7f2e2dSJohn Marino static struct symtab *
286*cf7f2e2dSJohn Marino find_pc_sect_symtab_from_partial (struct objfile *objfile,
287*cf7f2e2dSJohn Marino 				  struct minimal_symbol *msymbol,
288*cf7f2e2dSJohn Marino 				  CORE_ADDR pc, struct obj_section *section,
289*cf7f2e2dSJohn Marino 				  int warn_if_readin)
290*cf7f2e2dSJohn Marino {
291*cf7f2e2dSJohn Marino   struct partial_symtab *ps = find_pc_sect_psymtab (objfile, pc, section,
292*cf7f2e2dSJohn Marino 						    msymbol);
293*cf7f2e2dSJohn Marino   if (ps)
294*cf7f2e2dSJohn Marino     {
295*cf7f2e2dSJohn Marino       if (warn_if_readin && ps->readin)
296*cf7f2e2dSJohn Marino 	/* Might want to error() here (in case symtab is corrupt and
297*cf7f2e2dSJohn Marino 	   will cause a core dump), but maybe we can successfully
298*cf7f2e2dSJohn Marino 	   continue, so let's not.  */
299*cf7f2e2dSJohn Marino 	warning (_("\
300*cf7f2e2dSJohn Marino (Internal error: pc %s in read in psymtab, but not in symtab.)\n"),
301*cf7f2e2dSJohn Marino 		 paddress (get_objfile_arch (ps->objfile), pc));
302*cf7f2e2dSJohn Marino       return PSYMTAB_TO_SYMTAB (ps);
303*cf7f2e2dSJohn Marino     }
304*cf7f2e2dSJohn Marino   return NULL;
305*cf7f2e2dSJohn Marino }
306*cf7f2e2dSJohn Marino 
307*cf7f2e2dSJohn Marino /* Find which partial symbol within a psymtab matches PC and SECTION.
308*cf7f2e2dSJohn Marino    Return 0 if none.  */
309*cf7f2e2dSJohn Marino 
310*cf7f2e2dSJohn Marino static struct partial_symbol *
311*cf7f2e2dSJohn Marino find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
312*cf7f2e2dSJohn Marino 		      struct obj_section *section)
313*cf7f2e2dSJohn Marino {
314*cf7f2e2dSJohn Marino   struct partial_symbol *best = NULL, *p, **pp;
315*cf7f2e2dSJohn Marino   CORE_ADDR best_pc;
316*cf7f2e2dSJohn Marino 
317*cf7f2e2dSJohn Marino   gdb_assert (psymtab != NULL);
318*cf7f2e2dSJohn Marino 
319*cf7f2e2dSJohn Marino   /* Cope with programs that start at address 0 */
320*cf7f2e2dSJohn Marino   best_pc = (psymtab->textlow != 0) ? psymtab->textlow - 1 : 0;
321*cf7f2e2dSJohn Marino 
322*cf7f2e2dSJohn Marino   /* Search the global symbols as well as the static symbols, so that
323*cf7f2e2dSJohn Marino      find_pc_partial_function doesn't use a minimal symbol and thus
324*cf7f2e2dSJohn Marino      cache a bad endaddr.  */
325*cf7f2e2dSJohn Marino   for (pp = psymtab->objfile->global_psymbols.list + psymtab->globals_offset;
326*cf7f2e2dSJohn Marino     (pp - (psymtab->objfile->global_psymbols.list + psymtab->globals_offset)
327*cf7f2e2dSJohn Marino      < psymtab->n_global_syms);
328*cf7f2e2dSJohn Marino        pp++)
329*cf7f2e2dSJohn Marino     {
330*cf7f2e2dSJohn Marino       p = *pp;
331*cf7f2e2dSJohn Marino       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
332*cf7f2e2dSJohn Marino 	  && SYMBOL_CLASS (p) == LOC_BLOCK
333*cf7f2e2dSJohn Marino 	  && pc >= SYMBOL_VALUE_ADDRESS (p)
334*cf7f2e2dSJohn Marino 	  && (SYMBOL_VALUE_ADDRESS (p) > best_pc
335*cf7f2e2dSJohn Marino 	      || (psymtab->textlow == 0
336*cf7f2e2dSJohn Marino 		  && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
337*cf7f2e2dSJohn Marino 	{
338*cf7f2e2dSJohn Marino 	  if (section)		/* match on a specific section */
339*cf7f2e2dSJohn Marino 	    {
340*cf7f2e2dSJohn Marino 	      fixup_psymbol_section (p, psymtab->objfile);
341*cf7f2e2dSJohn Marino 	      if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
342*cf7f2e2dSJohn Marino 		continue;
343*cf7f2e2dSJohn Marino 	    }
344*cf7f2e2dSJohn Marino 	  best_pc = SYMBOL_VALUE_ADDRESS (p);
345*cf7f2e2dSJohn Marino 	  best = p;
346*cf7f2e2dSJohn Marino 	}
347*cf7f2e2dSJohn Marino     }
348*cf7f2e2dSJohn Marino 
349*cf7f2e2dSJohn Marino   for (pp = psymtab->objfile->static_psymbols.list + psymtab->statics_offset;
350*cf7f2e2dSJohn Marino     (pp - (psymtab->objfile->static_psymbols.list + psymtab->statics_offset)
351*cf7f2e2dSJohn Marino      < psymtab->n_static_syms);
352*cf7f2e2dSJohn Marino        pp++)
353*cf7f2e2dSJohn Marino     {
354*cf7f2e2dSJohn Marino       p = *pp;
355*cf7f2e2dSJohn Marino       if (SYMBOL_DOMAIN (p) == VAR_DOMAIN
356*cf7f2e2dSJohn Marino 	  && SYMBOL_CLASS (p) == LOC_BLOCK
357*cf7f2e2dSJohn Marino 	  && pc >= SYMBOL_VALUE_ADDRESS (p)
358*cf7f2e2dSJohn Marino 	  && (SYMBOL_VALUE_ADDRESS (p) > best_pc
359*cf7f2e2dSJohn Marino 	      || (psymtab->textlow == 0
360*cf7f2e2dSJohn Marino 		  && best_pc == 0 && SYMBOL_VALUE_ADDRESS (p) == 0)))
361*cf7f2e2dSJohn Marino 	{
362*cf7f2e2dSJohn Marino 	  if (section)		/* match on a specific section */
363*cf7f2e2dSJohn Marino 	    {
364*cf7f2e2dSJohn Marino 	      fixup_psymbol_section (p, psymtab->objfile);
365*cf7f2e2dSJohn Marino 	      if (!matching_obj_sections (SYMBOL_OBJ_SECTION (p), section))
366*cf7f2e2dSJohn Marino 		continue;
367*cf7f2e2dSJohn Marino 	    }
368*cf7f2e2dSJohn Marino 	  best_pc = SYMBOL_VALUE_ADDRESS (p);
369*cf7f2e2dSJohn Marino 	  best = p;
370*cf7f2e2dSJohn Marino 	}
371*cf7f2e2dSJohn Marino     }
372*cf7f2e2dSJohn Marino 
373*cf7f2e2dSJohn Marino   return best;
374*cf7f2e2dSJohn Marino }
375*cf7f2e2dSJohn Marino 
376*cf7f2e2dSJohn Marino static struct partial_symbol *
377*cf7f2e2dSJohn Marino fixup_psymbol_section (struct partial_symbol *psym, struct objfile *objfile)
378*cf7f2e2dSJohn Marino {
379*cf7f2e2dSJohn Marino   CORE_ADDR addr;
380*cf7f2e2dSJohn Marino 
381*cf7f2e2dSJohn Marino   if (!psym)
382*cf7f2e2dSJohn Marino     return NULL;
383*cf7f2e2dSJohn Marino 
384*cf7f2e2dSJohn Marino   if (SYMBOL_OBJ_SECTION (psym))
385*cf7f2e2dSJohn Marino     return psym;
386*cf7f2e2dSJohn Marino 
387*cf7f2e2dSJohn Marino   gdb_assert (objfile);
388*cf7f2e2dSJohn Marino 
389*cf7f2e2dSJohn Marino   switch (SYMBOL_CLASS (psym))
390*cf7f2e2dSJohn Marino     {
391*cf7f2e2dSJohn Marino     case LOC_STATIC:
392*cf7f2e2dSJohn Marino     case LOC_LABEL:
393*cf7f2e2dSJohn Marino     case LOC_BLOCK:
394*cf7f2e2dSJohn Marino       addr = SYMBOL_VALUE_ADDRESS (psym);
395*cf7f2e2dSJohn Marino       break;
396*cf7f2e2dSJohn Marino     default:
397*cf7f2e2dSJohn Marino       /* Nothing else will be listed in the minsyms -- no use looking
398*cf7f2e2dSJohn Marino 	 it up.  */
399*cf7f2e2dSJohn Marino       return psym;
400*cf7f2e2dSJohn Marino     }
401*cf7f2e2dSJohn Marino 
402*cf7f2e2dSJohn Marino   fixup_section (&psym->ginfo, addr, objfile);
403*cf7f2e2dSJohn Marino 
404*cf7f2e2dSJohn Marino   return psym;
405*cf7f2e2dSJohn Marino }
406*cf7f2e2dSJohn Marino 
407*cf7f2e2dSJohn Marino static struct symtab *
408*cf7f2e2dSJohn Marino lookup_symbol_aux_psymtabs (struct objfile *objfile,
409*cf7f2e2dSJohn Marino 			    int block_index, const char *name,
410*cf7f2e2dSJohn Marino 			    const domain_enum domain)
411*cf7f2e2dSJohn Marino {
412*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
413*cf7f2e2dSJohn Marino   const int psymtab_index = (block_index == GLOBAL_BLOCK ? 1 : 0);
414*cf7f2e2dSJohn Marino 
415*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, ps)
416*cf7f2e2dSJohn Marino   {
417*cf7f2e2dSJohn Marino     if (!ps->readin && lookup_partial_symbol (ps, name, psymtab_index, domain))
418*cf7f2e2dSJohn Marino       return PSYMTAB_TO_SYMTAB (ps);
419*cf7f2e2dSJohn Marino   }
420*cf7f2e2dSJohn Marino 
421*cf7f2e2dSJohn Marino   return NULL;
422*cf7f2e2dSJohn Marino }
423*cf7f2e2dSJohn Marino 
424*cf7f2e2dSJohn Marino /* Look, in partial_symtab PST, for symbol whose natural name is NAME.
425*cf7f2e2dSJohn Marino    Check the global symbols if GLOBAL, the static symbols if not. */
426*cf7f2e2dSJohn Marino 
427*cf7f2e2dSJohn Marino static struct partial_symbol *
428*cf7f2e2dSJohn Marino lookup_partial_symbol (struct partial_symtab *pst, const char *name,
429*cf7f2e2dSJohn Marino 		       int global, domain_enum domain)
430*cf7f2e2dSJohn Marino {
431*cf7f2e2dSJohn Marino   struct partial_symbol **start, **psym;
432*cf7f2e2dSJohn Marino   struct partial_symbol **top, **real_top, **bottom, **center;
433*cf7f2e2dSJohn Marino   int length = (global ? pst->n_global_syms : pst->n_static_syms);
434*cf7f2e2dSJohn Marino   int do_linear_search = 1;
435*cf7f2e2dSJohn Marino 
436*cf7f2e2dSJohn Marino   if (length == 0)
437*cf7f2e2dSJohn Marino     {
438*cf7f2e2dSJohn Marino       return (NULL);
439*cf7f2e2dSJohn Marino     }
440*cf7f2e2dSJohn Marino   start = (global ?
441*cf7f2e2dSJohn Marino 	   pst->objfile->global_psymbols.list + pst->globals_offset :
442*cf7f2e2dSJohn Marino 	   pst->objfile->static_psymbols.list + pst->statics_offset);
443*cf7f2e2dSJohn Marino 
444*cf7f2e2dSJohn Marino   if (global)			/* This means we can use a binary search. */
445*cf7f2e2dSJohn Marino     {
446*cf7f2e2dSJohn Marino       do_linear_search = 0;
447*cf7f2e2dSJohn Marino 
448*cf7f2e2dSJohn Marino       /* Binary search.  This search is guaranteed to end with center
449*cf7f2e2dSJohn Marino          pointing at the earliest partial symbol whose name might be
450*cf7f2e2dSJohn Marino          correct.  At that point *all* partial symbols with an
451*cf7f2e2dSJohn Marino          appropriate name will be checked against the correct
452*cf7f2e2dSJohn Marino          domain.  */
453*cf7f2e2dSJohn Marino 
454*cf7f2e2dSJohn Marino       bottom = start;
455*cf7f2e2dSJohn Marino       top = start + length - 1;
456*cf7f2e2dSJohn Marino       real_top = top;
457*cf7f2e2dSJohn Marino       while (top > bottom)
458*cf7f2e2dSJohn Marino 	{
459*cf7f2e2dSJohn Marino 	  center = bottom + (top - bottom) / 2;
460*cf7f2e2dSJohn Marino 	  if (!(center < top))
461*cf7f2e2dSJohn Marino 	    internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
462*cf7f2e2dSJohn Marino 	  if (!do_linear_search
463*cf7f2e2dSJohn Marino 	      && (SYMBOL_LANGUAGE (*center) == language_java))
464*cf7f2e2dSJohn Marino 	    {
465*cf7f2e2dSJohn Marino 	      do_linear_search = 1;
466*cf7f2e2dSJohn Marino 	    }
467*cf7f2e2dSJohn Marino 	  if (strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*center), name) >= 0)
468*cf7f2e2dSJohn Marino 	    {
469*cf7f2e2dSJohn Marino 	      top = center;
470*cf7f2e2dSJohn Marino 	    }
471*cf7f2e2dSJohn Marino 	  else
472*cf7f2e2dSJohn Marino 	    {
473*cf7f2e2dSJohn Marino 	      bottom = center + 1;
474*cf7f2e2dSJohn Marino 	    }
475*cf7f2e2dSJohn Marino 	}
476*cf7f2e2dSJohn Marino       if (!(top == bottom))
477*cf7f2e2dSJohn Marino 	internal_error (__FILE__, __LINE__, _("failed internal consistency check"));
478*cf7f2e2dSJohn Marino 
479*cf7f2e2dSJohn Marino       while (top <= real_top
480*cf7f2e2dSJohn Marino 	     && SYMBOL_MATCHES_SEARCH_NAME (*top, name))
481*cf7f2e2dSJohn Marino 	{
482*cf7f2e2dSJohn Marino 	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*top),
483*cf7f2e2dSJohn Marino 				     SYMBOL_DOMAIN (*top), domain))
484*cf7f2e2dSJohn Marino 	    return (*top);
485*cf7f2e2dSJohn Marino 	  top++;
486*cf7f2e2dSJohn Marino 	}
487*cf7f2e2dSJohn Marino     }
488*cf7f2e2dSJohn Marino 
489*cf7f2e2dSJohn Marino   /* Can't use a binary search or else we found during the binary search that
490*cf7f2e2dSJohn Marino      we should also do a linear search. */
491*cf7f2e2dSJohn Marino 
492*cf7f2e2dSJohn Marino   if (do_linear_search)
493*cf7f2e2dSJohn Marino     {
494*cf7f2e2dSJohn Marino       for (psym = start; psym < start + length; psym++)
495*cf7f2e2dSJohn Marino 	{
496*cf7f2e2dSJohn Marino 	  if (symbol_matches_domain (SYMBOL_LANGUAGE (*psym),
497*cf7f2e2dSJohn Marino 				     SYMBOL_DOMAIN (*psym), domain)
498*cf7f2e2dSJohn Marino 	      && SYMBOL_MATCHES_SEARCH_NAME (*psym, name))
499*cf7f2e2dSJohn Marino 	    return (*psym);
500*cf7f2e2dSJohn Marino 	}
501*cf7f2e2dSJohn Marino     }
502*cf7f2e2dSJohn Marino 
503*cf7f2e2dSJohn Marino   return (NULL);
504*cf7f2e2dSJohn Marino }
505*cf7f2e2dSJohn Marino 
506*cf7f2e2dSJohn Marino /* Get the symbol table that corresponds to a partial_symtab.
507*cf7f2e2dSJohn Marino    This is fast after the first time you do it.  In fact, there
508*cf7f2e2dSJohn Marino    is an even faster macro PSYMTAB_TO_SYMTAB that does the fast
509*cf7f2e2dSJohn Marino    case inline.  */
510*cf7f2e2dSJohn Marino 
511*cf7f2e2dSJohn Marino static struct symtab *
512*cf7f2e2dSJohn Marino psymtab_to_symtab (struct partial_symtab *pst)
513*cf7f2e2dSJohn Marino {
514*cf7f2e2dSJohn Marino   /* If it's been looked up before, return it. */
515*cf7f2e2dSJohn Marino   if (pst->symtab)
516*cf7f2e2dSJohn Marino     return pst->symtab;
517*cf7f2e2dSJohn Marino 
518*cf7f2e2dSJohn Marino   /* If it has not yet been read in, read it.  */
519*cf7f2e2dSJohn Marino   if (!pst->readin)
520*cf7f2e2dSJohn Marino     {
521*cf7f2e2dSJohn Marino       struct cleanup *back_to = increment_reading_symtab ();
522*cf7f2e2dSJohn Marino 
523*cf7f2e2dSJohn Marino       (*pst->read_symtab) (pst);
524*cf7f2e2dSJohn Marino       do_cleanups (back_to);
525*cf7f2e2dSJohn Marino     }
526*cf7f2e2dSJohn Marino 
527*cf7f2e2dSJohn Marino   return pst->symtab;
528*cf7f2e2dSJohn Marino }
529*cf7f2e2dSJohn Marino 
530*cf7f2e2dSJohn Marino static void
531*cf7f2e2dSJohn Marino relocate_psymtabs (struct objfile *objfile,
532*cf7f2e2dSJohn Marino 		   struct section_offsets *new_offsets,
533*cf7f2e2dSJohn Marino 		   struct section_offsets *delta)
534*cf7f2e2dSJohn Marino {
535*cf7f2e2dSJohn Marino   struct partial_symbol **psym;
536*cf7f2e2dSJohn Marino   struct partial_symtab *p;
537*cf7f2e2dSJohn Marino 
538*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, p)
539*cf7f2e2dSJohn Marino     {
540*cf7f2e2dSJohn Marino       p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
541*cf7f2e2dSJohn Marino       p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
542*cf7f2e2dSJohn Marino     }
543*cf7f2e2dSJohn Marino 
544*cf7f2e2dSJohn Marino   for (psym = objfile->global_psymbols.list;
545*cf7f2e2dSJohn Marino        psym < objfile->global_psymbols.next;
546*cf7f2e2dSJohn Marino        psym++)
547*cf7f2e2dSJohn Marino     {
548*cf7f2e2dSJohn Marino       fixup_psymbol_section (*psym, objfile);
549*cf7f2e2dSJohn Marino       if (SYMBOL_SECTION (*psym) >= 0)
550*cf7f2e2dSJohn Marino 	SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
551*cf7f2e2dSJohn Marino 						  SYMBOL_SECTION (*psym));
552*cf7f2e2dSJohn Marino     }
553*cf7f2e2dSJohn Marino   for (psym = objfile->static_psymbols.list;
554*cf7f2e2dSJohn Marino        psym < objfile->static_psymbols.next;
555*cf7f2e2dSJohn Marino        psym++)
556*cf7f2e2dSJohn Marino     {
557*cf7f2e2dSJohn Marino       fixup_psymbol_section (*psym, objfile);
558*cf7f2e2dSJohn Marino       if (SYMBOL_SECTION (*psym) >= 0)
559*cf7f2e2dSJohn Marino 	SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
560*cf7f2e2dSJohn Marino 						  SYMBOL_SECTION (*psym));
561*cf7f2e2dSJohn Marino     }
562*cf7f2e2dSJohn Marino }
563*cf7f2e2dSJohn Marino 
564*cf7f2e2dSJohn Marino static struct symtab *
565*cf7f2e2dSJohn Marino find_last_source_symtab_from_partial (struct objfile *ofp)
566*cf7f2e2dSJohn Marino {
567*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
568*cf7f2e2dSJohn Marino   struct partial_symtab *cs_pst = 0;
569*cf7f2e2dSJohn Marino 
570*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (ofp, ps)
571*cf7f2e2dSJohn Marino     {
572*cf7f2e2dSJohn Marino       const char *name = ps->filename;
573*cf7f2e2dSJohn Marino       int len = strlen (name);
574*cf7f2e2dSJohn Marino 
575*cf7f2e2dSJohn Marino       if (!(len > 2 && (strcmp (&name[len - 2], ".h") == 0
576*cf7f2e2dSJohn Marino 			|| strcmp (name, "<<C++-namespaces>>") == 0)))
577*cf7f2e2dSJohn Marino 	cs_pst = ps;
578*cf7f2e2dSJohn Marino     }
579*cf7f2e2dSJohn Marino 
580*cf7f2e2dSJohn Marino   if (cs_pst)
581*cf7f2e2dSJohn Marino     {
582*cf7f2e2dSJohn Marino       if (cs_pst->readin)
583*cf7f2e2dSJohn Marino 	{
584*cf7f2e2dSJohn Marino 	  internal_error (__FILE__, __LINE__,
585*cf7f2e2dSJohn Marino 			  _("select_source_symtab: "
586*cf7f2e2dSJohn Marino 			  "readin pst found and no symtabs."));
587*cf7f2e2dSJohn Marino 	}
588*cf7f2e2dSJohn Marino       else
589*cf7f2e2dSJohn Marino 	return PSYMTAB_TO_SYMTAB (cs_pst);
590*cf7f2e2dSJohn Marino     }
591*cf7f2e2dSJohn Marino   return NULL;
592*cf7f2e2dSJohn Marino }
593*cf7f2e2dSJohn Marino 
594*cf7f2e2dSJohn Marino static void
595*cf7f2e2dSJohn Marino forget_cached_source_info_partial (struct objfile *objfile)
596*cf7f2e2dSJohn Marino {
597*cf7f2e2dSJohn Marino   struct partial_symtab *pst;
598*cf7f2e2dSJohn Marino 
599*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, pst)
600*cf7f2e2dSJohn Marino     {
601*cf7f2e2dSJohn Marino       if (pst->fullname != NULL)
602*cf7f2e2dSJohn Marino 	{
603*cf7f2e2dSJohn Marino 	  xfree (pst->fullname);
604*cf7f2e2dSJohn Marino 	  pst->fullname = NULL;
605*cf7f2e2dSJohn Marino 	}
606*cf7f2e2dSJohn Marino     }
607*cf7f2e2dSJohn Marino }
608*cf7f2e2dSJohn Marino 
609*cf7f2e2dSJohn Marino static void
610*cf7f2e2dSJohn Marino print_partial_symbols (struct gdbarch *gdbarch,
611*cf7f2e2dSJohn Marino 		       struct partial_symbol **p, int count, char *what,
612*cf7f2e2dSJohn Marino 		       struct ui_file *outfile)
613*cf7f2e2dSJohn Marino {
614*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "  %s partial symbols:\n", what);
615*cf7f2e2dSJohn Marino   while (count-- > 0)
616*cf7f2e2dSJohn Marino     {
617*cf7f2e2dSJohn Marino       fprintf_filtered (outfile, "    `%s'", SYMBOL_LINKAGE_NAME (*p));
618*cf7f2e2dSJohn Marino       if (SYMBOL_DEMANGLED_NAME (*p) != NULL)
619*cf7f2e2dSJohn Marino 	{
620*cf7f2e2dSJohn Marino 	  fprintf_filtered (outfile, "  `%s'", SYMBOL_DEMANGLED_NAME (*p));
621*cf7f2e2dSJohn Marino 	}
622*cf7f2e2dSJohn Marino       fputs_filtered (", ", outfile);
623*cf7f2e2dSJohn Marino       switch (SYMBOL_DOMAIN (*p))
624*cf7f2e2dSJohn Marino 	{
625*cf7f2e2dSJohn Marino 	case UNDEF_DOMAIN:
626*cf7f2e2dSJohn Marino 	  fputs_filtered ("undefined domain, ", outfile);
627*cf7f2e2dSJohn Marino 	  break;
628*cf7f2e2dSJohn Marino 	case VAR_DOMAIN:
629*cf7f2e2dSJohn Marino 	  /* This is the usual thing -- don't print it */
630*cf7f2e2dSJohn Marino 	  break;
631*cf7f2e2dSJohn Marino 	case STRUCT_DOMAIN:
632*cf7f2e2dSJohn Marino 	  fputs_filtered ("struct domain, ", outfile);
633*cf7f2e2dSJohn Marino 	  break;
634*cf7f2e2dSJohn Marino 	case LABEL_DOMAIN:
635*cf7f2e2dSJohn Marino 	  fputs_filtered ("label domain, ", outfile);
636*cf7f2e2dSJohn Marino 	  break;
637*cf7f2e2dSJohn Marino 	default:
638*cf7f2e2dSJohn Marino 	  fputs_filtered ("<invalid domain>, ", outfile);
639*cf7f2e2dSJohn Marino 	  break;
640*cf7f2e2dSJohn Marino 	}
641*cf7f2e2dSJohn Marino       switch (SYMBOL_CLASS (*p))
642*cf7f2e2dSJohn Marino 	{
643*cf7f2e2dSJohn Marino 	case LOC_UNDEF:
644*cf7f2e2dSJohn Marino 	  fputs_filtered ("undefined", outfile);
645*cf7f2e2dSJohn Marino 	  break;
646*cf7f2e2dSJohn Marino 	case LOC_CONST:
647*cf7f2e2dSJohn Marino 	  fputs_filtered ("constant int", outfile);
648*cf7f2e2dSJohn Marino 	  break;
649*cf7f2e2dSJohn Marino 	case LOC_STATIC:
650*cf7f2e2dSJohn Marino 	  fputs_filtered ("static", outfile);
651*cf7f2e2dSJohn Marino 	  break;
652*cf7f2e2dSJohn Marino 	case LOC_REGISTER:
653*cf7f2e2dSJohn Marino 	  fputs_filtered ("register", outfile);
654*cf7f2e2dSJohn Marino 	  break;
655*cf7f2e2dSJohn Marino 	case LOC_ARG:
656*cf7f2e2dSJohn Marino 	  fputs_filtered ("pass by value", outfile);
657*cf7f2e2dSJohn Marino 	  break;
658*cf7f2e2dSJohn Marino 	case LOC_REF_ARG:
659*cf7f2e2dSJohn Marino 	  fputs_filtered ("pass by reference", outfile);
660*cf7f2e2dSJohn Marino 	  break;
661*cf7f2e2dSJohn Marino 	case LOC_REGPARM_ADDR:
662*cf7f2e2dSJohn Marino 	  fputs_filtered ("register address parameter", outfile);
663*cf7f2e2dSJohn Marino 	  break;
664*cf7f2e2dSJohn Marino 	case LOC_LOCAL:
665*cf7f2e2dSJohn Marino 	  fputs_filtered ("stack parameter", outfile);
666*cf7f2e2dSJohn Marino 	  break;
667*cf7f2e2dSJohn Marino 	case LOC_TYPEDEF:
668*cf7f2e2dSJohn Marino 	  fputs_filtered ("type", outfile);
669*cf7f2e2dSJohn Marino 	  break;
670*cf7f2e2dSJohn Marino 	case LOC_LABEL:
671*cf7f2e2dSJohn Marino 	  fputs_filtered ("label", outfile);
672*cf7f2e2dSJohn Marino 	  break;
673*cf7f2e2dSJohn Marino 	case LOC_BLOCK:
674*cf7f2e2dSJohn Marino 	  fputs_filtered ("function", outfile);
675*cf7f2e2dSJohn Marino 	  break;
676*cf7f2e2dSJohn Marino 	case LOC_CONST_BYTES:
677*cf7f2e2dSJohn Marino 	  fputs_filtered ("constant bytes", outfile);
678*cf7f2e2dSJohn Marino 	  break;
679*cf7f2e2dSJohn Marino 	case LOC_UNRESOLVED:
680*cf7f2e2dSJohn Marino 	  fputs_filtered ("unresolved", outfile);
681*cf7f2e2dSJohn Marino 	  break;
682*cf7f2e2dSJohn Marino 	case LOC_OPTIMIZED_OUT:
683*cf7f2e2dSJohn Marino 	  fputs_filtered ("optimized out", outfile);
684*cf7f2e2dSJohn Marino 	  break;
685*cf7f2e2dSJohn Marino 	case LOC_COMPUTED:
686*cf7f2e2dSJohn Marino 	  fputs_filtered ("computed at runtime", outfile);
687*cf7f2e2dSJohn Marino 	  break;
688*cf7f2e2dSJohn Marino 	default:
689*cf7f2e2dSJohn Marino 	  fputs_filtered ("<invalid location>", outfile);
690*cf7f2e2dSJohn Marino 	  break;
691*cf7f2e2dSJohn Marino 	}
692*cf7f2e2dSJohn Marino       fputs_filtered (", ", outfile);
693*cf7f2e2dSJohn Marino       fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (*p)), outfile);
694*cf7f2e2dSJohn Marino       fprintf_filtered (outfile, "\n");
695*cf7f2e2dSJohn Marino       p++;
696*cf7f2e2dSJohn Marino     }
697*cf7f2e2dSJohn Marino }
698*cf7f2e2dSJohn Marino 
699*cf7f2e2dSJohn Marino static void
700*cf7f2e2dSJohn Marino dump_psymtab (struct objfile *objfile, struct partial_symtab *psymtab,
701*cf7f2e2dSJohn Marino 	      struct ui_file *outfile)
702*cf7f2e2dSJohn Marino {
703*cf7f2e2dSJohn Marino   struct gdbarch *gdbarch = get_objfile_arch (objfile);
704*cf7f2e2dSJohn Marino   int i;
705*cf7f2e2dSJohn Marino 
706*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "\nPartial symtab for source file %s ",
707*cf7f2e2dSJohn Marino 		    psymtab->filename);
708*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "(object ");
709*cf7f2e2dSJohn Marino   gdb_print_host_address (psymtab, outfile);
710*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, ")\n\n");
711*cf7f2e2dSJohn Marino   fprintf_unfiltered (outfile, "  Read from object file %s (",
712*cf7f2e2dSJohn Marino 		      objfile->name);
713*cf7f2e2dSJohn Marino   gdb_print_host_address (objfile, outfile);
714*cf7f2e2dSJohn Marino   fprintf_unfiltered (outfile, ")\n");
715*cf7f2e2dSJohn Marino 
716*cf7f2e2dSJohn Marino   if (psymtab->readin)
717*cf7f2e2dSJohn Marino     {
718*cf7f2e2dSJohn Marino       fprintf_filtered (outfile,
719*cf7f2e2dSJohn Marino 			"  Full symtab was read (at ");
720*cf7f2e2dSJohn Marino       gdb_print_host_address (psymtab->symtab, outfile);
721*cf7f2e2dSJohn Marino       fprintf_filtered (outfile, " by function at ");
722*cf7f2e2dSJohn Marino       gdb_print_host_address (psymtab->read_symtab, outfile);
723*cf7f2e2dSJohn Marino       fprintf_filtered (outfile, ")\n");
724*cf7f2e2dSJohn Marino     }
725*cf7f2e2dSJohn Marino 
726*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "  Relocate symbols by ");
727*cf7f2e2dSJohn Marino   for (i = 0; i < psymtab->objfile->num_sections; ++i)
728*cf7f2e2dSJohn Marino     {
729*cf7f2e2dSJohn Marino       if (i != 0)
730*cf7f2e2dSJohn Marino 	fprintf_filtered (outfile, ", ");
731*cf7f2e2dSJohn Marino       wrap_here ("    ");
732*cf7f2e2dSJohn Marino       fputs_filtered (paddress (gdbarch,
733*cf7f2e2dSJohn Marino 				ANOFFSET (psymtab->section_offsets, i)),
734*cf7f2e2dSJohn Marino 		      outfile);
735*cf7f2e2dSJohn Marino     }
736*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "\n");
737*cf7f2e2dSJohn Marino 
738*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "  Symbols cover text addresses ");
739*cf7f2e2dSJohn Marino   fputs_filtered (paddress (gdbarch, psymtab->textlow), outfile);
740*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "-");
741*cf7f2e2dSJohn Marino   fputs_filtered (paddress (gdbarch, psymtab->texthigh), outfile);
742*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "\n");
743*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "  Depends on %d other partial symtabs.\n",
744*cf7f2e2dSJohn Marino 		    psymtab->number_of_dependencies);
745*cf7f2e2dSJohn Marino   for (i = 0; i < psymtab->number_of_dependencies; i++)
746*cf7f2e2dSJohn Marino     {
747*cf7f2e2dSJohn Marino       fprintf_filtered (outfile, "    %d ", i);
748*cf7f2e2dSJohn Marino       gdb_print_host_address (psymtab->dependencies[i], outfile);
749*cf7f2e2dSJohn Marino       fprintf_filtered (outfile, " %s\n",
750*cf7f2e2dSJohn Marino 			psymtab->dependencies[i]->filename);
751*cf7f2e2dSJohn Marino     }
752*cf7f2e2dSJohn Marino   if (psymtab->n_global_syms > 0)
753*cf7f2e2dSJohn Marino     {
754*cf7f2e2dSJohn Marino       print_partial_symbols (gdbarch,
755*cf7f2e2dSJohn Marino 			     objfile->global_psymbols.list
756*cf7f2e2dSJohn Marino 			     + psymtab->globals_offset,
757*cf7f2e2dSJohn Marino 			     psymtab->n_global_syms, "Global", outfile);
758*cf7f2e2dSJohn Marino     }
759*cf7f2e2dSJohn Marino   if (psymtab->n_static_syms > 0)
760*cf7f2e2dSJohn Marino     {
761*cf7f2e2dSJohn Marino       print_partial_symbols (gdbarch,
762*cf7f2e2dSJohn Marino 			     objfile->static_psymbols.list
763*cf7f2e2dSJohn Marino 			     + psymtab->statics_offset,
764*cf7f2e2dSJohn Marino 			     psymtab->n_static_syms, "Static", outfile);
765*cf7f2e2dSJohn Marino     }
766*cf7f2e2dSJohn Marino   fprintf_filtered (outfile, "\n");
767*cf7f2e2dSJohn Marino }
768*cf7f2e2dSJohn Marino 
769*cf7f2e2dSJohn Marino static void
770*cf7f2e2dSJohn Marino print_psymtab_stats_for_objfile (struct objfile *objfile)
771*cf7f2e2dSJohn Marino {
772*cf7f2e2dSJohn Marino   int i;
773*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
774*cf7f2e2dSJohn Marino 
775*cf7f2e2dSJohn Marino   i = 0;
776*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, ps)
777*cf7f2e2dSJohn Marino     {
778*cf7f2e2dSJohn Marino       if (ps->readin == 0)
779*cf7f2e2dSJohn Marino 	i++;
780*cf7f2e2dSJohn Marino     }
781*cf7f2e2dSJohn Marino   printf_filtered (_("  Number of psym tables (not yet expanded): %d\n"), i);
782*cf7f2e2dSJohn Marino }
783*cf7f2e2dSJohn Marino 
784*cf7f2e2dSJohn Marino static void
785*cf7f2e2dSJohn Marino dump_psymtabs_for_objfile (struct objfile *objfile)
786*cf7f2e2dSJohn Marino {
787*cf7f2e2dSJohn Marino   struct partial_symtab *psymtab;
788*cf7f2e2dSJohn Marino 
789*cf7f2e2dSJohn Marino   if (objfile->psymtabs)
790*cf7f2e2dSJohn Marino     {
791*cf7f2e2dSJohn Marino       printf_filtered ("Psymtabs:\n");
792*cf7f2e2dSJohn Marino       for (psymtab = objfile->psymtabs;
793*cf7f2e2dSJohn Marino 	   psymtab != NULL;
794*cf7f2e2dSJohn Marino 	   psymtab = psymtab->next)
795*cf7f2e2dSJohn Marino 	{
796*cf7f2e2dSJohn Marino 	  printf_filtered ("%s at ",
797*cf7f2e2dSJohn Marino 			   psymtab->filename);
798*cf7f2e2dSJohn Marino 	  gdb_print_host_address (psymtab, gdb_stdout);
799*cf7f2e2dSJohn Marino 	  printf_filtered (", ");
800*cf7f2e2dSJohn Marino 	  if (psymtab->objfile != objfile)
801*cf7f2e2dSJohn Marino 	    {
802*cf7f2e2dSJohn Marino 	      printf_filtered ("NOT ON CHAIN!  ");
803*cf7f2e2dSJohn Marino 	    }
804*cf7f2e2dSJohn Marino 	  wrap_here ("  ");
805*cf7f2e2dSJohn Marino 	}
806*cf7f2e2dSJohn Marino       printf_filtered ("\n\n");
807*cf7f2e2dSJohn Marino     }
808*cf7f2e2dSJohn Marino }
809*cf7f2e2dSJohn Marino 
810*cf7f2e2dSJohn Marino /* Look through the partial symtabs for all symbols which begin
811*cf7f2e2dSJohn Marino    by matching FUNC_NAME.  Make sure we read that symbol table in. */
812*cf7f2e2dSJohn Marino 
813*cf7f2e2dSJohn Marino static void
814*cf7f2e2dSJohn Marino read_symtabs_for_function (struct objfile *objfile, const char *func_name)
815*cf7f2e2dSJohn Marino {
816*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
817*cf7f2e2dSJohn Marino 
818*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, ps)
819*cf7f2e2dSJohn Marino   {
820*cf7f2e2dSJohn Marino     if (ps->readin)
821*cf7f2e2dSJohn Marino       continue;
822*cf7f2e2dSJohn Marino 
823*cf7f2e2dSJohn Marino     if ((lookup_partial_symbol (ps, func_name, 1, VAR_DOMAIN)
824*cf7f2e2dSJohn Marino 	 != NULL)
825*cf7f2e2dSJohn Marino 	|| (lookup_partial_symbol (ps, func_name, 0, VAR_DOMAIN)
826*cf7f2e2dSJohn Marino 	    != NULL))
827*cf7f2e2dSJohn Marino       psymtab_to_symtab (ps);
828*cf7f2e2dSJohn Marino   }
829*cf7f2e2dSJohn Marino }
830*cf7f2e2dSJohn Marino 
831*cf7f2e2dSJohn Marino static void
832*cf7f2e2dSJohn Marino expand_partial_symbol_tables (struct objfile *objfile)
833*cf7f2e2dSJohn Marino {
834*cf7f2e2dSJohn Marino   struct partial_symtab *psymtab;
835*cf7f2e2dSJohn Marino 
836*cf7f2e2dSJohn Marino   for (psymtab = objfile->psymtabs;
837*cf7f2e2dSJohn Marino        psymtab != NULL;
838*cf7f2e2dSJohn Marino        psymtab = psymtab->next)
839*cf7f2e2dSJohn Marino     {
840*cf7f2e2dSJohn Marino       psymtab_to_symtab (psymtab);
841*cf7f2e2dSJohn Marino     }
842*cf7f2e2dSJohn Marino }
843*cf7f2e2dSJohn Marino 
844*cf7f2e2dSJohn Marino static void
845*cf7f2e2dSJohn Marino read_psymtabs_with_filename (struct objfile *objfile, const char *filename)
846*cf7f2e2dSJohn Marino {
847*cf7f2e2dSJohn Marino   struct partial_symtab *p;
848*cf7f2e2dSJohn Marino 
849*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, p)
850*cf7f2e2dSJohn Marino     {
851*cf7f2e2dSJohn Marino       if (strcmp (filename, p->filename) == 0)
852*cf7f2e2dSJohn Marino 	PSYMTAB_TO_SYMTAB (p);
853*cf7f2e2dSJohn Marino     }
854*cf7f2e2dSJohn Marino }
855*cf7f2e2dSJohn Marino 
856*cf7f2e2dSJohn Marino static void
857*cf7f2e2dSJohn Marino map_symbol_names_psymtab (struct objfile *objfile,
858*cf7f2e2dSJohn Marino 			  void (*fun) (const char *, void *), void *data)
859*cf7f2e2dSJohn Marino {
860*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
861*cf7f2e2dSJohn Marino 
862*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, ps)
863*cf7f2e2dSJohn Marino     {
864*cf7f2e2dSJohn Marino       struct partial_symbol **psym;
865*cf7f2e2dSJohn Marino 
866*cf7f2e2dSJohn Marino       /* If the psymtab's been read in we'll get it when we search
867*cf7f2e2dSJohn Marino 	 through the blockvector.  */
868*cf7f2e2dSJohn Marino       if (ps->readin)
869*cf7f2e2dSJohn Marino 	continue;
870*cf7f2e2dSJohn Marino 
871*cf7f2e2dSJohn Marino       for (psym = objfile->global_psymbols.list + ps->globals_offset;
872*cf7f2e2dSJohn Marino 	   psym < (objfile->global_psymbols.list + ps->globals_offset
873*cf7f2e2dSJohn Marino 		   + ps->n_global_syms);
874*cf7f2e2dSJohn Marino 	   psym++)
875*cf7f2e2dSJohn Marino 	{
876*cf7f2e2dSJohn Marino 	  /* If interrupted, then quit. */
877*cf7f2e2dSJohn Marino 	  QUIT;
878*cf7f2e2dSJohn Marino 	  (*fun) (SYMBOL_NATURAL_NAME (*psym), data);
879*cf7f2e2dSJohn Marino 	}
880*cf7f2e2dSJohn Marino 
881*cf7f2e2dSJohn Marino       for (psym = objfile->static_psymbols.list + ps->statics_offset;
882*cf7f2e2dSJohn Marino 	   psym < (objfile->static_psymbols.list + ps->statics_offset
883*cf7f2e2dSJohn Marino 		   + ps->n_static_syms);
884*cf7f2e2dSJohn Marino 	   psym++)
885*cf7f2e2dSJohn Marino 	{
886*cf7f2e2dSJohn Marino 	  QUIT;
887*cf7f2e2dSJohn Marino 	  (*fun) (SYMBOL_NATURAL_NAME (*psym), data);
888*cf7f2e2dSJohn Marino 	}
889*cf7f2e2dSJohn Marino     }
890*cf7f2e2dSJohn Marino }
891*cf7f2e2dSJohn Marino 
892*cf7f2e2dSJohn Marino static void
893*cf7f2e2dSJohn Marino map_symbol_filenames_psymtab (struct objfile *objfile,
894*cf7f2e2dSJohn Marino 			      void (*fun) (const char *, const char *,
895*cf7f2e2dSJohn Marino 					   void *),
896*cf7f2e2dSJohn Marino 			      void *data)
897*cf7f2e2dSJohn Marino {
898*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
899*cf7f2e2dSJohn Marino 
900*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, ps)
901*cf7f2e2dSJohn Marino     {
902*cf7f2e2dSJohn Marino       const char *fullname;
903*cf7f2e2dSJohn Marino 
904*cf7f2e2dSJohn Marino       if (ps->readin)
905*cf7f2e2dSJohn Marino 	continue;
906*cf7f2e2dSJohn Marino 
907*cf7f2e2dSJohn Marino       fullname = psymtab_to_fullname (ps);
908*cf7f2e2dSJohn Marino       (*fun) (ps->filename, fullname, data);
909*cf7f2e2dSJohn Marino     }
910*cf7f2e2dSJohn Marino }
911*cf7f2e2dSJohn Marino 
912*cf7f2e2dSJohn Marino int find_and_open_source (const char *filename,
913*cf7f2e2dSJohn Marino 			  const char *dirname,
914*cf7f2e2dSJohn Marino 			  char **fullname);
915*cf7f2e2dSJohn Marino 
916*cf7f2e2dSJohn Marino /* Finds the fullname that a partial_symtab represents.
917*cf7f2e2dSJohn Marino 
918*cf7f2e2dSJohn Marino    If this functions finds the fullname, it will save it in ps->fullname
919*cf7f2e2dSJohn Marino    and it will also return the value.
920*cf7f2e2dSJohn Marino 
921*cf7f2e2dSJohn Marino    If this function fails to find the file that this partial_symtab represents,
922*cf7f2e2dSJohn Marino    NULL will be returned and ps->fullname will be set to NULL.  */
923*cf7f2e2dSJohn Marino static char *
924*cf7f2e2dSJohn Marino psymtab_to_fullname (struct partial_symtab *ps)
925*cf7f2e2dSJohn Marino {
926*cf7f2e2dSJohn Marino   int r;
927*cf7f2e2dSJohn Marino 
928*cf7f2e2dSJohn Marino   if (!ps)
929*cf7f2e2dSJohn Marino     return NULL;
930*cf7f2e2dSJohn Marino 
931*cf7f2e2dSJohn Marino   /* Don't check ps->fullname here, the file could have been
932*cf7f2e2dSJohn Marino      deleted/moved/..., look for it again */
933*cf7f2e2dSJohn Marino   r = find_and_open_source (ps->filename, ps->dirname, &ps->fullname);
934*cf7f2e2dSJohn Marino 
935*cf7f2e2dSJohn Marino   if (r >= 0)
936*cf7f2e2dSJohn Marino     {
937*cf7f2e2dSJohn Marino       close (r);
938*cf7f2e2dSJohn Marino       return ps->fullname;
939*cf7f2e2dSJohn Marino     }
940*cf7f2e2dSJohn Marino 
941*cf7f2e2dSJohn Marino   return NULL;
942*cf7f2e2dSJohn Marino }
943*cf7f2e2dSJohn Marino 
944*cf7f2e2dSJohn Marino static char *
945*cf7f2e2dSJohn Marino find_symbol_file_from_partial (struct objfile *objfile, const char *name)
946*cf7f2e2dSJohn Marino {
947*cf7f2e2dSJohn Marino   struct partial_symtab *pst;
948*cf7f2e2dSJohn Marino 
949*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, pst)
950*cf7f2e2dSJohn Marino     {
951*cf7f2e2dSJohn Marino       if (lookup_partial_symbol (pst, name, 1, VAR_DOMAIN))
952*cf7f2e2dSJohn Marino 	return pst->filename;
953*cf7f2e2dSJohn Marino     }
954*cf7f2e2dSJohn Marino   return NULL;
955*cf7f2e2dSJohn Marino }
956*cf7f2e2dSJohn Marino 
957*cf7f2e2dSJohn Marino /* Look, in partial_symtab PST, for symbol NAME in given namespace.
958*cf7f2e2dSJohn Marino    Check the global symbols if GLOBAL, the static symbols if not.
959*cf7f2e2dSJohn Marino    Do wild-card match if WILD.  */
960*cf7f2e2dSJohn Marino 
961*cf7f2e2dSJohn Marino static struct partial_symbol *
962*cf7f2e2dSJohn Marino ada_lookup_partial_symbol (struct partial_symtab *pst, const char *name,
963*cf7f2e2dSJohn Marino                            int global, domain_enum namespace, int wild,
964*cf7f2e2dSJohn Marino 			   int (*wild_match) (const char *, int, const char *),
965*cf7f2e2dSJohn Marino 			   int (*is_name_suffix) (const char *))
966*cf7f2e2dSJohn Marino {
967*cf7f2e2dSJohn Marino   struct partial_symbol **start;
968*cf7f2e2dSJohn Marino   int name_len = strlen (name);
969*cf7f2e2dSJohn Marino   int length = (global ? pst->n_global_syms : pst->n_static_syms);
970*cf7f2e2dSJohn Marino   int i;
971*cf7f2e2dSJohn Marino 
972*cf7f2e2dSJohn Marino   if (length == 0)
973*cf7f2e2dSJohn Marino     {
974*cf7f2e2dSJohn Marino       return (NULL);
975*cf7f2e2dSJohn Marino     }
976*cf7f2e2dSJohn Marino 
977*cf7f2e2dSJohn Marino   start = (global ?
978*cf7f2e2dSJohn Marino            pst->objfile->global_psymbols.list + pst->globals_offset :
979*cf7f2e2dSJohn Marino            pst->objfile->static_psymbols.list + pst->statics_offset);
980*cf7f2e2dSJohn Marino 
981*cf7f2e2dSJohn Marino   if (wild)
982*cf7f2e2dSJohn Marino     {
983*cf7f2e2dSJohn Marino       for (i = 0; i < length; i += 1)
984*cf7f2e2dSJohn Marino         {
985*cf7f2e2dSJohn Marino           struct partial_symbol *psym = start[i];
986*cf7f2e2dSJohn Marino 
987*cf7f2e2dSJohn Marino           if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
988*cf7f2e2dSJohn Marino                                      SYMBOL_DOMAIN (psym), namespace)
989*cf7f2e2dSJohn Marino               && (*wild_match) (name, name_len, SYMBOL_LINKAGE_NAME (psym)))
990*cf7f2e2dSJohn Marino             return psym;
991*cf7f2e2dSJohn Marino         }
992*cf7f2e2dSJohn Marino       return NULL;
993*cf7f2e2dSJohn Marino     }
994*cf7f2e2dSJohn Marino   else
995*cf7f2e2dSJohn Marino     {
996*cf7f2e2dSJohn Marino       if (global)
997*cf7f2e2dSJohn Marino         {
998*cf7f2e2dSJohn Marino           int U;
999*cf7f2e2dSJohn Marino 
1000*cf7f2e2dSJohn Marino           i = 0;
1001*cf7f2e2dSJohn Marino           U = length - 1;
1002*cf7f2e2dSJohn Marino           while (U - i > 4)
1003*cf7f2e2dSJohn Marino             {
1004*cf7f2e2dSJohn Marino               int M = (U + i) >> 1;
1005*cf7f2e2dSJohn Marino               struct partial_symbol *psym = start[M];
1006*cf7f2e2dSJohn Marino 
1007*cf7f2e2dSJohn Marino               if (SYMBOL_LINKAGE_NAME (psym)[0] < name[0])
1008*cf7f2e2dSJohn Marino                 i = M + 1;
1009*cf7f2e2dSJohn Marino               else if (SYMBOL_LINKAGE_NAME (psym)[0] > name[0])
1010*cf7f2e2dSJohn Marino                 U = M - 1;
1011*cf7f2e2dSJohn Marino               else if (strcmp (SYMBOL_LINKAGE_NAME (psym), name) < 0)
1012*cf7f2e2dSJohn Marino                 i = M + 1;
1013*cf7f2e2dSJohn Marino               else
1014*cf7f2e2dSJohn Marino                 U = M;
1015*cf7f2e2dSJohn Marino             }
1016*cf7f2e2dSJohn Marino         }
1017*cf7f2e2dSJohn Marino       else
1018*cf7f2e2dSJohn Marino         i = 0;
1019*cf7f2e2dSJohn Marino 
1020*cf7f2e2dSJohn Marino       while (i < length)
1021*cf7f2e2dSJohn Marino         {
1022*cf7f2e2dSJohn Marino           struct partial_symbol *psym = start[i];
1023*cf7f2e2dSJohn Marino 
1024*cf7f2e2dSJohn Marino           if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
1025*cf7f2e2dSJohn Marino                                      SYMBOL_DOMAIN (psym), namespace))
1026*cf7f2e2dSJohn Marino             {
1027*cf7f2e2dSJohn Marino               int cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym), name_len);
1028*cf7f2e2dSJohn Marino 
1029*cf7f2e2dSJohn Marino               if (cmp < 0)
1030*cf7f2e2dSJohn Marino                 {
1031*cf7f2e2dSJohn Marino                   if (global)
1032*cf7f2e2dSJohn Marino                     break;
1033*cf7f2e2dSJohn Marino                 }
1034*cf7f2e2dSJohn Marino               else if (cmp == 0
1035*cf7f2e2dSJohn Marino                        && (*is_name_suffix) (SYMBOL_LINKAGE_NAME (psym)
1036*cf7f2e2dSJohn Marino 					     + name_len))
1037*cf7f2e2dSJohn Marino                 return psym;
1038*cf7f2e2dSJohn Marino             }
1039*cf7f2e2dSJohn Marino           i += 1;
1040*cf7f2e2dSJohn Marino         }
1041*cf7f2e2dSJohn Marino 
1042*cf7f2e2dSJohn Marino       if (global)
1043*cf7f2e2dSJohn Marino         {
1044*cf7f2e2dSJohn Marino           int U;
1045*cf7f2e2dSJohn Marino 
1046*cf7f2e2dSJohn Marino           i = 0;
1047*cf7f2e2dSJohn Marino           U = length - 1;
1048*cf7f2e2dSJohn Marino           while (U - i > 4)
1049*cf7f2e2dSJohn Marino             {
1050*cf7f2e2dSJohn Marino               int M = (U + i) >> 1;
1051*cf7f2e2dSJohn Marino               struct partial_symbol *psym = start[M];
1052*cf7f2e2dSJohn Marino 
1053*cf7f2e2dSJohn Marino               if (SYMBOL_LINKAGE_NAME (psym)[0] < '_')
1054*cf7f2e2dSJohn Marino                 i = M + 1;
1055*cf7f2e2dSJohn Marino               else if (SYMBOL_LINKAGE_NAME (psym)[0] > '_')
1056*cf7f2e2dSJohn Marino                 U = M - 1;
1057*cf7f2e2dSJohn Marino               else if (strcmp (SYMBOL_LINKAGE_NAME (psym), "_ada_") < 0)
1058*cf7f2e2dSJohn Marino                 i = M + 1;
1059*cf7f2e2dSJohn Marino               else
1060*cf7f2e2dSJohn Marino                 U = M;
1061*cf7f2e2dSJohn Marino             }
1062*cf7f2e2dSJohn Marino         }
1063*cf7f2e2dSJohn Marino       else
1064*cf7f2e2dSJohn Marino         i = 0;
1065*cf7f2e2dSJohn Marino 
1066*cf7f2e2dSJohn Marino       while (i < length)
1067*cf7f2e2dSJohn Marino         {
1068*cf7f2e2dSJohn Marino           struct partial_symbol *psym = start[i];
1069*cf7f2e2dSJohn Marino 
1070*cf7f2e2dSJohn Marino           if (symbol_matches_domain (SYMBOL_LANGUAGE (psym),
1071*cf7f2e2dSJohn Marino                                      SYMBOL_DOMAIN (psym), namespace))
1072*cf7f2e2dSJohn Marino             {
1073*cf7f2e2dSJohn Marino               int cmp;
1074*cf7f2e2dSJohn Marino 
1075*cf7f2e2dSJohn Marino               cmp = (int) '_' - (int) SYMBOL_LINKAGE_NAME (psym)[0];
1076*cf7f2e2dSJohn Marino               if (cmp == 0)
1077*cf7f2e2dSJohn Marino                 {
1078*cf7f2e2dSJohn Marino                   cmp = strncmp ("_ada_", SYMBOL_LINKAGE_NAME (psym), 5);
1079*cf7f2e2dSJohn Marino                   if (cmp == 0)
1080*cf7f2e2dSJohn Marino                     cmp = strncmp (name, SYMBOL_LINKAGE_NAME (psym) + 5,
1081*cf7f2e2dSJohn Marino                                    name_len);
1082*cf7f2e2dSJohn Marino                 }
1083*cf7f2e2dSJohn Marino 
1084*cf7f2e2dSJohn Marino               if (cmp < 0)
1085*cf7f2e2dSJohn Marino                 {
1086*cf7f2e2dSJohn Marino                   if (global)
1087*cf7f2e2dSJohn Marino                     break;
1088*cf7f2e2dSJohn Marino                 }
1089*cf7f2e2dSJohn Marino               else if (cmp == 0
1090*cf7f2e2dSJohn Marino                        && (*is_name_suffix) (SYMBOL_LINKAGE_NAME (psym)
1091*cf7f2e2dSJohn Marino 					     + name_len + 5))
1092*cf7f2e2dSJohn Marino                 return psym;
1093*cf7f2e2dSJohn Marino             }
1094*cf7f2e2dSJohn Marino           i += 1;
1095*cf7f2e2dSJohn Marino         }
1096*cf7f2e2dSJohn Marino     }
1097*cf7f2e2dSJohn Marino   return NULL;
1098*cf7f2e2dSJohn Marino }
1099*cf7f2e2dSJohn Marino 
1100*cf7f2e2dSJohn Marino static void
1101*cf7f2e2dSJohn Marino map_ada_symtabs (struct objfile *objfile,
1102*cf7f2e2dSJohn Marino 		 int (*wild_match) (const char *, int, const char *),
1103*cf7f2e2dSJohn Marino 		 int (*is_name_suffix) (const char *),
1104*cf7f2e2dSJohn Marino 		 void (*callback) (struct objfile *, struct symtab *, void *),
1105*cf7f2e2dSJohn Marino 		 const char *name, int global, domain_enum namespace, int wild,
1106*cf7f2e2dSJohn Marino 		 void *data)
1107*cf7f2e2dSJohn Marino {
1108*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
1109*cf7f2e2dSJohn Marino 
1110*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, ps)
1111*cf7f2e2dSJohn Marino     {
1112*cf7f2e2dSJohn Marino       QUIT;
1113*cf7f2e2dSJohn Marino       if (ps->readin
1114*cf7f2e2dSJohn Marino 	  || ada_lookup_partial_symbol (ps, name, global, namespace, wild,
1115*cf7f2e2dSJohn Marino 					wild_match, is_name_suffix))
1116*cf7f2e2dSJohn Marino 	{
1117*cf7f2e2dSJohn Marino 	  struct symtab *s = PSYMTAB_TO_SYMTAB (ps);
1118*cf7f2e2dSJohn Marino 
1119*cf7f2e2dSJohn Marino 	  if (s == NULL || !s->primary)
1120*cf7f2e2dSJohn Marino 	    continue;
1121*cf7f2e2dSJohn Marino 	  (*callback) (objfile, s, data);
1122*cf7f2e2dSJohn Marino 	}
1123*cf7f2e2dSJohn Marino     }
1124*cf7f2e2dSJohn Marino }
1125*cf7f2e2dSJohn Marino 
1126*cf7f2e2dSJohn Marino static void
1127*cf7f2e2dSJohn Marino expand_symtabs_matching_via_partial (struct objfile *objfile,
1128*cf7f2e2dSJohn Marino 				     int (*file_matcher) (const char *, void *),
1129*cf7f2e2dSJohn Marino 				     int (*name_matcher) (const char *, void *),
1130*cf7f2e2dSJohn Marino 				     domain_enum kind,
1131*cf7f2e2dSJohn Marino 				     void *data)
1132*cf7f2e2dSJohn Marino {
1133*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
1134*cf7f2e2dSJohn Marino 
1135*cf7f2e2dSJohn Marino   ALL_OBJFILE_PSYMTABS (objfile, ps)
1136*cf7f2e2dSJohn Marino     {
1137*cf7f2e2dSJohn Marino       struct partial_symbol **psym;
1138*cf7f2e2dSJohn Marino       struct partial_symbol **bound, **gbound, **sbound;
1139*cf7f2e2dSJohn Marino       int keep_going = 1;
1140*cf7f2e2dSJohn Marino 
1141*cf7f2e2dSJohn Marino       if (ps->readin)
1142*cf7f2e2dSJohn Marino 	continue;
1143*cf7f2e2dSJohn Marino 
1144*cf7f2e2dSJohn Marino       if (! (*file_matcher) (ps->filename, data))
1145*cf7f2e2dSJohn Marino 	continue;
1146*cf7f2e2dSJohn Marino 
1147*cf7f2e2dSJohn Marino       gbound = objfile->global_psymbols.list + ps->globals_offset + ps->n_global_syms;
1148*cf7f2e2dSJohn Marino       sbound = objfile->static_psymbols.list + ps->statics_offset + ps->n_static_syms;
1149*cf7f2e2dSJohn Marino       bound = gbound;
1150*cf7f2e2dSJohn Marino 
1151*cf7f2e2dSJohn Marino       /* Go through all of the symbols stored in a partial
1152*cf7f2e2dSJohn Marino 	 symtab in one loop. */
1153*cf7f2e2dSJohn Marino       psym = objfile->global_psymbols.list + ps->globals_offset;
1154*cf7f2e2dSJohn Marino       while (keep_going)
1155*cf7f2e2dSJohn Marino 	{
1156*cf7f2e2dSJohn Marino 	  if (psym >= bound)
1157*cf7f2e2dSJohn Marino 	    {
1158*cf7f2e2dSJohn Marino 	      if (bound == gbound && ps->n_static_syms != 0)
1159*cf7f2e2dSJohn Marino 		{
1160*cf7f2e2dSJohn Marino 		  psym = objfile->static_psymbols.list + ps->statics_offset;
1161*cf7f2e2dSJohn Marino 		  bound = sbound;
1162*cf7f2e2dSJohn Marino 		}
1163*cf7f2e2dSJohn Marino 	      else
1164*cf7f2e2dSJohn Marino 		keep_going = 0;
1165*cf7f2e2dSJohn Marino 	      continue;
1166*cf7f2e2dSJohn Marino 	    }
1167*cf7f2e2dSJohn Marino 	  else
1168*cf7f2e2dSJohn Marino 	    {
1169*cf7f2e2dSJohn Marino 	      QUIT;
1170*cf7f2e2dSJohn Marino 
1171*cf7f2e2dSJohn Marino 	      if ((*name_matcher) (SYMBOL_NATURAL_NAME (*psym), data)
1172*cf7f2e2dSJohn Marino 		  && ((kind == VARIABLES_DOMAIN
1173*cf7f2e2dSJohn Marino 		       && SYMBOL_CLASS (*psym) != LOC_TYPEDEF
1174*cf7f2e2dSJohn Marino 		       && SYMBOL_CLASS (*psym) != LOC_BLOCK)
1175*cf7f2e2dSJohn Marino 		      || (kind == FUNCTIONS_DOMAIN
1176*cf7f2e2dSJohn Marino 			  && SYMBOL_CLASS (*psym) == LOC_BLOCK)
1177*cf7f2e2dSJohn Marino 		      || (kind == TYPES_DOMAIN
1178*cf7f2e2dSJohn Marino 			  && SYMBOL_CLASS (*psym) == LOC_TYPEDEF)))
1179*cf7f2e2dSJohn Marino 		{
1180*cf7f2e2dSJohn Marino 		  PSYMTAB_TO_SYMTAB (ps);
1181*cf7f2e2dSJohn Marino 		  keep_going = 0;
1182*cf7f2e2dSJohn Marino 		}
1183*cf7f2e2dSJohn Marino 	    }
1184*cf7f2e2dSJohn Marino 	  psym++;
1185*cf7f2e2dSJohn Marino 	}
1186*cf7f2e2dSJohn Marino     }
1187*cf7f2e2dSJohn Marino }
1188*cf7f2e2dSJohn Marino 
1189*cf7f2e2dSJohn Marino static int
1190*cf7f2e2dSJohn Marino objfile_has_psyms (struct objfile *objfile)
1191*cf7f2e2dSJohn Marino {
1192*cf7f2e2dSJohn Marino   return objfile->psymtabs != NULL;
1193*cf7f2e2dSJohn Marino }
1194*cf7f2e2dSJohn Marino 
1195*cf7f2e2dSJohn Marino const struct quick_symbol_functions psym_functions =
1196*cf7f2e2dSJohn Marino {
1197*cf7f2e2dSJohn Marino   objfile_has_psyms,
1198*cf7f2e2dSJohn Marino   find_last_source_symtab_from_partial,
1199*cf7f2e2dSJohn Marino   forget_cached_source_info_partial,
1200*cf7f2e2dSJohn Marino   lookup_symtab_via_partial_symtab,
1201*cf7f2e2dSJohn Marino   lookup_symbol_aux_psymtabs,
1202*cf7f2e2dSJohn Marino   print_psymtab_stats_for_objfile,
1203*cf7f2e2dSJohn Marino   dump_psymtabs_for_objfile,
1204*cf7f2e2dSJohn Marino   relocate_psymtabs,
1205*cf7f2e2dSJohn Marino   read_symtabs_for_function,
1206*cf7f2e2dSJohn Marino   expand_partial_symbol_tables,
1207*cf7f2e2dSJohn Marino   read_psymtabs_with_filename,
1208*cf7f2e2dSJohn Marino   find_symbol_file_from_partial,
1209*cf7f2e2dSJohn Marino   map_ada_symtabs,
1210*cf7f2e2dSJohn Marino   expand_symtabs_matching_via_partial,
1211*cf7f2e2dSJohn Marino   find_pc_sect_symtab_from_partial,
1212*cf7f2e2dSJohn Marino   map_symbol_names_psymtab,
1213*cf7f2e2dSJohn Marino   map_symbol_filenames_psymtab
1214*cf7f2e2dSJohn Marino };
1215*cf7f2e2dSJohn Marino 
1216*cf7f2e2dSJohn Marino 
1217*cf7f2e2dSJohn Marino 
1218*cf7f2e2dSJohn Marino /* This compares two partial symbols by names, using strcmp_iw_ordered
1219*cf7f2e2dSJohn Marino    for the comparison.  */
1220*cf7f2e2dSJohn Marino 
1221*cf7f2e2dSJohn Marino static int
1222*cf7f2e2dSJohn Marino compare_psymbols (const void *s1p, const void *s2p)
1223*cf7f2e2dSJohn Marino {
1224*cf7f2e2dSJohn Marino   struct partial_symbol *const *s1 = s1p;
1225*cf7f2e2dSJohn Marino   struct partial_symbol *const *s2 = s2p;
1226*cf7f2e2dSJohn Marino 
1227*cf7f2e2dSJohn Marino   return strcmp_iw_ordered (SYMBOL_SEARCH_NAME (*s1),
1228*cf7f2e2dSJohn Marino 			    SYMBOL_SEARCH_NAME (*s2));
1229*cf7f2e2dSJohn Marino }
1230*cf7f2e2dSJohn Marino 
1231*cf7f2e2dSJohn Marino void
1232*cf7f2e2dSJohn Marino sort_pst_symbols (struct partial_symtab *pst)
1233*cf7f2e2dSJohn Marino {
1234*cf7f2e2dSJohn Marino   /* Sort the global list; don't sort the static list */
1235*cf7f2e2dSJohn Marino 
1236*cf7f2e2dSJohn Marino   qsort (pst->objfile->global_psymbols.list + pst->globals_offset,
1237*cf7f2e2dSJohn Marino 	 pst->n_global_syms, sizeof (struct partial_symbol *),
1238*cf7f2e2dSJohn Marino 	 compare_psymbols);
1239*cf7f2e2dSJohn Marino }
1240*cf7f2e2dSJohn Marino 
1241*cf7f2e2dSJohn Marino /* Allocate and partially fill a partial symtab.  It will be
1242*cf7f2e2dSJohn Marino    completely filled at the end of the symbol list.
1243*cf7f2e2dSJohn Marino 
1244*cf7f2e2dSJohn Marino    FILENAME is the name of the symbol-file we are reading from. */
1245*cf7f2e2dSJohn Marino 
1246*cf7f2e2dSJohn Marino struct partial_symtab *
1247*cf7f2e2dSJohn Marino start_psymtab_common (struct objfile *objfile,
1248*cf7f2e2dSJohn Marino 		      struct section_offsets *section_offsets,
1249*cf7f2e2dSJohn Marino 		      const char *filename,
1250*cf7f2e2dSJohn Marino 		      CORE_ADDR textlow, struct partial_symbol **global_syms,
1251*cf7f2e2dSJohn Marino 		      struct partial_symbol **static_syms)
1252*cf7f2e2dSJohn Marino {
1253*cf7f2e2dSJohn Marino   struct partial_symtab *psymtab;
1254*cf7f2e2dSJohn Marino 
1255*cf7f2e2dSJohn Marino   psymtab = allocate_psymtab (filename, objfile);
1256*cf7f2e2dSJohn Marino   psymtab->section_offsets = section_offsets;
1257*cf7f2e2dSJohn Marino   psymtab->textlow = textlow;
1258*cf7f2e2dSJohn Marino   psymtab->texthigh = psymtab->textlow;		/* default */
1259*cf7f2e2dSJohn Marino   psymtab->globals_offset = global_syms - objfile->global_psymbols.list;
1260*cf7f2e2dSJohn Marino   psymtab->statics_offset = static_syms - objfile->static_psymbols.list;
1261*cf7f2e2dSJohn Marino   return (psymtab);
1262*cf7f2e2dSJohn Marino }
1263*cf7f2e2dSJohn Marino 
1264*cf7f2e2dSJohn Marino /* Helper function, initialises partial symbol structure and stashes
1265*cf7f2e2dSJohn Marino    it into objfile's bcache.  Note that our caching mechanism will
1266*cf7f2e2dSJohn Marino    use all fields of struct partial_symbol to determine hash value of the
1267*cf7f2e2dSJohn Marino    structure.  In other words, having two symbols with the same name but
1268*cf7f2e2dSJohn Marino    different domain (or address) is possible and correct.  */
1269*cf7f2e2dSJohn Marino 
1270*cf7f2e2dSJohn Marino static const struct partial_symbol *
1271*cf7f2e2dSJohn Marino add_psymbol_to_bcache (char *name, int namelength, int copy_name,
1272*cf7f2e2dSJohn Marino 		       domain_enum domain,
1273*cf7f2e2dSJohn Marino 		       enum address_class class,
1274*cf7f2e2dSJohn Marino 		       long val,	/* Value as a long */
1275*cf7f2e2dSJohn Marino 		       CORE_ADDR coreaddr,	/* Value as a CORE_ADDR */
1276*cf7f2e2dSJohn Marino 		       enum language language, struct objfile *objfile,
1277*cf7f2e2dSJohn Marino 		       int *added)
1278*cf7f2e2dSJohn Marino {
1279*cf7f2e2dSJohn Marino   /* psymbol is static so that there will be no uninitialized gaps in the
1280*cf7f2e2dSJohn Marino      structure which might contain random data, causing cache misses in
1281*cf7f2e2dSJohn Marino      bcache. */
1282*cf7f2e2dSJohn Marino   static struct partial_symbol psymbol;
1283*cf7f2e2dSJohn Marino 
1284*cf7f2e2dSJohn Marino   /* However, we must ensure that the entire 'value' field has been
1285*cf7f2e2dSJohn Marino      zeroed before assigning to it, because an assignment may not
1286*cf7f2e2dSJohn Marino      write the entire field.  */
1287*cf7f2e2dSJohn Marino   memset (&psymbol.ginfo.value, 0, sizeof (psymbol.ginfo.value));
1288*cf7f2e2dSJohn Marino   /* val and coreaddr are mutually exclusive, one of them *will* be zero */
1289*cf7f2e2dSJohn Marino   if (val != 0)
1290*cf7f2e2dSJohn Marino     {
1291*cf7f2e2dSJohn Marino       SYMBOL_VALUE (&psymbol) = val;
1292*cf7f2e2dSJohn Marino     }
1293*cf7f2e2dSJohn Marino   else
1294*cf7f2e2dSJohn Marino     {
1295*cf7f2e2dSJohn Marino       SYMBOL_VALUE_ADDRESS (&psymbol) = coreaddr;
1296*cf7f2e2dSJohn Marino     }
1297*cf7f2e2dSJohn Marino   SYMBOL_SECTION (&psymbol) = 0;
1298*cf7f2e2dSJohn Marino   SYMBOL_LANGUAGE (&psymbol) = language;
1299*cf7f2e2dSJohn Marino   PSYMBOL_DOMAIN (&psymbol) = domain;
1300*cf7f2e2dSJohn Marino   PSYMBOL_CLASS (&psymbol) = class;
1301*cf7f2e2dSJohn Marino 
1302*cf7f2e2dSJohn Marino   SYMBOL_SET_NAMES (&psymbol, name, namelength, copy_name, objfile);
1303*cf7f2e2dSJohn Marino 
1304*cf7f2e2dSJohn Marino   /* Stash the partial symbol away in the cache */
1305*cf7f2e2dSJohn Marino   return bcache_full (&psymbol, sizeof (struct partial_symbol),
1306*cf7f2e2dSJohn Marino 		      objfile->psymbol_cache, added);
1307*cf7f2e2dSJohn Marino }
1308*cf7f2e2dSJohn Marino 
1309*cf7f2e2dSJohn Marino /* Helper function, adds partial symbol to the given partial symbol
1310*cf7f2e2dSJohn Marino    list.  */
1311*cf7f2e2dSJohn Marino 
1312*cf7f2e2dSJohn Marino static void
1313*cf7f2e2dSJohn Marino append_psymbol_to_list (struct psymbol_allocation_list *list,
1314*cf7f2e2dSJohn Marino 			const struct partial_symbol *psym,
1315*cf7f2e2dSJohn Marino 			struct objfile *objfile)
1316*cf7f2e2dSJohn Marino {
1317*cf7f2e2dSJohn Marino   if (list->next >= list->list + list->size)
1318*cf7f2e2dSJohn Marino     extend_psymbol_list (list, objfile);
1319*cf7f2e2dSJohn Marino   *list->next++ = (struct partial_symbol *) psym;
1320*cf7f2e2dSJohn Marino   OBJSTAT (objfile, n_psyms++);
1321*cf7f2e2dSJohn Marino }
1322*cf7f2e2dSJohn Marino 
1323*cf7f2e2dSJohn Marino /* Add a symbol with a long value to a psymtab.
1324*cf7f2e2dSJohn Marino    Since one arg is a struct, we pass in a ptr and deref it (sigh).
1325*cf7f2e2dSJohn Marino    Return the partial symbol that has been added.  */
1326*cf7f2e2dSJohn Marino 
1327*cf7f2e2dSJohn Marino /* NOTE: carlton/2003-09-11: The reason why we return the partial
1328*cf7f2e2dSJohn Marino    symbol is so that callers can get access to the symbol's demangled
1329*cf7f2e2dSJohn Marino    name, which they don't have any cheap way to determine otherwise.
1330*cf7f2e2dSJohn Marino    (Currenly, dwarf2read.c is the only file who uses that information,
1331*cf7f2e2dSJohn Marino    though it's possible that other readers might in the future.)
1332*cf7f2e2dSJohn Marino    Elena wasn't thrilled about that, and I don't blame her, but we
1333*cf7f2e2dSJohn Marino    couldn't come up with a better way to get that information.  If
1334*cf7f2e2dSJohn Marino    it's needed in other situations, we could consider breaking up
1335*cf7f2e2dSJohn Marino    SYMBOL_SET_NAMES to provide access to the demangled name lookup
1336*cf7f2e2dSJohn Marino    cache.  */
1337*cf7f2e2dSJohn Marino 
1338*cf7f2e2dSJohn Marino const struct partial_symbol *
1339*cf7f2e2dSJohn Marino add_psymbol_to_list (char *name, int namelength, int copy_name,
1340*cf7f2e2dSJohn Marino 		     domain_enum domain,
1341*cf7f2e2dSJohn Marino 		     enum address_class class,
1342*cf7f2e2dSJohn Marino 		     struct psymbol_allocation_list *list,
1343*cf7f2e2dSJohn Marino 		     long val,	/* Value as a long */
1344*cf7f2e2dSJohn Marino 		     CORE_ADDR coreaddr,	/* Value as a CORE_ADDR */
1345*cf7f2e2dSJohn Marino 		     enum language language, struct objfile *objfile)
1346*cf7f2e2dSJohn Marino {
1347*cf7f2e2dSJohn Marino   const struct partial_symbol *psym;
1348*cf7f2e2dSJohn Marino 
1349*cf7f2e2dSJohn Marino   int added;
1350*cf7f2e2dSJohn Marino 
1351*cf7f2e2dSJohn Marino   /* Stash the partial symbol away in the cache */
1352*cf7f2e2dSJohn Marino   psym = add_psymbol_to_bcache (name, namelength, copy_name, domain, class,
1353*cf7f2e2dSJohn Marino 				val, coreaddr, language, objfile, &added);
1354*cf7f2e2dSJohn Marino 
1355*cf7f2e2dSJohn Marino   /* Do not duplicate global partial symbols.  */
1356*cf7f2e2dSJohn Marino   if (list == &objfile->global_psymbols
1357*cf7f2e2dSJohn Marino       && !added)
1358*cf7f2e2dSJohn Marino     return psym;
1359*cf7f2e2dSJohn Marino 
1360*cf7f2e2dSJohn Marino   /* Save pointer to partial symbol in psymtab, growing symtab if needed. */
1361*cf7f2e2dSJohn Marino   append_psymbol_to_list (list, psym, objfile);
1362*cf7f2e2dSJohn Marino   return psym;
1363*cf7f2e2dSJohn Marino }
1364*cf7f2e2dSJohn Marino 
1365*cf7f2e2dSJohn Marino /* Initialize storage for partial symbols.  */
1366*cf7f2e2dSJohn Marino 
1367*cf7f2e2dSJohn Marino void
1368*cf7f2e2dSJohn Marino init_psymbol_list (struct objfile *objfile, int total_symbols)
1369*cf7f2e2dSJohn Marino {
1370*cf7f2e2dSJohn Marino   /* Free any previously allocated psymbol lists.  */
1371*cf7f2e2dSJohn Marino 
1372*cf7f2e2dSJohn Marino   if (objfile->global_psymbols.list)
1373*cf7f2e2dSJohn Marino     {
1374*cf7f2e2dSJohn Marino       xfree (objfile->global_psymbols.list);
1375*cf7f2e2dSJohn Marino     }
1376*cf7f2e2dSJohn Marino   if (objfile->static_psymbols.list)
1377*cf7f2e2dSJohn Marino     {
1378*cf7f2e2dSJohn Marino       xfree (objfile->static_psymbols.list);
1379*cf7f2e2dSJohn Marino     }
1380*cf7f2e2dSJohn Marino 
1381*cf7f2e2dSJohn Marino   /* Current best guess is that approximately a twentieth
1382*cf7f2e2dSJohn Marino      of the total symbols (in a debugging file) are global or static
1383*cf7f2e2dSJohn Marino      oriented symbols */
1384*cf7f2e2dSJohn Marino 
1385*cf7f2e2dSJohn Marino   objfile->global_psymbols.size = total_symbols / 10;
1386*cf7f2e2dSJohn Marino   objfile->static_psymbols.size = total_symbols / 10;
1387*cf7f2e2dSJohn Marino 
1388*cf7f2e2dSJohn Marino   if (objfile->global_psymbols.size > 0)
1389*cf7f2e2dSJohn Marino     {
1390*cf7f2e2dSJohn Marino       objfile->global_psymbols.next =
1391*cf7f2e2dSJohn Marino 	objfile->global_psymbols.list = (struct partial_symbol **)
1392*cf7f2e2dSJohn Marino 	xmalloc ((objfile->global_psymbols.size
1393*cf7f2e2dSJohn Marino 		  * sizeof (struct partial_symbol *)));
1394*cf7f2e2dSJohn Marino     }
1395*cf7f2e2dSJohn Marino   if (objfile->static_psymbols.size > 0)
1396*cf7f2e2dSJohn Marino     {
1397*cf7f2e2dSJohn Marino       objfile->static_psymbols.next =
1398*cf7f2e2dSJohn Marino 	objfile->static_psymbols.list = (struct partial_symbol **)
1399*cf7f2e2dSJohn Marino 	xmalloc ((objfile->static_psymbols.size
1400*cf7f2e2dSJohn Marino 		  * sizeof (struct partial_symbol *)));
1401*cf7f2e2dSJohn Marino     }
1402*cf7f2e2dSJohn Marino }
1403*cf7f2e2dSJohn Marino 
1404*cf7f2e2dSJohn Marino struct partial_symtab *
1405*cf7f2e2dSJohn Marino allocate_psymtab (const char *filename, struct objfile *objfile)
1406*cf7f2e2dSJohn Marino {
1407*cf7f2e2dSJohn Marino   struct partial_symtab *psymtab;
1408*cf7f2e2dSJohn Marino 
1409*cf7f2e2dSJohn Marino   if (objfile->free_psymtabs)
1410*cf7f2e2dSJohn Marino     {
1411*cf7f2e2dSJohn Marino       psymtab = objfile->free_psymtabs;
1412*cf7f2e2dSJohn Marino       objfile->free_psymtabs = psymtab->next;
1413*cf7f2e2dSJohn Marino     }
1414*cf7f2e2dSJohn Marino   else
1415*cf7f2e2dSJohn Marino     psymtab = (struct partial_symtab *)
1416*cf7f2e2dSJohn Marino       obstack_alloc (&objfile->objfile_obstack,
1417*cf7f2e2dSJohn Marino 		     sizeof (struct partial_symtab));
1418*cf7f2e2dSJohn Marino 
1419*cf7f2e2dSJohn Marino   memset (psymtab, 0, sizeof (struct partial_symtab));
1420*cf7f2e2dSJohn Marino   psymtab->filename = obsavestring (filename, strlen (filename),
1421*cf7f2e2dSJohn Marino 				    &objfile->objfile_obstack);
1422*cf7f2e2dSJohn Marino   psymtab->symtab = NULL;
1423*cf7f2e2dSJohn Marino 
1424*cf7f2e2dSJohn Marino   /* Prepend it to the psymtab list for the objfile it belongs to.
1425*cf7f2e2dSJohn Marino      Psymtabs are searched in most recent inserted -> least recent
1426*cf7f2e2dSJohn Marino      inserted order. */
1427*cf7f2e2dSJohn Marino 
1428*cf7f2e2dSJohn Marino   psymtab->objfile = objfile;
1429*cf7f2e2dSJohn Marino   psymtab->next = objfile->psymtabs;
1430*cf7f2e2dSJohn Marino   objfile->psymtabs = psymtab;
1431*cf7f2e2dSJohn Marino 
1432*cf7f2e2dSJohn Marino   return (psymtab);
1433*cf7f2e2dSJohn Marino }
1434*cf7f2e2dSJohn Marino 
1435*cf7f2e2dSJohn Marino void
1436*cf7f2e2dSJohn Marino discard_psymtab (struct partial_symtab *pst)
1437*cf7f2e2dSJohn Marino {
1438*cf7f2e2dSJohn Marino   struct partial_symtab **prev_pst;
1439*cf7f2e2dSJohn Marino 
1440*cf7f2e2dSJohn Marino   /* From dbxread.c:
1441*cf7f2e2dSJohn Marino      Empty psymtabs happen as a result of header files which don't
1442*cf7f2e2dSJohn Marino      have any symbols in them.  There can be a lot of them.  But this
1443*cf7f2e2dSJohn Marino      check is wrong, in that a psymtab with N_SLINE entries but
1444*cf7f2e2dSJohn Marino      nothing else is not empty, but we don't realize that.  Fixing
1445*cf7f2e2dSJohn Marino      that without slowing things down might be tricky.  */
1446*cf7f2e2dSJohn Marino 
1447*cf7f2e2dSJohn Marino   /* First, snip it out of the psymtab chain */
1448*cf7f2e2dSJohn Marino 
1449*cf7f2e2dSJohn Marino   prev_pst = &(pst->objfile->psymtabs);
1450*cf7f2e2dSJohn Marino   while ((*prev_pst) != pst)
1451*cf7f2e2dSJohn Marino     prev_pst = &((*prev_pst)->next);
1452*cf7f2e2dSJohn Marino   (*prev_pst) = pst->next;
1453*cf7f2e2dSJohn Marino 
1454*cf7f2e2dSJohn Marino   /* Next, put it on a free list for recycling */
1455*cf7f2e2dSJohn Marino 
1456*cf7f2e2dSJohn Marino   pst->next = pst->objfile->free_psymtabs;
1457*cf7f2e2dSJohn Marino   pst->objfile->free_psymtabs = pst;
1458*cf7f2e2dSJohn Marino }
1459*cf7f2e2dSJohn Marino 
1460*cf7f2e2dSJohn Marino /* Increase the space allocated for LISTP, which is probably
1461*cf7f2e2dSJohn Marino    global_psymbols or static_psymbols. This space will eventually
1462*cf7f2e2dSJohn Marino    be freed in free_objfile().  */
1463*cf7f2e2dSJohn Marino 
1464*cf7f2e2dSJohn Marino void
1465*cf7f2e2dSJohn Marino extend_psymbol_list (struct psymbol_allocation_list *listp,
1466*cf7f2e2dSJohn Marino 		     struct objfile *objfile)
1467*cf7f2e2dSJohn Marino {
1468*cf7f2e2dSJohn Marino   int new_size;
1469*cf7f2e2dSJohn Marino 
1470*cf7f2e2dSJohn Marino   if (listp->size == 0)
1471*cf7f2e2dSJohn Marino     {
1472*cf7f2e2dSJohn Marino       new_size = 255;
1473*cf7f2e2dSJohn Marino       listp->list = (struct partial_symbol **)
1474*cf7f2e2dSJohn Marino 	xmalloc (new_size * sizeof (struct partial_symbol *));
1475*cf7f2e2dSJohn Marino     }
1476*cf7f2e2dSJohn Marino   else
1477*cf7f2e2dSJohn Marino     {
1478*cf7f2e2dSJohn Marino       new_size = listp->size * 2;
1479*cf7f2e2dSJohn Marino       listp->list = (struct partial_symbol **)
1480*cf7f2e2dSJohn Marino 	xrealloc ((char *) listp->list,
1481*cf7f2e2dSJohn Marino 		  new_size * sizeof (struct partial_symbol *));
1482*cf7f2e2dSJohn Marino     }
1483*cf7f2e2dSJohn Marino   /* Next assumes we only went one over.  Should be good if
1484*cf7f2e2dSJohn Marino      program works correctly */
1485*cf7f2e2dSJohn Marino   listp->next = listp->list + listp->size;
1486*cf7f2e2dSJohn Marino   listp->size = new_size;
1487*cf7f2e2dSJohn Marino }
1488*cf7f2e2dSJohn Marino 
1489*cf7f2e2dSJohn Marino 
1490*cf7f2e2dSJohn Marino 
1491*cf7f2e2dSJohn Marino void
1492*cf7f2e2dSJohn Marino maintenance_print_psymbols (char *args, int from_tty)
1493*cf7f2e2dSJohn Marino {
1494*cf7f2e2dSJohn Marino   char **argv;
1495*cf7f2e2dSJohn Marino   struct ui_file *outfile;
1496*cf7f2e2dSJohn Marino   struct cleanup *cleanups;
1497*cf7f2e2dSJohn Marino   char *symname = NULL;
1498*cf7f2e2dSJohn Marino   char *filename = DEV_TTY;
1499*cf7f2e2dSJohn Marino   struct objfile *objfile;
1500*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
1501*cf7f2e2dSJohn Marino 
1502*cf7f2e2dSJohn Marino   dont_repeat ();
1503*cf7f2e2dSJohn Marino 
1504*cf7f2e2dSJohn Marino   if (args == NULL)
1505*cf7f2e2dSJohn Marino     {
1506*cf7f2e2dSJohn Marino       error (_("print-psymbols takes an output file name and optional symbol file name"));
1507*cf7f2e2dSJohn Marino     }
1508*cf7f2e2dSJohn Marino   argv = gdb_buildargv (args);
1509*cf7f2e2dSJohn Marino   cleanups = make_cleanup_freeargv (argv);
1510*cf7f2e2dSJohn Marino 
1511*cf7f2e2dSJohn Marino   if (argv[0] != NULL)
1512*cf7f2e2dSJohn Marino     {
1513*cf7f2e2dSJohn Marino       filename = argv[0];
1514*cf7f2e2dSJohn Marino       /* If a second arg is supplied, it is a source file name to match on */
1515*cf7f2e2dSJohn Marino       if (argv[1] != NULL)
1516*cf7f2e2dSJohn Marino 	{
1517*cf7f2e2dSJohn Marino 	  symname = argv[1];
1518*cf7f2e2dSJohn Marino 	}
1519*cf7f2e2dSJohn Marino     }
1520*cf7f2e2dSJohn Marino 
1521*cf7f2e2dSJohn Marino   filename = tilde_expand (filename);
1522*cf7f2e2dSJohn Marino   make_cleanup (xfree, filename);
1523*cf7f2e2dSJohn Marino 
1524*cf7f2e2dSJohn Marino   outfile = gdb_fopen (filename, FOPEN_WT);
1525*cf7f2e2dSJohn Marino   if (outfile == 0)
1526*cf7f2e2dSJohn Marino     perror_with_name (filename);
1527*cf7f2e2dSJohn Marino   make_cleanup_ui_file_delete (outfile);
1528*cf7f2e2dSJohn Marino 
1529*cf7f2e2dSJohn Marino   immediate_quit++;
1530*cf7f2e2dSJohn Marino   ALL_PSYMTABS (objfile, ps)
1531*cf7f2e2dSJohn Marino     if (symname == NULL || strcmp (symname, ps->filename) == 0)
1532*cf7f2e2dSJohn Marino     dump_psymtab (objfile, ps, outfile);
1533*cf7f2e2dSJohn Marino   immediate_quit--;
1534*cf7f2e2dSJohn Marino   do_cleanups (cleanups);
1535*cf7f2e2dSJohn Marino }
1536*cf7f2e2dSJohn Marino 
1537*cf7f2e2dSJohn Marino /* List all the partial symbol tables whose names match REGEXP (optional).  */
1538*cf7f2e2dSJohn Marino void
1539*cf7f2e2dSJohn Marino maintenance_info_psymtabs (char *regexp, int from_tty)
1540*cf7f2e2dSJohn Marino {
1541*cf7f2e2dSJohn Marino   struct program_space *pspace;
1542*cf7f2e2dSJohn Marino   struct objfile *objfile;
1543*cf7f2e2dSJohn Marino 
1544*cf7f2e2dSJohn Marino   if (regexp)
1545*cf7f2e2dSJohn Marino     re_comp (regexp);
1546*cf7f2e2dSJohn Marino 
1547*cf7f2e2dSJohn Marino   ALL_PSPACES (pspace)
1548*cf7f2e2dSJohn Marino     ALL_PSPACE_OBJFILES (pspace, objfile)
1549*cf7f2e2dSJohn Marino     {
1550*cf7f2e2dSJohn Marino       struct gdbarch *gdbarch = get_objfile_arch (objfile);
1551*cf7f2e2dSJohn Marino       struct partial_symtab *psymtab;
1552*cf7f2e2dSJohn Marino 
1553*cf7f2e2dSJohn Marino       /* We don't want to print anything for this objfile until we
1554*cf7f2e2dSJohn Marino          actually find a symtab whose name matches.  */
1555*cf7f2e2dSJohn Marino       int printed_objfile_start = 0;
1556*cf7f2e2dSJohn Marino 
1557*cf7f2e2dSJohn Marino       ALL_OBJFILE_PSYMTABS (objfile, psymtab)
1558*cf7f2e2dSJohn Marino 	{
1559*cf7f2e2dSJohn Marino 	  QUIT;
1560*cf7f2e2dSJohn Marino 
1561*cf7f2e2dSJohn Marino 	  if (! regexp
1562*cf7f2e2dSJohn Marino 	      || re_exec (psymtab->filename))
1563*cf7f2e2dSJohn Marino 	    {
1564*cf7f2e2dSJohn Marino 	      if (! printed_objfile_start)
1565*cf7f2e2dSJohn Marino 		{
1566*cf7f2e2dSJohn Marino 		  printf_filtered ("{ objfile %s ", objfile->name);
1567*cf7f2e2dSJohn Marino 		  wrap_here ("  ");
1568*cf7f2e2dSJohn Marino 		  printf_filtered ("((struct objfile *) %s)\n",
1569*cf7f2e2dSJohn Marino 				   host_address_to_string (objfile));
1570*cf7f2e2dSJohn Marino 		  printed_objfile_start = 1;
1571*cf7f2e2dSJohn Marino 		}
1572*cf7f2e2dSJohn Marino 
1573*cf7f2e2dSJohn Marino 	      printf_filtered ("  { psymtab %s ", psymtab->filename);
1574*cf7f2e2dSJohn Marino 	      wrap_here ("    ");
1575*cf7f2e2dSJohn Marino 	      printf_filtered ("((struct partial_symtab *) %s)\n",
1576*cf7f2e2dSJohn Marino 			       host_address_to_string (psymtab));
1577*cf7f2e2dSJohn Marino 
1578*cf7f2e2dSJohn Marino 	      printf_filtered ("    readin %s\n",
1579*cf7f2e2dSJohn Marino 			       psymtab->readin ? "yes" : "no");
1580*cf7f2e2dSJohn Marino 	      printf_filtered ("    fullname %s\n",
1581*cf7f2e2dSJohn Marino 			       psymtab->fullname ? psymtab->fullname : "(null)");
1582*cf7f2e2dSJohn Marino 	      printf_filtered ("    text addresses ");
1583*cf7f2e2dSJohn Marino 	      fputs_filtered (paddress (gdbarch, psymtab->textlow),
1584*cf7f2e2dSJohn Marino 			      gdb_stdout);
1585*cf7f2e2dSJohn Marino 	      printf_filtered (" -- ");
1586*cf7f2e2dSJohn Marino 	      fputs_filtered (paddress (gdbarch, psymtab->texthigh),
1587*cf7f2e2dSJohn Marino 			      gdb_stdout);
1588*cf7f2e2dSJohn Marino 	      printf_filtered ("\n");
1589*cf7f2e2dSJohn Marino 	      printf_filtered ("    globals ");
1590*cf7f2e2dSJohn Marino 	      if (psymtab->n_global_syms)
1591*cf7f2e2dSJohn Marino 		{
1592*cf7f2e2dSJohn Marino 		  printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1593*cf7f2e2dSJohn Marino 				   host_address_to_string (psymtab->objfile->global_psymbols.list
1594*cf7f2e2dSJohn Marino 				    + psymtab->globals_offset),
1595*cf7f2e2dSJohn Marino 				   psymtab->n_global_syms);
1596*cf7f2e2dSJohn Marino 		}
1597*cf7f2e2dSJohn Marino 	      else
1598*cf7f2e2dSJohn Marino 		printf_filtered ("(none)\n");
1599*cf7f2e2dSJohn Marino 	      printf_filtered ("    statics ");
1600*cf7f2e2dSJohn Marino 	      if (psymtab->n_static_syms)
1601*cf7f2e2dSJohn Marino 		{
1602*cf7f2e2dSJohn Marino 		  printf_filtered ("(* (struct partial_symbol **) %s @ %d)\n",
1603*cf7f2e2dSJohn Marino 				   host_address_to_string (psymtab->objfile->static_psymbols.list
1604*cf7f2e2dSJohn Marino 				    + psymtab->statics_offset),
1605*cf7f2e2dSJohn Marino 				   psymtab->n_static_syms);
1606*cf7f2e2dSJohn Marino 		}
1607*cf7f2e2dSJohn Marino 	      else
1608*cf7f2e2dSJohn Marino 		printf_filtered ("(none)\n");
1609*cf7f2e2dSJohn Marino 	      printf_filtered ("    dependencies ");
1610*cf7f2e2dSJohn Marino 	      if (psymtab->number_of_dependencies)
1611*cf7f2e2dSJohn Marino 		{
1612*cf7f2e2dSJohn Marino 		  int i;
1613*cf7f2e2dSJohn Marino 
1614*cf7f2e2dSJohn Marino 		  printf_filtered ("{\n");
1615*cf7f2e2dSJohn Marino 		  for (i = 0; i < psymtab->number_of_dependencies; i++)
1616*cf7f2e2dSJohn Marino 		    {
1617*cf7f2e2dSJohn Marino 		      struct partial_symtab *dep = psymtab->dependencies[i];
1618*cf7f2e2dSJohn Marino 
1619*cf7f2e2dSJohn Marino 		      /* Note the string concatenation there --- no comma.  */
1620*cf7f2e2dSJohn Marino 		      printf_filtered ("      psymtab %s "
1621*cf7f2e2dSJohn Marino 				       "((struct partial_symtab *) %s)\n",
1622*cf7f2e2dSJohn Marino 				       dep->filename,
1623*cf7f2e2dSJohn Marino 				       host_address_to_string (dep));
1624*cf7f2e2dSJohn Marino 		    }
1625*cf7f2e2dSJohn Marino 		  printf_filtered ("    }\n");
1626*cf7f2e2dSJohn Marino 		}
1627*cf7f2e2dSJohn Marino 	      else
1628*cf7f2e2dSJohn Marino 		printf_filtered ("(none)\n");
1629*cf7f2e2dSJohn Marino 	      printf_filtered ("  }\n");
1630*cf7f2e2dSJohn Marino 	    }
1631*cf7f2e2dSJohn Marino 	}
1632*cf7f2e2dSJohn Marino 
1633*cf7f2e2dSJohn Marino       if (printed_objfile_start)
1634*cf7f2e2dSJohn Marino         printf_filtered ("}\n");
1635*cf7f2e2dSJohn Marino     }
1636*cf7f2e2dSJohn Marino }
1637*cf7f2e2dSJohn Marino 
1638*cf7f2e2dSJohn Marino /* Check consistency of psymtabs and symtabs.  */
1639*cf7f2e2dSJohn Marino 
1640*cf7f2e2dSJohn Marino void
1641*cf7f2e2dSJohn Marino maintenance_check_symtabs (char *ignore, int from_tty)
1642*cf7f2e2dSJohn Marino {
1643*cf7f2e2dSJohn Marino   struct symbol *sym;
1644*cf7f2e2dSJohn Marino   struct partial_symbol **psym;
1645*cf7f2e2dSJohn Marino   struct symtab *s = NULL;
1646*cf7f2e2dSJohn Marino   struct partial_symtab *ps;
1647*cf7f2e2dSJohn Marino   struct blockvector *bv;
1648*cf7f2e2dSJohn Marino   struct objfile *objfile;
1649*cf7f2e2dSJohn Marino   struct block *b;
1650*cf7f2e2dSJohn Marino   int length;
1651*cf7f2e2dSJohn Marino 
1652*cf7f2e2dSJohn Marino   ALL_PSYMTABS (objfile, ps)
1653*cf7f2e2dSJohn Marino   {
1654*cf7f2e2dSJohn Marino     struct gdbarch *gdbarch = get_objfile_arch (objfile);
1655*cf7f2e2dSJohn Marino 
1656*cf7f2e2dSJohn Marino     s = PSYMTAB_TO_SYMTAB (ps);
1657*cf7f2e2dSJohn Marino     if (s == NULL)
1658*cf7f2e2dSJohn Marino       continue;
1659*cf7f2e2dSJohn Marino     bv = BLOCKVECTOR (s);
1660*cf7f2e2dSJohn Marino     b = BLOCKVECTOR_BLOCK (bv, STATIC_BLOCK);
1661*cf7f2e2dSJohn Marino     psym = ps->objfile->static_psymbols.list + ps->statics_offset;
1662*cf7f2e2dSJohn Marino     length = ps->n_static_syms;
1663*cf7f2e2dSJohn Marino     while (length--)
1664*cf7f2e2dSJohn Marino       {
1665*cf7f2e2dSJohn Marino 	sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1666*cf7f2e2dSJohn Marino 				   SYMBOL_DOMAIN (*psym));
1667*cf7f2e2dSJohn Marino 	if (!sym)
1668*cf7f2e2dSJohn Marino 	  {
1669*cf7f2e2dSJohn Marino 	    printf_filtered ("Static symbol `");
1670*cf7f2e2dSJohn Marino 	    puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1671*cf7f2e2dSJohn Marino 	    printf_filtered ("' only found in ");
1672*cf7f2e2dSJohn Marino 	    puts_filtered (ps->filename);
1673*cf7f2e2dSJohn Marino 	    printf_filtered (" psymtab\n");
1674*cf7f2e2dSJohn Marino 	  }
1675*cf7f2e2dSJohn Marino 	psym++;
1676*cf7f2e2dSJohn Marino       }
1677*cf7f2e2dSJohn Marino     b = BLOCKVECTOR_BLOCK (bv, GLOBAL_BLOCK);
1678*cf7f2e2dSJohn Marino     psym = ps->objfile->global_psymbols.list + ps->globals_offset;
1679*cf7f2e2dSJohn Marino     length = ps->n_global_syms;
1680*cf7f2e2dSJohn Marino     while (length--)
1681*cf7f2e2dSJohn Marino       {
1682*cf7f2e2dSJohn Marino 	sym = lookup_block_symbol (b, SYMBOL_LINKAGE_NAME (*psym),
1683*cf7f2e2dSJohn Marino 				   SYMBOL_DOMAIN (*psym));
1684*cf7f2e2dSJohn Marino 	if (!sym)
1685*cf7f2e2dSJohn Marino 	  {
1686*cf7f2e2dSJohn Marino 	    printf_filtered ("Global symbol `");
1687*cf7f2e2dSJohn Marino 	    puts_filtered (SYMBOL_LINKAGE_NAME (*psym));
1688*cf7f2e2dSJohn Marino 	    printf_filtered ("' only found in ");
1689*cf7f2e2dSJohn Marino 	    puts_filtered (ps->filename);
1690*cf7f2e2dSJohn Marino 	    printf_filtered (" psymtab\n");
1691*cf7f2e2dSJohn Marino 	  }
1692*cf7f2e2dSJohn Marino 	psym++;
1693*cf7f2e2dSJohn Marino       }
1694*cf7f2e2dSJohn Marino     if (ps->texthigh < ps->textlow)
1695*cf7f2e2dSJohn Marino       {
1696*cf7f2e2dSJohn Marino 	printf_filtered ("Psymtab ");
1697*cf7f2e2dSJohn Marino 	puts_filtered (ps->filename);
1698*cf7f2e2dSJohn Marino 	printf_filtered (" covers bad range ");
1699*cf7f2e2dSJohn Marino 	fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1700*cf7f2e2dSJohn Marino 	printf_filtered (" - ");
1701*cf7f2e2dSJohn Marino 	fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1702*cf7f2e2dSJohn Marino 	printf_filtered ("\n");
1703*cf7f2e2dSJohn Marino 	continue;
1704*cf7f2e2dSJohn Marino       }
1705*cf7f2e2dSJohn Marino     if (ps->texthigh == 0)
1706*cf7f2e2dSJohn Marino       continue;
1707*cf7f2e2dSJohn Marino     if (ps->textlow < BLOCK_START (b) || ps->texthigh > BLOCK_END (b))
1708*cf7f2e2dSJohn Marino       {
1709*cf7f2e2dSJohn Marino 	printf_filtered ("Psymtab ");
1710*cf7f2e2dSJohn Marino 	puts_filtered (ps->filename);
1711*cf7f2e2dSJohn Marino 	printf_filtered (" covers ");
1712*cf7f2e2dSJohn Marino 	fputs_filtered (paddress (gdbarch, ps->textlow), gdb_stdout);
1713*cf7f2e2dSJohn Marino 	printf_filtered (" - ");
1714*cf7f2e2dSJohn Marino 	fputs_filtered (paddress (gdbarch, ps->texthigh), gdb_stdout);
1715*cf7f2e2dSJohn Marino 	printf_filtered (" but symtab covers only ");
1716*cf7f2e2dSJohn Marino 	fputs_filtered (paddress (gdbarch, BLOCK_START (b)), gdb_stdout);
1717*cf7f2e2dSJohn Marino 	printf_filtered (" - ");
1718*cf7f2e2dSJohn Marino 	fputs_filtered (paddress (gdbarch, BLOCK_END (b)), gdb_stdout);
1719*cf7f2e2dSJohn Marino 	printf_filtered ("\n");
1720*cf7f2e2dSJohn Marino       }
1721*cf7f2e2dSJohn Marino   }
1722*cf7f2e2dSJohn Marino }
1723*cf7f2e2dSJohn Marino 
1724*cf7f2e2dSJohn Marino 
1725*cf7f2e2dSJohn Marino 
1726*cf7f2e2dSJohn Marino void
1727*cf7f2e2dSJohn Marino map_partial_symbol_names (void (*fun) (const char *, void *), void *data)
1728*cf7f2e2dSJohn Marino {
1729*cf7f2e2dSJohn Marino   struct objfile *objfile;
1730*cf7f2e2dSJohn Marino 
1731*cf7f2e2dSJohn Marino   ALL_OBJFILES (objfile)
1732*cf7f2e2dSJohn Marino   {
1733*cf7f2e2dSJohn Marino     if (objfile->sf)
1734*cf7f2e2dSJohn Marino       objfile->sf->qf->map_symbol_names (objfile, fun, data);
1735*cf7f2e2dSJohn Marino   }
1736*cf7f2e2dSJohn Marino }
1737*cf7f2e2dSJohn Marino 
1738*cf7f2e2dSJohn Marino void
1739*cf7f2e2dSJohn Marino map_partial_symbol_filenames (void (*fun) (const char *, const char *,
1740*cf7f2e2dSJohn Marino 					   void *),
1741*cf7f2e2dSJohn Marino 			      void *data)
1742*cf7f2e2dSJohn Marino {
1743*cf7f2e2dSJohn Marino   struct objfile *objfile;
1744*cf7f2e2dSJohn Marino 
1745*cf7f2e2dSJohn Marino   ALL_OBJFILES (objfile)
1746*cf7f2e2dSJohn Marino   {
1747*cf7f2e2dSJohn Marino     if (objfile->sf)
1748*cf7f2e2dSJohn Marino       objfile->sf->qf->map_symbol_filenames (objfile, fun, data);
1749*cf7f2e2dSJohn Marino   }
1750*cf7f2e2dSJohn Marino }
1751