Hi, As David suggested in his rtlfe patch, this patch recognizes __GIMPLE keyword and switches to c_parser_parse_gimple_body by providing -fgimple option.
diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 4568cf6..41a8f05 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -511,6 +511,7 @@ const struct c_common_resword c_common_reswords[] = { "__underlying_type", RID_UNDERLYING_TYPE, D_CXXONLY }, { "__volatile", RID_VOLATILE, 0 }, { "__volatile__", RID_VOLATILE, 0 }, + { "__GIMPLE", RID_GIMPLE, 0 }, { "alignas", RID_ALIGNAS, D_CXXONLY | D_CXX11 | D_CXXWARN }, { "alignof", RID_ALIGNOF, D_CXXONLY | D_CXX11 | D_CXXWARN }, { "asm", RID_ASM, D_ASM }, diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 0295532..23a401d 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -104,6 +104,9 @@ enum rid RID_DFLOAT32, RID_DFLOAT64, RID_DFLOAT128, RID_FRACT, RID_ACCUM, RID_AUTO_TYPE, RID_BUILTIN_CALL_WITH_STATIC_CHAIN, + /* "__GIMPLE", for the GIMPLE-parsing extension to the C frontend. */ + RID_GIMPLE, + /* C11 */ RID_ALIGNAS, RID_GENERIC, diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 918df16..8ab56af 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -200,6 +200,10 @@ F Driver C ObjC C++ ObjC++ Joined Separate MissingArgError(missing path after %qs) -F <dir> Add <dir> to the end of the main framework include path. +fgimple +C Var(flag_gimple) Init(0) +Enable parsing GIMPLE + H C ObjC C++ ObjC++ Print the name of header files as they are used. diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 1cf4fb4..c5a4d3f 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -1396,6 +1396,7 @@ static bool c_parser_cilk_verify_simd (c_parser *, enum pragma_context); static tree c_parser_array_notation (location_t, c_parser *, tree, tree); static tree c_parser_cilk_clause_vectorlength (c_parser *, tree, bool); static void c_parser_cilk_grainsize (c_parser *, bool *); +static void c_parser_parse_gimple_body (c_parser *parser); /* Parse a translation unit (C90 6.7, C99 6.9). @@ -1638,6 +1639,7 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, tree all_prefix_attrs; bool diagnosed_no_specs = false; location_t here = c_parser_peek_token (parser)->location; + bool gimple_body_p = false; if (static_assert_ok && c_parser_next_token_is_keyword (parser, RID_STATIC_ASSERT)) @@ -1687,6 +1689,17 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, c_parser_skip_to_end_of_block_or_statement (parser); return; } + + if (c_parser_next_token_is (parser, CPP_KEYWORD)) + { + c_token *kw_token = c_parser_peek_token (parser); + if (kw_token->keyword == RID_GIMPLE) + { + gimple_body_p = true; + c_parser_consume_token (parser); + } + } + finish_declspecs (specs); bool auto_type_p = specs->typespec_word == cts_auto_type; if (c_parser_next_token_is (parser, CPP_SEMICOLON)) @@ -2102,6 +2115,14 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, oacc_routine_clauses, false, first, true); DECL_STRUCT_FUNCTION (current_function_decl)->function_start_locus = c_parser_peek_token (parser)->location; + + if (gimple_body_p && flag_gimple) + { + c_parser_parse_gimple_body (parser); + finish_function (); + return; + } + fnbody = c_parser_compound_statement (parser); if (flag_cilkplus && contains_array_notation_expr (fnbody)) fnbody = expand_array_notation_exprs (fnbody); @@ -2123,7 +2144,7 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, add_stmt (fnbody); finish_function (); } - + timevar_pop (tv); break; } @@ -18055,4 +18076,23 @@ c_parser_array_notation (location_t loc, c_parser *parser, tree initial_index, return value_tree; } +/* Parse the body of a function declaration marked with "__GIMPLE". */ + +void +c_parser_parse_gimple_body (c_parser *parser) +{ + if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>")) + return; + + location_t loc1 = c_parser_peek_token (parser)->location; + inform (loc1, "start of GIMPLE"); + + while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE)) + { + c_parser_consume_token (parser); + } + + c_parser_consume_token (parser); +} + #include "gt-c-c-parser.h" GIMPLE function body consists of GIMPLE statements. For parsing GIMPLE function body, we need to populate gimple body with gimple statements which will emit GIMPLE as it is. I would like to hear suggestions about how can I emit GIMPLE directly from FE. Thanks, Prasad Ghangal