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