Concretize gimple_call_nothrow_p
[official-gcc.git] / gcc / gengtype-parse.c
blob0f11cec7c413c5eb030434cd99f6c87c3dc31243
1 /* Process source files and output type information.
2 Copyright (C) 2006-2014 Free Software Foundation, Inc.
4 This file is part of GCC.
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
20 #ifdef GENERATOR_FILE
21 #include "bconfig.h"
22 #else
23 #include "config.h"
24 #endif
25 #include "system.h"
26 #include "gengtype.h"
28 /* This is a simple recursive-descent parser which understands a subset of
29 the C type grammar.
31 Rule functions are suffixed _seq if they scan a sequence of items;
32 _opt if they may consume zero tokens; _seqopt if both are true. The
33 "consume_" prefix indicates that a sequence of tokens is parsed for
34 syntactic correctness and then thrown away. */
36 /* Simple one-token lookahead mechanism. */
38 struct token
40 const char *value;
41 int code;
42 bool valid;
44 static struct token T;
46 /* Retrieve the code of the current token; if there is no current token,
47 get the next one from the lexer. */
48 static inline int
49 token (void)
51 if (!T.valid)
53 T.code = yylex (&T.value);
54 T.valid = true;
56 return T.code;
59 /* Retrieve the value of the current token (if any) and mark it consumed.
60 The next call to token() will get another token from the lexer. */
61 static inline const char *
62 advance (void)
64 T.valid = false;
65 return T.value;
68 /* Diagnostics. */
70 /* This array is indexed by the token code minus CHAR_TOKEN_OFFSET. */
71 static const char *const token_names[] = {
72 "GTY",
73 "typedef",
74 "extern",
75 "static",
76 "union",
77 "struct",
78 "enum",
79 "...",
80 "ptr_alias",
81 "nested_ptr",
82 "a param<N>_is option",
83 "a number",
84 "a scalar type",
85 "an identifier",
86 "a string constant",
87 "a character constant",
88 "an array declarator",
89 "a C++ keyword to ignore"
92 /* This array is indexed by token code minus FIRST_TOKEN_WITH_VALUE. */
93 static const char *const token_value_format[] = {
94 "%s",
95 "'%s'",
96 "'%s'",
97 "'%s'",
98 "'\"%s\"'",
99 "\"'%s'\"",
100 "'[%s]'",
101 "'%s'",
104 /* Produce a printable representation for a token defined by CODE and
105 VALUE. This sometimes returns pointers into malloc memory and
106 sometimes not, therefore it is unsafe to free the pointer it
107 returns, so that memory is leaked. This does not matter, as this
108 function is only used for diagnostics, and in a successful run of
109 the program there will be none. */
110 static const char *
111 print_token (int code, const char *value)
113 if (code < CHAR_TOKEN_OFFSET)
114 return xasprintf ("'%c'", code);
115 else if (code < FIRST_TOKEN_WITH_VALUE)
116 return xasprintf ("'%s'", token_names[code - CHAR_TOKEN_OFFSET]);
117 else if (!value)
118 return token_names[code - CHAR_TOKEN_OFFSET]; /* don't quote these */
119 else
120 return xasprintf (token_value_format[code - FIRST_TOKEN_WITH_VALUE],
121 value);
124 /* Convenience wrapper around print_token which produces the printable
125 representation of the current token. */
126 static inline const char *
127 print_cur_token (void)
129 return print_token (T.code, T.value);
132 /* Report a parse error on the current line, with diagnostic MSG.
133 Behaves as standard printf with respect to additional arguments and
134 format escapes. */
135 static void ATTRIBUTE_PRINTF_1
136 parse_error (const char *msg, ...)
138 va_list ap;
140 fprintf (stderr, "%s:%d: parse error: ",
141 get_input_file_name (lexer_line.file), lexer_line.line);
143 va_start (ap, msg);
144 vfprintf (stderr, msg, ap);
145 va_end (ap);
147 fputc ('\n', stderr);
149 hit_error = true;
152 /* If the next token does not have code T, report a parse error; otherwise
153 return the token's value. */
154 static const char *
155 require (int t)
157 int u = token ();
158 const char *v = advance ();
159 if (u != t)
161 parse_error ("expected %s, have %s",
162 print_token (t, 0), print_token (u, v));
163 return 0;
165 return v;
168 /* As per require, but do not advance. */
169 static const char *
170 require_without_advance (int t)
172 int u = token ();
173 const char *v = T.value;
174 if (u != t)
176 parse_error ("expected %s, have %s",
177 print_token (t, 0), print_token (u, v));
178 return 0;
180 return v;
183 /* If the next token does not have one of the codes T1 or T2, report a
184 parse error; otherwise return the token's value. */
185 static const char *
186 require2 (int t1, int t2)
188 int u = token ();
189 const char *v = advance ();
190 if (u != t1 && u != t2)
192 parse_error ("expected %s or %s, have %s",
193 print_token (t1, 0), print_token (t2, 0),
194 print_token (u, v));
195 return 0;
197 return v;
200 /* If the next token does not have one of the codes T1, T2, T3 or T4, report a
201 parse error; otherwise return the token's value. */
202 static const char *
203 require4 (int t1, int t2, int t3, int t4)
205 int u = token ();
206 const char *v = advance ();
207 if (u != t1 && u != t2 && u != t3 && u != t4)
209 parse_error ("expected %s, %s, %s or %s, have %s",
210 print_token (t1, 0), print_token (t2, 0),
211 print_token (t3, 0), print_token (t4, 0),
212 print_token (u, v));
213 return 0;
215 return v;
218 /* Near-terminals. */
220 /* C-style string constant concatenation: STRING+
221 Bare STRING should appear nowhere else in this file. */
222 static const char *
223 string_seq (void)
225 const char *s1, *s2;
226 size_t l1, l2;
227 char *buf;
229 s1 = require (STRING);
230 if (s1 == 0)
231 return "";
232 while (token () == STRING)
234 s2 = advance ();
236 l1 = strlen (s1);
237 l2 = strlen (s2);
238 buf = XRESIZEVEC (char, CONST_CAST (char *, s1), l1 + l2 + 1);
239 memcpy (buf + l1, s2, l2 + 1);
240 XDELETE (CONST_CAST (char *, s2));
241 s1 = buf;
243 return s1;
247 /* The caller has detected a template declaration that starts
248 with TMPL_NAME. Parse up to the closing '>'. This recognizes
249 simple template declarations of the form ID<ID1,ID2,...,IDn>,
250 potentially with a single level of indirection e.g.
251 ID<ID1 *, ID2, ID3 *, ..., IDn>.
252 It does not try to parse anything more sophisticated than that.
254 Returns the template declaration string "ID<ID1,ID2,...,IDn>". */
256 static const char *
257 require_template_declaration (const char *tmpl_name)
259 char *str;
260 int num_indirections = 0;
262 /* Recognize the opening '<'. */
263 require ('<');
264 str = concat (tmpl_name, "<", (char *) 0);
266 /* Read the comma-separated list of identifiers. */
267 int depth = 1;
268 while (depth > 0)
270 if (token () == ENUM)
272 advance ();
273 str = concat (str, "enum ", (char *) 0);
274 continue;
276 if (token () == NUM)
278 str = concat (str, advance (), (char *) 0);
279 continue;
281 if (token () == ':')
283 advance ();
284 str = concat (str, ":", (char *) 0);
285 continue;
287 if (token () == '<')
289 advance ();
290 str = concat (str, "<", (char *) 0);
291 depth += 1;
292 continue;
294 if (token () == '>')
296 advance ();
297 str = concat (str, ">", (char *) 0);
298 depth -= 1;
299 continue;
301 const char *id = require4 (SCALAR, ID, '*', ',');
302 if (id == NULL)
304 if (T.code == '*')
306 id = "*";
307 if (num_indirections++)
308 parse_error ("only one level of indirection is supported"
309 " in template arguments");
311 else
312 id = ",";
314 else
315 num_indirections = 0;
316 str = concat (str, id, (char *) 0);
318 return str;
322 /* typedef_name: either an ID, or a template type
323 specification of the form ID<t1,t2,...,tn>. */
325 static const char *
326 typedef_name (void)
328 const char *id = require (ID);
329 if (token () == '<')
330 return require_template_declaration (id);
331 else
332 return id;
335 /* Absorb a sequence of tokens delimited by balanced ()[]{}. */
336 static void
337 consume_balanced (int opener, int closer)
339 require (opener);
340 for (;;)
341 switch (token ())
343 default:
344 advance ();
345 break;
346 case '(':
347 consume_balanced ('(', ')');
348 break;
349 case '[':
350 consume_balanced ('[', ']');
351 break;
352 case '{':
353 consume_balanced ('{', '}');
354 break;
356 case '}':
357 case ']':
358 case ')':
359 if (token () != closer)
360 parse_error ("unbalanced delimiters - expected '%c', have '%c'",
361 closer, token ());
362 advance ();
363 return;
365 case EOF_TOKEN:
366 parse_error ("unexpected end of file within %c%c-delimited construct",
367 opener, closer);
368 return;
372 /* Absorb a sequence of tokens, possibly including ()[]{}-delimited
373 expressions, until we encounter an end-of-statement marker (a ';' or
374 a '}') outside any such delimiters; absorb that too. */
376 static void
377 consume_until_eos (void)
379 for (;;)
380 switch (token ())
382 case ';':
383 advance ();
384 return;
386 case '{':
387 consume_balanced ('{', '}');
388 return;
390 case '(':
391 consume_balanced ('(', ')');
392 break;
394 case '[':
395 consume_balanced ('[', ']');
396 break;
398 case '}':
399 case ']':
400 case ')':
401 parse_error ("unmatched '%c' while scanning for ';'", token ());
402 return;
404 case EOF_TOKEN:
405 parse_error ("unexpected end of file while scanning for ';'");
406 return;
408 default:
409 advance ();
410 break;
414 /* Absorb a sequence of tokens, possibly including ()[]{}-delimited
415 expressions, until we encounter a comma or semicolon outside any
416 such delimiters; absorb that too. Returns true if the loop ended
417 with a comma. */
419 static bool
420 consume_until_comma_or_eos ()
422 for (;;)
423 switch (token ())
425 case ',':
426 advance ();
427 return true;
429 case ';':
430 advance ();
431 return false;
433 case '{':
434 consume_balanced ('{', '}');
435 return false;
437 case '(':
438 consume_balanced ('(', ')');
439 break;
441 case '[':
442 consume_balanced ('[', ']');
443 break;
445 case '}':
446 case ']':
447 case ')':
448 parse_error ("unmatched '%s' while scanning for ',' or ';'",
449 print_cur_token ());
450 return false;
452 case EOF_TOKEN:
453 parse_error ("unexpected end of file while scanning for ',' or ';'");
454 return false;
456 default:
457 advance ();
458 break;
463 /* GTY(()) option handling. */
464 static type_p type (options_p *optsp, bool nested);
466 /* Optional parenthesized string: ('(' string_seq ')')? */
467 static options_p
468 str_optvalue_opt (options_p prev)
470 const char *name = advance ();
471 const char *value = "";
472 if (token () == '(')
474 advance ();
475 value = string_seq ();
476 require (')');
478 return create_string_option (prev, name, value);
481 /* absdecl: type '*'*
482 -- a vague approximation to what the C standard calls an abstract
483 declarator. The only kinds that are actually used are those that
484 are just a bare type and those that have trailing pointer-stars.
485 Further kinds should be implemented if and when they become
486 necessary. Used only within GTY(()) option values, therefore
487 further GTY(()) tags within the type are invalid. Note that the
488 return value has already been run through adjust_field_type. */
489 static type_p
490 absdecl (void)
492 type_p ty;
493 options_p opts;
495 ty = type (&opts, true);
496 while (token () == '*')
498 ty = create_pointer (ty);
499 advance ();
502 if (opts)
503 parse_error ("nested GTY(()) options are invalid");
505 return adjust_field_type (ty, 0);
508 /* Type-option: '(' absdecl ')' */
509 static options_p
510 type_optvalue (options_p prev, const char *name)
512 type_p ty;
513 require ('(');
514 ty = absdecl ();
515 require (')');
516 return create_type_option (prev, name, ty);
519 /* Nested pointer data: '(' type '*'* ',' string_seq ',' string_seq ')' */
520 static options_p
521 nestedptr_optvalue (options_p prev)
523 type_p ty;
524 const char *from, *to;
526 require ('(');
527 ty = absdecl ();
528 require (',');
529 to = string_seq ();
530 require (',');
531 from = string_seq ();
532 require (')');
534 return create_nested_ptr_option (prev, ty, to, from);
537 /* One GTY(()) option:
538 ID str_optvalue_opt
539 | PTR_ALIAS type_optvalue
540 | PARAM_IS type_optvalue
541 | NESTED_PTR nestedptr_optvalue
543 static options_p
544 option (options_p prev)
546 switch (token ())
548 case ID:
549 return str_optvalue_opt (prev);
551 case PTR_ALIAS:
552 advance ();
553 return type_optvalue (prev, "ptr_alias");
555 case PARAM_IS:
556 return type_optvalue (prev, advance ());
558 case NESTED_PTR:
559 advance ();
560 return nestedptr_optvalue (prev);
562 case USER_GTY:
563 advance ();
564 return create_string_option (prev, "user", "");
566 default:
567 parse_error ("expected an option keyword, have %s", print_cur_token ());
568 advance ();
569 return create_string_option (prev, "", "");
573 /* One comma-separated list of options. */
574 static options_p
575 option_seq (void)
577 options_p o;
579 o = option (0);
580 while (token () == ',')
582 advance ();
583 o = option (o);
585 return o;
588 /* GTY marker: 'GTY' '(' '(' option_seq? ')' ')' */
589 static options_p
590 gtymarker (void)
592 options_p result = 0;
593 require (GTY_TOKEN);
594 require ('(');
595 require ('(');
596 if (token () != ')')
597 result = option_seq ();
598 require (')');
599 require (')');
600 return result;
603 /* Optional GTY marker. */
604 static options_p
605 gtymarker_opt (void)
607 if (token () != GTY_TOKEN)
608 return 0;
609 return gtymarker ();
614 /* Declarators. The logic here is largely lifted from c-parser.c.
615 Note that we do not have to process abstract declarators, which can
616 appear only in parameter type lists or casts (but see absdecl,
617 above). Also, type qualifiers are thrown out in gengtype-lex.l so
618 we don't have to do it. */
620 /* array_and_function_declarators_opt:
621 \epsilon
622 array_and_function_declarators_opt ARRAY
623 array_and_function_declarators_opt '(' ... ')'
625 where '...' indicates stuff we ignore except insofar as grouping
626 symbols ()[]{} must balance.
628 Subroutine of direct_declarator - do not use elsewhere. */
630 static type_p
631 array_and_function_declarators_opt (type_p ty)
633 if (token () == ARRAY)
635 const char *array = advance ();
636 return create_array (array_and_function_declarators_opt (ty), array);
638 else if (token () == '(')
640 /* We don't need exact types for functions. */
641 consume_balanced ('(', ')');
642 array_and_function_declarators_opt (ty);
643 return create_scalar_type ("function type");
645 else
646 return ty;
649 static type_p inner_declarator (type_p, const char **, options_p *, bool);
651 /* direct_declarator:
652 '(' inner_declarator ')'
653 '(' \epsilon ')' <-- C++ ctors/dtors
654 gtymarker_opt ID array_and_function_declarators_opt
656 Subroutine of declarator, mutually recursive with inner_declarator;
657 do not use elsewhere.
659 IN_STRUCT is true if we are called while parsing structures or classes. */
661 static type_p
662 direct_declarator (type_p ty, const char **namep, options_p *optsp,
663 bool in_struct)
665 /* The first token in a direct-declarator must be an ID, a
666 GTY marker, or an open parenthesis. */
667 switch (token ())
669 case GTY_TOKEN:
670 *optsp = gtymarker ();
671 /* fall through */
673 case ID:
674 *namep = require (ID);
675 /* If the next token is '(', we are parsing a function declaration.
676 Functions are ignored by gengtype, so we return NULL. */
677 if (token () == '(')
678 return NULL;
679 break;
681 case '(':
682 /* If the declarator starts with a '(', we have three options. We
683 are either parsing 'TYPE (*ID)' (i.e., a function pointer)
684 or 'TYPE(...)'.
686 The latter will be a constructor iff we are inside a
687 structure or class. Otherwise, it could be a typedef, but
688 since we explicitly reject typedefs inside structures, we can
689 assume that we found a ctor and return NULL. */
690 advance ();
691 if (in_struct && token () != '*')
693 /* Found a constructor. Find and consume the closing ')'. */
694 while (token () != ')')
695 advance ();
696 advance ();
697 /* Tell the caller to ignore this. */
698 return NULL;
700 ty = inner_declarator (ty, namep, optsp, in_struct);
701 require (')');
702 break;
704 case IGNORABLE_CXX_KEYWORD:
705 /* Any C++ keyword like 'operator' means that we are not looking
706 at a regular data declarator. */
707 return NULL;
709 default:
710 parse_error ("expected '(', ')', 'GTY', or an identifier, have %s",
711 print_cur_token ());
712 /* Do _not_ advance if what we have is a close squiggle brace, as
713 we will get much better error recovery that way. */
714 if (token () != '}')
715 advance ();
716 return 0;
718 return array_and_function_declarators_opt (ty);
721 /* The difference between inner_declarator and declarator is in the
722 handling of stars. Consider this declaration:
724 char * (*pfc) (void)
726 It declares a pointer to a function that takes no arguments and
727 returns a char*. To construct the correct type for this
728 declaration, the star outside the parentheses must be processed
729 _before_ the function type, the star inside the parentheses must
730 be processed _after_ the function type. To accomplish this,
731 declarator() creates pointers before recursing (it is actually
732 coded as a while loop), whereas inner_declarator() recurses before
733 creating pointers. */
735 /* inner_declarator:
736 '*' inner_declarator
737 direct_declarator
739 Mutually recursive subroutine of direct_declarator; do not use
740 elsewhere.
742 IN_STRUCT is true if we are called while parsing structures or classes. */
744 static type_p
745 inner_declarator (type_p ty, const char **namep, options_p *optsp,
746 bool in_struct)
748 if (token () == '*')
750 type_p inner;
751 advance ();
752 inner = inner_declarator (ty, namep, optsp, in_struct);
753 if (inner == 0)
754 return 0;
755 else
756 return create_pointer (ty);
758 else
759 return direct_declarator (ty, namep, optsp, in_struct);
762 /* declarator: '*'+ direct_declarator
764 This is the sole public interface to this part of the grammar.
765 Arguments are the type known so far, a pointer to where the name
766 may be stored, and a pointer to where GTY options may be stored.
768 IN_STRUCT is true when we are called to parse declarators inside
769 a structure or class.
771 Returns the final type. */
773 static type_p
774 declarator (type_p ty, const char **namep, options_p *optsp,
775 bool in_struct = false)
777 *namep = 0;
778 *optsp = 0;
779 while (token () == '*')
781 advance ();
782 ty = create_pointer (ty);
784 return direct_declarator (ty, namep, optsp, in_struct);
787 /* Types and declarations. */
789 /* Structure field(s) declaration:
791 type bitfield ';'
792 | type declarator bitfield? ( ',' declarator bitfield? )+ ';'
795 Knows that such declarations must end with a close brace (or,
796 erroneously, at EOF).
798 static pair_p
799 struct_field_seq (void)
801 pair_p f = 0;
802 type_p ty, dty;
803 options_p opts, dopts;
804 const char *name;
805 bool another;
807 while (token () != '}' && token () != EOF_TOKEN)
809 ty = type (&opts, true);
811 /* Ignore access-control keywords ("public:" etc). */
812 while (!ty && token () == IGNORABLE_CXX_KEYWORD)
814 const char *keyword = advance ();
815 if (strcmp (keyword, "public:") != 0
816 && strcmp (keyword, "private:") != 0
817 && strcmp (keyword, "protected:") != 0)
818 break;
819 ty = type (&opts, true);
822 if (!ty || token () == ':')
824 consume_until_eos ();
825 continue;
830 dty = declarator (ty, &name, &dopts, true);
832 /* There could be any number of weird things after the declarator,
833 notably bitfield declarations and __attribute__s. If this
834 function returns true, the last thing was a comma, so we have
835 more than one declarator paired with the current type. */
836 another = consume_until_comma_or_eos ();
838 if (!dty)
839 continue;
841 if (opts && dopts)
842 parse_error ("two GTY(()) options for field %s", name);
843 if (opts && !dopts)
844 dopts = opts;
846 f = create_field_at (f, dty, name, dopts, &lexer_line);
848 while (another);
850 return nreverse_pairs (f);
853 /* Return true if OPTS contain the option named STR. */
855 bool
856 opts_have (options_p opts, const char *str)
858 for (options_p opt = opts; opt; opt = opt->next)
859 if (strcmp (opt->name, str) == 0)
860 return true;
861 return false;
865 /* This is called type(), but what it parses (sort of) is what C calls
866 declaration-specifiers and specifier-qualifier-list:
868 SCALAR
869 | ID // typedef
870 | (STRUCT|UNION) ID? gtymarker? ( '{' gtymarker? struct_field_seq '}' )?
871 | ENUM ID ( '{' ... '}' )?
873 Returns a partial type; under some conditions (notably
874 "struct foo GTY((...)) thing;") it may write an options
875 structure to *OPTSP.
877 NESTED is true when parsing a declaration already known to have a
878 GTY marker. In these cases, typedef and enum declarations are not
879 allowed because gengtype only understands types at the global
880 scope. */
882 static type_p
883 type (options_p *optsp, bool nested)
885 const char *s;
886 *optsp = 0;
887 switch (token ())
889 case SCALAR:
890 s = advance ();
891 return create_scalar_type (s);
893 case ID:
894 s = typedef_name ();
895 return resolve_typedef (s, &lexer_line);
897 case IGNORABLE_CXX_KEYWORD:
898 /* By returning NULL here, we indicate to the caller that they
899 should ignore everything following this keyword up to the
900 next ';' or '}'. */
901 return NULL;
903 case STRUCT:
904 case UNION:
906 type_p base_class = NULL;
907 options_p opts = 0;
908 /* GTY annotations follow attribute syntax
909 GTY_BEFORE_ID is for union/struct declarations
910 GTY_AFTER_ID is for variable declarations. */
911 enum
913 NO_GTY,
914 GTY_BEFORE_ID,
915 GTY_AFTER_ID
916 } is_gty = NO_GTY;
917 enum typekind kind = (token () == UNION) ? TYPE_UNION : TYPE_STRUCT;
918 advance ();
920 /* Top-level structures that are not explicitly tagged GTY(())
921 are treated as mere forward declarations. This is because
922 there are a lot of structures that we don't need to know
923 about, and some of those have C++ and macro constructs that
924 we cannot handle. */
925 if (nested || token () == GTY_TOKEN)
927 is_gty = GTY_BEFORE_ID;
928 opts = gtymarker_opt ();
931 if (token () == ID)
932 s = advance ();
933 else
934 s = xasprintf ("anonymous:%s:%d",
935 get_input_file_name (lexer_line.file),
936 lexer_line.line);
938 /* Unfortunately above GTY_TOKEN check does not capture the
939 typedef struct_type GTY case. */
940 if (token () == GTY_TOKEN)
942 is_gty = GTY_AFTER_ID;
943 opts = gtymarker_opt ();
946 bool is_user_gty = opts_have (opts, "user");
948 if (token () == ':')
950 if (is_gty && !is_user_gty)
952 /* For GTY-marked types that are not "user", parse some C++
953 inheritance specifications.
954 We require single-inheritance from a non-template type. */
955 advance ();
956 const char *basename = require (ID);
957 /* This may be either an access specifier, or the base name. */
958 if (0 == strcmp (basename, "public")
959 || 0 == strcmp (basename, "protected")
960 || 0 == strcmp (basename, "private"))
961 basename = require (ID);
962 base_class = find_structure (basename, TYPE_STRUCT);
963 if (!base_class)
964 parse_error ("unrecognized base class: %s", basename);
965 require_without_advance ('{');
967 else
969 /* For types lacking GTY-markings, skip over C++ inheritance
970 specification (and thus avoid having to parse e.g. template
971 types). */
972 while (token () != '{')
973 advance ();
977 if (is_gty)
979 if (token () == '{')
981 pair_p fields;
983 if (is_gty == GTY_AFTER_ID)
984 parse_error ("GTY must be specified before identifier");
986 if (!is_user_gty)
988 advance ();
989 fields = struct_field_seq ();
990 require ('}');
992 else
994 /* Do not look inside user defined structures. */
995 fields = NULL;
996 kind = TYPE_USER_STRUCT;
997 consume_balanced ('{', '}');
998 return create_user_defined_type (s, &lexer_line);
1001 return new_structure (s, kind, &lexer_line, fields, opts,
1002 base_class);
1005 else if (token () == '{')
1006 consume_balanced ('{', '}');
1007 if (opts)
1008 *optsp = opts;
1009 return find_structure (s, kind);
1012 case TYPEDEF:
1013 /* In C++, a typedef inside a struct/class/union defines a new
1014 type for that inner scope. We cannot support this in
1015 gengtype because we have no concept of scoping.
1017 We handle typedefs in the global scope separately (see
1018 parse_file), so if we find a 'typedef', we must be inside
1019 a struct. */
1020 gcc_assert (nested);
1021 parse_error ("typedefs not supported in structures marked with "
1022 "automatic GTY markers. Use GTY((user)) to mark "
1023 "this structure.");
1024 advance ();
1025 return NULL;
1027 case ENUM:
1028 advance ();
1029 if (token () == ID)
1030 s = advance ();
1031 else
1032 s = xasprintf ("anonymous:%s:%d",
1033 get_input_file_name (lexer_line.file),
1034 lexer_line.line);
1036 if (token () == '{')
1037 consume_balanced ('{', '}');
1039 /* If after parsing the enum we are at the end of the statement,
1040 and we are currently inside a structure, then this was an
1041 enum declaration inside this scope.
1043 We cannot support this for the same reason we cannot support
1044 'typedef' inside structures (see the TYPEDEF handler above).
1045 If this happens, emit an error and return NULL. */
1046 if (nested && token () == ';')
1048 parse_error ("enum definitions not supported in structures marked "
1049 "with automatic GTY markers. Use GTY((user)) to mark "
1050 "this structure.");
1051 advance ();
1052 return NULL;
1055 return create_scalar_type (s);
1057 default:
1058 parse_error ("expected a type specifier, have %s", print_cur_token ());
1059 advance ();
1060 return create_scalar_type ("erroneous type");
1064 /* Top level constructs. */
1066 /* Dispatch declarations beginning with 'typedef'. */
1068 static void
1069 typedef_decl (void)
1071 type_p ty, dty;
1072 const char *name;
1073 options_p opts;
1074 bool another;
1076 gcc_assert (token () == TYPEDEF);
1077 advance ();
1079 ty = type (&opts, false);
1080 if (!ty)
1081 return;
1082 if (opts)
1083 parse_error ("GTY((...)) cannot be applied to a typedef");
1086 dty = declarator (ty, &name, &opts);
1087 if (opts)
1088 parse_error ("GTY((...)) cannot be applied to a typedef");
1090 /* Yet another place where we could have junk (notably attributes)
1091 after the declarator. */
1092 another = consume_until_comma_or_eos ();
1093 if (dty)
1094 do_typedef (name, dty, &lexer_line);
1096 while (another);
1099 /* Structure definition: type() does all the work. */
1101 static void
1102 struct_or_union (void)
1104 options_p dummy;
1105 type (&dummy, false);
1106 /* There may be junk after the type: notably, we cannot currently
1107 distinguish 'struct foo *function(prototype);' from 'struct foo;'
1108 ... we could call declarator(), but it's a waste of time at
1109 present. Instead, just eat whatever token is currently lookahead
1110 and go back to lexical skipping mode. */
1111 advance ();
1114 /* GC root declaration:
1115 (extern|static) gtymarker? type ID array_declarators_opt (';'|'=')
1116 If the gtymarker is not present, we ignore the rest of the declaration. */
1117 static void
1118 extern_or_static (void)
1120 options_p opts, opts2, dopts;
1121 type_p ty, dty;
1122 const char *name;
1123 require2 (EXTERN, STATIC);
1125 if (token () != GTY_TOKEN)
1127 advance ();
1128 return;
1131 opts = gtymarker ();
1132 ty = type (&opts2, true); /* if we get here, it's got a GTY(()) */
1133 dty = declarator (ty, &name, &dopts);
1135 if ((opts && dopts) || (opts && opts2) || (opts2 && dopts))
1136 parse_error ("GTY((...)) specified more than once for %s", name);
1137 else if (opts2)
1138 opts = opts2;
1139 else if (dopts)
1140 opts = dopts;
1142 if (dty)
1144 note_variable (name, adjust_field_type (dty, opts), opts, &lexer_line);
1145 require2 (';', '=');
1149 /* Parse the file FNAME for GC-relevant declarations and definitions.
1150 This is the only entry point to this file. */
1151 void
1152 parse_file (const char *fname)
1154 yybegin (fname);
1155 for (;;)
1157 switch (token ())
1159 case EXTERN:
1160 case STATIC:
1161 extern_or_static ();
1162 break;
1164 case STRUCT:
1165 case UNION:
1166 struct_or_union ();
1167 break;
1169 case TYPEDEF:
1170 typedef_decl ();
1171 break;
1173 case EOF_TOKEN:
1174 goto eof;
1176 default:
1177 parse_error ("unexpected top level token, %s", print_cur_token ());
1178 goto eof;
1180 lexer_toplevel_done = 1;
1183 eof:
1184 advance ();
1185 yyend ();