1 /* YACC parser for C++ names, for GDB.
2 
3    Copyright (C) 2003-2005, 2007-2012 Free Software Foundation, Inc.
4 
5    Parts of the lexer are based on c-exp.y from GDB.
6 
7    This file is part of GDB.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
21 
22 /* Note that malloc's and realloc's in this file are transformed to
23    xmalloc and xrealloc respectively by the same sed command in the
24    makefile that remaps any other malloc/realloc inserted by the parser
25    generator.  Doing this with #defines and trying to control the interaction
26    with include files (<malloc.h> and <stdlib.h> for example) just became
27    too messy, particularly when such includes can be inserted at random
28    times by the parser generator.  */
29 
30 %{
31 
32 #include "defs.h"
33 
34 #include <stdio.h>
35 #include <stdlib.h>
36 #include <unistd.h>
37 #include <string.h>
38 
39 #include "safe-ctype.h"
40 #include "libiberty.h"
41 #include "demangle.h"
42 #include "cp-support.h"
43 #include "gdb_assert.h"
44 
45 /* Bison does not make it easy to create a parser without global
46    state, unfortunately.  Here are all the global variables used
47    in this parser.  */
48 
49 /* LEXPTR is the current pointer into our lex buffer.  PREV_LEXPTR
50    is the start of the last token lexed, only used for diagnostics.
51    ERROR_LEXPTR is the first place an error occurred.  GLOBAL_ERRMSG
52    is the first error message encountered.  */
53 
54 static const char *lexptr, *prev_lexptr, *error_lexptr, *global_errmsg;
55 
56 /* The components built by the parser are allocated ahead of time,
57    and cached in this structure.  */
58 
59 #define ALLOC_CHUNK 100
60 
61 struct demangle_info {
62   int used;
63   struct demangle_info *next;
64   struct demangle_component comps[ALLOC_CHUNK];
65 };
66 
67 static struct demangle_info *demangle_info;
68 
69 static struct demangle_component *
70 d_grab (void)
71 {
72   struct demangle_info *more;
73 
74   if (demangle_info->used >= ALLOC_CHUNK)
75     {
76       if (demangle_info->next == NULL)
77 	{
78 	  more = malloc (sizeof (struct demangle_info));
79 	  more->next = NULL;
80 	  demangle_info->next = more;
81 	}
82       else
83 	more = demangle_info->next;
84 
85       more->used = 0;
86       demangle_info = more;
87     }
88   return &demangle_info->comps[demangle_info->used++];
89 }
90 
91 /* The parse tree created by the parser is stored here after a successful
92    parse.  */
93 
94 static struct demangle_component *global_result;
95 
96 /* Prototypes for helper functions used when constructing the parse
97    tree.  */
98 
99 static struct demangle_component *d_qualify (struct demangle_component *, int,
100 					     int);
101 
102 static struct demangle_component *d_int_type (int);
103 
104 static struct demangle_component *d_unary (const char *,
105 					   struct demangle_component *);
106 static struct demangle_component *d_binary (const char *,
107 					    struct demangle_component *,
108 					    struct demangle_component *);
109 
110 /* Flags passed to d_qualify.  */
111 
112 #define QUAL_CONST 1
113 #define QUAL_RESTRICT 2
114 #define QUAL_VOLATILE 4
115 
116 /* Flags passed to d_int_type.  */
117 
118 #define INT_CHAR	(1 << 0)
119 #define INT_SHORT	(1 << 1)
120 #define INT_LONG	(1 << 2)
121 #define INT_LLONG	(1 << 3)
122 
123 #define INT_SIGNED	(1 << 4)
124 #define INT_UNSIGNED	(1 << 5)
125 
126 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
127    as well as gratuitiously global symbol names, so we can have multiple
128    yacc generated parsers in gdb.  Note that these are only the variables
129    produced by yacc.  If other parser generators (bison, byacc, etc) produce
130    additional global names that conflict at link time, then those parser
131    generators need to be fixed instead of adding those names to this list. */
132 
133 #define	yymaxdepth cpname_maxdepth
134 #define	yyparse	cpname_parse
135 #define	yylex	cpname_lex
136 #define	yyerror	cpname_error
137 #define	yylval	cpname_lval
138 #define	yychar	cpname_char
139 #define	yydebug	cpname_debug
140 #define	yypact	cpname_pact
141 #define	yyr1	cpname_r1
142 #define	yyr2	cpname_r2
143 #define	yydef	cpname_def
144 #define	yychk	cpname_chk
145 #define	yypgo	cpname_pgo
146 #define	yyact	cpname_act
147 #define	yyexca	cpname_exca
148 #define yyerrflag cpname_errflag
149 #define yynerrs	cpname_nerrs
150 #define	yyps	cpname_ps
151 #define	yypv	cpname_pv
152 #define	yys	cpname_s
153 #define	yy_yys	cpname_yys
154 #define	yystate	cpname_state
155 #define	yytmp	cpname_tmp
156 #define	yyv	cpname_v
157 #define	yy_yyv	cpname_yyv
158 #define	yyval	cpname_val
159 #define	yylloc	cpname_lloc
160 #define yyreds	cpname_reds		/* With YYDEBUG defined */
161 #define yytoks	cpname_toks		/* With YYDEBUG defined */
162 #define yyname	cpname_name		/* With YYDEBUG defined */
163 #define yyrule	cpname_rule		/* With YYDEBUG defined */
164 #define yylhs	cpname_yylhs
165 #define yylen	cpname_yylen
166 #define yydefred cpname_yydefred
167 #define yydgoto	cpname_yydgoto
168 #define yysindex cpname_yysindex
169 #define yyrindex cpname_yyrindex
170 #define yygindex cpname_yygindex
171 #define yytable	 cpname_yytable
172 #define yycheck	 cpname_yycheck
173 
174 int yyparse (void);
175 static int yylex (void);
176 static void yyerror (char *);
177 
178 /* Enable yydebug for the stand-alone parser.  */
179 #ifdef TEST_CPNAMES
180 # define YYDEBUG	1
181 #endif
182 
183 /* Helper functions.  These wrap the demangler tree interface, handle
184    allocation from our global store, and return the allocated component.  */
185 
186 static struct demangle_component *
187 fill_comp (enum demangle_component_type d_type, struct demangle_component *lhs,
188 	   struct demangle_component *rhs)
189 {
190   struct demangle_component *ret = d_grab ();
191   cplus_demangle_fill_component (ret, d_type, lhs, rhs);
192   return ret;
193 }
194 
195 static struct demangle_component *
196 make_empty (enum demangle_component_type d_type)
197 {
198   struct demangle_component *ret = d_grab ();
199   ret->type = d_type;
200   return ret;
201 }
202 
203 static struct demangle_component *
204 make_operator (const char *name, int args)
205 {
206   struct demangle_component *ret = d_grab ();
207   cplus_demangle_fill_operator (ret, name, args);
208   return ret;
209 }
210 
211 static struct demangle_component *
212 make_dtor (enum gnu_v3_dtor_kinds kind, struct demangle_component *name)
213 {
214   struct demangle_component *ret = d_grab ();
215   cplus_demangle_fill_dtor (ret, kind, name);
216   return ret;
217 }
218 
219 static struct demangle_component *
220 make_builtin_type (const char *name)
221 {
222   struct demangle_component *ret = d_grab ();
223   cplus_demangle_fill_builtin_type (ret, name);
224   return ret;
225 }
226 
227 static struct demangle_component *
228 make_name (const char *name, int len)
229 {
230   struct demangle_component *ret = d_grab ();
231   cplus_demangle_fill_name (ret, name, len);
232   return ret;
233 }
234 
235 #define d_left(dc) (dc)->u.s_binary.left
236 #define d_right(dc) (dc)->u.s_binary.right
237 
238 %}
239 
240 %union
241   {
242     struct demangle_component *comp;
243     struct nested {
244       struct demangle_component *comp;
245       struct demangle_component **last;
246     } nested;
247     struct {
248       struct demangle_component *comp, *last;
249     } nested1;
250     struct {
251       struct demangle_component *comp, **last;
252       struct nested fn;
253       struct demangle_component *start;
254       int fold_flag;
255     } abstract;
256     int lval;
257     const char *opname;
258   }
259 
260 %type <comp> exp exp1 type start start_opt operator colon_name
261 %type <comp> unqualified_name colon_ext_name
262 %type <comp> template template_arg
263 %type <comp> builtin_type
264 %type <comp> typespec_2 array_indicator
265 %type <comp> colon_ext_only ext_only_name
266 
267 %type <comp> demangler_special function conversion_op
268 %type <nested> conversion_op_name
269 
270 %type <abstract> abstract_declarator direct_abstract_declarator
271 %type <abstract> abstract_declarator_fn
272 %type <nested> declarator direct_declarator function_arglist
273 
274 %type <nested> declarator_1 direct_declarator_1
275 
276 %type <nested> template_params function_args
277 %type <nested> ptr_operator
278 
279 %type <nested1> nested_name
280 
281 %type <lval> qualifier qualifiers qualifiers_opt
282 
283 %type <lval> int_part int_seq
284 
285 %token <comp> INT
286 %token <comp> FLOAT
287 
288 %token <comp> NAME
289 %type <comp> name
290 
291 %token STRUCT CLASS UNION ENUM SIZEOF UNSIGNED COLONCOLON
292 %token TEMPLATE
293 %token ERROR
294 %token NEW DELETE OPERATOR
295 %token STATIC_CAST REINTERPRET_CAST DYNAMIC_CAST
296 
297 /* Special type cases, put in to allow the parser to distinguish different
298    legal basetypes.  */
299 %token SIGNED_KEYWORD LONG SHORT INT_KEYWORD CONST_KEYWORD VOLATILE_KEYWORD DOUBLE_KEYWORD BOOL
300 %token ELLIPSIS RESTRICT VOID FLOAT_KEYWORD CHAR WCHAR_T
301 
302 %token <opname> ASSIGN_MODIFY
303 
304 /* C++ */
305 %token TRUEKEYWORD
306 %token FALSEKEYWORD
307 
308 /* Non-C++ things we get from the demangler.  */
309 %token <lval> DEMANGLER_SPECIAL
310 %token CONSTRUCTION_VTABLE CONSTRUCTION_IN
311 
312 /* Precedence declarations.  */
313 
314 /* Give NAME lower precedence than COLONCOLON, so that nested_name will
315    associate greedily.  */
316 %nonassoc NAME
317 
318 /* Give NEW and DELETE lower precedence than ']', because we can not
319    have an array of type operator new.  This causes NEW '[' to be
320    parsed as operator new[].  */
321 %nonassoc NEW DELETE
322 
323 /* Give VOID higher precedence than NAME.  Then we can use %prec NAME
324    to prefer (VOID) to (function_args).  */
325 %nonassoc VOID
326 
327 /* Give VOID lower precedence than ')' for similar reasons.  */
328 %nonassoc ')'
329 
330 %left ','
331 %right '=' ASSIGN_MODIFY
332 %right '?'
333 %left OROR
334 %left ANDAND
335 %left '|'
336 %left '^'
337 %left '&'
338 %left EQUAL NOTEQUAL
339 %left '<' '>' LEQ GEQ
340 %left LSH RSH
341 %left '@'
342 %left '+' '-'
343 %left '*' '/' '%'
344 %right UNARY INCREMENT DECREMENT
345 
346 /* We don't need a precedence for '(' in this reduced grammar, and it
347    can mask some unpleasant bugs, so disable it for now.  */
348 
349 %right ARROW '.' '[' /* '(' */
350 %left COLONCOLON
351 
352 
353 %%
354 
355 result		:	start
356 			{ global_result = $1; }
357 		;
358 
359 start		:	type
360 
361 		|	demangler_special
362 
363 		|	function
364 
365 		;
366 
367 start_opt	:	/* */
368 			{ $$ = NULL; }
369 		|	COLONCOLON start
370 			{ $$ = $2; }
371 		;
372 
373 function
374 		/* Function with a return type.  declarator_1 is used to prevent
375 		   ambiguity with the next rule.  */
376 		:	typespec_2 declarator_1
377 			{ $$ = $2.comp;
378 			  *$2.last = $1;
379 			}
380 
381 		/* Function without a return type.  We need to use typespec_2
382 		   to prevent conflicts from qualifiers_opt - harmless.  The
383 		   start_opt is used to handle "function-local" variables and
384 		   types.  */
385 		|	typespec_2 function_arglist start_opt
386 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
387 			  if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); }
388 		|	colon_ext_only function_arglist start_opt
389 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
390 			  if ($3) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $3); }
391 
392 		|	conversion_op_name start_opt
393 			{ $$ = $1.comp;
394 			  if ($2) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2); }
395 		|	conversion_op_name abstract_declarator_fn
396 			{ if ($2.last)
397 			    {
398 			       /* First complete the abstract_declarator's type using
399 				  the typespec from the conversion_op_name.  */
400 			      *$2.last = *$1.last;
401 			      /* Then complete the conversion_op_name with the type.  */
402 			      *$1.last = $2.comp;
403 			    }
404 			  /* If we have an arglist, build a function type.  */
405 			  if ($2.fn.comp)
406 			    $$ = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1.comp, $2.fn.comp);
407 			  else
408 			    $$ = $1.comp;
409 			  if ($2.start) $$ = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$, $2.start);
410 			}
411 		;
412 
413 demangler_special
414 		:	DEMANGLER_SPECIAL start
415 			{ $$ = make_empty ($1);
416 			  d_left ($$) = $2;
417 			  d_right ($$) = NULL; }
418 		|	CONSTRUCTION_VTABLE start CONSTRUCTION_IN start
419 			{ $$ = fill_comp (DEMANGLE_COMPONENT_CONSTRUCTION_VTABLE, $2, $4); }
420 		;
421 
422 operator	:	OPERATOR NEW
423 			{ $$ = make_operator ("new", 1); }
424 		|	OPERATOR DELETE
425 			{ $$ = make_operator ("delete", 1); }
426 		|	OPERATOR NEW '[' ']'
427 			{ $$ = make_operator ("new[]", 1); }
428 		|	OPERATOR DELETE '[' ']'
429 			{ $$ = make_operator ("delete[]", 1); }
430 		|	OPERATOR '+'
431 			{ $$ = make_operator ("+", 2); }
432 		|	OPERATOR '-'
433 			{ $$ = make_operator ("-", 2); }
434 		|	OPERATOR '*'
435 			{ $$ = make_operator ("*", 2); }
436 		|	OPERATOR '/'
437 			{ $$ = make_operator ("/", 2); }
438 		|	OPERATOR '%'
439 			{ $$ = make_operator ("%", 2); }
440 		|	OPERATOR '^'
441 			{ $$ = make_operator ("^", 2); }
442 		|	OPERATOR '&'
443 			{ $$ = make_operator ("&", 2); }
444 		|	OPERATOR '|'
445 			{ $$ = make_operator ("|", 2); }
446 		|	OPERATOR '~'
447 			{ $$ = make_operator ("~", 1); }
448 		|	OPERATOR '!'
449 			{ $$ = make_operator ("!", 1); }
450 		|	OPERATOR '='
451 			{ $$ = make_operator ("=", 2); }
452 		|	OPERATOR '<'
453 			{ $$ = make_operator ("<", 2); }
454 		|	OPERATOR '>'
455 			{ $$ = make_operator (">", 2); }
456 		|	OPERATOR ASSIGN_MODIFY
457 			{ $$ = make_operator ($2, 2); }
458 		|	OPERATOR LSH
459 			{ $$ = make_operator ("<<", 2); }
460 		|	OPERATOR RSH
461 			{ $$ = make_operator (">>", 2); }
462 		|	OPERATOR EQUAL
463 			{ $$ = make_operator ("==", 2); }
464 		|	OPERATOR NOTEQUAL
465 			{ $$ = make_operator ("!=", 2); }
466 		|	OPERATOR LEQ
467 			{ $$ = make_operator ("<=", 2); }
468 		|	OPERATOR GEQ
469 			{ $$ = make_operator (">=", 2); }
470 		|	OPERATOR ANDAND
471 			{ $$ = make_operator ("&&", 2); }
472 		|	OPERATOR OROR
473 			{ $$ = make_operator ("||", 2); }
474 		|	OPERATOR INCREMENT
475 			{ $$ = make_operator ("++", 1); }
476 		|	OPERATOR DECREMENT
477 			{ $$ = make_operator ("--", 1); }
478 		|	OPERATOR ','
479 			{ $$ = make_operator (",", 2); }
480 		|	OPERATOR ARROW '*'
481 			{ $$ = make_operator ("->*", 2); }
482 		|	OPERATOR ARROW
483 			{ $$ = make_operator ("->", 2); }
484 		|	OPERATOR '(' ')'
485 			{ $$ = make_operator ("()", 2); }
486 		|	OPERATOR '[' ']'
487 			{ $$ = make_operator ("[]", 2); }
488 		;
489 
490 		/* Conversion operators.  We don't try to handle some of
491 		   the wackier demangler output for function pointers,
492 		   since it's not clear that it's parseable.  */
493 conversion_op
494 		:	OPERATOR typespec_2
495 			{ $$ = fill_comp (DEMANGLE_COMPONENT_CAST, $2, NULL); }
496 		;
497 
498 conversion_op_name
499 		:	nested_name conversion_op
500 			{ $$.comp = $1.comp;
501 			  d_right ($1.last) = $2;
502 			  $$.last = &d_left ($2);
503 			}
504 		|	conversion_op
505 			{ $$.comp = $1;
506 			  $$.last = &d_left ($1);
507 			}
508 		|	COLONCOLON nested_name conversion_op
509 			{ $$.comp = $2.comp;
510 			  d_right ($2.last) = $3;
511 			  $$.last = &d_left ($3);
512 			}
513 		|	COLONCOLON conversion_op
514 			{ $$.comp = $2;
515 			  $$.last = &d_left ($2);
516 			}
517 		;
518 
519 /* DEMANGLE_COMPONENT_NAME */
520 /* This accepts certain invalid placements of '~'.  */
521 unqualified_name:	operator
522 		|	operator '<' template_params '>'
523 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TEMPLATE, $1, $3.comp); }
524 		|	'~' NAME
525 			{ $$ = make_dtor (gnu_v3_complete_object_dtor, $2); }
526 		;
527 
528 /* This rule is used in name and nested_name, and expanded inline there
529    for efficiency.  */
530 /*
531 scope_id	:	NAME
532 		|	template
533 		;
534 */
535 
536 colon_name	:	name
537 		|	COLONCOLON name
538 			{ $$ = $2; }
539 		;
540 
541 /* DEMANGLE_COMPONENT_QUAL_NAME */
542 /* DEMANGLE_COMPONENT_CTOR / DEMANGLE_COMPONENT_DTOR ? */
543 name		:	nested_name NAME %prec NAME
544 			{ $$ = $1.comp; d_right ($1.last) = $2; }
545 		|	NAME %prec NAME
546 		|	nested_name template %prec NAME
547 			{ $$ = $1.comp; d_right ($1.last) = $2; }
548 		|	template %prec NAME
549 		;
550 
551 colon_ext_name	:	colon_name
552 		|	colon_ext_only
553 		;
554 
555 colon_ext_only	:	ext_only_name
556 		|	COLONCOLON ext_only_name
557 			{ $$ = $2; }
558 		;
559 
560 ext_only_name	:	nested_name unqualified_name
561 			{ $$ = $1.comp; d_right ($1.last) = $2; }
562 		|	unqualified_name
563 		;
564 
565 nested_name	:	NAME COLONCOLON
566 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
567 			  d_left ($$.comp) = $1;
568 			  d_right ($$.comp) = NULL;
569 			  $$.last = $$.comp;
570 			}
571 		|	nested_name NAME COLONCOLON
572 			{ $$.comp = $1.comp;
573 			  d_right ($1.last) = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
574 			  $$.last = d_right ($1.last);
575 			  d_left ($$.last) = $2;
576 			  d_right ($$.last) = NULL;
577 			}
578 		|	template COLONCOLON
579 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
580 			  d_left ($$.comp) = $1;
581 			  d_right ($$.comp) = NULL;
582 			  $$.last = $$.comp;
583 			}
584 		|	nested_name template COLONCOLON
585 			{ $$.comp = $1.comp;
586 			  d_right ($1.last) = make_empty (DEMANGLE_COMPONENT_QUAL_NAME);
587 			  $$.last = d_right ($1.last);
588 			  d_left ($$.last) = $2;
589 			  d_right ($$.last) = NULL;
590 			}
591 		;
592 
593 /* DEMANGLE_COMPONENT_TEMPLATE */
594 /* DEMANGLE_COMPONENT_TEMPLATE_ARGLIST */
595 template	:	NAME '<' template_params '>'
596 			{ $$ = fill_comp (DEMANGLE_COMPONENT_TEMPLATE, $1, $3.comp); }
597 		;
598 
599 template_params	:	template_arg
600 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, $1, NULL);
601 			$$.last = &d_right ($$.comp); }
602 		|	template_params ',' template_arg
603 			{ $$.comp = $1.comp;
604 			  *$1.last = fill_comp (DEMANGLE_COMPONENT_TEMPLATE_ARGLIST, $3, NULL);
605 			  $$.last = &d_right (*$1.last);
606 			}
607 		;
608 
609 /* "type" is inlined into template_arg and function_args.  */
610 
611 /* Also an integral constant-expression of integral type, and a
612    pointer to member (?) */
613 template_arg	:	typespec_2
614 		|	typespec_2 abstract_declarator
615 			{ $$ = $2.comp;
616 			  *$2.last = $1;
617 			}
618 		|	'&' start
619 			{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $2); }
620 		|	'&' '(' start ')'
621 			{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $3); }
622 		|	exp
623 		;
624 
625 function_args	:	typespec_2
626 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $1, NULL);
627 			  $$.last = &d_right ($$.comp);
628 			}
629 		|	typespec_2 abstract_declarator
630 			{ *$2.last = $1;
631 			  $$.comp = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $2.comp, NULL);
632 			  $$.last = &d_right ($$.comp);
633 			}
634 		|	function_args ',' typespec_2
635 			{ *$1.last = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $3, NULL);
636 			  $$.comp = $1.comp;
637 			  $$.last = &d_right (*$1.last);
638 			}
639 		|	function_args ',' typespec_2 abstract_declarator
640 			{ *$4.last = $3;
641 			  *$1.last = fill_comp (DEMANGLE_COMPONENT_ARGLIST, $4.comp, NULL);
642 			  $$.comp = $1.comp;
643 			  $$.last = &d_right (*$1.last);
644 			}
645 		|	function_args ',' ELLIPSIS
646 			{ *$1.last
647 			    = fill_comp (DEMANGLE_COMPONENT_ARGLIST,
648 					   make_builtin_type ("..."),
649 					   NULL);
650 			  $$.comp = $1.comp;
651 			  $$.last = &d_right (*$1.last);
652 			}
653 		;
654 
655 function_arglist:	'(' function_args ')' qualifiers_opt %prec NAME
656 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, $2.comp);
657 			  $$.last = &d_left ($$.comp);
658 			  $$.comp = d_qualify ($$.comp, $4, 1); }
659 		|	'(' VOID ')' qualifiers_opt
660 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, NULL);
661 			  $$.last = &d_left ($$.comp);
662 			  $$.comp = d_qualify ($$.comp, $4, 1); }
663 		|	'(' ')' qualifiers_opt
664 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_FUNCTION_TYPE, NULL, NULL);
665 			  $$.last = &d_left ($$.comp);
666 			  $$.comp = d_qualify ($$.comp, $3, 1); }
667 		;
668 
669 /* Should do something about DEMANGLE_COMPONENT_VENDOR_TYPE_QUAL */
670 qualifiers_opt	:	/* epsilon */
671 			{ $$ = 0; }
672 		|	qualifiers
673 		;
674 
675 qualifier	:	RESTRICT
676 			{ $$ = QUAL_RESTRICT; }
677 		|	VOLATILE_KEYWORD
678 			{ $$ = QUAL_VOLATILE; }
679 		|	CONST_KEYWORD
680 			{ $$ = QUAL_CONST; }
681 		;
682 
683 qualifiers	:	qualifier
684 		|	qualifier qualifiers
685 			{ $$ = $1 | $2; }
686 		;
687 
688 /* This accepts all sorts of invalid constructions and produces
689    invalid output for them - an error would be better.  */
690 
691 int_part	:	INT_KEYWORD
692 			{ $$ = 0; }
693 		|	SIGNED_KEYWORD
694 			{ $$ = INT_SIGNED; }
695 		|	UNSIGNED
696 			{ $$ = INT_UNSIGNED; }
697 		|	CHAR
698 			{ $$ = INT_CHAR; }
699 		|	LONG
700 			{ $$ = INT_LONG; }
701 		|	SHORT
702 			{ $$ = INT_SHORT; }
703 		;
704 
705 int_seq		:	int_part
706 		|	int_seq int_part
707 			{ $$ = $1 | $2; if ($1 & $2 & INT_LONG) $$ = $1 | INT_LLONG; }
708 		;
709 
710 builtin_type	:	int_seq
711 			{ $$ = d_int_type ($1); }
712 		|	FLOAT_KEYWORD
713 			{ $$ = make_builtin_type ("float"); }
714 		|	DOUBLE_KEYWORD
715 			{ $$ = make_builtin_type ("double"); }
716 		|	LONG DOUBLE_KEYWORD
717 			{ $$ = make_builtin_type ("long double"); }
718 		|	BOOL
719 			{ $$ = make_builtin_type ("bool"); }
720 		|	WCHAR_T
721 			{ $$ = make_builtin_type ("wchar_t"); }
722 		|	VOID
723 			{ $$ = make_builtin_type ("void"); }
724 		;
725 
726 ptr_operator	:	'*' qualifiers_opt
727 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_POINTER);
728 			  $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
729 			  $$.last = &d_left ($$.comp);
730 			  $$.comp = d_qualify ($$.comp, $2, 0); }
731 		/* g++ seems to allow qualifiers after the reference?  */
732 		|	'&'
733 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_REFERENCE);
734 			  $$.comp->u.s_binary.left = $$.comp->u.s_binary.right = NULL;
735 			  $$.last = &d_left ($$.comp); }
736 		|	nested_name '*' qualifiers_opt
737 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE);
738 			  $$.comp->u.s_binary.left = $1.comp;
739 			  /* Convert the innermost DEMANGLE_COMPONENT_QUAL_NAME to a DEMANGLE_COMPONENT_NAME.  */
740 			  *$1.last = *d_left ($1.last);
741 			  $$.comp->u.s_binary.right = NULL;
742 			  $$.last = &d_right ($$.comp);
743 			  $$.comp = d_qualify ($$.comp, $3, 0); }
744 		|	COLONCOLON nested_name '*' qualifiers_opt
745 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_PTRMEM_TYPE);
746 			  $$.comp->u.s_binary.left = $2.comp;
747 			  /* Convert the innermost DEMANGLE_COMPONENT_QUAL_NAME to a DEMANGLE_COMPONENT_NAME.  */
748 			  *$2.last = *d_left ($2.last);
749 			  $$.comp->u.s_binary.right = NULL;
750 			  $$.last = &d_right ($$.comp);
751 			  $$.comp = d_qualify ($$.comp, $4, 0); }
752 		;
753 
754 array_indicator	:	'[' ']'
755 			{ $$ = make_empty (DEMANGLE_COMPONENT_ARRAY_TYPE);
756 			  d_left ($$) = NULL;
757 			}
758 		|	'[' INT ']'
759 			{ $$ = make_empty (DEMANGLE_COMPONENT_ARRAY_TYPE);
760 			  d_left ($$) = $2;
761 			}
762 		;
763 
764 /* Details of this approach inspired by the G++ < 3.4 parser.  */
765 
766 /* This rule is only used in typespec_2, and expanded inline there for
767    efficiency.  */
768 /*
769 typespec	:	builtin_type
770 		|	colon_name
771 		;
772 */
773 
774 typespec_2	:	builtin_type qualifiers
775 			{ $$ = d_qualify ($1, $2, 0); }
776 		|	builtin_type
777 		|	qualifiers builtin_type qualifiers
778 			{ $$ = d_qualify ($2, $1 | $3, 0); }
779 		|	qualifiers builtin_type
780 			{ $$ = d_qualify ($2, $1, 0); }
781 
782 		|	name qualifiers
783 			{ $$ = d_qualify ($1, $2, 0); }
784 		|	name
785 		|	qualifiers name qualifiers
786 			{ $$ = d_qualify ($2, $1 | $3, 0); }
787 		|	qualifiers name
788 			{ $$ = d_qualify ($2, $1, 0); }
789 
790 		|	COLONCOLON name qualifiers
791 			{ $$ = d_qualify ($2, $3, 0); }
792 		|	COLONCOLON name
793 			{ $$ = $2; }
794 		|	qualifiers COLONCOLON name qualifiers
795 			{ $$ = d_qualify ($3, $1 | $4, 0); }
796 		|	qualifiers COLONCOLON name
797 			{ $$ = d_qualify ($3, $1, 0); }
798 		;
799 
800 abstract_declarator
801 		:	ptr_operator
802 			{ $$.comp = $1.comp; $$.last = $1.last;
803 			  $$.fn.comp = NULL; $$.fn.last = NULL; }
804 		|	ptr_operator abstract_declarator
805 			{ $$ = $2; $$.fn.comp = NULL; $$.fn.last = NULL;
806 			  if ($2.fn.comp) { $$.last = $2.fn.last; *$2.last = $2.fn.comp; }
807 			  *$$.last = $1.comp;
808 			  $$.last = $1.last; }
809 		|	direct_abstract_declarator
810 			{ $$.fn.comp = NULL; $$.fn.last = NULL;
811 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
812 			}
813 		;
814 
815 direct_abstract_declarator
816 		:	'(' abstract_declarator ')'
817 			{ $$ = $2; $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 1;
818 			  if ($2.fn.comp) { $$.last = $2.fn.last; *$2.last = $2.fn.comp; }
819 			}
820 		|	direct_abstract_declarator function_arglist
821 			{ $$.fold_flag = 0;
822 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
823 			  if ($1.fold_flag)
824 			    {
825 			      *$$.last = $2.comp;
826 			      $$.last = $2.last;
827 			    }
828 			  else
829 			    $$.fn = $2;
830 			}
831 		|	direct_abstract_declarator array_indicator
832 			{ $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 0;
833 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
834 			  *$1.last = $2;
835 			  $$.last = &d_right ($2);
836 			}
837 		|	array_indicator
838 			{ $$.fn.comp = NULL; $$.fn.last = NULL; $$.fold_flag = 0;
839 			  $$.comp = $1;
840 			  $$.last = &d_right ($1);
841 			}
842 		/* G++ has the following except for () and (type).  Then
843 		   (type) is handled in regcast_or_absdcl and () is handled
844 		   in fcast_or_absdcl.
845 
846 		   However, this is only useful for function types, and
847 		   generates reduce/reduce conflicts with direct_declarator.
848 		   We're interested in pointer-to-function types, and in
849 		   functions, but not in function types - so leave this
850 		   out.  */
851 		/* |	function_arglist */
852 		;
853 
854 abstract_declarator_fn
855 		:	ptr_operator
856 			{ $$.comp = $1.comp; $$.last = $1.last;
857 			  $$.fn.comp = NULL; $$.fn.last = NULL; $$.start = NULL; }
858 		|	ptr_operator abstract_declarator_fn
859 			{ $$ = $2;
860 			  if ($2.last)
861 			    *$$.last = $1.comp;
862 			  else
863 			    $$.comp = $1.comp;
864 			  $$.last = $1.last;
865 			}
866 		|	direct_abstract_declarator
867 			{ $$.comp = $1.comp; $$.last = $1.last; $$.fn = $1.fn; $$.start = NULL; }
868 		|	direct_abstract_declarator function_arglist COLONCOLON start
869 			{ $$.start = $4;
870 			  if ($1.fn.comp) { $$.last = $1.fn.last; *$1.last = $1.fn.comp; }
871 			  if ($1.fold_flag)
872 			    {
873 			      *$$.last = $2.comp;
874 			      $$.last = $2.last;
875 			    }
876 			  else
877 			    $$.fn = $2;
878 			}
879 		|	function_arglist start_opt
880 			{ $$.fn = $1;
881 			  $$.start = $2;
882 			  $$.comp = NULL; $$.last = NULL;
883 			}
884 		;
885 
886 type		:	typespec_2
887 		|	typespec_2 abstract_declarator
888 			{ $$ = $2.comp;
889 			  *$2.last = $1;
890 			}
891 		;
892 
893 declarator	:	ptr_operator declarator
894 			{ $$.comp = $2.comp;
895 			  $$.last = $1.last;
896 			  *$2.last = $1.comp; }
897 		|	direct_declarator
898 		;
899 
900 direct_declarator
901 		:	'(' declarator ')'
902 			{ $$ = $2; }
903 		|	direct_declarator function_arglist
904 			{ $$.comp = $1.comp;
905 			  *$1.last = $2.comp;
906 			  $$.last = $2.last;
907 			}
908 		|	direct_declarator array_indicator
909 			{ $$.comp = $1.comp;
910 			  *$1.last = $2;
911 			  $$.last = &d_right ($2);
912 			}
913 		|	colon_ext_name
914 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_TYPED_NAME);
915 			  d_left ($$.comp) = $1;
916 			  $$.last = &d_right ($$.comp);
917 			}
918 		;
919 
920 /* These are similar to declarator and direct_declarator except that they
921    do not permit ( colon_ext_name ), which is ambiguous with a function
922    argument list.  They also don't permit a few other forms with redundant
923    parentheses around the colon_ext_name; any colon_ext_name in parentheses
924    must be followed by an argument list or an array indicator, or preceded
925    by a pointer.  */
926 declarator_1	:	ptr_operator declarator_1
927 			{ $$.comp = $2.comp;
928 			  $$.last = $1.last;
929 			  *$2.last = $1.comp; }
930 		|	colon_ext_name
931 			{ $$.comp = make_empty (DEMANGLE_COMPONENT_TYPED_NAME);
932 			  d_left ($$.comp) = $1;
933 			  $$.last = &d_right ($$.comp);
934 			}
935 		|	direct_declarator_1
936 
937 			/* Function local variable or type.  The typespec to
938 			   our left is the type of the containing function.
939 			   This should be OK, because function local types
940 			   can not be templates, so the return types of their
941 			   members will not be mangled.  If they are hopefully
942 			   they'll end up to the right of the ::.  */
943 		|	colon_ext_name function_arglist COLONCOLON start
944 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
945 			  $$.last = $2.last;
946 			  $$.comp = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$.comp, $4);
947 			}
948 		|	direct_declarator_1 function_arglist COLONCOLON start
949 			{ $$.comp = $1.comp;
950 			  *$1.last = $2.comp;
951 			  $$.last = $2.last;
952 			  $$.comp = fill_comp (DEMANGLE_COMPONENT_LOCAL_NAME, $$.comp, $4);
953 			}
954 		;
955 
956 direct_declarator_1
957 		:	'(' ptr_operator declarator ')'
958 			{ $$.comp = $3.comp;
959 			  $$.last = $2.last;
960 			  *$3.last = $2.comp; }
961 		|	direct_declarator_1 function_arglist
962 			{ $$.comp = $1.comp;
963 			  *$1.last = $2.comp;
964 			  $$.last = $2.last;
965 			}
966 		|	direct_declarator_1 array_indicator
967 			{ $$.comp = $1.comp;
968 			  *$1.last = $2;
969 			  $$.last = &d_right ($2);
970 			}
971 		|	colon_ext_name function_arglist
972 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2.comp);
973 			  $$.last = $2.last;
974 			}
975 		|	colon_ext_name array_indicator
976 			{ $$.comp = fill_comp (DEMANGLE_COMPONENT_TYPED_NAME, $1, $2);
977 			  $$.last = &d_right ($2);
978 			}
979 		;
980 
981 exp	:	'(' exp1 ')'
982 		{ $$ = $2; }
983 	;
984 
985 /* Silly trick.  Only allow '>' when parenthesized, in order to
986    handle conflict with templates.  */
987 exp1	:	exp
988 	;
989 
990 exp1	:	exp '>' exp
991 		{ $$ = d_binary (">", $1, $3); }
992 	;
993 
994 /* References.  Not allowed everywhere in template parameters, only
995    at the top level, but treat them as expressions in case they are wrapped
996    in parentheses.  */
997 exp1	:	'&' start
998 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $2); }
999 	|	'&' '(' start ')'
1000 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator ("&", 1), $3); }
1001 	;
1002 
1003 /* Expressions, not including the comma operator.  */
1004 exp	:	'-' exp    %prec UNARY
1005 		{ $$ = d_unary ("-", $2); }
1006 	;
1007 
1008 exp	:	'!' exp    %prec UNARY
1009 		{ $$ = d_unary ("!", $2); }
1010 	;
1011 
1012 exp	:	'~' exp    %prec UNARY
1013 		{ $$ = d_unary ("~", $2); }
1014 	;
1015 
1016 /* Casts.  First your normal C-style cast.  If exp is a LITERAL, just change
1017    its type.  */
1018 
1019 exp	:	'(' type ')' exp  %prec UNARY
1020 		{ if ($4->type == DEMANGLE_COMPONENT_LITERAL
1021 		      || $4->type == DEMANGLE_COMPONENT_LITERAL_NEG)
1022 		    {
1023 		      $$ = $4;
1024 		      d_left ($4) = $2;
1025 		    }
1026 		  else
1027 		    $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1028 				      fill_comp (DEMANGLE_COMPONENT_CAST, $2, NULL),
1029 				      $4);
1030 		}
1031 	;
1032 
1033 /* Mangling does not differentiate between these, so we don't need to
1034    either.  */
1035 exp	:	STATIC_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1036 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1037 				    fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1038 				    $6);
1039 		}
1040 	;
1041 
1042 exp	:	DYNAMIC_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1043 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1044 				    fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1045 				    $6);
1046 		}
1047 	;
1048 
1049 exp	:	REINTERPRET_CAST '<' type '>' '(' exp1 ')' %prec UNARY
1050 		{ $$ = fill_comp (DEMANGLE_COMPONENT_UNARY,
1051 				    fill_comp (DEMANGLE_COMPONENT_CAST, $3, NULL),
1052 				    $6);
1053 		}
1054 	;
1055 
1056 /* Another form of C++-style cast is "type ( exp1 )".  This creates too many
1057    conflicts to support.  For a while we supported the simpler
1058    "typespec_2 ( exp1 )", but that conflicts with "& ( start )" as a
1059    reference, deep within the wilderness of abstract declarators:
1060    Qux<int(&(*))> vs Qux<int(&(var))>, a shift-reduce conflict at the
1061    innermost left parenthesis.  So we do not support function-like casts.
1062    Fortunately they never appear in demangler output.  */
1063 
1064 /* TO INVESTIGATE: ._0 style anonymous names; anonymous namespaces */
1065 
1066 /* Binary operators in order of decreasing precedence.  */
1067 
1068 exp	:	exp '*' exp
1069 		{ $$ = d_binary ("*", $1, $3); }
1070 	;
1071 
1072 exp	:	exp '/' exp
1073 		{ $$ = d_binary ("/", $1, $3); }
1074 	;
1075 
1076 exp	:	exp '%' exp
1077 		{ $$ = d_binary ("%", $1, $3); }
1078 	;
1079 
1080 exp	:	exp '+' exp
1081 		{ $$ = d_binary ("+", $1, $3); }
1082 	;
1083 
1084 exp	:	exp '-' exp
1085 		{ $$ = d_binary ("-", $1, $3); }
1086 	;
1087 
1088 exp	:	exp LSH exp
1089 		{ $$ = d_binary ("<<", $1, $3); }
1090 	;
1091 
1092 exp	:	exp RSH exp
1093 		{ $$ = d_binary (">>", $1, $3); }
1094 	;
1095 
1096 exp	:	exp EQUAL exp
1097 		{ $$ = d_binary ("==", $1, $3); }
1098 	;
1099 
1100 exp	:	exp NOTEQUAL exp
1101 		{ $$ = d_binary ("!=", $1, $3); }
1102 	;
1103 
1104 exp	:	exp LEQ exp
1105 		{ $$ = d_binary ("<=", $1, $3); }
1106 	;
1107 
1108 exp	:	exp GEQ exp
1109 		{ $$ = d_binary (">=", $1, $3); }
1110 	;
1111 
1112 exp	:	exp '<' exp
1113 		{ $$ = d_binary ("<", $1, $3); }
1114 	;
1115 
1116 exp	:	exp '&' exp
1117 		{ $$ = d_binary ("&", $1, $3); }
1118 	;
1119 
1120 exp	:	exp '^' exp
1121 		{ $$ = d_binary ("^", $1, $3); }
1122 	;
1123 
1124 exp	:	exp '|' exp
1125 		{ $$ = d_binary ("|", $1, $3); }
1126 	;
1127 
1128 exp	:	exp ANDAND exp
1129 		{ $$ = d_binary ("&&", $1, $3); }
1130 	;
1131 
1132 exp	:	exp OROR exp
1133 		{ $$ = d_binary ("||", $1, $3); }
1134 	;
1135 
1136 /* Not 100% sure these are necessary, but they're harmless.  */
1137 exp	:	exp ARROW NAME
1138 		{ $$ = d_binary ("->", $1, $3); }
1139 	;
1140 
1141 exp	:	exp '.' NAME
1142 		{ $$ = d_binary (".", $1, $3); }
1143 	;
1144 
1145 exp	:	exp '?' exp ':' exp	%prec '?'
1146 		{ $$ = fill_comp (DEMANGLE_COMPONENT_TRINARY, make_operator ("?", 3),
1147 				    fill_comp (DEMANGLE_COMPONENT_TRINARY_ARG1, $1,
1148 						 fill_comp (DEMANGLE_COMPONENT_TRINARY_ARG2, $3, $5)));
1149 		}
1150 	;
1151 
1152 exp	:	INT
1153 	;
1154 
1155 /* Not generally allowed.  */
1156 exp	:	FLOAT
1157 	;
1158 
1159 exp	:	SIZEOF '(' type ')'	%prec UNARY
1160 		{ $$ = d_unary ("sizeof", $3); }
1161 	;
1162 
1163 /* C++.  */
1164 exp     :       TRUEKEYWORD
1165 		{ struct demangle_component *i;
1166 		  i = make_name ("1", 1);
1167 		  $$ = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1168 				    make_builtin_type ("bool"),
1169 				    i);
1170 		}
1171 	;
1172 
1173 exp     :       FALSEKEYWORD
1174 		{ struct demangle_component *i;
1175 		  i = make_name ("0", 1);
1176 		  $$ = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1177 				    make_builtin_type ("bool"),
1178 				    i);
1179 		}
1180 	;
1181 
1182 /* end of C++.  */
1183 
1184 %%
1185 
1186 /* Apply QUALIFIERS to LHS and return a qualified component.  IS_METHOD
1187    is set if LHS is a method, in which case the qualifiers are logically
1188    applied to "this".  We apply qualifiers in a consistent order; LHS
1189    may already be qualified; duplicate qualifiers are not created.  */
1190 
1191 struct demangle_component *
1192 d_qualify (struct demangle_component *lhs, int qualifiers, int is_method)
1193 {
1194   struct demangle_component **inner_p;
1195   enum demangle_component_type type;
1196 
1197   /* For now the order is CONST (innermost), VOLATILE, RESTRICT.  */
1198 
1199 #define HANDLE_QUAL(TYPE, MTYPE, QUAL)				\
1200   if ((qualifiers & QUAL) && (type != TYPE) && (type != MTYPE))	\
1201     {								\
1202       *inner_p = fill_comp (is_method ? MTYPE : TYPE,	\
1203 			      *inner_p, NULL);			\
1204       inner_p = &d_left (*inner_p);				\
1205       type = (*inner_p)->type;					\
1206     }								\
1207   else if (type == TYPE || type == MTYPE)			\
1208     {								\
1209       inner_p = &d_left (*inner_p);				\
1210       type = (*inner_p)->type;					\
1211     }
1212 
1213   inner_p = &lhs;
1214 
1215   type = (*inner_p)->type;
1216 
1217   HANDLE_QUAL (DEMANGLE_COMPONENT_RESTRICT, DEMANGLE_COMPONENT_RESTRICT_THIS, QUAL_RESTRICT);
1218   HANDLE_QUAL (DEMANGLE_COMPONENT_VOLATILE, DEMANGLE_COMPONENT_VOLATILE_THIS, QUAL_VOLATILE);
1219   HANDLE_QUAL (DEMANGLE_COMPONENT_CONST, DEMANGLE_COMPONENT_CONST_THIS, QUAL_CONST);
1220 
1221   return lhs;
1222 }
1223 
1224 /* Return a builtin type corresponding to FLAGS.  */
1225 
1226 static struct demangle_component *
1227 d_int_type (int flags)
1228 {
1229   const char *name;
1230 
1231   switch (flags)
1232     {
1233     case INT_SIGNED | INT_CHAR:
1234       name = "signed char";
1235       break;
1236     case INT_CHAR:
1237       name = "char";
1238       break;
1239     case INT_UNSIGNED | INT_CHAR:
1240       name = "unsigned char";
1241       break;
1242     case 0:
1243     case INT_SIGNED:
1244       name = "int";
1245       break;
1246     case INT_UNSIGNED:
1247       name = "unsigned int";
1248       break;
1249     case INT_LONG:
1250     case INT_SIGNED | INT_LONG:
1251       name = "long";
1252       break;
1253     case INT_UNSIGNED | INT_LONG:
1254       name = "unsigned long";
1255       break;
1256     case INT_SHORT:
1257     case INT_SIGNED | INT_SHORT:
1258       name = "short";
1259       break;
1260     case INT_UNSIGNED | INT_SHORT:
1261       name = "unsigned short";
1262       break;
1263     case INT_LLONG | INT_LONG:
1264     case INT_SIGNED | INT_LLONG | INT_LONG:
1265       name = "long long";
1266       break;
1267     case INT_UNSIGNED | INT_LLONG | INT_LONG:
1268       name = "unsigned long long";
1269       break;
1270     default:
1271       return NULL;
1272     }
1273 
1274   return make_builtin_type (name);
1275 }
1276 
1277 /* Wrapper to create a unary operation.  */
1278 
1279 static struct demangle_component *
1280 d_unary (const char *name, struct demangle_component *lhs)
1281 {
1282   return fill_comp (DEMANGLE_COMPONENT_UNARY, make_operator (name, 1), lhs);
1283 }
1284 
1285 /* Wrapper to create a binary operation.  */
1286 
1287 static struct demangle_component *
1288 d_binary (const char *name, struct demangle_component *lhs, struct demangle_component *rhs)
1289 {
1290   return fill_comp (DEMANGLE_COMPONENT_BINARY, make_operator (name, 2),
1291 		      fill_comp (DEMANGLE_COMPONENT_BINARY_ARGS, lhs, rhs));
1292 }
1293 
1294 /* Find the end of a symbol name starting at LEXPTR.  */
1295 
1296 static const char *
1297 symbol_end (const char *lexptr)
1298 {
1299   const char *p = lexptr;
1300 
1301   while (*p && (ISALNUM (*p) || *p == '_' || *p == '$' || *p == '.'))
1302     p++;
1303 
1304   return p;
1305 }
1306 
1307 /* Take care of parsing a number (anything that starts with a digit).
1308    The number starts at P and contains LEN characters.  Store the result in
1309    YYLVAL.  */
1310 
1311 static int
1312 parse_number (const char *p, int len, int parsed_float)
1313 {
1314   int unsigned_p = 0;
1315 
1316   /* Number of "L" suffixes encountered.  */
1317   int long_p = 0;
1318 
1319   struct demangle_component *signed_type;
1320   struct demangle_component *unsigned_type;
1321   struct demangle_component *type, *name;
1322   enum demangle_component_type literal_type;
1323 
1324   if (p[0] == '-')
1325     {
1326       literal_type = DEMANGLE_COMPONENT_LITERAL_NEG;
1327       p++;
1328       len--;
1329     }
1330   else
1331     literal_type = DEMANGLE_COMPONENT_LITERAL;
1332 
1333   if (parsed_float)
1334     {
1335       /* It's a float since it contains a point or an exponent.  */
1336       char c;
1337 
1338       /* The GDB lexer checks the result of scanf at this point.  Not doing
1339          this leaves our error checking slightly weaker but only for invalid
1340          data.  */
1341 
1342       /* See if it has `f' or `l' suffix (float or long double).  */
1343 
1344       c = TOLOWER (p[len - 1]);
1345 
1346       if (c == 'f')
1347       	{
1348       	  len--;
1349       	  type = make_builtin_type ("float");
1350       	}
1351       else if (c == 'l')
1352 	{
1353 	  len--;
1354 	  type = make_builtin_type ("long double");
1355 	}
1356       else if (ISDIGIT (c) || c == '.')
1357 	type = make_builtin_type ("double");
1358       else
1359 	return ERROR;
1360 
1361       name = make_name (p, len);
1362       yylval.comp = fill_comp (literal_type, type, name);
1363 
1364       return FLOAT;
1365     }
1366 
1367   /* This treats 0x1 and 1 as different literals.  We also do not
1368      automatically generate unsigned types.  */
1369 
1370   long_p = 0;
1371   unsigned_p = 0;
1372   while (len > 0)
1373     {
1374       if (p[len - 1] == 'l' || p[len - 1] == 'L')
1375 	{
1376 	  len--;
1377 	  long_p++;
1378 	  continue;
1379 	}
1380       if (p[len - 1] == 'u' || p[len - 1] == 'U')
1381 	{
1382 	  len--;
1383 	  unsigned_p++;
1384 	  continue;
1385 	}
1386       break;
1387     }
1388 
1389   if (long_p == 0)
1390     {
1391       unsigned_type = make_builtin_type ("unsigned int");
1392       signed_type = make_builtin_type ("int");
1393     }
1394   else if (long_p == 1)
1395     {
1396       unsigned_type = make_builtin_type ("unsigned long");
1397       signed_type = make_builtin_type ("long");
1398     }
1399   else
1400     {
1401       unsigned_type = make_builtin_type ("unsigned long long");
1402       signed_type = make_builtin_type ("long long");
1403     }
1404 
1405    if (unsigned_p)
1406      type = unsigned_type;
1407    else
1408      type = signed_type;
1409 
1410    name = make_name (p, len);
1411    yylval.comp = fill_comp (literal_type, type, name);
1412 
1413    return INT;
1414 }
1415 
1416 static char backslashable[] = "abefnrtv";
1417 static char represented[] = "\a\b\e\f\n\r\t\v";
1418 
1419 /* Translate the backslash the way we would in the host character set.  */
1420 static int
1421 c_parse_backslash (int host_char, int *target_char)
1422 {
1423   const char *ix;
1424   ix = strchr (backslashable, host_char);
1425   if (! ix)
1426     return 0;
1427   else
1428     *target_char = represented[ix - backslashable];
1429   return 1;
1430 }
1431 
1432 /* Parse a C escape sequence.  STRING_PTR points to a variable
1433    containing a pointer to the string to parse.  That pointer
1434    should point to the character after the \.  That pointer
1435    is updated past the characters we use.  The value of the
1436    escape sequence is returned.
1437 
1438    A negative value means the sequence \ newline was seen,
1439    which is supposed to be equivalent to nothing at all.
1440 
1441    If \ is followed by a null character, we return a negative
1442    value and leave the string pointer pointing at the null character.
1443 
1444    If \ is followed by 000, we return 0 and leave the string pointer
1445    after the zeros.  A value of 0 does not mean end of string.  */
1446 
1447 static int
1448 cp_parse_escape (const char **string_ptr)
1449 {
1450   int target_char;
1451   int c = *(*string_ptr)++;
1452   if (c_parse_backslash (c, &target_char))
1453     return target_char;
1454   else
1455     switch (c)
1456       {
1457       case '\n':
1458 	return -2;
1459       case 0:
1460 	(*string_ptr)--;
1461 	return 0;
1462       case '^':
1463 	{
1464 	  c = *(*string_ptr)++;
1465 
1466 	  if (c == '?')
1467 	    return 0177;
1468 	  else if (c == '\\')
1469 	    target_char = cp_parse_escape (string_ptr);
1470 	  else
1471 	    target_char = c;
1472 
1473 	  /* Now target_char is something like `c', and we want to find
1474 	     its control-character equivalent.  */
1475 	  target_char = target_char & 037;
1476 
1477 	  return target_char;
1478 	}
1479 
1480       case '0':
1481       case '1':
1482       case '2':
1483       case '3':
1484       case '4':
1485       case '5':
1486       case '6':
1487       case '7':
1488 	{
1489 	  int i = c - '0';
1490 	  int count = 0;
1491 	  while (++count < 3)
1492 	    {
1493 	      c = (**string_ptr);
1494 	      if (c >= '0' && c <= '7')
1495 		{
1496 		  (*string_ptr)++;
1497 		  i *= 8;
1498 		  i += c - '0';
1499 		}
1500 	      else
1501 		{
1502 		  break;
1503 		}
1504 	    }
1505 	  return i;
1506 	}
1507       default:
1508 	return c;
1509       }
1510 }
1511 
1512 #define HANDLE_SPECIAL(string, comp)				\
1513   if (strncmp (tokstart, string, sizeof (string) - 1) == 0)	\
1514     {								\
1515       lexptr = tokstart + sizeof (string) - 1;			\
1516       yylval.lval = comp;					\
1517       return DEMANGLER_SPECIAL;					\
1518     }
1519 
1520 #define HANDLE_TOKEN2(string, token)			\
1521   if (lexptr[1] == string[1])				\
1522     {							\
1523       lexptr += 2;					\
1524       yylval.opname = string;				\
1525       return token;					\
1526     }
1527 
1528 #define HANDLE_TOKEN3(string, token)			\
1529   if (lexptr[1] == string[1] && lexptr[2] == string[2])	\
1530     {							\
1531       lexptr += 3;					\
1532       yylval.opname = string;				\
1533       return token;					\
1534     }
1535 
1536 /* Read one token, getting characters through LEXPTR.  */
1537 
1538 static int
1539 yylex (void)
1540 {
1541   int c;
1542   int namelen;
1543   const char *tokstart;
1544 
1545  retry:
1546   prev_lexptr = lexptr;
1547   tokstart = lexptr;
1548 
1549   switch (c = *tokstart)
1550     {
1551     case 0:
1552       return 0;
1553 
1554     case ' ':
1555     case '\t':
1556     case '\n':
1557       lexptr++;
1558       goto retry;
1559 
1560     case '\'':
1561       /* We either have a character constant ('0' or '\177' for example)
1562 	 or we have a quoted symbol reference ('foo(int,int)' in C++
1563 	 for example). */
1564       lexptr++;
1565       c = *lexptr++;
1566       if (c == '\\')
1567 	c = cp_parse_escape (&lexptr);
1568       else if (c == '\'')
1569 	{
1570 	  yyerror (_("empty character constant"));
1571 	  return ERROR;
1572 	}
1573 
1574       c = *lexptr++;
1575       if (c != '\'')
1576 	{
1577 	  yyerror (_("invalid character constant"));
1578 	  return ERROR;
1579 	}
1580 
1581       /* FIXME: We should refer to a canonical form of the character,
1582 	 presumably the same one that appears in manglings - the decimal
1583 	 representation.  But if that isn't in our input then we have to
1584 	 allocate memory for it somewhere.  */
1585       yylval.comp = fill_comp (DEMANGLE_COMPONENT_LITERAL,
1586 				 make_builtin_type ("char"),
1587 				 make_name (tokstart, lexptr - tokstart));
1588 
1589       return INT;
1590 
1591     case '(':
1592       if (strncmp (tokstart, "(anonymous namespace)", 21) == 0)
1593 	{
1594 	  lexptr += 21;
1595 	  yylval.comp = make_name ("(anonymous namespace)",
1596 				     sizeof "(anonymous namespace)" - 1);
1597 	  return NAME;
1598 	}
1599 	/* FALL THROUGH */
1600 
1601     case ')':
1602     case ',':
1603       lexptr++;
1604       return c;
1605 
1606     case '.':
1607       if (lexptr[1] == '.' && lexptr[2] == '.')
1608 	{
1609 	  lexptr += 3;
1610 	  return ELLIPSIS;
1611 	}
1612 
1613       /* Might be a floating point number.  */
1614       if (lexptr[1] < '0' || lexptr[1] > '9')
1615 	goto symbol;		/* Nope, must be a symbol. */
1616 
1617       goto try_number;
1618 
1619     case '-':
1620       HANDLE_TOKEN2 ("-=", ASSIGN_MODIFY);
1621       HANDLE_TOKEN2 ("--", DECREMENT);
1622       HANDLE_TOKEN2 ("->", ARROW);
1623 
1624       /* For construction vtables.  This is kind of hokey.  */
1625       if (strncmp (tokstart, "-in-", 4) == 0)
1626 	{
1627 	  lexptr += 4;
1628 	  return CONSTRUCTION_IN;
1629 	}
1630 
1631       if (lexptr[1] < '0' || lexptr[1] > '9')
1632 	{
1633 	  lexptr++;
1634 	  return '-';
1635 	}
1636       /* FALL THRU into number case.  */
1637 
1638     try_number:
1639     case '0':
1640     case '1':
1641     case '2':
1642     case '3':
1643     case '4':
1644     case '5':
1645     case '6':
1646     case '7':
1647     case '8':
1648     case '9':
1649       {
1650 	/* It's a number.  */
1651 	int got_dot = 0, got_e = 0, toktype;
1652 	const char *p = tokstart;
1653 	int hex = 0;
1654 
1655 	if (c == '-')
1656 	  p++;
1657 
1658 	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1659 	  {
1660 	    p += 2;
1661 	    hex = 1;
1662 	  }
1663 	else if (c == '0' && (p[1]=='t' || p[1]=='T' || p[1]=='d' || p[1]=='D'))
1664 	  {
1665 	    p += 2;
1666 	    hex = 0;
1667 	  }
1668 
1669 	for (;; ++p)
1670 	  {
1671 	    /* This test includes !hex because 'e' is a valid hex digit
1672 	       and thus does not indicate a floating point number when
1673 	       the radix is hex.  */
1674 	    if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1675 	      got_dot = got_e = 1;
1676 	    /* This test does not include !hex, because a '.' always indicates
1677 	       a decimal floating point number regardless of the radix.
1678 
1679 	       NOTE drow/2005-03-09: This comment is not accurate in C99;
1680 	       however, it's not clear that all the floating point support
1681 	       in this file is doing any good here.  */
1682 	    else if (!got_dot && *p == '.')
1683 	      got_dot = 1;
1684 	    else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1685 		     && (*p == '-' || *p == '+'))
1686 	      /* This is the sign of the exponent, not the end of the
1687 		 number.  */
1688 	      continue;
1689 	    /* We will take any letters or digits.  parse_number will
1690 	       complain if past the radix, or if L or U are not final.  */
1691 	    else if (! ISALNUM (*p))
1692 	      break;
1693 	  }
1694 	toktype = parse_number (tokstart, p - tokstart, got_dot|got_e);
1695         if (toktype == ERROR)
1696 	  {
1697 	    char *err_copy = (char *) alloca (p - tokstart + 1);
1698 
1699 	    memcpy (err_copy, tokstart, p - tokstart);
1700 	    err_copy[p - tokstart] = 0;
1701 	    yyerror (_("invalid number"));
1702 	    return ERROR;
1703 	  }
1704 	lexptr = p;
1705 	return toktype;
1706       }
1707 
1708     case '+':
1709       HANDLE_TOKEN2 ("+=", ASSIGN_MODIFY);
1710       HANDLE_TOKEN2 ("++", INCREMENT);
1711       lexptr++;
1712       return c;
1713     case '*':
1714       HANDLE_TOKEN2 ("*=", ASSIGN_MODIFY);
1715       lexptr++;
1716       return c;
1717     case '/':
1718       HANDLE_TOKEN2 ("/=", ASSIGN_MODIFY);
1719       lexptr++;
1720       return c;
1721     case '%':
1722       HANDLE_TOKEN2 ("%=", ASSIGN_MODIFY);
1723       lexptr++;
1724       return c;
1725     case '|':
1726       HANDLE_TOKEN2 ("|=", ASSIGN_MODIFY);
1727       HANDLE_TOKEN2 ("||", OROR);
1728       lexptr++;
1729       return c;
1730     case '&':
1731       HANDLE_TOKEN2 ("&=", ASSIGN_MODIFY);
1732       HANDLE_TOKEN2 ("&&", ANDAND);
1733       lexptr++;
1734       return c;
1735     case '^':
1736       HANDLE_TOKEN2 ("^=", ASSIGN_MODIFY);
1737       lexptr++;
1738       return c;
1739     case '!':
1740       HANDLE_TOKEN2 ("!=", NOTEQUAL);
1741       lexptr++;
1742       return c;
1743     case '<':
1744       HANDLE_TOKEN3 ("<<=", ASSIGN_MODIFY);
1745       HANDLE_TOKEN2 ("<=", LEQ);
1746       HANDLE_TOKEN2 ("<<", LSH);
1747       lexptr++;
1748       return c;
1749     case '>':
1750       HANDLE_TOKEN3 (">>=", ASSIGN_MODIFY);
1751       HANDLE_TOKEN2 (">=", GEQ);
1752       HANDLE_TOKEN2 (">>", RSH);
1753       lexptr++;
1754       return c;
1755     case '=':
1756       HANDLE_TOKEN2 ("==", EQUAL);
1757       lexptr++;
1758       return c;
1759     case ':':
1760       HANDLE_TOKEN2 ("::", COLONCOLON);
1761       lexptr++;
1762       return c;
1763 
1764     case '[':
1765     case ']':
1766     case '?':
1767     case '@':
1768     case '~':
1769     case '{':
1770     case '}':
1771     symbol:
1772       lexptr++;
1773       return c;
1774 
1775     case '"':
1776       /* These can't occur in C++ names.  */
1777       yyerror (_("unexpected string literal"));
1778       return ERROR;
1779     }
1780 
1781   if (!(c == '_' || c == '$' || ISALPHA (c)))
1782     {
1783       /* We must have come across a bad character (e.g. ';').  */
1784       yyerror (_("invalid character"));
1785       return ERROR;
1786     }
1787 
1788   /* It's a name.  See how long it is.  */
1789   namelen = 0;
1790   do
1791     c = tokstart[++namelen];
1792   while (ISALNUM (c) || c == '_' || c == '$');
1793 
1794   lexptr += namelen;
1795 
1796   /* Catch specific keywords.  Notice that some of the keywords contain
1797      spaces, and are sorted by the length of the first word.  They must
1798      all include a trailing space in the string comparison.  */
1799   switch (namelen)
1800     {
1801     case 16:
1802       if (strncmp (tokstart, "reinterpret_cast", 16) == 0)
1803         return REINTERPRET_CAST;
1804       break;
1805     case 12:
1806       if (strncmp (tokstart, "construction vtable for ", 24) == 0)
1807 	{
1808 	  lexptr = tokstart + 24;
1809 	  return CONSTRUCTION_VTABLE;
1810 	}
1811       if (strncmp (tokstart, "dynamic_cast", 12) == 0)
1812         return DYNAMIC_CAST;
1813       break;
1814     case 11:
1815       if (strncmp (tokstart, "static_cast", 11) == 0)
1816         return STATIC_CAST;
1817       break;
1818     case 9:
1819       HANDLE_SPECIAL ("covariant return thunk to ", DEMANGLE_COMPONENT_COVARIANT_THUNK);
1820       HANDLE_SPECIAL ("reference temporary for ", DEMANGLE_COMPONENT_REFTEMP);
1821       break;
1822     case 8:
1823       HANDLE_SPECIAL ("typeinfo for ", DEMANGLE_COMPONENT_TYPEINFO);
1824       HANDLE_SPECIAL ("typeinfo fn for ", DEMANGLE_COMPONENT_TYPEINFO_FN);
1825       HANDLE_SPECIAL ("typeinfo name for ", DEMANGLE_COMPONENT_TYPEINFO_NAME);
1826       if (strncmp (tokstart, "operator", 8) == 0)
1827 	return OPERATOR;
1828       if (strncmp (tokstart, "restrict", 8) == 0)
1829 	return RESTRICT;
1830       if (strncmp (tokstart, "unsigned", 8) == 0)
1831 	return UNSIGNED;
1832       if (strncmp (tokstart, "template", 8) == 0)
1833 	return TEMPLATE;
1834       if (strncmp (tokstart, "volatile", 8) == 0)
1835 	return VOLATILE_KEYWORD;
1836       break;
1837     case 7:
1838       HANDLE_SPECIAL ("virtual thunk to ", DEMANGLE_COMPONENT_VIRTUAL_THUNK);
1839       if (strncmp (tokstart, "wchar_t", 7) == 0)
1840 	return WCHAR_T;
1841       break;
1842     case 6:
1843       if (strncmp (tokstart, "global constructors keyed to ", 29) == 0)
1844 	{
1845 	  const char *p;
1846 	  lexptr = tokstart + 29;
1847 	  yylval.lval = DEMANGLE_COMPONENT_GLOBAL_CONSTRUCTORS;
1848 	  /* Find the end of the symbol.  */
1849 	  p = symbol_end (lexptr);
1850 	  yylval.comp = make_name (lexptr, p - lexptr);
1851 	  lexptr = p;
1852 	  return DEMANGLER_SPECIAL;
1853 	}
1854       if (strncmp (tokstart, "global destructors keyed to ", 28) == 0)
1855 	{
1856 	  const char *p;
1857 	  lexptr = tokstart + 28;
1858 	  yylval.lval = DEMANGLE_COMPONENT_GLOBAL_DESTRUCTORS;
1859 	  /* Find the end of the symbol.  */
1860 	  p = symbol_end (lexptr);
1861 	  yylval.comp = make_name (lexptr, p - lexptr);
1862 	  lexptr = p;
1863 	  return DEMANGLER_SPECIAL;
1864 	}
1865 
1866       HANDLE_SPECIAL ("vtable for ", DEMANGLE_COMPONENT_VTABLE);
1867       if (strncmp (tokstart, "delete", 6) == 0)
1868 	return DELETE;
1869       if (strncmp (tokstart, "struct", 6) == 0)
1870 	return STRUCT;
1871       if (strncmp (tokstart, "signed", 6) == 0)
1872 	return SIGNED_KEYWORD;
1873       if (strncmp (tokstart, "sizeof", 6) == 0)
1874 	return SIZEOF;
1875       if (strncmp (tokstart, "double", 6) == 0)
1876 	return DOUBLE_KEYWORD;
1877       break;
1878     case 5:
1879       HANDLE_SPECIAL ("guard variable for ", DEMANGLE_COMPONENT_GUARD);
1880       if (strncmp (tokstart, "false", 5) == 0)
1881 	return FALSEKEYWORD;
1882       if (strncmp (tokstart, "class", 5) == 0)
1883 	return CLASS;
1884       if (strncmp (tokstart, "union", 5) == 0)
1885 	return UNION;
1886       if (strncmp (tokstart, "float", 5) == 0)
1887 	return FLOAT_KEYWORD;
1888       if (strncmp (tokstart, "short", 5) == 0)
1889 	return SHORT;
1890       if (strncmp (tokstart, "const", 5) == 0)
1891 	return CONST_KEYWORD;
1892       break;
1893     case 4:
1894       if (strncmp (tokstart, "void", 4) == 0)
1895 	return VOID;
1896       if (strncmp (tokstart, "bool", 4) == 0)
1897 	return BOOL;
1898       if (strncmp (tokstart, "char", 4) == 0)
1899 	return CHAR;
1900       if (strncmp (tokstart, "enum", 4) == 0)
1901 	return ENUM;
1902       if (strncmp (tokstart, "long", 4) == 0)
1903 	return LONG;
1904       if (strncmp (tokstart, "true", 4) == 0)
1905 	return TRUEKEYWORD;
1906       break;
1907     case 3:
1908       HANDLE_SPECIAL ("VTT for ", DEMANGLE_COMPONENT_VTT);
1909       HANDLE_SPECIAL ("non-virtual thunk to ", DEMANGLE_COMPONENT_THUNK);
1910       if (strncmp (tokstart, "new", 3) == 0)
1911 	return NEW;
1912       if (strncmp (tokstart, "int", 3) == 0)
1913 	return INT_KEYWORD;
1914       break;
1915     default:
1916       break;
1917     }
1918 
1919   yylval.comp = make_name (tokstart, namelen);
1920   return NAME;
1921 }
1922 
1923 static void
1924 yyerror (char *msg)
1925 {
1926   if (global_errmsg)
1927     return;
1928 
1929   error_lexptr = prev_lexptr;
1930   global_errmsg = msg ? msg : "parse error";
1931 }
1932 
1933 /* Allocate a chunk of the components we'll need to build a tree.  We
1934    generally allocate too many components, but the extra memory usage
1935    doesn't hurt because the trees are temporary and the storage is
1936    reused.  More may be allocated later, by d_grab.  */
1937 static struct demangle_info *
1938 allocate_info (void)
1939 {
1940   struct demangle_info *info = malloc (sizeof (struct demangle_info));
1941 
1942   info->next = NULL;
1943   info->used = 0;
1944   return info;
1945 }
1946 
1947 /* Convert RESULT to a string.  The return value is allocated
1948    using xmalloc.  ESTIMATED_LEN is used only as a guide to the
1949    length of the result.  This functions handles a few cases that
1950    cplus_demangle_print does not, specifically the global destructor
1951    and constructor labels.  */
1952 
1953 char *
1954 cp_comp_to_string (struct demangle_component *result, int estimated_len)
1955 {
1956   size_t err;
1957 
1958   return cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, result, estimated_len,
1959 			       &err);
1960 }
1961 
1962 /* A convenience function to allocate and initialize a new struct
1963    demangled_parse_info.  */
1964 
1965 struct demangle_parse_info *
1966 cp_new_demangle_parse_info (void)
1967 {
1968   struct demangle_parse_info *info;
1969 
1970   info = malloc (sizeof (struct demangle_parse_info));
1971   info->info = NULL;
1972   info->tree = NULL;
1973   obstack_init (&info->obstack);
1974 
1975   return info;
1976 }
1977 
1978 /* Free any memory associated with the given PARSE_INFO.  */
1979 
1980 void
1981 cp_demangled_name_parse_free (struct demangle_parse_info *parse_info)
1982 {
1983   struct demangle_info *info = parse_info->info;
1984 
1985   /* Free any allocated chunks of memory for the parse.  */
1986   while (info != NULL)
1987     {
1988       struct demangle_info *next = info->next;
1989 
1990       free (info);
1991       info = next;
1992     }
1993 
1994   /* Free any memory allocated during typedef replacement.  */
1995   obstack_free (&parse_info->obstack, NULL);
1996 
1997   /* Free the parser info.  */
1998   free (parse_info);
1999 }
2000 
2001 /* Merge the two parse trees given by DEST and SRC.  The parse tree
2002    in SRC is attached to DEST at the node represented by TARGET.
2003    SRC is then freed.
2004 
2005    NOTE 1: Since there is no API to merge obstacks, this function does
2006    even attempt to try it.  Fortunately, we do not (yet?) need this ability.
2007    The code will assert if SRC->obstack is not empty.
2008 
2009    NOTE 2: The string from which SRC was parsed must not be freed, since
2010    this function will place pointers to that string into DEST.  */
2011 
2012 void
2013 cp_merge_demangle_parse_infos (struct demangle_parse_info *dest,
2014 			       struct demangle_component *target,
2015 			       struct demangle_parse_info *src)
2016 
2017 {
2018   struct demangle_info *di;
2019 
2020   /* Copy the SRC's parse data into DEST.  */
2021   *target = *src->tree;
2022   di = dest->info;
2023   while (di->next != NULL)
2024     di = di->next;
2025   di->next = src->info;
2026 
2027   /* Clear the (pointer to) SRC's parse data so that it is not freed when
2028      cp_demangled_parse_info_free is called.  */
2029   src->info = NULL;
2030 
2031   /* Free SRC.  */
2032   cp_demangled_name_parse_free (src);
2033 }
2034 
2035 /* Convert a demangled name to a demangle_component tree.  On success,
2036    a structure containing the root of the new tree is returned; it must
2037    be freed by calling cp_demangled_name_parse_free. On error, NULL is
2038    returned, and an error message will be set in *ERRMSG (which does
2039    not need to be freed).  */
2040 
2041 struct demangle_parse_info *
2042 cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg)
2043 {
2044   static char errbuf[60];
2045   struct demangle_parse_info *result;
2046 
2047   prev_lexptr = lexptr = demangled_name;
2048   error_lexptr = NULL;
2049   global_errmsg = NULL;
2050 
2051   demangle_info = allocate_info ();
2052 
2053   result = cp_new_demangle_parse_info ();
2054   result->info = demangle_info;
2055 
2056   if (yyparse ())
2057     {
2058       if (global_errmsg && errmsg)
2059 	{
2060 	  snprintf (errbuf, sizeof (errbuf) - 2, "%s, near `%s",
2061 		    global_errmsg, error_lexptr);
2062 	  strcat (errbuf, "'");
2063 	  *errmsg = errbuf;
2064 	}
2065       cp_demangled_name_parse_free (result);
2066       return NULL;
2067     }
2068 
2069   result->tree = global_result;
2070   global_result = NULL;
2071 
2072   return result;
2073 }
2074 
2075 #ifdef TEST_CPNAMES
2076 
2077 static void
2078 cp_print (struct demangle_component *result)
2079 {
2080   char *str;
2081   size_t err = 0;
2082 
2083   str = cplus_demangle_print (DMGL_PARAMS | DMGL_ANSI, result, 64, &err);
2084   if (str == NULL)
2085     return;
2086 
2087   fputs (str, stdout);
2088 
2089   free (str);
2090 }
2091 
2092 static char
2093 trim_chars (char *lexptr, char **extra_chars)
2094 {
2095   char *p = (char *) symbol_end (lexptr);
2096   char c = 0;
2097 
2098   if (*p)
2099     {
2100       c = *p;
2101       *p = 0;
2102       *extra_chars = p + 1;
2103     }
2104 
2105   return c;
2106 }
2107 
2108 /* When this file is built as a standalone program, xmalloc comes from
2109    libiberty --- in which case we have to provide xfree ourselves.  */
2110 
2111 void
2112 xfree (void *ptr)
2113 {
2114   if (ptr != NULL)
2115     {
2116       /* Literal `free' would get translated back to xfree again.  */
2117       CONCAT2 (fr,ee) (ptr);
2118     }
2119 }
2120 
2121 /* GDB normally defines internal_error itself, but when this file is built
2122    as a standalone program, we must also provide an implementation.  */
2123 
2124 void
2125 internal_error (const char *file, int line, const char *fmt, ...)
2126 {
2127   va_list ap;
2128 
2129   va_start (ap, fmt);
2130   fprintf (stderr, "%s:%d: internal error: ", file, line);
2131   vfprintf (stderr, fmt, ap);
2132   exit (1);
2133 }
2134 
2135 int
2136 main (int argc, char **argv)
2137 {
2138   char *str2, *extra_chars = "", c;
2139   char buf[65536];
2140   int arg;
2141   const char *errmsg;
2142   struct demangle_parse_info *result;
2143 
2144   arg = 1;
2145   if (argv[arg] && strcmp (argv[arg], "--debug") == 0)
2146     {
2147       yydebug = 1;
2148       arg++;
2149     }
2150 
2151   if (argv[arg] == NULL)
2152     while (fgets (buf, 65536, stdin) != NULL)
2153       {
2154 	int len;
2155 	buf[strlen (buf) - 1] = 0;
2156 	/* Use DMGL_VERBOSE to get expanded standard substitutions.  */
2157 	c = trim_chars (buf, &extra_chars);
2158 	str2 = cplus_demangle (buf, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
2159 	if (str2 == NULL)
2160 	  {
2161 	    printf ("Demangling error\n");
2162 	    if (c)
2163 	      printf ("%s%c%s\n", buf, c, extra_chars);
2164 	    else
2165 	      printf ("%s\n", buf);
2166 	    continue;
2167 	  }
2168 	result = cp_demangled_name_to_comp (str2, &errmsg);
2169 	if (result == NULL)
2170 	  {
2171 	    fputs (errmsg, stderr);
2172 	    fputc ('\n', stderr);
2173 	    continue;
2174 	  }
2175 
2176 	cp_print (result->tree);
2177 	cp_demangled_name_parse_free (result);
2178 
2179 	free (str2);
2180 	if (c)
2181 	  {
2182 	    putchar (c);
2183 	    fputs (extra_chars, stdout);
2184 	  }
2185 	putchar ('\n');
2186       }
2187   else
2188     {
2189       result = cp_demangled_name_to_comp (argv[arg], &errmsg);
2190       if (result == NULL)
2191 	{
2192 	  fputs (errmsg, stderr);
2193 	  fputc ('\n', stderr);
2194 	  return 0;
2195 	}
2196       cp_print (result->tree);
2197       cp_demangled_name_parse_free (result);
2198       putchar ('\n');
2199     }
2200   return 0;
2201 }
2202 
2203 #endif
2204