This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gimplefe] Parsing __GIMPLE function body


On 1 June 2016 at 15:19, Richard Biener <richard.guenther@gmail.com> wrote:
> 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 }".
>

Actually it doesn't produce any error and goes into infinite loop. We
can handle it using something like

+  while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
+    {
+      if (c_parser_next_token_is (parser, CPP_EOF))
+       {
+         c_parser_error (parser, "expected declaration or statement");
+         return;
+       }
+      else
+       c_parser_consume_token (parser);
+    }

which will give error msg as

error: expected declaration or statement at end of input
   a = 1;
   ^

Thanks,
Prasad Ghangal

> 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]