This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [gimplefe] Parsing __GIMPLE function body
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Prathamesh Kulkarni <prathamesh dot kulkarni at linaro dot org>
- Cc: Prasad Ghangal <prasad dot ghangal at gmail dot com>, gcc Mailing List <gcc at gcc dot gnu dot org>, David Malcolm <dmalcolm at redhat dot com>
- Date: Wed, 1 Jun 2016 11:49:06 +0200
- Subject: Re: [gimplefe] Parsing __GIMPLE function body
- Authentication-results: sourceware.org; auth=none
- References: <CAE+uiWYTNOnK-MWB8qicpVU9aO-ZX0praDmTyzO4ipv=UqBrwA at mail dot gmail dot com> <CAAgBjMnQikO8UhNMDnEd5POm4CuWeWomCWf5ohAHkNE79yV8XQ at mail dot gmail dot com>
On Wed, Jun 1, 2016 at 9:19 AM, Prathamesh Kulkarni
<prathamesh.kulkarni@linaro.org> wrote:
> On 30 May 2016 at 20:45, Prasad Ghangal <prasad.ghangal@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