On Wed, Jun 1, 2016 at 9:19 AM, Prathamesh Kulkarni <prathamesh.kulka...@linaro.org> wrote: > On 30 May 2016 at 20:45, Prasad Ghangal <prasad.ghan...@gmail.com> wrote: >> 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)) > Could this possibly go into infinite loop if '}' is not present in the source > ?
You'd have to look into the source but I guess it will raise an error like "EOF before expected }". Richard. > Thanks, > Prathamesh >> + { >> + 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