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