On Fri, Sep 9, 2016 at 12:38 PM, Prasad Ghangal
<prasad.ghan...@gmail.com> wrote:
> On 26 August 2016 at 14:28, Richard Biener <richard.guent...@gmail.com> wrote:
>> On Fri, Aug 26, 2016 at 5:08 AM, Prasad Ghangal
>> <prasad.ghan...@gmail.com> wrote:
>>> On 24 August 2016 at 15:32, Richard Biener <richard.guent...@gmail.com> 
>>> wrote:
>>>> On Mon, Aug 22, 2016 at 8:40 PM, Prasad Ghangal
>>>> <prasad.ghan...@gmail.com> 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 think it might be good to make the parts of the C parser you use more
>>>> obvious (you'd need to export functions like c_parser_next_token_is).
>>>>
>>>> The easiest way to "force" that is to put all of the gimple parsing into
>>>> a separate file.
>>>>
>>>> Note I am not so much concerned about this at the moment, the parts to
>>>> improve would be avoiding more of the C-isms like convert_lvalue_to_rvalue,
>>>> handling of SIZEOF_EXPR and other stuff that looks redundant (you've
>>>> probably copied this from the C parsing routines and refactored it).
>>>> Also the GIMPLE parser shouldn't do any warnings (just spotted
>>>> a call to warn_for_memset).
>>>>
>>> PFA updated patch (successfully bootstrapped and tested on
>>> x86_64-pc-linux-gnu). I have removed unnecessary code. On side I am
>>> also trying to move gimple parser related functions to new file. But
>>> for it we also have to move structs like c_token, c_parser. Won't it
>>> disturb the c-parser code structure ?
>>
>> Yeah, as I said it would be nice but it might be quite some work.  I'd move
>> such stuff into a new c-parser.h header that can be included by the
>> gimple parser file.  Note existing exports from c-parser are mostly
>> declared in c-tree.h but I think having a c-parser.h for all the new exported
>> stuff is cleaner.
>>
>> I'd wish one of the C frontend maintainers would have a quick look at the
>> overall structure and guide us here - they are the ones that have to
>> approve the patch in the end.  (CCed)
>>
>> Thanks,
>> Richard.
>>
>
> PING.
>
> https://gcc.gnu.org/ml/gcc-patches/2016-08/msg01837.html

(that was a ping for the C FE maintainers)

Prasad, can you update the git branch with the changes from the last patch you
sent out?  I don't think you need to keep it unchanged from this point on.

Thanks,
Richard.

>
> Thanks,
> Prasad
>>>
>>> Thanks,
>>> Prasad
>>>
>>>> Thanks,
>>>> Richard.
>>>>
>>>>> 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 ?
>>>>>
>>>>>
>>>>> Thanks,
>>>>> Prasad

Reply via email to