Home | History | Annotate | Line # | Download | only in c
      1  1.1  mrg /* Parser for GIMPLE.
      2  1.1  mrg    Copyright (C) 2016-2022 Free Software Foundation, Inc.
      3  1.1  mrg 
      4  1.1  mrg This file is part of GCC.
      5  1.1  mrg 
      6  1.1  mrg GCC is free software; you can redistribute it and/or modify it under
      7  1.1  mrg the terms of the GNU General Public License as published by the Free
      8  1.1  mrg Software Foundation; either version 3, or (at your option) any later
      9  1.1  mrg version.
     10  1.1  mrg 
     11  1.1  mrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     12  1.1  mrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
     13  1.1  mrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     14  1.1  mrg for more details.
     15  1.1  mrg 
     16  1.1  mrg You should have received a copy of the GNU General Public License
     17  1.1  mrg along with GCC; see the file COPYING3.  If not see
     18  1.1  mrg <http://www.gnu.org/licenses/>.  */
     19  1.1  mrg 
     20  1.1  mrg #include "config.h"
     21  1.1  mrg #include "system.h"
     22  1.1  mrg #include "coretypes.h"
     23  1.1  mrg #include "target.h"
     24  1.1  mrg #include "function.h"
     25  1.1  mrg #include "c-tree.h"
     26  1.1  mrg #include "timevar.h"
     27  1.1  mrg #include "stringpool.h"
     28  1.1  mrg #include "cgraph.h"
     29  1.1  mrg #include "attribs.h"
     30  1.1  mrg #include "stor-layout.h"
     31  1.1  mrg #include "varasm.h"
     32  1.1  mrg #include "trans-mem.h"
     33  1.1  mrg #include "c-family/c-pragma.h"
     34  1.1  mrg #include "c-lang.h"
     35  1.1  mrg #include "c-family/c-objc.h"
     36  1.1  mrg #include "plugin.h"
     37  1.1  mrg #include "builtins.h"
     38  1.1  mrg #include "gomp-constants.h"
     39  1.1  mrg #include "c-family/c-indentation.h"
     40  1.1  mrg #include "gimple-expr.h"
     41  1.1  mrg #include "context.h"
     42  1.1  mrg #include "gcc-rich-location.h"
     43  1.1  mrg #include "c-parser.h"
     44  1.1  mrg #include "tree-vrp.h"
     45  1.1  mrg #include "tree-pass.h"
     46  1.1  mrg #include "tree-pretty-print.h"
     47  1.1  mrg #include "tree.h"
     48  1.1  mrg #include "basic-block.h"
     49  1.1  mrg #include "gimple.h"
     50  1.1  mrg #include "gimple-pretty-print.h"
     51  1.1  mrg #include "tree-ssa.h"
     52  1.1  mrg #include "pass_manager.h"
     53  1.1  mrg #include "tree-ssanames.h"
     54  1.1  mrg #include "gimple-ssa.h"
     55  1.1  mrg #include "tree-dfa.h"
     56  1.1  mrg #include "internal-fn.h"
     57  1.1  mrg #include "cfg.h"
     58  1.1  mrg #include "cfghooks.h"
     59  1.1  mrg #include "bitmap.h"
     60  1.1  mrg #include "cfganal.h"
     61  1.1  mrg #include "tree-cfg.h"
     62  1.1  mrg #include "gimple-iterator.h"
     63  1.1  mrg #include "cfgloop.h"
     64  1.1  mrg #include "tree-phinodes.h"
     65  1.1  mrg #include "tree-into-ssa.h"
     66  1.1  mrg 
     67  1.1  mrg 
     68  1.1  mrg /* GIMPLE parser state.  */
     69  1.1  mrg 
     70  1.1  mrg class gimple_parser
     71  1.1  mrg {
     72  1.1  mrg public:
     73  1.1  mrg   gimple_parser (c_parser *p) : parser (p), edges(), current_bb(NULL) {}
     74  1.1  mrg   /* c_parser is not visible here, use composition and fake inheritance
     75  1.1  mrg      via a conversion operator.  */
     76  1.1  mrg   operator c_parser *() { return parser; }
     77  1.1  mrg   c_parser *parser;
     78  1.1  mrg 
     79  1.1  mrg   /* CFG build state.  */
     80  1.1  mrg   class gimple_parser_edge
     81  1.1  mrg   {
     82  1.1  mrg   public:
     83  1.1  mrg     int src;
     84  1.1  mrg     int dest;
     85  1.1  mrg     int flags;
     86  1.1  mrg     profile_probability probability;
     87  1.1  mrg   };
     88  1.1  mrg   auto_vec<gimple_parser_edge> edges;
     89  1.1  mrg   basic_block current_bb;
     90  1.1  mrg 
     91  1.1  mrg   void push_edge (int, int, int, profile_probability);
     92  1.1  mrg };
     93  1.1  mrg 
     94  1.1  mrg void
     95  1.1  mrg gimple_parser::push_edge (int src, int dest, int flags,
     96  1.1  mrg 			  profile_probability prob)
     97  1.1  mrg {
     98  1.1  mrg   gimple_parser_edge e;
     99  1.1  mrg   e.src = src;
    100  1.1  mrg   e.dest = dest;
    101  1.1  mrg   e.flags = flags;
    102  1.1  mrg   e.probability = prob;
    103  1.1  mrg   edges.safe_push (e);
    104  1.1  mrg }
    105  1.1  mrg 
    106  1.1  mrg 
    107  1.1  mrg /* Gimple parsing functions.  */
    108  1.1  mrg static bool c_parser_gimple_compound_statement (gimple_parser &, gimple_seq *);
    109  1.1  mrg static void c_parser_gimple_label (gimple_parser &, gimple_seq *);
    110  1.1  mrg static void c_parser_gimple_statement (gimple_parser &, gimple_seq *);
    111  1.1  mrg static struct c_expr c_parser_gimple_binary_expression (gimple_parser &);
    112  1.1  mrg static struct c_expr c_parser_gimple_unary_expression (gimple_parser &);
    113  1.1  mrg static struct c_expr c_parser_gimple_postfix_expression (gimple_parser &);
    114  1.1  mrg static struct c_expr c_parser_gimple_postfix_expression_after_primary
    115  1.1  mrg 			(gimple_parser &, location_t, struct c_expr);
    116  1.1  mrg static void c_parser_gimple_declaration (gimple_parser &);
    117  1.1  mrg static void c_parser_gimple_goto_stmt (gimple_parser &, location_t,
    118  1.1  mrg 				       tree, gimple_seq *);
    119  1.1  mrg static void c_parser_gimple_try_stmt (gimple_parser &, gimple_seq *);
    120  1.1  mrg static void c_parser_gimple_if_stmt (gimple_parser &, gimple_seq *);
    121  1.1  mrg static void c_parser_gimple_switch_stmt (gimple_parser &, gimple_seq *);
    122  1.1  mrg static void c_parser_gimple_return_stmt (gimple_parser &, gimple_seq *);
    123  1.1  mrg static void c_finish_gimple_return (location_t, tree);
    124  1.1  mrg static tree c_parser_gimple_paren_condition (gimple_parser &);
    125  1.1  mrg static void c_parser_gimple_expr_list (gimple_parser &, vec<tree> *);
    126  1.1  mrg 
    127  1.1  mrg 
    128  1.1  mrg /* See if VAL is an identifier matching __BB<num> and return <num>
    129  1.1  mrg    in *INDEX.  */
    130  1.1  mrg 
    131  1.1  mrg static bool
    132  1.1  mrg c_parser_gimple_parse_bb_spec (tree val, int *index)
    133  1.1  mrg {
    134  1.1  mrg   if (!startswith (IDENTIFIER_POINTER (val), "__BB"))
    135  1.1  mrg     return false;
    136  1.1  mrg   for (const char *p = IDENTIFIER_POINTER (val) + 4; *p; ++p)
    137  1.1  mrg     if (!ISDIGIT (*p))
    138  1.1  mrg       return false;
    139  1.1  mrg   *index = atoi (IDENTIFIER_POINTER (val) + 4);
    140  1.1  mrg   return *index > 0;
    141  1.1  mrg }
    142  1.1  mrg 
    143  1.1  mrg /* See if VAL is an identifier matching __BB<num> and return <num>
    144  1.1  mrg    in *INDEX.  Return true if so and parse also FREQUENCY of
    145  1.1  mrg    the edge.  */
    146  1.1  mrg 
    147  1.1  mrg 
    148  1.1  mrg static bool
    149  1.1  mrg c_parser_gimple_parse_bb_spec_edge_probability (tree val,
    150  1.1  mrg 						gimple_parser &parser,
    151  1.1  mrg 						int *index,
    152  1.1  mrg 						profile_probability
    153  1.1  mrg 						*probability)
    154  1.1  mrg {
    155  1.1  mrg   bool return_p = c_parser_gimple_parse_bb_spec (val, index);
    156  1.1  mrg   if (return_p)
    157  1.1  mrg     {
    158  1.1  mrg       *probability = profile_probability::uninitialized ();
    159  1.1  mrg       /* Parse frequency if provided.  */
    160  1.1  mrg       if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
    161  1.1  mrg 	{
    162  1.1  mrg 	  tree f;
    163  1.1  mrg 	  c_parser_consume_token (parser);
    164  1.1  mrg 	  if (!c_parser_next_token_is (parser, CPP_NAME))
    165  1.1  mrg 	    {
    166  1.1  mrg 	      c_parser_error (parser, "expected frequency quality");
    167  1.1  mrg 	      return false;
    168  1.1  mrg 	    }
    169  1.1  mrg 
    170  1.1  mrg 	  profile_quality quality;
    171  1.1  mrg 	  const char *v
    172  1.1  mrg 	    = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
    173  1.1  mrg 	  if (!parse_profile_quality (v, &quality))
    174  1.1  mrg 	    {
    175  1.1  mrg 	      c_parser_error (parser, "unknown profile quality");
    176  1.1  mrg 	      return false;
    177  1.1  mrg 	    }
    178  1.1  mrg 
    179  1.1  mrg 	  c_parser_consume_token (parser);
    180  1.1  mrg 	  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
    181  1.1  mrg 	    return false;
    182  1.1  mrg 
    183  1.1  mrg 	  if (!c_parser_next_token_is (parser, CPP_NUMBER)
    184  1.1  mrg 	      || (TREE_CODE (f = c_parser_peek_token (parser)->value)
    185  1.1  mrg 		  != INTEGER_CST))
    186  1.1  mrg 	    {
    187  1.1  mrg 	      c_parser_error (parser, "expected frequency value");
    188  1.1  mrg 	      return false;
    189  1.1  mrg 	    }
    190  1.1  mrg 
    191  1.1  mrg 	  unsigned int value = TREE_INT_CST_LOW (f);
    192  1.1  mrg 	  *probability = profile_probability (value, quality);
    193  1.1  mrg 
    194  1.1  mrg 	  c_parser_consume_token (parser);
    195  1.1  mrg 	  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
    196  1.1  mrg 	    return false;
    197  1.1  mrg 
    198  1.1  mrg 	  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
    199  1.1  mrg 	    return false;
    200  1.1  mrg 	}
    201  1.1  mrg 
    202  1.1  mrg       return true;
    203  1.1  mrg     }
    204  1.1  mrg 
    205  1.1  mrg   return false;
    206  1.1  mrg 
    207  1.1  mrg }
    208  1.1  mrg 
    209  1.1  mrg /* Parse the body of a function declaration marked with "__GIMPLE".  */
    210  1.1  mrg 
    211  1.1  mrg void
    212  1.1  mrg c_parser_parse_gimple_body (c_parser *cparser, char *gimple_pass,
    213  1.1  mrg 			    enum c_declspec_il cdil,
    214  1.1  mrg 			    profile_count entry_bb_count)
    215  1.1  mrg {
    216  1.1  mrg   gimple_parser parser (cparser);
    217  1.1  mrg   gimple_seq seq = NULL;
    218  1.1  mrg   gimple_seq body = NULL;
    219  1.1  mrg   tree stmt = push_stmt_list ();
    220  1.1  mrg   push_scope ();
    221  1.1  mrg   location_t loc1 = c_parser_peek_token (parser)->location;
    222  1.1  mrg 
    223  1.1  mrg   cfun->pass_startwith = gimple_pass;
    224  1.1  mrg   init_tree_ssa (cfun);
    225  1.1  mrg 
    226  1.1  mrg   if (cdil == cdil_gimple)
    227  1.1  mrg     /* While we have SSA names in the IL we do not have a CFG built yet
    228  1.1  mrg        and PHIs are represented using a PHI internal function.  We do
    229  1.1  mrg        have lowered control flow and exception handling (well, we do not
    230  1.1  mrg        have parser support for EH yet).  But as we still have BINDs
    231  1.1  mrg        we have to go through lowering again.  */
    232  1.1  mrg     cfun->curr_properties = PROP_gimple_any;
    233  1.1  mrg   else
    234  1.1  mrg     {
    235  1.1  mrg       /* We have at least cdil_gimple_cfg.  */
    236  1.1  mrg       gimple_register_cfg_hooks ();
    237  1.1  mrg       init_empty_tree_cfg ();
    238  1.1  mrg       parser.current_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
    239  1.1  mrg       /* Initialize the bare loop structure - we are going to only
    240  1.1  mrg          mark headers and leave the rest to fixup.  */
    241  1.1  mrg       set_loops_for_fn (cfun, ggc_cleared_alloc<struct loops> ());
    242  1.1  mrg       init_loops_structure (cfun, loops_for_fn (cfun), 1);
    243  1.1  mrg       loops_state_set (cfun, LOOPS_NEED_FIXUP|LOOPS_MAY_HAVE_MULTIPLE_LATCHES);
    244  1.1  mrg       cfun->curr_properties
    245  1.1  mrg 	|= PROP_gimple_lcf | PROP_gimple_leh | PROP_cfg | PROP_loops;
    246  1.1  mrg       if (cdil == cdil_gimple_ssa)
    247  1.1  mrg 	{
    248  1.1  mrg 	  init_ssa_operands (cfun);
    249  1.1  mrg 	  cfun->curr_properties |= PROP_ssa;
    250  1.1  mrg 	}
    251  1.1  mrg     }
    252  1.1  mrg 
    253  1.1  mrg   if (! c_parser_gimple_compound_statement (parser, &seq)
    254  1.1  mrg       && cdil == cdil_gimple)
    255  1.1  mrg     {
    256  1.1  mrg       gimple *ret = gimple_build_return (NULL);
    257  1.1  mrg       gimple_seq_add_stmt_without_update (&seq, ret);
    258  1.1  mrg     }
    259  1.1  mrg 
    260  1.1  mrg   tree block = pop_scope ();
    261  1.1  mrg   stmt = pop_stmt_list (stmt);
    262  1.1  mrg   stmt = c_build_bind_expr (loc1, block, stmt);
    263  1.1  mrg 
    264  1.1  mrg   block = DECL_INITIAL (current_function_decl);
    265  1.1  mrg   BLOCK_SUBBLOCKS (block) = NULL_TREE;
    266  1.1  mrg   BLOCK_CHAIN (block) = NULL_TREE;
    267  1.1  mrg   TREE_ASM_WRITTEN (block) = 1;
    268  1.1  mrg 
    269  1.1  mrg   if (cdil == cdil_gimple)
    270  1.1  mrg     {
    271  1.1  mrg       gbind *bind_stmt = gimple_build_bind (BIND_EXPR_VARS (stmt), NULL,
    272  1.1  mrg 					    BIND_EXPR_BLOCK (stmt));
    273  1.1  mrg       gimple_bind_set_body (bind_stmt, seq);
    274  1.1  mrg       gimple_seq_add_stmt_without_update (&body, bind_stmt);
    275  1.1  mrg       gimple_set_body (current_function_decl, body);
    276  1.1  mrg     }
    277  1.1  mrg   else
    278  1.1  mrg     {
    279  1.1  mrg       /* Control-flow and binds are lowered, record local decls.  */
    280  1.1  mrg       for (tree var = BIND_EXPR_VARS (stmt); var; var = DECL_CHAIN (var))
    281  1.1  mrg 	if (VAR_P (var)
    282  1.1  mrg 	    && !DECL_EXTERNAL (var))
    283  1.1  mrg 	  add_local_decl (cfun, var);
    284  1.1  mrg       /* We have a CFG.  Build the edges.  */
    285  1.1  mrg       for (unsigned i = 0; i < parser.edges.length (); ++i)
    286  1.1  mrg 	{
    287  1.1  mrg 	  edge e = make_edge (BASIC_BLOCK_FOR_FN (cfun, parser.edges[i].src),
    288  1.1  mrg 			      BASIC_BLOCK_FOR_FN (cfun, parser.edges[i].dest),
    289  1.1  mrg 			      parser.edges[i].flags);
    290  1.1  mrg 	  e->probability = parser.edges[i].probability;
    291  1.1  mrg 	}
    292  1.1  mrg       /* Add edges for case labels.  */
    293  1.1  mrg       basic_block bb;
    294  1.1  mrg       FOR_EACH_BB_FN (bb, cfun)
    295  1.1  mrg 	if (EDGE_COUNT (bb->succs) == 0)
    296  1.1  mrg 	  {
    297  1.1  mrg 	    gimple *last = last_stmt (bb);
    298  1.1  mrg 	    if (gswitch *sw = safe_dyn_cast <gswitch *> (last))
    299  1.1  mrg 	      for (unsigned i = 0; i < gimple_switch_num_labels (sw); ++i)
    300  1.1  mrg 		{
    301  1.1  mrg 		  basic_block label_bb = gimple_switch_label_bb (cfun, sw, i);
    302  1.1  mrg 		  make_edge (bb, label_bb, 0);
    303  1.1  mrg 		}
    304  1.1  mrg 	  }
    305  1.1  mrg       /* Need those for loop fixup.  */
    306  1.1  mrg       calculate_dominance_info (CDI_DOMINATORS);
    307  1.1  mrg       /* With SSA lower PHIs parsed as internal function calls and
    308  1.1  mrg 	 update stmts.  */
    309  1.1  mrg       if (cdil == cdil_gimple_ssa)
    310  1.1  mrg 	{
    311  1.1  mrg 	  /* Create PHI nodes, they are parsed into __PHI internal calls.  */
    312  1.1  mrg 	  FOR_EACH_BB_FN (bb, cfun)
    313  1.1  mrg 	    for (gimple_stmt_iterator gsi = gsi_start_bb (bb);
    314  1.1  mrg 		 !gsi_end_p (gsi);)
    315  1.1  mrg 	      {
    316  1.1  mrg 		gimple *stmt = gsi_stmt (gsi);
    317  1.1  mrg 		if (!gimple_call_internal_p (stmt, IFN_PHI))
    318  1.1  mrg 		  break;
    319  1.1  mrg 
    320  1.1  mrg 		gphi *phi = create_phi_node (gimple_call_lhs (stmt), bb);
    321  1.1  mrg 		for (unsigned i = 0; i < gimple_call_num_args (stmt); i += 2)
    322  1.1  mrg 		  {
    323  1.1  mrg 		    int srcidx = TREE_INT_CST_LOW (gimple_call_arg (stmt, i));
    324  1.1  mrg 		    edge e = find_edge (BASIC_BLOCK_FOR_FN (cfun, srcidx), bb);
    325  1.1  mrg 		    if (!e)
    326  1.1  mrg 		      c_parser_error (parser, "edge not found");
    327  1.1  mrg 		    else
    328  1.1  mrg 		      add_phi_arg (phi, gimple_call_arg (stmt, i + 1), e,
    329  1.1  mrg 				   UNKNOWN_LOCATION);
    330  1.1  mrg 		  }
    331  1.1  mrg 		gsi_remove (&gsi, true);
    332  1.1  mrg 	      }
    333  1.1  mrg 	  /* Fill SSA name gaps, putting them on the freelist and diagnose
    334  1.1  mrg 	     SSA names without definition.  */
    335  1.1  mrg 	  for (unsigned i = 1; i < num_ssa_names; ++i)
    336  1.1  mrg 	    if (!ssa_name (i))
    337  1.1  mrg 	      {
    338  1.1  mrg 		tree name = make_ssa_name_fn (cfun, integer_type_node, NULL, i);
    339  1.1  mrg 		release_ssa_name_fn (cfun, name);
    340  1.1  mrg 	      }
    341  1.1  mrg 	    else if (!SSA_NAME_DEF_STMT (ssa_name (i)))
    342  1.1  mrg 	      error ("SSA name %qE with version %d has no definition",
    343  1.1  mrg 		     ssa_name (i), i);
    344  1.1  mrg 	  /* No explicit virtual operands (yet).  */
    345  1.1  mrg 	  bitmap_obstack_initialize (NULL);
    346  1.1  mrg 	  update_ssa (TODO_update_ssa_only_virtuals);
    347  1.1  mrg 	  bitmap_obstack_release (NULL);
    348  1.1  mrg 	  /* ???  By flushing the freelist after virtual operand SSA rewrite
    349  1.1  mrg 	     we keep the gaps available for re-use like needed for the
    350  1.1  mrg 	     PR89595 testcase but then usually virtual operands would have
    351  1.1  mrg 	     taken most of them.  The fix is obviously to make virtual
    352  1.1  mrg 	     operands explicit in the SSA IL.  */
    353  1.1  mrg 	  flush_ssaname_freelist ();
    354  1.1  mrg 	}
    355  1.1  mrg       fix_loop_structure (NULL);
    356  1.1  mrg     }
    357  1.1  mrg 
    358  1.1  mrg   if (cfun->curr_properties & PROP_cfg)
    359  1.1  mrg     {
    360  1.1  mrg       ENTRY_BLOCK_PTR_FOR_FN (cfun)->count = entry_bb_count;
    361  1.1  mrg       gcov_type t = param_gimple_fe_computed_hot_bb_threshold;
    362  1.1  mrg       set_hot_bb_threshold (t);
    363  1.1  mrg       update_max_bb_count ();
    364  1.1  mrg       cgraph_node::get_create (cfun->decl);
    365  1.1  mrg       cgraph_edge::rebuild_edges ();
    366  1.1  mrg     }
    367  1.1  mrg   dump_function (TDI_gimple, current_function_decl);
    368  1.1  mrg }
    369  1.1  mrg 
    370  1.1  mrg /* Parse a compound statement in gimple function body.
    371  1.1  mrg 
    372  1.1  mrg    gimple-statement:
    373  1.1  mrg      gimple-statement
    374  1.1  mrg      gimple-declaration-statement
    375  1.1  mrg      gimple-if-statement
    376  1.1  mrg      gimple-switch-statement
    377  1.1  mrg      gimple-labeled-statement
    378  1.1  mrg      gimple-expression-statement
    379  1.1  mrg      gimple-goto-statement
    380  1.1  mrg      gimple-phi-statement
    381  1.1  mrg      gimple-return-statement
    382  1.1  mrg */
    383  1.1  mrg 
    384  1.1  mrg static bool
    385  1.1  mrg c_parser_gimple_compound_statement (gimple_parser &parser, gimple_seq *seq)
    386  1.1  mrg {
    387  1.1  mrg   bool return_p = false;
    388  1.1  mrg 
    389  1.1  mrg   if (! c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
    390  1.1  mrg     return false;
    391  1.1  mrg 
    392  1.1  mrg   /* A compund statement starts with optional declarations.  */
    393  1.1  mrg   while (c_parser_next_tokens_start_declaration (parser))
    394  1.1  mrg     {
    395  1.1  mrg       c_parser_gimple_declaration (parser);
    396  1.1  mrg       if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
    397  1.1  mrg 	return false;
    398  1.1  mrg     }
    399  1.1  mrg 
    400  1.1  mrg   while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
    401  1.1  mrg     {
    402  1.1  mrg       if (c_parser_error (parser))
    403  1.1  mrg 	{
    404  1.1  mrg 	  c_parser_skip_until_found (parser, CPP_CLOSE_BRACE, NULL);
    405  1.1  mrg 	  return return_p;
    406  1.1  mrg 	}
    407  1.1  mrg       else if (c_parser_next_token_is (parser, CPP_EOF))
    408  1.1  mrg 	{
    409  1.1  mrg 	  c_parser_error (parser, "expected declaration or statement");
    410  1.1  mrg 	  return return_p;
    411  1.1  mrg 	}
    412  1.1  mrg 
    413  1.1  mrg       switch (c_parser_peek_token (parser)->type)
    414  1.1  mrg 	{
    415  1.1  mrg 	case CPP_KEYWORD:
    416  1.1  mrg 	  switch (c_parser_peek_token (parser)->keyword)
    417  1.1  mrg 	    {
    418  1.1  mrg 	    case RID_AT_TRY:
    419  1.1  mrg 	      c_parser_gimple_try_stmt (parser, seq);
    420  1.1  mrg 	      break;
    421  1.1  mrg 	    case RID_IF:
    422  1.1  mrg 	      c_parser_gimple_if_stmt (parser, seq);
    423  1.1  mrg 	      break;
    424  1.1  mrg 	    case RID_SWITCH:
    425  1.1  mrg 	      c_parser_gimple_switch_stmt (parser, seq);
    426  1.1  mrg 	      break;
    427  1.1  mrg 	    case RID_GOTO:
    428  1.1  mrg 	      {
    429  1.1  mrg 		location_t loc = c_parser_peek_token (parser)->location;
    430  1.1  mrg 		c_parser_consume_token (parser);
    431  1.1  mrg 		if (c_parser_next_token_is (parser, CPP_NAME))
    432  1.1  mrg 		  {
    433  1.1  mrg 		    tree label = c_parser_peek_token (parser)->value;
    434  1.1  mrg 		    c_parser_consume_token (parser);
    435  1.1  mrg 		    c_parser_gimple_goto_stmt (parser, loc, label, seq);
    436  1.1  mrg 		    if (! c_parser_require (parser, CPP_SEMICOLON,
    437  1.1  mrg 					    "expected %<;%>"))
    438  1.1  mrg 		      return return_p;
    439  1.1  mrg 		  }
    440  1.1  mrg 		}
    441  1.1  mrg 	      break;
    442  1.1  mrg 	    case RID_RETURN:
    443  1.1  mrg 	      return_p = true;
    444  1.1  mrg 	      c_parser_gimple_return_stmt (parser, seq);
    445  1.1  mrg 	      if (! c_parser_require (parser, CPP_SEMICOLON,
    446  1.1  mrg 				      "expected %<;%>"))
    447  1.1  mrg 		return return_p;
    448  1.1  mrg 	      if (cfun->curr_properties & PROP_cfg)
    449  1.1  mrg 		parser.push_edge (parser.current_bb->index, EXIT_BLOCK, 0,
    450  1.1  mrg 				  profile_probability::uninitialized ());
    451  1.1  mrg 	      break;
    452  1.1  mrg 	    default:
    453  1.1  mrg 	      goto expr_stmt;
    454  1.1  mrg 	    }
    455  1.1  mrg 	  break;
    456  1.1  mrg 	case CPP_NAME:
    457  1.1  mrg 	  if (c_parser_peek_2nd_token (parser)->type == CPP_COLON)
    458  1.1  mrg 	    {
    459  1.1  mrg 	      c_parser_gimple_label (parser, seq);
    460  1.1  mrg 	      break;
    461  1.1  mrg 	    }
    462  1.1  mrg 	  if (c_parser_next_token_is (parser, CPP_NAME)
    463  1.1  mrg 	      && c_parser_peek_token (parser)->id_kind == C_ID_ID
    464  1.1  mrg 	      && strcmp (IDENTIFIER_POINTER (c_parser_peek_token (parser)->value),
    465  1.1  mrg 			 "try") == 0)
    466  1.1  mrg 	    {
    467  1.1  mrg 	      c_parser_gimple_try_stmt (parser, seq);
    468  1.1  mrg 	      break;
    469  1.1  mrg 	    }
    470  1.1  mrg 	  /* Basic block specification.
    471  1.1  mrg 	     __BB (index, ...)  */
    472  1.1  mrg 	  if ((cfun->curr_properties & PROP_cfg)
    473  1.1  mrg 	      && !strcmp (IDENTIFIER_POINTER
    474  1.1  mrg 			    (c_parser_peek_token (parser)->value), "__BB"))
    475  1.1  mrg 	    {
    476  1.1  mrg 	      c_parser_consume_token (parser);
    477  1.1  mrg 	      if (! c_parser_require (parser, CPP_OPEN_PAREN,
    478  1.1  mrg 				      "expected %<(%>"))
    479  1.1  mrg 		return return_p;
    480  1.1  mrg 	      if (c_parser_next_token_is_not (parser, CPP_NUMBER))
    481  1.1  mrg 		{
    482  1.1  mrg 		  c_parser_error (parser, "expected block index");
    483  1.1  mrg 		  return return_p;
    484  1.1  mrg 		}
    485  1.1  mrg 	      tree tnum = c_parser_peek_token (parser)->value;
    486  1.1  mrg 	      if (TREE_CODE (tnum) != INTEGER_CST)
    487  1.1  mrg 		{
    488  1.1  mrg 		  c_parser_error (parser, "expected block index");
    489  1.1  mrg 		  return return_p;
    490  1.1  mrg 		}
    491  1.1  mrg 	      int index = TREE_INT_CST_LOW (tnum);
    492  1.1  mrg 	      if (index < NUM_FIXED_BLOCKS
    493  1.1  mrg 		  || (index < last_basic_block_for_fn (cfun)
    494  1.1  mrg 		      && BASIC_BLOCK_FOR_FN (cfun, index) != NULL))
    495  1.1  mrg 		{
    496  1.1  mrg 		  c_parser_error (parser, "invalid block index");
    497  1.1  mrg 		  return return_p;
    498  1.1  mrg 		}
    499  1.1  mrg 	      int is_loop_header_of = -1;
    500  1.1  mrg 	      profile_count bb_count = profile_count::uninitialized ();
    501  1.1  mrg 	      c_parser_consume_token (parser);
    502  1.1  mrg 	      while (c_parser_next_token_is (parser, CPP_COMMA))
    503  1.1  mrg 		{
    504  1.1  mrg 		  c_parser_consume_token (parser);
    505  1.1  mrg 		  if (! c_parser_next_token_is (parser, CPP_NAME))
    506  1.1  mrg 		    {
    507  1.1  mrg 		      c_parser_error (parser, "expected block specifier");
    508  1.1  mrg 		      return return_p;
    509  1.1  mrg 		    }
    510  1.1  mrg 		  /* loop_header (NUM)  */
    511  1.1  mrg 		  if (!strcmp (IDENTIFIER_POINTER
    512  1.1  mrg 			         (c_parser_peek_token (parser)->value),
    513  1.1  mrg 			       "loop_header"))
    514  1.1  mrg 		    {
    515  1.1  mrg 		      c_parser_consume_token (parser);
    516  1.1  mrg 		      if (! c_parser_require (parser, CPP_OPEN_PAREN,
    517  1.1  mrg 					      "expected %<(%>"))
    518  1.1  mrg 			return return_p;
    519  1.1  mrg 		      tree loop_num;
    520  1.1  mrg 		      if (! c_parser_next_token_is (parser, CPP_NUMBER)
    521  1.1  mrg 			  || TREE_CODE (loop_num
    522  1.1  mrg 					  = c_parser_peek_token (parser)->value)
    523  1.1  mrg 			       != INTEGER_CST)
    524  1.1  mrg 			{
    525  1.1  mrg 			  c_parser_error (parser, "expected loop number");
    526  1.1  mrg 			  return return_p;
    527  1.1  mrg 			}
    528  1.1  mrg 		      c_parser_consume_token (parser);
    529  1.1  mrg 		      is_loop_header_of = TREE_INT_CST_LOW (loop_num);
    530  1.1  mrg 		      if (! c_parser_require (parser, CPP_CLOSE_PAREN,
    531  1.1  mrg 					      "expected %<)%>"))
    532  1.1  mrg 			return return_p;
    533  1.1  mrg 		    }
    534  1.1  mrg 		  /* Parse profile: quality(value) */
    535  1.1  mrg 		  else
    536  1.1  mrg 		    {
    537  1.1  mrg 		      tree q;
    538  1.1  mrg 		      profile_quality quality;
    539  1.1  mrg 		      tree v = c_parser_peek_token (parser)->value;
    540  1.1  mrg 		      if (!parse_profile_quality (IDENTIFIER_POINTER (v),
    541  1.1  mrg 						  &quality))
    542  1.1  mrg 			{
    543  1.1  mrg 			  c_parser_error (parser, "unknown block specifier");
    544  1.1  mrg 			  return false;
    545  1.1  mrg 			}
    546  1.1  mrg 
    547  1.1  mrg 		      c_parser_consume_token (parser);
    548  1.1  mrg 		      if (!c_parser_require (parser, CPP_OPEN_PAREN,
    549  1.1  mrg 					     "expected %<(%>"))
    550  1.1  mrg 			return false;
    551  1.1  mrg 
    552  1.1  mrg 		      if (!c_parser_next_token_is (parser, CPP_NUMBER)
    553  1.1  mrg 			  || (TREE_CODE (q = c_parser_peek_token (parser)->value)
    554  1.1  mrg 			      != INTEGER_CST))
    555  1.1  mrg 			{
    556  1.1  mrg 			  c_parser_error (parser, "expected count value");
    557  1.1  mrg 			  return false;
    558  1.1  mrg 			}
    559  1.1  mrg 
    560  1.1  mrg 		      bb_count
    561  1.1  mrg 			= profile_count::from_gcov_type (TREE_INT_CST_LOW (q),
    562  1.1  mrg 							 quality);
    563  1.1  mrg 		      c_parser_consume_token (parser);
    564  1.1  mrg 		      if (! c_parser_require (parser, CPP_CLOSE_PAREN,
    565  1.1  mrg 					      "expected %<)%>"))
    566  1.1  mrg 			return return_p;
    567  1.1  mrg 		    }
    568  1.1  mrg 		}
    569  1.1  mrg 	      if (! c_parser_require (parser, CPP_CLOSE_PAREN,
    570  1.1  mrg 				      "expected %<)%>")
    571  1.1  mrg 		  || ! c_parser_require (parser, CPP_COLON,
    572  1.1  mrg 					 "expected %<:%>"))
    573  1.1  mrg 		return return_p;
    574  1.1  mrg 
    575  1.1  mrg 	      /* Put stmts parsed in the current block.  */
    576  1.1  mrg 	      if (!gimple_seq_empty_p (*seq))
    577  1.1  mrg 		{
    578  1.1  mrg 		  if (!parser.current_bb)
    579  1.1  mrg 		    c_parser_error (parser, "stmts without block");
    580  1.1  mrg 		  else
    581  1.1  mrg 		    {
    582  1.1  mrg 		      gimple_stmt_iterator gsi
    583  1.1  mrg 			= gsi_start_bb (parser.current_bb);
    584  1.1  mrg 		      gsi_insert_seq_after (&gsi, *seq, GSI_CONTINUE_LINKING);
    585  1.1  mrg 		    }
    586  1.1  mrg 		  *seq = NULL;
    587  1.1  mrg 		}
    588  1.1  mrg 
    589  1.1  mrg 	      /* Build an empty block with specified index, linking them
    590  1.1  mrg 		 in source order.  */
    591  1.1  mrg 	      basic_block bb = alloc_block ();
    592  1.1  mrg 	      bb->index = index;
    593  1.1  mrg 	      link_block (bb, (parser.current_bb ? parser.current_bb
    594  1.1  mrg 			       : ENTRY_BLOCK_PTR_FOR_FN (cfun)));
    595  1.1  mrg 	      if (basic_block_info_for_fn (cfun)->length () <= (size_t)index)
    596  1.1  mrg 		vec_safe_grow_cleared (basic_block_info_for_fn (cfun),
    597  1.1  mrg 				       index + 1, true);
    598  1.1  mrg 	      SET_BASIC_BLOCK_FOR_FN (cfun, index, bb);
    599  1.1  mrg 	      if (last_basic_block_for_fn (cfun) <= index)
    600  1.1  mrg 		last_basic_block_for_fn (cfun) = index + 1;
    601  1.1  mrg 	      n_basic_blocks_for_fn (cfun)++;
    602  1.1  mrg 	      if (parser.current_bb->index == ENTRY_BLOCK)
    603  1.1  mrg 		parser.push_edge (ENTRY_BLOCK, bb->index, EDGE_FALLTHRU,
    604  1.1  mrg 				  profile_probability::always ());
    605  1.1  mrg 
    606  1.1  mrg 	      /* We leave the proper setting to fixup.  */
    607  1.1  mrg 	      class loop *loop_father = loops_for_fn (cfun)->tree_root;
    608  1.1  mrg 	      /* If the new block is a loop header, allocate a loop
    609  1.1  mrg 		 struct.  Fixup will take care of proper placement within
    610  1.1  mrg 		 the loop tree.  */
    611  1.1  mrg 	      if (is_loop_header_of != -1)
    612  1.1  mrg 		{
    613  1.1  mrg 		  if (number_of_loops (cfun) > (unsigned)is_loop_header_of
    614  1.1  mrg 		      && get_loop (cfun, is_loop_header_of) != NULL)
    615  1.1  mrg 		    {
    616  1.1  mrg 		      c_parser_error (parser, "duplicate loop header");
    617  1.1  mrg 		    }
    618  1.1  mrg 		  else
    619  1.1  mrg 		    {
    620  1.1  mrg 		      class loop *loop = alloc_loop ();
    621  1.1  mrg 		      loop->num = is_loop_header_of;
    622  1.1  mrg 		      loop->header = bb;
    623  1.1  mrg 		      if (number_of_loops (cfun) <= (unsigned)is_loop_header_of)
    624  1.1  mrg 			vec_safe_grow_cleared (loops_for_fn (cfun)->larray,
    625  1.1  mrg 					       is_loop_header_of + 1, true);
    626  1.1  mrg 		      (*loops_for_fn (cfun)->larray)[is_loop_header_of] = loop;
    627  1.1  mrg 		      flow_loop_tree_node_add (loops_for_fn (cfun)->tree_root,
    628  1.1  mrg 					       loop);
    629  1.1  mrg 		    }
    630  1.1  mrg 		  loop_father = get_loop (cfun, is_loop_header_of);
    631  1.1  mrg 		}
    632  1.1  mrg 	      bb->loop_father = loop_father;
    633  1.1  mrg 	      bb->count = bb_count;
    634  1.1  mrg 
    635  1.1  mrg 	      /* Stmts now go to the new block.  */
    636  1.1  mrg 	      parser.current_bb = bb;
    637  1.1  mrg 	      break;
    638  1.1  mrg 	    }
    639  1.1  mrg 	  goto expr_stmt;
    640  1.1  mrg 
    641  1.1  mrg 	case CPP_SEMICOLON:
    642  1.1  mrg 	  {
    643  1.1  mrg 	    /* Empty stmt.  */
    644  1.1  mrg 	    location_t loc = c_parser_peek_token (parser)->location;
    645  1.1  mrg 	    c_parser_consume_token (parser);
    646  1.1  mrg 	    gimple *nop = gimple_build_nop ();
    647  1.1  mrg 	    gimple_set_location (nop, loc);
    648  1.1  mrg 	    gimple_seq_add_stmt_without_update (seq, nop);
    649  1.1  mrg 	    break;
    650  1.1  mrg 	  }
    651  1.1  mrg 
    652  1.1  mrg 	default:
    653  1.1  mrg expr_stmt:
    654  1.1  mrg 	  c_parser_gimple_statement (parser, seq);
    655  1.1  mrg 	  if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
    656  1.1  mrg 	    c_parser_skip_until_found (parser, CPP_SEMICOLON, NULL);
    657  1.1  mrg 	}
    658  1.1  mrg     }
    659  1.1  mrg   c_parser_consume_token (parser);
    660  1.1  mrg 
    661  1.1  mrg   /* Put stmts parsed in the current block.  */
    662  1.1  mrg   if ((cfun->curr_properties & PROP_cfg)
    663  1.1  mrg       && !gimple_seq_empty_p (*seq))
    664  1.1  mrg     {
    665  1.1  mrg       if (!parser.current_bb)
    666  1.1  mrg 	c_parser_error (parser, "stmts without block");
    667  1.1  mrg       else
    668  1.1  mrg 	{
    669  1.1  mrg 	  gimple_stmt_iterator gsi = gsi_start_bb (parser.current_bb);
    670  1.1  mrg 	  gsi_insert_seq_after (&gsi, *seq, GSI_CONTINUE_LINKING);
    671  1.1  mrg 	}
    672  1.1  mrg       *seq = NULL;
    673  1.1  mrg     }
    674  1.1  mrg 
    675  1.1  mrg   return return_p;
    676  1.1  mrg }
    677  1.1  mrg 
    678  1.1  mrg /* Parse a gimple statement.
    679  1.1  mrg 
    680  1.1  mrg    gimple-statement:
    681  1.1  mrg      gimple-call-expression
    682  1.1  mrg      gimple-assign-statement
    683  1.1  mrg      gimple-phi-statement
    684  1.1  mrg 
    685  1.1  mrg    gimple-assign-statement:
    686  1.1  mrg      gimple-unary-expression = gimple-assign-rhs
    687  1.1  mrg 
    688  1.1  mrg    gimple-assign-rhs:
    689  1.1  mrg      gimple-cast-expression
    690  1.1  mrg      gimple-unary-expression
    691  1.1  mrg      gimple-binary-expression
    692  1.1  mrg      gimple-call-expression
    693  1.1  mrg 
    694  1.1  mrg    gimple-phi-statement:
    695  1.1  mrg      identifier = __PHI ( label : gimple_primary-expression, ... )
    696  1.1  mrg 
    697  1.1  mrg    gimple-call-expr:
    698  1.1  mrg      gimple-primary-expression ( argument-list )
    699  1.1  mrg 
    700  1.1  mrg    gimple-cast-expression:
    701  1.1  mrg      ( type-name ) gimple-primary-expression
    702  1.1  mrg 
    703  1.1  mrg */
    704  1.1  mrg 
    705  1.1  mrg static void
    706  1.1  mrg c_parser_gimple_statement (gimple_parser &parser, gimple_seq *seq)
    707  1.1  mrg {
    708  1.1  mrg   struct c_expr lhs, rhs;
    709  1.1  mrg   gimple *assign = NULL;
    710  1.1  mrg   location_t loc;
    711  1.1  mrg   tree arg = NULL_TREE;
    712  1.1  mrg   auto_vec<tree> vargs;
    713  1.1  mrg 
    714  1.1  mrg   lhs = c_parser_gimple_unary_expression (parser);
    715  1.1  mrg   loc = EXPR_LOCATION (lhs.value);
    716  1.1  mrg   rhs.set_error ();
    717  1.1  mrg 
    718  1.1  mrg   /* GIMPLE call statement without LHS.  */
    719  1.1  mrg   if (c_parser_next_token_is (parser, CPP_SEMICOLON)
    720  1.1  mrg       && TREE_CODE (lhs.value) == CALL_EXPR)
    721  1.1  mrg     {
    722  1.1  mrg       gimple *call;
    723  1.1  mrg       call = gimple_build_call_from_tree (lhs.value, NULL);
    724  1.1  mrg       gimple_seq_add_stmt_without_update (seq, call);
    725  1.1  mrg       gimple_set_location (call, loc);
    726  1.1  mrg       return;
    727  1.1  mrg     }
    728  1.1  mrg 
    729  1.1  mrg   /* All following cases are statements with LHS.  */
    730  1.1  mrg   if (! c_parser_require (parser, CPP_EQ, "expected %<=%>"))
    731  1.1  mrg     return;
    732  1.1  mrg 
    733  1.1  mrg   /* Cast expression.  */
    734  1.1  mrg   if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
    735  1.1  mrg       && c_token_starts_typename (c_parser_peek_2nd_token (parser)))
    736  1.1  mrg     {
    737  1.1  mrg       c_parser_consume_token (parser);
    738  1.1  mrg       struct c_type_name *type_name = c_parser_type_name (parser);
    739  1.1  mrg       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
    740  1.1  mrg       if (type_name == NULL)
    741  1.1  mrg 	return;
    742  1.1  mrg       /* ???  The actual type used in the cast expression is ignored as
    743  1.1  mrg          in GIMPLE it is encoded by the type of the LHS.  */
    744  1.1  mrg       rhs = c_parser_gimple_postfix_expression (parser);
    745  1.1  mrg       if (lhs.value != error_mark_node
    746  1.1  mrg 	  && rhs.value != error_mark_node)
    747  1.1  mrg 	{
    748  1.1  mrg 	  enum tree_code code = NOP_EXPR;
    749  1.1  mrg 	  if (FLOAT_TYPE_P (TREE_TYPE (lhs.value))
    750  1.1  mrg 	      && ! FLOAT_TYPE_P (TREE_TYPE (rhs.value)))
    751  1.1  mrg 	    code = FLOAT_EXPR;
    752  1.1  mrg 	  else if (! FLOAT_TYPE_P (TREE_TYPE (lhs.value))
    753  1.1  mrg 		   && FLOAT_TYPE_P (TREE_TYPE (rhs.value)))
    754  1.1  mrg 	    code = FIX_TRUNC_EXPR;
    755  1.1  mrg 	  assign = gimple_build_assign (lhs.value, code, rhs.value);
    756  1.1  mrg 	  gimple_seq_add_stmt_without_update (seq, assign);
    757  1.1  mrg 	  gimple_set_location (assign, loc);
    758  1.1  mrg 	  return;
    759  1.1  mrg 	}
    760  1.1  mrg     }
    761  1.1  mrg 
    762  1.1  mrg   /* Unary expression.  */
    763  1.1  mrg   switch (c_parser_peek_token (parser)->type)
    764  1.1  mrg     {
    765  1.1  mrg     case CPP_NAME:
    766  1.1  mrg       {
    767  1.1  mrg 	tree id = c_parser_peek_token (parser)->value;
    768  1.1  mrg 	if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0
    769  1.1  mrg 	    || strcmp (IDENTIFIER_POINTER (id), "__ABSU") == 0
    770  1.1  mrg 	    || strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0
    771  1.1  mrg 	    || strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0
    772  1.1  mrg 	    || strcmp (IDENTIFIER_POINTER (id), "__BIT_INSERT") == 0
    773  1.1  mrg 	    || strcmp (IDENTIFIER_POINTER (id), "__VEC_PERM") == 0)
    774  1.1  mrg 	  goto build_unary_expr;
    775  1.1  mrg 	break;
    776  1.1  mrg       }
    777  1.1  mrg     case CPP_KEYWORD:
    778  1.1  mrg       if (c_parser_peek_token (parser)->keyword != RID_REALPART
    779  1.1  mrg 	  && c_parser_peek_token (parser)->keyword != RID_IMAGPART)
    780  1.1  mrg 	break;
    781  1.1  mrg       /* Fallthru.  */
    782  1.1  mrg     case CPP_AND:
    783  1.1  mrg     case CPP_PLUS:
    784  1.1  mrg     case CPP_MINUS:
    785  1.1  mrg     case CPP_COMPL:
    786  1.1  mrg     case CPP_NOT:
    787  1.1  mrg     case CPP_MULT: /* pointer deref */
    788  1.1  mrg     build_unary_expr:
    789  1.1  mrg       rhs = c_parser_gimple_unary_expression (parser);
    790  1.1  mrg       if (rhs.value != error_mark_node)
    791  1.1  mrg 	{
    792  1.1  mrg 	  assign = gimple_build_assign (lhs.value, rhs.value);
    793  1.1  mrg 	  gimple_set_location (assign, loc);
    794  1.1  mrg 	  gimple_seq_add_stmt_without_update (seq, assign);
    795  1.1  mrg 	}
    796  1.1  mrg       return;
    797  1.1  mrg 
    798  1.1  mrg     default:;
    799  1.1  mrg     }
    800  1.1  mrg 
    801  1.1  mrg   /* GIMPLE PHI statement.  */
    802  1.1  mrg   if (c_parser_next_token_is_keyword (parser, RID_PHI))
    803  1.1  mrg     {
    804  1.1  mrg       c_parser_consume_token (parser);
    805  1.1  mrg 
    806  1.1  mrg       if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
    807  1.1  mrg 	return;
    808  1.1  mrg 
    809  1.1  mrg       if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
    810  1.1  mrg 	c_parser_consume_token (parser);
    811  1.1  mrg 
    812  1.1  mrg       while (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN))
    813  1.1  mrg 	{
    814  1.1  mrg 	  if (c_parser_next_token_is (parser, CPP_NAME)
    815  1.1  mrg 	      && c_parser_peek_2nd_token (parser)->type == CPP_COLON)
    816  1.1  mrg 	    {
    817  1.1  mrg 	      arg = c_parser_peek_token (parser)->value;
    818  1.1  mrg 	      c_parser_consume_token (parser);
    819  1.1  mrg 	      if (c_parser_next_token_is (parser, CPP_COLON))
    820  1.1  mrg 		c_parser_consume_token (parser);
    821  1.1  mrg 	      int src_index = -1;
    822  1.1  mrg 	      if (!c_parser_gimple_parse_bb_spec (arg, &src_index))
    823  1.1  mrg 		c_parser_error (parser, "invalid source block specification");
    824  1.1  mrg 	      vargs.safe_push (size_int (src_index));
    825  1.1  mrg 	    }
    826  1.1  mrg 	  else if (c_parser_next_token_is (parser, CPP_COMMA))
    827  1.1  mrg 	    c_parser_consume_token (parser);
    828  1.1  mrg 	  else
    829  1.1  mrg 	    {
    830  1.1  mrg 	      arg = c_parser_gimple_unary_expression (parser).value;
    831  1.1  mrg 	      vargs.safe_push (arg);
    832  1.1  mrg 	    }
    833  1.1  mrg 	}
    834  1.1  mrg 
    835  1.1  mrg       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
    836  1.1  mrg 				 "expected %<)%>");
    837  1.1  mrg 
    838  1.1  mrg       /* Build internal function for PHI.  */
    839  1.1  mrg       gcall *call_stmt = gimple_build_call_internal_vec (IFN_PHI, vargs);
    840  1.1  mrg       gimple_call_set_lhs (call_stmt, lhs.value);
    841  1.1  mrg       gimple_set_location (call_stmt, UNKNOWN_LOCATION);
    842  1.1  mrg       gimple_seq_add_stmt_without_update (seq, call_stmt);
    843  1.1  mrg       return;
    844  1.1  mrg     }
    845  1.1  mrg 
    846  1.1  mrg   /* GIMPLE call with lhs.  */
    847  1.1  mrg   if (c_parser_next_token_is (parser, CPP_DOT)
    848  1.1  mrg       || (c_parser_next_token_is (parser, CPP_NAME)
    849  1.1  mrg 	  && c_parser_peek_2nd_token (parser)->type == CPP_OPEN_PAREN
    850  1.1  mrg 	  && lookup_name (c_parser_peek_token (parser)->value)))
    851  1.1  mrg     {
    852  1.1  mrg       rhs = c_parser_gimple_unary_expression (parser);
    853  1.1  mrg       if (rhs.value != error_mark_node)
    854  1.1  mrg 	{
    855  1.1  mrg 	  gimple *call = gimple_build_call_from_tree (rhs.value, NULL);
    856  1.1  mrg 	  gimple_call_set_lhs (call, lhs.value);
    857  1.1  mrg 	  gimple_seq_add_stmt_without_update (seq, call);
    858  1.1  mrg 	  gimple_set_location (call, loc);
    859  1.1  mrg 	}
    860  1.1  mrg       return;
    861  1.1  mrg     }
    862  1.1  mrg 
    863  1.1  mrg   rhs = c_parser_gimple_binary_expression (parser);
    864  1.1  mrg   if (lhs.value != error_mark_node
    865  1.1  mrg       && rhs.value != error_mark_node)
    866  1.1  mrg     {
    867  1.1  mrg       /* If we parsed a comparison or an identifier and the next token
    868  1.1  mrg 	 is a '?' then parse a conditional expression.  */
    869  1.1  mrg       if ((COMPARISON_CLASS_P (rhs.value)
    870  1.1  mrg 	   || SSA_VAR_P (rhs.value))
    871  1.1  mrg 	  && c_parser_next_token_is (parser, CPP_QUERY))
    872  1.1  mrg 	{
    873  1.1  mrg 	  struct c_expr trueval, falseval;
    874  1.1  mrg 	  c_parser_consume_token (parser);
    875  1.1  mrg 	  trueval = c_parser_gimple_postfix_expression (parser);
    876  1.1  mrg 	  falseval.set_error ();
    877  1.1  mrg 	  if (c_parser_require (parser, CPP_COLON, "expected %<:%>"))
    878  1.1  mrg 	    falseval = c_parser_gimple_postfix_expression (parser);
    879  1.1  mrg 	  if (trueval.value == error_mark_node
    880  1.1  mrg 	      || falseval.value == error_mark_node)
    881  1.1  mrg 	    return;
    882  1.1  mrg 	  rhs.value = build3_loc (loc,
    883  1.1  mrg 				  VECTOR_TYPE_P (TREE_TYPE (rhs.value))
    884  1.1  mrg 				  ? VEC_COND_EXPR : COND_EXPR,
    885  1.1  mrg 				  TREE_TYPE (trueval.value),
    886  1.1  mrg 				  rhs.value, trueval.value, falseval.value);
    887  1.1  mrg 	}
    888  1.1  mrg       if (get_gimple_rhs_class (TREE_CODE (rhs.value)) == GIMPLE_INVALID_RHS)
    889  1.1  mrg 	{
    890  1.1  mrg 	  c_parser_error (parser, "unexpected RHS for assignment");
    891  1.1  mrg 	  return;
    892  1.1  mrg 	}
    893  1.1  mrg       assign = gimple_build_assign (lhs.value, rhs.value);
    894  1.1  mrg       gimple_seq_add_stmt_without_update (seq, assign);
    895  1.1  mrg       gimple_set_location (assign, loc);
    896  1.1  mrg     }
    897  1.1  mrg   return;
    898  1.1  mrg }
    899  1.1  mrg 
    900  1.1  mrg /* Parse gimple binary expr.
    901  1.1  mrg 
    902  1.1  mrg    gimple-binary-expression:
    903  1.1  mrg      gimple-unary-expression * gimple-unary-expression
    904  1.1  mrg      gimple-unary-expression __MULT_HIGHPART gimple-unary-expression
    905  1.1  mrg      gimple-unary-expression / gimple-unary-expression
    906  1.1  mrg      gimple-unary-expression % gimple-unary-expression
    907  1.1  mrg      gimple-unary-expression + gimple-unary-expression
    908  1.1  mrg      gimple-unary-expression - gimple-unary-expression
    909  1.1  mrg      gimple-unary-expression << gimple-unary-expression
    910  1.1  mrg      gimple-unary-expression >> gimple-unary-expression
    911  1.1  mrg      gimple-unary-expression < gimple-unary-expression
    912  1.1  mrg      gimple-unary-expression > gimple-unary-expression
    913  1.1  mrg      gimple-unary-expression <= gimple-unary-expression
    914  1.1  mrg      gimple-unary-expression >= gimple-unary-expression
    915  1.1  mrg      gimple-unary-expression == gimple-unary-expression
    916  1.1  mrg      gimple-unary-expression != gimple-unary-expression
    917  1.1  mrg      gimple-unary-expression & gimple-unary-expression
    918  1.1  mrg      gimple-unary-expression ^ gimple-unary-expression
    919  1.1  mrg      gimple-unary-expression | gimple-unary-expression
    920  1.1  mrg 
    921  1.1  mrg */
    922  1.1  mrg 
    923  1.1  mrg static c_expr
    924  1.1  mrg c_parser_gimple_binary_expression (gimple_parser &parser)
    925  1.1  mrg {
    926  1.1  mrg   /* Location of the binary operator.  */
    927  1.1  mrg   struct c_expr ret, lhs, rhs;
    928  1.1  mrg   enum tree_code code = ERROR_MARK;
    929  1.1  mrg   ret.set_error ();
    930  1.1  mrg   lhs = c_parser_gimple_postfix_expression (parser);
    931  1.1  mrg   if (c_parser_error (parser))
    932  1.1  mrg     return ret;
    933  1.1  mrg   tree ret_type = TREE_TYPE (lhs.value);
    934  1.1  mrg   switch (c_parser_peek_token (parser)->type)
    935  1.1  mrg     {
    936  1.1  mrg     case CPP_MULT:
    937  1.1  mrg       code = MULT_EXPR;
    938  1.1  mrg       break;
    939  1.1  mrg     case CPP_DIV:
    940  1.1  mrg       code = TRUNC_DIV_EXPR;
    941  1.1  mrg       break;
    942  1.1  mrg     case CPP_MOD:
    943  1.1  mrg       code = TRUNC_MOD_EXPR;
    944  1.1  mrg       break;
    945  1.1  mrg     case CPP_PLUS:
    946  1.1  mrg       if (POINTER_TYPE_P (TREE_TYPE (lhs.value)))
    947  1.1  mrg 	code = POINTER_PLUS_EXPR;
    948  1.1  mrg       else
    949  1.1  mrg 	code = PLUS_EXPR;
    950  1.1  mrg       break;
    951  1.1  mrg     case CPP_MINUS:
    952  1.1  mrg       code = MINUS_EXPR;
    953  1.1  mrg       break;
    954  1.1  mrg     case CPP_LSHIFT:
    955  1.1  mrg       code = LSHIFT_EXPR;
    956  1.1  mrg       break;
    957  1.1  mrg     case CPP_RSHIFT:
    958  1.1  mrg       code = RSHIFT_EXPR;
    959  1.1  mrg       break;
    960  1.1  mrg     case CPP_LESS:
    961  1.1  mrg       code = LT_EXPR;
    962  1.1  mrg       ret_type = boolean_type_node;
    963  1.1  mrg       break;
    964  1.1  mrg     case CPP_GREATER:
    965  1.1  mrg       code = GT_EXPR;
    966  1.1  mrg       ret_type = boolean_type_node;
    967  1.1  mrg       break;
    968  1.1  mrg     case CPP_LESS_EQ:
    969  1.1  mrg       code = LE_EXPR;
    970  1.1  mrg       ret_type = boolean_type_node;
    971  1.1  mrg       break;
    972  1.1  mrg     case CPP_GREATER_EQ:
    973  1.1  mrg       code = GE_EXPR;
    974  1.1  mrg       ret_type = boolean_type_node;
    975  1.1  mrg       break;
    976  1.1  mrg     case CPP_EQ_EQ:
    977  1.1  mrg       code = EQ_EXPR;
    978  1.1  mrg       ret_type = boolean_type_node;
    979  1.1  mrg       break;
    980  1.1  mrg     case CPP_NOT_EQ:
    981  1.1  mrg       code = NE_EXPR;
    982  1.1  mrg       ret_type = boolean_type_node;
    983  1.1  mrg       break;
    984  1.1  mrg     case CPP_AND:
    985  1.1  mrg       code = BIT_AND_EXPR;
    986  1.1  mrg       break;
    987  1.1  mrg     case CPP_XOR:
    988  1.1  mrg       code = BIT_XOR_EXPR;
    989  1.1  mrg       break;
    990  1.1  mrg     case CPP_OR:
    991  1.1  mrg       code = BIT_IOR_EXPR;
    992  1.1  mrg       break;
    993  1.1  mrg     case CPP_AND_AND:
    994  1.1  mrg       c_parser_error (parser, "%<&&%> not valid in GIMPLE");
    995  1.1  mrg       return ret;
    996  1.1  mrg     case CPP_OR_OR:
    997  1.1  mrg       c_parser_error (parser, "%<||%> not valid in GIMPLE");
    998  1.1  mrg       return ret;
    999  1.1  mrg     case CPP_NAME:
   1000  1.1  mrg 	{
   1001  1.1  mrg 	  tree id = c_parser_peek_token (parser)->value;
   1002  1.1  mrg 	  if (strcmp (IDENTIFIER_POINTER (id), "__MULT_HIGHPART") == 0)
   1003  1.1  mrg 	    {
   1004  1.1  mrg 	      code = MULT_HIGHPART_EXPR;
   1005  1.1  mrg 	      break;
   1006  1.1  mrg 	    }
   1007  1.1  mrg 	}
   1008  1.1  mrg       /* Fallthru.  */
   1009  1.1  mrg     default:
   1010  1.1  mrg       /* Not a binary expression.  */
   1011  1.1  mrg       return lhs;
   1012  1.1  mrg     }
   1013  1.1  mrg   location_t ret_loc = c_parser_peek_token (parser)->location;
   1014  1.1  mrg   c_parser_consume_token (parser);
   1015  1.1  mrg   rhs = c_parser_gimple_postfix_expression (parser);
   1016  1.1  mrg   if (lhs.value != error_mark_node && rhs.value != error_mark_node)
   1017  1.1  mrg     ret.value = build2_loc (ret_loc, code, ret_type, lhs.value, rhs.value);
   1018  1.1  mrg   return ret;
   1019  1.1  mrg }
   1020  1.1  mrg 
   1021  1.1  mrg /* Parse a gimple parentized binary expression.  */
   1022  1.1  mrg 
   1023  1.1  mrg static c_expr
   1024  1.1  mrg c_parser_gimple_parentized_binary_expression (gimple_parser &parser,
   1025  1.1  mrg 					      location_t op_loc,
   1026  1.1  mrg 					      tree_code code)
   1027  1.1  mrg {
   1028  1.1  mrg   struct c_expr ret;
   1029  1.1  mrg   ret.set_error ();
   1030  1.1  mrg 
   1031  1.1  mrg   c_parser_consume_token (parser);
   1032  1.1  mrg   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1033  1.1  mrg     return ret;
   1034  1.1  mrg   c_expr op1 = c_parser_gimple_postfix_expression (parser);
   1035  1.1  mrg   if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
   1036  1.1  mrg     return ret;
   1037  1.1  mrg   c_expr op2 = c_parser_gimple_postfix_expression (parser);
   1038  1.1  mrg   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
   1039  1.1  mrg     return ret;
   1040  1.1  mrg 
   1041  1.1  mrg   if (op1.value != error_mark_node && op2.value != error_mark_node)
   1042  1.1  mrg     ret.value = build2_loc (op_loc,
   1043  1.1  mrg 			    code, TREE_TYPE (op1.value), op1.value, op2.value);
   1044  1.1  mrg   return ret;
   1045  1.1  mrg }
   1046  1.1  mrg 
   1047  1.1  mrg /* Parse a gimple parentized binary expression.  */
   1048  1.1  mrg 
   1049  1.1  mrg static c_expr
   1050  1.1  mrg c_parser_gimple_parentized_ternary_expression (gimple_parser &parser,
   1051  1.1  mrg 					       location_t op_loc,
   1052  1.1  mrg 					       tree_code code)
   1053  1.1  mrg {
   1054  1.1  mrg   struct c_expr ret;
   1055  1.1  mrg   ret.set_error ();
   1056  1.1  mrg 
   1057  1.1  mrg   c_parser_consume_token (parser);
   1058  1.1  mrg   if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1059  1.1  mrg     return ret;
   1060  1.1  mrg   c_expr op1 = c_parser_gimple_postfix_expression (parser);
   1061  1.1  mrg   if (!c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
   1062  1.1  mrg     return ret;
   1063  1.1  mrg   c_expr op2 = c_parser_gimple_postfix_expression (parser);
   1064  1.1  mrg   if (!c_parser_require (parser, CPP_COMMA, "expected %<)%>"))
   1065  1.1  mrg     return ret;
   1066  1.1  mrg   c_expr op3 = c_parser_gimple_postfix_expression (parser);
   1067  1.1  mrg   if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
   1068  1.1  mrg     return ret;
   1069  1.1  mrg 
   1070  1.1  mrg   if (op1.value != error_mark_node
   1071  1.1  mrg       && op2.value != error_mark_node
   1072  1.1  mrg       && op3.value != error_mark_node)
   1073  1.1  mrg     ret.value = build3_loc (op_loc,
   1074  1.1  mrg 			    code, TREE_TYPE (op1.value),
   1075  1.1  mrg 			    op1.value, op2.value, op3.value);
   1076  1.1  mrg   return ret;
   1077  1.1  mrg }
   1078  1.1  mrg 
   1079  1.1  mrg /* Parse gimple unary expression.
   1080  1.1  mrg 
   1081  1.1  mrg    gimple-unary-expression:
   1082  1.1  mrg      gimple-postfix-expression
   1083  1.1  mrg      unary-operator gimple-postfix-expression
   1084  1.1  mrg 
   1085  1.1  mrg    unary-operator: one of
   1086  1.1  mrg      & * + - ~ abs_expr
   1087  1.1  mrg */
   1088  1.1  mrg 
   1089  1.1  mrg static c_expr
   1090  1.1  mrg c_parser_gimple_unary_expression (gimple_parser &parser)
   1091  1.1  mrg {
   1092  1.1  mrg   struct c_expr ret, op;
   1093  1.1  mrg   location_t op_loc = c_parser_peek_token (parser)->location;
   1094  1.1  mrg   location_t finish;
   1095  1.1  mrg   ret.set_error ();
   1096  1.1  mrg   switch (c_parser_peek_token (parser)->type)
   1097  1.1  mrg     {
   1098  1.1  mrg     case CPP_AND:
   1099  1.1  mrg       c_parser_consume_token (parser);
   1100  1.1  mrg       op = c_parser_gimple_postfix_expression (parser);
   1101  1.1  mrg       mark_exp_read (op.value);
   1102  1.1  mrg       return parser_build_unary_op (op_loc, ADDR_EXPR, op);
   1103  1.1  mrg     case CPP_MULT:
   1104  1.1  mrg       {
   1105  1.1  mrg 	c_parser_consume_token (parser);
   1106  1.1  mrg 	op = c_parser_gimple_postfix_expression (parser);
   1107  1.1  mrg 	if (op.value == error_mark_node)
   1108  1.1  mrg 	  return ret;
   1109  1.1  mrg 	if (! POINTER_TYPE_P (TREE_TYPE (op.value)))
   1110  1.1  mrg 	  {
   1111  1.1  mrg 	    error_at (op_loc, "expected pointer as argument of unary %<*%>");
   1112  1.1  mrg 	    return ret;
   1113  1.1  mrg 	  }
   1114  1.1  mrg 	finish = op.get_finish ();
   1115  1.1  mrg 	location_t combined_loc = make_location (op_loc, op_loc, finish);
   1116  1.1  mrg 	ret.value = build_simple_mem_ref_loc (combined_loc, op.value);
   1117  1.1  mrg 	TREE_SIDE_EFFECTS (ret.value)
   1118  1.1  mrg 	  = TREE_THIS_VOLATILE (ret.value)
   1119  1.1  mrg 	  = TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (op.value)));
   1120  1.1  mrg 	ret.src_range.m_start = op_loc;
   1121  1.1  mrg 	ret.src_range.m_finish = finish;
   1122  1.1  mrg 	return ret;
   1123  1.1  mrg       }
   1124  1.1  mrg     case CPP_PLUS:
   1125  1.1  mrg       c_parser_consume_token (parser);
   1126  1.1  mrg       op = c_parser_gimple_postfix_expression (parser);
   1127  1.1  mrg       return parser_build_unary_op (op_loc, CONVERT_EXPR, op);
   1128  1.1  mrg     case CPP_MINUS:
   1129  1.1  mrg       c_parser_consume_token (parser);
   1130  1.1  mrg       op = c_parser_gimple_postfix_expression (parser);
   1131  1.1  mrg       return parser_build_unary_op (op_loc, NEGATE_EXPR, op);
   1132  1.1  mrg     case CPP_COMPL:
   1133  1.1  mrg       c_parser_consume_token (parser);
   1134  1.1  mrg       op = c_parser_gimple_postfix_expression (parser);
   1135  1.1  mrg       return parser_build_unary_op (op_loc, BIT_NOT_EXPR, op);
   1136  1.1  mrg     case CPP_NOT:
   1137  1.1  mrg       c_parser_error (parser, "%<!%> not valid in GIMPLE");
   1138  1.1  mrg       return ret;
   1139  1.1  mrg     case CPP_KEYWORD:
   1140  1.1  mrg       switch (c_parser_peek_token (parser)->keyword)
   1141  1.1  mrg 	{
   1142  1.1  mrg 	case RID_REALPART:
   1143  1.1  mrg 	  c_parser_consume_token (parser);
   1144  1.1  mrg 	  op = c_parser_gimple_postfix_expression (parser);
   1145  1.1  mrg 	  return parser_build_unary_op (op_loc, REALPART_EXPR, op);
   1146  1.1  mrg 	case RID_IMAGPART:
   1147  1.1  mrg 	  c_parser_consume_token (parser);
   1148  1.1  mrg 	  op = c_parser_gimple_postfix_expression (parser);
   1149  1.1  mrg 	  return parser_build_unary_op (op_loc, IMAGPART_EXPR, op);
   1150  1.1  mrg 	default:
   1151  1.1  mrg 	  return c_parser_gimple_postfix_expression (parser);
   1152  1.1  mrg 	}
   1153  1.1  mrg     case CPP_NAME:
   1154  1.1  mrg 	{
   1155  1.1  mrg 	  tree id = c_parser_peek_token (parser)->value;
   1156  1.1  mrg 	  if (strcmp (IDENTIFIER_POINTER (id), "__ABS") == 0)
   1157  1.1  mrg 	    {
   1158  1.1  mrg 	      c_parser_consume_token (parser);
   1159  1.1  mrg 	      op = c_parser_gimple_postfix_expression (parser);
   1160  1.1  mrg 	      return parser_build_unary_op (op_loc, ABS_EXPR, op);
   1161  1.1  mrg 	    }
   1162  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "__ABSU") == 0)
   1163  1.1  mrg 	    {
   1164  1.1  mrg 	      c_parser_consume_token (parser);
   1165  1.1  mrg 	      op = c_parser_gimple_postfix_expression (parser);
   1166  1.1  mrg 	      return parser_build_unary_op (op_loc, ABSU_EXPR, op);
   1167  1.1  mrg 	    }
   1168  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "__MIN") == 0)
   1169  1.1  mrg 	    return c_parser_gimple_parentized_binary_expression (parser,
   1170  1.1  mrg 								 op_loc,
   1171  1.1  mrg 								 MIN_EXPR);
   1172  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "__MAX") == 0)
   1173  1.1  mrg 	    return c_parser_gimple_parentized_binary_expression (parser,
   1174  1.1  mrg 								 op_loc,
   1175  1.1  mrg 								 MAX_EXPR);
   1176  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "__VEC_PERM") == 0)
   1177  1.1  mrg 	    return c_parser_gimple_parentized_ternary_expression
   1178  1.1  mrg 			(parser, op_loc, VEC_PERM_EXPR);
   1179  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "__BIT_INSERT") == 0)
   1180  1.1  mrg 	    {
   1181  1.1  mrg 	      /* __BIT_INSERT '(' postfix-expression, postfix-expression,
   1182  1.1  mrg 			          integer ')'  */
   1183  1.1  mrg 	      location_t loc = c_parser_peek_token (parser)->location;
   1184  1.1  mrg 	      c_parser_consume_token (parser);
   1185  1.1  mrg 	      if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1186  1.1  mrg 		{
   1187  1.1  mrg 		  c_expr op0 = c_parser_gimple_postfix_expression (parser);
   1188  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_COMMA,
   1189  1.1  mrg 					     "expected %<,%>");
   1190  1.1  mrg 		  c_expr op1 = c_parser_gimple_postfix_expression (parser);
   1191  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_COMMA,
   1192  1.1  mrg 					     "expected %<,%>");
   1193  1.1  mrg 		  c_expr op2 = c_parser_gimple_postfix_expression (parser);
   1194  1.1  mrg 		  if (TREE_CODE (op2.value) != INTEGER_CST
   1195  1.1  mrg 		      || !int_fits_type_p (op2.value, bitsizetype))
   1196  1.1  mrg 		    c_parser_error (parser, "expected constant offset");
   1197  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1198  1.1  mrg 					     "expected %<)%>");
   1199  1.1  mrg 		  if (op0.value != error_mark_node
   1200  1.1  mrg 		      && op1.value != error_mark_node
   1201  1.1  mrg 		      && TREE_CODE (op2.value) == INTEGER_CST)
   1202  1.1  mrg 		    ret.value = build3_loc (loc, BIT_INSERT_EXPR,
   1203  1.1  mrg 					    TREE_TYPE (op0.value),
   1204  1.1  mrg 					    op0.value, op1.value,
   1205  1.1  mrg 					    fold_convert (bitsizetype,
   1206  1.1  mrg 							  op2.value));
   1207  1.1  mrg 		}
   1208  1.1  mrg 	      return ret;
   1209  1.1  mrg 	    }
   1210  1.1  mrg 	  else
   1211  1.1  mrg 	    return c_parser_gimple_postfix_expression (parser);
   1212  1.1  mrg 	}
   1213  1.1  mrg     default:
   1214  1.1  mrg       return c_parser_gimple_postfix_expression (parser);
   1215  1.1  mrg     }
   1216  1.1  mrg }
   1217  1.1  mrg 
   1218  1.1  mrg /* Decompose ID into base name (ID until ver_offset) and VERSION.  Return
   1219  1.1  mrg    true if ID matches a SSA name.  */
   1220  1.1  mrg 
   1221  1.1  mrg static bool
   1222  1.1  mrg c_parser_parse_ssa_name_id (tree id, unsigned *version, unsigned *ver_offset)
   1223  1.1  mrg {
   1224  1.1  mrg   const char *token = IDENTIFIER_POINTER (id);
   1225  1.1  mrg   const char *var_version = strrchr (token, '_');
   1226  1.1  mrg   if (! var_version)
   1227  1.1  mrg     return false;
   1228  1.1  mrg 
   1229  1.1  mrg   *ver_offset = var_version - token;
   1230  1.1  mrg   for (const char *p = var_version + 1; *p; ++p)
   1231  1.1  mrg     if (! ISDIGIT (*p))
   1232  1.1  mrg       return false;
   1233  1.1  mrg   *version = atoi (var_version + 1);
   1234  1.1  mrg   return *version > 0;
   1235  1.1  mrg }
   1236  1.1  mrg 
   1237  1.1  mrg /* Get at the actual SSA name ID with VERSION starting at VER_OFFSET.
   1238  1.1  mrg    TYPE is the type if the SSA name is being declared.  */
   1239  1.1  mrg 
   1240  1.1  mrg static tree
   1241  1.1  mrg c_parser_parse_ssa_name (gimple_parser &parser,
   1242  1.1  mrg 			 tree id, tree type, unsigned version,
   1243  1.1  mrg 			 unsigned ver_offset)
   1244  1.1  mrg {
   1245  1.1  mrg   tree name = NULL_TREE;
   1246  1.1  mrg   const char *token = IDENTIFIER_POINTER (id);
   1247  1.1  mrg 
   1248  1.1  mrg   if (ver_offset == 0)
   1249  1.1  mrg     {
   1250  1.1  mrg       /* Anonymous unnamed SSA name.  */
   1251  1.1  mrg       if (version < num_ssa_names)
   1252  1.1  mrg 	name = ssa_name (version);
   1253  1.1  mrg       if (! name)
   1254  1.1  mrg 	{
   1255  1.1  mrg 	  if (! type)
   1256  1.1  mrg 	    {
   1257  1.1  mrg 	      c_parser_error (parser, "SSA name undeclared");
   1258  1.1  mrg 	      return error_mark_node;
   1259  1.1  mrg 	    }
   1260  1.1  mrg 	  name = make_ssa_name_fn (cfun, type, NULL, version);
   1261  1.1  mrg 	}
   1262  1.1  mrg     }
   1263  1.1  mrg   else
   1264  1.1  mrg     {
   1265  1.1  mrg       if (version < num_ssa_names)
   1266  1.1  mrg 	name = ssa_name (version);
   1267  1.1  mrg       if (! name)
   1268  1.1  mrg 	{
   1269  1.1  mrg 	  /* Separate var name from version.  */
   1270  1.1  mrg 	  char *var_name = XNEWVEC (char, ver_offset + 1);
   1271  1.1  mrg 	  memcpy (var_name, token, ver_offset);
   1272  1.1  mrg 	  var_name[ver_offset] = '\0';
   1273  1.1  mrg 	  /* lookup for parent decl.  */
   1274  1.1  mrg 	  id = get_identifier (var_name);
   1275  1.1  mrg 	  tree parent = lookup_name (id);
   1276  1.1  mrg 	  XDELETEVEC (var_name);
   1277  1.1  mrg 	  if (! parent || parent == error_mark_node)
   1278  1.1  mrg 	    {
   1279  1.1  mrg 	      c_parser_error (parser, "base variable or SSA name undeclared");
   1280  1.1  mrg 	      return error_mark_node;
   1281  1.1  mrg 	    }
   1282  1.1  mrg 	  if (!(VAR_P (parent)
   1283  1.1  mrg 		|| TREE_CODE (parent) == PARM_DECL
   1284  1.1  mrg 		|| TREE_CODE (parent) == RESULT_DECL))
   1285  1.1  mrg 	    {
   1286  1.1  mrg 	      error ("invalid base %qE for SSA name", parent);
   1287  1.1  mrg 	      return error_mark_node;
   1288  1.1  mrg 	    }
   1289  1.1  mrg 	  name = make_ssa_name_fn (cfun, parent,
   1290  1.1  mrg 				   gimple_build_nop (), version);
   1291  1.1  mrg 	}
   1292  1.1  mrg     }
   1293  1.1  mrg 
   1294  1.1  mrg   return name;
   1295  1.1  mrg }
   1296  1.1  mrg 
   1297  1.1  mrg /* Parse a gimple call to an internal function.
   1298  1.1  mrg 
   1299  1.1  mrg    gimple-call-internal:
   1300  1.1  mrg      . identifier ( gimple-argument-expression-list[opt] )  */
   1301  1.1  mrg 
   1302  1.1  mrg static struct c_expr
   1303  1.1  mrg c_parser_gimple_call_internal (gimple_parser &parser)
   1304  1.1  mrg {
   1305  1.1  mrg   struct c_expr expr;
   1306  1.1  mrg   expr.set_error ();
   1307  1.1  mrg 
   1308  1.1  mrg   gcc_assert (c_parser_next_token_is (parser, CPP_DOT));
   1309  1.1  mrg   c_parser_consume_token (parser);
   1310  1.1  mrg   location_t loc = c_parser_peek_token (parser)->location;
   1311  1.1  mrg   if (!c_parser_next_token_is (parser, CPP_NAME)
   1312  1.1  mrg       || c_parser_peek_token (parser)->id_kind != C_ID_ID)
   1313  1.1  mrg     {
   1314  1.1  mrg       c_parser_error (parser, "expecting internal function name");
   1315  1.1  mrg       return expr;
   1316  1.1  mrg     }
   1317  1.1  mrg   tree id = c_parser_peek_token (parser)->value;
   1318  1.1  mrg   internal_fn ifn = lookup_internal_fn (IDENTIFIER_POINTER (id));
   1319  1.1  mrg   c_parser_consume_token (parser);
   1320  1.1  mrg   if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1321  1.1  mrg     {
   1322  1.1  mrg       auto_vec<tree> exprlist;
   1323  1.1  mrg       if (!c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
   1324  1.1  mrg 	c_parser_gimple_expr_list (parser, &exprlist);
   1325  1.1  mrg       c_parser_skip_until_found (parser, CPP_CLOSE_PAREN, "expected %<)%>");
   1326  1.1  mrg       if (ifn == IFN_LAST)
   1327  1.1  mrg 	error_at (loc, "unknown internal function %qE", id);
   1328  1.1  mrg       else
   1329  1.1  mrg 	{
   1330  1.1  mrg 	  expr.value = build_call_expr_internal_loc_array
   1331  1.1  mrg 	    (loc, ifn, void_type_node, exprlist.length (),
   1332  1.1  mrg 	     exprlist.address ());
   1333  1.1  mrg 	  expr.original_code = ERROR_MARK;
   1334  1.1  mrg 	  expr.original_type = NULL;
   1335  1.1  mrg 	}
   1336  1.1  mrg     }
   1337  1.1  mrg   return expr;
   1338  1.1  mrg }
   1339  1.1  mrg 
   1340  1.1  mrg /* Parse '<' type [',' alignment] '>' and return a type on success
   1341  1.1  mrg    and NULL_TREE on error.  */
   1342  1.1  mrg 
   1343  1.1  mrg static tree
   1344  1.1  mrg c_parser_gimple_typespec (gimple_parser &parser)
   1345  1.1  mrg {
   1346  1.1  mrg   struct c_type_name *type_name = NULL;
   1347  1.1  mrg   tree alignment = NULL_TREE;
   1348  1.1  mrg   if (c_parser_require (parser, CPP_LESS, "expected %<<%>"))
   1349  1.1  mrg     {
   1350  1.1  mrg       type_name = c_parser_type_name (parser);
   1351  1.1  mrg       /* Optional alignment.  */
   1352  1.1  mrg       if (c_parser_next_token_is (parser, CPP_COMMA))
   1353  1.1  mrg 	{
   1354  1.1  mrg 	  c_parser_consume_token (parser);
   1355  1.1  mrg 	  alignment
   1356  1.1  mrg 	      = c_parser_gimple_postfix_expression (parser).value;
   1357  1.1  mrg 	}
   1358  1.1  mrg       c_parser_skip_until_found (parser,
   1359  1.1  mrg 				 CPP_GREATER, "expected %<>%>");
   1360  1.1  mrg     }
   1361  1.1  mrg   if (!type_name)
   1362  1.1  mrg     return NULL_TREE;
   1363  1.1  mrg   tree tem;
   1364  1.1  mrg   tree type = groktypename (type_name, &tem, NULL);
   1365  1.1  mrg   if (alignment)
   1366  1.1  mrg     type = build_aligned_type (type, tree_to_uhwi (alignment));
   1367  1.1  mrg   return type;
   1368  1.1  mrg }
   1369  1.1  mrg 
   1370  1.1  mrg /* Parse gimple postfix expression.
   1371  1.1  mrg 
   1372  1.1  mrg    gimple-postfix-expression:
   1373  1.1  mrg      gimple-primary-expression
   1374  1.1  mrg      gimple-primary-expression [ gimple-primary-expression ]
   1375  1.1  mrg      gimple-primary-expression ( gimple-argument-expression-list[opt] )
   1376  1.1  mrg      gimple-postfix-expression . identifier
   1377  1.1  mrg      gimple-postfix-expression -> identifier
   1378  1.1  mrg 
   1379  1.1  mrg    gimple-argument-expression-list:
   1380  1.1  mrg      gimple-unary-expression
   1381  1.1  mrg      gimple-argument-expression-list , gimple-unary-expression
   1382  1.1  mrg 
   1383  1.1  mrg    gimple-primary-expression:
   1384  1.1  mrg      identifier
   1385  1.1  mrg      constant
   1386  1.1  mrg      string-literal
   1387  1.1  mrg      constructor
   1388  1.1  mrg      gimple-call-internal
   1389  1.1  mrg 
   1390  1.1  mrg */
   1391  1.1  mrg 
   1392  1.1  mrg static struct c_expr
   1393  1.1  mrg c_parser_gimple_postfix_expression (gimple_parser &parser)
   1394  1.1  mrg {
   1395  1.1  mrg   location_t loc = c_parser_peek_token (parser)->location;
   1396  1.1  mrg   source_range tok_range = c_parser_peek_token (parser)->get_range ();
   1397  1.1  mrg   struct c_expr expr;
   1398  1.1  mrg   expr.set_error ();
   1399  1.1  mrg   switch (c_parser_peek_token (parser)->type)
   1400  1.1  mrg     {
   1401  1.1  mrg     case CPP_NUMBER:
   1402  1.1  mrg       expr.value = c_parser_peek_token (parser)->value;
   1403  1.1  mrg       set_c_expr_source_range (&expr, tok_range);
   1404  1.1  mrg       loc = c_parser_peek_token (parser)->location;
   1405  1.1  mrg       c_parser_consume_token (parser);
   1406  1.1  mrg       break;
   1407  1.1  mrg     case CPP_CHAR:
   1408  1.1  mrg     case CPP_CHAR16:
   1409  1.1  mrg     case CPP_CHAR32:
   1410  1.1  mrg     case CPP_UTF8CHAR:
   1411  1.1  mrg     case CPP_WCHAR:
   1412  1.1  mrg       expr.value = c_parser_peek_token (parser)->value;
   1413  1.1  mrg       set_c_expr_source_range (&expr, tok_range);
   1414  1.1  mrg       c_parser_consume_token (parser);
   1415  1.1  mrg       break;
   1416  1.1  mrg     case CPP_STRING:
   1417  1.1  mrg     case CPP_STRING16:
   1418  1.1  mrg     case CPP_STRING32:
   1419  1.1  mrg     case CPP_WSTRING:
   1420  1.1  mrg     case CPP_UTF8STRING:
   1421  1.1  mrg       expr = c_parser_string_literal (parser, false, true);
   1422  1.1  mrg       break;
   1423  1.1  mrg     case CPP_DOT:
   1424  1.1  mrg       expr = c_parser_gimple_call_internal (parser);
   1425  1.1  mrg       break;
   1426  1.1  mrg     case CPP_NAME:
   1427  1.1  mrg       if (c_parser_peek_token (parser)->id_kind == C_ID_ID)
   1428  1.1  mrg 	{
   1429  1.1  mrg 	  tree id = c_parser_peek_token (parser)->value;
   1430  1.1  mrg 	  if (strcmp (IDENTIFIER_POINTER (id), "__MEM") == 0)
   1431  1.1  mrg 	    {
   1432  1.1  mrg 	      /* __MEM '<' type-name [ ',' number ] '>'
   1433  1.1  mrg 	               '(' [ '(' type-name ')' ] unary-expression
   1434  1.1  mrg 		           [ '+' number ] ')'  */
   1435  1.1  mrg 	      location_t loc = c_parser_peek_token (parser)->location;
   1436  1.1  mrg 	      c_parser_consume_token (parser);
   1437  1.1  mrg 	      tree type = c_parser_gimple_typespec (parser);
   1438  1.1  mrg 	      struct c_expr ptr;
   1439  1.1  mrg 	      ptr.value = error_mark_node;
   1440  1.1  mrg 	      tree alias_off = NULL_TREE;
   1441  1.1  mrg 	      if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1442  1.1  mrg 		{
   1443  1.1  mrg 		  tree alias_type = NULL_TREE;
   1444  1.1  mrg 		  /* Optional alias-type cast.  */
   1445  1.1  mrg 		  if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
   1446  1.1  mrg 		    {
   1447  1.1  mrg 		      c_parser_consume_token (parser);
   1448  1.1  mrg 		      struct c_type_name *alias_type_name
   1449  1.1  mrg 			= c_parser_type_name (parser);
   1450  1.1  mrg 		      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1451  1.1  mrg 						 "expected %<)%>");
   1452  1.1  mrg 		      if (alias_type_name)
   1453  1.1  mrg 			{
   1454  1.1  mrg 			  tree tem;
   1455  1.1  mrg 			  alias_type = groktypename (alias_type_name,
   1456  1.1  mrg 						     &tem, NULL);
   1457  1.1  mrg 			}
   1458  1.1  mrg 		    }
   1459  1.1  mrg 		  ptr = c_parser_gimple_unary_expression (parser);
   1460  1.1  mrg 		  if (ptr.value == error_mark_node
   1461  1.1  mrg 		      || ! POINTER_TYPE_P (TREE_TYPE (ptr.value)))
   1462  1.1  mrg 		    {
   1463  1.1  mrg 		      if (ptr.value != error_mark_node)
   1464  1.1  mrg 			error_at (ptr.get_start (),
   1465  1.1  mrg 				  "invalid type of %<__MEM%> operand");
   1466  1.1  mrg 		      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1467  1.1  mrg 						 "expected %<)%>");
   1468  1.1  mrg 		      return expr;
   1469  1.1  mrg 		    }
   1470  1.1  mrg 		  if (! alias_type)
   1471  1.1  mrg 		    alias_type = TREE_TYPE (ptr.value);
   1472  1.1  mrg 		  /* Optional constant offset.  */
   1473  1.1  mrg 		  if (c_parser_next_token_is (parser, CPP_PLUS))
   1474  1.1  mrg 		    {
   1475  1.1  mrg 		      c_parser_consume_token (parser);
   1476  1.1  mrg 		      alias_off
   1477  1.1  mrg 			= c_parser_gimple_postfix_expression (parser).value;
   1478  1.1  mrg 		      alias_off = fold_convert (alias_type, alias_off);
   1479  1.1  mrg 		    }
   1480  1.1  mrg 		  if (! alias_off)
   1481  1.1  mrg 		    alias_off = build_int_cst (alias_type, 0);
   1482  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1483  1.1  mrg 					     "expected %<)%>");
   1484  1.1  mrg 		}
   1485  1.1  mrg 	      if (! type || c_parser_error (parser))
   1486  1.1  mrg 		{
   1487  1.1  mrg 		  c_parser_set_error (parser, false);
   1488  1.1  mrg 		  return expr;
   1489  1.1  mrg 		}
   1490  1.1  mrg 	      expr.value = build2_loc (loc, MEM_REF,
   1491  1.1  mrg 				       type, ptr.value, alias_off);
   1492  1.1  mrg 	      break;
   1493  1.1  mrg 	    }
   1494  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "__VIEW_CONVERT") == 0)
   1495  1.1  mrg 	    {
   1496  1.1  mrg 	      /* __VIEW_CONVERT '<' type-name [ ',' number ] '>'
   1497  1.1  mrg 	                        '(' postfix-expression ')'  */
   1498  1.1  mrg 	      location_t loc = c_parser_peek_token (parser)->location;
   1499  1.1  mrg 	      c_parser_consume_token (parser);
   1500  1.1  mrg 	      tree type = c_parser_gimple_typespec (parser);
   1501  1.1  mrg 	      if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1502  1.1  mrg 		{
   1503  1.1  mrg 		  c_expr op = c_parser_gimple_postfix_expression (parser);
   1504  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1505  1.1  mrg 					     "expected %<)%>");
   1506  1.1  mrg 		  if (type && op.value != error_mark_node)
   1507  1.1  mrg 		    expr.value = build1_loc (loc, VIEW_CONVERT_EXPR,
   1508  1.1  mrg 					     type, op.value);
   1509  1.1  mrg 		}
   1510  1.1  mrg 	      break;
   1511  1.1  mrg 	    }
   1512  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "__BIT_FIELD_REF") == 0)
   1513  1.1  mrg 	    {
   1514  1.1  mrg 	      /* __BIT_FIELD_REF '<' type-name [ ',' number ] '>'
   1515  1.1  mrg 	                        '(' postfix-expression, integer, integer ')'  */
   1516  1.1  mrg 	      location_t loc = c_parser_peek_token (parser)->location;
   1517  1.1  mrg 	      c_parser_consume_token (parser);
   1518  1.1  mrg 	      tree type = c_parser_gimple_typespec (parser);
   1519  1.1  mrg 	      if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1520  1.1  mrg 		{
   1521  1.1  mrg 		  c_expr op0 = c_parser_gimple_postfix_expression (parser);
   1522  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_COMMA,
   1523  1.1  mrg 					     "expected %<,%>");
   1524  1.1  mrg 		  c_expr op1 = c_parser_gimple_postfix_expression (parser);
   1525  1.1  mrg 		  if (TREE_CODE (op1.value) != INTEGER_CST
   1526  1.1  mrg 		      || !int_fits_type_p (op1.value, bitsizetype))
   1527  1.1  mrg 		    c_parser_error (parser, "expected constant size");
   1528  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_COMMA,
   1529  1.1  mrg 					     "expected %<,%>");
   1530  1.1  mrg 		  c_expr op2 = c_parser_gimple_postfix_expression (parser);
   1531  1.1  mrg 		  if (TREE_CODE (op2.value) != INTEGER_CST
   1532  1.1  mrg 		      || !int_fits_type_p (op2.value, bitsizetype))
   1533  1.1  mrg 		    c_parser_error (parser, "expected constant offset");
   1534  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1535  1.1  mrg 					     "expected %<)%>");
   1536  1.1  mrg 		  if (type
   1537  1.1  mrg 		      && op0.value != error_mark_node
   1538  1.1  mrg 		      && TREE_CODE (op1.value) == INTEGER_CST
   1539  1.1  mrg 		      && TREE_CODE (op2.value) == INTEGER_CST)
   1540  1.1  mrg 		    expr.value = build3_loc (loc, BIT_FIELD_REF, type,
   1541  1.1  mrg 					     op0.value,
   1542  1.1  mrg 					     fold_convert (bitsizetype,
   1543  1.1  mrg 							   op1.value),
   1544  1.1  mrg 					     fold_convert (bitsizetype,
   1545  1.1  mrg 							   op2.value));
   1546  1.1  mrg 		}
   1547  1.1  mrg 	      break;
   1548  1.1  mrg 	    }
   1549  1.1  mrg 	  else if (strcmp (IDENTIFIER_POINTER (id), "_Literal") == 0)
   1550  1.1  mrg 	    {
   1551  1.1  mrg 	      /* _Literal '(' type-name ')' ( [ '-' ] constant | constructor ) */
   1552  1.1  mrg 	      c_parser_consume_token (parser);
   1553  1.1  mrg 	      tree type = NULL_TREE;
   1554  1.1  mrg 	      if (c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1555  1.1  mrg 		{
   1556  1.1  mrg 		  struct c_type_name *type_name = c_parser_type_name (parser);
   1557  1.1  mrg 		  tree tem;
   1558  1.1  mrg 		  if (type_name)
   1559  1.1  mrg 		    type = groktypename (type_name, &tem, NULL);
   1560  1.1  mrg 		  c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1561  1.1  mrg 					     "expected %<)%>");
   1562  1.1  mrg 		}
   1563  1.1  mrg 	      if (! type)
   1564  1.1  mrg 		{
   1565  1.1  mrg 		  c_parser_error (parser, "invalid _Literal");
   1566  1.1  mrg 		  return expr;
   1567  1.1  mrg 		}
   1568  1.1  mrg 	      if (c_parser_next_token_is (parser, CPP_OPEN_BRACE))
   1569  1.1  mrg 		{
   1570  1.1  mrg 		  c_parser_consume_token (parser);
   1571  1.1  mrg 		  if (!AGGREGATE_TYPE_P (type)
   1572  1.1  mrg 		      && !VECTOR_TYPE_P (type))
   1573  1.1  mrg 		    {
   1574  1.1  mrg 		      c_parser_error (parser, "invalid type for _Literal with "
   1575  1.1  mrg 				      "constructor");
   1576  1.1  mrg 		      c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
   1577  1.1  mrg 						 "expected %<}%>");
   1578  1.1  mrg 		      return expr;
   1579  1.1  mrg 		    }
   1580  1.1  mrg 		  vec<constructor_elt, va_gc> *v = NULL;
   1581  1.1  mrg 		  bool constant_p = true;
   1582  1.1  mrg 		  if (VECTOR_TYPE_P (type)
   1583  1.1  mrg 		      && !c_parser_next_token_is (parser, CPP_CLOSE_BRACE))
   1584  1.1  mrg 		    {
   1585  1.1  mrg 		      vec_alloc (v, TYPE_VECTOR_SUBPARTS (type).to_constant ());
   1586  1.1  mrg 		      do
   1587  1.1  mrg 			{
   1588  1.1  mrg 			  tree val
   1589  1.1  mrg 			    = c_parser_gimple_postfix_expression (parser).value;
   1590  1.1  mrg 			  if (! val
   1591  1.1  mrg 			      || val == error_mark_node
   1592  1.1  mrg 			      || (! CONSTANT_CLASS_P (val)
   1593  1.1  mrg 				  && ! SSA_VAR_P (val)))
   1594  1.1  mrg 			    {
   1595  1.1  mrg 			      c_parser_error (parser, "invalid _Literal");
   1596  1.1  mrg 			      return expr;
   1597  1.1  mrg 			    }
   1598  1.1  mrg 			  CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, val);
   1599  1.1  mrg 			  if (! CONSTANT_CLASS_P (val))
   1600  1.1  mrg 			    constant_p = false;
   1601  1.1  mrg 			  if (c_parser_next_token_is (parser, CPP_COMMA))
   1602  1.1  mrg 			    c_parser_consume_token (parser);
   1603  1.1  mrg 			  else
   1604  1.1  mrg 			    break;
   1605  1.1  mrg 			}
   1606  1.1  mrg 		      while (1);
   1607  1.1  mrg 		    }
   1608  1.1  mrg 		  if (c_parser_require (parser, CPP_CLOSE_BRACE,
   1609  1.1  mrg 					"expected %<}%>"))
   1610  1.1  mrg 		    {
   1611  1.1  mrg 		      if (v && constant_p)
   1612  1.1  mrg 			expr.value = build_vector_from_ctor (type, v);
   1613  1.1  mrg 		      else
   1614  1.1  mrg 			expr.value = build_constructor (type, v);
   1615  1.1  mrg 		    }
   1616  1.1  mrg 		  else
   1617  1.1  mrg 		    {
   1618  1.1  mrg 		      c_parser_skip_until_found (parser, CPP_CLOSE_BRACE,
   1619  1.1  mrg 						 "expected %<}%>");
   1620  1.1  mrg 		      return expr;
   1621  1.1  mrg 		    }
   1622  1.1  mrg 		}
   1623  1.1  mrg 	      else
   1624  1.1  mrg 		{
   1625  1.1  mrg 		  bool neg_p, addr_p;
   1626  1.1  mrg 		  if ((neg_p = c_parser_next_token_is (parser, CPP_MINUS)))
   1627  1.1  mrg 		    c_parser_consume_token (parser);
   1628  1.1  mrg 		  if ((addr_p = c_parser_next_token_is (parser, CPP_AND)))
   1629  1.1  mrg 		    c_parser_consume_token (parser);
   1630  1.1  mrg 		  tree val = c_parser_gimple_postfix_expression (parser).value;
   1631  1.1  mrg 		  if (! val
   1632  1.1  mrg 		      || val == error_mark_node
   1633  1.1  mrg 		      || (!CONSTANT_CLASS_P (val) && !addr_p))
   1634  1.1  mrg 		    {
   1635  1.1  mrg 		      c_parser_error (parser, "invalid _Literal");
   1636  1.1  mrg 		      return expr;
   1637  1.1  mrg 		    }
   1638  1.1  mrg 		  if (addr_p)
   1639  1.1  mrg 		    {
   1640  1.1  mrg 		      val = build1 (ADDR_EXPR, type, val);
   1641  1.1  mrg 		      if (!is_gimple_invariant_address (val))
   1642  1.1  mrg 			{
   1643  1.1  mrg 			  c_parser_error (parser, "invalid _Literal");
   1644  1.1  mrg 			  return expr;
   1645  1.1  mrg 			}
   1646  1.1  mrg 		    }
   1647  1.1  mrg 		  if (neg_p)
   1648  1.1  mrg 		    {
   1649  1.1  mrg 		      val = const_unop (NEGATE_EXPR, TREE_TYPE (val), val);
   1650  1.1  mrg 		      if (! val)
   1651  1.1  mrg 			{
   1652  1.1  mrg 			  c_parser_error (parser, "invalid _Literal");
   1653  1.1  mrg 			  return expr;
   1654  1.1  mrg 			}
   1655  1.1  mrg 		    }
   1656  1.1  mrg 		  expr.value = fold_convert (type, val);
   1657  1.1  mrg 		}
   1658  1.1  mrg 	      return expr;
   1659  1.1  mrg 	    }
   1660  1.1  mrg 
   1661  1.1  mrg 	  /* SSA name.  */
   1662  1.1  mrg 	  unsigned version, ver_offset;
   1663  1.1  mrg 	  if (! lookup_name (id)
   1664  1.1  mrg 	      && c_parser_parse_ssa_name_id (id, &version, &ver_offset))
   1665  1.1  mrg 	    {
   1666  1.1  mrg 	      c_parser_consume_token (parser);
   1667  1.1  mrg 	      expr.value = c_parser_parse_ssa_name (parser, id, NULL_TREE,
   1668  1.1  mrg 						    version, ver_offset);
   1669  1.1  mrg 	      if (expr.value == error_mark_node)
   1670  1.1  mrg 		return expr;
   1671  1.1  mrg 	      set_c_expr_source_range (&expr, tok_range);
   1672  1.1  mrg 	      /* For default definition SSA names.  */
   1673  1.1  mrg 	      if (c_parser_next_token_is (parser, CPP_OPEN_PAREN)
   1674  1.1  mrg 		  && c_parser_peek_2nd_token (parser)->type == CPP_NAME
   1675  1.1  mrg 		  && strcmp ("D",
   1676  1.1  mrg 			     IDENTIFIER_POINTER
   1677  1.1  mrg 			       (c_parser_peek_2nd_token (parser)->value)) == 0
   1678  1.1  mrg 		  && c_parser_peek_nth_token (parser, 3)->type == CPP_CLOSE_PAREN)
   1679  1.1  mrg 		{
   1680  1.1  mrg 		  c_parser_consume_token (parser);
   1681  1.1  mrg 		  c_parser_consume_token (parser);
   1682  1.1  mrg 		  c_parser_consume_token (parser);
   1683  1.1  mrg 		  if (! SSA_NAME_IS_DEFAULT_DEF (expr.value))
   1684  1.1  mrg 		    {
   1685  1.1  mrg 		      if (!SSA_NAME_VAR (expr.value))
   1686  1.1  mrg 			{
   1687  1.1  mrg 			  error_at (loc, "anonymous SSA name cannot have"
   1688  1.1  mrg 				    " default definition");
   1689  1.1  mrg 			  expr.value = error_mark_node;
   1690  1.1  mrg 			  return expr;
   1691  1.1  mrg 			}
   1692  1.1  mrg 		      set_ssa_default_def (cfun, SSA_NAME_VAR (expr.value),
   1693  1.1  mrg 					   expr.value);
   1694  1.1  mrg 		      SSA_NAME_DEF_STMT (expr.value) = gimple_build_nop ();
   1695  1.1  mrg 		    }
   1696  1.1  mrg 		}
   1697  1.1  mrg 	    }
   1698  1.1  mrg 	  else
   1699  1.1  mrg 	    {
   1700  1.1  mrg 	      c_parser_consume_token (parser);
   1701  1.1  mrg 	      expr.value
   1702  1.1  mrg 		= build_external_ref (loc, id,
   1703  1.1  mrg 				      (c_parser_peek_token (parser)->type
   1704  1.1  mrg 				       == CPP_OPEN_PAREN), &expr.original_type);
   1705  1.1  mrg 	      set_c_expr_source_range (&expr, tok_range);
   1706  1.1  mrg 	    }
   1707  1.1  mrg 	  break;
   1708  1.1  mrg 	}
   1709  1.1  mrg       /* Fallthru.  */
   1710  1.1  mrg     default:
   1711  1.1  mrg       c_parser_error (parser, "expected expression");
   1712  1.1  mrg       expr.set_error ();
   1713  1.1  mrg       break;
   1714  1.1  mrg     }
   1715  1.1  mrg   if (expr.value == error_mark_node)
   1716  1.1  mrg     return expr;
   1717  1.1  mrg   return c_parser_gimple_postfix_expression_after_primary
   1718  1.1  mrg     (parser, EXPR_LOC_OR_LOC (expr.value, loc), expr);
   1719  1.1  mrg }
   1720  1.1  mrg 
   1721  1.1  mrg /* Parse a gimple postfix expression after the initial primary or compound
   1722  1.1  mrg    literal.  */
   1723  1.1  mrg 
   1724  1.1  mrg static struct c_expr
   1725  1.1  mrg c_parser_gimple_postfix_expression_after_primary (gimple_parser &parser,
   1726  1.1  mrg 						  location_t expr_loc,
   1727  1.1  mrg 						  struct c_expr expr)
   1728  1.1  mrg {
   1729  1.1  mrg   location_t start;
   1730  1.1  mrg   location_t finish;
   1731  1.1  mrg   tree ident;
   1732  1.1  mrg   location_t comp_loc;
   1733  1.1  mrg 
   1734  1.1  mrg   while (true)
   1735  1.1  mrg     {
   1736  1.1  mrg       location_t op_loc = c_parser_peek_token (parser)->location;
   1737  1.1  mrg       switch (c_parser_peek_token (parser)->type)
   1738  1.1  mrg 	{
   1739  1.1  mrg 	case CPP_OPEN_SQUARE:
   1740  1.1  mrg 	  {
   1741  1.1  mrg 	    c_parser_consume_token (parser);
   1742  1.1  mrg 	    tree idx = c_parser_gimple_unary_expression (parser).value;
   1743  1.1  mrg 
   1744  1.1  mrg 	    if (! c_parser_require (parser, CPP_CLOSE_SQUARE, "expected %<]%>"))
   1745  1.1  mrg 	      {
   1746  1.1  mrg 		c_parser_skip_until_found (parser, CPP_CLOSE_SQUARE, NULL);
   1747  1.1  mrg 		break;
   1748  1.1  mrg 	      }
   1749  1.1  mrg 
   1750  1.1  mrg 	    start = expr.get_start ();
   1751  1.1  mrg 	    finish = c_parser_tokens_buf (parser, 0)->location;
   1752  1.1  mrg 	    expr.value = build_array_ref (op_loc, expr.value, idx);
   1753  1.1  mrg 	    set_c_expr_source_range (&expr, start, finish);
   1754  1.1  mrg 
   1755  1.1  mrg 	    expr.original_code = ERROR_MARK;
   1756  1.1  mrg 	    expr.original_type = NULL;
   1757  1.1  mrg 	    break;
   1758  1.1  mrg 	  }
   1759  1.1  mrg 	case CPP_OPEN_PAREN:
   1760  1.1  mrg 	  {
   1761  1.1  mrg 	    /* Function call.  */
   1762  1.1  mrg 	    c_parser_consume_token (parser);
   1763  1.1  mrg 	    auto_vec<tree> exprlist;
   1764  1.1  mrg 	    if (! c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
   1765  1.1  mrg 	      c_parser_gimple_expr_list (parser, &exprlist);
   1766  1.1  mrg 	    c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
   1767  1.1  mrg 				       "expected %<)%>");
   1768  1.1  mrg 	    if (!FUNC_OR_METHOD_TYPE_P (TREE_TYPE (expr.value)))
   1769  1.1  mrg 	      {
   1770  1.1  mrg 		c_parser_error (parser, "invalid call to non-function");
   1771  1.1  mrg 		expr.set_error ();
   1772  1.1  mrg 		break;
   1773  1.1  mrg 	      }
   1774  1.1  mrg 	    expr.value = build_call_array_loc
   1775  1.1  mrg 		(expr_loc, TREE_TYPE (TREE_TYPE (expr.value)),
   1776  1.1  mrg 		 expr.value, exprlist.length (), exprlist.address ());
   1777  1.1  mrg 	    expr.original_code = ERROR_MARK;
   1778  1.1  mrg 	    expr.original_type = NULL;
   1779  1.1  mrg 	    break;
   1780  1.1  mrg 	  }
   1781  1.1  mrg 	case CPP_DOT:
   1782  1.1  mrg 	  {
   1783  1.1  mrg 	    /* Structure element reference.  */
   1784  1.1  mrg 	    c_parser_consume_token (parser);
   1785  1.1  mrg 	    if (c_parser_next_token_is (parser, CPP_NAME))
   1786  1.1  mrg 	      {
   1787  1.1  mrg 		c_token *comp_tok = c_parser_peek_token (parser);
   1788  1.1  mrg 		ident = comp_tok->value;
   1789  1.1  mrg 		comp_loc = comp_tok->location;
   1790  1.1  mrg 	      }
   1791  1.1  mrg 	    else
   1792  1.1  mrg 	      {
   1793  1.1  mrg 		c_parser_error (parser, "expected identifier");
   1794  1.1  mrg 		expr.set_error ();
   1795  1.1  mrg 		expr.original_code = ERROR_MARK;
   1796  1.1  mrg 		expr.original_type = NULL;
   1797  1.1  mrg 		return expr;
   1798  1.1  mrg 	      }
   1799  1.1  mrg 	    start = expr.get_start ();
   1800  1.1  mrg 	    finish = c_parser_peek_token (parser)->get_finish ();
   1801  1.1  mrg 	    c_parser_consume_token (parser);
   1802  1.1  mrg 	    expr.value = build_component_ref (op_loc, expr.value, ident,
   1803  1.1  mrg 					      comp_loc);
   1804  1.1  mrg 	    set_c_expr_source_range (&expr, start, finish);
   1805  1.1  mrg 	    expr.original_code = ERROR_MARK;
   1806  1.1  mrg 	    if (TREE_CODE (expr.value) != COMPONENT_REF)
   1807  1.1  mrg 	      expr.original_type = NULL;
   1808  1.1  mrg 	    else
   1809  1.1  mrg 	      {
   1810  1.1  mrg 		/* Remember the original type of a bitfield.  */
   1811  1.1  mrg 		tree field = TREE_OPERAND (expr.value, 1);
   1812  1.1  mrg 		if (TREE_CODE (field) != FIELD_DECL)
   1813  1.1  mrg 		  expr.original_type = NULL;
   1814  1.1  mrg 		else
   1815  1.1  mrg 		  expr.original_type = DECL_BIT_FIELD_TYPE (field);
   1816  1.1  mrg 	      }
   1817  1.1  mrg 	    break;
   1818  1.1  mrg 	  }
   1819  1.1  mrg 	case CPP_DEREF:
   1820  1.1  mrg 	  {
   1821  1.1  mrg 	    /* Structure element reference.  */
   1822  1.1  mrg 	    if (!POINTER_TYPE_P (TREE_TYPE (expr.value)))
   1823  1.1  mrg 	      {
   1824  1.1  mrg 		c_parser_error (parser, "dereference of non-pointer");
   1825  1.1  mrg 		expr.set_error ();
   1826  1.1  mrg 		expr.original_code = ERROR_MARK;
   1827  1.1  mrg 		expr.original_type = NULL;
   1828  1.1  mrg 		return expr;
   1829  1.1  mrg 	      }
   1830  1.1  mrg 	    c_parser_consume_token (parser);
   1831  1.1  mrg 	    if (c_parser_next_token_is (parser, CPP_NAME))
   1832  1.1  mrg 	      {
   1833  1.1  mrg 		c_token *comp_tok = c_parser_peek_token (parser);
   1834  1.1  mrg 		ident = comp_tok->value;
   1835  1.1  mrg 		comp_loc = comp_tok->location;
   1836  1.1  mrg 	      }
   1837  1.1  mrg 	    else
   1838  1.1  mrg 	      {
   1839  1.1  mrg 		c_parser_error (parser, "expected identifier");
   1840  1.1  mrg 		expr.set_error ();
   1841  1.1  mrg 		expr.original_code = ERROR_MARK;
   1842  1.1  mrg 		expr.original_type = NULL;
   1843  1.1  mrg 		return expr;
   1844  1.1  mrg 	      }
   1845  1.1  mrg 	    start = expr.get_start ();
   1846  1.1  mrg 	    finish = c_parser_peek_token (parser)->get_finish ();
   1847  1.1  mrg 	    c_parser_consume_token (parser);
   1848  1.1  mrg 	    expr.value = build_component_ref (op_loc,
   1849  1.1  mrg 					      build_simple_mem_ref_loc
   1850  1.1  mrg 					        (op_loc, expr.value),
   1851  1.1  mrg 					      ident, comp_loc);
   1852  1.1  mrg 	    set_c_expr_source_range (&expr, start, finish);
   1853  1.1  mrg 	    expr.original_code = ERROR_MARK;
   1854  1.1  mrg 	    if (TREE_CODE (expr.value) != COMPONENT_REF)
   1855  1.1  mrg 	      expr.original_type = NULL;
   1856  1.1  mrg 	    else
   1857  1.1  mrg 	      {
   1858  1.1  mrg 		/* Remember the original type of a bitfield.  */
   1859  1.1  mrg 		tree field = TREE_OPERAND (expr.value, 1);
   1860  1.1  mrg 		if (TREE_CODE (field) != FIELD_DECL)
   1861  1.1  mrg 		  expr.original_type = NULL;
   1862  1.1  mrg 		else
   1863  1.1  mrg 		  expr.original_type = DECL_BIT_FIELD_TYPE (field);
   1864  1.1  mrg 	      }
   1865  1.1  mrg 	    break;
   1866  1.1  mrg 	  }
   1867  1.1  mrg 	default:
   1868  1.1  mrg 	  return expr;
   1869  1.1  mrg 	}
   1870  1.1  mrg     }
   1871  1.1  mrg }
   1872  1.1  mrg 
   1873  1.1  mrg /* Parse expression list.
   1874  1.1  mrg 
   1875  1.1  mrg    gimple-expr-list:
   1876  1.1  mrg      gimple-unary-expression
   1877  1.1  mrg      gimple-expr-list , gimple-unary-expression
   1878  1.1  mrg 
   1879  1.1  mrg  */
   1880  1.1  mrg 
   1881  1.1  mrg static void
   1882  1.1  mrg c_parser_gimple_expr_list (gimple_parser &parser, vec<tree> *ret)
   1883  1.1  mrg {
   1884  1.1  mrg   struct c_expr expr;
   1885  1.1  mrg 
   1886  1.1  mrg   expr = c_parser_gimple_unary_expression (parser);
   1887  1.1  mrg   ret->safe_push (expr.value);
   1888  1.1  mrg   while (c_parser_next_token_is (parser, CPP_COMMA))
   1889  1.1  mrg     {
   1890  1.1  mrg       c_parser_consume_token (parser);
   1891  1.1  mrg       expr = c_parser_gimple_unary_expression (parser);
   1892  1.1  mrg       ret->safe_push (expr.value);
   1893  1.1  mrg     }
   1894  1.1  mrg }
   1895  1.1  mrg 
   1896  1.1  mrg /* Parse gimple label.
   1897  1.1  mrg 
   1898  1.1  mrg    gimple-label:
   1899  1.1  mrg      identifier :
   1900  1.1  mrg      case constant-expression :
   1901  1.1  mrg      default :
   1902  1.1  mrg 
   1903  1.1  mrg */
   1904  1.1  mrg 
   1905  1.1  mrg static void
   1906  1.1  mrg c_parser_gimple_label (gimple_parser &parser, gimple_seq *seq)
   1907  1.1  mrg {
   1908  1.1  mrg   tree name = c_parser_peek_token (parser)->value;
   1909  1.1  mrg   location_t loc1 = c_parser_peek_token (parser)->location;
   1910  1.1  mrg   gcc_assert (c_parser_next_token_is (parser, CPP_NAME));
   1911  1.1  mrg   c_parser_consume_token (parser);
   1912  1.1  mrg   gcc_assert (c_parser_next_token_is (parser, CPP_COLON));
   1913  1.1  mrg   c_parser_consume_token (parser);
   1914  1.1  mrg   tree label = define_label (loc1, name);
   1915  1.1  mrg   if (label)
   1916  1.1  mrg     gimple_seq_add_stmt_without_update (seq, gimple_build_label (label));
   1917  1.1  mrg   return;
   1918  1.1  mrg }
   1919  1.1  mrg 
   1920  1.1  mrg /* Parse gimple/RTL pass list.
   1921  1.1  mrg 
   1922  1.1  mrg    gimple-or-rtl-pass-list:
   1923  1.1  mrg      startwith("pass-name")[,{cfg,ssa}]
   1924  1.1  mrg  */
   1925  1.1  mrg 
   1926  1.1  mrg void
   1927  1.1  mrg c_parser_gimple_or_rtl_pass_list (c_parser *parser, c_declspecs *specs)
   1928  1.1  mrg {
   1929  1.1  mrg   char *pass = NULL;
   1930  1.1  mrg 
   1931  1.1  mrg   /* Accept __GIMPLE/__RTL.  */
   1932  1.1  mrg   if (c_parser_next_token_is_not (parser, CPP_OPEN_PAREN))
   1933  1.1  mrg     return;
   1934  1.1  mrg   c_parser_consume_token (parser);
   1935  1.1  mrg 
   1936  1.1  mrg   specs->entry_bb_count = profile_count::uninitialized ();
   1937  1.1  mrg   while (c_parser_next_token_is (parser, CPP_NAME))
   1938  1.1  mrg     {
   1939  1.1  mrg       profile_quality quality;
   1940  1.1  mrg       const char *op = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
   1941  1.1  mrg       c_parser_consume_token (parser);
   1942  1.1  mrg       if (! strcmp (op, "startwith"))
   1943  1.1  mrg 	{
   1944  1.1  mrg 	  if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1945  1.1  mrg 	    return;
   1946  1.1  mrg 	  if (c_parser_next_token_is_not (parser, CPP_STRING))
   1947  1.1  mrg 	    {
   1948  1.1  mrg 	      error_at (c_parser_peek_token (parser)->location,
   1949  1.1  mrg 			"expected pass name");
   1950  1.1  mrg 	      return;
   1951  1.1  mrg 	    }
   1952  1.1  mrg 	  pass = xstrdup (TREE_STRING_POINTER
   1953  1.1  mrg 			  (c_parser_string_literal (parser, false,
   1954  1.1  mrg 						    false).value));
   1955  1.1  mrg 	  if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<(%>"))
   1956  1.1  mrg 	    return;
   1957  1.1  mrg 	}
   1958  1.1  mrg       else if (parse_profile_quality (op, &quality))
   1959  1.1  mrg 	{
   1960  1.1  mrg 	  tree q;
   1961  1.1  mrg 	  if (!c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   1962  1.1  mrg 	    return;
   1963  1.1  mrg 
   1964  1.1  mrg 	  if (!c_parser_next_token_is (parser, CPP_NUMBER)
   1965  1.1  mrg 	      || (TREE_CODE (q = c_parser_peek_token (parser)->value)
   1966  1.1  mrg 		  != INTEGER_CST))
   1967  1.1  mrg 	    {
   1968  1.1  mrg 	      c_parser_error (parser, "expected count value");
   1969  1.1  mrg 	      return;
   1970  1.1  mrg 	    }
   1971  1.1  mrg 
   1972  1.1  mrg 	  specs->entry_bb_count
   1973  1.1  mrg 	    = profile_count::from_gcov_type (TREE_INT_CST_LOW (q), quality);
   1974  1.1  mrg 	  c_parser_consume_token (parser);
   1975  1.1  mrg 	  if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
   1976  1.1  mrg 	    return;
   1977  1.1  mrg 	}
   1978  1.1  mrg       else if (specs->declspec_il != cdil_gimple)
   1979  1.1  mrg 	/* Allow only one IL specifier and none on RTL.  */
   1980  1.1  mrg 	;
   1981  1.1  mrg       else if (! strcmp (op, "cfg"))
   1982  1.1  mrg 	specs->declspec_il = cdil_gimple_cfg;
   1983  1.1  mrg       else if (! strcmp (op, "ssa"))
   1984  1.1  mrg 	specs->declspec_il = cdil_gimple_ssa;
   1985  1.1  mrg       else
   1986  1.1  mrg 	{
   1987  1.1  mrg 	  error_at (c_parser_peek_token (parser)->location,
   1988  1.1  mrg 		    "invalid operation");
   1989  1.1  mrg 	  return;
   1990  1.1  mrg 	}
   1991  1.1  mrg      if (c_parser_next_token_is (parser, CPP_COMMA))
   1992  1.1  mrg        c_parser_consume_token (parser);
   1993  1.1  mrg     }
   1994  1.1  mrg 
   1995  1.1  mrg   if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
   1996  1.1  mrg     return;
   1997  1.1  mrg 
   1998  1.1  mrg   specs->gimple_or_rtl_pass = pass;
   1999  1.1  mrg }
   2000  1.1  mrg 
   2001  1.1  mrg /* Parse gimple local declaration.
   2002  1.1  mrg 
   2003  1.1  mrg    declaration-specifiers:
   2004  1.1  mrg      storage-class-specifier declaration-specifiers[opt]
   2005  1.1  mrg      type-specifier declaration-specifiers[opt]
   2006  1.1  mrg      type-qualifier declaration-specifiers[opt]
   2007  1.1  mrg      function-specifier declaration-specifiers[opt]
   2008  1.1  mrg      alignment-specifier declaration-specifiers[opt]
   2009  1.1  mrg 
   2010  1.1  mrg    storage-class-specifier:
   2011  1.1  mrg      typedef
   2012  1.1  mrg      extern
   2013  1.1  mrg      static
   2014  1.1  mrg      auto
   2015  1.1  mrg      register
   2016  1.1  mrg 
   2017  1.1  mrg    type-specifier:
   2018  1.1  mrg      void
   2019  1.1  mrg      char
   2020  1.1  mrg      short
   2021  1.1  mrg      int
   2022  1.1  mrg      long
   2023  1.1  mrg      float
   2024  1.1  mrg      double
   2025  1.1  mrg      signed
   2026  1.1  mrg      unsigned
   2027  1.1  mrg      _Bool
   2028  1.1  mrg      _Complex
   2029  1.1  mrg 
   2030  1.1  mrg    type-qualifier:
   2031  1.1  mrg      const
   2032  1.1  mrg      restrict
   2033  1.1  mrg      volatile
   2034  1.1  mrg      address-space-qualifier
   2035  1.1  mrg      _Atomic
   2036  1.1  mrg 
   2037  1.1  mrg  */
   2038  1.1  mrg 
   2039  1.1  mrg static void
   2040  1.1  mrg c_parser_gimple_declaration (gimple_parser &parser)
   2041  1.1  mrg {
   2042  1.1  mrg   struct c_declarator *declarator;
   2043  1.1  mrg   struct c_declspecs *specs = build_null_declspecs ();
   2044  1.1  mrg   c_parser_declspecs (parser, specs, true, true, true,
   2045  1.1  mrg 		      true, true, true, true, cla_nonabstract_decl);
   2046  1.1  mrg   finish_declspecs (specs);
   2047  1.1  mrg 
   2048  1.1  mrg   /* Provide better error recovery.  Note that a type name here is usually
   2049  1.1  mrg      better diagnosed as a redeclaration.  */
   2050  1.1  mrg   if (c_parser_next_token_starts_declspecs (parser)
   2051  1.1  mrg       && ! c_parser_next_token_is (parser, CPP_NAME))
   2052  1.1  mrg     {
   2053  1.1  mrg       c_parser_error (parser, "expected %<;%>");
   2054  1.1  mrg       c_parser_set_error (parser, false);
   2055  1.1  mrg       return;
   2056  1.1  mrg     }
   2057  1.1  mrg 
   2058  1.1  mrg   bool dummy = false;
   2059  1.1  mrg   declarator = c_parser_declarator (parser,
   2060  1.1  mrg 				    specs->typespec_kind != ctsk_none,
   2061  1.1  mrg 				    C_DTR_NORMAL, &dummy);
   2062  1.1  mrg 
   2063  1.1  mrg   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
   2064  1.1  mrg     {
   2065  1.1  mrg       /* Handle SSA name decls specially, they do not go into the identifier
   2066  1.1  mrg          table but we simply build the SSA name for later lookup.  */
   2067  1.1  mrg       unsigned version, ver_offset;
   2068  1.1  mrg       /* Handle SSA pointer declarations in a very simplistic ways, we
   2069  1.1  mrg 	 probably would like to call grokdeclarator in a special mode to
   2070  1.1  mrg 	 just build the type of the decl - start_decl already pushes
   2071  1.1  mrg 	 the identifier to the bindings for lookup, something we do not
   2072  1.1  mrg 	 want.  */
   2073  1.1  mrg       struct c_declarator *id_declarator = declarator;
   2074  1.1  mrg       while (id_declarator->kind == cdk_pointer)
   2075  1.1  mrg 	id_declarator = id_declarator->declarator;
   2076  1.1  mrg       if (id_declarator->kind == cdk_id
   2077  1.1  mrg 	  && (declarator->kind == cdk_pointer
   2078  1.1  mrg 	      || is_gimple_reg_type (specs->type))
   2079  1.1  mrg 	  && c_parser_parse_ssa_name_id (id_declarator->u.id.id,
   2080  1.1  mrg 					 &version, &ver_offset)
   2081  1.1  mrg 	  /* The following restricts it to unnamed anonymous SSA names
   2082  1.1  mrg 	     which fails parsing of named ones in dumps (we could
   2083  1.1  mrg 	     decide to not dump their name for -gimple).  */
   2084  1.1  mrg 	  && ver_offset == 0)
   2085  1.1  mrg 	{
   2086  1.1  mrg 	  struct c_declarator *p = declarator;
   2087  1.1  mrg 	  tree type = specs->type;
   2088  1.1  mrg 	  while (p->kind == cdk_pointer)
   2089  1.1  mrg 	    {
   2090  1.1  mrg 	      type = build_pointer_type (type);
   2091  1.1  mrg 	      p = p->declarator;
   2092  1.1  mrg 	    }
   2093  1.1  mrg 	  c_parser_parse_ssa_name (parser, id_declarator->u.id.id, type,
   2094  1.1  mrg 				   version, ver_offset);
   2095  1.1  mrg 	}
   2096  1.1  mrg       else
   2097  1.1  mrg 	{
   2098  1.1  mrg 	  tree postfix_attrs = NULL_TREE;
   2099  1.1  mrg 	  tree all_prefix_attrs = specs->attrs;
   2100  1.1  mrg 	  specs->attrs = NULL;
   2101  1.1  mrg 	  tree decl = start_decl (declarator, specs, false,
   2102  1.1  mrg 				  chainon (postfix_attrs, all_prefix_attrs));
   2103  1.1  mrg 	  if (decl)
   2104  1.1  mrg 	    finish_decl (decl, UNKNOWN_LOCATION, NULL_TREE, NULL_TREE,
   2105  1.1  mrg 			 NULL_TREE);
   2106  1.1  mrg 	}
   2107  1.1  mrg     }
   2108  1.1  mrg   else
   2109  1.1  mrg     {
   2110  1.1  mrg       c_parser_error (parser, "expected %<;%>");
   2111  1.1  mrg       return;
   2112  1.1  mrg     }
   2113  1.1  mrg }
   2114  1.1  mrg 
   2115  1.1  mrg /* Parse gimple goto statement.  */
   2116  1.1  mrg 
   2117  1.1  mrg static void
   2118  1.1  mrg c_parser_gimple_goto_stmt (gimple_parser &parser,
   2119  1.1  mrg 			   location_t loc, tree label, gimple_seq *seq)
   2120  1.1  mrg {
   2121  1.1  mrg   if (cfun->curr_properties & PROP_cfg)
   2122  1.1  mrg     {
   2123  1.1  mrg       int dest_index;
   2124  1.1  mrg       profile_probability prob;
   2125  1.1  mrg       if (c_parser_gimple_parse_bb_spec_edge_probability (label, parser,
   2126  1.1  mrg 							  &dest_index, &prob))
   2127  1.1  mrg 	{
   2128  1.1  mrg 	  parser.push_edge (parser.current_bb->index, dest_index,
   2129  1.1  mrg 			    EDGE_FALLTHRU, prob);
   2130  1.1  mrg 	  return;
   2131  1.1  mrg 	}
   2132  1.1  mrg     }
   2133  1.1  mrg   tree decl = lookup_label_for_goto (loc, label);
   2134  1.1  mrg   gimple_seq_add_stmt_without_update (seq, gimple_build_goto (decl));
   2135  1.1  mrg }
   2136  1.1  mrg 
   2137  1.1  mrg /* Parse a parenthesized condition.
   2138  1.1  mrg    gimple-condition:
   2139  1.1  mrg      ( gimple-binary-expression )    */
   2140  1.1  mrg 
   2141  1.1  mrg static tree
   2142  1.1  mrg c_parser_gimple_paren_condition (gimple_parser &parser)
   2143  1.1  mrg {
   2144  1.1  mrg   if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   2145  1.1  mrg     return error_mark_node;
   2146  1.1  mrg   tree cond = c_parser_gimple_binary_expression (parser).value;
   2147  1.1  mrg   if (cond != error_mark_node
   2148  1.1  mrg       && ! COMPARISON_CLASS_P (cond)
   2149  1.1  mrg       && ! CONSTANT_CLASS_P (cond)
   2150  1.1  mrg       && ! SSA_VAR_P (cond))
   2151  1.1  mrg     {
   2152  1.1  mrg       c_parser_error (parser, "comparison required");
   2153  1.1  mrg       cond = error_mark_node;
   2154  1.1  mrg     }
   2155  1.1  mrg   if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
   2156  1.1  mrg     return error_mark_node;
   2157  1.1  mrg   return cond;
   2158  1.1  mrg }
   2159  1.1  mrg 
   2160  1.1  mrg /* Parse gimple try statement.
   2161  1.1  mrg 
   2162  1.1  mrg    try-statement:
   2163  1.1  mrg      try { ... } finally { ... }
   2164  1.1  mrg      try { ... } finally { ... } else { ... }
   2165  1.1  mrg 
   2166  1.1  mrg    This could support try/catch as well, but it's not implemented yet.
   2167  1.1  mrg  */
   2168  1.1  mrg 
   2169  1.1  mrg static void
   2170  1.1  mrg c_parser_gimple_try_stmt (gimple_parser &parser, gimple_seq *seq)
   2171  1.1  mrg {
   2172  1.1  mrg   gimple_seq tryseq = NULL;
   2173  1.1  mrg   c_parser_consume_token (parser);
   2174  1.1  mrg   c_parser_gimple_compound_statement (parser, &tryseq);
   2175  1.1  mrg 
   2176  1.1  mrg   if ((c_parser_next_token_is (parser, CPP_KEYWORD)
   2177  1.1  mrg        && c_parser_peek_token (parser)->keyword == RID_AT_FINALLY)
   2178  1.1  mrg       || (c_parser_next_token_is (parser, CPP_NAME)
   2179  1.1  mrg 	  && c_parser_peek_token (parser)->id_kind == C_ID_ID
   2180  1.1  mrg 	  && strcmp (IDENTIFIER_POINTER (c_parser_peek_token (parser)->value),
   2181  1.1  mrg 		     "finally") == 0))
   2182  1.1  mrg     {
   2183  1.1  mrg       gimple_seq finseq = NULL;
   2184  1.1  mrg       c_parser_consume_token (parser);
   2185  1.1  mrg       c_parser_gimple_compound_statement (parser, &finseq);
   2186  1.1  mrg 
   2187  1.1  mrg       if (c_parser_next_token_is (parser, CPP_KEYWORD)
   2188  1.1  mrg 	  && c_parser_peek_token (parser)->keyword == RID_ELSE)
   2189  1.1  mrg 	{
   2190  1.1  mrg 	  gimple_seq elsseq = NULL;
   2191  1.1  mrg 	  c_parser_consume_token (parser);
   2192  1.1  mrg 	  c_parser_gimple_compound_statement (parser, &elsseq);
   2193  1.1  mrg 
   2194  1.1  mrg 	  geh_else *stmt = gimple_build_eh_else (finseq, elsseq);
   2195  1.1  mrg 	  finseq = NULL;
   2196  1.1  mrg 	  gimple_seq_add_stmt_without_update (&finseq, stmt);
   2197  1.1  mrg 	}
   2198  1.1  mrg 
   2199  1.1  mrg       gtry *stmt = gimple_build_try (tryseq, finseq, GIMPLE_TRY_FINALLY);
   2200  1.1  mrg       gimple_seq_add_stmt_without_update (seq, stmt);
   2201  1.1  mrg     }
   2202  1.1  mrg   else if (c_parser_next_token_is (parser, CPP_KEYWORD)
   2203  1.1  mrg       && c_parser_peek_token (parser)->keyword == RID_AT_CATCH)
   2204  1.1  mrg     c_parser_error (parser, "%<catch%> is not supported");
   2205  1.1  mrg   else
   2206  1.1  mrg     c_parser_error (parser, "expected %<finally%> or %<catch%>");
   2207  1.1  mrg }
   2208  1.1  mrg 
   2209  1.1  mrg /* Parse gimple if-else statement.
   2210  1.1  mrg 
   2211  1.1  mrg    if-statement:
   2212  1.1  mrg      if ( gimple-binary-expression ) gimple-goto-statement
   2213  1.1  mrg      if ( gimple-binary-expression ) gimple-goto-statement \
   2214  1.1  mrg 					else gimple-goto-statement
   2215  1.1  mrg  */
   2216  1.1  mrg 
   2217  1.1  mrg static void
   2218  1.1  mrg c_parser_gimple_if_stmt (gimple_parser &parser, gimple_seq *seq)
   2219  1.1  mrg {
   2220  1.1  mrg   tree t_label = NULL_TREE, f_label = NULL_TREE, label;
   2221  1.1  mrg   location_t loc;
   2222  1.1  mrg   c_parser_consume_token (parser);
   2223  1.1  mrg   tree cond = c_parser_gimple_paren_condition (parser);
   2224  1.1  mrg 
   2225  1.1  mrg   if (c_parser_next_token_is_keyword (parser, RID_GOTO))
   2226  1.1  mrg     {
   2227  1.1  mrg       loc = c_parser_peek_token (parser)->location;
   2228  1.1  mrg       c_parser_consume_token (parser);
   2229  1.1  mrg       if (! c_parser_next_token_is (parser, CPP_NAME))
   2230  1.1  mrg 	{
   2231  1.1  mrg 	  c_parser_error (parser, "expected label");
   2232  1.1  mrg 	  return;
   2233  1.1  mrg 	}
   2234  1.1  mrg       label = c_parser_peek_token (parser)->value;
   2235  1.1  mrg       c_parser_consume_token (parser);
   2236  1.1  mrg       int dest_index;
   2237  1.1  mrg       profile_probability prob;
   2238  1.1  mrg       if ((cfun->curr_properties & PROP_cfg)
   2239  1.1  mrg 	  && c_parser_gimple_parse_bb_spec_edge_probability (label, parser,
   2240  1.1  mrg 							     &dest_index, &prob))
   2241  1.1  mrg 	parser.push_edge (parser.current_bb->index, dest_index,
   2242  1.1  mrg 			  EDGE_TRUE_VALUE, prob);
   2243  1.1  mrg       else
   2244  1.1  mrg 	t_label = lookup_label_for_goto (loc, label);
   2245  1.1  mrg       if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
   2246  1.1  mrg 	return;
   2247  1.1  mrg     }
   2248  1.1  mrg   else
   2249  1.1  mrg     {
   2250  1.1  mrg       c_parser_error (parser, "expected goto expression");
   2251  1.1  mrg       return;
   2252  1.1  mrg     }
   2253  1.1  mrg 
   2254  1.1  mrg   if (c_parser_next_token_is_keyword (parser, RID_ELSE))
   2255  1.1  mrg     c_parser_consume_token (parser);
   2256  1.1  mrg   else
   2257  1.1  mrg     {
   2258  1.1  mrg       c_parser_error (parser, "expected else statement");
   2259  1.1  mrg       return;
   2260  1.1  mrg     }
   2261  1.1  mrg 
   2262  1.1  mrg   if (c_parser_next_token_is_keyword (parser, RID_GOTO))
   2263  1.1  mrg     {
   2264  1.1  mrg       loc = c_parser_peek_token (parser)->location;
   2265  1.1  mrg       c_parser_consume_token (parser);
   2266  1.1  mrg       if (! c_parser_next_token_is (parser, CPP_NAME))
   2267  1.1  mrg 	{
   2268  1.1  mrg 	  c_parser_error (parser, "expected label");
   2269  1.1  mrg 	  return;
   2270  1.1  mrg 	}
   2271  1.1  mrg       label = c_parser_peek_token (parser)->value;
   2272  1.1  mrg       c_parser_consume_token (parser);
   2273  1.1  mrg       int dest_index;
   2274  1.1  mrg       profile_probability prob;
   2275  1.1  mrg       if ((cfun->curr_properties & PROP_cfg)
   2276  1.1  mrg 	  && c_parser_gimple_parse_bb_spec_edge_probability (label, parser,
   2277  1.1  mrg 							     &dest_index, &prob))
   2278  1.1  mrg 	parser.push_edge (parser.current_bb->index, dest_index,
   2279  1.1  mrg 			  EDGE_FALSE_VALUE, prob);
   2280  1.1  mrg       else
   2281  1.1  mrg 	f_label = lookup_label_for_goto (loc, label);
   2282  1.1  mrg       if (! c_parser_require (parser, CPP_SEMICOLON, "expected %<;%>"))
   2283  1.1  mrg 	return;
   2284  1.1  mrg     }
   2285  1.1  mrg   else
   2286  1.1  mrg     {
   2287  1.1  mrg       c_parser_error (parser, "expected goto expression");
   2288  1.1  mrg       return;
   2289  1.1  mrg     }
   2290  1.1  mrg 
   2291  1.1  mrg   if (cond != error_mark_node)
   2292  1.1  mrg     gimple_seq_add_stmt_without_update (seq, gimple_build_cond_from_tree (cond, t_label,
   2293  1.1  mrg 							   f_label));
   2294  1.1  mrg }
   2295  1.1  mrg 
   2296  1.1  mrg /* Parse gimple switch-statement.
   2297  1.1  mrg 
   2298  1.1  mrg    gimple-switch-statement:
   2299  1.1  mrg      switch (gimple-postfix-expression) gimple-case-statement
   2300  1.1  mrg 
   2301  1.1  mrg    gimple-case-statement:
   2302  1.1  mrg      gimple-case-statement
   2303  1.1  mrg      gimple-label-statement : gimple-goto-statment
   2304  1.1  mrg */
   2305  1.1  mrg 
   2306  1.1  mrg static void
   2307  1.1  mrg c_parser_gimple_switch_stmt (gimple_parser &parser, gimple_seq *seq)
   2308  1.1  mrg {
   2309  1.1  mrg   c_expr cond_expr;
   2310  1.1  mrg   tree case_label, label;
   2311  1.1  mrg   auto_vec<tree> labels;
   2312  1.1  mrg   tree default_label = NULL_TREE;
   2313  1.1  mrg   c_parser_consume_token (parser);
   2314  1.1  mrg 
   2315  1.1  mrg   if (! c_parser_require (parser, CPP_OPEN_PAREN, "expected %<(%>"))
   2316  1.1  mrg     return;
   2317  1.1  mrg   cond_expr = c_parser_gimple_postfix_expression (parser);
   2318  1.1  mrg   if (! c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
   2319  1.1  mrg     return;
   2320  1.1  mrg 
   2321  1.1  mrg   if (! c_parser_require (parser, CPP_OPEN_BRACE, "expected %<{%>"))
   2322  1.1  mrg     return;
   2323  1.1  mrg 
   2324  1.1  mrg   while (c_parser_next_token_is_not (parser, CPP_CLOSE_BRACE))
   2325  1.1  mrg     {
   2326  1.1  mrg       if (c_parser_next_token_is (parser, CPP_EOF))
   2327  1.1  mrg 	{
   2328  1.1  mrg 	  c_parser_error (parser, "expected statement");
   2329  1.1  mrg 	  return;
   2330  1.1  mrg 	}
   2331  1.1  mrg 
   2332  1.1  mrg       switch (c_parser_peek_token (parser)->keyword)
   2333  1.1  mrg 	{
   2334  1.1  mrg 	case RID_CASE:
   2335  1.1  mrg 	  {
   2336  1.1  mrg 	    c_expr exp1;
   2337  1.1  mrg 	    location_t loc = c_parser_peek_token (parser)->location;
   2338  1.1  mrg 	    c_parser_consume_token (parser);
   2339  1.1  mrg 
   2340  1.1  mrg 	    if (c_parser_next_token_is (parser, CPP_NAME)
   2341  1.1  mrg 		|| c_parser_peek_token (parser)->type == CPP_NUMBER)
   2342  1.1  mrg 	      exp1 = c_parser_gimple_postfix_expression (parser);
   2343  1.1  mrg 	    else
   2344  1.1  mrg 	      {
   2345  1.1  mrg 		c_parser_error (parser, "expected expression");
   2346  1.1  mrg 		return;
   2347  1.1  mrg 	      }
   2348  1.1  mrg 
   2349  1.1  mrg 	    if (c_parser_next_token_is (parser, CPP_COLON))
   2350  1.1  mrg 	      {
   2351  1.1  mrg 		c_parser_consume_token (parser);
   2352  1.1  mrg 		if (c_parser_next_token_is (parser, CPP_NAME))
   2353  1.1  mrg 		  {
   2354  1.1  mrg 		    label = c_parser_peek_token (parser)->value;
   2355  1.1  mrg 		    c_parser_consume_token (parser);
   2356  1.1  mrg 		    tree decl = lookup_label_for_goto (loc, label);
   2357  1.1  mrg 		    case_label = build_case_label (exp1.value, NULL_TREE,
   2358  1.1  mrg 						   decl);
   2359  1.1  mrg 		    labels.safe_push (case_label);
   2360  1.1  mrg 		    if (! c_parser_require (parser, CPP_SEMICOLON,
   2361  1.1  mrg 					    "expected %<;%>"))
   2362  1.1  mrg 		      return;
   2363  1.1  mrg 		  }
   2364  1.1  mrg 		else if (! c_parser_require (parser, CPP_NAME,
   2365  1.1  mrg 					     "expected label"))
   2366  1.1  mrg 		  return;
   2367  1.1  mrg 	      }
   2368  1.1  mrg 	    else if (! c_parser_require (parser, CPP_SEMICOLON,
   2369  1.1  mrg 					 "expected %<:%>"))
   2370  1.1  mrg 	      return;
   2371  1.1  mrg 	    break;
   2372  1.1  mrg 	  }
   2373  1.1  mrg 	case RID_DEFAULT:
   2374  1.1  mrg 	  {
   2375  1.1  mrg 	    location_t loc = c_parser_peek_token (parser)->location;
   2376  1.1  mrg 	    c_parser_consume_token (parser);
   2377  1.1  mrg 	    if (c_parser_next_token_is (parser, CPP_COLON))
   2378  1.1  mrg 	      {
   2379  1.1  mrg 		c_parser_consume_token (parser);
   2380  1.1  mrg 		if (c_parser_next_token_is (parser, CPP_NAME))
   2381  1.1  mrg 		  {
   2382  1.1  mrg 		    label = c_parser_peek_token (parser)->value;
   2383  1.1  mrg 		    c_parser_consume_token (parser);
   2384  1.1  mrg 		    tree decl = lookup_label_for_goto (loc, label);
   2385  1.1  mrg 		    default_label = build_case_label (NULL_TREE, NULL_TREE,
   2386  1.1  mrg 						      decl);
   2387  1.1  mrg 		    if (! c_parser_require (parser, CPP_SEMICOLON,
   2388  1.1  mrg 					    "expected %<;%>"))
   2389  1.1  mrg 		      return;
   2390  1.1  mrg 		  }
   2391  1.1  mrg 		else if (! c_parser_require (parser, CPP_NAME,
   2392  1.1  mrg 					     "expected label"))
   2393  1.1  mrg 		  return;
   2394  1.1  mrg 	      }
   2395  1.1  mrg 	    else if (! c_parser_require (parser, CPP_SEMICOLON,
   2396  1.1  mrg 					 "expected %<:%>"))
   2397  1.1  mrg 	      return;
   2398  1.1  mrg 	    break;
   2399  1.1  mrg 	  }
   2400  1.1  mrg 	default:
   2401  1.1  mrg 	  c_parser_error (parser, "expected case label");
   2402  1.1  mrg 	  return;
   2403  1.1  mrg 	}
   2404  1.1  mrg 
   2405  1.1  mrg     }
   2406  1.1  mrg   if (! c_parser_require (parser, CPP_CLOSE_BRACE, "expected %<}%>"))
   2407  1.1  mrg     return;
   2408  1.1  mrg 
   2409  1.1  mrg   if (cond_expr.value != error_mark_node)
   2410  1.1  mrg     {
   2411  1.1  mrg       gswitch *s = gimple_build_switch (cond_expr.value, default_label, labels);
   2412  1.1  mrg       gimple_seq_add_stmt_without_update (seq, s);
   2413  1.1  mrg     }
   2414  1.1  mrg }
   2415  1.1  mrg 
   2416  1.1  mrg /* Parse gimple return statement.  */
   2417  1.1  mrg 
   2418  1.1  mrg static void
   2419  1.1  mrg c_parser_gimple_return_stmt (gimple_parser &parser, gimple_seq *seq)
   2420  1.1  mrg {
   2421  1.1  mrg   location_t loc = c_parser_peek_token (parser)->location;
   2422  1.1  mrg   gimple *ret = NULL;
   2423  1.1  mrg   c_parser_consume_token (parser);
   2424  1.1  mrg   if (c_parser_next_token_is (parser, CPP_SEMICOLON))
   2425  1.1  mrg     {
   2426  1.1  mrg       c_finish_gimple_return (loc, NULL_TREE);
   2427  1.1  mrg       ret = gimple_build_return (NULL);
   2428  1.1  mrg       gimple_seq_add_stmt_without_update (seq, ret);
   2429  1.1  mrg     }
   2430  1.1  mrg   else
   2431  1.1  mrg     {
   2432  1.1  mrg       location_t xloc = c_parser_peek_token (parser)->location;
   2433  1.1  mrg       c_expr expr = c_parser_gimple_unary_expression (parser);
   2434  1.1  mrg       if (expr.value != error_mark_node)
   2435  1.1  mrg 	{
   2436  1.1  mrg 	  c_finish_gimple_return (xloc, expr.value);
   2437  1.1  mrg 	  ret = gimple_build_return (expr.value);
   2438  1.1  mrg 	  gimple_seq_add_stmt_without_update (seq, ret);
   2439  1.1  mrg 	}
   2440  1.1  mrg     }
   2441  1.1  mrg }
   2442  1.1  mrg 
   2443  1.1  mrg /* Support function for c_parser_gimple_return_stmt.  */
   2444  1.1  mrg 
   2445  1.1  mrg static void
   2446  1.1  mrg c_finish_gimple_return (location_t loc, tree retval)
   2447  1.1  mrg {
   2448  1.1  mrg   tree valtype = TREE_TYPE (TREE_TYPE (current_function_decl));
   2449  1.1  mrg 
   2450  1.1  mrg   /* Use the expansion point to handle cases such as returning NULL
   2451  1.1  mrg      in a function returning void.  */
   2452  1.1  mrg   location_t xloc = expansion_point_location_if_in_system_header (loc);
   2453  1.1  mrg 
   2454  1.1  mrg   if (TREE_THIS_VOLATILE (current_function_decl))
   2455  1.1  mrg     warning_at (xloc, 0,
   2456  1.1  mrg 		"function declared %<noreturn%> has a %<return%> statement");
   2457  1.1  mrg 
   2458  1.1  mrg   if (! retval)
   2459  1.1  mrg     current_function_returns_null = 1;
   2460  1.1  mrg   else if (valtype == 0 || TREE_CODE (valtype) == VOID_TYPE)
   2461  1.1  mrg     {
   2462  1.1  mrg       current_function_returns_null = 1;
   2463  1.1  mrg       if (TREE_CODE (TREE_TYPE (retval)) != VOID_TYPE)
   2464  1.1  mrg 	{
   2465  1.1  mrg 	  error_at
   2466  1.1  mrg 	    (xloc, "%<return%> with a value, in function returning void");
   2467  1.1  mrg 	  inform (DECL_SOURCE_LOCATION (current_function_decl),
   2468  1.1  mrg 		  "declared here");
   2469  1.1  mrg 	}
   2470  1.1  mrg     }
   2471  1.1  mrg   else if (TREE_CODE (valtype) != TREE_CODE (TREE_TYPE (retval)))
   2472  1.1  mrg     {
   2473  1.1  mrg       error_at
   2474  1.1  mrg 	(xloc, "invalid conversion in return statement");
   2475  1.1  mrg       inform (DECL_SOURCE_LOCATION (current_function_decl),
   2476  1.1  mrg 	      "declared here");
   2477  1.1  mrg     }
   2478  1.1  mrg   return;
   2479  1.1  mrg }
   2480