Hi ! Currently I am trying to introduce new command line option -fgimple, for that I am adding this to c.opt
diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 4f86876..88e55c6 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -66,6 +66,10 @@ C ObjC C++ ObjC++ Separate Alias(d) -dump= C ObjC C++ ObjC++ Joined Alias(d) +fgimple +C Var(flag_gimple) Init(0) +Enable parsing GIMPLE + -imacros C ObjC C++ ObjC++ Separate Alias(imacros) MissingArgError(missing filename after %qs) But I am getting error as - "gcc: error: unrecognized command line option ‘-fgimple ’; did you mean ‘-fgimple ’?" I am unable to find where to handle it. Till now I am able to JUST parse __GIMPLE keyword diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index cae2faf..1ccb4d6 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -468,6 +468,7 @@ const struct c_common_resword c_common_reswords[] = { "__extension__", RID_EXTENSION, 0 }, { "__func__", RID_C99_FUNCTION_NAME, 0 }, { "__has_nothrow_assign", RID_HAS_NOTHROW_ASSIGN, D_CXXONLY }, + { "__GIMPLE", RID_GIMPLE, 0 }, { "__has_nothrow_constructor", RID_HAS_NOTHROW_CONSTRUCTOR, D_CXXONLY }, { "__has_nothrow_copy", RID_HAS_NOTHROW_COPY, D_CXXONLY }, { "__has_trivial_assign", RID_HAS_TRIVIAL_ASSIGN, D_CXXONLY }, @@ -12393,6 +12394,7 @@ keyword_is_function_specifier (enum rid keyword) case RID_NORETURN: case RID_VIRTUAL: case RID_EXPLICIT: + case RID_GIMPLE: return true; default: return false; diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h index 663e457..a91665f 100644 --- a/gcc/c-family/c-common.h +++ b/gcc/c-family/c-common.h @@ -64,10 +64,10 @@ enum rid /* Modifiers: */ /* C, in empirical order of frequency. */ RID_STATIC = 0, - RID_UNSIGNED, RID_LONG, RID_CONST, RID_EXTERN, - RID_REGISTER, RID_TYPEDEF, RID_SHORT, RID_INLINE, - RID_VOLATILE, RID_SIGNED, RID_AUTO, RID_RESTRICT, - RID_NORETURN, RID_ATOMIC, + RID_UNSIGNED, RID_LONG, RID_CONST, RID_EXTERN, + RID_GIMPLE, RID_REGISTER, RID_TYPEDEF, RID_SHORT, + RID_INLINE, RID_VOLATILE, RID_SIGNED, RID_AUTO, + RID_RESTRICT, RID_NORETURN, RID_ATOMIC, /* C extensions */ RID_COMPLEX, RID_THREAD, RID_SAT, diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index f0c677b..e690ca3 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -10401,6 +10401,8 @@ declspecs_add_scspec (source_location loc, case RID_TYPEDEF: n = csc_typedef; break; + case RID_GIMPLE: + break; default: gcc_unreachable (); } diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index bdd669d..266b672 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -732,6 +732,7 @@ c_token_starts_declspecs (c_token *token) case RID_ALIGNAS: case RID_ATOMIC: case RID_AUTO_TYPE: + case RID_GIMPLE: return true; default: if (token->keyword >= RID_FIRST_INT_N @@ -2461,6 +2462,7 @@ c_parser_declspecs (c_parser *parser, struct c_declspecs *specs, case RID_NORETURN: case RID_AUTO: case RID_THREAD: + case RID_GIMPLE: if (!scspec_ok) goto out; attrs_ok = true; @@ -3960,6 +3962,7 @@ c_parser_attribute_any_word (c_parser *parser) case RID_INT_N_1: case RID_INT_N_2: case RID_INT_N_3: + case RID_GIMPLE: ok = true; break; default: After recognizing __GIMPLE, I am planning to call gimple_fn_parser function which will parse gimple body. For pass manager, basic idea is to introduce new member to struct function as pass_list and modify function execute_pass_list to run only passes in pass list. Thanks, Prasad Ghangal