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