[PATCH][GIMPLE FE] Split out parser into separate file
Richard Biener
rguenther@suse.de
Thu Oct 27 07:28:00 GMT 2016
On Thu, 27 Oct 2016, Trevor Saunders wrote:
> On Tue, Oct 25, 2016 at 03:33:36PM +0200, Richard Biener wrote:
> >
> > Hi,
> >
> > so I did the massaging to split out the GIMPLE parsing routines out
> > to a separate file (quite tricky to get the gengtype issues correctly
> > so I thought to help out here and get things started).
>
> actually it looks like you didn't get the gengtype issues quiet right :(
> stage 1 is fine, but when doing a bootstrap stage 2 dies trying to build
> cc1obj. That's because objc pulls in c-parser.o, but not c-lang.o which
> means that the gengtype routines for c_parser which are in
> gt-c-c-parser.h (included by c-parser.c) are included in cc1obj, but the
> routines for vec<c_token_, va_gc> are not because they get put in
> gengtype-c.h which is included in c-lang.c. Unfortunately I'm not sure
> how to fix that off hand.
Hohumm. I've only bootstrapped with --enable-languages=c but indeed
I can reproduce this...
Indeed this was also the reason I had to add c-parser.h as #include
to c-lang.c ...
> Killing pch and moving c_parser out of gc memory would of course be one
> answer, but that's a rather massive hammer to use.
Yeah...
So the only thing I came up with was to privatize c_parser again
and provide some extra abstraction for accessing ->error and ->tokens_buf.
Bootstrap built stage1 cc1objc with --enable-stage1-languages=objc sofar,
will push soon.
Richard.
2016-10-27 Richard Biener <rguenther@suse.de>
c/
* c-lang.c: Revert changes.
* c-parser.c (struct c_parser): Put declaration back here.
(c_parser_tokens_buf): New function.
(c_parser_error): Likewise.
(c_parser_set_error): Likewise.
* c-parser.h (struct c_parser): Only declare forward.
(c_parser_tokens_buf): Declare.
(c_parser_error): Likewise.
(c_parser_set_error): Likewise.
* gimple-parser.c (c_parser_gimple_compound_statement):
Use c_parser_error.
(c_parser_gimple_binary_expression): Likewise.
(c_parser_gimple_postfix_expression_after_primary): Use
c_parser_tokens_buf.
(c_parser_gimple_declaration): Use c_parser_set_error.
diff --git a/gcc/c/c-lang.c b/gcc/c/c-lang.c
index a2dd768..b4096d0 100644
--- a/gcc/c/c-lang.c
+++ b/gcc/c/c-lang.c
@@ -25,8 +25,6 @@ along with GCC; see the file COPYING3. If not see
#include "langhooks.h"
#include "langhooks-def.h"
#include "c-objc-common.h"
-#include "c-family/c-pragma.h"
-#include "c-parser.h"
enum c_language_kind c_language = clk_c;
diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c
index ad80b16..f69121b 100644
--- a/gcc/c/c-parser.c
+++ b/gcc/c/c-parser.c
@@ -152,6 +152,83 @@ c_parse_init (void)
}
}
+/* A parser structure recording information about the state and
+ context of parsing. Includes lexer information with up to two
+ tokens of look-ahead; more are not needed for C. */
+struct GTY(()) c_parser {
+ /* The look-ahead tokens. */
+ c_token * GTY((skip)) tokens;
+ /* Buffer for look-ahead tokens. */
+ c_token GTY(()) tokens_buf[4];
+ /* How many look-ahead tokens are available (0 - 4, or
+ more if parsing from pre-lexed tokens). */
+ unsigned int tokens_avail;
+ /* True if a syntax error is being recovered from; false otherwise.
+ c_parser_error sets this flag. It should clear this flag when
+ enough tokens have been consumed to recover from the error. */
+ BOOL_BITFIELD error : 1;
+ /* True if we're processing a pragma, and shouldn't automatically
+ consume CPP_PRAGMA_EOL. */
+ BOOL_BITFIELD in_pragma : 1;
+ /* True if we're parsing the outermost block of an if statement. */
+ BOOL_BITFIELD in_if_block : 1;
+ /* True if we want to lex an untranslated string. */
+ BOOL_BITFIELD lex_untranslated_string : 1;
+
+ /* Objective-C specific parser/lexer information. */
+
+ /* True if we are in a context where the Objective-C "PQ" keywords
+ are considered keywords. */
+ BOOL_BITFIELD objc_pq_context : 1;
+ /* True if we are parsing a (potential) Objective-C foreach
+ statement. This is set to true after we parsed 'for (' and while
+ we wait for 'in' or ';' to decide if it's a standard C for loop or an
+ Objective-C foreach loop. */
+ BOOL_BITFIELD objc_could_be_foreach_context : 1;
+ /* The following flag is needed to contextualize Objective-C lexical
+ analysis. In some cases (e.g., 'int NSObject;'), it is
+ undesirable to bind an identifier to an Objective-C class, even
+ if a class with that name exists. */
+ BOOL_BITFIELD objc_need_raw_identifier : 1;
+ /* Nonzero if we're processing a __transaction statement. The value
+ is 1 | TM_STMT_ATTR_*. */
+ unsigned int in_transaction : 4;
+ /* True if we are in a context where the Objective-C "Property attribute"
+ keywords are valid. */
+ BOOL_BITFIELD objc_property_attr_context : 1;
+
+ /* Cilk Plus specific parser/lexer information. */
+
+ /* Buffer to hold all the tokens from parsing the vector attribute for the
+ SIMD-enabled functions (formerly known as elemental functions). */
+ vec <c_token, va_gc> *cilk_simd_fn_tokens;
+};
+
+/* Return a pointer to the Nth token in PARERs tokens_buf. */
+
+c_token *
+c_parser_tokens_buf (c_parser *parser, unsigned n)
+{
+ return &parser->tokens_buf[n];
+}
+
+/* Return the error state of PARSER. */
+
+bool
+c_parser_error (c_parser *parser)
+{
+ return parser->error;
+}
+
+/* Set the error state of PARSER to ERR. */
+
+void
+c_parser_set_error (c_parser *parser, bool err)
+{
+ parser->error = err;
+}
+
+
/* The actual parser and external interface. ??? Does this need to be
garbage-collected? */
diff --git a/gcc/c/c-parser.h b/gcc/c/c-parser.h
index d178254..f36e738 100644
--- a/gcc/c/c-parser.h
+++ b/gcc/c/c-parser.h
@@ -50,7 +50,7 @@ enum c_id_kind {
/* A single C token after string literal concatenation and conversion
of preprocessing tokens to tokens. */
-typedef struct GTY (()) c_token {
+struct GTY (()) c_token {
/* The kind of token. */
ENUM_BITFIELD (cpp_ttype) type : 8;
/* If this token is a CPP_NAME, this value indicates whether also
@@ -78,60 +78,11 @@ typedef struct GTY (()) c_token {
{
return get_range ().m_finish;
}
-} c_token_;
-
-/* A parser structure recording information about the state and
- context of parsing. Includes lexer information with up to two
- tokens of look-ahead; more are not needed for C. */
-struct GTY(()) c_parser {
- /* The look-ahead tokens. */
- struct c_token * GTY((skip)) tokens;
- /* Buffer for look-ahead tokens. */
- struct c_token GTY(()) tokens_buf[4];
- /* How many look-ahead tokens are available (0 - 4, or
- more if parsing from pre-lexed tokens). */
- unsigned int tokens_avail;
- /* True if a syntax error is being recovered from; false otherwise.
- c_parser_error sets this flag. It should clear this flag when
- enough tokens have been consumed to recover from the error. */
- BOOL_BITFIELD error : 1;
- /* True if we're processing a pragma, and shouldn't automatically
- consume CPP_PRAGMA_EOL. */
- BOOL_BITFIELD in_pragma : 1;
- /* True if we're parsing the outermost block of an if statement. */
- BOOL_BITFIELD in_if_block : 1;
- /* True if we want to lex an untranslated string. */
- BOOL_BITFIELD lex_untranslated_string : 1;
-
- /* Objective-C specific parser/lexer information. */
-
- /* True if we are in a context where the Objective-C "PQ" keywords
- are considered keywords. */
- BOOL_BITFIELD objc_pq_context : 1;
- /* True if we are parsing a (potential) Objective-C foreach
- statement. This is set to true after we parsed 'for (' and while
- we wait for 'in' or ';' to decide if it's a standard C for loop or an
- Objective-C foreach loop. */
- BOOL_BITFIELD objc_could_be_foreach_context : 1;
- /* The following flag is needed to contextualize Objective-C lexical
- analysis. In some cases (e.g., 'int NSObject;'), it is
- undesirable to bind an identifier to an Objective-C class, even
- if a class with that name exists. */
- BOOL_BITFIELD objc_need_raw_identifier : 1;
- /* Nonzero if we're processing a __transaction statement. The value
- is 1 | TM_STMT_ATTR_*. */
- unsigned int in_transaction : 4;
- /* True if we are in a context where the Objective-C "Property attribute"
- keywords are valid. */
- BOOL_BITFIELD objc_property_attr_context : 1;
-
- /* Cilk Plus specific parser/lexer information. */
-
- /* Buffer to hold all the tokens from parsing the vector attribute for the
- SIMD-enabled functions (formerly known as elemental functions). */
- vec <c_token_, va_gc> *cilk_simd_fn_tokens;
};
+/* The parser. */
+struct c_parser;
+
/* Possibly kinds of declarator to parse. */
enum c_dtr_syn {
/* A normal declarator with an identifier. */
@@ -193,6 +144,13 @@ extern c_token * c_parser_peek_2nd_token (c_parser *parser);
bool c_parser_next_tokens_start_declaration (c_parser *parser);
bool c_token_starts_typename (c_token *token);
+/* Abstraction to avoid defining c_parser here which messes up gengtype
+ output wrt ObjC due to vec<c_token> routines being put in gtype-c.h
+ but not gtype-objc.h. */
+extern c_token * c_parser_tokens_buf (c_parser *parser, unsigned n);
+extern bool c_parser_error (c_parser *parser);
+extern void c_parser_set_error (c_parser *parser, bool);
+
/* Return true if the next token from PARSER has the indicated
TYPE. */
diff --git a/gcc/c/gimple-parser.c b/gcc/c/gimple-parser.c
index 8db425f..f109745 100644
--- a/gcc/c/gimple-parser.c
+++ b/gcc/c/gimple-parser.c
@@ -158,7 +158,7 @@ c_parser_gimple_compound_statement (c_parser *parser, gimple_seq *seq)
while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
{
- if (parser->error)
+ if (c_parser_error (parser))
{
c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
return return_p;
@@ -484,7 +484,7 @@ c_parser_gimple_binary_expression (c_parser *parser, enum tree_code *subcode)
stack[0].expr = c_parser_gimple_unary_expression (parser);
sp = 0;
source_range src_range;
- if (parser->error)
+ if (c_parser_error (parser))
goto out;
switch (c_parser_peek_token (parser)->type)
{
@@ -813,7 +813,7 @@ c_parser_gimple_postfix_expression_after_primary (c_parser *parser,
break;
start = expr.get_start ();
- finish = parser->tokens_buf[0].location;
+ finish = c_parser_tokens_buf (parser, 0)->location;
expr.value = build_array_ref (op_loc, expr.value, idx);
set_c_expr_source_range (&expr, start, finish);
@@ -834,7 +834,7 @@ c_parser_gimple_postfix_expression_after_primary (c_parser *parser,
"expected %<)%>");
orig_expr = expr;
start = expr.get_start ();
- finish = parser->tokens_buf[0].get_finish ();
+ finish = c_parser_tokens_buf (parser, 0)->get_finish ();
expr.value = c_build_function_call_vec (expr_loc, arg_loc, expr.value,
exprlist, origtypes);
set_c_expr_source_range (&expr, start, finish);
@@ -1032,7 +1032,7 @@ c_parser_gimple_declaration (c_parser *parser)
&& ! c_parser_next_token_is (parser, CPP_NAME))
{
c_parser_error (parser, "expected %<;%>");
- parser->error = false;
+ c_parser_set_error (parser, false);
return;
}
More information about the Gcc-patches
mailing list