On Tue, Aug 23, 2016 at 12:10:29AM +0530, Prasad Ghangal wrote: > On 22 August 2016 at 16:55, Trevor Saunders <tbsau...@tbsaunde.org> wrote: > > On Sun, Aug 21, 2016 at 10:35:17PM +0530, Prasad Ghangal wrote: > >> Hi all, > >> > >> As a part of my gsoc project. I have completed the following tasks: > >> > >> * Parsed gimple-expression > >> * Parsed gimple-labels > >> * Parsed local declaration > >> * Parsed gimple-goto statement > >> * Parsed gimple-if-else statement > >> * Parsed gimple-switch statement > >> * Parsed gimple-return statement > >> * Parsed gimple-PHI function > >> * Parsed gimple ssa-names along with default def > >> * Parsed gimple-call > >> > >> * Hacked pass manager to add support for startwith (pass-name) to skip > >> early opt passes > >> * Modified gimple dump for making it parsable > >> > >> I am willing to continue work on the project, some TODOs for the projects > >> are: > >> > >> * Error handling > >> * Parse more gimple syntax > >> * Add startwith support for IPA passes > >> > >> The complete code of gimple fe project can be found at > >> https://github.com/PrasadG193/gcc_gimple_fe > >> > >> > >> PFA patch for complete project (rebased for latest trunk revision). > >> I have successfully bootstrapped and tested on x86_64-pc-linux-gnu. > >> Some testcases failed due to modified gimple dump as expected. > >> > >> > >> Thanks, > >> Prasad > > > > only some rather minor comments > > > > > > +++ b/gcc/c/c-parser.c > > @@ -59,6 +59,18 @@ along with GCC; see the file COPYING3. If not see > > #include "gimple-expr.h" > > #include "context.h" > > #include "gcc-rich-location.h" > > +#include "tree-vrp.h" > > > > given that you need these headers it might be better to put most of the > > gimple parsing in its own file so only what actually needs to know about > > this part of the compiler does now about it. > > > > +void > > +c_parser_parse_gimple_body (c_parser *parser) > > +{ > > + bool return_p = false; > > + gimple_seq seq; > > + gimple_seq body; > > + tree stmt = push_stmt_list (); > > > > it would be nice to move the declarations down to their first use. > > > > + gimple *ret; > > + ret = gimple_build_return (NULL); > > > > there's no reason for a separate declaration and assignment ;) > > > > + tree block = NULL; > > + block = pop_scope (); > > > > same here, and a number of other places. > > > > +c_parser_gimple_compound_statement (c_parser *parser, gimple_seq *seq) > > +{ > > + bool return_p = false; > > + > > + if (!c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>")) > > + return return_p; > > > > return false would work fine. > > > > + > > + if (c_parser_next_token_is (parser, CPP_CLOSE_BRACE)) > > + { > > + c_parser_consume_token (parser); > > + goto out; > > > > I don't see the need for the gotos, there's no cleanup in this function. > > > > + /* gimple PHI expression. */ > > + if (c_parser_next_token_is_keyword (parser, RID_PHI)) > > + { > > + c_parser_consume_token (parser); > > + > > + if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>")) > > + { > > + return; > > + } > > + > > + gcall *call_stmt; > > + tree arg = NULL_TREE; > > + vec<tree> vargs = vNULL; > > > > I think you can use auto_vec here, as is I think this leaks the vectors > > storage. > > > > +c_parser_gimple_binary_expression (c_parser *parser, enum tree_code > > *subcode) > > > > you can skip the explicit 'enum' keyword. > > > > + struct { > > + /* The expression at this stack level. */ > > + struct c_expr expr; > > > > similar with struct here. > > > > + /* The precedence of the operator on its left, PREC_NONE at the > > + bottom of the stack. */ > > + enum c_parser_prec prec; > > + /* The operation on its left. */ > > + enum tree_code op; > > + /* The source location of this operation. */ > > + location_t loc; > > + } stack[2]; > > + int sp; > > + /* Location of the binary operator. */ > > + location_t binary_loc = UNKNOWN_LOCATION; /* Quiet warning. */ > > +#define POP > > \ > > > > it seems like it would be nicer to name the type, and then make this a > > function. > > > > + RO_UNARY_STAR); > > + ret.src_range.m_start = op_loc; > > + ret.src_range.m_finish = finish; > > + return ret; > > + } > > + case CPP_PLUS: > > + if (!c_dialect_objc () && !in_system_header_at (input_location)) > > + warning_at (op_loc, > > + OPT_Wtraditional, > > + "traditional C rejects the unary plus operator"); > > > > does it really make sense to warn about C issues when compiling gimple? > > > > +c_parser_parse_ssa_names (c_parser *parser) > > +{ > > + tree id = NULL_TREE; > > + c_expr ret; > > + char *var_name, *var_version, *token; > > + ret.original_code = ERROR_MARK; > > + ret.original_type = NULL; > > + > > + /* ssa token string. */ > > + const char *ssa_token = NULL; > > + ssa_token = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value); > > + token = new char [strlen (ssa_token)]; > > > > I'm not sure I see why you need this copy, and getting rid of it would > > mean you don't need to free it. > > > > + strcpy (token, ssa_token); > > + > > + /* seperate var name and version. */ > > + var_version = strrchr (token, '_'); > > + if (var_version) > > + { > > + var_name = new char[var_version - token + 1]; > > > > you should free this when done with it. > > > > +c_parser_gimple_postfix_expression (c_parser *parser) > > +{ > > + struct c_expr expr; > > + location_t loc = c_parser_peek_token (parser)->location;; > > > > extra ; > > > > + case CPP_OBJC_STRING: > > + gcc_assert (c_dialect_objc ()); > > + expr.value > > + = objc_build_string_object (c_parser_peek_token (parser)->value); > > + set_c_expr_source_range (&expr, tok_range); > > + c_parser_consume_token (parser); > > + break; > > > > is there a reason to support objc stuff in gimple? > > > > +c_parser_gimple_expr_list (c_parser *parser, bool convert_p, > > + vec<tree, va_gc> **p_orig_types, > > + location_t *sizeof_arg_loc, tree *sizeof_arg, > > + vec<location_t> *locations, > > + unsigned int *literal_zero_mask) > > +{ > > + vec<tree, va_gc> *ret; > > + vec<tree, va_gc> *orig_types; > > + struct c_expr expr; > > + location_t loc = c_parser_peek_token (parser)->location; > > + location_t cur_sizeof_arg_loc = UNKNOWN_LOCATION; > > + unsigned int idx = 0; > > + > > + ret = make_tree_vector (); > > + if (p_orig_types == NULL) > > + orig_types = NULL; > > + else > > + orig_types = make_tree_vector (); > > + > > + if (sizeof_arg != NULL > > + && c_parser_next_token_is_keyword (parser, RID_SIZEOF)) > > + cur_sizeof_arg_loc = c_parser_peek_2nd_token (parser)->location; > > + if (literal_zero_mask) > > + c_parser_check_literal_zero (parser, literal_zero_mask, 0); > > + expr = c_parser_gimple_unary_expression (parser); > > + if (convert_p) > > + expr = convert_lvalue_to_rvalue (loc, expr, true, true); > > + ret->quick_push (expr.value); > > > > That kind of relies on the details of make_tree_vector (), so it seems > > somewhat safer to use vec_safe_push. > > > > + if (orig_types) > > + orig_types->quick_push (expr.original_type); > > > > same > > > > +c_parser_gimple_declaration (c_parser *parser) > > +{ > > + struct c_declspecs *specs; > > + struct c_declarator *declarator; > > + specs = build_null_declspecs (); > > + c_parser_declspecs (parser, specs, true, true, true, > > + true, true, cla_nonabstract_decl); > > + finish_declspecs (specs); > > + bool auto_type_p = specs->typespec_word == cts_auto_type; > > > > is it useful to support auto here in gimple? > > > > +c_parser_gimple_switch_stmt (c_parser *parser, gimple_seq *seq) > > +{ > > + c_expr cond_expr; > > + tree case_label, label; > > + vec<tree> labels = vNULL; > > > > auto_vec? > > > > +static void > > +c_finish_gimple_return (location_t loc, tree retval) > > +{ > > + tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl)); > > + > > + /* Use the expansion point to handle cases such as returning NULL > > + in a function returning void. */ > > + source_location xloc = expansion_point_location_if_in_system_header > > (loc); > > + > > + if (TREE_THIS_VOLATILE (current_function_decl)) > > + warning_at (xloc, 0, > > + "function declared %<noreturn%> has a %<return%> > > statement"); > > + > > + if (!retval) > > + { > > + current_function_returns_null = 1; > > + if ((warn_return_type || flag_isoc99) > > > > I'm not sure what to do about warnings, but checking the language we are > > compiling as seems kind of wrong when we're compiling gimple? > > > > @@ -228,6 +228,12 @@ struct GTY(()) function { > > /* GIMPLE body for this function. */ > > gimple_seq gimple_body; > > > > + /* GIMPLEFE pass to start with */ > > + opt_pass *pass_startwith = NULL; > > > > I'm guessing you've only compiled in C++11 mode? because I'm pretty sure > > you are using a C++11 feature here (the default member value you > > assign). > > > > Thanks! > > > > Trev > > > > Hi Trevor, > > Thanks for your feedback. I had missed removing some unwanted code > while code cleanup. I have updated the patch. > I am not sure if we should move all gimple parsing related functions > to the new file (?)
I would think it makes sense to keep it all togehter, but probably not terribly important where it goes. > I am not getting what did you mean by C++11 mode (I am not explicitly > giving any option while configure or make). I also have successfully > bootstrapped and tested the project on another system. Is there any > way to check that ? consider this simplified example struct foo { int *x = 0; }; g++ -std=gnu++98 test.cc produces /tmp/test.cc:3:11: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 int *x = 0; ^ gcc needs to compile as C++98 with compilers that don't understand this construct, so you need to make sure the member is null when the struct is created instead of putting = NULL next to the members declaration. Thanks! Trev > > > Thanks, > Prasad