xref: /dflybsd-src/contrib/binutils-2.34/binutils/stabs.c (revision b52ef7118d1621abed722c5bbbd542210290ecef)
1*fae548d3Szrj /* stabs.c -- Parse stabs debugging information
2*fae548d3Szrj    Copyright (C) 1995-2020 Free Software Foundation, Inc.
3*fae548d3Szrj    Written by Ian Lance Taylor <ian@cygnus.com>.
4*fae548d3Szrj 
5*fae548d3Szrj    This file is part of GNU Binutils.
6*fae548d3Szrj 
7*fae548d3Szrj    This program is free software; you can redistribute it and/or modify
8*fae548d3Szrj    it under the terms of the GNU General Public License as published by
9*fae548d3Szrj    the Free Software Foundation; either version 3 of the License, or
10*fae548d3Szrj    (at your option) any later version.
11*fae548d3Szrj 
12*fae548d3Szrj    This program is distributed in the hope that it will be useful,
13*fae548d3Szrj    but WITHOUT ANY WARRANTY; without even the implied warranty of
14*fae548d3Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*fae548d3Szrj    GNU General Public License for more details.
16*fae548d3Szrj 
17*fae548d3Szrj    You should have received a copy of the GNU General Public License
18*fae548d3Szrj    along with this program; if not, write to the Free Software
19*fae548d3Szrj    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
20*fae548d3Szrj    02110-1301, USA.  */
21*fae548d3Szrj 
22*fae548d3Szrj /* This file contains code which parses stabs debugging information.
23*fae548d3Szrj    The organization of this code is based on the gdb stabs reading
24*fae548d3Szrj    code.  The job it does is somewhat different, because it is not
25*fae548d3Szrj    trying to identify the correct address for anything.  */
26*fae548d3Szrj 
27*fae548d3Szrj #include "sysdep.h"
28*fae548d3Szrj #include "bfd.h"
29*fae548d3Szrj #include "libiberty.h"
30*fae548d3Szrj #include "safe-ctype.h"
31*fae548d3Szrj #include "demangle.h"
32*fae548d3Szrj #include "debug.h"
33*fae548d3Szrj #include "budbg.h"
34*fae548d3Szrj #include "filenames.h"
35*fae548d3Szrj #include "aout/aout64.h"
36*fae548d3Szrj #include "aout/stab_gnu.h"
37*fae548d3Szrj 
38*fae548d3Szrj /* The number of predefined XCOFF types.  */
39*fae548d3Szrj 
40*fae548d3Szrj #define XCOFF_TYPE_COUNT 34
41*fae548d3Szrj 
42*fae548d3Szrj /* This structure is used as a handle so that the stab parsing doesn't
43*fae548d3Szrj    need to use any static variables.  */
44*fae548d3Szrj 
45*fae548d3Szrj struct stab_handle
46*fae548d3Szrj {
47*fae548d3Szrj   /* The BFD.  */
48*fae548d3Szrj   bfd *abfd;
49*fae548d3Szrj   /* TRUE if this is stabs in sections.  */
50*fae548d3Szrj   bfd_boolean sections;
51*fae548d3Szrj   /* The symbol table.  */
52*fae548d3Szrj   asymbol **syms;
53*fae548d3Szrj   /* The number of symbols.  */
54*fae548d3Szrj   long symcount;
55*fae548d3Szrj   /* The accumulated file name string.  */
56*fae548d3Szrj   char *so_string;
57*fae548d3Szrj   /* The value of the last N_SO symbol.  */
58*fae548d3Szrj   bfd_vma so_value;
59*fae548d3Szrj   /* The value of the start of the file, so that we can handle file
60*fae548d3Szrj      relative N_LBRAC and N_RBRAC symbols.  */
61*fae548d3Szrj   bfd_vma file_start_offset;
62*fae548d3Szrj   /* The offset of the start of the function, so that we can handle
63*fae548d3Szrj      function relative N_LBRAC and N_RBRAC symbols.  */
64*fae548d3Szrj   bfd_vma function_start_offset;
65*fae548d3Szrj   /* The version number of gcc which compiled the current compilation
66*fae548d3Szrj      unit, 0 if not compiled by gcc.  */
67*fae548d3Szrj   int gcc_compiled;
68*fae548d3Szrj   /* Whether an N_OPT symbol was seen that was not generated by gcc,
69*fae548d3Szrj      so that we can detect the SunPRO compiler.  */
70*fae548d3Szrj   bfd_boolean n_opt_found;
71*fae548d3Szrj   /* The main file name.  */
72*fae548d3Szrj   char *main_filename;
73*fae548d3Szrj   /* A stack of unfinished N_BINCL files.  */
74*fae548d3Szrj   struct bincl_file *bincl_stack;
75*fae548d3Szrj   /* A list of finished N_BINCL files.  */
76*fae548d3Szrj   struct bincl_file *bincl_list;
77*fae548d3Szrj   /* Whether we are inside a function or not.  */
78*fae548d3Szrj   bfd_boolean within_function;
79*fae548d3Szrj   /* The address of the end of the function, used if we have seen an
80*fae548d3Szrj      N_FUN symbol while in a function.  This is -1 if we have not seen
81*fae548d3Szrj      an N_FUN (the normal case).  */
82*fae548d3Szrj   bfd_vma function_end;
83*fae548d3Szrj   /* The depth of block nesting.  */
84*fae548d3Szrj   int block_depth;
85*fae548d3Szrj   /* List of pending variable definitions.  */
86*fae548d3Szrj   struct stab_pending_var *pending;
87*fae548d3Szrj   /* Number of files for which we have types.  */
88*fae548d3Szrj   unsigned int files;
89*fae548d3Szrj   /* Lists of types per file.  */
90*fae548d3Szrj   struct stab_types **file_types;
91*fae548d3Szrj   /* Predefined XCOFF types.  */
92*fae548d3Szrj   debug_type xcoff_types[XCOFF_TYPE_COUNT];
93*fae548d3Szrj   /* Undefined tags.  */
94*fae548d3Szrj   struct stab_tag *tags;
95*fae548d3Szrj   /* Set by parse_stab_type if it sees a structure defined as a cross
96*fae548d3Szrj      reference to itself.  Reset by parse_stab_type otherwise.  */
97*fae548d3Szrj   bfd_boolean self_crossref;
98*fae548d3Szrj };
99*fae548d3Szrj 
100*fae548d3Szrj /* A list of these structures is used to hold pending variable
101*fae548d3Szrj    definitions seen before the N_LBRAC of a block.  */
102*fae548d3Szrj 
103*fae548d3Szrj struct stab_pending_var
104*fae548d3Szrj {
105*fae548d3Szrj   /* Next pending variable definition.  */
106*fae548d3Szrj   struct stab_pending_var *next;
107*fae548d3Szrj   /* Name.  */
108*fae548d3Szrj   const char *name;
109*fae548d3Szrj   /* Type.  */
110*fae548d3Szrj   debug_type type;
111*fae548d3Szrj   /* Kind.  */
112*fae548d3Szrj   enum debug_var_kind kind;
113*fae548d3Szrj   /* Value.  */
114*fae548d3Szrj   bfd_vma val;
115*fae548d3Szrj };
116*fae548d3Szrj 
117*fae548d3Szrj /* A list of these structures is used to hold the types for a single
118*fae548d3Szrj    file.  */
119*fae548d3Szrj 
120*fae548d3Szrj struct stab_types
121*fae548d3Szrj {
122*fae548d3Szrj   /* Next set of slots for this file.  */
123*fae548d3Szrj   struct stab_types *next;
124*fae548d3Szrj   /* Types indexed by type number.  */
125*fae548d3Szrj #define STAB_TYPES_SLOTS (16)
126*fae548d3Szrj   debug_type types[STAB_TYPES_SLOTS];
127*fae548d3Szrj };
128*fae548d3Szrj 
129*fae548d3Szrj /* We keep a list of undefined tags that we encounter, so that we can
130*fae548d3Szrj    fill them in if the tag is later defined.  */
131*fae548d3Szrj 
132*fae548d3Szrj struct stab_tag
133*fae548d3Szrj {
134*fae548d3Szrj   /* Next undefined tag.  */
135*fae548d3Szrj   struct stab_tag *next;
136*fae548d3Szrj   /* Tag name.  */
137*fae548d3Szrj   const char *name;
138*fae548d3Szrj   /* Type kind.  */
139*fae548d3Szrj   enum debug_type_kind kind;
140*fae548d3Szrj   /* Slot to hold real type when we discover it.  If we don't, we fill
141*fae548d3Szrj      in an undefined tag type.  */
142*fae548d3Szrj   debug_type slot;
143*fae548d3Szrj   /* Indirect type we have created to point at slot.  */
144*fae548d3Szrj   debug_type type;
145*fae548d3Szrj };
146*fae548d3Szrj 
147*fae548d3Szrj static char *savestring (const char *, int);
148*fae548d3Szrj 
149*fae548d3Szrj static void bad_stab (const char *);
150*fae548d3Szrj static void warn_stab (const char *, const char *);
151*fae548d3Szrj static bfd_boolean parse_stab_string
152*fae548d3Szrj   (void *, struct stab_handle *, int, int, bfd_vma,
153*fae548d3Szrj    const char *, const char *);
154*fae548d3Szrj static debug_type parse_stab_type
155*fae548d3Szrj   (void *, struct stab_handle *, const char *, const char **,
156*fae548d3Szrj    debug_type **, const char *);
157*fae548d3Szrj static bfd_boolean parse_stab_type_number
158*fae548d3Szrj   (const char **, int *, const char *);
159*fae548d3Szrj static debug_type parse_stab_range_type
160*fae548d3Szrj   (void *, struct stab_handle *, const char *, const char **,
161*fae548d3Szrj    const int *, const char *);
162*fae548d3Szrj static debug_type parse_stab_sun_builtin_type
163*fae548d3Szrj   (void *, const char **, const char *);
164*fae548d3Szrj static debug_type parse_stab_sun_floating_type
165*fae548d3Szrj   (void *, const char **, const char *);
166*fae548d3Szrj static debug_type parse_stab_enum_type
167*fae548d3Szrj   (void *, const char **, const char *);
168*fae548d3Szrj static debug_type parse_stab_struct_type
169*fae548d3Szrj   (void *, struct stab_handle *, const char *, const char **,
170*fae548d3Szrj    bfd_boolean, const int *, const char *);
171*fae548d3Szrj static bfd_boolean parse_stab_baseclasses
172*fae548d3Szrj   (void *, struct stab_handle *, const char **, debug_baseclass **,
173*fae548d3Szrj    const char *);
174*fae548d3Szrj static bfd_boolean parse_stab_struct_fields
175*fae548d3Szrj   (void *, struct stab_handle *, const char **, debug_field **,
176*fae548d3Szrj    bfd_boolean *, const char *);
177*fae548d3Szrj static bfd_boolean parse_stab_cpp_abbrev
178*fae548d3Szrj   (void *, struct stab_handle *, const char **, debug_field *, const char *);
179*fae548d3Szrj static bfd_boolean parse_stab_one_struct_field
180*fae548d3Szrj   (void *, struct stab_handle *, const char **, const char *,
181*fae548d3Szrj    debug_field *, bfd_boolean *, const char *);
182*fae548d3Szrj static bfd_boolean parse_stab_members
183*fae548d3Szrj   (void *, struct stab_handle *, const char *, const char **, const int *,
184*fae548d3Szrj    debug_method **, const char *);
185*fae548d3Szrj static debug_type parse_stab_argtypes
186*fae548d3Szrj   (void *, struct stab_handle *, debug_type, const char *, const char *,
187*fae548d3Szrj    debug_type, const char *, bfd_boolean, bfd_boolean, const char **);
188*fae548d3Szrj static bfd_boolean parse_stab_tilde_field
189*fae548d3Szrj   (void *, struct stab_handle *, const char **, const int *, debug_type *,
190*fae548d3Szrj    bfd_boolean *, const char *);
191*fae548d3Szrj static debug_type parse_stab_array_type
192*fae548d3Szrj   (void *, struct stab_handle *, const char **, bfd_boolean, const char *);
193*fae548d3Szrj static void push_bincl (struct stab_handle *, const char *, bfd_vma);
194*fae548d3Szrj static const char *pop_bincl (struct stab_handle *);
195*fae548d3Szrj static bfd_boolean find_excl (struct stab_handle *, const char *, bfd_vma);
196*fae548d3Szrj static bfd_boolean stab_record_variable
197*fae548d3Szrj   (void *, struct stab_handle *, const char *, debug_type,
198*fae548d3Szrj    enum debug_var_kind, bfd_vma);
199*fae548d3Szrj static bfd_boolean stab_emit_pending_vars (void *, struct stab_handle *);
200*fae548d3Szrj static debug_type *stab_find_slot (struct stab_handle *, const int *);
201*fae548d3Szrj static debug_type stab_find_type (void *, struct stab_handle *, const int *);
202*fae548d3Szrj static bfd_boolean stab_record_type
203*fae548d3Szrj   (void *, struct stab_handle *, const int *, debug_type);
204*fae548d3Szrj static debug_type stab_xcoff_builtin_type
205*fae548d3Szrj   (void *, struct stab_handle *, int);
206*fae548d3Szrj static debug_type stab_find_tagged_type
207*fae548d3Szrj   (void *, struct stab_handle *, const char *, int, enum debug_type_kind);
208*fae548d3Szrj static debug_type *stab_demangle_argtypes
209*fae548d3Szrj   (void *, struct stab_handle *, const char *, bfd_boolean *, unsigned int);
210*fae548d3Szrj static debug_type *stab_demangle_v3_argtypes
211*fae548d3Szrj   (void *, struct stab_handle *, const char *, bfd_boolean *);
212*fae548d3Szrj static debug_type *stab_demangle_v3_arglist
213*fae548d3Szrj   (void *, struct stab_handle *, struct demangle_component *, bfd_boolean *);
214*fae548d3Szrj static debug_type stab_demangle_v3_arg
215*fae548d3Szrj   (void *, struct stab_handle *, struct demangle_component *, debug_type,
216*fae548d3Szrj    bfd_boolean *);
217*fae548d3Szrj 
218*fae548d3Szrj static int demangle_flags = DMGL_ANSI;
219*fae548d3Szrj 
220*fae548d3Szrj /* Save a string in memory.  */
221*fae548d3Szrj 
222*fae548d3Szrj static char *
savestring(const char * start,int len)223*fae548d3Szrj savestring (const char *start, int len)
224*fae548d3Szrj {
225*fae548d3Szrj   char *ret;
226*fae548d3Szrj 
227*fae548d3Szrj   ret = (char *) xmalloc (len + 1);
228*fae548d3Szrj   memcpy (ret, start, len);
229*fae548d3Szrj   ret[len] = '\0';
230*fae548d3Szrj   return ret;
231*fae548d3Szrj }
232*fae548d3Szrj 
233*fae548d3Szrj /* Read a number from a string.  */
234*fae548d3Szrj 
235*fae548d3Szrj static bfd_vma
parse_number(const char ** pp,bfd_boolean * poverflow,const char * p_end)236*fae548d3Szrj parse_number (const char **pp, bfd_boolean *poverflow, const char *p_end)
237*fae548d3Szrj {
238*fae548d3Szrj   unsigned long ul;
239*fae548d3Szrj   const char *orig;
240*fae548d3Szrj 
241*fae548d3Szrj   if (poverflow != NULL)
242*fae548d3Szrj     *poverflow = FALSE;
243*fae548d3Szrj 
244*fae548d3Szrj   orig = *pp;
245*fae548d3Szrj   if (orig >= p_end)
246*fae548d3Szrj     return (bfd_vma) 0;
247*fae548d3Szrj 
248*fae548d3Szrj   /* Stop early if we are passed an empty string.  */
249*fae548d3Szrj   if (*orig == 0)
250*fae548d3Szrj     return (bfd_vma) 0;
251*fae548d3Szrj 
252*fae548d3Szrj   errno = 0;
253*fae548d3Szrj   ul = strtoul (*pp, (char **) pp, 0);
254*fae548d3Szrj   if (ul + 1 != 0 || errno == 0)
255*fae548d3Szrj     {
256*fae548d3Szrj       /* If bfd_vma is larger than unsigned long, and the number is
257*fae548d3Szrj          meant to be negative, we have to make sure that we sign
258*fae548d3Szrj          extend properly.  */
259*fae548d3Szrj       if (*orig == '-')
260*fae548d3Szrj 	return (bfd_vma) (bfd_signed_vma) (long) ul;
261*fae548d3Szrj       return (bfd_vma) ul;
262*fae548d3Szrj     }
263*fae548d3Szrj 
264*fae548d3Szrj   /* Note that even though strtoul overflowed, it should have set *pp
265*fae548d3Szrj      to the end of the number, which is where we want it.  */
266*fae548d3Szrj   if (sizeof (bfd_vma) > sizeof (unsigned long))
267*fae548d3Szrj     {
268*fae548d3Szrj       const char *p;
269*fae548d3Szrj       bfd_boolean neg;
270*fae548d3Szrj       int base;
271*fae548d3Szrj       bfd_vma over, lastdig;
272*fae548d3Szrj       bfd_boolean overflow;
273*fae548d3Szrj       bfd_vma v;
274*fae548d3Szrj 
275*fae548d3Szrj       /* Our own version of strtoul, for a bfd_vma.  */
276*fae548d3Szrj       p = orig;
277*fae548d3Szrj 
278*fae548d3Szrj       neg = FALSE;
279*fae548d3Szrj       if (*p == '+')
280*fae548d3Szrj 	++p;
281*fae548d3Szrj       else if (*p == '-')
282*fae548d3Szrj 	{
283*fae548d3Szrj 	  neg = TRUE;
284*fae548d3Szrj 	  ++p;
285*fae548d3Szrj 	}
286*fae548d3Szrj 
287*fae548d3Szrj       base = 10;
288*fae548d3Szrj       if (*p == '0')
289*fae548d3Szrj 	{
290*fae548d3Szrj 	  if (p[1] == 'x' || p[1] == 'X')
291*fae548d3Szrj 	    {
292*fae548d3Szrj 	      base = 16;
293*fae548d3Szrj 	      p += 2;
294*fae548d3Szrj 	    }
295*fae548d3Szrj 	  else
296*fae548d3Szrj 	    {
297*fae548d3Szrj 	      base = 8;
298*fae548d3Szrj 	      ++p;
299*fae548d3Szrj 	    }
300*fae548d3Szrj 	}
301*fae548d3Szrj 
302*fae548d3Szrj       over = ((bfd_vma) (bfd_signed_vma) -1) / (bfd_vma) base;
303*fae548d3Szrj       lastdig = ((bfd_vma) (bfd_signed_vma) -1) % (bfd_vma) base;
304*fae548d3Szrj 
305*fae548d3Szrj       overflow = FALSE;
306*fae548d3Szrj       v = 0;
307*fae548d3Szrj       while (1)
308*fae548d3Szrj 	{
309*fae548d3Szrj 	  int d;
310*fae548d3Szrj 
311*fae548d3Szrj 	  d = *p++;
312*fae548d3Szrj 	  if (ISDIGIT (d))
313*fae548d3Szrj 	    d -= '0';
314*fae548d3Szrj 	  else if (ISUPPER (d))
315*fae548d3Szrj 	    d -= 'A';
316*fae548d3Szrj 	  else if (ISLOWER (d))
317*fae548d3Szrj 	    d -= 'a';
318*fae548d3Szrj 	  else
319*fae548d3Szrj 	    break;
320*fae548d3Szrj 
321*fae548d3Szrj 	  if (d >= base)
322*fae548d3Szrj 	    break;
323*fae548d3Szrj 
324*fae548d3Szrj 	  if (v > over || (v == over && (bfd_vma) d > lastdig))
325*fae548d3Szrj 	    {
326*fae548d3Szrj 	      overflow = TRUE;
327*fae548d3Szrj 	      break;
328*fae548d3Szrj 	    }
329*fae548d3Szrj 	}
330*fae548d3Szrj 
331*fae548d3Szrj       if (! overflow)
332*fae548d3Szrj 	{
333*fae548d3Szrj 	  if (neg)
334*fae548d3Szrj 	    v = - v;
335*fae548d3Szrj 	  return v;
336*fae548d3Szrj 	}
337*fae548d3Szrj     }
338*fae548d3Szrj 
339*fae548d3Szrj   /* If we get here, the number is too large to represent in a
340*fae548d3Szrj      bfd_vma.  */
341*fae548d3Szrj   if (poverflow != NULL)
342*fae548d3Szrj     *poverflow = TRUE;
343*fae548d3Szrj   else
344*fae548d3Szrj     warn_stab (orig, _("numeric overflow"));
345*fae548d3Szrj 
346*fae548d3Szrj   return 0;
347*fae548d3Szrj }
348*fae548d3Szrj 
349*fae548d3Szrj /* Give an error for a bad stab string.  */
350*fae548d3Szrj 
351*fae548d3Szrj static void
bad_stab(const char * p)352*fae548d3Szrj bad_stab (const char *p)
353*fae548d3Szrj {
354*fae548d3Szrj   fprintf (stderr, _("Bad stab: %s\n"), p);
355*fae548d3Szrj }
356*fae548d3Szrj 
357*fae548d3Szrj /* Warn about something in a stab string.  */
358*fae548d3Szrj 
359*fae548d3Szrj static void
warn_stab(const char * p,const char * err)360*fae548d3Szrj warn_stab (const char *p, const char *err)
361*fae548d3Szrj {
362*fae548d3Szrj   fprintf (stderr, _("Warning: %s: %s\n"), err, p);
363*fae548d3Szrj }
364*fae548d3Szrj 
365*fae548d3Szrj /* Create a handle to parse stabs symbols with.  */
366*fae548d3Szrj 
367*fae548d3Szrj void *
start_stab(void * dhandle ATTRIBUTE_UNUSED,bfd * abfd,bfd_boolean sections,asymbol ** syms,long symcount)368*fae548d3Szrj start_stab (void *dhandle ATTRIBUTE_UNUSED, bfd *abfd, bfd_boolean sections,
369*fae548d3Szrj 	    asymbol **syms, long symcount)
370*fae548d3Szrj {
371*fae548d3Szrj   struct stab_handle *ret;
372*fae548d3Szrj 
373*fae548d3Szrj   ret = (struct stab_handle *) xmalloc (sizeof *ret);
374*fae548d3Szrj   memset (ret, 0, sizeof *ret);
375*fae548d3Szrj   ret->abfd = abfd;
376*fae548d3Szrj   ret->sections = sections;
377*fae548d3Szrj   ret->syms = syms;
378*fae548d3Szrj   ret->symcount = symcount;
379*fae548d3Szrj   ret->files = 1;
380*fae548d3Szrj   ret->file_types = (struct stab_types **) xmalloc (sizeof *ret->file_types);
381*fae548d3Szrj   ret->file_types[0] = NULL;
382*fae548d3Szrj   ret->function_end = (bfd_vma) -1;
383*fae548d3Szrj   return (void *) ret;
384*fae548d3Szrj }
385*fae548d3Szrj 
386*fae548d3Szrj /* When we have processed all the stabs information, we need to go
387*fae548d3Szrj    through and fill in all the undefined tags.  */
388*fae548d3Szrj 
389*fae548d3Szrj bfd_boolean
finish_stab(void * dhandle,void * handle)390*fae548d3Szrj finish_stab (void *dhandle, void *handle)
391*fae548d3Szrj {
392*fae548d3Szrj   struct stab_handle *info = (struct stab_handle *) handle;
393*fae548d3Szrj   struct stab_tag *st;
394*fae548d3Szrj 
395*fae548d3Szrj   if (info->within_function)
396*fae548d3Szrj     {
397*fae548d3Szrj       if (! stab_emit_pending_vars (dhandle, info)
398*fae548d3Szrj 	  || ! debug_end_function (dhandle, info->function_end))
399*fae548d3Szrj 	return FALSE;
400*fae548d3Szrj       info->within_function = FALSE;
401*fae548d3Szrj       info->function_end = (bfd_vma) -1;
402*fae548d3Szrj     }
403*fae548d3Szrj 
404*fae548d3Szrj   for (st = info->tags; st != NULL; st = st->next)
405*fae548d3Szrj     {
406*fae548d3Szrj       enum debug_type_kind kind;
407*fae548d3Szrj 
408*fae548d3Szrj       kind = st->kind;
409*fae548d3Szrj       if (kind == DEBUG_KIND_ILLEGAL)
410*fae548d3Szrj 	kind = DEBUG_KIND_STRUCT;
411*fae548d3Szrj       st->slot = debug_make_undefined_tagged_type (dhandle, st->name, kind);
412*fae548d3Szrj       if (st->slot == DEBUG_TYPE_NULL)
413*fae548d3Szrj 	return FALSE;
414*fae548d3Szrj     }
415*fae548d3Szrj 
416*fae548d3Szrj   return TRUE;
417*fae548d3Szrj }
418*fae548d3Szrj 
419*fae548d3Szrj /* Handle a single stabs symbol.  */
420*fae548d3Szrj 
421*fae548d3Szrj bfd_boolean
parse_stab(void * dhandle,void * handle,int type,int desc,bfd_vma value,const char * string)422*fae548d3Szrj parse_stab (void *dhandle, void *handle, int type, int desc, bfd_vma value,
423*fae548d3Szrj 	    const char *string)
424*fae548d3Szrj {
425*fae548d3Szrj   const char * string_end;
426*fae548d3Szrj   struct stab_handle *info = (struct stab_handle *) handle;
427*fae548d3Szrj 
428*fae548d3Szrj   /* gcc will emit two N_SO strings per compilation unit, one for the
429*fae548d3Szrj      directory name and one for the file name.  We just collect N_SO
430*fae548d3Szrj      strings as we see them, and start the new compilation unit when
431*fae548d3Szrj      we see a non N_SO symbol.  */
432*fae548d3Szrj   if (info->so_string != NULL
433*fae548d3Szrj       && (type != N_SO || *string == '\0' || value != info->so_value))
434*fae548d3Szrj     {
435*fae548d3Szrj       if (! debug_set_filename (dhandle, info->so_string))
436*fae548d3Szrj 	return FALSE;
437*fae548d3Szrj       info->main_filename = info->so_string;
438*fae548d3Szrj 
439*fae548d3Szrj       info->gcc_compiled = 0;
440*fae548d3Szrj       info->n_opt_found = FALSE;
441*fae548d3Szrj 
442*fae548d3Szrj       /* Generally, for stabs in the symbol table, the N_LBRAC and
443*fae548d3Szrj 	 N_RBRAC symbols are relative to the N_SO symbol value.  */
444*fae548d3Szrj       if (! info->sections)
445*fae548d3Szrj 	info->file_start_offset = info->so_value;
446*fae548d3Szrj 
447*fae548d3Szrj       /* We need to reset the mapping from type numbers to types.  We
448*fae548d3Szrj 	 can't free the old mapping, because of the use of
449*fae548d3Szrj 	 debug_make_indirect_type.  */
450*fae548d3Szrj       info->files = 1;
451*fae548d3Szrj       info->file_types = ((struct stab_types **)
452*fae548d3Szrj 			  xmalloc (sizeof *info->file_types));
453*fae548d3Szrj       info->file_types[0] = NULL;
454*fae548d3Szrj       info->so_string = NULL;
455*fae548d3Szrj 
456*fae548d3Szrj       /* Now process whatever type we just got.  */
457*fae548d3Szrj     }
458*fae548d3Szrj 
459*fae548d3Szrj   string_end = string + strlen (string);
460*fae548d3Szrj 
461*fae548d3Szrj   switch (type)
462*fae548d3Szrj     {
463*fae548d3Szrj     case N_FN:
464*fae548d3Szrj     case N_FN_SEQ:
465*fae548d3Szrj       break;
466*fae548d3Szrj 
467*fae548d3Szrj     case N_LBRAC:
468*fae548d3Szrj       /* Ignore extra outermost context from SunPRO cc and acc.  */
469*fae548d3Szrj       if (info->n_opt_found && desc == 1)
470*fae548d3Szrj 	break;
471*fae548d3Szrj 
472*fae548d3Szrj       if (! info->within_function)
473*fae548d3Szrj 	{
474*fae548d3Szrj 	  fprintf (stderr, _("N_LBRAC not within function\n"));
475*fae548d3Szrj 	  return FALSE;
476*fae548d3Szrj 	}
477*fae548d3Szrj 
478*fae548d3Szrj       /* Start an inner lexical block.  */
479*fae548d3Szrj       if (! debug_start_block (dhandle,
480*fae548d3Szrj 			       (value
481*fae548d3Szrj 				+ info->file_start_offset
482*fae548d3Szrj 				+ info->function_start_offset)))
483*fae548d3Szrj 	return FALSE;
484*fae548d3Szrj 
485*fae548d3Szrj       /* Emit any pending variable definitions.  */
486*fae548d3Szrj       if (! stab_emit_pending_vars (dhandle, info))
487*fae548d3Szrj 	return FALSE;
488*fae548d3Szrj 
489*fae548d3Szrj       ++info->block_depth;
490*fae548d3Szrj       break;
491*fae548d3Szrj 
492*fae548d3Szrj     case N_RBRAC:
493*fae548d3Szrj       /* Ignore extra outermost context from SunPRO cc and acc.  */
494*fae548d3Szrj       if (info->n_opt_found && desc == 1)
495*fae548d3Szrj 	break;
496*fae548d3Szrj 
497*fae548d3Szrj       /* We shouldn't have any pending variable definitions here, but,
498*fae548d3Szrj          if we do, we probably need to emit them before closing the
499*fae548d3Szrj          block.  */
500*fae548d3Szrj       if (! stab_emit_pending_vars (dhandle, info))
501*fae548d3Szrj 	return FALSE;
502*fae548d3Szrj 
503*fae548d3Szrj       /* End an inner lexical block.  */
504*fae548d3Szrj       if (! debug_end_block (dhandle,
505*fae548d3Szrj 			     (value
506*fae548d3Szrj 			      + info->file_start_offset
507*fae548d3Szrj 			      + info->function_start_offset)))
508*fae548d3Szrj 	return FALSE;
509*fae548d3Szrj 
510*fae548d3Szrj       --info->block_depth;
511*fae548d3Szrj       if (info->block_depth < 0)
512*fae548d3Szrj 	{
513*fae548d3Szrj 	  fprintf (stderr, _("Too many N_RBRACs\n"));
514*fae548d3Szrj 	  return FALSE;
515*fae548d3Szrj 	}
516*fae548d3Szrj       break;
517*fae548d3Szrj 
518*fae548d3Szrj     case N_SO:
519*fae548d3Szrj       /* This always ends a function.  */
520*fae548d3Szrj       if (info->within_function)
521*fae548d3Szrj 	{
522*fae548d3Szrj 	  bfd_vma endval;
523*fae548d3Szrj 
524*fae548d3Szrj 	  endval = value;
525*fae548d3Szrj 	  if (*string != '\0'
526*fae548d3Szrj 	      && info->function_end != (bfd_vma) -1
527*fae548d3Szrj 	      && info->function_end < endval)
528*fae548d3Szrj 	    endval = info->function_end;
529*fae548d3Szrj 	  if (! stab_emit_pending_vars (dhandle, info)
530*fae548d3Szrj 	      || ! debug_end_function (dhandle, endval))
531*fae548d3Szrj 	    return FALSE;
532*fae548d3Szrj 	  info->within_function = FALSE;
533*fae548d3Szrj 	  info->function_end = (bfd_vma) -1;
534*fae548d3Szrj 	}
535*fae548d3Szrj 
536*fae548d3Szrj       /* An empty string is emitted by gcc at the end of a compilation
537*fae548d3Szrj          unit.  */
538*fae548d3Szrj       if (*string == '\0')
539*fae548d3Szrj 	return TRUE;
540*fae548d3Szrj 
541*fae548d3Szrj       /* Just accumulate strings until we see a non N_SO symbol.  If
542*fae548d3Szrj          the string starts with a directory separator or some other
543*fae548d3Szrj 	 form of absolute path specification, we discard the previously
544*fae548d3Szrj          accumulated strings.  */
545*fae548d3Szrj       if (info->so_string == NULL)
546*fae548d3Szrj 	info->so_string = xstrdup (string);
547*fae548d3Szrj       else
548*fae548d3Szrj 	{
549*fae548d3Szrj 	  char *f;
550*fae548d3Szrj 
551*fae548d3Szrj 	  f = info->so_string;
552*fae548d3Szrj 
553*fae548d3Szrj 	  if (IS_ABSOLUTE_PATH (string))
554*fae548d3Szrj 	    info->so_string = xstrdup (string);
555*fae548d3Szrj 	  else
556*fae548d3Szrj 	    info->so_string = concat (info->so_string, string,
557*fae548d3Szrj 				      (const char *) NULL);
558*fae548d3Szrj 	  free (f);
559*fae548d3Szrj 	}
560*fae548d3Szrj 
561*fae548d3Szrj       info->so_value = value;
562*fae548d3Szrj 
563*fae548d3Szrj       break;
564*fae548d3Szrj 
565*fae548d3Szrj     case N_SOL:
566*fae548d3Szrj       /* Start an include file.  */
567*fae548d3Szrj       if (! debug_start_source (dhandle, string))
568*fae548d3Szrj 	return FALSE;
569*fae548d3Szrj       break;
570*fae548d3Szrj 
571*fae548d3Szrj     case N_BINCL:
572*fae548d3Szrj       /* Start an include file which may be replaced.  */
573*fae548d3Szrj       push_bincl (info, string, value);
574*fae548d3Szrj       if (! debug_start_source (dhandle, string))
575*fae548d3Szrj 	return FALSE;
576*fae548d3Szrj       break;
577*fae548d3Szrj 
578*fae548d3Szrj     case N_EINCL:
579*fae548d3Szrj       /* End an N_BINCL include.  */
580*fae548d3Szrj       if (! debug_start_source (dhandle, pop_bincl (info)))
581*fae548d3Szrj 	return FALSE;
582*fae548d3Szrj       break;
583*fae548d3Szrj 
584*fae548d3Szrj     case N_EXCL:
585*fae548d3Szrj       /* This is a duplicate of a header file named by N_BINCL which
586*fae548d3Szrj          was eliminated by the linker.  */
587*fae548d3Szrj       if (! find_excl (info, string, value))
588*fae548d3Szrj 	return FALSE;
589*fae548d3Szrj       break;
590*fae548d3Szrj 
591*fae548d3Szrj     case N_SLINE:
592*fae548d3Szrj       if (! debug_record_line (dhandle, desc,
593*fae548d3Szrj 			       value + (info->within_function
594*fae548d3Szrj 					? info->function_start_offset : 0)))
595*fae548d3Szrj 	return FALSE;
596*fae548d3Szrj       break;
597*fae548d3Szrj 
598*fae548d3Szrj     case N_BCOMM:
599*fae548d3Szrj       if (! debug_start_common_block (dhandle, string))
600*fae548d3Szrj 	return FALSE;
601*fae548d3Szrj       break;
602*fae548d3Szrj 
603*fae548d3Szrj     case N_ECOMM:
604*fae548d3Szrj       if (! debug_end_common_block (dhandle, string))
605*fae548d3Szrj 	return FALSE;
606*fae548d3Szrj       break;
607*fae548d3Szrj 
608*fae548d3Szrj     case N_FUN:
609*fae548d3Szrj       if (*string == '\0')
610*fae548d3Szrj 	{
611*fae548d3Szrj 	  if (info->within_function)
612*fae548d3Szrj 	    {
613*fae548d3Szrj 	      /* This always marks the end of a function; we don't
614*fae548d3Szrj                  need to worry about info->function_end.  */
615*fae548d3Szrj 	      if (info->sections)
616*fae548d3Szrj 		value += info->function_start_offset;
617*fae548d3Szrj 	      if (! stab_emit_pending_vars (dhandle, info)
618*fae548d3Szrj 		  || ! debug_end_function (dhandle, value))
619*fae548d3Szrj 		return FALSE;
620*fae548d3Szrj 	      info->within_function = FALSE;
621*fae548d3Szrj 	      info->function_end = (bfd_vma) -1;
622*fae548d3Szrj 	    }
623*fae548d3Szrj 	  break;
624*fae548d3Szrj 	}
625*fae548d3Szrj 
626*fae548d3Szrj       /* A const static symbol in the .text section will have an N_FUN
627*fae548d3Szrj          entry.  We need to use these to mark the end of the function,
628*fae548d3Szrj          in case we are looking at gcc output before it was changed to
629*fae548d3Szrj          always emit an empty N_FUN.  We can't call debug_end_function
630*fae548d3Szrj          here, because it might be a local static symbol.  */
631*fae548d3Szrj       if (info->within_function
632*fae548d3Szrj 	  && (info->function_end == (bfd_vma) -1
633*fae548d3Szrj 	      || value < info->function_end))
634*fae548d3Szrj 	info->function_end = value;
635*fae548d3Szrj 
636*fae548d3Szrj       /* Fall through.  */
637*fae548d3Szrj       /* FIXME: gdb checks the string for N_STSYM, N_LCSYM or N_ROSYM
638*fae548d3Szrj          symbols, and if it does not start with :S, gdb relocates the
639*fae548d3Szrj          value to the start of the section.  gcc always seems to use
640*fae548d3Szrj          :S, so we don't worry about this.  */
641*fae548d3Szrj       /* Fall through.  */
642*fae548d3Szrj     default:
643*fae548d3Szrj       {
644*fae548d3Szrj 	const char *colon;
645*fae548d3Szrj 
646*fae548d3Szrj 	colon = strchr (string, ':');
647*fae548d3Szrj 	if (colon != NULL
648*fae548d3Szrj 	    && (colon[1] == 'f' || colon[1] == 'F'))
649*fae548d3Szrj 	  {
650*fae548d3Szrj 	    if (info->within_function)
651*fae548d3Szrj 	      {
652*fae548d3Szrj 		bfd_vma endval;
653*fae548d3Szrj 
654*fae548d3Szrj 		endval = value;
655*fae548d3Szrj 		if (info->function_end != (bfd_vma) -1
656*fae548d3Szrj 		    && info->function_end < endval)
657*fae548d3Szrj 		  endval = info->function_end;
658*fae548d3Szrj 		if (! stab_emit_pending_vars (dhandle, info)
659*fae548d3Szrj 		    || ! debug_end_function (dhandle, endval))
660*fae548d3Szrj 		  return FALSE;
661*fae548d3Szrj 		info->function_end = (bfd_vma) -1;
662*fae548d3Szrj 	      }
663*fae548d3Szrj 	    /* For stabs in sections, line numbers and block addresses
664*fae548d3Szrj                are offsets from the start of the function.  */
665*fae548d3Szrj 	    if (info->sections)
666*fae548d3Szrj 	      info->function_start_offset = value;
667*fae548d3Szrj 	    info->within_function = TRUE;
668*fae548d3Szrj 	  }
669*fae548d3Szrj 
670*fae548d3Szrj 	if (! parse_stab_string (dhandle, info, type, desc, value, string, string_end))
671*fae548d3Szrj 	  return FALSE;
672*fae548d3Szrj       }
673*fae548d3Szrj       break;
674*fae548d3Szrj 
675*fae548d3Szrj     case N_OPT:
676*fae548d3Szrj       if (string != NULL && strcmp (string, "gcc2_compiled.") == 0)
677*fae548d3Szrj 	info->gcc_compiled = 2;
678*fae548d3Szrj       else if (string != NULL && strcmp (string, "gcc_compiled.") == 0)
679*fae548d3Szrj 	info->gcc_compiled = 1;
680*fae548d3Szrj       else
681*fae548d3Szrj 	info->n_opt_found = TRUE;
682*fae548d3Szrj       break;
683*fae548d3Szrj 
684*fae548d3Szrj     case N_OBJ:
685*fae548d3Szrj     case N_ENDM:
686*fae548d3Szrj     case N_MAIN:
687*fae548d3Szrj     case N_WARNING:
688*fae548d3Szrj       break;
689*fae548d3Szrj     }
690*fae548d3Szrj 
691*fae548d3Szrj   return TRUE;
692*fae548d3Szrj }
693*fae548d3Szrj 
694*fae548d3Szrj /* Parse the stabs string.  */
695*fae548d3Szrj 
696*fae548d3Szrj static bfd_boolean
parse_stab_string(void * dhandle,struct stab_handle * info,int stabtype,int desc ATTRIBUTE_UNUSED,bfd_vma value,const char * string,const char * string_end)697*fae548d3Szrj parse_stab_string (void *dhandle, struct stab_handle *info, int stabtype,
698*fae548d3Szrj 		   int desc ATTRIBUTE_UNUSED, bfd_vma value,
699*fae548d3Szrj 		   const char *string, const char * string_end)
700*fae548d3Szrj {
701*fae548d3Szrj   const char *p;
702*fae548d3Szrj   char *name;
703*fae548d3Szrj   int type;
704*fae548d3Szrj   debug_type dtype;
705*fae548d3Szrj   bfd_boolean synonym;
706*fae548d3Szrj   bfd_boolean self_crossref;
707*fae548d3Szrj   debug_type *slot;
708*fae548d3Szrj 
709*fae548d3Szrj   p = strchr (string, ':');
710*fae548d3Szrj   if (p == NULL)
711*fae548d3Szrj     return TRUE;
712*fae548d3Szrj 
713*fae548d3Szrj   while (p[1] == ':')
714*fae548d3Szrj     {
715*fae548d3Szrj       p += 2;
716*fae548d3Szrj       p = strchr (p, ':');
717*fae548d3Szrj       if (p == NULL)
718*fae548d3Szrj 	{
719*fae548d3Szrj 	  bad_stab (string);
720*fae548d3Szrj 	  return FALSE;
721*fae548d3Szrj 	}
722*fae548d3Szrj     }
723*fae548d3Szrj 
724*fae548d3Szrj   /* FIXME: Sometimes the special C++ names start with '.'.  */
725*fae548d3Szrj   name = NULL;
726*fae548d3Szrj   if (string[0] == '$')
727*fae548d3Szrj     {
728*fae548d3Szrj       switch (string[1])
729*fae548d3Szrj 	{
730*fae548d3Szrj 	case 't':
731*fae548d3Szrj 	  name = "this";
732*fae548d3Szrj 	  break;
733*fae548d3Szrj 	case 'v':
734*fae548d3Szrj 	  /* Was: name = "vptr"; */
735*fae548d3Szrj 	  break;
736*fae548d3Szrj 	case 'e':
737*fae548d3Szrj 	  name = "eh_throw";
738*fae548d3Szrj 	  break;
739*fae548d3Szrj 	case '_':
740*fae548d3Szrj 	  /* This was an anonymous type that was never fixed up.  */
741*fae548d3Szrj 	  break;
742*fae548d3Szrj 	case 'X':
743*fae548d3Szrj 	  /* SunPRO (3.0 at least) static variable encoding.  */
744*fae548d3Szrj 	  break;
745*fae548d3Szrj 	default:
746*fae548d3Szrj 	  warn_stab (string, _("unknown C++ encoded name"));
747*fae548d3Szrj 	  break;
748*fae548d3Szrj 	}
749*fae548d3Szrj     }
750*fae548d3Szrj 
751*fae548d3Szrj   if (name == NULL)
752*fae548d3Szrj     {
753*fae548d3Szrj       if (p == string || (string[0] == ' ' && p == string + 1))
754*fae548d3Szrj 	name = NULL;
755*fae548d3Szrj       else
756*fae548d3Szrj 	name = savestring (string, p - string);
757*fae548d3Szrj     }
758*fae548d3Szrj 
759*fae548d3Szrj   ++p;
760*fae548d3Szrj   if (ISDIGIT (*p) || *p == '(' || *p == '-')
761*fae548d3Szrj     type = 'l';
762*fae548d3Szrj   else if (*p == 0)
763*fae548d3Szrj     {
764*fae548d3Szrj       bad_stab (string);
765*fae548d3Szrj       return FALSE;
766*fae548d3Szrj     }
767*fae548d3Szrj   else
768*fae548d3Szrj     type = *p++;
769*fae548d3Szrj 
770*fae548d3Szrj   switch (type)
771*fae548d3Szrj     {
772*fae548d3Szrj     case 'c':
773*fae548d3Szrj       /* c is a special case, not followed by a type-number.
774*fae548d3Szrj 	 SYMBOL:c=iVALUE for an integer constant symbol.
775*fae548d3Szrj 	 SYMBOL:c=rVALUE for a floating constant symbol.
776*fae548d3Szrj 	 SYMBOL:c=eTYPE,INTVALUE for an enum constant symbol.
777*fae548d3Szrj 	 e.g. "b:c=e6,0" for "const b = blob1"
778*fae548d3Szrj 	 (where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;").  */
779*fae548d3Szrj       if (*p != '=')
780*fae548d3Szrj 	{
781*fae548d3Szrj 	  bad_stab (string);
782*fae548d3Szrj 	  return FALSE;
783*fae548d3Szrj 	}
784*fae548d3Szrj       ++p;
785*fae548d3Szrj       switch (*p++)
786*fae548d3Szrj 	{
787*fae548d3Szrj 	case 'r':
788*fae548d3Szrj 	  /* Floating point constant.  */
789*fae548d3Szrj 	  if (! debug_record_float_const (dhandle, name, atof (p)))
790*fae548d3Szrj 	    return FALSE;
791*fae548d3Szrj 	  break;
792*fae548d3Szrj 	case 'i':
793*fae548d3Szrj 	  /* Integer constant.  */
794*fae548d3Szrj 	  /* Defining integer constants this way is kind of silly,
795*fae548d3Szrj 	     since 'e' constants allows the compiler to give not only
796*fae548d3Szrj 	     the value, but the type as well.  C has at least int,
797*fae548d3Szrj 	     long, unsigned int, and long long as constant types;
798*fae548d3Szrj 	     other languages probably should have at least unsigned as
799*fae548d3Szrj 	     well as signed constants.  */
800*fae548d3Szrj 	  if (! debug_record_int_const (dhandle, name, atoi (p)))
801*fae548d3Szrj 	    return FALSE;
802*fae548d3Szrj 	  break;
803*fae548d3Szrj 	case 'e':
804*fae548d3Szrj 	  /* SYMBOL:c=eTYPE,INTVALUE for a constant symbol whose value
805*fae548d3Szrj 	     can be represented as integral.
806*fae548d3Szrj 	     e.g. "b:c=e6,0" for "const b = blob1"
807*fae548d3Szrj 	     (where type 6 is defined by "blobs:t6=eblob1:0,blob2:1,;").  */
808*fae548d3Szrj 	  dtype = parse_stab_type (dhandle, info, (const char *) NULL,
809*fae548d3Szrj 				   &p, (debug_type **) NULL, string_end);
810*fae548d3Szrj 	  if (dtype == DEBUG_TYPE_NULL)
811*fae548d3Szrj 	    return FALSE;
812*fae548d3Szrj 	  if (*p != ',')
813*fae548d3Szrj 	    {
814*fae548d3Szrj 	      bad_stab (string);
815*fae548d3Szrj 	      return FALSE;
816*fae548d3Szrj 	    }
817*fae548d3Szrj 	  if (! debug_record_typed_const (dhandle, name, dtype, atoi (p)))
818*fae548d3Szrj 	    return FALSE;
819*fae548d3Szrj 	  break;
820*fae548d3Szrj 	default:
821*fae548d3Szrj 	  bad_stab (string);
822*fae548d3Szrj 	  return FALSE;
823*fae548d3Szrj 	}
824*fae548d3Szrj 
825*fae548d3Szrj       break;
826*fae548d3Szrj 
827*fae548d3Szrj     case 'C':
828*fae548d3Szrj       /* The name of a caught exception.  */
829*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL,
830*fae548d3Szrj 			       &p, (debug_type **) NULL, string_end);
831*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
832*fae548d3Szrj 	return FALSE;
833*fae548d3Szrj       if (! debug_record_label (dhandle, name, dtype, value))
834*fae548d3Szrj 	return FALSE;
835*fae548d3Szrj       break;
836*fae548d3Szrj 
837*fae548d3Szrj     case 'f':
838*fae548d3Szrj     case 'F':
839*fae548d3Szrj       /* A function definition.  */
840*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
841*fae548d3Szrj 			       (debug_type **) NULL, string_end);
842*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
843*fae548d3Szrj 	return FALSE;
844*fae548d3Szrj       if (! debug_record_function (dhandle, name, dtype, type == 'F', value))
845*fae548d3Szrj 	return FALSE;
846*fae548d3Szrj 
847*fae548d3Szrj       /* Sun acc puts declared types of arguments here.  We don't care
848*fae548d3Szrj 	 about their actual types (FIXME -- we should remember the whole
849*fae548d3Szrj 	 function prototype), but the list may define some new types
850*fae548d3Szrj 	 that we have to remember, so we must scan it now.  */
851*fae548d3Szrj       while (*p == ';')
852*fae548d3Szrj 	{
853*fae548d3Szrj 	  ++p;
854*fae548d3Szrj 	  if (parse_stab_type (dhandle, info, (const char *) NULL, &p,
855*fae548d3Szrj 			       (debug_type **) NULL, string_end)
856*fae548d3Szrj 	      == DEBUG_TYPE_NULL)
857*fae548d3Szrj 	    return FALSE;
858*fae548d3Szrj 	}
859*fae548d3Szrj 
860*fae548d3Szrj       break;
861*fae548d3Szrj 
862*fae548d3Szrj     case 'G':
863*fae548d3Szrj       {
864*fae548d3Szrj 	asymbol **ps;
865*fae548d3Szrj 
866*fae548d3Szrj 	/* A global symbol.  The value must be extracted from the
867*fae548d3Szrj 	   symbol table.  */
868*fae548d3Szrj 	dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
869*fae548d3Szrj 				 (debug_type **) NULL, string_end);
870*fae548d3Szrj 	if (dtype == DEBUG_TYPE_NULL)
871*fae548d3Szrj 	  return FALSE;
872*fae548d3Szrj 	if (name != NULL)
873*fae548d3Szrj 	  {
874*fae548d3Szrj 	    char leading;
875*fae548d3Szrj 	    long c;
876*fae548d3Szrj 
877*fae548d3Szrj 	    leading = bfd_get_symbol_leading_char (info->abfd);
878*fae548d3Szrj 	    for (c = info->symcount, ps = info->syms; c > 0; --c, ++ps)
879*fae548d3Szrj 	      {
880*fae548d3Szrj 		const char *n;
881*fae548d3Szrj 
882*fae548d3Szrj 		n = bfd_asymbol_name (*ps);
883*fae548d3Szrj 		if (leading != '\0' && *n == leading)
884*fae548d3Szrj 		  ++n;
885*fae548d3Szrj 		if (*n == *name && strcmp (n, name) == 0)
886*fae548d3Szrj 		  break;
887*fae548d3Szrj 	      }
888*fae548d3Szrj 
889*fae548d3Szrj 	    if (c > 0)
890*fae548d3Szrj 	      value = bfd_asymbol_value (*ps);
891*fae548d3Szrj 	  }
892*fae548d3Szrj 
893*fae548d3Szrj 	if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_GLOBAL,
894*fae548d3Szrj 				    value))
895*fae548d3Szrj 	  return FALSE;
896*fae548d3Szrj       }
897*fae548d3Szrj       break;
898*fae548d3Szrj 
899*fae548d3Szrj       /* This case is faked by a conditional above, when there is no
900*fae548d3Szrj 	 code letter in the dbx data.  Dbx data never actually
901*fae548d3Szrj 	 contains 'l'.  */
902*fae548d3Szrj     case 'l':
903*fae548d3Szrj     case 's':
904*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
905*fae548d3Szrj 			       (debug_type **) NULL, string_end);
906*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
907*fae548d3Szrj 	return FALSE;
908*fae548d3Szrj       if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_LOCAL,
909*fae548d3Szrj 				  value))
910*fae548d3Szrj 	return FALSE;
911*fae548d3Szrj       break;
912*fae548d3Szrj 
913*fae548d3Szrj     case 'p':
914*fae548d3Szrj       /* A function parameter.  */
915*fae548d3Szrj       if (*p != 'F')
916*fae548d3Szrj 	dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
917*fae548d3Szrj 				 (debug_type **) NULL, string_end);
918*fae548d3Szrj       else
919*fae548d3Szrj 	{
920*fae548d3Szrj 	/* pF is a two-letter code that means a function parameter in
921*fae548d3Szrj 	   Fortran.  The type-number specifies the type of the return
922*fae548d3Szrj 	   value.  Translate it into a pointer-to-function type.  */
923*fae548d3Szrj 	  ++p;
924*fae548d3Szrj 	  dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
925*fae548d3Szrj 				   (debug_type **) NULL, string_end);
926*fae548d3Szrj 	  if (dtype != DEBUG_TYPE_NULL)
927*fae548d3Szrj 	    {
928*fae548d3Szrj 	      debug_type ftype;
929*fae548d3Szrj 
930*fae548d3Szrj 	      ftype = debug_make_function_type (dhandle, dtype,
931*fae548d3Szrj 						(debug_type *) NULL, FALSE);
932*fae548d3Szrj 	      dtype = debug_make_pointer_type (dhandle, ftype);
933*fae548d3Szrj 	    }
934*fae548d3Szrj 	}
935*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
936*fae548d3Szrj 	return FALSE;
937*fae548d3Szrj       if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_STACK,
938*fae548d3Szrj 				    value))
939*fae548d3Szrj 	return FALSE;
940*fae548d3Szrj 
941*fae548d3Szrj       /* FIXME: At this point gdb considers rearranging the parameter
942*fae548d3Szrj 	 address on a big endian machine if it is smaller than an int.
943*fae548d3Szrj 	 We have no way to do that, since we don't really know much
944*fae548d3Szrj 	 about the target.  */
945*fae548d3Szrj       break;
946*fae548d3Szrj 
947*fae548d3Szrj     case 'P':
948*fae548d3Szrj       if (stabtype == N_FUN)
949*fae548d3Szrj 	{
950*fae548d3Szrj 	  /* Prototype of a function referenced by this file.  */
951*fae548d3Szrj 	  while (*p == ';')
952*fae548d3Szrj 	    {
953*fae548d3Szrj 	      ++p;
954*fae548d3Szrj 	      if (parse_stab_type (dhandle, info, (const char *) NULL, &p,
955*fae548d3Szrj 				   (debug_type **) NULL, string_end)
956*fae548d3Szrj 		  == DEBUG_TYPE_NULL)
957*fae548d3Szrj 		return FALSE;
958*fae548d3Szrj 	    }
959*fae548d3Szrj 	  break;
960*fae548d3Szrj 	}
961*fae548d3Szrj       /* Fall through.  */
962*fae548d3Szrj     case 'R':
963*fae548d3Szrj       /* Parameter which is in a register.  */
964*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
965*fae548d3Szrj 			       (debug_type **) NULL, string_end);
966*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
967*fae548d3Szrj 	return FALSE;
968*fae548d3Szrj       if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_REG,
969*fae548d3Szrj 				    value))
970*fae548d3Szrj 	return FALSE;
971*fae548d3Szrj       break;
972*fae548d3Szrj 
973*fae548d3Szrj     case 'r':
974*fae548d3Szrj       /* Register variable (either global or local).  */
975*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
976*fae548d3Szrj 			       (debug_type **) NULL, string_end);
977*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
978*fae548d3Szrj 	return FALSE;
979*fae548d3Szrj       if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_REGISTER,
980*fae548d3Szrj 				  value))
981*fae548d3Szrj 	return FALSE;
982*fae548d3Szrj 
983*fae548d3Szrj       /* FIXME: At this point gdb checks to combine pairs of 'p' and
984*fae548d3Szrj 	 'r' stabs into a single 'P' stab.  */
985*fae548d3Szrj       break;
986*fae548d3Szrj 
987*fae548d3Szrj     case 'S':
988*fae548d3Szrj       /* Static symbol at top level of file.  */
989*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
990*fae548d3Szrj 			       (debug_type **) NULL, string_end);
991*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
992*fae548d3Szrj 	return FALSE;
993*fae548d3Szrj       if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_STATIC,
994*fae548d3Szrj 				  value))
995*fae548d3Szrj 	return FALSE;
996*fae548d3Szrj       break;
997*fae548d3Szrj 
998*fae548d3Szrj     case 't':
999*fae548d3Szrj       /* A typedef.  */
1000*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, name, &p, &slot, string_end);
1001*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1002*fae548d3Szrj 	return FALSE;
1003*fae548d3Szrj       if (name == NULL)
1004*fae548d3Szrj 	{
1005*fae548d3Szrj 	  /* A nameless type.  Nothing to do.  */
1006*fae548d3Szrj 	  return TRUE;
1007*fae548d3Szrj 	}
1008*fae548d3Szrj 
1009*fae548d3Szrj       dtype = debug_name_type (dhandle, name, dtype);
1010*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1011*fae548d3Szrj 	return FALSE;
1012*fae548d3Szrj 
1013*fae548d3Szrj       if (slot != NULL)
1014*fae548d3Szrj 	*slot = dtype;
1015*fae548d3Szrj 
1016*fae548d3Szrj       break;
1017*fae548d3Szrj 
1018*fae548d3Szrj     case 'T':
1019*fae548d3Szrj       /* Struct, union, or enum tag.  For GNU C++, this can be followed
1020*fae548d3Szrj 	 by 't' which means we are typedef'ing it as well.  */
1021*fae548d3Szrj       if (*p != 't')
1022*fae548d3Szrj 	{
1023*fae548d3Szrj 	  synonym = FALSE;
1024*fae548d3Szrj 	  /* FIXME: gdb sets synonym to TRUE if the current language
1025*fae548d3Szrj              is C++.  */
1026*fae548d3Szrj 	}
1027*fae548d3Szrj       else
1028*fae548d3Szrj 	{
1029*fae548d3Szrj 	  synonym = TRUE;
1030*fae548d3Szrj 	  ++p;
1031*fae548d3Szrj 	}
1032*fae548d3Szrj 
1033*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, name, &p, &slot, string_end);
1034*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1035*fae548d3Szrj 	return FALSE;
1036*fae548d3Szrj       if (name == NULL)
1037*fae548d3Szrj 	return TRUE;
1038*fae548d3Szrj 
1039*fae548d3Szrj       /* INFO->SELF_CROSSREF is set by parse_stab_type if this type is
1040*fae548d3Szrj          a cross reference to itself.  These are generated by some
1041*fae548d3Szrj          versions of g++.  */
1042*fae548d3Szrj       self_crossref = info->self_crossref;
1043*fae548d3Szrj 
1044*fae548d3Szrj       dtype = debug_tag_type (dhandle, name, dtype);
1045*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1046*fae548d3Szrj 	return FALSE;
1047*fae548d3Szrj       if (slot != NULL)
1048*fae548d3Szrj 	*slot = dtype;
1049*fae548d3Szrj 
1050*fae548d3Szrj       /* See if we have a cross reference to this tag which we can now
1051*fae548d3Szrj          fill in.  Avoid filling in a cross reference to ourselves,
1052*fae548d3Szrj          because that would lead to circular debugging information.  */
1053*fae548d3Szrj       if (! self_crossref)
1054*fae548d3Szrj 	{
1055*fae548d3Szrj 	  register struct stab_tag **pst;
1056*fae548d3Szrj 
1057*fae548d3Szrj 	  for (pst = &info->tags; *pst != NULL; pst = &(*pst)->next)
1058*fae548d3Szrj 	    {
1059*fae548d3Szrj 	      if ((*pst)->name[0] == name[0]
1060*fae548d3Szrj 		  && strcmp ((*pst)->name, name) == 0)
1061*fae548d3Szrj 		{
1062*fae548d3Szrj 		  (*pst)->slot = dtype;
1063*fae548d3Szrj 		  *pst = (*pst)->next;
1064*fae548d3Szrj 		  break;
1065*fae548d3Szrj 		}
1066*fae548d3Szrj 	    }
1067*fae548d3Szrj 	}
1068*fae548d3Szrj 
1069*fae548d3Szrj       if (synonym)
1070*fae548d3Szrj 	{
1071*fae548d3Szrj 	  dtype = debug_name_type (dhandle, name, dtype);
1072*fae548d3Szrj 	  if (dtype == DEBUG_TYPE_NULL)
1073*fae548d3Szrj 	    return FALSE;
1074*fae548d3Szrj 
1075*fae548d3Szrj 	  if (slot != NULL)
1076*fae548d3Szrj 	    *slot = dtype;
1077*fae548d3Szrj 	}
1078*fae548d3Szrj 
1079*fae548d3Szrj       break;
1080*fae548d3Szrj 
1081*fae548d3Szrj     case 'V':
1082*fae548d3Szrj       /* Static symbol of local scope */
1083*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
1084*fae548d3Szrj 			       (debug_type **) NULL, string_end);
1085*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1086*fae548d3Szrj 	return FALSE;
1087*fae548d3Szrj       /* FIXME: gdb checks os9k_stabs here.  */
1088*fae548d3Szrj       if (! stab_record_variable (dhandle, info, name, dtype,
1089*fae548d3Szrj 				  DEBUG_LOCAL_STATIC, value))
1090*fae548d3Szrj 	return FALSE;
1091*fae548d3Szrj       break;
1092*fae548d3Szrj 
1093*fae548d3Szrj     case 'v':
1094*fae548d3Szrj       /* Reference parameter.  */
1095*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
1096*fae548d3Szrj 			       (debug_type **) NULL, string_end);
1097*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1098*fae548d3Szrj 	return FALSE;
1099*fae548d3Szrj       if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_REFERENCE,
1100*fae548d3Szrj 				    value))
1101*fae548d3Szrj 	return FALSE;
1102*fae548d3Szrj       break;
1103*fae548d3Szrj 
1104*fae548d3Szrj     case 'a':
1105*fae548d3Szrj       /* Reference parameter which is in a register.  */
1106*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
1107*fae548d3Szrj 			       (debug_type **) NULL, string_end);
1108*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1109*fae548d3Szrj 	return FALSE;
1110*fae548d3Szrj       if (! debug_record_parameter (dhandle, name, dtype, DEBUG_PARM_REF_REG,
1111*fae548d3Szrj 				    value))
1112*fae548d3Szrj 	return FALSE;
1113*fae548d3Szrj       break;
1114*fae548d3Szrj 
1115*fae548d3Szrj     case 'X':
1116*fae548d3Szrj       /* This is used by Sun FORTRAN for "function result value".
1117*fae548d3Szrj 	 Sun claims ("dbx and dbxtool interfaces", 2nd ed)
1118*fae548d3Szrj 	 that Pascal uses it too, but when I tried it Pascal used
1119*fae548d3Szrj 	 "x:3" (local symbol) instead.  */
1120*fae548d3Szrj       dtype = parse_stab_type (dhandle, info, (const char *) NULL, &p,
1121*fae548d3Szrj 			       (debug_type **) NULL, string_end);
1122*fae548d3Szrj       if (dtype == DEBUG_TYPE_NULL)
1123*fae548d3Szrj 	return FALSE;
1124*fae548d3Szrj       if (! stab_record_variable (dhandle, info, name, dtype, DEBUG_LOCAL,
1125*fae548d3Szrj 				  value))
1126*fae548d3Szrj 	return FALSE;
1127*fae548d3Szrj       break;
1128*fae548d3Szrj 
1129*fae548d3Szrj     case 'Y':
1130*fae548d3Szrj       /* SUNPro C++ Namespace =Yn0.  */
1131*fae548d3Szrj       /* Skip the namespace mapping, as it is not used now.  */
1132*fae548d3Szrj       if (*(++p) == 'n' && *(++p) == '0')
1133*fae548d3Szrj 	{
1134*fae548d3Szrj 	  /* =Yn0name; */
1135*fae548d3Szrj 	  while (*p != ';')
1136*fae548d3Szrj 	    ++p;
1137*fae548d3Szrj 	  ++p;
1138*fae548d3Szrj 	  return TRUE;
1139*fae548d3Szrj 	}
1140*fae548d3Szrj       /* TODO SUNPro C++ support:
1141*fae548d3Szrj          Support default arguments after F,P parameters
1142*fae548d3Szrj          Ya = Anonymous unions
1143*fae548d3Szrj          YM,YD = Pointers to class members
1144*fae548d3Szrj          YT,YI = Templates
1145*fae548d3Szrj          YR = Run-time type information (RTTI)  */
1146*fae548d3Szrj 
1147*fae548d3Szrj       /* Fall through.  */
1148*fae548d3Szrj 
1149*fae548d3Szrj     default:
1150*fae548d3Szrj       bad_stab (string);
1151*fae548d3Szrj       return FALSE;
1152*fae548d3Szrj     }
1153*fae548d3Szrj 
1154*fae548d3Szrj   /* FIXME: gdb converts structure values to structure pointers in a
1155*fae548d3Szrj      couple of cases, depending upon the target.  */
1156*fae548d3Szrj 
1157*fae548d3Szrj   return TRUE;
1158*fae548d3Szrj }
1159*fae548d3Szrj 
1160*fae548d3Szrj /* Parse a stabs type.  The typename argument is non-NULL if this is a
1161*fae548d3Szrj    typedef or a tag definition.  The pp argument points to the stab
1162*fae548d3Szrj    string, and is updated.  The slotp argument points to a place to
1163*fae548d3Szrj    store the slot used if the type is being defined.  */
1164*fae548d3Szrj 
1165*fae548d3Szrj static debug_type
parse_stab_type(void * dhandle,struct stab_handle * info,const char * type_name,const char ** pp,debug_type ** slotp,const char * p_end)1166*fae548d3Szrj parse_stab_type (void *                dhandle,
1167*fae548d3Szrj 		 struct stab_handle *  info,
1168*fae548d3Szrj 		 const char *          type_name,
1169*fae548d3Szrj 		 const char **         pp,
1170*fae548d3Szrj 		 debug_type **         slotp,
1171*fae548d3Szrj 		 const char *          p_end)
1172*fae548d3Szrj {
1173*fae548d3Szrj   const char *orig;
1174*fae548d3Szrj   int typenums[2];
1175*fae548d3Szrj   int size;
1176*fae548d3Szrj   bfd_boolean stringp;
1177*fae548d3Szrj   int descriptor;
1178*fae548d3Szrj   debug_type dtype;
1179*fae548d3Szrj 
1180*fae548d3Szrj   if (slotp != NULL)
1181*fae548d3Szrj     *slotp = NULL;
1182*fae548d3Szrj 
1183*fae548d3Szrj   orig = *pp;
1184*fae548d3Szrj   if (orig >= p_end)
1185*fae548d3Szrj     return DEBUG_TYPE_NULL;
1186*fae548d3Szrj 
1187*fae548d3Szrj   size = -1;
1188*fae548d3Szrj   stringp = FALSE;
1189*fae548d3Szrj 
1190*fae548d3Szrj   info->self_crossref = FALSE;
1191*fae548d3Szrj 
1192*fae548d3Szrj   /* Read type number if present.  The type number may be omitted.
1193*fae548d3Szrj      for instance in a two-dimensional array declared with type
1194*fae548d3Szrj      "ar1;1;10;ar1;1;10;4".  */
1195*fae548d3Szrj   if (! ISDIGIT (**pp) && **pp != '(' && **pp != '-')
1196*fae548d3Szrj     {
1197*fae548d3Szrj       /* 'typenums=' not present, type is anonymous.  Read and return
1198*fae548d3Szrj 	 the definition, but don't put it in the type vector.  */
1199*fae548d3Szrj       typenums[0] = typenums[1] = -1;
1200*fae548d3Szrj     }
1201*fae548d3Szrj   else
1202*fae548d3Szrj     {
1203*fae548d3Szrj       if (! parse_stab_type_number (pp, typenums, p_end))
1204*fae548d3Szrj 	return DEBUG_TYPE_NULL;
1205*fae548d3Szrj 
1206*fae548d3Szrj       if (**pp != '=')
1207*fae548d3Szrj 	/* Type is not being defined here.  Either it already
1208*fae548d3Szrj 	   exists, or this is a forward reference to it.  */
1209*fae548d3Szrj 	return stab_find_type (dhandle, info, typenums);
1210*fae548d3Szrj 
1211*fae548d3Szrj       /* Only set the slot if the type is being defined.  This means
1212*fae548d3Szrj          that the mapping from type numbers to types will only record
1213*fae548d3Szrj          the name of the typedef which defines a type.  If we don't do
1214*fae548d3Szrj          this, then something like
1215*fae548d3Szrj 	     typedef int foo;
1216*fae548d3Szrj 	     int i;
1217*fae548d3Szrj 	 will record that i is of type foo.  Unfortunately, stabs
1218*fae548d3Szrj 	 information is ambiguous about variable types.  For this code,
1219*fae548d3Szrj 	     typedef int foo;
1220*fae548d3Szrj 	     int i;
1221*fae548d3Szrj 	     foo j;
1222*fae548d3Szrj 	 the stabs information records both i and j as having the same
1223*fae548d3Szrj 	 type.  This could be fixed by patching the compiler.  */
1224*fae548d3Szrj       if (slotp != NULL && typenums[0] >= 0 && typenums[1] >= 0)
1225*fae548d3Szrj 	*slotp = stab_find_slot (info, typenums);
1226*fae548d3Szrj 
1227*fae548d3Szrj       /* Type is being defined here.  */
1228*fae548d3Szrj       /* Skip the '='.  */
1229*fae548d3Szrj       ++*pp;
1230*fae548d3Szrj 
1231*fae548d3Szrj       while (**pp == '@')
1232*fae548d3Szrj 	{
1233*fae548d3Szrj 	  const char *p = *pp + 1;
1234*fae548d3Szrj 	  const char *attr;
1235*fae548d3Szrj 
1236*fae548d3Szrj 	  if (ISDIGIT (*p) || *p == '(' || *p == '-')
1237*fae548d3Szrj 	    /* Member type.  */
1238*fae548d3Szrj 	    break;
1239*fae548d3Szrj 
1240*fae548d3Szrj 	  /* Type attributes.  */
1241*fae548d3Szrj 	  attr = p;
1242*fae548d3Szrj 
1243*fae548d3Szrj 	  for (; *p != ';'; ++p)
1244*fae548d3Szrj 	    {
1245*fae548d3Szrj 	      if (*p == '\0')
1246*fae548d3Szrj 		{
1247*fae548d3Szrj 		  bad_stab (orig);
1248*fae548d3Szrj 		  return DEBUG_TYPE_NULL;
1249*fae548d3Szrj 		}
1250*fae548d3Szrj 	    }
1251*fae548d3Szrj 	  *pp = p + 1;
1252*fae548d3Szrj 
1253*fae548d3Szrj 	  switch (*attr)
1254*fae548d3Szrj 	    {
1255*fae548d3Szrj 	    case 's':
1256*fae548d3Szrj 	      size = atoi (attr + 1);
1257*fae548d3Szrj 	      size /= 8;  /* Size is in bits.  We store it in bytes.  */
1258*fae548d3Szrj 	      if (size <= 0)
1259*fae548d3Szrj 		size = -1;
1260*fae548d3Szrj 	      break;
1261*fae548d3Szrj 
1262*fae548d3Szrj 	    case 'S':
1263*fae548d3Szrj 	      stringp = TRUE;
1264*fae548d3Szrj 	      break;
1265*fae548d3Szrj 
1266*fae548d3Szrj 	    case 0:
1267*fae548d3Szrj 	      bad_stab (orig);
1268*fae548d3Szrj 	      return DEBUG_TYPE_NULL;
1269*fae548d3Szrj 
1270*fae548d3Szrj 	    default:
1271*fae548d3Szrj 	      /* Ignore unrecognized type attributes, so future
1272*fae548d3Szrj 		 compilers can invent new ones.  */
1273*fae548d3Szrj 	      break;
1274*fae548d3Szrj 	    }
1275*fae548d3Szrj 	}
1276*fae548d3Szrj     }
1277*fae548d3Szrj 
1278*fae548d3Szrj   descriptor = **pp;
1279*fae548d3Szrj   ++*pp;
1280*fae548d3Szrj 
1281*fae548d3Szrj   switch (descriptor)
1282*fae548d3Szrj     {
1283*fae548d3Szrj     case 'x':
1284*fae548d3Szrj       {
1285*fae548d3Szrj 	enum debug_type_kind code;
1286*fae548d3Szrj 	const char *q1, *q2, *p;
1287*fae548d3Szrj 
1288*fae548d3Szrj 	/* A cross reference to another type.  */
1289*fae548d3Szrj 	switch (**pp)
1290*fae548d3Szrj 	  {
1291*fae548d3Szrj 	  case 's':
1292*fae548d3Szrj 	    code = DEBUG_KIND_STRUCT;
1293*fae548d3Szrj 	    break;
1294*fae548d3Szrj 	  case 'u':
1295*fae548d3Szrj 	    code = DEBUG_KIND_UNION;
1296*fae548d3Szrj 	    break;
1297*fae548d3Szrj 	  case 'e':
1298*fae548d3Szrj 	    code = DEBUG_KIND_ENUM;
1299*fae548d3Szrj 	    break;
1300*fae548d3Szrj 	  case 0:
1301*fae548d3Szrj 	      bad_stab (orig);
1302*fae548d3Szrj 	      return DEBUG_TYPE_NULL;
1303*fae548d3Szrj 
1304*fae548d3Szrj 	  default:
1305*fae548d3Szrj 	    /* Complain and keep going, so compilers can invent new
1306*fae548d3Szrj 	       cross-reference types.  */
1307*fae548d3Szrj 	    warn_stab (orig, _("unrecognized cross reference type"));
1308*fae548d3Szrj 	    code = DEBUG_KIND_STRUCT;
1309*fae548d3Szrj 	    break;
1310*fae548d3Szrj 	  }
1311*fae548d3Szrj 	++*pp;
1312*fae548d3Szrj 
1313*fae548d3Szrj 	q1 = strchr (*pp, '<');
1314*fae548d3Szrj 	p = strchr (*pp, ':');
1315*fae548d3Szrj 	if (p == NULL)
1316*fae548d3Szrj 	  {
1317*fae548d3Szrj 	    bad_stab (orig);
1318*fae548d3Szrj 	    return DEBUG_TYPE_NULL;
1319*fae548d3Szrj 	  }
1320*fae548d3Szrj 	if (q1 != NULL && p > q1 && p[1] == ':')
1321*fae548d3Szrj 	  {
1322*fae548d3Szrj 	    int nest = 0;
1323*fae548d3Szrj 
1324*fae548d3Szrj 	    for (q2 = q1; *q2 != '\0'; ++q2)
1325*fae548d3Szrj 	      {
1326*fae548d3Szrj 		if (*q2 == '<')
1327*fae548d3Szrj 		  ++nest;
1328*fae548d3Szrj 		else if (*q2 == '>')
1329*fae548d3Szrj 		  --nest;
1330*fae548d3Szrj 		else if (*q2 == ':' && nest == 0)
1331*fae548d3Szrj 		  break;
1332*fae548d3Szrj 	      }
1333*fae548d3Szrj 	    p = q2;
1334*fae548d3Szrj 	    if (*p != ':')
1335*fae548d3Szrj 	      {
1336*fae548d3Szrj 		bad_stab (orig);
1337*fae548d3Szrj 		return DEBUG_TYPE_NULL;
1338*fae548d3Szrj 	      }
1339*fae548d3Szrj 	  }
1340*fae548d3Szrj 
1341*fae548d3Szrj 	/* Some versions of g++ can emit stabs like
1342*fae548d3Szrj 	       fleep:T20=xsfleep:
1343*fae548d3Szrj 	   which define structures in terms of themselves.  We need to
1344*fae548d3Szrj 	   tell the caller to avoid building a circular structure.  */
1345*fae548d3Szrj 	if (type_name != NULL
1346*fae548d3Szrj 	    && strncmp (type_name, *pp, p - *pp) == 0
1347*fae548d3Szrj 	    && type_name[p - *pp] == '\0')
1348*fae548d3Szrj 	  info->self_crossref = TRUE;
1349*fae548d3Szrj 
1350*fae548d3Szrj 	dtype = stab_find_tagged_type (dhandle, info, *pp, p - *pp, code);
1351*fae548d3Szrj 
1352*fae548d3Szrj 	*pp = p + 1;
1353*fae548d3Szrj       }
1354*fae548d3Szrj       break;
1355*fae548d3Szrj 
1356*fae548d3Szrj     case '-':
1357*fae548d3Szrj     case '0':
1358*fae548d3Szrj     case '1':
1359*fae548d3Szrj     case '2':
1360*fae548d3Szrj     case '3':
1361*fae548d3Szrj     case '4':
1362*fae548d3Szrj     case '5':
1363*fae548d3Szrj     case '6':
1364*fae548d3Szrj     case '7':
1365*fae548d3Szrj     case '8':
1366*fae548d3Szrj     case '9':
1367*fae548d3Szrj     case '(':
1368*fae548d3Szrj       {
1369*fae548d3Szrj 	const char *hold;
1370*fae548d3Szrj 	int xtypenums[2];
1371*fae548d3Szrj 
1372*fae548d3Szrj 	/* This type is defined as another type.  */
1373*fae548d3Szrj 	(*pp)--;
1374*fae548d3Szrj 	hold = *pp;
1375*fae548d3Szrj 
1376*fae548d3Szrj 	/* Peek ahead at the number to detect void.  */
1377*fae548d3Szrj 	if (! parse_stab_type_number (pp, xtypenums, p_end))
1378*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
1379*fae548d3Szrj 
1380*fae548d3Szrj 	if (typenums[0] == xtypenums[0] && typenums[1] == xtypenums[1])
1381*fae548d3Szrj 	  {
1382*fae548d3Szrj 	    /* This type is being defined as itself, which means that
1383*fae548d3Szrj                it is void.  */
1384*fae548d3Szrj 	    dtype = debug_make_void_type (dhandle);
1385*fae548d3Szrj 	  }
1386*fae548d3Szrj 	else
1387*fae548d3Szrj 	  {
1388*fae548d3Szrj 	    *pp = hold;
1389*fae548d3Szrj 
1390*fae548d3Szrj 	    /* Go back to the number and have parse_stab_type get it.
1391*fae548d3Szrj 	       This means that we can deal with something like
1392*fae548d3Szrj 	       t(1,2)=(3,4)=... which the Lucid compiler uses.  */
1393*fae548d3Szrj 	    dtype = parse_stab_type (dhandle, info, (const char *) NULL,
1394*fae548d3Szrj 				     pp, (debug_type **) NULL, p_end);
1395*fae548d3Szrj 	    if (dtype == DEBUG_TYPE_NULL)
1396*fae548d3Szrj 	      return DEBUG_TYPE_NULL;
1397*fae548d3Szrj 	  }
1398*fae548d3Szrj 
1399*fae548d3Szrj 	if (typenums[0] != -1)
1400*fae548d3Szrj 	  {
1401*fae548d3Szrj 	    if (! stab_record_type (dhandle, info, typenums, dtype))
1402*fae548d3Szrj 	      return DEBUG_TYPE_NULL;
1403*fae548d3Szrj 	  }
1404*fae548d3Szrj 
1405*fae548d3Szrj 	break;
1406*fae548d3Szrj       }
1407*fae548d3Szrj 
1408*fae548d3Szrj     case '*':
1409*fae548d3Szrj       dtype = debug_make_pointer_type (dhandle,
1410*fae548d3Szrj 				       parse_stab_type (dhandle, info,
1411*fae548d3Szrj 							(const char *) NULL,
1412*fae548d3Szrj 							pp,
1413*fae548d3Szrj 							(debug_type **) NULL,
1414*fae548d3Szrj 							p_end));
1415*fae548d3Szrj       break;
1416*fae548d3Szrj 
1417*fae548d3Szrj     case '&':
1418*fae548d3Szrj       /* Reference to another type.  */
1419*fae548d3Szrj       dtype = (debug_make_reference_type
1420*fae548d3Szrj 	       (dhandle,
1421*fae548d3Szrj 		parse_stab_type (dhandle, info, (const char *) NULL, pp,
1422*fae548d3Szrj 				 (debug_type **) NULL, p_end)));
1423*fae548d3Szrj       break;
1424*fae548d3Szrj 
1425*fae548d3Szrj     case 'f':
1426*fae548d3Szrj       /* Function returning another type.  */
1427*fae548d3Szrj       /* FIXME: gdb checks os9k_stabs here.  */
1428*fae548d3Szrj       dtype = (debug_make_function_type
1429*fae548d3Szrj 	       (dhandle,
1430*fae548d3Szrj 		parse_stab_type (dhandle, info, (const char *) NULL, pp,
1431*fae548d3Szrj 				 (debug_type **) NULL, p_end),
1432*fae548d3Szrj 		(debug_type *) NULL, FALSE));
1433*fae548d3Szrj       break;
1434*fae548d3Szrj 
1435*fae548d3Szrj     case 'k':
1436*fae548d3Szrj       /* Const qualifier on some type (Sun).  */
1437*fae548d3Szrj       /* FIXME: gdb accepts 'c' here if os9k_stabs.  */
1438*fae548d3Szrj       dtype = debug_make_const_type (dhandle,
1439*fae548d3Szrj 				     parse_stab_type (dhandle, info,
1440*fae548d3Szrj 						      (const char *) NULL,
1441*fae548d3Szrj 						      pp,
1442*fae548d3Szrj 						      (debug_type **) NULL,
1443*fae548d3Szrj 						      p_end));
1444*fae548d3Szrj       break;
1445*fae548d3Szrj 
1446*fae548d3Szrj     case 'B':
1447*fae548d3Szrj       /* Volatile qual on some type (Sun).  */
1448*fae548d3Szrj       /* FIXME: gdb accepts 'i' here if os9k_stabs.  */
1449*fae548d3Szrj       dtype = (debug_make_volatile_type
1450*fae548d3Szrj 	       (dhandle,
1451*fae548d3Szrj 		parse_stab_type (dhandle, info, (const char *) NULL, pp,
1452*fae548d3Szrj 				 (debug_type **) NULL, p_end)));
1453*fae548d3Szrj       break;
1454*fae548d3Szrj 
1455*fae548d3Szrj     case '@':
1456*fae548d3Szrj       /* Offset (class & variable) type.  This is used for a pointer
1457*fae548d3Szrj          relative to an object.  */
1458*fae548d3Szrj       {
1459*fae548d3Szrj 	debug_type domain;
1460*fae548d3Szrj 	debug_type memtype;
1461*fae548d3Szrj 
1462*fae548d3Szrj 	/* Member type.  */
1463*fae548d3Szrj 
1464*fae548d3Szrj 	domain = parse_stab_type (dhandle, info, (const char *) NULL, pp,
1465*fae548d3Szrj 				  (debug_type **) NULL, p_end);
1466*fae548d3Szrj 	if (domain == DEBUG_TYPE_NULL)
1467*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
1468*fae548d3Szrj 
1469*fae548d3Szrj 	if (**pp != ',')
1470*fae548d3Szrj 	  {
1471*fae548d3Szrj 	    bad_stab (orig);
1472*fae548d3Szrj 	    return DEBUG_TYPE_NULL;
1473*fae548d3Szrj 	  }
1474*fae548d3Szrj 	++*pp;
1475*fae548d3Szrj 
1476*fae548d3Szrj 	memtype = parse_stab_type (dhandle, info, (const char *) NULL, pp,
1477*fae548d3Szrj 				   (debug_type **) NULL, p_end);
1478*fae548d3Szrj 	if (memtype == DEBUG_TYPE_NULL)
1479*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
1480*fae548d3Szrj 
1481*fae548d3Szrj 	dtype = debug_make_offset_type (dhandle, domain, memtype);
1482*fae548d3Szrj       }
1483*fae548d3Szrj       break;
1484*fae548d3Szrj 
1485*fae548d3Szrj     case '#':
1486*fae548d3Szrj       /* Method (class & fn) type.  */
1487*fae548d3Szrj       if (**pp == '#')
1488*fae548d3Szrj 	{
1489*fae548d3Szrj 	  debug_type return_type;
1490*fae548d3Szrj 
1491*fae548d3Szrj 	  ++*pp;
1492*fae548d3Szrj 	  return_type = parse_stab_type (dhandle, info, (const char *) NULL,
1493*fae548d3Szrj 					 pp, (debug_type **) NULL, p_end);
1494*fae548d3Szrj 	  if (return_type == DEBUG_TYPE_NULL)
1495*fae548d3Szrj 	    return DEBUG_TYPE_NULL;
1496*fae548d3Szrj 	  if (**pp != ';')
1497*fae548d3Szrj 	    {
1498*fae548d3Szrj 	      bad_stab (orig);
1499*fae548d3Szrj 	      return DEBUG_TYPE_NULL;
1500*fae548d3Szrj 	    }
1501*fae548d3Szrj 	  ++*pp;
1502*fae548d3Szrj 	  dtype = debug_make_method_type (dhandle, return_type,
1503*fae548d3Szrj 					  DEBUG_TYPE_NULL,
1504*fae548d3Szrj 					  (debug_type *) NULL, FALSE);
1505*fae548d3Szrj 	}
1506*fae548d3Szrj       else
1507*fae548d3Szrj 	{
1508*fae548d3Szrj 	  debug_type domain;
1509*fae548d3Szrj 	  debug_type return_type;
1510*fae548d3Szrj 	  debug_type *args;
1511*fae548d3Szrj 	  unsigned int n;
1512*fae548d3Szrj 	  unsigned int alloc;
1513*fae548d3Szrj 	  bfd_boolean varargs;
1514*fae548d3Szrj 
1515*fae548d3Szrj 	  domain = parse_stab_type (dhandle, info, (const char *) NULL,
1516*fae548d3Szrj 				    pp, (debug_type **) NULL, p_end);
1517*fae548d3Szrj 	  if (domain == DEBUG_TYPE_NULL)
1518*fae548d3Szrj 	    return DEBUG_TYPE_NULL;
1519*fae548d3Szrj 
1520*fae548d3Szrj 	  if (**pp != ',')
1521*fae548d3Szrj 	    {
1522*fae548d3Szrj 	      bad_stab (orig);
1523*fae548d3Szrj 	      return DEBUG_TYPE_NULL;
1524*fae548d3Szrj 	    }
1525*fae548d3Szrj 	  ++*pp;
1526*fae548d3Szrj 
1527*fae548d3Szrj 	  return_type = parse_stab_type (dhandle, info, (const char *) NULL,
1528*fae548d3Szrj 					 pp, (debug_type **) NULL, p_end);
1529*fae548d3Szrj 	  if (return_type == DEBUG_TYPE_NULL)
1530*fae548d3Szrj 	    return DEBUG_TYPE_NULL;
1531*fae548d3Szrj 
1532*fae548d3Szrj 	  alloc = 10;
1533*fae548d3Szrj 	  args = (debug_type *) xmalloc (alloc * sizeof *args);
1534*fae548d3Szrj 	  n = 0;
1535*fae548d3Szrj 	  while (**pp != ';')
1536*fae548d3Szrj 	    {
1537*fae548d3Szrj 	      if (**pp != ',')
1538*fae548d3Szrj 		{
1539*fae548d3Szrj 		  bad_stab (orig);
1540*fae548d3Szrj 		  return DEBUG_TYPE_NULL;
1541*fae548d3Szrj 		}
1542*fae548d3Szrj 	      ++*pp;
1543*fae548d3Szrj 
1544*fae548d3Szrj 	      if (n + 1 >= alloc)
1545*fae548d3Szrj 		{
1546*fae548d3Szrj 		  alloc += 10;
1547*fae548d3Szrj 		  args = ((debug_type *)
1548*fae548d3Szrj 			  xrealloc (args, alloc * sizeof *args));
1549*fae548d3Szrj 		}
1550*fae548d3Szrj 
1551*fae548d3Szrj 	      args[n] = parse_stab_type (dhandle, info, (const char *) NULL,
1552*fae548d3Szrj 					 pp, (debug_type **) NULL, p_end);
1553*fae548d3Szrj 	      if (args[n] == DEBUG_TYPE_NULL)
1554*fae548d3Szrj 		return DEBUG_TYPE_NULL;
1555*fae548d3Szrj 	      ++n;
1556*fae548d3Szrj 	    }
1557*fae548d3Szrj 	  ++*pp;
1558*fae548d3Szrj 
1559*fae548d3Szrj 	  /* If the last type is not void, then this function takes a
1560*fae548d3Szrj 	     variable number of arguments.  Otherwise, we must strip
1561*fae548d3Szrj 	     the void type.  */
1562*fae548d3Szrj 	  if (n == 0
1563*fae548d3Szrj 	      || debug_get_type_kind (dhandle, args[n - 1]) != DEBUG_KIND_VOID)
1564*fae548d3Szrj 	    varargs = TRUE;
1565*fae548d3Szrj 	  else
1566*fae548d3Szrj 	    {
1567*fae548d3Szrj 	      --n;
1568*fae548d3Szrj 	      varargs = FALSE;
1569*fae548d3Szrj 	    }
1570*fae548d3Szrj 
1571*fae548d3Szrj 	  args[n] = DEBUG_TYPE_NULL;
1572*fae548d3Szrj 
1573*fae548d3Szrj 	  dtype = debug_make_method_type (dhandle, return_type, domain, args,
1574*fae548d3Szrj 					  varargs);
1575*fae548d3Szrj 	}
1576*fae548d3Szrj       break;
1577*fae548d3Szrj 
1578*fae548d3Szrj     case 'r':
1579*fae548d3Szrj       /* Range type.  */
1580*fae548d3Szrj       dtype = parse_stab_range_type (dhandle, info, type_name, pp, typenums, p_end);
1581*fae548d3Szrj       break;
1582*fae548d3Szrj 
1583*fae548d3Szrj     case 'b':
1584*fae548d3Szrj       /* FIXME: gdb checks os9k_stabs here.  */
1585*fae548d3Szrj       /* Sun ACC builtin int type.  */
1586*fae548d3Szrj       dtype = parse_stab_sun_builtin_type (dhandle, pp, p_end);
1587*fae548d3Szrj       break;
1588*fae548d3Szrj 
1589*fae548d3Szrj     case 'R':
1590*fae548d3Szrj       /* Sun ACC builtin float type.  */
1591*fae548d3Szrj       dtype = parse_stab_sun_floating_type (dhandle, pp, p_end);
1592*fae548d3Szrj       break;
1593*fae548d3Szrj 
1594*fae548d3Szrj     case 'e':
1595*fae548d3Szrj       /* Enumeration type.  */
1596*fae548d3Szrj       dtype = parse_stab_enum_type (dhandle, pp, p_end);
1597*fae548d3Szrj       break;
1598*fae548d3Szrj 
1599*fae548d3Szrj     case 's':
1600*fae548d3Szrj     case 'u':
1601*fae548d3Szrj       /* Struct or union type.  */
1602*fae548d3Szrj       dtype = parse_stab_struct_type (dhandle, info, type_name, pp,
1603*fae548d3Szrj 				      descriptor == 's', typenums, p_end);
1604*fae548d3Szrj       break;
1605*fae548d3Szrj 
1606*fae548d3Szrj     case 'a':
1607*fae548d3Szrj       /* Array type.  */
1608*fae548d3Szrj       if (**pp != 'r')
1609*fae548d3Szrj 	{
1610*fae548d3Szrj 	  bad_stab (orig);
1611*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
1612*fae548d3Szrj 	}
1613*fae548d3Szrj       ++*pp;
1614*fae548d3Szrj 
1615*fae548d3Szrj       dtype = parse_stab_array_type (dhandle, info, pp, stringp, p_end);
1616*fae548d3Szrj       break;
1617*fae548d3Szrj 
1618*fae548d3Szrj     case 'S':
1619*fae548d3Szrj       dtype = debug_make_set_type (dhandle,
1620*fae548d3Szrj 				   parse_stab_type (dhandle, info,
1621*fae548d3Szrj 						    (const char *) NULL,
1622*fae548d3Szrj 						    pp,
1623*fae548d3Szrj 						    (debug_type **) NULL,
1624*fae548d3Szrj 						    p_end),
1625*fae548d3Szrj 				   stringp);
1626*fae548d3Szrj       break;
1627*fae548d3Szrj 
1628*fae548d3Szrj     default:
1629*fae548d3Szrj       bad_stab (orig);
1630*fae548d3Szrj       return DEBUG_TYPE_NULL;
1631*fae548d3Szrj     }
1632*fae548d3Szrj 
1633*fae548d3Szrj   if (dtype == DEBUG_TYPE_NULL)
1634*fae548d3Szrj     return DEBUG_TYPE_NULL;
1635*fae548d3Szrj 
1636*fae548d3Szrj   if (typenums[0] != -1)
1637*fae548d3Szrj     {
1638*fae548d3Szrj       if (! stab_record_type (dhandle, info, typenums, dtype))
1639*fae548d3Szrj 	return DEBUG_TYPE_NULL;
1640*fae548d3Szrj     }
1641*fae548d3Szrj 
1642*fae548d3Szrj   if (size != -1)
1643*fae548d3Szrj     {
1644*fae548d3Szrj       if (! debug_record_type_size (dhandle, dtype, (unsigned int) size))
1645*fae548d3Szrj 	return DEBUG_TYPE_NULL;
1646*fae548d3Szrj     }
1647*fae548d3Szrj 
1648*fae548d3Szrj   return dtype;
1649*fae548d3Szrj }
1650*fae548d3Szrj 
1651*fae548d3Szrj /* Read a number by which a type is referred to in dbx data, or
1652*fae548d3Szrj    perhaps read a pair (FILENUM, TYPENUM) in parentheses.  Just a
1653*fae548d3Szrj    single number N is equivalent to (0,N).  Return the two numbers by
1654*fae548d3Szrj    storing them in the vector TYPENUMS.  */
1655*fae548d3Szrj 
1656*fae548d3Szrj static bfd_boolean
parse_stab_type_number(const char ** pp,int * typenums,const char * p_end)1657*fae548d3Szrj parse_stab_type_number (const char **pp, int *typenums, const char *p_end)
1658*fae548d3Szrj {
1659*fae548d3Szrj   const char *orig;
1660*fae548d3Szrj 
1661*fae548d3Szrj   orig = *pp;
1662*fae548d3Szrj 
1663*fae548d3Szrj   if (**pp != '(')
1664*fae548d3Szrj     {
1665*fae548d3Szrj       typenums[0] = 0;
1666*fae548d3Szrj       typenums[1] = (int) parse_number (pp, (bfd_boolean *) NULL, p_end);
1667*fae548d3Szrj       return TRUE;
1668*fae548d3Szrj     }
1669*fae548d3Szrj 
1670*fae548d3Szrj   ++*pp;
1671*fae548d3Szrj   typenums[0] = (int) parse_number (pp, (bfd_boolean *) NULL, p_end);
1672*fae548d3Szrj   if (**pp != ',')
1673*fae548d3Szrj     {
1674*fae548d3Szrj       bad_stab (orig);
1675*fae548d3Szrj       return FALSE;
1676*fae548d3Szrj     }
1677*fae548d3Szrj 
1678*fae548d3Szrj   ++*pp;
1679*fae548d3Szrj   typenums[1] = (int) parse_number (pp, (bfd_boolean *) NULL, p_end);
1680*fae548d3Szrj   if (**pp != ')')
1681*fae548d3Szrj     {
1682*fae548d3Szrj       bad_stab (orig);
1683*fae548d3Szrj       return FALSE;
1684*fae548d3Szrj     }
1685*fae548d3Szrj 
1686*fae548d3Szrj   ++*pp;
1687*fae548d3Szrj   return TRUE;
1688*fae548d3Szrj }
1689*fae548d3Szrj 
1690*fae548d3Szrj /* Parse a range type.  */
1691*fae548d3Szrj 
1692*fae548d3Szrj static debug_type
parse_stab_range_type(void * dhandle,struct stab_handle * info,const char * type_name,const char ** pp,const int * typenums,const char * p_end)1693*fae548d3Szrj parse_stab_range_type (void *                dhandle,
1694*fae548d3Szrj 		       struct stab_handle *  info,
1695*fae548d3Szrj 		       const char *          type_name,
1696*fae548d3Szrj 		       const char **         pp,
1697*fae548d3Szrj 		       const int *           typenums,
1698*fae548d3Szrj 		       const char *          p_end)
1699*fae548d3Szrj {
1700*fae548d3Szrj   const char *orig;
1701*fae548d3Szrj   int rangenums[2];
1702*fae548d3Szrj   bfd_boolean self_subrange;
1703*fae548d3Szrj   debug_type index_type;
1704*fae548d3Szrj   const char *s2, *s3;
1705*fae548d3Szrj   bfd_signed_vma n2, n3;
1706*fae548d3Szrj   bfd_boolean ov2, ov3;
1707*fae548d3Szrj 
1708*fae548d3Szrj   orig = *pp;
1709*fae548d3Szrj   if (orig >= p_end)
1710*fae548d3Szrj     return DEBUG_TYPE_NULL;
1711*fae548d3Szrj 
1712*fae548d3Szrj   index_type = DEBUG_TYPE_NULL;
1713*fae548d3Szrj 
1714*fae548d3Szrj   /* First comes a type we are a subrange of.
1715*fae548d3Szrj      In C it is usually 0, 1 or the type being defined.  */
1716*fae548d3Szrj   if (! parse_stab_type_number (pp, rangenums, p_end))
1717*fae548d3Szrj     return DEBUG_TYPE_NULL;
1718*fae548d3Szrj 
1719*fae548d3Szrj   self_subrange = (rangenums[0] == typenums[0]
1720*fae548d3Szrj 		   && rangenums[1] == typenums[1]);
1721*fae548d3Szrj 
1722*fae548d3Szrj   if (**pp == '=')
1723*fae548d3Szrj     {
1724*fae548d3Szrj       *pp = orig;
1725*fae548d3Szrj       index_type = parse_stab_type (dhandle, info, (const char *) NULL,
1726*fae548d3Szrj 				    pp, (debug_type **) NULL, p_end);
1727*fae548d3Szrj       if (index_type == DEBUG_TYPE_NULL)
1728*fae548d3Szrj 	return DEBUG_TYPE_NULL;
1729*fae548d3Szrj     }
1730*fae548d3Szrj 
1731*fae548d3Szrj   if (**pp == ';')
1732*fae548d3Szrj     ++*pp;
1733*fae548d3Szrj 
1734*fae548d3Szrj   /* The remaining two operands are usually lower and upper bounds of
1735*fae548d3Szrj      the range.  But in some special cases they mean something else.  */
1736*fae548d3Szrj   s2 = *pp;
1737*fae548d3Szrj   n2 = parse_number (pp, &ov2, p_end);
1738*fae548d3Szrj   if (**pp != ';')
1739*fae548d3Szrj     {
1740*fae548d3Szrj       bad_stab (orig);
1741*fae548d3Szrj       return DEBUG_TYPE_NULL;
1742*fae548d3Szrj     }
1743*fae548d3Szrj   ++*pp;
1744*fae548d3Szrj 
1745*fae548d3Szrj   s3 = *pp;
1746*fae548d3Szrj   n3 = parse_number (pp, &ov3, p_end);
1747*fae548d3Szrj   if (**pp != ';')
1748*fae548d3Szrj     {
1749*fae548d3Szrj       bad_stab (orig);
1750*fae548d3Szrj       return DEBUG_TYPE_NULL;
1751*fae548d3Szrj     }
1752*fae548d3Szrj   ++*pp;
1753*fae548d3Szrj 
1754*fae548d3Szrj   if (ov2 || ov3)
1755*fae548d3Szrj     {
1756*fae548d3Szrj       /* gcc will emit range stabs for long long types.  Handle this
1757*fae548d3Szrj          as a special case.  FIXME: This needs to be more general.  */
1758*fae548d3Szrj #define LLLOW   "01000000000000000000000;"
1759*fae548d3Szrj #define LLHIGH   "0777777777777777777777;"
1760*fae548d3Szrj #define ULLHIGH "01777777777777777777777;"
1761*fae548d3Szrj       if (index_type == DEBUG_TYPE_NULL)
1762*fae548d3Szrj 	{
1763*fae548d3Szrj 	  if (CONST_STRNEQ (s2, LLLOW)
1764*fae548d3Szrj 	      && CONST_STRNEQ (s3, LLHIGH))
1765*fae548d3Szrj 	    return debug_make_int_type (dhandle, 8, FALSE);
1766*fae548d3Szrj 	  if (! ov2
1767*fae548d3Szrj 	      && n2 == 0
1768*fae548d3Szrj 	      && CONST_STRNEQ (s3, ULLHIGH))
1769*fae548d3Szrj 	    return debug_make_int_type (dhandle, 8, TRUE);
1770*fae548d3Szrj 	}
1771*fae548d3Szrj 
1772*fae548d3Szrj       warn_stab (orig, _("numeric overflow"));
1773*fae548d3Szrj     }
1774*fae548d3Szrj 
1775*fae548d3Szrj   if (index_type == DEBUG_TYPE_NULL)
1776*fae548d3Szrj     {
1777*fae548d3Szrj       /* A type defined as a subrange of itself, with both bounds 0,
1778*fae548d3Szrj          is void.  */
1779*fae548d3Szrj       if (self_subrange && n2 == 0 && n3 == 0)
1780*fae548d3Szrj 	return debug_make_void_type (dhandle);
1781*fae548d3Szrj 
1782*fae548d3Szrj       /* A type defined as a subrange of itself, with n2 positive and
1783*fae548d3Szrj 	 n3 zero, is a complex type, and n2 is the number of bytes.  */
1784*fae548d3Szrj       if (self_subrange && n3 == 0 && n2 > 0)
1785*fae548d3Szrj 	return debug_make_complex_type (dhandle, n2);
1786*fae548d3Szrj 
1787*fae548d3Szrj       /* If n3 is zero and n2 is positive, this is a floating point
1788*fae548d3Szrj          type, and n2 is the number of bytes.  */
1789*fae548d3Szrj       if (n3 == 0 && n2 > 0)
1790*fae548d3Szrj 	return debug_make_float_type (dhandle, n2);
1791*fae548d3Szrj 
1792*fae548d3Szrj       /* If the upper bound is -1, this is an unsigned int.  */
1793*fae548d3Szrj       if (n2 == 0 && n3 == -1)
1794*fae548d3Szrj 	{
1795*fae548d3Szrj 	  /* When gcc is used with -gstabs, but not -gstabs+, it will emit
1796*fae548d3Szrj 	         long long int:t6=r1;0;-1;
1797*fae548d3Szrj 		 long long unsigned int:t7=r1;0;-1;
1798*fae548d3Szrj 	     We hack here to handle this reasonably.  */
1799*fae548d3Szrj 	  if (type_name != NULL)
1800*fae548d3Szrj 	    {
1801*fae548d3Szrj 	      if (strcmp (type_name, "long long int") == 0)
1802*fae548d3Szrj 		return debug_make_int_type (dhandle, 8, FALSE);
1803*fae548d3Szrj 	      else if (strcmp (type_name, "long long unsigned int") == 0)
1804*fae548d3Szrj 		return debug_make_int_type (dhandle, 8, TRUE);
1805*fae548d3Szrj 	    }
1806*fae548d3Szrj 	  /* FIXME: The size here really depends upon the target.  */
1807*fae548d3Szrj 	  return debug_make_int_type (dhandle, 4, TRUE);
1808*fae548d3Szrj 	}
1809*fae548d3Szrj 
1810*fae548d3Szrj       /* A range of 0 to 127 is char.  */
1811*fae548d3Szrj       if (self_subrange && n2 == 0 && n3 == 127)
1812*fae548d3Szrj 	return debug_make_int_type (dhandle, 1, FALSE);
1813*fae548d3Szrj 
1814*fae548d3Szrj       /* FIXME: gdb checks for the language CHILL here.  */
1815*fae548d3Szrj 
1816*fae548d3Szrj       if (n2 == 0)
1817*fae548d3Szrj 	{
1818*fae548d3Szrj 	  if (n3 < 0)
1819*fae548d3Szrj 	    return debug_make_int_type (dhandle, - n3, TRUE);
1820*fae548d3Szrj 	  else if (n3 == 0xff)
1821*fae548d3Szrj 	    return debug_make_int_type (dhandle, 1, TRUE);
1822*fae548d3Szrj 	  else if (n3 == 0xffff)
1823*fae548d3Szrj 	    return debug_make_int_type (dhandle, 2, TRUE);
1824*fae548d3Szrj 	  else if (n3 == (bfd_signed_vma) 0xffffffff)
1825*fae548d3Szrj 	    return debug_make_int_type (dhandle, 4, TRUE);
1826*fae548d3Szrj #ifdef BFD64
1827*fae548d3Szrj 	  else if (n3 == (bfd_signed_vma) 0xffffffffffffffffLL)
1828*fae548d3Szrj 	    return debug_make_int_type (dhandle, 8, TRUE);
1829*fae548d3Szrj #endif
1830*fae548d3Szrj 	}
1831*fae548d3Szrj       else if (n3 == 0
1832*fae548d3Szrj 	       && n2 < 0
1833*fae548d3Szrj 	       && (self_subrange || n2 == -8))
1834*fae548d3Szrj 	return debug_make_int_type (dhandle, - n2, TRUE);
1835*fae548d3Szrj       else if (n2 == - n3 - 1 || n2 == n3 + 1)
1836*fae548d3Szrj 	{
1837*fae548d3Szrj 	  if (n3 == 0x7f)
1838*fae548d3Szrj 	    return debug_make_int_type (dhandle, 1, FALSE);
1839*fae548d3Szrj 	  else if (n3 == 0x7fff)
1840*fae548d3Szrj 	    return debug_make_int_type (dhandle, 2, FALSE);
1841*fae548d3Szrj 	  else if (n3 == 0x7fffffff)
1842*fae548d3Szrj 	    return debug_make_int_type (dhandle, 4, FALSE);
1843*fae548d3Szrj #ifdef BFD64
1844*fae548d3Szrj 	  else if (n3 == ((((bfd_vma) 0x7fffffff) << 32) | 0xffffffff))
1845*fae548d3Szrj 	    return debug_make_int_type (dhandle, 8, FALSE);
1846*fae548d3Szrj #endif
1847*fae548d3Szrj 	}
1848*fae548d3Szrj     }
1849*fae548d3Szrj 
1850*fae548d3Szrj   /* At this point I don't have the faintest idea how to deal with a
1851*fae548d3Szrj      self_subrange type; I'm going to assume that this is used as an
1852*fae548d3Szrj      idiom, and that all of them are special cases.  So . . .  */
1853*fae548d3Szrj   if (self_subrange)
1854*fae548d3Szrj     {
1855*fae548d3Szrj       bad_stab (orig);
1856*fae548d3Szrj       return DEBUG_TYPE_NULL;
1857*fae548d3Szrj     }
1858*fae548d3Szrj 
1859*fae548d3Szrj   index_type = stab_find_type (dhandle, info, rangenums);
1860*fae548d3Szrj   if (index_type == DEBUG_TYPE_NULL)
1861*fae548d3Szrj     {
1862*fae548d3Szrj       /* Does this actually ever happen?  Is that why we are worrying
1863*fae548d3Szrj          about dealing with it rather than just calling error_type?  */
1864*fae548d3Szrj       warn_stab (orig, _("missing index type"));
1865*fae548d3Szrj       index_type = debug_make_int_type (dhandle, 4, FALSE);
1866*fae548d3Szrj     }
1867*fae548d3Szrj 
1868*fae548d3Szrj   return debug_make_range_type (dhandle, index_type, n2, n3);
1869*fae548d3Szrj }
1870*fae548d3Szrj 
1871*fae548d3Szrj /* Sun's ACC uses a somewhat saner method for specifying the builtin
1872*fae548d3Szrj    typedefs in every file (for int, long, etc):
1873*fae548d3Szrj 
1874*fae548d3Szrj 	type = b <signed> <width>; <offset>; <nbits>
1875*fae548d3Szrj 	signed = u or s.  Possible c in addition to u or s (for char?).
1876*fae548d3Szrj 	offset = offset from high order bit to start bit of type.
1877*fae548d3Szrj 	width is # bytes in object of this type, nbits is # bits in type.
1878*fae548d3Szrj 
1879*fae548d3Szrj    The width/offset stuff appears to be for small objects stored in
1880*fae548d3Szrj    larger ones (e.g. `shorts' in `int' registers).  We ignore it for now,
1881*fae548d3Szrj    FIXME.  */
1882*fae548d3Szrj 
1883*fae548d3Szrj static debug_type
parse_stab_sun_builtin_type(void * dhandle,const char ** pp,const char * p_end)1884*fae548d3Szrj parse_stab_sun_builtin_type (void *dhandle, const char **pp, const char * p_end)
1885*fae548d3Szrj {
1886*fae548d3Szrj   const char *orig;
1887*fae548d3Szrj   bfd_boolean unsignedp;
1888*fae548d3Szrj   bfd_vma bits;
1889*fae548d3Szrj 
1890*fae548d3Szrj   orig = *pp;
1891*fae548d3Szrj   if (orig >= p_end)
1892*fae548d3Szrj     return DEBUG_TYPE_NULL;
1893*fae548d3Szrj 
1894*fae548d3Szrj   switch (**pp)
1895*fae548d3Szrj     {
1896*fae548d3Szrj     case 's':
1897*fae548d3Szrj       unsignedp = FALSE;
1898*fae548d3Szrj       break;
1899*fae548d3Szrj     case 'u':
1900*fae548d3Szrj       unsignedp = TRUE;
1901*fae548d3Szrj       break;
1902*fae548d3Szrj     default:
1903*fae548d3Szrj       bad_stab (orig);
1904*fae548d3Szrj       return DEBUG_TYPE_NULL;
1905*fae548d3Szrj     }
1906*fae548d3Szrj   ++*pp;
1907*fae548d3Szrj 
1908*fae548d3Szrj   /* OpenSolaris source code indicates that one of "cbv" characters
1909*fae548d3Szrj      can come next and specify the intrinsic 'iformat' encoding.
1910*fae548d3Szrj      'c' is character encoding, 'b' is boolean encoding, and 'v' is
1911*fae548d3Szrj      varargs encoding.  This field can be safely ignored because
1912*fae548d3Szrj      the type of the field is determined from the bitwidth extracted
1913*fae548d3Szrj      below.  */
1914*fae548d3Szrj   if (**pp == 'c' || **pp == 'b' || **pp == 'v')
1915*fae548d3Szrj     ++*pp;
1916*fae548d3Szrj 
1917*fae548d3Szrj   /* The first number appears to be the number of bytes occupied
1918*fae548d3Szrj      by this type, except that unsigned short is 4 instead of 2.
1919*fae548d3Szrj      Since this information is redundant with the third number,
1920*fae548d3Szrj      we will ignore it.  */
1921*fae548d3Szrj   (void) parse_number (pp, (bfd_boolean *) NULL, p_end);
1922*fae548d3Szrj   if (**pp != ';')
1923*fae548d3Szrj     {
1924*fae548d3Szrj       bad_stab (orig);
1925*fae548d3Szrj       return DEBUG_TYPE_NULL;
1926*fae548d3Szrj     }
1927*fae548d3Szrj   ++*pp;
1928*fae548d3Szrj 
1929*fae548d3Szrj   /* The second number is always 0, so ignore it too.  */
1930*fae548d3Szrj   (void) parse_number (pp, (bfd_boolean *) NULL, p_end);
1931*fae548d3Szrj   if (**pp != ';')
1932*fae548d3Szrj     {
1933*fae548d3Szrj       bad_stab (orig);
1934*fae548d3Szrj       return DEBUG_TYPE_NULL;
1935*fae548d3Szrj     }
1936*fae548d3Szrj   ++*pp;
1937*fae548d3Szrj 
1938*fae548d3Szrj   /* The third number is the number of bits for this type.  */
1939*fae548d3Szrj   bits = parse_number (pp, (bfd_boolean *) NULL, p_end);
1940*fae548d3Szrj 
1941*fae548d3Szrj   /* The type *should* end with a semicolon.  If it are embedded
1942*fae548d3Szrj      in a larger type the semicolon may be the only way to know where
1943*fae548d3Szrj      the type ends.  If this type is at the end of the stabstring we
1944*fae548d3Szrj      can deal with the omitted semicolon (but we don't have to like
1945*fae548d3Szrj      it).  Don't bother to complain(), Sun's compiler omits the semicolon
1946*fae548d3Szrj      for "void".  */
1947*fae548d3Szrj   if (**pp == ';')
1948*fae548d3Szrj     ++*pp;
1949*fae548d3Szrj 
1950*fae548d3Szrj   if (bits == 0)
1951*fae548d3Szrj     return debug_make_void_type (dhandle);
1952*fae548d3Szrj 
1953*fae548d3Szrj   return debug_make_int_type (dhandle, bits / 8, unsignedp);
1954*fae548d3Szrj }
1955*fae548d3Szrj 
1956*fae548d3Szrj /* Parse a builtin floating type generated by the Sun compiler.  */
1957*fae548d3Szrj 
1958*fae548d3Szrj static debug_type
parse_stab_sun_floating_type(void * dhandle,const char ** pp,const char * p_end)1959*fae548d3Szrj parse_stab_sun_floating_type (void *dhandle, const char **pp, const char *p_end)
1960*fae548d3Szrj {
1961*fae548d3Szrj   const char *orig;
1962*fae548d3Szrj   bfd_vma details;
1963*fae548d3Szrj   bfd_vma bytes;
1964*fae548d3Szrj 
1965*fae548d3Szrj   orig = *pp;
1966*fae548d3Szrj   if (orig >= p_end)
1967*fae548d3Szrj     return DEBUG_TYPE_NULL;
1968*fae548d3Szrj 
1969*fae548d3Szrj   /* The first number has more details about the type, for example
1970*fae548d3Szrj      FN_COMPLEX.  */
1971*fae548d3Szrj   details = parse_number (pp, (bfd_boolean *) NULL, p_end);
1972*fae548d3Szrj   if (**pp != ';')
1973*fae548d3Szrj     {
1974*fae548d3Szrj       bad_stab (orig);
1975*fae548d3Szrj       return DEBUG_TYPE_NULL;
1976*fae548d3Szrj     }
1977*fae548d3Szrj 
1978*fae548d3Szrj   /* The second number is the number of bytes occupied by this type */
1979*fae548d3Szrj   bytes = parse_number (pp, (bfd_boolean *) NULL, p_end);
1980*fae548d3Szrj   if (**pp != ';')
1981*fae548d3Szrj     {
1982*fae548d3Szrj       bad_stab (orig);
1983*fae548d3Szrj       return DEBUG_TYPE_NULL;
1984*fae548d3Szrj     }
1985*fae548d3Szrj 
1986*fae548d3Szrj   if (details == NF_COMPLEX
1987*fae548d3Szrj       || details == NF_COMPLEX16
1988*fae548d3Szrj       || details == NF_COMPLEX32)
1989*fae548d3Szrj     return debug_make_complex_type (dhandle, bytes);
1990*fae548d3Szrj 
1991*fae548d3Szrj   return debug_make_float_type (dhandle, bytes);
1992*fae548d3Szrj }
1993*fae548d3Szrj 
1994*fae548d3Szrj /* Handle an enum type.  */
1995*fae548d3Szrj 
1996*fae548d3Szrj static debug_type
parse_stab_enum_type(void * dhandle,const char ** pp,const char * p_end)1997*fae548d3Szrj parse_stab_enum_type (void *dhandle, const char **pp, const char * p_end)
1998*fae548d3Szrj {
1999*fae548d3Szrj   const char *orig;
2000*fae548d3Szrj   const char **names;
2001*fae548d3Szrj   bfd_signed_vma *values;
2002*fae548d3Szrj   unsigned int n;
2003*fae548d3Szrj   unsigned int alloc;
2004*fae548d3Szrj 
2005*fae548d3Szrj   orig = *pp;
2006*fae548d3Szrj   if (orig >= p_end)
2007*fae548d3Szrj     return DEBUG_TYPE_NULL;
2008*fae548d3Szrj 
2009*fae548d3Szrj   /* FIXME: gdb checks os9k_stabs here.  */
2010*fae548d3Szrj 
2011*fae548d3Szrj   /* The aix4 compiler emits an extra field before the enum members;
2012*fae548d3Szrj      my guess is it's a type of some sort.  Just ignore it.  */
2013*fae548d3Szrj   if (**pp == '-')
2014*fae548d3Szrj     {
2015*fae548d3Szrj       while (**pp != ':' && **pp != 0)
2016*fae548d3Szrj 	++*pp;
2017*fae548d3Szrj 
2018*fae548d3Szrj       if (**pp == 0)
2019*fae548d3Szrj 	{
2020*fae548d3Szrj 	  bad_stab (orig);
2021*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
2022*fae548d3Szrj 	}
2023*fae548d3Szrj       ++*pp;
2024*fae548d3Szrj     }
2025*fae548d3Szrj 
2026*fae548d3Szrj   /* Read the value-names and their values.
2027*fae548d3Szrj      The input syntax is NAME:VALUE,NAME:VALUE, and so on.
2028*fae548d3Szrj      A semicolon or comma instead of a NAME means the end.  */
2029*fae548d3Szrj   alloc = 10;
2030*fae548d3Szrj   names = (const char **) xmalloc (alloc * sizeof *names);
2031*fae548d3Szrj   values = (bfd_signed_vma *) xmalloc (alloc * sizeof *values);
2032*fae548d3Szrj   n = 0;
2033*fae548d3Szrj   while (**pp != '\0' && **pp != ';' && **pp != ',')
2034*fae548d3Szrj     {
2035*fae548d3Szrj       const char *p;
2036*fae548d3Szrj       char *name;
2037*fae548d3Szrj       bfd_signed_vma val;
2038*fae548d3Szrj 
2039*fae548d3Szrj       p = *pp;
2040*fae548d3Szrj       while (*p != ':' && *p != 0)
2041*fae548d3Szrj 	++p;
2042*fae548d3Szrj 
2043*fae548d3Szrj       if (*p == 0)
2044*fae548d3Szrj 	{
2045*fae548d3Szrj 	  bad_stab (orig);
2046*fae548d3Szrj 	  free (names);
2047*fae548d3Szrj 	  free (values);
2048*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
2049*fae548d3Szrj 	}
2050*fae548d3Szrj 
2051*fae548d3Szrj       name = savestring (*pp, p - *pp);
2052*fae548d3Szrj 
2053*fae548d3Szrj       *pp = p + 1;
2054*fae548d3Szrj       val = (bfd_signed_vma) parse_number (pp, (bfd_boolean *) NULL, p_end);
2055*fae548d3Szrj       if (**pp != ',')
2056*fae548d3Szrj 	{
2057*fae548d3Szrj 	  bad_stab (orig);
2058*fae548d3Szrj 	  free (name);
2059*fae548d3Szrj 	  free (names);
2060*fae548d3Szrj 	  free (values);
2061*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
2062*fae548d3Szrj 	}
2063*fae548d3Szrj       ++*pp;
2064*fae548d3Szrj 
2065*fae548d3Szrj       if (n + 1 >= alloc)
2066*fae548d3Szrj 	{
2067*fae548d3Szrj 	  alloc += 10;
2068*fae548d3Szrj 	  names = ((const char **)
2069*fae548d3Szrj 		   xrealloc (names, alloc * sizeof *names));
2070*fae548d3Szrj 	  values = ((bfd_signed_vma *)
2071*fae548d3Szrj 		    xrealloc (values, alloc * sizeof *values));
2072*fae548d3Szrj 	}
2073*fae548d3Szrj 
2074*fae548d3Szrj       names[n] = name;
2075*fae548d3Szrj       values[n] = val;
2076*fae548d3Szrj       ++n;
2077*fae548d3Szrj     }
2078*fae548d3Szrj 
2079*fae548d3Szrj   names[n] = NULL;
2080*fae548d3Szrj   values[n] = 0;
2081*fae548d3Szrj 
2082*fae548d3Szrj   if (**pp == ';')
2083*fae548d3Szrj     ++*pp;
2084*fae548d3Szrj 
2085*fae548d3Szrj   return debug_make_enum_type (dhandle, names, values);
2086*fae548d3Szrj }
2087*fae548d3Szrj 
2088*fae548d3Szrj /* Read the description of a structure (or union type) and return an object
2089*fae548d3Szrj    describing the type.
2090*fae548d3Szrj 
2091*fae548d3Szrj    PP points to a character pointer that points to the next unconsumed token
2092*fae548d3Szrj    in the stabs string.  For example, given stabs "A:T4=s4a:1,0,32;;",
2093*fae548d3Szrj    *PP will point to "4a:1,0,32;;".  */
2094*fae548d3Szrj 
2095*fae548d3Szrj static debug_type
parse_stab_struct_type(void * dhandle,struct stab_handle * info,const char * tagname,const char ** pp,bfd_boolean structp,const int * typenums,const char * p_end)2096*fae548d3Szrj parse_stab_struct_type (void *                dhandle,
2097*fae548d3Szrj 			struct stab_handle *  info,
2098*fae548d3Szrj 			const char *          tagname,
2099*fae548d3Szrj 			const char **         pp,
2100*fae548d3Szrj 			bfd_boolean           structp,
2101*fae548d3Szrj 			const int *           typenums,
2102*fae548d3Szrj 			const char *          p_end)
2103*fae548d3Szrj {
2104*fae548d3Szrj   bfd_vma size;
2105*fae548d3Szrj   debug_baseclass *baseclasses;
2106*fae548d3Szrj   debug_field *fields = NULL;
2107*fae548d3Szrj   bfd_boolean statics;
2108*fae548d3Szrj   debug_method *methods;
2109*fae548d3Szrj   debug_type vptrbase;
2110*fae548d3Szrj   bfd_boolean ownvptr;
2111*fae548d3Szrj 
2112*fae548d3Szrj   /* Get the size.  */
2113*fae548d3Szrj   size = parse_number (pp, (bfd_boolean *) NULL, p_end);
2114*fae548d3Szrj 
2115*fae548d3Szrj   /* Get the other information.  */
2116*fae548d3Szrj   if (! parse_stab_baseclasses (dhandle, info, pp, &baseclasses, p_end)
2117*fae548d3Szrj       || ! parse_stab_struct_fields (dhandle, info, pp, &fields, &statics, p_end)
2118*fae548d3Szrj       || ! parse_stab_members (dhandle, info, tagname, pp, typenums, &methods, p_end)
2119*fae548d3Szrj       || ! parse_stab_tilde_field (dhandle, info, pp, typenums, &vptrbase,
2120*fae548d3Szrj 				   &ownvptr, p_end))
2121*fae548d3Szrj     {
2122*fae548d3Szrj       if (fields != NULL)
2123*fae548d3Szrj 	free (fields);
2124*fae548d3Szrj       return DEBUG_TYPE_NULL;
2125*fae548d3Szrj     }
2126*fae548d3Szrj 
2127*fae548d3Szrj   if (! statics
2128*fae548d3Szrj       && baseclasses == NULL
2129*fae548d3Szrj       && methods == NULL
2130*fae548d3Szrj       && vptrbase == DEBUG_TYPE_NULL
2131*fae548d3Szrj       && ! ownvptr)
2132*fae548d3Szrj     return debug_make_struct_type (dhandle, structp, size, fields);
2133*fae548d3Szrj 
2134*fae548d3Szrj   return debug_make_object_type (dhandle, structp, size, fields, baseclasses,
2135*fae548d3Szrj 				 methods, vptrbase, ownvptr);
2136*fae548d3Szrj }
2137*fae548d3Szrj 
2138*fae548d3Szrj /* The stabs for C++ derived classes contain baseclass information which
2139*fae548d3Szrj    is marked by a '!' character after the total size.  This function is
2140*fae548d3Szrj    called when we encounter the baseclass marker, and slurps up all the
2141*fae548d3Szrj    baseclass information.
2142*fae548d3Szrj 
2143*fae548d3Szrj    Immediately following the '!' marker is the number of base classes that
2144*fae548d3Szrj    the class is derived from, followed by information for each base class.
2145*fae548d3Szrj    For each base class, there are two visibility specifiers, a bit offset
2146*fae548d3Szrj    to the base class information within the derived class, a reference to
2147*fae548d3Szrj    the type for the base class, and a terminating semicolon.
2148*fae548d3Szrj 
2149*fae548d3Szrj    A typical example, with two base classes, would be "!2,020,19;0264,21;".
2150*fae548d3Szrj 						       ^^ ^ ^ ^  ^ ^  ^
2151*fae548d3Szrj 	Baseclass information marker __________________|| | | |  | |  |
2152*fae548d3Szrj 	Number of baseclasses __________________________| | | |  | |  |
2153*fae548d3Szrj 	Visibility specifiers (2) ________________________| | |  | |  |
2154*fae548d3Szrj 	Offset in bits from start of class _________________| |  | |  |
2155*fae548d3Szrj 	Type number for base class ___________________________|  | |  |
2156*fae548d3Szrj 	Visibility specifiers (2) _______________________________| |  |
2157*fae548d3Szrj 	Offset in bits from start of class ________________________|  |
2158*fae548d3Szrj 	Type number of base class ____________________________________|
2159*fae548d3Szrj 
2160*fae548d3Szrj   Return TRUE for success, FALSE for failure.  */
2161*fae548d3Szrj 
2162*fae548d3Szrj static bfd_boolean
parse_stab_baseclasses(void * dhandle,struct stab_handle * info,const char ** pp,debug_baseclass ** retp,const char * p_end)2163*fae548d3Szrj parse_stab_baseclasses (void *                dhandle,
2164*fae548d3Szrj 			struct stab_handle *  info,
2165*fae548d3Szrj 			const char **         pp,
2166*fae548d3Szrj 			debug_baseclass **    retp,
2167*fae548d3Szrj 			const char *          p_end)
2168*fae548d3Szrj {
2169*fae548d3Szrj   const char *orig;
2170*fae548d3Szrj   unsigned int c, i;
2171*fae548d3Szrj   debug_baseclass *classes;
2172*fae548d3Szrj 
2173*fae548d3Szrj   *retp = NULL;
2174*fae548d3Szrj 
2175*fae548d3Szrj   orig = *pp;
2176*fae548d3Szrj   if (orig >= p_end)
2177*fae548d3Szrj     return FALSE;
2178*fae548d3Szrj 
2179*fae548d3Szrj   if (**pp != '!')
2180*fae548d3Szrj     {
2181*fae548d3Szrj       /* No base classes.  */
2182*fae548d3Szrj       return TRUE;
2183*fae548d3Szrj     }
2184*fae548d3Szrj   ++*pp;
2185*fae548d3Szrj 
2186*fae548d3Szrj   c = (unsigned int) parse_number (pp, (bfd_boolean *) NULL, p_end);
2187*fae548d3Szrj 
2188*fae548d3Szrj   if (**pp != ',')
2189*fae548d3Szrj     {
2190*fae548d3Szrj       bad_stab (orig);
2191*fae548d3Szrj       return FALSE;
2192*fae548d3Szrj     }
2193*fae548d3Szrj   ++*pp;
2194*fae548d3Szrj 
2195*fae548d3Szrj   classes = (debug_baseclass *) xmalloc ((c + 1) * sizeof (**retp));
2196*fae548d3Szrj 
2197*fae548d3Szrj   for (i = 0; i < c; i++)
2198*fae548d3Szrj     {
2199*fae548d3Szrj       bfd_boolean is_virtual;
2200*fae548d3Szrj       enum debug_visibility visibility;
2201*fae548d3Szrj       bfd_vma bitpos;
2202*fae548d3Szrj       debug_type type;
2203*fae548d3Szrj 
2204*fae548d3Szrj       switch (**pp)
2205*fae548d3Szrj 	{
2206*fae548d3Szrj 	case '0':
2207*fae548d3Szrj 	  is_virtual = FALSE;
2208*fae548d3Szrj 	  break;
2209*fae548d3Szrj 	case '1':
2210*fae548d3Szrj 	  is_virtual = TRUE;
2211*fae548d3Szrj 	  break;
2212*fae548d3Szrj 	case 0:
2213*fae548d3Szrj 	  bad_stab (orig);
2214*fae548d3Szrj 	  return FALSE;
2215*fae548d3Szrj 	default:
2216*fae548d3Szrj 	  warn_stab (orig, _("unknown virtual character for baseclass"));
2217*fae548d3Szrj 	  is_virtual = FALSE;
2218*fae548d3Szrj 	  break;
2219*fae548d3Szrj 	}
2220*fae548d3Szrj       ++*pp;
2221*fae548d3Szrj 
2222*fae548d3Szrj       switch (**pp)
2223*fae548d3Szrj 	{
2224*fae548d3Szrj 	case '0':
2225*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PRIVATE;
2226*fae548d3Szrj 	  break;
2227*fae548d3Szrj 	case '1':
2228*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PROTECTED;
2229*fae548d3Szrj 	  break;
2230*fae548d3Szrj 	case '2':
2231*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PUBLIC;
2232*fae548d3Szrj 	  break;
2233*fae548d3Szrj 	case 0:
2234*fae548d3Szrj 	  bad_stab (orig);
2235*fae548d3Szrj 	  return FALSE;
2236*fae548d3Szrj 	default:
2237*fae548d3Szrj 	  warn_stab (orig, _("unknown visibility character for baseclass"));
2238*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PUBLIC;
2239*fae548d3Szrj 	  break;
2240*fae548d3Szrj 	}
2241*fae548d3Szrj       ++*pp;
2242*fae548d3Szrj 
2243*fae548d3Szrj       /* The remaining value is the bit offset of the portion of the
2244*fae548d3Szrj 	 object corresponding to this baseclass.  Always zero in the
2245*fae548d3Szrj 	 absence of multiple inheritance.  */
2246*fae548d3Szrj       bitpos = parse_number (pp, (bfd_boolean *) NULL, p_end);
2247*fae548d3Szrj       if (**pp != ',')
2248*fae548d3Szrj 	{
2249*fae548d3Szrj 	  bad_stab (orig);
2250*fae548d3Szrj 	  return FALSE;
2251*fae548d3Szrj 	}
2252*fae548d3Szrj       ++*pp;
2253*fae548d3Szrj 
2254*fae548d3Szrj       type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
2255*fae548d3Szrj 			      (debug_type **) NULL, p_end);
2256*fae548d3Szrj       if (type == DEBUG_TYPE_NULL)
2257*fae548d3Szrj 	return FALSE;
2258*fae548d3Szrj 
2259*fae548d3Szrj       classes[i] = debug_make_baseclass (dhandle, type, bitpos, is_virtual,
2260*fae548d3Szrj 					 visibility);
2261*fae548d3Szrj       if (classes[i] == DEBUG_BASECLASS_NULL)
2262*fae548d3Szrj 	return FALSE;
2263*fae548d3Szrj 
2264*fae548d3Szrj       if (**pp != ';')
2265*fae548d3Szrj 	return FALSE;
2266*fae548d3Szrj       ++*pp;
2267*fae548d3Szrj     }
2268*fae548d3Szrj 
2269*fae548d3Szrj   classes[i] = DEBUG_BASECLASS_NULL;
2270*fae548d3Szrj 
2271*fae548d3Szrj   *retp = classes;
2272*fae548d3Szrj 
2273*fae548d3Szrj   return TRUE;
2274*fae548d3Szrj }
2275*fae548d3Szrj 
2276*fae548d3Szrj /* Read struct or class data fields.  They have the form:
2277*fae548d3Szrj 
2278*fae548d3Szrj 	NAME : [VISIBILITY] TYPENUM , BITPOS , BITSIZE ;
2279*fae548d3Szrj 
2280*fae548d3Szrj    At the end, we see a semicolon instead of a field.
2281*fae548d3Szrj 
2282*fae548d3Szrj    In C++, this may wind up being NAME:?TYPENUM:PHYSNAME; for
2283*fae548d3Szrj    a static field.
2284*fae548d3Szrj 
2285*fae548d3Szrj    The optional VISIBILITY is one of:
2286*fae548d3Szrj 
2287*fae548d3Szrj 	'/0'	(VISIBILITY_PRIVATE)
2288*fae548d3Szrj 	'/1'	(VISIBILITY_PROTECTED)
2289*fae548d3Szrj 	'/2'	(VISIBILITY_PUBLIC)
2290*fae548d3Szrj 	'/9'	(VISIBILITY_IGNORE)
2291*fae548d3Szrj 
2292*fae548d3Szrj    or nothing, for C style fields with public visibility.
2293*fae548d3Szrj 
2294*fae548d3Szrj    Returns 1 for success, 0 for failure.  */
2295*fae548d3Szrj 
2296*fae548d3Szrj static bfd_boolean
parse_stab_struct_fields(void * dhandle,struct stab_handle * info,const char ** pp,debug_field ** retp,bfd_boolean * staticsp,const char * p_end)2297*fae548d3Szrj parse_stab_struct_fields (void *                dhandle,
2298*fae548d3Szrj 			  struct stab_handle *  info,
2299*fae548d3Szrj 			  const char **         pp,
2300*fae548d3Szrj 			  debug_field **        retp,
2301*fae548d3Szrj 			  bfd_boolean *         staticsp,
2302*fae548d3Szrj 			  const char *          p_end)
2303*fae548d3Szrj {
2304*fae548d3Szrj   const char *orig;
2305*fae548d3Szrj   const char *p;
2306*fae548d3Szrj   debug_field *fields;
2307*fae548d3Szrj   unsigned int c;
2308*fae548d3Szrj   unsigned int alloc;
2309*fae548d3Szrj 
2310*fae548d3Szrj   *retp = NULL;
2311*fae548d3Szrj   *staticsp = FALSE;
2312*fae548d3Szrj 
2313*fae548d3Szrj   orig = *pp;
2314*fae548d3Szrj   if (orig >= p_end)
2315*fae548d3Szrj     return FALSE;
2316*fae548d3Szrj 
2317*fae548d3Szrj   c = 0;
2318*fae548d3Szrj   alloc = 10;
2319*fae548d3Szrj   fields = (debug_field *) xmalloc (alloc * sizeof *fields);
2320*fae548d3Szrj   while (**pp != ';')
2321*fae548d3Szrj     {
2322*fae548d3Szrj       /* FIXME: gdb checks os9k_stabs here.  */
2323*fae548d3Szrj 
2324*fae548d3Szrj       p = *pp;
2325*fae548d3Szrj 
2326*fae548d3Szrj       /* Add 1 to c to leave room for NULL pointer at end.  */
2327*fae548d3Szrj       if (c + 1 >= alloc)
2328*fae548d3Szrj 	{
2329*fae548d3Szrj 	  alloc += 10;
2330*fae548d3Szrj 	  fields = ((debug_field *)
2331*fae548d3Szrj 		    xrealloc (fields, alloc * sizeof *fields));
2332*fae548d3Szrj 	}
2333*fae548d3Szrj 
2334*fae548d3Szrj       /* If it starts with CPLUS_MARKER it is a special abbreviation,
2335*fae548d3Szrj 	 unless the CPLUS_MARKER is followed by an underscore, in
2336*fae548d3Szrj 	 which case it is just the name of an anonymous type, which we
2337*fae548d3Szrj 	 should handle like any other type name.  We accept either '$'
2338*fae548d3Szrj 	 or '.', because a field name can never contain one of these
2339*fae548d3Szrj 	 characters except as a CPLUS_MARKER.  */
2340*fae548d3Szrj 
2341*fae548d3Szrj       if ((*p == '$' || *p == '.') && p[1] != '_')
2342*fae548d3Szrj 	{
2343*fae548d3Szrj 	  ++*pp;
2344*fae548d3Szrj 	  if (! parse_stab_cpp_abbrev (dhandle, info, pp, fields + c, p_end))
2345*fae548d3Szrj 	    {
2346*fae548d3Szrj 	      free (fields);
2347*fae548d3Szrj 	      return FALSE;
2348*fae548d3Szrj 	    }
2349*fae548d3Szrj 	  ++c;
2350*fae548d3Szrj 	  continue;
2351*fae548d3Szrj 	}
2352*fae548d3Szrj 
2353*fae548d3Szrj       /* Look for the ':' that separates the field name from the field
2354*fae548d3Szrj 	 values.  Data members are delimited by a single ':', while member
2355*fae548d3Szrj 	 functions are delimited by a pair of ':'s.  When we hit the member
2356*fae548d3Szrj 	 functions (if any), terminate scan loop and return.  */
2357*fae548d3Szrj 
2358*fae548d3Szrj       p = strchr (p, ':');
2359*fae548d3Szrj       if (p == NULL)
2360*fae548d3Szrj 	{
2361*fae548d3Szrj 	  bad_stab (orig);
2362*fae548d3Szrj 	  free (fields);
2363*fae548d3Szrj 	  return FALSE;
2364*fae548d3Szrj 	}
2365*fae548d3Szrj 
2366*fae548d3Szrj       if (p[1] == ':')
2367*fae548d3Szrj 	break;
2368*fae548d3Szrj 
2369*fae548d3Szrj       if (! parse_stab_one_struct_field (dhandle, info, pp, p, fields + c,
2370*fae548d3Szrj 					 staticsp, p_end))
2371*fae548d3Szrj 	return FALSE;
2372*fae548d3Szrj 
2373*fae548d3Szrj       ++c;
2374*fae548d3Szrj     }
2375*fae548d3Szrj 
2376*fae548d3Szrj   fields[c] = DEBUG_FIELD_NULL;
2377*fae548d3Szrj 
2378*fae548d3Szrj   *retp = fields;
2379*fae548d3Szrj 
2380*fae548d3Szrj   return TRUE;
2381*fae548d3Szrj }
2382*fae548d3Szrj 
2383*fae548d3Szrj /* Special GNU C++ name.  */
2384*fae548d3Szrj 
2385*fae548d3Szrj static bfd_boolean
parse_stab_cpp_abbrev(void * dhandle,struct stab_handle * info,const char ** pp,debug_field * retp,const char * p_end)2386*fae548d3Szrj parse_stab_cpp_abbrev (void *                dhandle,
2387*fae548d3Szrj 		       struct stab_handle *  info,
2388*fae548d3Szrj 		       const char **         pp,
2389*fae548d3Szrj 		       debug_field *         retp,
2390*fae548d3Szrj 		       const char *          p_end)
2391*fae548d3Szrj {
2392*fae548d3Szrj   const char *orig;
2393*fae548d3Szrj   int cpp_abbrev;
2394*fae548d3Szrj   debug_type context;
2395*fae548d3Szrj   const char *name;
2396*fae548d3Szrj   const char *type_name;
2397*fae548d3Szrj   debug_type type;
2398*fae548d3Szrj   bfd_vma bitpos;
2399*fae548d3Szrj 
2400*fae548d3Szrj   *retp = DEBUG_FIELD_NULL;
2401*fae548d3Szrj 
2402*fae548d3Szrj   orig = *pp;
2403*fae548d3Szrj   if (orig >= p_end)
2404*fae548d3Szrj     return FALSE;
2405*fae548d3Szrj 
2406*fae548d3Szrj   if (**pp != 'v')
2407*fae548d3Szrj     {
2408*fae548d3Szrj       bad_stab (*pp);
2409*fae548d3Szrj       return FALSE;
2410*fae548d3Szrj     }
2411*fae548d3Szrj   ++*pp;
2412*fae548d3Szrj 
2413*fae548d3Szrj   cpp_abbrev = **pp;
2414*fae548d3Szrj   if (cpp_abbrev == 0)
2415*fae548d3Szrj     {
2416*fae548d3Szrj       bad_stab (orig);
2417*fae548d3Szrj       return FALSE;
2418*fae548d3Szrj     }
2419*fae548d3Szrj   ++*pp;
2420*fae548d3Szrj 
2421*fae548d3Szrj   /* At this point, *pp points to something like "22:23=*22...", where
2422*fae548d3Szrj      the type number before the ':' is the "context" and everything
2423*fae548d3Szrj      after is a regular type definition.  Lookup the type, find it's
2424*fae548d3Szrj      name, and construct the field name.  */
2425*fae548d3Szrj 
2426*fae548d3Szrj   context = parse_stab_type (dhandle, info, (const char *) NULL, pp,
2427*fae548d3Szrj 			     (debug_type **) NULL, p_end);
2428*fae548d3Szrj   if (context == DEBUG_TYPE_NULL)
2429*fae548d3Szrj     return FALSE;
2430*fae548d3Szrj 
2431*fae548d3Szrj   switch (cpp_abbrev)
2432*fae548d3Szrj     {
2433*fae548d3Szrj     case 'f':
2434*fae548d3Szrj       /* $vf -- a virtual function table pointer.  */
2435*fae548d3Szrj       name = "_vptr$";
2436*fae548d3Szrj       break;
2437*fae548d3Szrj     case 'b':
2438*fae548d3Szrj       /* $vb -- a virtual bsomethingorother */
2439*fae548d3Szrj       type_name = debug_get_type_name (dhandle, context);
2440*fae548d3Szrj       if (type_name == NULL)
2441*fae548d3Szrj 	{
2442*fae548d3Szrj 	  warn_stab (orig, _("unnamed $vb type"));
2443*fae548d3Szrj 	  type_name = "FOO";
2444*fae548d3Szrj 	}
2445*fae548d3Szrj       name = concat ("_vb$", type_name, (const char *) NULL);
2446*fae548d3Szrj       break;
2447*fae548d3Szrj     default:
2448*fae548d3Szrj       warn_stab (orig, _("unrecognized C++ abbreviation"));
2449*fae548d3Szrj       name = "INVALID_CPLUSPLUS_ABBREV";
2450*fae548d3Szrj       break;
2451*fae548d3Szrj     }
2452*fae548d3Szrj 
2453*fae548d3Szrj   if (**pp != ':')
2454*fae548d3Szrj     {
2455*fae548d3Szrj       bad_stab (orig);
2456*fae548d3Szrj       return FALSE;
2457*fae548d3Szrj     }
2458*fae548d3Szrj   ++*pp;
2459*fae548d3Szrj 
2460*fae548d3Szrj   type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
2461*fae548d3Szrj 			  (debug_type **) NULL, p_end);
2462*fae548d3Szrj   if (**pp != ',')
2463*fae548d3Szrj     {
2464*fae548d3Szrj       bad_stab (orig);
2465*fae548d3Szrj       return FALSE;
2466*fae548d3Szrj     }
2467*fae548d3Szrj   ++*pp;
2468*fae548d3Szrj 
2469*fae548d3Szrj   bitpos = parse_number (pp, (bfd_boolean *) NULL, p_end);
2470*fae548d3Szrj   if (**pp != ';')
2471*fae548d3Szrj     {
2472*fae548d3Szrj       bad_stab (orig);
2473*fae548d3Szrj       return FALSE;
2474*fae548d3Szrj     }
2475*fae548d3Szrj   ++*pp;
2476*fae548d3Szrj 
2477*fae548d3Szrj   *retp = debug_make_field (dhandle, name, type, bitpos, 0,
2478*fae548d3Szrj 			    DEBUG_VISIBILITY_PRIVATE);
2479*fae548d3Szrj   if (*retp == DEBUG_FIELD_NULL)
2480*fae548d3Szrj     return FALSE;
2481*fae548d3Szrj 
2482*fae548d3Szrj   return TRUE;
2483*fae548d3Szrj }
2484*fae548d3Szrj 
2485*fae548d3Szrj /* Parse a single field in a struct or union.  */
2486*fae548d3Szrj 
2487*fae548d3Szrj static bfd_boolean
parse_stab_one_struct_field(void * dhandle,struct stab_handle * info,const char ** pp,const char * p,debug_field * retp,bfd_boolean * staticsp,const char * p_end)2488*fae548d3Szrj parse_stab_one_struct_field (void *                dhandle,
2489*fae548d3Szrj 			     struct stab_handle *  info,
2490*fae548d3Szrj 			     const char **         pp,
2491*fae548d3Szrj 			     const char *          p,
2492*fae548d3Szrj 			     debug_field *         retp,
2493*fae548d3Szrj 			     bfd_boolean *         staticsp,
2494*fae548d3Szrj 			     const char *          p_end)
2495*fae548d3Szrj {
2496*fae548d3Szrj   const char *orig;
2497*fae548d3Szrj   char *name;
2498*fae548d3Szrj   enum debug_visibility visibility;
2499*fae548d3Szrj   debug_type type;
2500*fae548d3Szrj   bfd_vma bitpos;
2501*fae548d3Szrj   bfd_vma bitsize;
2502*fae548d3Szrj 
2503*fae548d3Szrj   orig = *pp;
2504*fae548d3Szrj   if (orig >= p_end)
2505*fae548d3Szrj     return FALSE;
2506*fae548d3Szrj 
2507*fae548d3Szrj   /* FIXME: gdb checks ARM_DEMANGLING here.  */
2508*fae548d3Szrj 
2509*fae548d3Szrj   name = savestring (*pp, p - *pp);
2510*fae548d3Szrj 
2511*fae548d3Szrj   *pp = p + 1;
2512*fae548d3Szrj 
2513*fae548d3Szrj   if (**pp != '/')
2514*fae548d3Szrj     visibility = DEBUG_VISIBILITY_PUBLIC;
2515*fae548d3Szrj   else
2516*fae548d3Szrj     {
2517*fae548d3Szrj       ++*pp;
2518*fae548d3Szrj       switch (**pp)
2519*fae548d3Szrj 	{
2520*fae548d3Szrj 	case '0':
2521*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PRIVATE;
2522*fae548d3Szrj 	  break;
2523*fae548d3Szrj 	case '1':
2524*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PROTECTED;
2525*fae548d3Szrj 	  break;
2526*fae548d3Szrj 	case '2':
2527*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PUBLIC;
2528*fae548d3Szrj 	  break;
2529*fae548d3Szrj 	case 0:
2530*fae548d3Szrj 	  bad_stab (orig);
2531*fae548d3Szrj 	  return FALSE;
2532*fae548d3Szrj 	default:
2533*fae548d3Szrj 	  warn_stab (orig, _("unknown visibility character for field"));
2534*fae548d3Szrj 	  visibility = DEBUG_VISIBILITY_PUBLIC;
2535*fae548d3Szrj 	  break;
2536*fae548d3Szrj 	}
2537*fae548d3Szrj       ++*pp;
2538*fae548d3Szrj     }
2539*fae548d3Szrj 
2540*fae548d3Szrj   type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
2541*fae548d3Szrj 			  (debug_type **) NULL, p_end);
2542*fae548d3Szrj   if (type == DEBUG_TYPE_NULL)
2543*fae548d3Szrj     {
2544*fae548d3Szrj       free (name);
2545*fae548d3Szrj       return FALSE;
2546*fae548d3Szrj     }
2547*fae548d3Szrj 
2548*fae548d3Szrj   if (**pp == ':')
2549*fae548d3Szrj     {
2550*fae548d3Szrj       char *varname;
2551*fae548d3Szrj 
2552*fae548d3Szrj       /* This is a static class member.  */
2553*fae548d3Szrj       ++*pp;
2554*fae548d3Szrj       p = strchr (*pp, ';');
2555*fae548d3Szrj       if (p == NULL)
2556*fae548d3Szrj 	{
2557*fae548d3Szrj 	  bad_stab (orig);
2558*fae548d3Szrj 	  free (name);
2559*fae548d3Szrj 	  return FALSE;
2560*fae548d3Szrj 	}
2561*fae548d3Szrj 
2562*fae548d3Szrj       varname = savestring (*pp, p - *pp);
2563*fae548d3Szrj 
2564*fae548d3Szrj       *pp = p + 1;
2565*fae548d3Szrj 
2566*fae548d3Szrj       *retp = debug_make_static_member (dhandle, name, type, varname,
2567*fae548d3Szrj 					visibility);
2568*fae548d3Szrj       *staticsp = TRUE;
2569*fae548d3Szrj 
2570*fae548d3Szrj       return TRUE;
2571*fae548d3Szrj     }
2572*fae548d3Szrj 
2573*fae548d3Szrj   if (**pp != ',')
2574*fae548d3Szrj     {
2575*fae548d3Szrj       bad_stab (orig);
2576*fae548d3Szrj       free (name);
2577*fae548d3Szrj       return FALSE;
2578*fae548d3Szrj     }
2579*fae548d3Szrj   ++*pp;
2580*fae548d3Szrj 
2581*fae548d3Szrj   bitpos = parse_number (pp, (bfd_boolean *) NULL, p_end);
2582*fae548d3Szrj   if (**pp != ',')
2583*fae548d3Szrj     {
2584*fae548d3Szrj       bad_stab (orig);
2585*fae548d3Szrj       free (name);
2586*fae548d3Szrj       return FALSE;
2587*fae548d3Szrj     }
2588*fae548d3Szrj   ++*pp;
2589*fae548d3Szrj 
2590*fae548d3Szrj   bitsize = parse_number (pp, (bfd_boolean *) NULL, p_end);
2591*fae548d3Szrj   if (**pp != ';')
2592*fae548d3Szrj     {
2593*fae548d3Szrj       bad_stab (orig);
2594*fae548d3Szrj       free (name);
2595*fae548d3Szrj       return FALSE;
2596*fae548d3Szrj     }
2597*fae548d3Szrj   ++*pp;
2598*fae548d3Szrj 
2599*fae548d3Szrj   if (bitpos == 0 && bitsize == 0)
2600*fae548d3Szrj     {
2601*fae548d3Szrj       /* This can happen in two cases: (1) at least for gcc 2.4.5 or
2602*fae548d3Szrj 	 so, it is a field which has been optimized out.  The correct
2603*fae548d3Szrj 	 stab for this case is to use VISIBILITY_IGNORE, but that is a
2604*fae548d3Szrj 	 recent invention.  (2) It is a 0-size array.  For example
2605*fae548d3Szrj 	 union { int num; char str[0]; } foo.  Printing "<no value>"
2606*fae548d3Szrj 	 for str in "p foo" is OK, since foo.str (and thus foo.str[3])
2607*fae548d3Szrj 	 will continue to work, and a 0-size array as a whole doesn't
2608*fae548d3Szrj 	 have any contents to print.
2609*fae548d3Szrj 
2610*fae548d3Szrj 	 I suspect this probably could also happen with gcc -gstabs
2611*fae548d3Szrj 	 (not -gstabs+) for static fields, and perhaps other C++
2612*fae548d3Szrj 	 extensions.  Hopefully few people use -gstabs with gdb, since
2613*fae548d3Szrj 	 it is intended for dbx compatibility.  */
2614*fae548d3Szrj       visibility = DEBUG_VISIBILITY_IGNORE;
2615*fae548d3Szrj     }
2616*fae548d3Szrj 
2617*fae548d3Szrj   /* FIXME: gdb does some stuff here to mark fields as unpacked.  */
2618*fae548d3Szrj 
2619*fae548d3Szrj   *retp = debug_make_field (dhandle, name, type, bitpos, bitsize, visibility);
2620*fae548d3Szrj 
2621*fae548d3Szrj   return TRUE;
2622*fae548d3Szrj }
2623*fae548d3Szrj 
2624*fae548d3Szrj /* Read member function stabs info for C++ classes.  The form of each member
2625*fae548d3Szrj    function data is:
2626*fae548d3Szrj 
2627*fae548d3Szrj 	NAME :: TYPENUM[=type definition] ARGS : PHYSNAME ;
2628*fae548d3Szrj 
2629*fae548d3Szrj    An example with two member functions is:
2630*fae548d3Szrj 
2631*fae548d3Szrj 	afunc1::20=##15;:i;2A.;afunc2::20:i;2A.;
2632*fae548d3Szrj 
2633*fae548d3Szrj    For the case of overloaded operators, the format is op$::*.funcs, where
2634*fae548d3Szrj    $ is the CPLUS_MARKER (usually '$'), `*' holds the place for an operator
2635*fae548d3Szrj    name (such as `+=') and `.' marks the end of the operator name.  */
2636*fae548d3Szrj 
2637*fae548d3Szrj static bfd_boolean
parse_stab_members(void * dhandle,struct stab_handle * info,const char * tagname,const char ** pp,const int * typenums,debug_method ** retp,const char * p_end)2638*fae548d3Szrj parse_stab_members (void *                dhandle,
2639*fae548d3Szrj 		    struct stab_handle *  info,
2640*fae548d3Szrj 		    const char *          tagname,
2641*fae548d3Szrj 		    const char **         pp,
2642*fae548d3Szrj 		    const int *           typenums,
2643*fae548d3Szrj 		    debug_method **       retp,
2644*fae548d3Szrj 		    const char *          p_end)
2645*fae548d3Szrj {
2646*fae548d3Szrj   const char *orig;
2647*fae548d3Szrj   debug_method *methods;
2648*fae548d3Szrj   unsigned int c;
2649*fae548d3Szrj   unsigned int alloc;
2650*fae548d3Szrj   char *name = NULL;
2651*fae548d3Szrj   debug_method_variant *variants = NULL;
2652*fae548d3Szrj   char *argtypes = NULL;
2653*fae548d3Szrj 
2654*fae548d3Szrj   *retp = NULL;
2655*fae548d3Szrj 
2656*fae548d3Szrj   orig = *pp;
2657*fae548d3Szrj   if (orig >= p_end)
2658*fae548d3Szrj     return FALSE;
2659*fae548d3Szrj 
2660*fae548d3Szrj   alloc = 0;
2661*fae548d3Szrj   methods = NULL;
2662*fae548d3Szrj   c = 0;
2663*fae548d3Szrj 
2664*fae548d3Szrj   while (**pp != ';')
2665*fae548d3Szrj     {
2666*fae548d3Szrj       const char *p;
2667*fae548d3Szrj       unsigned int cvars;
2668*fae548d3Szrj       unsigned int allocvars;
2669*fae548d3Szrj       debug_type look_ahead_type;
2670*fae548d3Szrj 
2671*fae548d3Szrj       p = strchr (*pp, ':');
2672*fae548d3Szrj       if (p == NULL || p[1] != ':')
2673*fae548d3Szrj 	break;
2674*fae548d3Szrj 
2675*fae548d3Szrj       /* FIXME: Some systems use something other than '$' here.  */
2676*fae548d3Szrj       if ((*pp)[0] != 'o' || (*pp)[1] != 'p' || (*pp)[2] != '$')
2677*fae548d3Szrj 	{
2678*fae548d3Szrj 	  name = savestring (*pp, p - *pp);
2679*fae548d3Szrj 	  *pp = p + 2;
2680*fae548d3Szrj 	}
2681*fae548d3Szrj       else
2682*fae548d3Szrj 	{
2683*fae548d3Szrj 	  /* This is a completely weird case.  In order to stuff in the
2684*fae548d3Szrj 	     names that might contain colons (the usual name delimiter),
2685*fae548d3Szrj 	     Mike Tiemann defined a different name format which is
2686*fae548d3Szrj 	     signalled if the identifier is "op$".  In that case, the
2687*fae548d3Szrj 	     format is "op$::XXXX." where XXXX is the name.  This is
2688*fae548d3Szrj 	     used for names like "+" or "=".  YUUUUUUUK!  FIXME!  */
2689*fae548d3Szrj 	  *pp = p + 2;
2690*fae548d3Szrj 	  for (p = *pp; *p != '.' && *p != '\0'; p++)
2691*fae548d3Szrj 	    ;
2692*fae548d3Szrj 	  if (*p != '.')
2693*fae548d3Szrj 	    {
2694*fae548d3Szrj 	      bad_stab (orig);
2695*fae548d3Szrj 	      goto fail;
2696*fae548d3Szrj 	    }
2697*fae548d3Szrj 	  name = savestring (*pp, p - *pp);
2698*fae548d3Szrj 	  *pp = p + 1;
2699*fae548d3Szrj 	}
2700*fae548d3Szrj 
2701*fae548d3Szrj       allocvars = 10;
2702*fae548d3Szrj       variants = ((debug_method_variant *)
2703*fae548d3Szrj 		  xmalloc (allocvars * sizeof *variants));
2704*fae548d3Szrj       cvars = 0;
2705*fae548d3Szrj 
2706*fae548d3Szrj       look_ahead_type = DEBUG_TYPE_NULL;
2707*fae548d3Szrj 
2708*fae548d3Szrj       do
2709*fae548d3Szrj 	{
2710*fae548d3Szrj 	  debug_type type;
2711*fae548d3Szrj 	  bfd_boolean stub;
2712*fae548d3Szrj 	  enum debug_visibility visibility;
2713*fae548d3Szrj 	  bfd_boolean constp, volatilep, staticp;
2714*fae548d3Szrj 	  bfd_vma voffset;
2715*fae548d3Szrj 	  debug_type context;
2716*fae548d3Szrj 	  const char *physname;
2717*fae548d3Szrj 	  bfd_boolean varargs;
2718*fae548d3Szrj 
2719*fae548d3Szrj 	  if (look_ahead_type != DEBUG_TYPE_NULL)
2720*fae548d3Szrj 	    {
2721*fae548d3Szrj 	      /* g++ version 1 kludge */
2722*fae548d3Szrj 	      type = look_ahead_type;
2723*fae548d3Szrj 	      look_ahead_type = DEBUG_TYPE_NULL;
2724*fae548d3Szrj 	    }
2725*fae548d3Szrj 	  else
2726*fae548d3Szrj 	    {
2727*fae548d3Szrj 	      type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
2728*fae548d3Szrj 				      (debug_type **) NULL, p_end);
2729*fae548d3Szrj 	      if (type == DEBUG_TYPE_NULL)
2730*fae548d3Szrj 		goto fail;
2731*fae548d3Szrj 
2732*fae548d3Szrj 	      if (**pp != ':')
2733*fae548d3Szrj 		{
2734*fae548d3Szrj 		  bad_stab (orig);
2735*fae548d3Szrj 		  goto fail;
2736*fae548d3Szrj 		}
2737*fae548d3Szrj 	    }
2738*fae548d3Szrj 
2739*fae548d3Szrj 	  ++*pp;
2740*fae548d3Szrj 	  p = strchr (*pp, ';');
2741*fae548d3Szrj 	  if (p == NULL)
2742*fae548d3Szrj 	    {
2743*fae548d3Szrj 	      bad_stab (orig);
2744*fae548d3Szrj 	      goto fail;
2745*fae548d3Szrj 	    }
2746*fae548d3Szrj 
2747*fae548d3Szrj 	  stub = FALSE;
2748*fae548d3Szrj 	  if (debug_get_type_kind (dhandle, type) == DEBUG_KIND_METHOD
2749*fae548d3Szrj 	      && debug_get_parameter_types (dhandle, type, &varargs) == NULL)
2750*fae548d3Szrj 	    stub = TRUE;
2751*fae548d3Szrj 
2752*fae548d3Szrj 	  argtypes = savestring (*pp, p - *pp);
2753*fae548d3Szrj 	  *pp = p + 1;
2754*fae548d3Szrj 
2755*fae548d3Szrj 	  switch (**pp)
2756*fae548d3Szrj 	    {
2757*fae548d3Szrj 	    case '0':
2758*fae548d3Szrj 	      visibility = DEBUG_VISIBILITY_PRIVATE;
2759*fae548d3Szrj 	      break;
2760*fae548d3Szrj 	    case '1':
2761*fae548d3Szrj 	      visibility = DEBUG_VISIBILITY_PROTECTED;
2762*fae548d3Szrj 	      break;
2763*fae548d3Szrj 	    case 0:
2764*fae548d3Szrj 	      bad_stab (orig);
2765*fae548d3Szrj 	      goto fail;
2766*fae548d3Szrj 	    default:
2767*fae548d3Szrj 	      visibility = DEBUG_VISIBILITY_PUBLIC;
2768*fae548d3Szrj 	      break;
2769*fae548d3Szrj 	    }
2770*fae548d3Szrj 	  ++*pp;
2771*fae548d3Szrj 
2772*fae548d3Szrj 	  constp = FALSE;
2773*fae548d3Szrj 	  volatilep = FALSE;
2774*fae548d3Szrj 	  switch (**pp)
2775*fae548d3Szrj 	    {
2776*fae548d3Szrj 	    case 'A':
2777*fae548d3Szrj 	      /* Normal function.  */
2778*fae548d3Szrj 	      ++*pp;
2779*fae548d3Szrj 	      break;
2780*fae548d3Szrj 	    case 'B':
2781*fae548d3Szrj 	      /* const member function.  */
2782*fae548d3Szrj 	      constp = TRUE;
2783*fae548d3Szrj 	      ++*pp;
2784*fae548d3Szrj 	      break;
2785*fae548d3Szrj 	    case 'C':
2786*fae548d3Szrj 	      /* volatile member function.  */
2787*fae548d3Szrj 	      volatilep = TRUE;
2788*fae548d3Szrj 	      ++*pp;
2789*fae548d3Szrj 	      break;
2790*fae548d3Szrj 	    case 'D':
2791*fae548d3Szrj 	      /* const volatile member function.  */
2792*fae548d3Szrj 	      constp = TRUE;
2793*fae548d3Szrj 	      volatilep = TRUE;
2794*fae548d3Szrj 	      ++*pp;
2795*fae548d3Szrj 	      break;
2796*fae548d3Szrj 	    case '*':
2797*fae548d3Szrj 	    case '?':
2798*fae548d3Szrj 	    case '.':
2799*fae548d3Szrj 	      /* File compiled with g++ version 1; no information.  */
2800*fae548d3Szrj 	      break;
2801*fae548d3Szrj 	    default:
2802*fae548d3Szrj 	      warn_stab (orig, _("const/volatile indicator missing"));
2803*fae548d3Szrj 	      break;
2804*fae548d3Szrj 	    }
2805*fae548d3Szrj 
2806*fae548d3Szrj 	  staticp = FALSE;
2807*fae548d3Szrj 	  switch (**pp)
2808*fae548d3Szrj 	    {
2809*fae548d3Szrj 	    case '*':
2810*fae548d3Szrj 	      /* virtual member function, followed by index.  The sign
2811*fae548d3Szrj 		 bit is supposedly set to distinguish
2812*fae548d3Szrj 		 pointers-to-methods from virtual function indices.  */
2813*fae548d3Szrj 	      ++*pp;
2814*fae548d3Szrj 	      voffset = parse_number (pp, (bfd_boolean *) NULL, p_end);
2815*fae548d3Szrj 	      if (**pp != ';')
2816*fae548d3Szrj 		{
2817*fae548d3Szrj 		  bad_stab (orig);
2818*fae548d3Szrj 		  goto fail;
2819*fae548d3Szrj 		}
2820*fae548d3Szrj 	      ++*pp;
2821*fae548d3Szrj 	      voffset &= 0x7fffffff;
2822*fae548d3Szrj 
2823*fae548d3Szrj 	      if (**pp == ';' || **pp == '\0')
2824*fae548d3Szrj 		{
2825*fae548d3Szrj 		  /* Must be g++ version 1.  */
2826*fae548d3Szrj 		  context = DEBUG_TYPE_NULL;
2827*fae548d3Szrj 		}
2828*fae548d3Szrj 	      else
2829*fae548d3Szrj 		{
2830*fae548d3Szrj 		  /* Figure out from whence this virtual function
2831*fae548d3Szrj 		     came.  It may belong to virtual function table of
2832*fae548d3Szrj 		     one of its baseclasses.  */
2833*fae548d3Szrj 		  look_ahead_type = parse_stab_type (dhandle, info,
2834*fae548d3Szrj 						     (const char *) NULL,
2835*fae548d3Szrj 						     pp,
2836*fae548d3Szrj 						     (debug_type **) NULL,
2837*fae548d3Szrj 						     p_end);
2838*fae548d3Szrj 		  if (**pp == ':')
2839*fae548d3Szrj 		    {
2840*fae548d3Szrj 		      /* g++ version 1 overloaded methods.  */
2841*fae548d3Szrj 		      context = DEBUG_TYPE_NULL;
2842*fae548d3Szrj 		    }
2843*fae548d3Szrj 		  else
2844*fae548d3Szrj 		    {
2845*fae548d3Szrj 		      context = look_ahead_type;
2846*fae548d3Szrj 		      look_ahead_type = DEBUG_TYPE_NULL;
2847*fae548d3Szrj 		      if (**pp != ';')
2848*fae548d3Szrj 			{
2849*fae548d3Szrj 			  bad_stab (orig);
2850*fae548d3Szrj 			  goto fail;
2851*fae548d3Szrj 			}
2852*fae548d3Szrj 		      ++*pp;
2853*fae548d3Szrj 		    }
2854*fae548d3Szrj 		}
2855*fae548d3Szrj 	      break;
2856*fae548d3Szrj 
2857*fae548d3Szrj 	    case '?':
2858*fae548d3Szrj 	      /* static member function.  */
2859*fae548d3Szrj 	      ++*pp;
2860*fae548d3Szrj 	      staticp = TRUE;
2861*fae548d3Szrj 	      voffset = 0;
2862*fae548d3Szrj 	      context = DEBUG_TYPE_NULL;
2863*fae548d3Szrj 	      if (strncmp (argtypes, name, strlen (name)) != 0)
2864*fae548d3Szrj 		stub = TRUE;
2865*fae548d3Szrj 	      break;
2866*fae548d3Szrj 
2867*fae548d3Szrj 	    default:
2868*fae548d3Szrj 	      warn_stab (orig, "member function type missing");
2869*fae548d3Szrj 	      voffset = 0;
2870*fae548d3Szrj 	      context = DEBUG_TYPE_NULL;
2871*fae548d3Szrj 	      break;
2872*fae548d3Szrj 
2873*fae548d3Szrj 	    case '.':
2874*fae548d3Szrj 	      ++*pp;
2875*fae548d3Szrj 	      voffset = 0;
2876*fae548d3Szrj 	      context = DEBUG_TYPE_NULL;
2877*fae548d3Szrj 	      break;
2878*fae548d3Szrj 	    }
2879*fae548d3Szrj 
2880*fae548d3Szrj 	  /* If the type is not a stub, then the argtypes string is
2881*fae548d3Szrj              the physical name of the function.  Otherwise the
2882*fae548d3Szrj              argtypes string is the mangled form of the argument
2883*fae548d3Szrj              types, and the full type and the physical name must be
2884*fae548d3Szrj              extracted from them.  */
2885*fae548d3Szrj 	  physname = argtypes;
2886*fae548d3Szrj 	  if (stub)
2887*fae548d3Szrj 	    {
2888*fae548d3Szrj 	      debug_type class_type, return_type;
2889*fae548d3Szrj 
2890*fae548d3Szrj 	      class_type = stab_find_type (dhandle, info, typenums);
2891*fae548d3Szrj 	      if (class_type == DEBUG_TYPE_NULL)
2892*fae548d3Szrj 		goto fail;
2893*fae548d3Szrj 	      return_type = debug_get_return_type (dhandle, type);
2894*fae548d3Szrj 	      if (return_type == DEBUG_TYPE_NULL)
2895*fae548d3Szrj 		{
2896*fae548d3Szrj 		  bad_stab (orig);
2897*fae548d3Szrj 		  goto fail;
2898*fae548d3Szrj 		}
2899*fae548d3Szrj 	      type = parse_stab_argtypes (dhandle, info, class_type, name,
2900*fae548d3Szrj 					  tagname, return_type, argtypes,
2901*fae548d3Szrj 					  constp, volatilep, &physname);
2902*fae548d3Szrj 	      if (type == DEBUG_TYPE_NULL)
2903*fae548d3Szrj 		goto fail;
2904*fae548d3Szrj 	    }
2905*fae548d3Szrj 
2906*fae548d3Szrj 	  if (cvars + 1 >= allocvars)
2907*fae548d3Szrj 	    {
2908*fae548d3Szrj 	      allocvars += 10;
2909*fae548d3Szrj 	      variants = ((debug_method_variant *)
2910*fae548d3Szrj 			  xrealloc (variants,
2911*fae548d3Szrj 				    allocvars * sizeof *variants));
2912*fae548d3Szrj 	    }
2913*fae548d3Szrj 
2914*fae548d3Szrj 	  if (! staticp)
2915*fae548d3Szrj 	    variants[cvars] = debug_make_method_variant (dhandle, physname,
2916*fae548d3Szrj 							 type, visibility,
2917*fae548d3Szrj 							 constp, volatilep,
2918*fae548d3Szrj 							 voffset, context);
2919*fae548d3Szrj 	  else
2920*fae548d3Szrj 	    variants[cvars] = debug_make_static_method_variant (dhandle,
2921*fae548d3Szrj 								physname,
2922*fae548d3Szrj 								type,
2923*fae548d3Szrj 								visibility,
2924*fae548d3Szrj 								constp,
2925*fae548d3Szrj 								volatilep);
2926*fae548d3Szrj 	  if (variants[cvars] == DEBUG_METHOD_VARIANT_NULL)
2927*fae548d3Szrj 	    goto fail;
2928*fae548d3Szrj 
2929*fae548d3Szrj 	  ++cvars;
2930*fae548d3Szrj 	}
2931*fae548d3Szrj       while (**pp != ';' && **pp != '\0');
2932*fae548d3Szrj 
2933*fae548d3Szrj       variants[cvars] = DEBUG_METHOD_VARIANT_NULL;
2934*fae548d3Szrj 
2935*fae548d3Szrj       if (**pp != '\0')
2936*fae548d3Szrj 	++*pp;
2937*fae548d3Szrj 
2938*fae548d3Szrj       if (c + 1 >= alloc)
2939*fae548d3Szrj 	{
2940*fae548d3Szrj 	  alloc += 10;
2941*fae548d3Szrj 	  methods = ((debug_method *)
2942*fae548d3Szrj 		     xrealloc (methods, alloc * sizeof *methods));
2943*fae548d3Szrj 	}
2944*fae548d3Szrj 
2945*fae548d3Szrj       methods[c] = debug_make_method (dhandle, name, variants);
2946*fae548d3Szrj 
2947*fae548d3Szrj       ++c;
2948*fae548d3Szrj     }
2949*fae548d3Szrj 
2950*fae548d3Szrj   if (methods != NULL)
2951*fae548d3Szrj     methods[c] = DEBUG_METHOD_NULL;
2952*fae548d3Szrj 
2953*fae548d3Szrj   *retp = methods;
2954*fae548d3Szrj 
2955*fae548d3Szrj   return TRUE;
2956*fae548d3Szrj 
2957*fae548d3Szrj  fail:
2958*fae548d3Szrj   if (name != NULL)
2959*fae548d3Szrj     free (name);
2960*fae548d3Szrj   if (variants != NULL)
2961*fae548d3Szrj     free (variants);
2962*fae548d3Szrj   if (argtypes != NULL)
2963*fae548d3Szrj     free (argtypes);
2964*fae548d3Szrj   return FALSE;
2965*fae548d3Szrj }
2966*fae548d3Szrj 
2967*fae548d3Szrj /* Parse a string representing argument types for a method.  Stabs
2968*fae548d3Szrj    tries to save space by packing argument types into a mangled
2969*fae548d3Szrj    string.  This string should give us enough information to extract
2970*fae548d3Szrj    both argument types and the physical name of the function, given
2971*fae548d3Szrj    the tag name.  */
2972*fae548d3Szrj 
2973*fae548d3Szrj static debug_type
parse_stab_argtypes(void * dhandle,struct stab_handle * info,debug_type class_type,const char * fieldname,const char * tagname,debug_type return_type,const char * argtypes,bfd_boolean constp,bfd_boolean volatilep,const char ** pphysname)2974*fae548d3Szrj parse_stab_argtypes (void *dhandle, struct stab_handle *info,
2975*fae548d3Szrj 		     debug_type class_type, const char *fieldname,
2976*fae548d3Szrj 		     const char *tagname, debug_type return_type,
2977*fae548d3Szrj 		     const char *argtypes, bfd_boolean constp,
2978*fae548d3Szrj 		     bfd_boolean volatilep, const char **pphysname)
2979*fae548d3Szrj {
2980*fae548d3Szrj   bfd_boolean is_full_physname_constructor;
2981*fae548d3Szrj   bfd_boolean is_constructor;
2982*fae548d3Szrj   bfd_boolean is_destructor;
2983*fae548d3Szrj   bfd_boolean is_v3;
2984*fae548d3Szrj   debug_type *args;
2985*fae548d3Szrj   bfd_boolean varargs;
2986*fae548d3Szrj   unsigned int physname_len = 0;
2987*fae548d3Szrj 
2988*fae548d3Szrj   /* Constructors are sometimes handled specially.  */
2989*fae548d3Szrj   is_full_physname_constructor = ((argtypes[0] == '_'
2990*fae548d3Szrj 				   && argtypes[1] == '_'
2991*fae548d3Szrj 				   && (ISDIGIT (argtypes[2])
2992*fae548d3Szrj 				       || argtypes[2] == 'Q'
2993*fae548d3Szrj 				       || argtypes[2] == 't'))
2994*fae548d3Szrj 				  || CONST_STRNEQ (argtypes, "__ct"));
2995*fae548d3Szrj 
2996*fae548d3Szrj   is_constructor = (is_full_physname_constructor
2997*fae548d3Szrj 		    || (tagname != NULL
2998*fae548d3Szrj 			&& strcmp (fieldname, tagname) == 0));
2999*fae548d3Szrj   is_destructor = ((argtypes[0] == '_'
3000*fae548d3Szrj 		    && (argtypes[1] == '$' || argtypes[1] == '.')
3001*fae548d3Szrj 		    && argtypes[2] == '_')
3002*fae548d3Szrj 		   || CONST_STRNEQ (argtypes, "__dt"));
3003*fae548d3Szrj   is_v3 = argtypes[0] == '_' && argtypes[1] == 'Z';
3004*fae548d3Szrj 
3005*fae548d3Szrj   if (!(is_destructor || is_full_physname_constructor || is_v3))
3006*fae548d3Szrj     {
3007*fae548d3Szrj       unsigned int len;
3008*fae548d3Szrj       const char *const_prefix;
3009*fae548d3Szrj       const char *volatile_prefix;
3010*fae548d3Szrj       char buf[20];
3011*fae548d3Szrj       unsigned int mangled_name_len;
3012*fae548d3Szrj       char *physname;
3013*fae548d3Szrj 
3014*fae548d3Szrj       len = tagname == NULL ? 0 : strlen (tagname);
3015*fae548d3Szrj       const_prefix = constp ? "C" : "";
3016*fae548d3Szrj       volatile_prefix = volatilep ? "V" : "";
3017*fae548d3Szrj 
3018*fae548d3Szrj       if (len == 0)
3019*fae548d3Szrj 	sprintf (buf, "__%s%s", const_prefix, volatile_prefix);
3020*fae548d3Szrj       else if (tagname != NULL && strchr (tagname, '<') != NULL)
3021*fae548d3Szrj 	{
3022*fae548d3Szrj 	  /* Template methods are fully mangled.  */
3023*fae548d3Szrj 	  sprintf (buf, "__%s%s", const_prefix, volatile_prefix);
3024*fae548d3Szrj 	  tagname = NULL;
3025*fae548d3Szrj 	  len = 0;
3026*fae548d3Szrj 	}
3027*fae548d3Szrj       else
3028*fae548d3Szrj 	sprintf (buf, "__%s%s%d", const_prefix, volatile_prefix, len);
3029*fae548d3Szrj 
3030*fae548d3Szrj       mangled_name_len = ((is_constructor ? 0 : strlen (fieldname))
3031*fae548d3Szrj 			  + strlen (buf)
3032*fae548d3Szrj 			  + len
3033*fae548d3Szrj 			  + strlen (argtypes)
3034*fae548d3Szrj 			  + 1);
3035*fae548d3Szrj 
3036*fae548d3Szrj       if (fieldname[0] == 'o'
3037*fae548d3Szrj 	  && fieldname[1] == 'p'
3038*fae548d3Szrj 	  && (fieldname[2] == '$' || fieldname[2] == '.'))
3039*fae548d3Szrj 	{
3040*fae548d3Szrj 	  /* Opname selection is no longer supported by libiberty's demangler.  */
3041*fae548d3Szrj 	  return DEBUG_TYPE_NULL;
3042*fae548d3Szrj 	}
3043*fae548d3Szrj 
3044*fae548d3Szrj       physname = (char *) xmalloc (mangled_name_len);
3045*fae548d3Szrj       if (is_constructor)
3046*fae548d3Szrj 	physname[0] = '\0';
3047*fae548d3Szrj       else
3048*fae548d3Szrj 	strcpy (physname, fieldname);
3049*fae548d3Szrj 
3050*fae548d3Szrj       physname_len = strlen (physname);
3051*fae548d3Szrj       strcat (physname, buf);
3052*fae548d3Szrj       if (tagname != NULL)
3053*fae548d3Szrj 	strcat (physname, tagname);
3054*fae548d3Szrj       strcat (physname, argtypes);
3055*fae548d3Szrj 
3056*fae548d3Szrj       *pphysname = physname;
3057*fae548d3Szrj     }
3058*fae548d3Szrj 
3059*fae548d3Szrj   if (*argtypes == '\0' || is_destructor)
3060*fae548d3Szrj     {
3061*fae548d3Szrj       args = (debug_type *) xmalloc (sizeof *args);
3062*fae548d3Szrj       *args = NULL;
3063*fae548d3Szrj       return debug_make_method_type (dhandle, return_type, class_type, args,
3064*fae548d3Szrj 				     FALSE);
3065*fae548d3Szrj     }
3066*fae548d3Szrj 
3067*fae548d3Szrj   args = stab_demangle_argtypes (dhandle, info, *pphysname, &varargs, physname_len);
3068*fae548d3Szrj   if (args == NULL)
3069*fae548d3Szrj     return DEBUG_TYPE_NULL;
3070*fae548d3Szrj 
3071*fae548d3Szrj   return debug_make_method_type (dhandle, return_type, class_type, args,
3072*fae548d3Szrj 				 varargs);
3073*fae548d3Szrj }
3074*fae548d3Szrj 
3075*fae548d3Szrj /* The tail end of stabs for C++ classes that contain a virtual function
3076*fae548d3Szrj    pointer contains a tilde, a %, and a type number.
3077*fae548d3Szrj    The type number refers to the base class (possibly this class itself) which
3078*fae548d3Szrj    contains the vtable pointer for the current class.
3079*fae548d3Szrj 
3080*fae548d3Szrj    This function is called when we have parsed all the method declarations,
3081*fae548d3Szrj    so we can look for the vptr base class info.  */
3082*fae548d3Szrj 
3083*fae548d3Szrj static bfd_boolean
parse_stab_tilde_field(void * dhandle,struct stab_handle * info,const char ** pp,const int * typenums,debug_type * retvptrbase,bfd_boolean * retownvptr,const char * p_end)3084*fae548d3Szrj parse_stab_tilde_field (void *                dhandle,
3085*fae548d3Szrj 			struct stab_handle *  info,
3086*fae548d3Szrj 			const char **         pp,
3087*fae548d3Szrj 			const int *           typenums,
3088*fae548d3Szrj 			debug_type *          retvptrbase,
3089*fae548d3Szrj 			bfd_boolean *         retownvptr,
3090*fae548d3Szrj 			const char *          p_end)
3091*fae548d3Szrj {
3092*fae548d3Szrj   const char *orig;
3093*fae548d3Szrj   const char *hold;
3094*fae548d3Szrj   int vtypenums[2];
3095*fae548d3Szrj 
3096*fae548d3Szrj   *retvptrbase = DEBUG_TYPE_NULL;
3097*fae548d3Szrj   *retownvptr = FALSE;
3098*fae548d3Szrj 
3099*fae548d3Szrj   orig = *pp;
3100*fae548d3Szrj   if (orig >= p_end)
3101*fae548d3Szrj     return FALSE;
3102*fae548d3Szrj 
3103*fae548d3Szrj   /* If we are positioned at a ';', then skip it.  */
3104*fae548d3Szrj   if (**pp == ';')
3105*fae548d3Szrj     ++*pp;
3106*fae548d3Szrj 
3107*fae548d3Szrj   if (**pp != '~')
3108*fae548d3Szrj     return TRUE;
3109*fae548d3Szrj   ++*pp;
3110*fae548d3Szrj 
3111*fae548d3Szrj   if (**pp == '=' || **pp == '+' || **pp == '-')
3112*fae548d3Szrj     {
3113*fae548d3Szrj       /* Obsolete flags that used to indicate the presence of
3114*fae548d3Szrj 	 constructors and/or destructors.  */
3115*fae548d3Szrj       ++*pp;
3116*fae548d3Szrj     }
3117*fae548d3Szrj 
3118*fae548d3Szrj   if (**pp != '%')
3119*fae548d3Szrj     return TRUE;
3120*fae548d3Szrj   ++*pp;
3121*fae548d3Szrj 
3122*fae548d3Szrj   hold = *pp;
3123*fae548d3Szrj 
3124*fae548d3Szrj   /* The next number is the type number of the base class (possibly
3125*fae548d3Szrj      our own class) which supplies the vtable for this class.  */
3126*fae548d3Szrj   if (! parse_stab_type_number (pp, vtypenums, p_end))
3127*fae548d3Szrj     return FALSE;
3128*fae548d3Szrj 
3129*fae548d3Szrj   if (vtypenums[0] == typenums[0]
3130*fae548d3Szrj       && vtypenums[1] == typenums[1])
3131*fae548d3Szrj     *retownvptr = TRUE;
3132*fae548d3Szrj   else
3133*fae548d3Szrj     {
3134*fae548d3Szrj       debug_type vtype;
3135*fae548d3Szrj       const char *p;
3136*fae548d3Szrj 
3137*fae548d3Szrj       *pp = hold;
3138*fae548d3Szrj 
3139*fae548d3Szrj       vtype = parse_stab_type (dhandle, info, (const char *) NULL, pp,
3140*fae548d3Szrj 			       (debug_type **) NULL, p_end);
3141*fae548d3Szrj       for (p = *pp; *p != ';' && *p != '\0'; p++)
3142*fae548d3Szrj 	;
3143*fae548d3Szrj       if (*p != ';')
3144*fae548d3Szrj 	{
3145*fae548d3Szrj 	  bad_stab (orig);
3146*fae548d3Szrj 	  return FALSE;
3147*fae548d3Szrj 	}
3148*fae548d3Szrj 
3149*fae548d3Szrj       *retvptrbase = vtype;
3150*fae548d3Szrj 
3151*fae548d3Szrj       *pp = p + 1;
3152*fae548d3Szrj     }
3153*fae548d3Szrj 
3154*fae548d3Szrj   return TRUE;
3155*fae548d3Szrj }
3156*fae548d3Szrj 
3157*fae548d3Szrj /* Read a definition of an array type.  */
3158*fae548d3Szrj 
3159*fae548d3Szrj static debug_type
parse_stab_array_type(void * dhandle,struct stab_handle * info,const char ** pp,bfd_boolean stringp,const char * p_end)3160*fae548d3Szrj parse_stab_array_type (void *                dhandle,
3161*fae548d3Szrj 		       struct stab_handle *  info,
3162*fae548d3Szrj 		       const char **         pp,
3163*fae548d3Szrj 		       bfd_boolean           stringp,
3164*fae548d3Szrj 		       const char *          p_end)
3165*fae548d3Szrj {
3166*fae548d3Szrj   const char *orig;
3167*fae548d3Szrj   const char *p;
3168*fae548d3Szrj   int typenums[2];
3169*fae548d3Szrj   debug_type index_type;
3170*fae548d3Szrj   bfd_boolean adjustable;
3171*fae548d3Szrj   bfd_signed_vma lower, upper;
3172*fae548d3Szrj   debug_type element_type;
3173*fae548d3Szrj 
3174*fae548d3Szrj   /* Format of an array type:
3175*fae548d3Szrj      "ar<index type>;lower;upper;<array_contents_type>".
3176*fae548d3Szrj      OS9000: "arlower,upper;<array_contents_type>".
3177*fae548d3Szrj 
3178*fae548d3Szrj      Fortran adjustable arrays use Adigits or Tdigits for lower or upper;
3179*fae548d3Szrj      for these, produce a type like float[][].  */
3180*fae548d3Szrj 
3181*fae548d3Szrj   orig = *pp;
3182*fae548d3Szrj   if (orig >= p_end)
3183*fae548d3Szrj     return DEBUG_TYPE_NULL;
3184*fae548d3Szrj 
3185*fae548d3Szrj   /* FIXME: gdb checks os9k_stabs here.  */
3186*fae548d3Szrj 
3187*fae548d3Szrj   /* If the index type is type 0, we take it as int.  */
3188*fae548d3Szrj   p = *pp;
3189*fae548d3Szrj   if (! parse_stab_type_number (&p, typenums, p_end))
3190*fae548d3Szrj     return DEBUG_TYPE_NULL;
3191*fae548d3Szrj 
3192*fae548d3Szrj   if (typenums[0] == 0 && typenums[1] == 0 && **pp != '=')
3193*fae548d3Szrj     {
3194*fae548d3Szrj       index_type = debug_find_named_type (dhandle, "int");
3195*fae548d3Szrj       if (index_type == DEBUG_TYPE_NULL)
3196*fae548d3Szrj 	{
3197*fae548d3Szrj 	  index_type = debug_make_int_type (dhandle, 4, FALSE);
3198*fae548d3Szrj 	  if (index_type == DEBUG_TYPE_NULL)
3199*fae548d3Szrj 	    return DEBUG_TYPE_NULL;
3200*fae548d3Szrj 	}
3201*fae548d3Szrj       *pp = p;
3202*fae548d3Szrj     }
3203*fae548d3Szrj   else
3204*fae548d3Szrj     {
3205*fae548d3Szrj       index_type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
3206*fae548d3Szrj 				    (debug_type **) NULL, p_end);
3207*fae548d3Szrj     }
3208*fae548d3Szrj 
3209*fae548d3Szrj   if (**pp != ';')
3210*fae548d3Szrj     {
3211*fae548d3Szrj       bad_stab (orig);
3212*fae548d3Szrj       return DEBUG_TYPE_NULL;
3213*fae548d3Szrj     }
3214*fae548d3Szrj   ++*pp;
3215*fae548d3Szrj 
3216*fae548d3Szrj   adjustable = FALSE;
3217*fae548d3Szrj 
3218*fae548d3Szrj   if (! ISDIGIT (**pp) && **pp != '-' && **pp != 0)
3219*fae548d3Szrj     {
3220*fae548d3Szrj       ++*pp;
3221*fae548d3Szrj       adjustable = TRUE;
3222*fae548d3Szrj     }
3223*fae548d3Szrj 
3224*fae548d3Szrj   lower = (bfd_signed_vma) parse_number (pp, (bfd_boolean *) NULL, p_end);
3225*fae548d3Szrj   if (**pp != ';')
3226*fae548d3Szrj     {
3227*fae548d3Szrj       bad_stab (orig);
3228*fae548d3Szrj       return DEBUG_TYPE_NULL;
3229*fae548d3Szrj     }
3230*fae548d3Szrj   ++*pp;
3231*fae548d3Szrj 
3232*fae548d3Szrj   if (! ISDIGIT (**pp) && **pp != '-' && **pp != 0)
3233*fae548d3Szrj     {
3234*fae548d3Szrj       ++*pp;
3235*fae548d3Szrj       adjustable = TRUE;
3236*fae548d3Szrj     }
3237*fae548d3Szrj 
3238*fae548d3Szrj   upper = (bfd_signed_vma) parse_number (pp, (bfd_boolean *) NULL, p_end);
3239*fae548d3Szrj   if (**pp != ';')
3240*fae548d3Szrj     {
3241*fae548d3Szrj       bad_stab (orig);
3242*fae548d3Szrj       return DEBUG_TYPE_NULL;
3243*fae548d3Szrj     }
3244*fae548d3Szrj   ++*pp;
3245*fae548d3Szrj 
3246*fae548d3Szrj   element_type = parse_stab_type (dhandle, info, (const char *) NULL, pp,
3247*fae548d3Szrj 				  (debug_type **) NULL, p_end);
3248*fae548d3Szrj   if (element_type == DEBUG_TYPE_NULL)
3249*fae548d3Szrj     return DEBUG_TYPE_NULL;
3250*fae548d3Szrj 
3251*fae548d3Szrj   if (adjustable)
3252*fae548d3Szrj     {
3253*fae548d3Szrj       lower = 0;
3254*fae548d3Szrj       upper = -1;
3255*fae548d3Szrj     }
3256*fae548d3Szrj 
3257*fae548d3Szrj   return debug_make_array_type (dhandle, element_type, index_type, lower,
3258*fae548d3Szrj 				upper, stringp);
3259*fae548d3Szrj }
3260*fae548d3Szrj 
3261*fae548d3Szrj /* This struct holds information about files we have seen using
3262*fae548d3Szrj    N_BINCL.  */
3263*fae548d3Szrj 
3264*fae548d3Szrj struct bincl_file
3265*fae548d3Szrj {
3266*fae548d3Szrj   /* The next N_BINCL file.  */
3267*fae548d3Szrj   struct bincl_file *next;
3268*fae548d3Szrj   /* The next N_BINCL on the stack.  */
3269*fae548d3Szrj   struct bincl_file *next_stack;
3270*fae548d3Szrj   /* The file name.  */
3271*fae548d3Szrj   const char *name;
3272*fae548d3Szrj   /* The hash value.  */
3273*fae548d3Szrj   bfd_vma hash;
3274*fae548d3Szrj   /* The file index.  */
3275*fae548d3Szrj   unsigned int file;
3276*fae548d3Szrj   /* The list of types defined in this file.  */
3277*fae548d3Szrj   struct stab_types *file_types;
3278*fae548d3Szrj };
3279*fae548d3Szrj 
3280*fae548d3Szrj /* Start a new N_BINCL file, pushing it onto the stack.  */
3281*fae548d3Szrj 
3282*fae548d3Szrj static void
push_bincl(struct stab_handle * info,const char * name,bfd_vma hash)3283*fae548d3Szrj push_bincl (struct stab_handle *info, const char *name, bfd_vma hash)
3284*fae548d3Szrj {
3285*fae548d3Szrj   struct bincl_file *n;
3286*fae548d3Szrj 
3287*fae548d3Szrj   n = (struct bincl_file *) xmalloc (sizeof *n);
3288*fae548d3Szrj   n->next = info->bincl_list;
3289*fae548d3Szrj   n->next_stack = info->bincl_stack;
3290*fae548d3Szrj   n->name = name;
3291*fae548d3Szrj   n->hash = hash;
3292*fae548d3Szrj   n->file = info->files;
3293*fae548d3Szrj   n->file_types = NULL;
3294*fae548d3Szrj   info->bincl_list = n;
3295*fae548d3Szrj   info->bincl_stack = n;
3296*fae548d3Szrj 
3297*fae548d3Szrj   ++info->files;
3298*fae548d3Szrj   info->file_types = ((struct stab_types **)
3299*fae548d3Szrj 		      xrealloc (info->file_types,
3300*fae548d3Szrj 				(info->files
3301*fae548d3Szrj 				 * sizeof *info->file_types)));
3302*fae548d3Szrj   info->file_types[n->file] = NULL;
3303*fae548d3Szrj }
3304*fae548d3Szrj 
3305*fae548d3Szrj /* Finish an N_BINCL file, at an N_EINCL, popping the name off the
3306*fae548d3Szrj    stack.  */
3307*fae548d3Szrj 
3308*fae548d3Szrj static const char *
pop_bincl(struct stab_handle * info)3309*fae548d3Szrj pop_bincl (struct stab_handle *info)
3310*fae548d3Szrj {
3311*fae548d3Szrj   struct bincl_file *o;
3312*fae548d3Szrj 
3313*fae548d3Szrj   o = info->bincl_stack;
3314*fae548d3Szrj   if (o == NULL)
3315*fae548d3Szrj     return info->main_filename;
3316*fae548d3Szrj   info->bincl_stack = o->next_stack;
3317*fae548d3Szrj 
3318*fae548d3Szrj   if (o->file >= info->files)
3319*fae548d3Szrj     return info->main_filename;
3320*fae548d3Szrj 
3321*fae548d3Szrj   o->file_types = info->file_types[o->file];
3322*fae548d3Szrj 
3323*fae548d3Szrj   if (info->bincl_stack == NULL)
3324*fae548d3Szrj     return info->main_filename;
3325*fae548d3Szrj   return info->bincl_stack->name;
3326*fae548d3Szrj }
3327*fae548d3Szrj 
3328*fae548d3Szrj /* Handle an N_EXCL: get the types from the corresponding N_BINCL.  */
3329*fae548d3Szrj 
3330*fae548d3Szrj static bfd_boolean
find_excl(struct stab_handle * info,const char * name,bfd_vma hash)3331*fae548d3Szrj find_excl (struct stab_handle *info, const char *name, bfd_vma hash)
3332*fae548d3Szrj {
3333*fae548d3Szrj   struct bincl_file *l;
3334*fae548d3Szrj 
3335*fae548d3Szrj   ++info->files;
3336*fae548d3Szrj   info->file_types = ((struct stab_types **)
3337*fae548d3Szrj 		      xrealloc (info->file_types,
3338*fae548d3Szrj 				(info->files
3339*fae548d3Szrj 				 * sizeof *info->file_types)));
3340*fae548d3Szrj 
3341*fae548d3Szrj   for (l = info->bincl_list; l != NULL; l = l->next)
3342*fae548d3Szrj     if (l->hash == hash && strcmp (l->name, name) == 0)
3343*fae548d3Szrj       break;
3344*fae548d3Szrj   if (l == NULL)
3345*fae548d3Szrj     {
3346*fae548d3Szrj       warn_stab (name, _("Undefined N_EXCL"));
3347*fae548d3Szrj       info->file_types[info->files - 1] = NULL;
3348*fae548d3Szrj       return TRUE;
3349*fae548d3Szrj     }
3350*fae548d3Szrj 
3351*fae548d3Szrj   info->file_types[info->files - 1] = l->file_types;
3352*fae548d3Szrj 
3353*fae548d3Szrj   return TRUE;
3354*fae548d3Szrj }
3355*fae548d3Szrj 
3356*fae548d3Szrj /* Handle a variable definition.  gcc emits variable definitions for a
3357*fae548d3Szrj    block before the N_LBRAC, so we must hold onto them until we see
3358*fae548d3Szrj    it.  The SunPRO compiler emits variable definitions after the
3359*fae548d3Szrj    N_LBRAC, so we can call debug_record_variable immediately.  */
3360*fae548d3Szrj 
3361*fae548d3Szrj static bfd_boolean
stab_record_variable(void * dhandle,struct stab_handle * info,const char * name,debug_type type,enum debug_var_kind kind,bfd_vma val)3362*fae548d3Szrj stab_record_variable (void *dhandle, struct stab_handle *info,
3363*fae548d3Szrj 		      const char *name, debug_type type,
3364*fae548d3Szrj 		      enum debug_var_kind kind, bfd_vma val)
3365*fae548d3Szrj {
3366*fae548d3Szrj   struct stab_pending_var *v;
3367*fae548d3Szrj 
3368*fae548d3Szrj   if ((kind == DEBUG_GLOBAL || kind == DEBUG_STATIC)
3369*fae548d3Szrj       || ! info->within_function
3370*fae548d3Szrj       || (info->gcc_compiled == 0 && info->n_opt_found))
3371*fae548d3Szrj     return debug_record_variable (dhandle, name, type, kind, val);
3372*fae548d3Szrj 
3373*fae548d3Szrj   v = (struct stab_pending_var *) xmalloc (sizeof *v);
3374*fae548d3Szrj   memset (v, 0, sizeof *v);
3375*fae548d3Szrj 
3376*fae548d3Szrj   v->next = info->pending;
3377*fae548d3Szrj   v->name = name;
3378*fae548d3Szrj   v->type = type;
3379*fae548d3Szrj   v->kind = kind;
3380*fae548d3Szrj   v->val = val;
3381*fae548d3Szrj   info->pending = v;
3382*fae548d3Szrj 
3383*fae548d3Szrj   return TRUE;
3384*fae548d3Szrj }
3385*fae548d3Szrj 
3386*fae548d3Szrj /* Emit pending variable definitions.  This is called after we see the
3387*fae548d3Szrj    N_LBRAC that starts the block.  */
3388*fae548d3Szrj 
3389*fae548d3Szrj static bfd_boolean
stab_emit_pending_vars(void * dhandle,struct stab_handle * info)3390*fae548d3Szrj stab_emit_pending_vars (void *dhandle, struct stab_handle *info)
3391*fae548d3Szrj {
3392*fae548d3Szrj   struct stab_pending_var *v;
3393*fae548d3Szrj 
3394*fae548d3Szrj   v = info->pending;
3395*fae548d3Szrj   while (v != NULL)
3396*fae548d3Szrj     {
3397*fae548d3Szrj       struct stab_pending_var *next;
3398*fae548d3Szrj 
3399*fae548d3Szrj       if (! debug_record_variable (dhandle, v->name, v->type, v->kind, v->val))
3400*fae548d3Szrj 	return FALSE;
3401*fae548d3Szrj 
3402*fae548d3Szrj       next = v->next;
3403*fae548d3Szrj       free (v);
3404*fae548d3Szrj       v = next;
3405*fae548d3Szrj     }
3406*fae548d3Szrj 
3407*fae548d3Szrj   info->pending = NULL;
3408*fae548d3Szrj 
3409*fae548d3Szrj   return TRUE;
3410*fae548d3Szrj }
3411*fae548d3Szrj 
3412*fae548d3Szrj /* Find the slot for a type in the database.  */
3413*fae548d3Szrj 
3414*fae548d3Szrj static debug_type *
stab_find_slot(struct stab_handle * info,const int * typenums)3415*fae548d3Szrj stab_find_slot (struct stab_handle *info, const int *typenums)
3416*fae548d3Szrj {
3417*fae548d3Szrj   int filenum;
3418*fae548d3Szrj   int tindex;
3419*fae548d3Szrj   struct stab_types **ps;
3420*fae548d3Szrj 
3421*fae548d3Szrj   filenum = typenums[0];
3422*fae548d3Szrj   tindex = typenums[1];
3423*fae548d3Szrj 
3424*fae548d3Szrj   if (filenum < 0 || (unsigned int) filenum >= info->files)
3425*fae548d3Szrj     {
3426*fae548d3Szrj       fprintf (stderr, _("Type file number %d out of range\n"), filenum);
3427*fae548d3Szrj       return NULL;
3428*fae548d3Szrj     }
3429*fae548d3Szrj   if (tindex < 0)
3430*fae548d3Szrj     {
3431*fae548d3Szrj       fprintf (stderr, _("Type index number %d out of range\n"), tindex);
3432*fae548d3Szrj       return NULL;
3433*fae548d3Szrj     }
3434*fae548d3Szrj 
3435*fae548d3Szrj   ps = info->file_types + filenum;
3436*fae548d3Szrj 
3437*fae548d3Szrj   while (tindex >= STAB_TYPES_SLOTS)
3438*fae548d3Szrj     {
3439*fae548d3Szrj       if (*ps == NULL)
3440*fae548d3Szrj 	{
3441*fae548d3Szrj 	  *ps = (struct stab_types *) xmalloc (sizeof **ps);
3442*fae548d3Szrj 	  memset (*ps, 0, sizeof **ps);
3443*fae548d3Szrj 	}
3444*fae548d3Szrj       ps = &(*ps)->next;
3445*fae548d3Szrj       tindex -= STAB_TYPES_SLOTS;
3446*fae548d3Szrj     }
3447*fae548d3Szrj   if (*ps == NULL)
3448*fae548d3Szrj     {
3449*fae548d3Szrj       *ps = (struct stab_types *) xmalloc (sizeof **ps);
3450*fae548d3Szrj       memset (*ps, 0, sizeof **ps);
3451*fae548d3Szrj     }
3452*fae548d3Szrj 
3453*fae548d3Szrj   return (*ps)->types + tindex;
3454*fae548d3Szrj }
3455*fae548d3Szrj 
3456*fae548d3Szrj /* Find a type given a type number.  If the type has not been
3457*fae548d3Szrj    allocated yet, create an indirect type.  */
3458*fae548d3Szrj 
3459*fae548d3Szrj static debug_type
stab_find_type(void * dhandle,struct stab_handle * info,const int * typenums)3460*fae548d3Szrj stab_find_type (void *dhandle, struct stab_handle *info, const int *typenums)
3461*fae548d3Szrj {
3462*fae548d3Szrj   debug_type *slot;
3463*fae548d3Szrj 
3464*fae548d3Szrj   if (typenums[0] == 0 && typenums[1] < 0)
3465*fae548d3Szrj     {
3466*fae548d3Szrj       /* A negative type number indicates an XCOFF builtin type.  */
3467*fae548d3Szrj       return stab_xcoff_builtin_type (dhandle, info, typenums[1]);
3468*fae548d3Szrj     }
3469*fae548d3Szrj 
3470*fae548d3Szrj   slot = stab_find_slot (info, typenums);
3471*fae548d3Szrj   if (slot == NULL)
3472*fae548d3Szrj     return DEBUG_TYPE_NULL;
3473*fae548d3Szrj 
3474*fae548d3Szrj   if (*slot == DEBUG_TYPE_NULL)
3475*fae548d3Szrj     return debug_make_indirect_type (dhandle, slot, (const char *) NULL);
3476*fae548d3Szrj 
3477*fae548d3Szrj   return *slot;
3478*fae548d3Szrj }
3479*fae548d3Szrj 
3480*fae548d3Szrj /* Record that a given type number refers to a given type.  */
3481*fae548d3Szrj 
3482*fae548d3Szrj static bfd_boolean
stab_record_type(void * dhandle ATTRIBUTE_UNUSED,struct stab_handle * info,const int * typenums,debug_type type)3483*fae548d3Szrj stab_record_type (void *dhandle ATTRIBUTE_UNUSED, struct stab_handle *info,
3484*fae548d3Szrj 		  const int *typenums, debug_type type)
3485*fae548d3Szrj {
3486*fae548d3Szrj   debug_type *slot;
3487*fae548d3Szrj 
3488*fae548d3Szrj   slot = stab_find_slot (info, typenums);
3489*fae548d3Szrj   if (slot == NULL)
3490*fae548d3Szrj     return FALSE;
3491*fae548d3Szrj 
3492*fae548d3Szrj   /* gdb appears to ignore type redefinitions, so we do as well.  */
3493*fae548d3Szrj 
3494*fae548d3Szrj   *slot = type;
3495*fae548d3Szrj 
3496*fae548d3Szrj   return TRUE;
3497*fae548d3Szrj }
3498*fae548d3Szrj 
3499*fae548d3Szrj /* Return an XCOFF builtin type.  */
3500*fae548d3Szrj 
3501*fae548d3Szrj static debug_type
stab_xcoff_builtin_type(void * dhandle,struct stab_handle * info,int typenum)3502*fae548d3Szrj stab_xcoff_builtin_type (void *dhandle, struct stab_handle *info,
3503*fae548d3Szrj 			 int typenum)
3504*fae548d3Szrj {
3505*fae548d3Szrj   debug_type rettype;
3506*fae548d3Szrj   const char *name;
3507*fae548d3Szrj 
3508*fae548d3Szrj   if (typenum >= 0 || typenum < -XCOFF_TYPE_COUNT)
3509*fae548d3Szrj     {
3510*fae548d3Szrj       fprintf (stderr, _("Unrecognized XCOFF type %d\n"), typenum);
3511*fae548d3Szrj       return DEBUG_TYPE_NULL;
3512*fae548d3Szrj     }
3513*fae548d3Szrj   if (info->xcoff_types[-typenum] != NULL)
3514*fae548d3Szrj     return info->xcoff_types[-typenum];
3515*fae548d3Szrj 
3516*fae548d3Szrj   switch (-typenum)
3517*fae548d3Szrj     {
3518*fae548d3Szrj     case 1:
3519*fae548d3Szrj       /* The size of this and all the other types are fixed, defined
3520*fae548d3Szrj 	 by the debugging format.  */
3521*fae548d3Szrj       name = "int";
3522*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 4, FALSE);
3523*fae548d3Szrj       break;
3524*fae548d3Szrj     case 2:
3525*fae548d3Szrj       name = "char";
3526*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 1, FALSE);
3527*fae548d3Szrj       break;
3528*fae548d3Szrj     case 3:
3529*fae548d3Szrj       name = "short";
3530*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 2, FALSE);
3531*fae548d3Szrj       break;
3532*fae548d3Szrj     case 4:
3533*fae548d3Szrj       name = "long";
3534*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 4, FALSE);
3535*fae548d3Szrj       break;
3536*fae548d3Szrj     case 5:
3537*fae548d3Szrj       name = "unsigned char";
3538*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 1, TRUE);
3539*fae548d3Szrj       break;
3540*fae548d3Szrj     case 6:
3541*fae548d3Szrj       name = "signed char";
3542*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 1, FALSE);
3543*fae548d3Szrj       break;
3544*fae548d3Szrj     case 7:
3545*fae548d3Szrj       name = "unsigned short";
3546*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 2, TRUE);
3547*fae548d3Szrj       break;
3548*fae548d3Szrj     case 8:
3549*fae548d3Szrj       name = "unsigned int";
3550*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 4, TRUE);
3551*fae548d3Szrj       break;
3552*fae548d3Szrj     case 9:
3553*fae548d3Szrj       name = "unsigned";
3554*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 4, TRUE);
3555*fae548d3Szrj       break;
3556*fae548d3Szrj     case 10:
3557*fae548d3Szrj       name = "unsigned long";
3558*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 4, TRUE);
3559*fae548d3Szrj       break;
3560*fae548d3Szrj     case 11:
3561*fae548d3Szrj       name = "void";
3562*fae548d3Szrj       rettype = debug_make_void_type (dhandle);
3563*fae548d3Szrj       break;
3564*fae548d3Szrj     case 12:
3565*fae548d3Szrj       /* IEEE single precision (32 bit).  */
3566*fae548d3Szrj       name = "float";
3567*fae548d3Szrj       rettype = debug_make_float_type (dhandle, 4);
3568*fae548d3Szrj       break;
3569*fae548d3Szrj     case 13:
3570*fae548d3Szrj       /* IEEE double precision (64 bit).  */
3571*fae548d3Szrj       name = "double";
3572*fae548d3Szrj       rettype = debug_make_float_type (dhandle, 8);
3573*fae548d3Szrj       break;
3574*fae548d3Szrj     case 14:
3575*fae548d3Szrj       /* This is an IEEE double on the RS/6000, and different machines
3576*fae548d3Szrj 	 with different sizes for "long double" should use different
3577*fae548d3Szrj 	 negative type numbers.  See stabs.texinfo.  */
3578*fae548d3Szrj       name = "long double";
3579*fae548d3Szrj       rettype = debug_make_float_type (dhandle, 8);
3580*fae548d3Szrj       break;
3581*fae548d3Szrj     case 15:
3582*fae548d3Szrj       name = "integer";
3583*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 4, FALSE);
3584*fae548d3Szrj       break;
3585*fae548d3Szrj     case 16:
3586*fae548d3Szrj       name = "boolean";
3587*fae548d3Szrj       rettype = debug_make_bool_type (dhandle, 4);
3588*fae548d3Szrj       break;
3589*fae548d3Szrj     case 17:
3590*fae548d3Szrj       name = "short real";
3591*fae548d3Szrj       rettype = debug_make_float_type (dhandle, 4);
3592*fae548d3Szrj       break;
3593*fae548d3Szrj     case 18:
3594*fae548d3Szrj       name = "real";
3595*fae548d3Szrj       rettype = debug_make_float_type (dhandle, 8);
3596*fae548d3Szrj       break;
3597*fae548d3Szrj     case 19:
3598*fae548d3Szrj       /* FIXME */
3599*fae548d3Szrj       name = "stringptr";
3600*fae548d3Szrj       rettype = NULL;
3601*fae548d3Szrj       break;
3602*fae548d3Szrj     case 20:
3603*fae548d3Szrj       /* FIXME */
3604*fae548d3Szrj       name = "character";
3605*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 1, TRUE);
3606*fae548d3Szrj       break;
3607*fae548d3Szrj     case 21:
3608*fae548d3Szrj       name = "logical*1";
3609*fae548d3Szrj       rettype = debug_make_bool_type (dhandle, 1);
3610*fae548d3Szrj       break;
3611*fae548d3Szrj     case 22:
3612*fae548d3Szrj       name = "logical*2";
3613*fae548d3Szrj       rettype = debug_make_bool_type (dhandle, 2);
3614*fae548d3Szrj       break;
3615*fae548d3Szrj     case 23:
3616*fae548d3Szrj       name = "logical*4";
3617*fae548d3Szrj       rettype = debug_make_bool_type (dhandle, 4);
3618*fae548d3Szrj       break;
3619*fae548d3Szrj     case 24:
3620*fae548d3Szrj       name = "logical";
3621*fae548d3Szrj       rettype = debug_make_bool_type (dhandle, 4);
3622*fae548d3Szrj       break;
3623*fae548d3Szrj     case 25:
3624*fae548d3Szrj       /* Complex type consisting of two IEEE single precision values.  */
3625*fae548d3Szrj       name = "complex";
3626*fae548d3Szrj       rettype = debug_make_complex_type (dhandle, 8);
3627*fae548d3Szrj       break;
3628*fae548d3Szrj     case 26:
3629*fae548d3Szrj       /* Complex type consisting of two IEEE double precision values.  */
3630*fae548d3Szrj       name = "double complex";
3631*fae548d3Szrj       rettype = debug_make_complex_type (dhandle, 16);
3632*fae548d3Szrj       break;
3633*fae548d3Szrj     case 27:
3634*fae548d3Szrj       name = "integer*1";
3635*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 1, FALSE);
3636*fae548d3Szrj       break;
3637*fae548d3Szrj     case 28:
3638*fae548d3Szrj       name = "integer*2";
3639*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 2, FALSE);
3640*fae548d3Szrj       break;
3641*fae548d3Szrj     case 29:
3642*fae548d3Szrj       name = "integer*4";
3643*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 4, FALSE);
3644*fae548d3Szrj       break;
3645*fae548d3Szrj     case 30:
3646*fae548d3Szrj       /* FIXME */
3647*fae548d3Szrj       name = "wchar";
3648*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 2, FALSE);
3649*fae548d3Szrj       break;
3650*fae548d3Szrj     case 31:
3651*fae548d3Szrj       name = "long long";
3652*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 8, FALSE);
3653*fae548d3Szrj       break;
3654*fae548d3Szrj     case 32:
3655*fae548d3Szrj       name = "unsigned long long";
3656*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 8, TRUE);
3657*fae548d3Szrj       break;
3658*fae548d3Szrj     case 33:
3659*fae548d3Szrj       name = "logical*8";
3660*fae548d3Szrj       rettype = debug_make_bool_type (dhandle, 8);
3661*fae548d3Szrj       break;
3662*fae548d3Szrj     case 34:
3663*fae548d3Szrj       name = "integer*8";
3664*fae548d3Szrj       rettype = debug_make_int_type (dhandle, 8, FALSE);
3665*fae548d3Szrj       break;
3666*fae548d3Szrj     default:
3667*fae548d3Szrj       abort ();
3668*fae548d3Szrj     }
3669*fae548d3Szrj 
3670*fae548d3Szrj   rettype = debug_name_type (dhandle, name, rettype);
3671*fae548d3Szrj 
3672*fae548d3Szrj   info->xcoff_types[-typenum] = rettype;
3673*fae548d3Szrj 
3674*fae548d3Szrj   return rettype;
3675*fae548d3Szrj }
3676*fae548d3Szrj 
3677*fae548d3Szrj /* Find or create a tagged type.  */
3678*fae548d3Szrj 
3679*fae548d3Szrj static debug_type
stab_find_tagged_type(void * dhandle,struct stab_handle * info,const char * p,int len,enum debug_type_kind kind)3680*fae548d3Szrj stab_find_tagged_type (void *dhandle, struct stab_handle *info,
3681*fae548d3Szrj 		       const char *p, int len, enum debug_type_kind kind)
3682*fae548d3Szrj {
3683*fae548d3Szrj   char *name;
3684*fae548d3Szrj   debug_type dtype;
3685*fae548d3Szrj   struct stab_tag *st;
3686*fae548d3Szrj 
3687*fae548d3Szrj   name = savestring (p, len);
3688*fae548d3Szrj 
3689*fae548d3Szrj   /* We pass DEBUG_KIND_ILLEGAL because we want all tags in the same
3690*fae548d3Szrj      namespace.  This is right for C, and I don't know how to handle
3691*fae548d3Szrj      other languages.  FIXME.  */
3692*fae548d3Szrj   dtype = debug_find_tagged_type (dhandle, name, DEBUG_KIND_ILLEGAL);
3693*fae548d3Szrj   if (dtype != DEBUG_TYPE_NULL)
3694*fae548d3Szrj     {
3695*fae548d3Szrj       free (name);
3696*fae548d3Szrj       return dtype;
3697*fae548d3Szrj     }
3698*fae548d3Szrj 
3699*fae548d3Szrj   /* We need to allocate an entry on the undefined tag list.  */
3700*fae548d3Szrj   for (st = info->tags; st != NULL; st = st->next)
3701*fae548d3Szrj     {
3702*fae548d3Szrj       if (st->name[0] == name[0]
3703*fae548d3Szrj 	  && strcmp (st->name, name) == 0)
3704*fae548d3Szrj 	{
3705*fae548d3Szrj 	  if (st->kind == DEBUG_KIND_ILLEGAL)
3706*fae548d3Szrj 	    st->kind = kind;
3707*fae548d3Szrj 	  free (name);
3708*fae548d3Szrj 	  break;
3709*fae548d3Szrj 	}
3710*fae548d3Szrj     }
3711*fae548d3Szrj   if (st == NULL)
3712*fae548d3Szrj     {
3713*fae548d3Szrj       st = (struct stab_tag *) xmalloc (sizeof *st);
3714*fae548d3Szrj       memset (st, 0, sizeof *st);
3715*fae548d3Szrj 
3716*fae548d3Szrj       st->next = info->tags;
3717*fae548d3Szrj       st->name = name;
3718*fae548d3Szrj       st->kind = kind;
3719*fae548d3Szrj       st->slot = DEBUG_TYPE_NULL;
3720*fae548d3Szrj       st->type = debug_make_indirect_type (dhandle, &st->slot, name);
3721*fae548d3Szrj       info->tags = st;
3722*fae548d3Szrj     }
3723*fae548d3Szrj 
3724*fae548d3Szrj   return st->type;
3725*fae548d3Szrj }
3726*fae548d3Szrj 
3727*fae548d3Szrj /* In order to get the correct argument types for a stubbed method, we
3728*fae548d3Szrj    need to extract the argument types from a C++ mangled string.
3729*fae548d3Szrj    Since the argument types can refer back to the return type, this
3730*fae548d3Szrj    means that we must demangle the entire physical name.  In gdb this
3731*fae548d3Szrj    is done by calling cplus_demangle and running the results back
3732*fae548d3Szrj    through the C++ expression parser.  Since we have no expression
3733*fae548d3Szrj    parser, we must duplicate much of the work of cplus_demangle here.
3734*fae548d3Szrj 
3735*fae548d3Szrj    We assume that GNU style demangling is used, since this is only
3736*fae548d3Szrj    done for method stubs, and only g++ should output that form of
3737*fae548d3Szrj    debugging information.  */
3738*fae548d3Szrj 
3739*fae548d3Szrj /* This structure is used to hold a pointer to type information which
3740*fae548d3Szrj    demangling a string.  */
3741*fae548d3Szrj 
3742*fae548d3Szrj struct stab_demangle_typestring
3743*fae548d3Szrj {
3744*fae548d3Szrj   /* The start of the type.  This is not null terminated.  */
3745*fae548d3Szrj   const char *typestring;
3746*fae548d3Szrj   /* The length of the type.  */
3747*fae548d3Szrj   unsigned int len;
3748*fae548d3Szrj };
3749*fae548d3Szrj 
3750*fae548d3Szrj /* This structure is used to hold information while demangling a
3751*fae548d3Szrj    string.  */
3752*fae548d3Szrj 
3753*fae548d3Szrj struct stab_demangle_info
3754*fae548d3Szrj {
3755*fae548d3Szrj   /* The debugging information handle.  */
3756*fae548d3Szrj   void *dhandle;
3757*fae548d3Szrj   /* The stab information handle.  */
3758*fae548d3Szrj   struct stab_handle *info;
3759*fae548d3Szrj   /* The array of arguments we are building.  */
3760*fae548d3Szrj   debug_type *args;
3761*fae548d3Szrj   /* Whether the method takes a variable number of arguments.  */
3762*fae548d3Szrj   bfd_boolean varargs;
3763*fae548d3Szrj   /* The array of types we have remembered.  */
3764*fae548d3Szrj   struct stab_demangle_typestring *typestrings;
3765*fae548d3Szrj   /* The number of typestrings.  */
3766*fae548d3Szrj   unsigned int typestring_count;
3767*fae548d3Szrj   /* The number of typestring slots we have allocated.  */
3768*fae548d3Szrj   unsigned int typestring_alloc;
3769*fae548d3Szrj };
3770*fae548d3Szrj 
3771*fae548d3Szrj static void stab_bad_demangle (const char *);
3772*fae548d3Szrj static unsigned int stab_demangle_count (const char **);
3773*fae548d3Szrj static bfd_boolean stab_demangle_get_count (const char **, unsigned int *);
3774*fae548d3Szrj static bfd_boolean stab_demangle_prefix
3775*fae548d3Szrj   (struct stab_demangle_info *, const char **, unsigned int);
3776*fae548d3Szrj static bfd_boolean stab_demangle_function_name
3777*fae548d3Szrj   (struct stab_demangle_info *, const char **, const char *);
3778*fae548d3Szrj static bfd_boolean stab_demangle_signature
3779*fae548d3Szrj   (struct stab_demangle_info *, const char **);
3780*fae548d3Szrj static bfd_boolean stab_demangle_qualified
3781*fae548d3Szrj   (struct stab_demangle_info *, const char **, debug_type *);
3782*fae548d3Szrj static bfd_boolean stab_demangle_template
3783*fae548d3Szrj   (struct stab_demangle_info *, const char **, char **);
3784*fae548d3Szrj static bfd_boolean stab_demangle_class
3785*fae548d3Szrj   (struct stab_demangle_info *, const char **, const char **);
3786*fae548d3Szrj static bfd_boolean stab_demangle_args
3787*fae548d3Szrj   (struct stab_demangle_info *, const char **, debug_type **, bfd_boolean *);
3788*fae548d3Szrj static bfd_boolean stab_demangle_arg
3789*fae548d3Szrj   (struct stab_demangle_info *, const char **, debug_type **,
3790*fae548d3Szrj    unsigned int *, unsigned int *);
3791*fae548d3Szrj static bfd_boolean stab_demangle_type
3792*fae548d3Szrj   (struct stab_demangle_info *, const char **, debug_type *);
3793*fae548d3Szrj static bfd_boolean stab_demangle_fund_type
3794*fae548d3Szrj   (struct stab_demangle_info *, const char **, debug_type *);
3795*fae548d3Szrj static bfd_boolean stab_demangle_remember_type
3796*fae548d3Szrj   (struct stab_demangle_info *, const char *, int);
3797*fae548d3Szrj 
3798*fae548d3Szrj /* Warn about a bad demangling.  */
3799*fae548d3Szrj 
3800*fae548d3Szrj static void
stab_bad_demangle(const char * s)3801*fae548d3Szrj stab_bad_demangle (const char *s)
3802*fae548d3Szrj {
3803*fae548d3Szrj   fprintf (stderr, _("bad mangled name `%s'\n"), s);
3804*fae548d3Szrj }
3805*fae548d3Szrj 
3806*fae548d3Szrj /* Get a count from a stab string.  */
3807*fae548d3Szrj 
3808*fae548d3Szrj static unsigned int
stab_demangle_count(const char ** pp)3809*fae548d3Szrj stab_demangle_count (const char **pp)
3810*fae548d3Szrj {
3811*fae548d3Szrj   unsigned int count;
3812*fae548d3Szrj 
3813*fae548d3Szrj   count = 0;
3814*fae548d3Szrj   while (ISDIGIT (**pp))
3815*fae548d3Szrj     {
3816*fae548d3Szrj       count *= 10;
3817*fae548d3Szrj       count += **pp - '0';
3818*fae548d3Szrj       ++*pp;
3819*fae548d3Szrj     }
3820*fae548d3Szrj   return count;
3821*fae548d3Szrj }
3822*fae548d3Szrj 
3823*fae548d3Szrj /* Require a count in a string.  The count may be multiple digits, in
3824*fae548d3Szrj    which case it must end in an underscore.  */
3825*fae548d3Szrj 
3826*fae548d3Szrj static bfd_boolean
stab_demangle_get_count(const char ** pp,unsigned int * pi)3827*fae548d3Szrj stab_demangle_get_count (const char **pp, unsigned int *pi)
3828*fae548d3Szrj {
3829*fae548d3Szrj   if (! ISDIGIT (**pp))
3830*fae548d3Szrj     return FALSE;
3831*fae548d3Szrj 
3832*fae548d3Szrj   *pi = **pp - '0';
3833*fae548d3Szrj   ++*pp;
3834*fae548d3Szrj   if (ISDIGIT (**pp))
3835*fae548d3Szrj     {
3836*fae548d3Szrj       unsigned int count;
3837*fae548d3Szrj       const char *p;
3838*fae548d3Szrj 
3839*fae548d3Szrj       count = *pi;
3840*fae548d3Szrj       p = *pp;
3841*fae548d3Szrj       do
3842*fae548d3Szrj 	{
3843*fae548d3Szrj 	  count *= 10;
3844*fae548d3Szrj 	  count += *p - '0';
3845*fae548d3Szrj 	  ++p;
3846*fae548d3Szrj 	}
3847*fae548d3Szrj       while (ISDIGIT (*p));
3848*fae548d3Szrj       if (*p == '_')
3849*fae548d3Szrj 	{
3850*fae548d3Szrj 	  *pp = p + 1;
3851*fae548d3Szrj 	  *pi = count;
3852*fae548d3Szrj 	}
3853*fae548d3Szrj     }
3854*fae548d3Szrj 
3855*fae548d3Szrj   return TRUE;
3856*fae548d3Szrj }
3857*fae548d3Szrj 
3858*fae548d3Szrj /* This function demangles a physical name, returning a NULL
3859*fae548d3Szrj    terminated array of argument types.  */
3860*fae548d3Szrj 
3861*fae548d3Szrj static debug_type *
stab_demangle_argtypes(void * dhandle,struct stab_handle * info,const char * physname,bfd_boolean * pvarargs,unsigned int physname_len)3862*fae548d3Szrj stab_demangle_argtypes (void *dhandle, struct stab_handle *info,
3863*fae548d3Szrj 			const char *physname, bfd_boolean *pvarargs,
3864*fae548d3Szrj 			unsigned int physname_len)
3865*fae548d3Szrj {
3866*fae548d3Szrj   struct stab_demangle_info minfo;
3867*fae548d3Szrj 
3868*fae548d3Szrj   /* Check for the g++ V3 ABI.  */
3869*fae548d3Szrj   if (physname[0] == '_' && physname[1] == 'Z')
3870*fae548d3Szrj     return stab_demangle_v3_argtypes (dhandle, info, physname, pvarargs);
3871*fae548d3Szrj 
3872*fae548d3Szrj   minfo.dhandle = dhandle;
3873*fae548d3Szrj   minfo.info = info;
3874*fae548d3Szrj   minfo.args = NULL;
3875*fae548d3Szrj   minfo.varargs = FALSE;
3876*fae548d3Szrj   minfo.typestring_alloc = 10;
3877*fae548d3Szrj   minfo.typestrings = ((struct stab_demangle_typestring *)
3878*fae548d3Szrj 		       xmalloc (minfo.typestring_alloc
3879*fae548d3Szrj 				* sizeof *minfo.typestrings));
3880*fae548d3Szrj   minfo.typestring_count = 0;
3881*fae548d3Szrj 
3882*fae548d3Szrj   /* cplus_demangle checks for special GNU mangled forms, but we can't
3883*fae548d3Szrj      see any of them in mangled method argument types.  */
3884*fae548d3Szrj 
3885*fae548d3Szrj   if (! stab_demangle_prefix (&minfo, &physname, physname_len))
3886*fae548d3Szrj     goto error_return;
3887*fae548d3Szrj 
3888*fae548d3Szrj   if (*physname != '\0')
3889*fae548d3Szrj     {
3890*fae548d3Szrj       if (! stab_demangle_signature (&minfo, &physname))
3891*fae548d3Szrj 	goto error_return;
3892*fae548d3Szrj     }
3893*fae548d3Szrj 
3894*fae548d3Szrj   free (minfo.typestrings);
3895*fae548d3Szrj   minfo.typestrings = NULL;
3896*fae548d3Szrj 
3897*fae548d3Szrj   if (minfo.args == NULL)
3898*fae548d3Szrj     fprintf (stderr, _("no argument types in mangled string\n"));
3899*fae548d3Szrj 
3900*fae548d3Szrj   *pvarargs = minfo.varargs;
3901*fae548d3Szrj   return minfo.args;
3902*fae548d3Szrj 
3903*fae548d3Szrj  error_return:
3904*fae548d3Szrj   if (minfo.typestrings != NULL)
3905*fae548d3Szrj     free (minfo.typestrings);
3906*fae548d3Szrj   return NULL;
3907*fae548d3Szrj }
3908*fae548d3Szrj 
3909*fae548d3Szrj /* Demangle the prefix of the mangled name.  */
3910*fae548d3Szrj 
3911*fae548d3Szrj static bfd_boolean
stab_demangle_prefix(struct stab_demangle_info * minfo,const char ** pp,unsigned int physname_len)3912*fae548d3Szrj stab_demangle_prefix (struct stab_demangle_info *minfo, const char **pp,
3913*fae548d3Szrj 		      unsigned int physname_len)
3914*fae548d3Szrj {
3915*fae548d3Szrj   const char *scan;
3916*fae548d3Szrj   unsigned int i;
3917*fae548d3Szrj 
3918*fae548d3Szrj   /* cplus_demangle checks for global constructors and destructors,
3919*fae548d3Szrj      but we can't see them in mangled argument types.  */
3920*fae548d3Szrj 
3921*fae548d3Szrj   if (physname_len)
3922*fae548d3Szrj     scan = *pp + physname_len;
3923*fae548d3Szrj   else
3924*fae548d3Szrj     {
3925*fae548d3Szrj       /* Look for `__'.  */
3926*fae548d3Szrj       scan = *pp;
3927*fae548d3Szrj       do
3928*fae548d3Szrj 	scan = strchr (scan, '_');
3929*fae548d3Szrj       while (scan != NULL && *++scan != '_');
3930*fae548d3Szrj 
3931*fae548d3Szrj       if (scan == NULL)
3932*fae548d3Szrj 	{
3933*fae548d3Szrj 	  stab_bad_demangle (*pp);
3934*fae548d3Szrj 	  return FALSE;
3935*fae548d3Szrj 	}
3936*fae548d3Szrj 
3937*fae548d3Szrj       --scan;
3938*fae548d3Szrj 
3939*fae548d3Szrj       /* We found `__'; move ahead to the last contiguous `__' pair.  */
3940*fae548d3Szrj       i = strspn (scan, "_");
3941*fae548d3Szrj       if (i > 2)
3942*fae548d3Szrj 	scan += i - 2;
3943*fae548d3Szrj     }
3944*fae548d3Szrj 
3945*fae548d3Szrj   if (scan == *pp
3946*fae548d3Szrj       && (ISDIGIT (scan[2])
3947*fae548d3Szrj 	  || scan[2] == 'Q'
3948*fae548d3Szrj 	  || scan[2] == 't'))
3949*fae548d3Szrj     {
3950*fae548d3Szrj       /* This is a GNU style constructor name.  */
3951*fae548d3Szrj       *pp = scan + 2;
3952*fae548d3Szrj       return TRUE;
3953*fae548d3Szrj     }
3954*fae548d3Szrj   else if (scan == *pp
3955*fae548d3Szrj 	   && ! ISDIGIT (scan[2])
3956*fae548d3Szrj 	   && scan[2] != 't')
3957*fae548d3Szrj     {
3958*fae548d3Szrj       /* Look for the `__' that separates the prefix from the
3959*fae548d3Szrj          signature.  */
3960*fae548d3Szrj       while (*scan == '_')
3961*fae548d3Szrj 	++scan;
3962*fae548d3Szrj       scan = strstr (scan, "__");
3963*fae548d3Szrj       if (scan == NULL || scan[2] == '\0')
3964*fae548d3Szrj 	{
3965*fae548d3Szrj 	  stab_bad_demangle (*pp);
3966*fae548d3Szrj 	  return FALSE;
3967*fae548d3Szrj 	}
3968*fae548d3Szrj 
3969*fae548d3Szrj       return stab_demangle_function_name (minfo, pp, scan);
3970*fae548d3Szrj     }
3971*fae548d3Szrj   else if (scan[2] != '\0')
3972*fae548d3Szrj     {
3973*fae548d3Szrj       /* The name doesn't start with `__', but it does contain `__'.  */
3974*fae548d3Szrj       return stab_demangle_function_name (minfo, pp, scan);
3975*fae548d3Szrj     }
3976*fae548d3Szrj   else
3977*fae548d3Szrj     {
3978*fae548d3Szrj       stab_bad_demangle (*pp);
3979*fae548d3Szrj       return FALSE;
3980*fae548d3Szrj     }
3981*fae548d3Szrj   /*NOTREACHED*/
3982*fae548d3Szrj }
3983*fae548d3Szrj 
3984*fae548d3Szrj /* Demangle a function name prefix.  The scan argument points to the
3985*fae548d3Szrj    double underscore which separates the function name from the
3986*fae548d3Szrj    signature.  */
3987*fae548d3Szrj 
3988*fae548d3Szrj static bfd_boolean
stab_demangle_function_name(struct stab_demangle_info * minfo,const char ** pp,const char * scan)3989*fae548d3Szrj stab_demangle_function_name (struct stab_demangle_info *minfo,
3990*fae548d3Szrj 			     const char **pp, const char *scan)
3991*fae548d3Szrj {
3992*fae548d3Szrj   const char *name;
3993*fae548d3Szrj 
3994*fae548d3Szrj   /* The string from *pp to scan is the name of the function.  We
3995*fae548d3Szrj      don't care about the name, since we just looking for argument
3996*fae548d3Szrj      types.  However, for conversion operators, the name may include a
3997*fae548d3Szrj      type which we must remember in order to handle backreferences.  */
3998*fae548d3Szrj 
3999*fae548d3Szrj   name = *pp;
4000*fae548d3Szrj   *pp = scan + 2;
4001*fae548d3Szrj 
4002*fae548d3Szrj   if (*pp - name >= 5
4003*fae548d3Szrj 	   && CONST_STRNEQ (name, "type")
4004*fae548d3Szrj 	   && (name[4] == '$' || name[4] == '.'))
4005*fae548d3Szrj     {
4006*fae548d3Szrj       const char *tem;
4007*fae548d3Szrj 
4008*fae548d3Szrj       /* This is a type conversion operator.  */
4009*fae548d3Szrj       tem = name + 5;
4010*fae548d3Szrj       if (! stab_demangle_type (minfo, &tem, (debug_type *) NULL))
4011*fae548d3Szrj 	return FALSE;
4012*fae548d3Szrj     }
4013*fae548d3Szrj   else if (name[0] == '_'
4014*fae548d3Szrj 	   && name[1] == '_'
4015*fae548d3Szrj 	   && name[2] == 'o'
4016*fae548d3Szrj 	   && name[3] == 'p')
4017*fae548d3Szrj     {
4018*fae548d3Szrj       const char *tem;
4019*fae548d3Szrj 
4020*fae548d3Szrj       /* This is a type conversion operator.  */
4021*fae548d3Szrj       tem = name + 4;
4022*fae548d3Szrj       if (! stab_demangle_type (minfo, &tem, (debug_type *) NULL))
4023*fae548d3Szrj 	return FALSE;
4024*fae548d3Szrj     }
4025*fae548d3Szrj 
4026*fae548d3Szrj   return TRUE;
4027*fae548d3Szrj }
4028*fae548d3Szrj 
4029*fae548d3Szrj /* Demangle the signature.  This is where the argument types are
4030*fae548d3Szrj    found.  */
4031*fae548d3Szrj 
4032*fae548d3Szrj static bfd_boolean
stab_demangle_signature(struct stab_demangle_info * minfo,const char ** pp)4033*fae548d3Szrj stab_demangle_signature (struct stab_demangle_info *minfo, const char **pp)
4034*fae548d3Szrj {
4035*fae548d3Szrj   const char *orig;
4036*fae548d3Szrj   bfd_boolean expect_func, func_done;
4037*fae548d3Szrj   const char *hold;
4038*fae548d3Szrj 
4039*fae548d3Szrj   orig = *pp;
4040*fae548d3Szrj 
4041*fae548d3Szrj   expect_func = FALSE;
4042*fae548d3Szrj   func_done = FALSE;
4043*fae548d3Szrj   hold = NULL;
4044*fae548d3Szrj 
4045*fae548d3Szrj   while (**pp != '\0')
4046*fae548d3Szrj     {
4047*fae548d3Szrj       switch (**pp)
4048*fae548d3Szrj 	{
4049*fae548d3Szrj 	case 'Q':
4050*fae548d3Szrj 	  hold = *pp;
4051*fae548d3Szrj 	  if (! stab_demangle_qualified (minfo, pp, (debug_type *) NULL)
4052*fae548d3Szrj 	      || ! stab_demangle_remember_type (minfo, hold, *pp - hold))
4053*fae548d3Szrj 	    return FALSE;
4054*fae548d3Szrj 	  expect_func = TRUE;
4055*fae548d3Szrj 	  hold = NULL;
4056*fae548d3Szrj 	  break;
4057*fae548d3Szrj 
4058*fae548d3Szrj 	case 'S':
4059*fae548d3Szrj 	  /* Static member function.  FIXME: Can this happen?  */
4060*fae548d3Szrj 	  if (hold == NULL)
4061*fae548d3Szrj 	    hold = *pp;
4062*fae548d3Szrj 	  ++*pp;
4063*fae548d3Szrj 	  break;
4064*fae548d3Szrj 
4065*fae548d3Szrj 	case 'C':
4066*fae548d3Szrj 	  /* Const member function.  */
4067*fae548d3Szrj 	  if (hold == NULL)
4068*fae548d3Szrj 	    hold = *pp;
4069*fae548d3Szrj 	  ++*pp;
4070*fae548d3Szrj 	  break;
4071*fae548d3Szrj 
4072*fae548d3Szrj 	case '0': case '1': case '2': case '3': case '4':
4073*fae548d3Szrj 	case '5': case '6': case '7': case '8': case '9':
4074*fae548d3Szrj 	  if (hold == NULL)
4075*fae548d3Szrj 	    hold = *pp;
4076*fae548d3Szrj 	  if (! stab_demangle_class (minfo, pp, (const char **) NULL)
4077*fae548d3Szrj 	      || ! stab_demangle_remember_type (minfo, hold, *pp - hold))
4078*fae548d3Szrj 	    return FALSE;
4079*fae548d3Szrj 	  expect_func = TRUE;
4080*fae548d3Szrj 	  hold = NULL;
4081*fae548d3Szrj 	  break;
4082*fae548d3Szrj 
4083*fae548d3Szrj 	case 'F':
4084*fae548d3Szrj 	  /* Function.  I don't know if this actually happens with g++
4085*fae548d3Szrj              output.  */
4086*fae548d3Szrj 	  hold = NULL;
4087*fae548d3Szrj 	  func_done = TRUE;
4088*fae548d3Szrj 	  ++*pp;
4089*fae548d3Szrj 	  if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs))
4090*fae548d3Szrj 	    return FALSE;
4091*fae548d3Szrj 	  break;
4092*fae548d3Szrj 
4093*fae548d3Szrj 	case 't':
4094*fae548d3Szrj 	  /* Template.  */
4095*fae548d3Szrj 	  if (hold == NULL)
4096*fae548d3Szrj 	    hold = *pp;
4097*fae548d3Szrj 	  if (! stab_demangle_template (minfo, pp, (char **) NULL)
4098*fae548d3Szrj 	      || ! stab_demangle_remember_type (minfo, hold, *pp - hold))
4099*fae548d3Szrj 	    return FALSE;
4100*fae548d3Szrj 	  hold = NULL;
4101*fae548d3Szrj 	  expect_func = TRUE;
4102*fae548d3Szrj 	  break;
4103*fae548d3Szrj 
4104*fae548d3Szrj 	case '_':
4105*fae548d3Szrj 	  /* At the outermost level, we cannot have a return type
4106*fae548d3Szrj 	     specified, so if we run into another '_' at this point we
4107*fae548d3Szrj 	     are dealing with a mangled name that is either bogus, or
4108*fae548d3Szrj 	     has been mangled by some algorithm we don't know how to
4109*fae548d3Szrj 	     deal with.  So just reject the entire demangling.  */
4110*fae548d3Szrj 	  stab_bad_demangle (orig);
4111*fae548d3Szrj 	  return FALSE;
4112*fae548d3Szrj 
4113*fae548d3Szrj 	default:
4114*fae548d3Szrj 	  /* Assume we have stumbled onto the first outermost function
4115*fae548d3Szrj 	     argument token, and start processing args.  */
4116*fae548d3Szrj 	  func_done = TRUE;
4117*fae548d3Szrj 	  if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs))
4118*fae548d3Szrj 	    return FALSE;
4119*fae548d3Szrj 	  break;
4120*fae548d3Szrj 	}
4121*fae548d3Szrj 
4122*fae548d3Szrj       if (expect_func)
4123*fae548d3Szrj 	{
4124*fae548d3Szrj 	  func_done = TRUE;
4125*fae548d3Szrj 	  if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs))
4126*fae548d3Szrj 	    return FALSE;
4127*fae548d3Szrj 	}
4128*fae548d3Szrj     }
4129*fae548d3Szrj 
4130*fae548d3Szrj   if (! func_done)
4131*fae548d3Szrj     {
4132*fae548d3Szrj       /* With GNU style demangling, bar__3foo is 'foo::bar(void)', and
4133*fae548d3Szrj 	 bar__3fooi is 'foo::bar(int)'.  We get here when we find the
4134*fae548d3Szrj 	 first case, and need to ensure that the '(void)' gets added
4135*fae548d3Szrj 	 to the current declp.  */
4136*fae548d3Szrj       if (! stab_demangle_args (minfo, pp, &minfo->args, &minfo->varargs))
4137*fae548d3Szrj 	return FALSE;
4138*fae548d3Szrj     }
4139*fae548d3Szrj 
4140*fae548d3Szrj   return TRUE;
4141*fae548d3Szrj }
4142*fae548d3Szrj 
4143*fae548d3Szrj /* Demangle a qualified name, such as "Q25Outer5Inner" which is the
4144*fae548d3Szrj    mangled form of "Outer::Inner".  */
4145*fae548d3Szrj 
4146*fae548d3Szrj static bfd_boolean
stab_demangle_qualified(struct stab_demangle_info * minfo,const char ** pp,debug_type * ptype)4147*fae548d3Szrj stab_demangle_qualified (struct stab_demangle_info *minfo, const char **pp,
4148*fae548d3Szrj 			 debug_type *ptype)
4149*fae548d3Szrj {
4150*fae548d3Szrj   const char *orig;
4151*fae548d3Szrj   const char *p;
4152*fae548d3Szrj   unsigned int qualifiers;
4153*fae548d3Szrj   debug_type context;
4154*fae548d3Szrj 
4155*fae548d3Szrj   orig = *pp;
4156*fae548d3Szrj 
4157*fae548d3Szrj   switch ((*pp)[1])
4158*fae548d3Szrj     {
4159*fae548d3Szrj     case '_':
4160*fae548d3Szrj       /* GNU mangled name with more than 9 classes.  The count is
4161*fae548d3Szrj 	 preceded by an underscore (to distinguish it from the <= 9
4162*fae548d3Szrj 	 case) and followed by an underscore.  */
4163*fae548d3Szrj       p = *pp + 2;
4164*fae548d3Szrj       if (! ISDIGIT (*p) || *p == '0')
4165*fae548d3Szrj 	{
4166*fae548d3Szrj 	  stab_bad_demangle (orig);
4167*fae548d3Szrj 	  return FALSE;
4168*fae548d3Szrj 	}
4169*fae548d3Szrj       qualifiers = atoi (p);
4170*fae548d3Szrj       while (ISDIGIT (*p))
4171*fae548d3Szrj 	++p;
4172*fae548d3Szrj       if (*p != '_')
4173*fae548d3Szrj 	{
4174*fae548d3Szrj 	  stab_bad_demangle (orig);
4175*fae548d3Szrj 	  return FALSE;
4176*fae548d3Szrj 	}
4177*fae548d3Szrj       *pp = p + 1;
4178*fae548d3Szrj       break;
4179*fae548d3Szrj 
4180*fae548d3Szrj     case '1': case '2': case '3': case '4': case '5':
4181*fae548d3Szrj     case '6': case '7': case '8': case '9':
4182*fae548d3Szrj       qualifiers = (*pp)[1] - '0';
4183*fae548d3Szrj       /* Skip an optional underscore after the count.  */
4184*fae548d3Szrj       if ((*pp)[2] == '_')
4185*fae548d3Szrj 	++*pp;
4186*fae548d3Szrj       *pp += 2;
4187*fae548d3Szrj       break;
4188*fae548d3Szrj 
4189*fae548d3Szrj     case '0':
4190*fae548d3Szrj     default:
4191*fae548d3Szrj       stab_bad_demangle (orig);
4192*fae548d3Szrj       return FALSE;
4193*fae548d3Szrj     }
4194*fae548d3Szrj 
4195*fae548d3Szrj   context = DEBUG_TYPE_NULL;
4196*fae548d3Szrj 
4197*fae548d3Szrj   /* Pick off the names.  */
4198*fae548d3Szrj   while (qualifiers-- > 0)
4199*fae548d3Szrj     {
4200*fae548d3Szrj       if (**pp == '_')
4201*fae548d3Szrj 	++*pp;
4202*fae548d3Szrj       if (**pp == 't')
4203*fae548d3Szrj 	{
4204*fae548d3Szrj 	  char *name;
4205*fae548d3Szrj 
4206*fae548d3Szrj 	  if (! stab_demangle_template (minfo, pp,
4207*fae548d3Szrj 					ptype != NULL ? &name : NULL))
4208*fae548d3Szrj 	    return FALSE;
4209*fae548d3Szrj 
4210*fae548d3Szrj 	  if (ptype != NULL)
4211*fae548d3Szrj 	    {
4212*fae548d3Szrj 	      context = stab_find_tagged_type (minfo->dhandle, minfo->info,
4213*fae548d3Szrj 					       name, strlen (name),
4214*fae548d3Szrj 					       DEBUG_KIND_CLASS);
4215*fae548d3Szrj 	      free (name);
4216*fae548d3Szrj 	      if (context == DEBUG_TYPE_NULL)
4217*fae548d3Szrj 		return FALSE;
4218*fae548d3Szrj 	    }
4219*fae548d3Szrj 	}
4220*fae548d3Szrj       else
4221*fae548d3Szrj 	{
4222*fae548d3Szrj 	  unsigned int len;
4223*fae548d3Szrj 
4224*fae548d3Szrj 	  len = stab_demangle_count (pp);
4225*fae548d3Szrj 	  if (strlen (*pp) < len)
4226*fae548d3Szrj 	    {
4227*fae548d3Szrj 	      stab_bad_demangle (orig);
4228*fae548d3Szrj 	      return FALSE;
4229*fae548d3Szrj 	    }
4230*fae548d3Szrj 
4231*fae548d3Szrj 	  if (ptype != NULL)
4232*fae548d3Szrj 	    {
4233*fae548d3Szrj 	      const debug_field *fields;
4234*fae548d3Szrj 
4235*fae548d3Szrj 	      fields = NULL;
4236*fae548d3Szrj 	      if (context != DEBUG_TYPE_NULL)
4237*fae548d3Szrj 		fields = debug_get_fields (minfo->dhandle, context);
4238*fae548d3Szrj 
4239*fae548d3Szrj 	      context = DEBUG_TYPE_NULL;
4240*fae548d3Szrj 
4241*fae548d3Szrj 	      if (fields != NULL)
4242*fae548d3Szrj 		{
4243*fae548d3Szrj 		  char *name;
4244*fae548d3Szrj 
4245*fae548d3Szrj 		  /* Try to find the type by looking through the
4246*fae548d3Szrj                      fields of context until we find a field with the
4247*fae548d3Szrj                      same type.  This ought to work for a class
4248*fae548d3Szrj                      defined within a class, but it won't work for,
4249*fae548d3Szrj                      e.g., an enum defined within a class.  stabs does
4250*fae548d3Szrj                      not give us enough information to figure out the
4251*fae548d3Szrj                      latter case.  */
4252*fae548d3Szrj 
4253*fae548d3Szrj 		  name = savestring (*pp, len);
4254*fae548d3Szrj 
4255*fae548d3Szrj 		  for (; *fields != DEBUG_FIELD_NULL; fields++)
4256*fae548d3Szrj 		    {
4257*fae548d3Szrj 		      debug_type ft;
4258*fae548d3Szrj 		      const char *dn;
4259*fae548d3Szrj 
4260*fae548d3Szrj 		      ft = debug_get_field_type (minfo->dhandle, *fields);
4261*fae548d3Szrj 		      if (ft == NULL)
4262*fae548d3Szrj 			{
4263*fae548d3Szrj 			  free (name);
4264*fae548d3Szrj 			  return FALSE;
4265*fae548d3Szrj 			}
4266*fae548d3Szrj 		      dn = debug_get_type_name (minfo->dhandle, ft);
4267*fae548d3Szrj 		      if (dn != NULL && strcmp (dn, name) == 0)
4268*fae548d3Szrj 			{
4269*fae548d3Szrj 			  context = ft;
4270*fae548d3Szrj 			  break;
4271*fae548d3Szrj 			}
4272*fae548d3Szrj 		    }
4273*fae548d3Szrj 
4274*fae548d3Szrj 		  free (name);
4275*fae548d3Szrj 		}
4276*fae548d3Szrj 
4277*fae548d3Szrj 	      if (context == DEBUG_TYPE_NULL)
4278*fae548d3Szrj 		{
4279*fae548d3Szrj 		  /* We have to fall back on finding the type by name.
4280*fae548d3Szrj                      If there are more types to come, then this must
4281*fae548d3Szrj                      be a class.  Otherwise, it could be anything.  */
4282*fae548d3Szrj 
4283*fae548d3Szrj 		  if (qualifiers == 0)
4284*fae548d3Szrj 		    {
4285*fae548d3Szrj 		      char *name;
4286*fae548d3Szrj 
4287*fae548d3Szrj 		      name = savestring (*pp, len);
4288*fae548d3Szrj 		      context = debug_find_named_type (minfo->dhandle,
4289*fae548d3Szrj 						       name);
4290*fae548d3Szrj 		      free (name);
4291*fae548d3Szrj 		    }
4292*fae548d3Szrj 
4293*fae548d3Szrj 		  if (context == DEBUG_TYPE_NULL)
4294*fae548d3Szrj 		    {
4295*fae548d3Szrj 		      context = stab_find_tagged_type (minfo->dhandle,
4296*fae548d3Szrj 						       minfo->info,
4297*fae548d3Szrj 						       *pp, len,
4298*fae548d3Szrj 						       (qualifiers == 0
4299*fae548d3Szrj 							? DEBUG_KIND_ILLEGAL
4300*fae548d3Szrj 							: DEBUG_KIND_CLASS));
4301*fae548d3Szrj 		      if (context == DEBUG_TYPE_NULL)
4302*fae548d3Szrj 			return FALSE;
4303*fae548d3Szrj 		    }
4304*fae548d3Szrj 		}
4305*fae548d3Szrj 	    }
4306*fae548d3Szrj 
4307*fae548d3Szrj 	  *pp += len;
4308*fae548d3Szrj 	}
4309*fae548d3Szrj     }
4310*fae548d3Szrj 
4311*fae548d3Szrj   if (ptype != NULL)
4312*fae548d3Szrj     *ptype = context;
4313*fae548d3Szrj 
4314*fae548d3Szrj   return TRUE;
4315*fae548d3Szrj }
4316*fae548d3Szrj 
4317*fae548d3Szrj /* Demangle a template.  If PNAME is not NULL, this sets *PNAME to a
4318*fae548d3Szrj    string representation of the template.  */
4319*fae548d3Szrj 
4320*fae548d3Szrj static bfd_boolean
stab_demangle_template(struct stab_demangle_info * minfo,const char ** pp,char ** pname)4321*fae548d3Szrj stab_demangle_template (struct stab_demangle_info *minfo, const char **pp,
4322*fae548d3Szrj 			char **pname)
4323*fae548d3Szrj {
4324*fae548d3Szrj   const char *orig;
4325*fae548d3Szrj   unsigned int r, i;
4326*fae548d3Szrj 
4327*fae548d3Szrj   orig = *pp;
4328*fae548d3Szrj 
4329*fae548d3Szrj   ++*pp;
4330*fae548d3Szrj 
4331*fae548d3Szrj   /* Skip the template name.  */
4332*fae548d3Szrj   r = stab_demangle_count (pp);
4333*fae548d3Szrj   if (r == 0 || strlen (*pp) < r)
4334*fae548d3Szrj     {
4335*fae548d3Szrj       stab_bad_demangle (orig);
4336*fae548d3Szrj       return FALSE;
4337*fae548d3Szrj     }
4338*fae548d3Szrj   *pp += r;
4339*fae548d3Szrj 
4340*fae548d3Szrj   /* Get the size of the parameter list.  */
4341*fae548d3Szrj   if (stab_demangle_get_count (pp, &r) == 0)
4342*fae548d3Szrj     {
4343*fae548d3Szrj       stab_bad_demangle (orig);
4344*fae548d3Szrj       return FALSE;
4345*fae548d3Szrj     }
4346*fae548d3Szrj 
4347*fae548d3Szrj   for (i = 0; i < r; i++)
4348*fae548d3Szrj     {
4349*fae548d3Szrj       if (**pp == 'Z')
4350*fae548d3Szrj 	{
4351*fae548d3Szrj 	  /* This is a type parameter.  */
4352*fae548d3Szrj 	  ++*pp;
4353*fae548d3Szrj 	  if (! stab_demangle_type (minfo, pp, (debug_type *) NULL))
4354*fae548d3Szrj 	    return FALSE;
4355*fae548d3Szrj 	}
4356*fae548d3Szrj       else
4357*fae548d3Szrj 	{
4358*fae548d3Szrj 	  const char *old_p;
4359*fae548d3Szrj 	  bfd_boolean pointerp, realp, integralp, charp, boolp;
4360*fae548d3Szrj 	  bfd_boolean done;
4361*fae548d3Szrj 
4362*fae548d3Szrj 	  old_p = *pp;
4363*fae548d3Szrj 	  pointerp = FALSE;
4364*fae548d3Szrj 	  realp = FALSE;
4365*fae548d3Szrj 	  integralp = FALSE;
4366*fae548d3Szrj 	  charp = FALSE;
4367*fae548d3Szrj 	  boolp = FALSE;
4368*fae548d3Szrj 	  done = FALSE;
4369*fae548d3Szrj 
4370*fae548d3Szrj 	  /* This is a value parameter.  */
4371*fae548d3Szrj 
4372*fae548d3Szrj 	  if (! stab_demangle_type (minfo, pp, (debug_type *) NULL))
4373*fae548d3Szrj 	    return FALSE;
4374*fae548d3Szrj 
4375*fae548d3Szrj 	  while (*old_p != '\0' && ! done)
4376*fae548d3Szrj 	    {
4377*fae548d3Szrj 	      switch (*old_p)
4378*fae548d3Szrj 		{
4379*fae548d3Szrj 		case 'P':
4380*fae548d3Szrj 		case 'p':
4381*fae548d3Szrj 		case 'R':
4382*fae548d3Szrj 		  pointerp = TRUE;
4383*fae548d3Szrj 		  done = TRUE;
4384*fae548d3Szrj 		  break;
4385*fae548d3Szrj 		case 'C':	/* Const.  */
4386*fae548d3Szrj 		case 'S':	/* Signed.  */
4387*fae548d3Szrj 		case 'U':	/* Unsigned.  */
4388*fae548d3Szrj 		case 'V':	/* Volatile.  */
4389*fae548d3Szrj 		case 'F':	/* Function.  */
4390*fae548d3Szrj 		case 'M':	/* Member function.  */
4391*fae548d3Szrj 		case 'O':	/* ??? */
4392*fae548d3Szrj 		  ++old_p;
4393*fae548d3Szrj 		  break;
4394*fae548d3Szrj 		case 'Q':	/* Qualified name.  */
4395*fae548d3Szrj 		  integralp = TRUE;
4396*fae548d3Szrj 		  done = TRUE;
4397*fae548d3Szrj 		  break;
4398*fae548d3Szrj 		case 'T':	/* Remembered type.  */
4399*fae548d3Szrj 		  abort ();
4400*fae548d3Szrj 		case 'v':	/* Void.  */
4401*fae548d3Szrj 		  abort ();
4402*fae548d3Szrj 		case 'x':	/* Long long.  */
4403*fae548d3Szrj 		case 'l':	/* Long.  */
4404*fae548d3Szrj 		case 'i':	/* Int.  */
4405*fae548d3Szrj 		case 's':	/* Short.  */
4406*fae548d3Szrj 		case 'w':	/* Wchar_t.  */
4407*fae548d3Szrj 		  integralp = TRUE;
4408*fae548d3Szrj 		  done = TRUE;
4409*fae548d3Szrj 		  break;
4410*fae548d3Szrj 		case 'b':	/* Bool.  */
4411*fae548d3Szrj 		  boolp = TRUE;
4412*fae548d3Szrj 		  done = TRUE;
4413*fae548d3Szrj 		  break;
4414*fae548d3Szrj 		case 'c':	/* Char.  */
4415*fae548d3Szrj 		  charp = TRUE;
4416*fae548d3Szrj 		  done = TRUE;
4417*fae548d3Szrj 		  break;
4418*fae548d3Szrj 		case 'r':	/* Long double.  */
4419*fae548d3Szrj 		case 'd':	/* Double.  */
4420*fae548d3Szrj 		case 'f':	/* Float.  */
4421*fae548d3Szrj 		  realp = TRUE;
4422*fae548d3Szrj 		  done = TRUE;
4423*fae548d3Szrj 		  break;
4424*fae548d3Szrj 		default:
4425*fae548d3Szrj 		  /* Assume it's a user defined integral type.  */
4426*fae548d3Szrj 		  integralp = TRUE;
4427*fae548d3Szrj 		  done = TRUE;
4428*fae548d3Szrj 		  break;
4429*fae548d3Szrj 		}
4430*fae548d3Szrj 	    }
4431*fae548d3Szrj 
4432*fae548d3Szrj 	  if (integralp)
4433*fae548d3Szrj 	    {
4434*fae548d3Szrj 	      if (**pp == 'm')
4435*fae548d3Szrj 		++*pp;
4436*fae548d3Szrj 	      while (ISDIGIT (**pp))
4437*fae548d3Szrj 		++*pp;
4438*fae548d3Szrj 	    }
4439*fae548d3Szrj 	  else if (charp)
4440*fae548d3Szrj 	    {
4441*fae548d3Szrj 	      unsigned int val;
4442*fae548d3Szrj 
4443*fae548d3Szrj 	      if (**pp == 'm')
4444*fae548d3Szrj 		++*pp;
4445*fae548d3Szrj 	      val = stab_demangle_count (pp);
4446*fae548d3Szrj 	      if (val == 0)
4447*fae548d3Szrj 		{
4448*fae548d3Szrj 		  stab_bad_demangle (orig);
4449*fae548d3Szrj 		  return FALSE;
4450*fae548d3Szrj 		}
4451*fae548d3Szrj 	    }
4452*fae548d3Szrj 	  else if (boolp)
4453*fae548d3Szrj 	    {
4454*fae548d3Szrj 	      unsigned int val;
4455*fae548d3Szrj 
4456*fae548d3Szrj 	      val = stab_demangle_count (pp);
4457*fae548d3Szrj 	      if (val != 0 && val != 1)
4458*fae548d3Szrj 		{
4459*fae548d3Szrj 		  stab_bad_demangle (orig);
4460*fae548d3Szrj 		  return FALSE;
4461*fae548d3Szrj 		}
4462*fae548d3Szrj 	    }
4463*fae548d3Szrj 	  else if (realp)
4464*fae548d3Szrj 	    {
4465*fae548d3Szrj 	      if (**pp == 'm')
4466*fae548d3Szrj 		++*pp;
4467*fae548d3Szrj 	      while (ISDIGIT (**pp))
4468*fae548d3Szrj 		++*pp;
4469*fae548d3Szrj 	      if (**pp == '.')
4470*fae548d3Szrj 		{
4471*fae548d3Szrj 		  ++*pp;
4472*fae548d3Szrj 		  while (ISDIGIT (**pp))
4473*fae548d3Szrj 		    ++*pp;
4474*fae548d3Szrj 		}
4475*fae548d3Szrj 	      if (**pp == 'e')
4476*fae548d3Szrj 		{
4477*fae548d3Szrj 		  ++*pp;
4478*fae548d3Szrj 		  while (ISDIGIT (**pp))
4479*fae548d3Szrj 		    ++*pp;
4480*fae548d3Szrj 		}
4481*fae548d3Szrj 	    }
4482*fae548d3Szrj 	  else if (pointerp)
4483*fae548d3Szrj 	    {
4484*fae548d3Szrj 	      unsigned int len;
4485*fae548d3Szrj 
4486*fae548d3Szrj 	      len = stab_demangle_count (pp);
4487*fae548d3Szrj 	      if (len == 0)
4488*fae548d3Szrj 		{
4489*fae548d3Szrj 		  stab_bad_demangle (orig);
4490*fae548d3Szrj 		  return FALSE;
4491*fae548d3Szrj 		}
4492*fae548d3Szrj 	      *pp += len;
4493*fae548d3Szrj 	    }
4494*fae548d3Szrj 	}
4495*fae548d3Szrj     }
4496*fae548d3Szrj 
4497*fae548d3Szrj   /* We can translate this to a string fairly easily by invoking the
4498*fae548d3Szrj      regular demangling routine.  */
4499*fae548d3Szrj   if (pname != NULL)
4500*fae548d3Szrj     {
4501*fae548d3Szrj       char *s1, *s2, *s3, *s4 = NULL;
4502*fae548d3Szrj       char *from, *to;
4503*fae548d3Szrj 
4504*fae548d3Szrj       s1 = savestring (orig, *pp - orig);
4505*fae548d3Szrj 
4506*fae548d3Szrj       s2 = concat ("NoSuchStrinG__", s1, (const char *) NULL);
4507*fae548d3Szrj 
4508*fae548d3Szrj       free (s1);
4509*fae548d3Szrj 
4510*fae548d3Szrj       s3 = cplus_demangle (s2, demangle_flags);
4511*fae548d3Szrj 
4512*fae548d3Szrj       free (s2);
4513*fae548d3Szrj 
4514*fae548d3Szrj       if (s3 != NULL)
4515*fae548d3Szrj 	s4 = strstr (s3, "::NoSuchStrinG");
4516*fae548d3Szrj       if (s3 == NULL || s4 == NULL)
4517*fae548d3Szrj 	{
4518*fae548d3Szrj 	  stab_bad_demangle (orig);
4519*fae548d3Szrj 	  if (s3 != NULL)
4520*fae548d3Szrj 	    free (s3);
4521*fae548d3Szrj 	  return FALSE;
4522*fae548d3Szrj 	}
4523*fae548d3Szrj 
4524*fae548d3Szrj       /* Eliminating all spaces, except those between > characters,
4525*fae548d3Szrj          makes it more likely that the demangled name will match the
4526*fae548d3Szrj          name which g++ used as the structure name.  */
4527*fae548d3Szrj       for (from = to = s3; from != s4; ++from)
4528*fae548d3Szrj 	if (*from != ' '
4529*fae548d3Szrj 	    || (from[1] == '>' && from > s3 && from[-1] == '>'))
4530*fae548d3Szrj 	  *to++ = *from;
4531*fae548d3Szrj 
4532*fae548d3Szrj       *pname = savestring (s3, to - s3);
4533*fae548d3Szrj 
4534*fae548d3Szrj       free (s3);
4535*fae548d3Szrj     }
4536*fae548d3Szrj 
4537*fae548d3Szrj   return TRUE;
4538*fae548d3Szrj }
4539*fae548d3Szrj 
4540*fae548d3Szrj /* Demangle a class name.  */
4541*fae548d3Szrj 
4542*fae548d3Szrj static bfd_boolean
stab_demangle_class(struct stab_demangle_info * minfo ATTRIBUTE_UNUSED,const char ** pp,const char ** pstart)4543*fae548d3Szrj stab_demangle_class (struct stab_demangle_info *minfo ATTRIBUTE_UNUSED,
4544*fae548d3Szrj 		     const char **pp, const char **pstart)
4545*fae548d3Szrj {
4546*fae548d3Szrj   const char *orig;
4547*fae548d3Szrj   unsigned int n;
4548*fae548d3Szrj 
4549*fae548d3Szrj   orig = *pp;
4550*fae548d3Szrj 
4551*fae548d3Szrj   n = stab_demangle_count (pp);
4552*fae548d3Szrj   if (strlen (*pp) < n)
4553*fae548d3Szrj     {
4554*fae548d3Szrj       stab_bad_demangle (orig);
4555*fae548d3Szrj       return FALSE;
4556*fae548d3Szrj     }
4557*fae548d3Szrj 
4558*fae548d3Szrj   if (pstart != NULL)
4559*fae548d3Szrj     *pstart = *pp;
4560*fae548d3Szrj 
4561*fae548d3Szrj   *pp += n;
4562*fae548d3Szrj 
4563*fae548d3Szrj   return TRUE;
4564*fae548d3Szrj }
4565*fae548d3Szrj 
4566*fae548d3Szrj /* Demangle function arguments.  If the pargs argument is not NULL, it
4567*fae548d3Szrj    is set to a NULL terminated array holding the arguments.  */
4568*fae548d3Szrj 
4569*fae548d3Szrj static bfd_boolean
stab_demangle_args(struct stab_demangle_info * minfo,const char ** pp,debug_type ** pargs,bfd_boolean * pvarargs)4570*fae548d3Szrj stab_demangle_args (struct stab_demangle_info *minfo, const char **pp,
4571*fae548d3Szrj 		    debug_type **pargs, bfd_boolean *pvarargs)
4572*fae548d3Szrj {
4573*fae548d3Szrj   const char *orig;
4574*fae548d3Szrj   unsigned int alloc, count;
4575*fae548d3Szrj 
4576*fae548d3Szrj   orig = *pp;
4577*fae548d3Szrj 
4578*fae548d3Szrj   alloc = 10;
4579*fae548d3Szrj   if (pargs != NULL)
4580*fae548d3Szrj     {
4581*fae548d3Szrj       *pargs = (debug_type *) xmalloc (alloc * sizeof **pargs);
4582*fae548d3Szrj       *pvarargs = FALSE;
4583*fae548d3Szrj     }
4584*fae548d3Szrj   count = 0;
4585*fae548d3Szrj 
4586*fae548d3Szrj   while (**pp != '_' && **pp != '\0' && **pp != 'e')
4587*fae548d3Szrj     {
4588*fae548d3Szrj       if (**pp == 'N' || **pp == 'T')
4589*fae548d3Szrj 	{
4590*fae548d3Szrj 	  char temptype;
4591*fae548d3Szrj 	  unsigned int r, t;
4592*fae548d3Szrj 
4593*fae548d3Szrj 	  temptype = **pp;
4594*fae548d3Szrj 	  ++*pp;
4595*fae548d3Szrj 
4596*fae548d3Szrj 	  if (temptype == 'T')
4597*fae548d3Szrj 	    r = 1;
4598*fae548d3Szrj 	  else
4599*fae548d3Szrj 	    {
4600*fae548d3Szrj 	      if (! stab_demangle_get_count (pp, &r))
4601*fae548d3Szrj 		{
4602*fae548d3Szrj 		  stab_bad_demangle (orig);
4603*fae548d3Szrj 		  return FALSE;
4604*fae548d3Szrj 		}
4605*fae548d3Szrj 	    }
4606*fae548d3Szrj 
4607*fae548d3Szrj 	  if (! stab_demangle_get_count (pp, &t))
4608*fae548d3Szrj 	    {
4609*fae548d3Szrj 	      stab_bad_demangle (orig);
4610*fae548d3Szrj 	      return FALSE;
4611*fae548d3Szrj 	    }
4612*fae548d3Szrj 
4613*fae548d3Szrj 	  if (t >= minfo->typestring_count)
4614*fae548d3Szrj 	    {
4615*fae548d3Szrj 	      stab_bad_demangle (orig);
4616*fae548d3Szrj 	      return FALSE;
4617*fae548d3Szrj 	    }
4618*fae548d3Szrj 	  while (r-- > 0)
4619*fae548d3Szrj 	    {
4620*fae548d3Szrj 	      const char *tem;
4621*fae548d3Szrj 
4622*fae548d3Szrj 	      tem = minfo->typestrings[t].typestring;
4623*fae548d3Szrj 	      if (! stab_demangle_arg (minfo, &tem, pargs, &count, &alloc))
4624*fae548d3Szrj 		return FALSE;
4625*fae548d3Szrj 	    }
4626*fae548d3Szrj 	}
4627*fae548d3Szrj       else
4628*fae548d3Szrj 	{
4629*fae548d3Szrj 	  if (! stab_demangle_arg (minfo, pp, pargs, &count, &alloc))
4630*fae548d3Szrj 	    return FALSE;
4631*fae548d3Szrj 	}
4632*fae548d3Szrj     }
4633*fae548d3Szrj 
4634*fae548d3Szrj   if (pargs != NULL)
4635*fae548d3Szrj     (*pargs)[count] = DEBUG_TYPE_NULL;
4636*fae548d3Szrj 
4637*fae548d3Szrj   if (**pp == 'e')
4638*fae548d3Szrj     {
4639*fae548d3Szrj       if (pargs != NULL)
4640*fae548d3Szrj 	*pvarargs = TRUE;
4641*fae548d3Szrj       ++*pp;
4642*fae548d3Szrj     }
4643*fae548d3Szrj 
4644*fae548d3Szrj   return TRUE;
4645*fae548d3Szrj }
4646*fae548d3Szrj 
4647*fae548d3Szrj /* Demangle a single argument.  */
4648*fae548d3Szrj 
4649*fae548d3Szrj static bfd_boolean
stab_demangle_arg(struct stab_demangle_info * minfo,const char ** pp,debug_type ** pargs,unsigned int * pcount,unsigned int * palloc)4650*fae548d3Szrj stab_demangle_arg (struct stab_demangle_info *minfo, const char **pp,
4651*fae548d3Szrj 		   debug_type **pargs, unsigned int *pcount,
4652*fae548d3Szrj 		   unsigned int *palloc)
4653*fae548d3Szrj {
4654*fae548d3Szrj   const char *start;
4655*fae548d3Szrj   debug_type type;
4656*fae548d3Szrj 
4657*fae548d3Szrj   start = *pp;
4658*fae548d3Szrj   if (! stab_demangle_type (minfo, pp,
4659*fae548d3Szrj 			    pargs == NULL ? (debug_type *) NULL : &type)
4660*fae548d3Szrj       || ! stab_demangle_remember_type (minfo, start, *pp - start))
4661*fae548d3Szrj     return FALSE;
4662*fae548d3Szrj 
4663*fae548d3Szrj   if (pargs != NULL)
4664*fae548d3Szrj     {
4665*fae548d3Szrj       if (type == DEBUG_TYPE_NULL)
4666*fae548d3Szrj 	return FALSE;
4667*fae548d3Szrj 
4668*fae548d3Szrj       if (*pcount + 1 >= *palloc)
4669*fae548d3Szrj 	{
4670*fae548d3Szrj 	  *palloc += 10;
4671*fae548d3Szrj 	  *pargs = ((debug_type *)
4672*fae548d3Szrj 		    xrealloc (*pargs, *palloc * sizeof **pargs));
4673*fae548d3Szrj 	}
4674*fae548d3Szrj       (*pargs)[*pcount] = type;
4675*fae548d3Szrj       ++*pcount;
4676*fae548d3Szrj     }
4677*fae548d3Szrj 
4678*fae548d3Szrj   return TRUE;
4679*fae548d3Szrj }
4680*fae548d3Szrj 
4681*fae548d3Szrj /* Demangle a type.  If the ptype argument is not NULL, *ptype is set
4682*fae548d3Szrj    to the newly allocated type.  */
4683*fae548d3Szrj 
4684*fae548d3Szrj static bfd_boolean
stab_demangle_type(struct stab_demangle_info * minfo,const char ** pp,debug_type * ptype)4685*fae548d3Szrj stab_demangle_type (struct stab_demangle_info *minfo, const char **pp,
4686*fae548d3Szrj 		    debug_type *ptype)
4687*fae548d3Szrj {
4688*fae548d3Szrj   const char *orig;
4689*fae548d3Szrj 
4690*fae548d3Szrj   orig = *pp;
4691*fae548d3Szrj 
4692*fae548d3Szrj   switch (**pp)
4693*fae548d3Szrj     {
4694*fae548d3Szrj     case 'P':
4695*fae548d3Szrj     case 'p':
4696*fae548d3Szrj       /* A pointer type.  */
4697*fae548d3Szrj       ++*pp;
4698*fae548d3Szrj       if (! stab_demangle_type (minfo, pp, ptype))
4699*fae548d3Szrj 	return FALSE;
4700*fae548d3Szrj       if (ptype != NULL)
4701*fae548d3Szrj 	*ptype = debug_make_pointer_type (minfo->dhandle, *ptype);
4702*fae548d3Szrj       break;
4703*fae548d3Szrj 
4704*fae548d3Szrj     case 'R':
4705*fae548d3Szrj       /* A reference type.  */
4706*fae548d3Szrj       ++*pp;
4707*fae548d3Szrj       if (! stab_demangle_type (minfo, pp, ptype))
4708*fae548d3Szrj 	return FALSE;
4709*fae548d3Szrj       if (ptype != NULL)
4710*fae548d3Szrj 	*ptype = debug_make_reference_type (minfo->dhandle, *ptype);
4711*fae548d3Szrj       break;
4712*fae548d3Szrj 
4713*fae548d3Szrj     case 'A':
4714*fae548d3Szrj       /* An array.  */
4715*fae548d3Szrj       {
4716*fae548d3Szrj 	unsigned long high;
4717*fae548d3Szrj 
4718*fae548d3Szrj 	++*pp;
4719*fae548d3Szrj 	high = 0;
4720*fae548d3Szrj 	while (**pp != '\0' && **pp != '_')
4721*fae548d3Szrj 	  {
4722*fae548d3Szrj 	    if (! ISDIGIT (**pp))
4723*fae548d3Szrj 	      {
4724*fae548d3Szrj 		stab_bad_demangle (orig);
4725*fae548d3Szrj 		return FALSE;
4726*fae548d3Szrj 	      }
4727*fae548d3Szrj 	    high *= 10;
4728*fae548d3Szrj 	    high += **pp - '0';
4729*fae548d3Szrj 	    ++*pp;
4730*fae548d3Szrj 	  }
4731*fae548d3Szrj 	if (**pp != '_')
4732*fae548d3Szrj 	  {
4733*fae548d3Szrj 	    stab_bad_demangle (orig);
4734*fae548d3Szrj 	    return FALSE;
4735*fae548d3Szrj 	  }
4736*fae548d3Szrj 	++*pp;
4737*fae548d3Szrj 
4738*fae548d3Szrj 	if (! stab_demangle_type (minfo, pp, ptype))
4739*fae548d3Szrj 	  return FALSE;
4740*fae548d3Szrj 	if (ptype != NULL)
4741*fae548d3Szrj 	  {
4742*fae548d3Szrj 	    debug_type int_type;
4743*fae548d3Szrj 
4744*fae548d3Szrj 	    int_type = debug_find_named_type (minfo->dhandle, "int");
4745*fae548d3Szrj 	    if (int_type == NULL)
4746*fae548d3Szrj 	      int_type = debug_make_int_type (minfo->dhandle, 4, FALSE);
4747*fae548d3Szrj 	    *ptype = debug_make_array_type (minfo->dhandle, *ptype, int_type,
4748*fae548d3Szrj 					    0, high, FALSE);
4749*fae548d3Szrj 	  }
4750*fae548d3Szrj       }
4751*fae548d3Szrj       break;
4752*fae548d3Szrj 
4753*fae548d3Szrj     case 'T':
4754*fae548d3Szrj       /* A back reference to a remembered type.  */
4755*fae548d3Szrj       {
4756*fae548d3Szrj 	unsigned int i;
4757*fae548d3Szrj 	const char *p;
4758*fae548d3Szrj 
4759*fae548d3Szrj 	++*pp;
4760*fae548d3Szrj 	if (! stab_demangle_get_count (pp, &i))
4761*fae548d3Szrj 	  {
4762*fae548d3Szrj 	    stab_bad_demangle (orig);
4763*fae548d3Szrj 	    return FALSE;
4764*fae548d3Szrj 	  }
4765*fae548d3Szrj 	if (i >= minfo->typestring_count)
4766*fae548d3Szrj 	  {
4767*fae548d3Szrj 	    stab_bad_demangle (orig);
4768*fae548d3Szrj 	    return FALSE;
4769*fae548d3Szrj 	  }
4770*fae548d3Szrj 	p = minfo->typestrings[i].typestring;
4771*fae548d3Szrj 	if (! stab_demangle_type (minfo, &p, ptype))
4772*fae548d3Szrj 	  return FALSE;
4773*fae548d3Szrj       }
4774*fae548d3Szrj       break;
4775*fae548d3Szrj 
4776*fae548d3Szrj     case 'F':
4777*fae548d3Szrj       /* A function.  */
4778*fae548d3Szrj       {
4779*fae548d3Szrj 	debug_type *args;
4780*fae548d3Szrj 	bfd_boolean varargs;
4781*fae548d3Szrj 
4782*fae548d3Szrj 	++*pp;
4783*fae548d3Szrj 	if (! stab_demangle_args (minfo, pp,
4784*fae548d3Szrj 				  (ptype == NULL
4785*fae548d3Szrj 				   ? (debug_type **) NULL
4786*fae548d3Szrj 				   : &args),
4787*fae548d3Szrj 				  (ptype == NULL
4788*fae548d3Szrj 				   ? (bfd_boolean *) NULL
4789*fae548d3Szrj 				   : &varargs)))
4790*fae548d3Szrj 	  return FALSE;
4791*fae548d3Szrj 	if (**pp != '_')
4792*fae548d3Szrj 	  {
4793*fae548d3Szrj 	    /* cplus_demangle will accept a function without a return
4794*fae548d3Szrj 	       type, but I don't know when that will happen, or what
4795*fae548d3Szrj 	       to do if it does.  */
4796*fae548d3Szrj 	    stab_bad_demangle (orig);
4797*fae548d3Szrj 	    return FALSE;
4798*fae548d3Szrj 	  }
4799*fae548d3Szrj 	++*pp;
4800*fae548d3Szrj 	if (! stab_demangle_type (minfo, pp, ptype))
4801*fae548d3Szrj 	  return FALSE;
4802*fae548d3Szrj 	if (ptype != NULL)
4803*fae548d3Szrj 	  *ptype = debug_make_function_type (minfo->dhandle, *ptype, args,
4804*fae548d3Szrj 					     varargs);
4805*fae548d3Szrj 
4806*fae548d3Szrj       }
4807*fae548d3Szrj       break;
4808*fae548d3Szrj 
4809*fae548d3Szrj     case 'M':
4810*fae548d3Szrj     case 'O':
4811*fae548d3Szrj       {
4812*fae548d3Szrj 	bfd_boolean memberp;
4813*fae548d3Szrj 	debug_type class_type = DEBUG_TYPE_NULL;
4814*fae548d3Szrj 	debug_type *args;
4815*fae548d3Szrj 	bfd_boolean varargs;
4816*fae548d3Szrj 	unsigned int n;
4817*fae548d3Szrj 	const char *name;
4818*fae548d3Szrj 
4819*fae548d3Szrj 	memberp = **pp == 'M';
4820*fae548d3Szrj 	args = NULL;
4821*fae548d3Szrj 	varargs = FALSE;
4822*fae548d3Szrj 
4823*fae548d3Szrj 	++*pp;
4824*fae548d3Szrj 	if (ISDIGIT (**pp))
4825*fae548d3Szrj 	  {
4826*fae548d3Szrj 	    n = stab_demangle_count (pp);
4827*fae548d3Szrj 	    if (strlen (*pp) < n)
4828*fae548d3Szrj 	      {
4829*fae548d3Szrj 		stab_bad_demangle (orig);
4830*fae548d3Szrj 		return FALSE;
4831*fae548d3Szrj 	      }
4832*fae548d3Szrj 	    name = *pp;
4833*fae548d3Szrj 	    *pp += n;
4834*fae548d3Szrj 
4835*fae548d3Szrj 	    if (ptype != NULL)
4836*fae548d3Szrj 	      {
4837*fae548d3Szrj 		class_type = stab_find_tagged_type (minfo->dhandle,
4838*fae548d3Szrj 						    minfo->info,
4839*fae548d3Szrj 						    name, (int) n,
4840*fae548d3Szrj 						    DEBUG_KIND_CLASS);
4841*fae548d3Szrj 		if (class_type == DEBUG_TYPE_NULL)
4842*fae548d3Szrj 		  return FALSE;
4843*fae548d3Szrj 	      }
4844*fae548d3Szrj 	  }
4845*fae548d3Szrj 	else if (**pp == 'Q')
4846*fae548d3Szrj 	  {
4847*fae548d3Szrj 	    if (! stab_demangle_qualified (minfo, pp,
4848*fae548d3Szrj 					   (ptype == NULL
4849*fae548d3Szrj 					    ? (debug_type *) NULL
4850*fae548d3Szrj 					    : &class_type)))
4851*fae548d3Szrj 	      return FALSE;
4852*fae548d3Szrj 	  }
4853*fae548d3Szrj 	else
4854*fae548d3Szrj 	  {
4855*fae548d3Szrj 	    stab_bad_demangle (orig);
4856*fae548d3Szrj 	    return FALSE;
4857*fae548d3Szrj 	  }
4858*fae548d3Szrj 
4859*fae548d3Szrj 	if (memberp)
4860*fae548d3Szrj 	  {
4861*fae548d3Szrj 	    if (**pp == 'C')
4862*fae548d3Szrj 	      {
4863*fae548d3Szrj 		++*pp;
4864*fae548d3Szrj 	      }
4865*fae548d3Szrj 	    else if (**pp == 'V')
4866*fae548d3Szrj 	      {
4867*fae548d3Szrj 		++*pp;
4868*fae548d3Szrj 	      }
4869*fae548d3Szrj 	    if (**pp != 'F')
4870*fae548d3Szrj 	      {
4871*fae548d3Szrj 		stab_bad_demangle (orig);
4872*fae548d3Szrj 		return FALSE;
4873*fae548d3Szrj 	      }
4874*fae548d3Szrj 	    ++*pp;
4875*fae548d3Szrj 	    if (! stab_demangle_args (minfo, pp,
4876*fae548d3Szrj 				      (ptype == NULL
4877*fae548d3Szrj 				       ? (debug_type **) NULL
4878*fae548d3Szrj 				       : &args),
4879*fae548d3Szrj 				      (ptype == NULL
4880*fae548d3Szrj 				       ? (bfd_boolean *) NULL
4881*fae548d3Szrj 				       : &varargs)))
4882*fae548d3Szrj 	      return FALSE;
4883*fae548d3Szrj 	  }
4884*fae548d3Szrj 
4885*fae548d3Szrj 	if (**pp != '_')
4886*fae548d3Szrj 	  {
4887*fae548d3Szrj 	    stab_bad_demangle (orig);
4888*fae548d3Szrj 	    return FALSE;
4889*fae548d3Szrj 	  }
4890*fae548d3Szrj 	++*pp;
4891*fae548d3Szrj 
4892*fae548d3Szrj 	if (! stab_demangle_type (minfo, pp, ptype))
4893*fae548d3Szrj 	  return FALSE;
4894*fae548d3Szrj 
4895*fae548d3Szrj 	if (ptype != NULL)
4896*fae548d3Szrj 	  {
4897*fae548d3Szrj 	    if (! memberp)
4898*fae548d3Szrj 	      *ptype = debug_make_offset_type (minfo->dhandle, class_type,
4899*fae548d3Szrj 					       *ptype);
4900*fae548d3Szrj 	    else
4901*fae548d3Szrj 	      {
4902*fae548d3Szrj 		/* FIXME: We have no way to record constp or
4903*fae548d3Szrj                    volatilep.  */
4904*fae548d3Szrj 		*ptype = debug_make_method_type (minfo->dhandle, *ptype,
4905*fae548d3Szrj 						 class_type, args, varargs);
4906*fae548d3Szrj 	      }
4907*fae548d3Szrj 	  }
4908*fae548d3Szrj       }
4909*fae548d3Szrj       break;
4910*fae548d3Szrj 
4911*fae548d3Szrj     case 'G':
4912*fae548d3Szrj       ++*pp;
4913*fae548d3Szrj       if (! stab_demangle_type (minfo, pp, ptype))
4914*fae548d3Szrj 	return FALSE;
4915*fae548d3Szrj       break;
4916*fae548d3Szrj 
4917*fae548d3Szrj     case 'C':
4918*fae548d3Szrj       ++*pp;
4919*fae548d3Szrj       if (! stab_demangle_type (minfo, pp, ptype))
4920*fae548d3Szrj 	return FALSE;
4921*fae548d3Szrj       if (ptype != NULL)
4922*fae548d3Szrj 	*ptype = debug_make_const_type (minfo->dhandle, *ptype);
4923*fae548d3Szrj       break;
4924*fae548d3Szrj 
4925*fae548d3Szrj     case 'Q':
4926*fae548d3Szrj       {
4927*fae548d3Szrj 	if (! stab_demangle_qualified (minfo, pp, ptype))
4928*fae548d3Szrj 	  return FALSE;
4929*fae548d3Szrj       }
4930*fae548d3Szrj       break;
4931*fae548d3Szrj 
4932*fae548d3Szrj     default:
4933*fae548d3Szrj       if (! stab_demangle_fund_type (minfo, pp, ptype))
4934*fae548d3Szrj 	return FALSE;
4935*fae548d3Szrj       break;
4936*fae548d3Szrj     }
4937*fae548d3Szrj 
4938*fae548d3Szrj   return TRUE;
4939*fae548d3Szrj }
4940*fae548d3Szrj 
4941*fae548d3Szrj /* Demangle a fundamental type.  If the ptype argument is not NULL,
4942*fae548d3Szrj    *ptype is set to the newly allocated type.  */
4943*fae548d3Szrj 
4944*fae548d3Szrj static bfd_boolean
stab_demangle_fund_type(struct stab_demangle_info * minfo,const char ** pp,debug_type * ptype)4945*fae548d3Szrj stab_demangle_fund_type (struct stab_demangle_info *minfo, const char **pp,
4946*fae548d3Szrj 			 debug_type *ptype)
4947*fae548d3Szrj {
4948*fae548d3Szrj   const char *orig;
4949*fae548d3Szrj   bfd_boolean constp, volatilep, unsignedp, signedp;
4950*fae548d3Szrj   bfd_boolean done;
4951*fae548d3Szrj 
4952*fae548d3Szrj   orig = *pp;
4953*fae548d3Szrj 
4954*fae548d3Szrj   constp = FALSE;
4955*fae548d3Szrj   volatilep = FALSE;
4956*fae548d3Szrj   unsignedp = FALSE;
4957*fae548d3Szrj   signedp = FALSE;
4958*fae548d3Szrj 
4959*fae548d3Szrj   done = FALSE;
4960*fae548d3Szrj   while (! done)
4961*fae548d3Szrj     {
4962*fae548d3Szrj       switch (**pp)
4963*fae548d3Szrj 	{
4964*fae548d3Szrj 	case 'C':
4965*fae548d3Szrj 	  constp = TRUE;
4966*fae548d3Szrj 	  ++*pp;
4967*fae548d3Szrj 	  break;
4968*fae548d3Szrj 
4969*fae548d3Szrj 	case 'U':
4970*fae548d3Szrj 	  unsignedp = TRUE;
4971*fae548d3Szrj 	  ++*pp;
4972*fae548d3Szrj 	  break;
4973*fae548d3Szrj 
4974*fae548d3Szrj 	case 'S':
4975*fae548d3Szrj 	  signedp = TRUE;
4976*fae548d3Szrj 	  ++*pp;
4977*fae548d3Szrj 	  break;
4978*fae548d3Szrj 
4979*fae548d3Szrj 	case 'V':
4980*fae548d3Szrj 	  volatilep = TRUE;
4981*fae548d3Szrj 	  ++*pp;
4982*fae548d3Szrj 	  break;
4983*fae548d3Szrj 
4984*fae548d3Szrj 	default:
4985*fae548d3Szrj 	  done = TRUE;
4986*fae548d3Szrj 	  break;
4987*fae548d3Szrj 	}
4988*fae548d3Szrj     }
4989*fae548d3Szrj 
4990*fae548d3Szrj   switch (**pp)
4991*fae548d3Szrj     {
4992*fae548d3Szrj     case '\0':
4993*fae548d3Szrj     case '_':
4994*fae548d3Szrj       /* cplus_demangle permits this, but I don't know what it means.  */
4995*fae548d3Szrj       stab_bad_demangle (orig);
4996*fae548d3Szrj       break;
4997*fae548d3Szrj 
4998*fae548d3Szrj     case 'v': /* void */
4999*fae548d3Szrj       if (ptype != NULL)
5000*fae548d3Szrj 	{
5001*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle, "void");
5002*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5003*fae548d3Szrj 	    *ptype = debug_make_void_type (minfo->dhandle);
5004*fae548d3Szrj 	}
5005*fae548d3Szrj       ++*pp;
5006*fae548d3Szrj       break;
5007*fae548d3Szrj 
5008*fae548d3Szrj     case 'x': /* long long */
5009*fae548d3Szrj       if (ptype != NULL)
5010*fae548d3Szrj 	{
5011*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle,
5012*fae548d3Szrj 					  (unsignedp
5013*fae548d3Szrj 					   ? "long long unsigned int"
5014*fae548d3Szrj 					   : "long long int"));
5015*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5016*fae548d3Szrj 	    *ptype = debug_make_int_type (minfo->dhandle, 8, unsignedp);
5017*fae548d3Szrj 	}
5018*fae548d3Szrj       ++*pp;
5019*fae548d3Szrj       break;
5020*fae548d3Szrj 
5021*fae548d3Szrj     case 'l': /* long */
5022*fae548d3Szrj       if (ptype != NULL)
5023*fae548d3Szrj 	{
5024*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle,
5025*fae548d3Szrj 					  (unsignedp
5026*fae548d3Szrj 					   ? "long unsigned int"
5027*fae548d3Szrj 					   : "long int"));
5028*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5029*fae548d3Szrj 	    *ptype = debug_make_int_type (minfo->dhandle, 4, unsignedp);
5030*fae548d3Szrj 	}
5031*fae548d3Szrj       ++*pp;
5032*fae548d3Szrj       break;
5033*fae548d3Szrj 
5034*fae548d3Szrj     case 'i': /* int */
5035*fae548d3Szrj       if (ptype != NULL)
5036*fae548d3Szrj 	{
5037*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle,
5038*fae548d3Szrj 					  (unsignedp
5039*fae548d3Szrj 					   ? "unsigned int"
5040*fae548d3Szrj 					   : "int"));
5041*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5042*fae548d3Szrj 	    *ptype = debug_make_int_type (minfo->dhandle, 4, unsignedp);
5043*fae548d3Szrj 	}
5044*fae548d3Szrj       ++*pp;
5045*fae548d3Szrj       break;
5046*fae548d3Szrj 
5047*fae548d3Szrj     case 's': /* short */
5048*fae548d3Szrj       if (ptype != NULL)
5049*fae548d3Szrj 	{
5050*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle,
5051*fae548d3Szrj 					  (unsignedp
5052*fae548d3Szrj 					   ? "short unsigned int"
5053*fae548d3Szrj 					   : "short int"));
5054*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5055*fae548d3Szrj 	    *ptype = debug_make_int_type (minfo->dhandle, 2, unsignedp);
5056*fae548d3Szrj 	}
5057*fae548d3Szrj       ++*pp;
5058*fae548d3Szrj       break;
5059*fae548d3Szrj 
5060*fae548d3Szrj     case 'b': /* bool */
5061*fae548d3Szrj       if (ptype != NULL)
5062*fae548d3Szrj 	{
5063*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle, "bool");
5064*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5065*fae548d3Szrj 	    *ptype = debug_make_bool_type (minfo->dhandle, 4);
5066*fae548d3Szrj 	}
5067*fae548d3Szrj       ++*pp;
5068*fae548d3Szrj       break;
5069*fae548d3Szrj 
5070*fae548d3Szrj     case 'c': /* char */
5071*fae548d3Szrj       if (ptype != NULL)
5072*fae548d3Szrj 	{
5073*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle,
5074*fae548d3Szrj 					  (unsignedp
5075*fae548d3Szrj 					   ? "unsigned char"
5076*fae548d3Szrj 					   : (signedp
5077*fae548d3Szrj 					      ? "signed char"
5078*fae548d3Szrj 					      : "char")));
5079*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5080*fae548d3Szrj 	    *ptype = debug_make_int_type (minfo->dhandle, 1, unsignedp);
5081*fae548d3Szrj 	}
5082*fae548d3Szrj       ++*pp;
5083*fae548d3Szrj       break;
5084*fae548d3Szrj 
5085*fae548d3Szrj     case 'w': /* wchar_t */
5086*fae548d3Szrj       if (ptype != NULL)
5087*fae548d3Szrj 	{
5088*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle, "__wchar_t");
5089*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5090*fae548d3Szrj 	    *ptype = debug_make_int_type (minfo->dhandle, 2, TRUE);
5091*fae548d3Szrj 	}
5092*fae548d3Szrj       ++*pp;
5093*fae548d3Szrj       break;
5094*fae548d3Szrj 
5095*fae548d3Szrj     case 'r': /* long double */
5096*fae548d3Szrj       if (ptype != NULL)
5097*fae548d3Szrj 	{
5098*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle, "long double");
5099*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5100*fae548d3Szrj 	    *ptype = debug_make_float_type (minfo->dhandle, 8);
5101*fae548d3Szrj 	}
5102*fae548d3Szrj       ++*pp;
5103*fae548d3Szrj       break;
5104*fae548d3Szrj 
5105*fae548d3Szrj     case 'd': /* double */
5106*fae548d3Szrj       if (ptype != NULL)
5107*fae548d3Szrj 	{
5108*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle, "double");
5109*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5110*fae548d3Szrj 	    *ptype = debug_make_float_type (minfo->dhandle, 8);
5111*fae548d3Szrj 	}
5112*fae548d3Szrj       ++*pp;
5113*fae548d3Szrj       break;
5114*fae548d3Szrj 
5115*fae548d3Szrj     case 'f': /* float */
5116*fae548d3Szrj       if (ptype != NULL)
5117*fae548d3Szrj 	{
5118*fae548d3Szrj 	  *ptype = debug_find_named_type (minfo->dhandle, "float");
5119*fae548d3Szrj 	  if (*ptype == DEBUG_TYPE_NULL)
5120*fae548d3Szrj 	    *ptype = debug_make_float_type (minfo->dhandle, 4);
5121*fae548d3Szrj 	}
5122*fae548d3Szrj       ++*pp;
5123*fae548d3Szrj       break;
5124*fae548d3Szrj 
5125*fae548d3Szrj     case 'G':
5126*fae548d3Szrj       ++*pp;
5127*fae548d3Szrj       if (! ISDIGIT (**pp))
5128*fae548d3Szrj 	{
5129*fae548d3Szrj 	  stab_bad_demangle (orig);
5130*fae548d3Szrj 	  return FALSE;
5131*fae548d3Szrj 	}
5132*fae548d3Szrj       /* Fall through.  */
5133*fae548d3Szrj     case '0': case '1': case '2': case '3': case '4':
5134*fae548d3Szrj     case '5': case '6': case '7': case '8': case '9':
5135*fae548d3Szrj       {
5136*fae548d3Szrj 	const char *hold;
5137*fae548d3Szrj 
5138*fae548d3Szrj 	if (! stab_demangle_class (minfo, pp, &hold))
5139*fae548d3Szrj 	  return FALSE;
5140*fae548d3Szrj 	if (ptype != NULL)
5141*fae548d3Szrj 	  {
5142*fae548d3Szrj 	    char *name;
5143*fae548d3Szrj 
5144*fae548d3Szrj 	    name = savestring (hold, *pp - hold);
5145*fae548d3Szrj 	    *ptype = debug_find_named_type (minfo->dhandle, name);
5146*fae548d3Szrj 	    free (name);
5147*fae548d3Szrj 	    if (*ptype == DEBUG_TYPE_NULL)
5148*fae548d3Szrj 	      {
5149*fae548d3Szrj 		/* FIXME: It is probably incorrect to assume that
5150*fae548d3Szrj                    undefined types are tagged types.  */
5151*fae548d3Szrj 		*ptype = stab_find_tagged_type (minfo->dhandle, minfo->info,
5152*fae548d3Szrj 						hold, *pp - hold,
5153*fae548d3Szrj 						DEBUG_KIND_ILLEGAL);
5154*fae548d3Szrj 		if (*ptype == DEBUG_TYPE_NULL)
5155*fae548d3Szrj 		  return FALSE;
5156*fae548d3Szrj 	      }
5157*fae548d3Szrj 	  }
5158*fae548d3Szrj       }
5159*fae548d3Szrj       break;
5160*fae548d3Szrj 
5161*fae548d3Szrj     case 't':
5162*fae548d3Szrj       {
5163*fae548d3Szrj 	char *name;
5164*fae548d3Szrj 
5165*fae548d3Szrj 	if (! stab_demangle_template (minfo, pp,
5166*fae548d3Szrj 				      ptype != NULL ? &name : NULL))
5167*fae548d3Szrj 	  return FALSE;
5168*fae548d3Szrj 	if (ptype != NULL)
5169*fae548d3Szrj 	  {
5170*fae548d3Szrj 	    *ptype = stab_find_tagged_type (minfo->dhandle, minfo->info,
5171*fae548d3Szrj 					    name, strlen (name),
5172*fae548d3Szrj 					    DEBUG_KIND_CLASS);
5173*fae548d3Szrj 	    free (name);
5174*fae548d3Szrj 	    if (*ptype == DEBUG_TYPE_NULL)
5175*fae548d3Szrj 	      return FALSE;
5176*fae548d3Szrj 	  }
5177*fae548d3Szrj       }
5178*fae548d3Szrj       break;
5179*fae548d3Szrj 
5180*fae548d3Szrj     default:
5181*fae548d3Szrj       stab_bad_demangle (orig);
5182*fae548d3Szrj       return FALSE;
5183*fae548d3Szrj     }
5184*fae548d3Szrj 
5185*fae548d3Szrj   if (ptype != NULL)
5186*fae548d3Szrj     {
5187*fae548d3Szrj       if (constp)
5188*fae548d3Szrj 	*ptype = debug_make_const_type (minfo->dhandle, *ptype);
5189*fae548d3Szrj       if (volatilep)
5190*fae548d3Szrj 	*ptype = debug_make_volatile_type (minfo->dhandle, *ptype);
5191*fae548d3Szrj     }
5192*fae548d3Szrj 
5193*fae548d3Szrj   return TRUE;
5194*fae548d3Szrj }
5195*fae548d3Szrj 
5196*fae548d3Szrj /* Remember a type string in a demangled string.  */
5197*fae548d3Szrj 
5198*fae548d3Szrj static bfd_boolean
stab_demangle_remember_type(struct stab_demangle_info * minfo,const char * p,int len)5199*fae548d3Szrj stab_demangle_remember_type (struct stab_demangle_info *minfo,
5200*fae548d3Szrj 			     const char *p, int len)
5201*fae548d3Szrj {
5202*fae548d3Szrj   if (minfo->typestring_count >= minfo->typestring_alloc)
5203*fae548d3Szrj     {
5204*fae548d3Szrj       minfo->typestring_alloc += 10;
5205*fae548d3Szrj       minfo->typestrings = ((struct stab_demangle_typestring *)
5206*fae548d3Szrj 			    xrealloc (minfo->typestrings,
5207*fae548d3Szrj 				      (minfo->typestring_alloc
5208*fae548d3Szrj 				       * sizeof *minfo->typestrings)));
5209*fae548d3Szrj     }
5210*fae548d3Szrj 
5211*fae548d3Szrj   minfo->typestrings[minfo->typestring_count].typestring = p;
5212*fae548d3Szrj   minfo->typestrings[minfo->typestring_count].len = (unsigned int) len;
5213*fae548d3Szrj   ++minfo->typestring_count;
5214*fae548d3Szrj 
5215*fae548d3Szrj   return TRUE;
5216*fae548d3Szrj }
5217*fae548d3Szrj 
5218*fae548d3Szrj /* Demangle names encoded using the g++ V3 ABI.  The newer versions of
5219*fae548d3Szrj    g++ which use this ABI do not encode ordinary method argument types
5220*fae548d3Szrj    in a mangled name; they simply output the argument types.  However,
5221*fae548d3Szrj    for a static method, g++ simply outputs the return type and the
5222*fae548d3Szrj    physical name.  So in that case we need to demangle the name here.
5223*fae548d3Szrj    Here PHYSNAME is the physical name of the function, and we set the
5224*fae548d3Szrj    variable pointed at by PVARARGS to indicate whether this function
5225*fae548d3Szrj    is varargs.  This returns NULL, or a NULL terminated array of
5226*fae548d3Szrj    argument types.  */
5227*fae548d3Szrj 
5228*fae548d3Szrj static debug_type *
stab_demangle_v3_argtypes(void * dhandle,struct stab_handle * info,const char * physname,bfd_boolean * pvarargs)5229*fae548d3Szrj stab_demangle_v3_argtypes (void *dhandle, struct stab_handle *info,
5230*fae548d3Szrj 			   const char *physname, bfd_boolean *pvarargs)
5231*fae548d3Szrj {
5232*fae548d3Szrj   struct demangle_component *dc;
5233*fae548d3Szrj   void *mem;
5234*fae548d3Szrj   debug_type *pargs;
5235*fae548d3Szrj 
5236*fae548d3Szrj   dc = cplus_demangle_v3_components (physname, DMGL_PARAMS | demangle_flags, &mem);
5237*fae548d3Szrj   if (dc == NULL)
5238*fae548d3Szrj     {
5239*fae548d3Szrj       stab_bad_demangle (physname);
5240*fae548d3Szrj       return NULL;
5241*fae548d3Szrj     }
5242*fae548d3Szrj 
5243*fae548d3Szrj   /* We expect to see TYPED_NAME, and the right subtree describes the
5244*fae548d3Szrj      function type.  */
5245*fae548d3Szrj   if (dc->type != DEMANGLE_COMPONENT_TYPED_NAME
5246*fae548d3Szrj       || dc->u.s_binary.right->type != DEMANGLE_COMPONENT_FUNCTION_TYPE)
5247*fae548d3Szrj     {
5248*fae548d3Szrj       fprintf (stderr, _("Demangled name is not a function\n"));
5249*fae548d3Szrj       free (mem);
5250*fae548d3Szrj       return NULL;
5251*fae548d3Szrj     }
5252*fae548d3Szrj 
5253*fae548d3Szrj   pargs = stab_demangle_v3_arglist (dhandle, info,
5254*fae548d3Szrj 				    dc->u.s_binary.right->u.s_binary.right,
5255*fae548d3Szrj 				    pvarargs);
5256*fae548d3Szrj 
5257*fae548d3Szrj   free (mem);
5258*fae548d3Szrj 
5259*fae548d3Szrj   return pargs;
5260*fae548d3Szrj }
5261*fae548d3Szrj 
5262*fae548d3Szrj /* Demangle an argument list in a struct demangle_component tree.
5263*fae548d3Szrj    Returns a DEBUG_TYPE_NULL terminated array of argument types, and
5264*fae548d3Szrj    sets *PVARARGS to indicate whether this is a varargs function.  */
5265*fae548d3Szrj 
5266*fae548d3Szrj static debug_type *
stab_demangle_v3_arglist(void * dhandle,struct stab_handle * info,struct demangle_component * arglist,bfd_boolean * pvarargs)5267*fae548d3Szrj stab_demangle_v3_arglist (void *dhandle, struct stab_handle *info,
5268*fae548d3Szrj 			  struct demangle_component *arglist,
5269*fae548d3Szrj 			  bfd_boolean *pvarargs)
5270*fae548d3Szrj {
5271*fae548d3Szrj   struct demangle_component *dc;
5272*fae548d3Szrj   unsigned int alloc, count;
5273*fae548d3Szrj   debug_type *pargs;
5274*fae548d3Szrj 
5275*fae548d3Szrj   alloc = 10;
5276*fae548d3Szrj   pargs = (debug_type *) xmalloc (alloc * sizeof *pargs);
5277*fae548d3Szrj   *pvarargs = FALSE;
5278*fae548d3Szrj 
5279*fae548d3Szrj   count = 0;
5280*fae548d3Szrj 
5281*fae548d3Szrj   for (dc = arglist;
5282*fae548d3Szrj        dc != NULL;
5283*fae548d3Szrj        dc = dc->u.s_binary.right)
5284*fae548d3Szrj     {
5285*fae548d3Szrj       debug_type arg;
5286*fae548d3Szrj       bfd_boolean varargs;
5287*fae548d3Szrj 
5288*fae548d3Szrj       if (dc->type != DEMANGLE_COMPONENT_ARGLIST)
5289*fae548d3Szrj 	{
5290*fae548d3Szrj 	  fprintf (stderr, _("Unexpected type in v3 arglist demangling\n"));
5291*fae548d3Szrj 	  free (pargs);
5292*fae548d3Szrj 	  return NULL;
5293*fae548d3Szrj 	}
5294*fae548d3Szrj 
5295*fae548d3Szrj       /* PR 13925: Cope if the demangler returns an empty
5296*fae548d3Szrj 	 context for a function with no arguments.  */
5297*fae548d3Szrj       if (dc->u.s_binary.left == NULL)
5298*fae548d3Szrj 	break;
5299*fae548d3Szrj 
5300*fae548d3Szrj       arg = stab_demangle_v3_arg (dhandle, info, dc->u.s_binary.left,
5301*fae548d3Szrj 				  NULL, &varargs);
5302*fae548d3Szrj       if (arg == NULL)
5303*fae548d3Szrj 	{
5304*fae548d3Szrj 	  if (varargs)
5305*fae548d3Szrj 	    {
5306*fae548d3Szrj 	      *pvarargs = TRUE;
5307*fae548d3Szrj 	      continue;
5308*fae548d3Szrj 	    }
5309*fae548d3Szrj 	  free (pargs);
5310*fae548d3Szrj 	  return NULL;
5311*fae548d3Szrj 	}
5312*fae548d3Szrj 
5313*fae548d3Szrj       if (count + 1 >= alloc)
5314*fae548d3Szrj 	{
5315*fae548d3Szrj 	  alloc += 10;
5316*fae548d3Szrj 	  pargs = (debug_type *) xrealloc (pargs, alloc * sizeof *pargs);
5317*fae548d3Szrj 	}
5318*fae548d3Szrj 
5319*fae548d3Szrj       pargs[count] = arg;
5320*fae548d3Szrj       ++count;
5321*fae548d3Szrj     }
5322*fae548d3Szrj 
5323*fae548d3Szrj   pargs[count] = DEBUG_TYPE_NULL;
5324*fae548d3Szrj 
5325*fae548d3Szrj   return pargs;
5326*fae548d3Szrj }
5327*fae548d3Szrj 
5328*fae548d3Szrj /* Convert a struct demangle_component tree describing an argument
5329*fae548d3Szrj    type into a debug_type.  */
5330*fae548d3Szrj 
5331*fae548d3Szrj static debug_type
stab_demangle_v3_arg(void * dhandle,struct stab_handle * info,struct demangle_component * dc,debug_type context,bfd_boolean * pvarargs)5332*fae548d3Szrj stab_demangle_v3_arg (void *dhandle, struct stab_handle *info,
5333*fae548d3Szrj 		      struct demangle_component *dc, debug_type context,
5334*fae548d3Szrj 		      bfd_boolean *pvarargs)
5335*fae548d3Szrj {
5336*fae548d3Szrj   debug_type dt;
5337*fae548d3Szrj 
5338*fae548d3Szrj   if (pvarargs != NULL)
5339*fae548d3Szrj     *pvarargs = FALSE;
5340*fae548d3Szrj 
5341*fae548d3Szrj   switch (dc->type)
5342*fae548d3Szrj     {
5343*fae548d3Szrj       /* FIXME: These are demangle component types which we probably
5344*fae548d3Szrj 	 need to handle one way or another.  */
5345*fae548d3Szrj     case DEMANGLE_COMPONENT_LOCAL_NAME:
5346*fae548d3Szrj     case DEMANGLE_COMPONENT_TYPED_NAME:
5347*fae548d3Szrj     case DEMANGLE_COMPONENT_TEMPLATE_PARAM:
5348*fae548d3Szrj     case DEMANGLE_COMPONENT_CTOR:
5349*fae548d3Szrj     case DEMANGLE_COMPONENT_DTOR:
5350*fae548d3Szrj     case DEMANGLE_COMPONENT_JAVA_CLASS:
5351*fae548d3Szrj     case DEMANGLE_COMPONENT_RESTRICT_THIS:
5352*fae548d3Szrj     case DEMANGLE_COMPONENT_VOLATILE_THIS:
5353*fae548d3Szrj     case DEMANGLE_COMPONENT_CONST_THIS:
5354*fae548d3Szrj     case DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL:
5355*fae548d3Szrj     case DEMANGLE_COMPONENT_COMPLEX:
5356*fae548d3Szrj     case DEMANGLE_COMPONENT_IMAGINARY:
5357*fae548d3Szrj     case DEMANGLE_COMPONENT_VENDOR_TYPE:
5358*fae548d3Szrj     case DEMANGLE_COMPONENT_ARRAY_TYPE:
5359*fae548d3Szrj     case DEMANGLE_COMPONENT_PTRMEM_TYPE:
5360*fae548d3Szrj     case DEMANGLE_COMPONENT_ARGLIST:
5361*fae548d3Szrj     default:
5362*fae548d3Szrj       fprintf (stderr, _("Unrecognized demangle component %d\n"),
5363*fae548d3Szrj 	       (int) dc->type);
5364*fae548d3Szrj       return NULL;
5365*fae548d3Szrj 
5366*fae548d3Szrj     case DEMANGLE_COMPONENT_NAME:
5367*fae548d3Szrj       if (context != NULL)
5368*fae548d3Szrj 	{
5369*fae548d3Szrj 	  const debug_field *fields;
5370*fae548d3Szrj 
5371*fae548d3Szrj 	  fields = debug_get_fields (dhandle, context);
5372*fae548d3Szrj 	  if (fields != NULL)
5373*fae548d3Szrj 	    {
5374*fae548d3Szrj 	      /* Try to find this type by looking through the context
5375*fae548d3Szrj 		 class.  */
5376*fae548d3Szrj 	      for (; *fields != DEBUG_FIELD_NULL; fields++)
5377*fae548d3Szrj 		{
5378*fae548d3Szrj 		  debug_type ft;
5379*fae548d3Szrj 		  const char *dn;
5380*fae548d3Szrj 
5381*fae548d3Szrj 		  ft = debug_get_field_type (dhandle, *fields);
5382*fae548d3Szrj 		  if (ft == NULL)
5383*fae548d3Szrj 		    return NULL;
5384*fae548d3Szrj 		  dn = debug_get_type_name (dhandle, ft);
5385*fae548d3Szrj 		  if (dn != NULL
5386*fae548d3Szrj 		      && (int) strlen (dn) == dc->u.s_name.len
5387*fae548d3Szrj 		      && strncmp (dn, dc->u.s_name.s, dc->u.s_name.len) == 0)
5388*fae548d3Szrj 		    return ft;
5389*fae548d3Szrj 		}
5390*fae548d3Szrj 	    }
5391*fae548d3Szrj 	}
5392*fae548d3Szrj       return stab_find_tagged_type (dhandle, info, dc->u.s_name.s,
5393*fae548d3Szrj 				    dc->u.s_name.len, DEBUG_KIND_ILLEGAL);
5394*fae548d3Szrj 
5395*fae548d3Szrj     case DEMANGLE_COMPONENT_QUAL_NAME:
5396*fae548d3Szrj       context = stab_demangle_v3_arg (dhandle, info, dc->u.s_binary.left,
5397*fae548d3Szrj 				      context, NULL);
5398*fae548d3Szrj       if (context == NULL)
5399*fae548d3Szrj 	return NULL;
5400*fae548d3Szrj       return stab_demangle_v3_arg (dhandle, info, dc->u.s_binary.right,
5401*fae548d3Szrj 				   context, NULL);
5402*fae548d3Szrj 
5403*fae548d3Szrj     case DEMANGLE_COMPONENT_TEMPLATE:
5404*fae548d3Szrj       {
5405*fae548d3Szrj 	char *p;
5406*fae548d3Szrj 	size_t alc;
5407*fae548d3Szrj 
5408*fae548d3Szrj 	/* We print this component to get a class name which we can
5409*fae548d3Szrj 	   use.  FIXME: This probably won't work if the template uses
5410*fae548d3Szrj 	   template parameters which refer to an outer template.  */
5411*fae548d3Szrj 	p = cplus_demangle_print (DMGL_PARAMS | demangle_flags, dc, 20, &alc);
5412*fae548d3Szrj 	if (p == NULL)
5413*fae548d3Szrj 	  {
5414*fae548d3Szrj 	    fprintf (stderr, _("Failed to print demangled template\n"));
5415*fae548d3Szrj 	    return NULL;
5416*fae548d3Szrj 	  }
5417*fae548d3Szrj 	dt = stab_find_tagged_type (dhandle, info, p, strlen (p),
5418*fae548d3Szrj 				    DEBUG_KIND_CLASS);
5419*fae548d3Szrj 	free (p);
5420*fae548d3Szrj 	return dt;
5421*fae548d3Szrj       }
5422*fae548d3Szrj 
5423*fae548d3Szrj     case DEMANGLE_COMPONENT_SUB_STD:
5424*fae548d3Szrj       return stab_find_tagged_type (dhandle, info, dc->u.s_string.string,
5425*fae548d3Szrj 				    dc->u.s_string.len, DEBUG_KIND_ILLEGAL);
5426*fae548d3Szrj 
5427*fae548d3Szrj     case DEMANGLE_COMPONENT_RESTRICT:
5428*fae548d3Szrj     case DEMANGLE_COMPONENT_VOLATILE:
5429*fae548d3Szrj     case DEMANGLE_COMPONENT_CONST:
5430*fae548d3Szrj     case DEMANGLE_COMPONENT_POINTER:
5431*fae548d3Szrj     case DEMANGLE_COMPONENT_REFERENCE:
5432*fae548d3Szrj       dt = stab_demangle_v3_arg (dhandle, info, dc->u.s_binary.left, NULL,
5433*fae548d3Szrj 				 NULL);
5434*fae548d3Szrj       if (dt == NULL)
5435*fae548d3Szrj 	return NULL;
5436*fae548d3Szrj 
5437*fae548d3Szrj       switch (dc->type)
5438*fae548d3Szrj 	{
5439*fae548d3Szrj 	default:
5440*fae548d3Szrj 	  abort ();
5441*fae548d3Szrj 	case DEMANGLE_COMPONENT_RESTRICT:
5442*fae548d3Szrj 	  /* FIXME: We have no way to represent restrict.  */
5443*fae548d3Szrj 	  return dt;
5444*fae548d3Szrj 	case DEMANGLE_COMPONENT_VOLATILE:
5445*fae548d3Szrj 	  return debug_make_volatile_type (dhandle, dt);
5446*fae548d3Szrj 	case DEMANGLE_COMPONENT_CONST:
5447*fae548d3Szrj 	  return debug_make_const_type (dhandle, dt);
5448*fae548d3Szrj 	case DEMANGLE_COMPONENT_POINTER:
5449*fae548d3Szrj 	  return debug_make_pointer_type (dhandle, dt);
5450*fae548d3Szrj 	case DEMANGLE_COMPONENT_REFERENCE:
5451*fae548d3Szrj 	  return debug_make_reference_type (dhandle, dt);
5452*fae548d3Szrj 	}
5453*fae548d3Szrj 
5454*fae548d3Szrj     case DEMANGLE_COMPONENT_FUNCTION_TYPE:
5455*fae548d3Szrj       {
5456*fae548d3Szrj 	debug_type *pargs;
5457*fae548d3Szrj 	bfd_boolean varargs;
5458*fae548d3Szrj 
5459*fae548d3Szrj 	if (dc->u.s_binary.left == NULL)
5460*fae548d3Szrj 	  {
5461*fae548d3Szrj 	    /* In this case the return type is actually unknown.
5462*fae548d3Szrj 	       However, I'm not sure this will ever arise in practice;
5463*fae548d3Szrj 	       normally an unknown return type would only appear at
5464*fae548d3Szrj 	       the top level, which is handled above.  */
5465*fae548d3Szrj 	    dt = debug_make_void_type (dhandle);
5466*fae548d3Szrj 	  }
5467*fae548d3Szrj 	else
5468*fae548d3Szrj 	  dt = stab_demangle_v3_arg (dhandle, info, dc->u.s_binary.left, NULL,
5469*fae548d3Szrj 				     NULL);
5470*fae548d3Szrj 	if (dt == NULL)
5471*fae548d3Szrj 	  return NULL;
5472*fae548d3Szrj 
5473*fae548d3Szrj 	pargs = stab_demangle_v3_arglist (dhandle, info,
5474*fae548d3Szrj 					  dc->u.s_binary.right,
5475*fae548d3Szrj 					  &varargs);
5476*fae548d3Szrj 	if (pargs == NULL)
5477*fae548d3Szrj 	  return NULL;
5478*fae548d3Szrj 
5479*fae548d3Szrj 	return debug_make_function_type (dhandle, dt, pargs, varargs);
5480*fae548d3Szrj       }
5481*fae548d3Szrj 
5482*fae548d3Szrj     case DEMANGLE_COMPONENT_BUILTIN_TYPE:
5483*fae548d3Szrj       {
5484*fae548d3Szrj 	char *p;
5485*fae548d3Szrj 	size_t alc;
5486*fae548d3Szrj 	debug_type ret;
5487*fae548d3Szrj 
5488*fae548d3Szrj 	/* We print this component in order to find out the type name.
5489*fae548d3Szrj 	   FIXME: Should we instead expose the
5490*fae548d3Szrj 	   demangle_builtin_type_info structure?  */
5491*fae548d3Szrj 	p = cplus_demangle_print (DMGL_PARAMS | demangle_flags, dc, 20, &alc);
5492*fae548d3Szrj 	if (p == NULL)
5493*fae548d3Szrj 	  {
5494*fae548d3Szrj 	    fprintf (stderr, _("Couldn't get demangled builtin type\n"));
5495*fae548d3Szrj 	    return NULL;
5496*fae548d3Szrj 	  }
5497*fae548d3Szrj 
5498*fae548d3Szrj 	/* The mangling is based on the type, but does not itself
5499*fae548d3Szrj 	   indicate what the sizes are.  So we have to guess.  */
5500*fae548d3Szrj 	if (strcmp (p, "signed char") == 0)
5501*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 1, FALSE);
5502*fae548d3Szrj 	else if (strcmp (p, "bool") == 0)
5503*fae548d3Szrj 	  ret = debug_make_bool_type (dhandle, 1);
5504*fae548d3Szrj 	else if (strcmp (p, "char") == 0)
5505*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 1, FALSE);
5506*fae548d3Szrj 	else if (strcmp (p, "double") == 0)
5507*fae548d3Szrj 	  ret = debug_make_float_type (dhandle, 8);
5508*fae548d3Szrj 	else if (strcmp (p, "long double") == 0)
5509*fae548d3Szrj 	  ret = debug_make_float_type (dhandle, 8);
5510*fae548d3Szrj 	else if (strcmp (p, "float") == 0)
5511*fae548d3Szrj 	  ret = debug_make_float_type (dhandle, 4);
5512*fae548d3Szrj 	else if (strcmp (p, "__float128") == 0)
5513*fae548d3Szrj 	  ret = debug_make_float_type (dhandle, 16);
5514*fae548d3Szrj 	else if (strcmp (p, "unsigned char") == 0)
5515*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 1, TRUE);
5516*fae548d3Szrj 	else if (strcmp (p, "int") == 0)
5517*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 4, FALSE);
5518*fae548d3Szrj 	else if (strcmp (p, "unsigned int") == 0)
5519*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 4, TRUE);
5520*fae548d3Szrj 	else if (strcmp (p, "long") == 0)
5521*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 4, FALSE);
5522*fae548d3Szrj 	else if (strcmp (p, "unsigned long") == 0)
5523*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 4, TRUE);
5524*fae548d3Szrj 	else if (strcmp (p, "__int128") == 0)
5525*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 16, FALSE);
5526*fae548d3Szrj 	else if (strcmp (p, "unsigned __int128") == 0)
5527*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 16, TRUE);
5528*fae548d3Szrj 	else if (strcmp (p, "short") == 0)
5529*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 2, FALSE);
5530*fae548d3Szrj 	else if (strcmp (p, "unsigned short") == 0)
5531*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 2, TRUE);
5532*fae548d3Szrj 	else if (strcmp (p, "void") == 0)
5533*fae548d3Szrj 	  ret = debug_make_void_type (dhandle);
5534*fae548d3Szrj 	else if (strcmp (p, "wchar_t") == 0)
5535*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 4, TRUE);
5536*fae548d3Szrj 	else if (strcmp (p, "long long") == 0)
5537*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 8, FALSE);
5538*fae548d3Szrj 	else if (strcmp (p, "unsigned long long") == 0)
5539*fae548d3Szrj 	  ret = debug_make_int_type (dhandle, 8, TRUE);
5540*fae548d3Szrj 	else if (strcmp (p, "...") == 0)
5541*fae548d3Szrj 	  {
5542*fae548d3Szrj 	    if (pvarargs == NULL)
5543*fae548d3Szrj 	      fprintf (stderr, _("Unexpected demangled varargs\n"));
5544*fae548d3Szrj 	    else
5545*fae548d3Szrj 	      *pvarargs = TRUE;
5546*fae548d3Szrj 	    ret = NULL;
5547*fae548d3Szrj 	  }
5548*fae548d3Szrj 	else
5549*fae548d3Szrj 	  {
5550*fae548d3Szrj 	    fprintf (stderr, _("Unrecognized demangled builtin type\n"));
5551*fae548d3Szrj 	    ret = NULL;
5552*fae548d3Szrj 	  }
5553*fae548d3Szrj 
5554*fae548d3Szrj 	free (p);
5555*fae548d3Szrj 
5556*fae548d3Szrj 	return ret;
5557*fae548d3Szrj       }
5558*fae548d3Szrj     }
5559*fae548d3Szrj }
5560