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]

[gimplefe] Parsing __GIMPLE function body


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


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