]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/dump-parse-tree.c
Create live_switch_vars conditionally (PR sanitizer/78270)
[thirdparty/gcc.git] / gcc / fortran / dump-parse-tree.c
CommitLineData
6de9cd9a 1/* Parse tree dumper
818ab71a 2 Copyright (C) 2003-2016 Free Software Foundation, Inc.
6de9cd9a
DN
3 Contributed by Steven Bosscher
4
9fc4d79b 5This file is part of GCC.
6de9cd9a 6
9fc4d79b
TS
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
d234d788 9Software Foundation; either version 3, or (at your option) any later
9fc4d79b 10version.
6de9cd9a 11
9fc4d79b
TS
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
6de9cd9a
DN
16
17You should have received a copy of the GNU General Public License
d234d788
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
6de9cd9a
DN
20
21
22/* Actually this is just a collection of routines that used to be
23 scattered around the sources. Now that they are all in a single
24 file, almost all of them can be static, and the other files don't
25 have this mess in them.
26
27 As a nice side-effect, this file can act as documentation of the
28 gfc_code and gfc_expr structures and all their friends and
29 relatives.
30
31 TODO: Dump DATA. */
32
33#include "config.h"
7274feea 34#include "system.h"
953bee7c 35#include "coretypes.h"
6de9cd9a 36#include "gfortran.h"
b7e75771 37#include "constructor.h"
6de9cd9a
DN
38
39/* Keep track of indentation for symbol tree dumps. */
40static int show_level = 0;
41
6c1abb5c
FXC
42/* The file handle we're dumping to is kept in a static variable. This
43 is not too cool, but it avoids a lot of passing it around. */
44static FILE *dumpfile;
45
46/* Forward declaration of some of the functions. */
47static void show_expr (gfc_expr *p);
48static void show_code_node (int, gfc_code *);
49static void show_namespace (gfc_namespace *ns);
50
51
3c7ac37e
TB
52/* Allow dumping of an expression in the debugger. */
53void gfc_debug_expr (gfc_expr *);
54
55void
56gfc_debug_expr (gfc_expr *e)
57{
58 FILE *tmp = dumpfile;
f973b648 59 dumpfile = stderr;
3c7ac37e
TB
60 show_expr (e);
61 fputc ('\n', dumpfile);
62 dumpfile = tmp;
63}
64
65
6de9cd9a
DN
66/* Do indentation for a specific level. */
67
68static inline void
636dff67 69code_indent (int level, gfc_st_label *label)
6de9cd9a
DN
70{
71 int i;
72
73 if (label != NULL)
6c1abb5c 74 fprintf (dumpfile, "%-5d ", label->value);
6de9cd9a 75
8cf8ca52 76 for (i = 0; i < (2 * level - (label ? 6 : 0)); i++)
6c1abb5c 77 fputc (' ', dumpfile);
6de9cd9a
DN
78}
79
80
81/* Simple indentation at the current level. This one
82 is used to show symbols. */
30c05595 83
6de9cd9a
DN
84static inline void
85show_indent (void)
86{
6c1abb5c 87 fputc ('\n', dumpfile);
6de9cd9a
DN
88 code_indent (show_level, NULL);
89}
90
91
92/* Show type-specific information. */
30c05595 93
6c1abb5c
FXC
94static void
95show_typespec (gfc_typespec *ts)
6de9cd9a 96{
45a69325
TB
97 if (ts->type == BT_ASSUMED)
98 {
99 fputs ("(TYPE(*))", dumpfile);
100 return;
101 }
102
6c1abb5c 103 fprintf (dumpfile, "(%s ", gfc_basic_typename (ts->type));
6de9cd9a
DN
104
105 switch (ts->type)
106 {
107 case BT_DERIVED:
8cf8ca52 108 case BT_CLASS:
f6288c24 109 case BT_UNION:
bc21d315 110 fprintf (dumpfile, "%s", ts->u.derived->name);
6de9cd9a
DN
111 break;
112
113 case BT_CHARACTER:
85dabaed
JW
114 if (ts->u.cl)
115 show_expr (ts->u.cl->length);
e3210543 116 fprintf(dumpfile, " %d", ts->kind);
6de9cd9a
DN
117 break;
118
119 default:
6c1abb5c 120 fprintf (dumpfile, "%d", ts->kind);
6de9cd9a
DN
121 break;
122 }
874be74a
TK
123 if (ts->is_c_interop)
124 fputs (" C_INTEROP", dumpfile);
125
126 if (ts->is_iso_c)
127 fputs (" ISO_C", dumpfile);
128
129 if (ts->deferred)
130 fputs (" DEFERRED", dumpfile);
6de9cd9a 131
6c1abb5c 132 fputc (')', dumpfile);
6de9cd9a
DN
133}
134
135
136/* Show an actual argument list. */
137
6c1abb5c
FXC
138static void
139show_actual_arglist (gfc_actual_arglist *a)
6de9cd9a 140{
6c1abb5c 141 fputc ('(', dumpfile);
6de9cd9a
DN
142
143 for (; a; a = a->next)
144 {
6c1abb5c 145 fputc ('(', dumpfile);
cb9e4f55 146 if (a->name != NULL)
6c1abb5c 147 fprintf (dumpfile, "%s = ", a->name);
6de9cd9a 148 if (a->expr != NULL)
6c1abb5c 149 show_expr (a->expr);
6de9cd9a 150 else
6c1abb5c 151 fputs ("(arg not-present)", dumpfile);
6de9cd9a 152
6c1abb5c 153 fputc (')', dumpfile);
6de9cd9a 154 if (a->next != NULL)
6c1abb5c 155 fputc (' ', dumpfile);
6de9cd9a
DN
156 }
157
6c1abb5c 158 fputc (')', dumpfile);
6de9cd9a
DN
159}
160
161
49de9e73 162/* Show a gfc_array_spec array specification structure. */
6de9cd9a 163
6c1abb5c
FXC
164static void
165show_array_spec (gfc_array_spec *as)
6de9cd9a
DN
166{
167 const char *c;
168 int i;
169
170 if (as == NULL)
171 {
6c1abb5c 172 fputs ("()", dumpfile);
6de9cd9a
DN
173 return;
174 }
175
be59db2d 176 fprintf (dumpfile, "(%d [%d]", as->rank, as->corank);
6de9cd9a 177
c62c6622 178 if (as->rank + as->corank > 0 || as->rank == -1)
6de9cd9a
DN
179 {
180 switch (as->type)
181 {
182 case AS_EXPLICIT: c = "AS_EXPLICIT"; break;
183 case AS_DEFERRED: c = "AS_DEFERRED"; break;
184 case AS_ASSUMED_SIZE: c = "AS_ASSUMED_SIZE"; break;
185 case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
c62c6622 186 case AS_ASSUMED_RANK: c = "AS_ASSUMED_RANK"; break;
6de9cd9a 187 default:
6c1abb5c 188 gfc_internal_error ("show_array_spec(): Unhandled array shape "
636dff67 189 "type.");
6de9cd9a 190 }
6c1abb5c 191 fprintf (dumpfile, " %s ", c);
6de9cd9a 192
be59db2d 193 for (i = 0; i < as->rank + as->corank; i++)
6de9cd9a 194 {
6c1abb5c
FXC
195 show_expr (as->lower[i]);
196 fputc (' ', dumpfile);
197 show_expr (as->upper[i]);
198 fputc (' ', dumpfile);
6de9cd9a
DN
199 }
200 }
201
6c1abb5c 202 fputc (')', dumpfile);
6de9cd9a
DN
203}
204
205
49de9e73 206/* Show a gfc_array_ref array reference structure. */
6de9cd9a 207
6c1abb5c
FXC
208static void
209show_array_ref (gfc_array_ref * ar)
6de9cd9a
DN
210{
211 int i;
212
6c1abb5c 213 fputc ('(', dumpfile);
6de9cd9a
DN
214
215 switch (ar->type)
216 {
217 case AR_FULL:
6c1abb5c 218 fputs ("FULL", dumpfile);
6de9cd9a
DN
219 break;
220
221 case AR_SECTION:
222 for (i = 0; i < ar->dimen; i++)
223 {
fb89e8bd
TS
224 /* There are two types of array sections: either the
225 elements are identified by an integer array ('vector'),
226 or by an index range. In the former case we only have to
227 print the start expression which contains the vector, in
228 the latter case we have to print any of lower and upper
229 bound and the stride, if they're present. */
dfd6231e 230
6de9cd9a 231 if (ar->start[i] != NULL)
6c1abb5c 232 show_expr (ar->start[i]);
6de9cd9a 233
fb89e8bd 234 if (ar->dimen_type[i] == DIMEN_RANGE)
6de9cd9a 235 {
6c1abb5c 236 fputc (':', dumpfile);
fb89e8bd
TS
237
238 if (ar->end[i] != NULL)
6c1abb5c 239 show_expr (ar->end[i]);
fb89e8bd
TS
240
241 if (ar->stride[i] != NULL)
242 {
6c1abb5c
FXC
243 fputc (':', dumpfile);
244 show_expr (ar->stride[i]);
fb89e8bd 245 }
6de9cd9a
DN
246 }
247
248 if (i != ar->dimen - 1)
6c1abb5c 249 fputs (" , ", dumpfile);
6de9cd9a
DN
250 }
251 break;
252
253 case AR_ELEMENT:
254 for (i = 0; i < ar->dimen; i++)
255 {
6c1abb5c 256 show_expr (ar->start[i]);
6de9cd9a 257 if (i != ar->dimen - 1)
6c1abb5c 258 fputs (" , ", dumpfile);
6de9cd9a
DN
259 }
260 break;
261
262 case AR_UNKNOWN:
6c1abb5c 263 fputs ("UNKNOWN", dumpfile);
6de9cd9a
DN
264 break;
265
266 default:
6c1abb5c 267 gfc_internal_error ("show_array_ref(): Unknown array reference");
6de9cd9a
DN
268 }
269
6c1abb5c 270 fputc (')', dumpfile);
6de9cd9a
DN
271}
272
273
274/* Show a list of gfc_ref structures. */
275
6c1abb5c
FXC
276static void
277show_ref (gfc_ref *p)
6de9cd9a 278{
6de9cd9a
DN
279 for (; p; p = p->next)
280 switch (p->type)
281 {
282 case REF_ARRAY:
6c1abb5c 283 show_array_ref (&p->u.ar);
6de9cd9a
DN
284 break;
285
286 case REF_COMPONENT:
6c1abb5c 287 fprintf (dumpfile, " %% %s", p->u.c.component->name);
6de9cd9a
DN
288 break;
289
290 case REF_SUBSTRING:
6c1abb5c
FXC
291 fputc ('(', dumpfile);
292 show_expr (p->u.ss.start);
293 fputc (':', dumpfile);
294 show_expr (p->u.ss.end);
295 fputc (')', dumpfile);
6de9cd9a
DN
296 break;
297
298 default:
6c1abb5c 299 gfc_internal_error ("show_ref(): Bad component code");
6de9cd9a
DN
300 }
301}
302
303
304/* Display a constructor. Works recursively for array constructors. */
305
6c1abb5c 306static void
b7e75771 307show_constructor (gfc_constructor_base base)
6de9cd9a 308{
b7e75771
JD
309 gfc_constructor *c;
310 for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
6de9cd9a
DN
311 {
312 if (c->iterator == NULL)
6c1abb5c 313 show_expr (c->expr);
6de9cd9a
DN
314 else
315 {
6c1abb5c
FXC
316 fputc ('(', dumpfile);
317 show_expr (c->expr);
6de9cd9a 318
6c1abb5c
FXC
319 fputc (' ', dumpfile);
320 show_expr (c->iterator->var);
321 fputc ('=', dumpfile);
322 show_expr (c->iterator->start);
323 fputc (',', dumpfile);
324 show_expr (c->iterator->end);
325 fputc (',', dumpfile);
326 show_expr (c->iterator->step);
6de9cd9a 327
6c1abb5c 328 fputc (')', dumpfile);
6de9cd9a
DN
329 }
330
b7e75771 331 if (gfc_constructor_next (c) != NULL)
6c1abb5c 332 fputs (" , ", dumpfile);
6de9cd9a
DN
333 }
334}
335
336
b35c5f01 337static void
00660189 338show_char_const (const gfc_char_t *c, int length)
b35c5f01
TS
339{
340 int i;
341
6c1abb5c 342 fputc ('\'', dumpfile);
b35c5f01
TS
343 for (i = 0; i < length; i++)
344 {
345 if (c[i] == '\'')
6c1abb5c 346 fputs ("''", dumpfile);
b35c5f01 347 else
00660189 348 fputs (gfc_print_wide_char (c[i]), dumpfile);
b35c5f01 349 }
6c1abb5c 350 fputc ('\'', dumpfile);
b35c5f01
TS
351}
352
a64a8f2f
DK
353
354/* Show a component-call expression. */
355
356static void
357show_compcall (gfc_expr* p)
358{
359 gcc_assert (p->expr_type == EXPR_COMPCALL);
360
361 fprintf (dumpfile, "%s", p->symtree->n.sym->name);
362 show_ref (p->ref);
363 fprintf (dumpfile, "%s", p->value.compcall.name);
364
365 show_actual_arglist (p->value.compcall.actual);
366}
367
368
6de9cd9a
DN
369/* Show an expression. */
370
6c1abb5c
FXC
371static void
372show_expr (gfc_expr *p)
6de9cd9a
DN
373{
374 const char *c;
375 int i;
376
377 if (p == NULL)
378 {
6c1abb5c 379 fputs ("()", dumpfile);
6de9cd9a
DN
380 return;
381 }
382
383 switch (p->expr_type)
384 {
385 case EXPR_SUBSTRING:
b35c5f01 386 show_char_const (p->value.character.string, p->value.character.length);
6c1abb5c 387 show_ref (p->ref);
6de9cd9a
DN
388 break;
389
390 case EXPR_STRUCTURE:
bc21d315 391 fprintf (dumpfile, "%s(", p->ts.u.derived->name);
6c1abb5c
FXC
392 show_constructor (p->value.constructor);
393 fputc (')', dumpfile);
6de9cd9a
DN
394 break;
395
396 case EXPR_ARRAY:
6c1abb5c
FXC
397 fputs ("(/ ", dumpfile);
398 show_constructor (p->value.constructor);
399 fputs (" /)", dumpfile);
6de9cd9a 400
6c1abb5c 401 show_ref (p->ref);
6de9cd9a
DN
402 break;
403
404 case EXPR_NULL:
6c1abb5c 405 fputs ("NULL()", dumpfile);
6de9cd9a
DN
406 break;
407
408 case EXPR_CONSTANT:
409 switch (p->ts.type)
410 {
411 case BT_INTEGER:
412 mpz_out_str (stdout, 10, p->value.integer);
413
9d64df18 414 if (p->ts.kind != gfc_default_integer_kind)
6c1abb5c 415 fprintf (dumpfile, "_%d", p->ts.kind);
6de9cd9a
DN
416 break;
417
418 case BT_LOGICAL:
419 if (p->value.logical)
6c1abb5c 420 fputs (".true.", dumpfile);
6de9cd9a 421 else
6c1abb5c 422 fputs (".false.", dumpfile);
6de9cd9a
DN
423 break;
424
425 case BT_REAL:
f8e566e5 426 mpfr_out_str (stdout, 10, 0, p->value.real, GFC_RND_MODE);
9d64df18 427 if (p->ts.kind != gfc_default_real_kind)
6c1abb5c 428 fprintf (dumpfile, "_%d", p->ts.kind);
6de9cd9a
DN
429 break;
430
431 case BT_CHARACTER:
dfd6231e 432 show_char_const (p->value.character.string,
b35c5f01 433 p->value.character.length);
6de9cd9a
DN
434 break;
435
436 case BT_COMPLEX:
6c1abb5c 437 fputs ("(complex ", dumpfile);
6de9cd9a 438
eb6f9a86
KG
439 mpfr_out_str (stdout, 10, 0, mpc_realref (p->value.complex),
440 GFC_RND_MODE);
9d64df18 441 if (p->ts.kind != gfc_default_complex_kind)
6c1abb5c 442 fprintf (dumpfile, "_%d", p->ts.kind);
6de9cd9a 443
6c1abb5c 444 fputc (' ', dumpfile);
6de9cd9a 445
eb6f9a86
KG
446 mpfr_out_str (stdout, 10, 0, mpc_imagref (p->value.complex),
447 GFC_RND_MODE);
9d64df18 448 if (p->ts.kind != gfc_default_complex_kind)
6c1abb5c 449 fprintf (dumpfile, "_%d", p->ts.kind);
6de9cd9a 450
6c1abb5c 451 fputc (')', dumpfile);
6de9cd9a
DN
452 break;
453
20585ad6 454 case BT_HOLLERITH:
6c1abb5c 455 fprintf (dumpfile, "%dH", p->representation.length);
20585ad6
BM
456 c = p->representation.string;
457 for (i = 0; i < p->representation.length; i++, c++)
458 {
6c1abb5c 459 fputc (*c, dumpfile);
20585ad6
BM
460 }
461 break;
462
6de9cd9a 463 default:
6c1abb5c 464 fputs ("???", dumpfile);
6de9cd9a
DN
465 break;
466 }
467
20585ad6
BM
468 if (p->representation.string)
469 {
6c1abb5c 470 fputs (" {", dumpfile);
20585ad6
BM
471 c = p->representation.string;
472 for (i = 0; i < p->representation.length; i++, c++)
473 {
6c1abb5c 474 fprintf (dumpfile, "%.2x", (unsigned int) *c);
20585ad6 475 if (i < p->representation.length - 1)
6c1abb5c 476 fputc (',', dumpfile);
20585ad6 477 }
6c1abb5c 478 fputc ('}', dumpfile);
20585ad6
BM
479 }
480
6de9cd9a
DN
481 break;
482
483 case EXPR_VARIABLE:
9439ae41 484 if (p->symtree->n.sym->ns && p->symtree->n.sym->ns->proc_name)
6c1abb5c
FXC
485 fprintf (dumpfile, "%s:", p->symtree->n.sym->ns->proc_name->name);
486 fprintf (dumpfile, "%s", p->symtree->n.sym->name);
487 show_ref (p->ref);
6de9cd9a
DN
488 break;
489
490 case EXPR_OP:
6c1abb5c 491 fputc ('(', dumpfile);
a1ee985f 492 switch (p->value.op.op)
6de9cd9a
DN
493 {
494 case INTRINSIC_UPLUS:
6c1abb5c 495 fputs ("U+ ", dumpfile);
6de9cd9a
DN
496 break;
497 case INTRINSIC_UMINUS:
6c1abb5c 498 fputs ("U- ", dumpfile);
6de9cd9a
DN
499 break;
500 case INTRINSIC_PLUS:
6c1abb5c 501 fputs ("+ ", dumpfile);
6de9cd9a
DN
502 break;
503 case INTRINSIC_MINUS:
6c1abb5c 504 fputs ("- ", dumpfile);
6de9cd9a
DN
505 break;
506 case INTRINSIC_TIMES:
6c1abb5c 507 fputs ("* ", dumpfile);
6de9cd9a
DN
508 break;
509 case INTRINSIC_DIVIDE:
6c1abb5c 510 fputs ("/ ", dumpfile);
6de9cd9a
DN
511 break;
512 case INTRINSIC_POWER:
6c1abb5c 513 fputs ("** ", dumpfile);
6de9cd9a
DN
514 break;
515 case INTRINSIC_CONCAT:
6c1abb5c 516 fputs ("// ", dumpfile);
6de9cd9a
DN
517 break;
518 case INTRINSIC_AND:
6c1abb5c 519 fputs ("AND ", dumpfile);
6de9cd9a
DN
520 break;
521 case INTRINSIC_OR:
6c1abb5c 522 fputs ("OR ", dumpfile);
6de9cd9a
DN
523 break;
524 case INTRINSIC_EQV:
6c1abb5c 525 fputs ("EQV ", dumpfile);
6de9cd9a
DN
526 break;
527 case INTRINSIC_NEQV:
6c1abb5c 528 fputs ("NEQV ", dumpfile);
6de9cd9a
DN
529 break;
530 case INTRINSIC_EQ:
3bed9dd0 531 case INTRINSIC_EQ_OS:
6c1abb5c 532 fputs ("= ", dumpfile);
6de9cd9a
DN
533 break;
534 case INTRINSIC_NE:
3bed9dd0 535 case INTRINSIC_NE_OS:
6c1abb5c 536 fputs ("/= ", dumpfile);
6de9cd9a
DN
537 break;
538 case INTRINSIC_GT:
3bed9dd0 539 case INTRINSIC_GT_OS:
6c1abb5c 540 fputs ("> ", dumpfile);
6de9cd9a
DN
541 break;
542 case INTRINSIC_GE:
3bed9dd0 543 case INTRINSIC_GE_OS:
6c1abb5c 544 fputs (">= ", dumpfile);
6de9cd9a
DN
545 break;
546 case INTRINSIC_LT:
3bed9dd0 547 case INTRINSIC_LT_OS:
6c1abb5c 548 fputs ("< ", dumpfile);
6de9cd9a
DN
549 break;
550 case INTRINSIC_LE:
3bed9dd0 551 case INTRINSIC_LE_OS:
6c1abb5c 552 fputs ("<= ", dumpfile);
6de9cd9a
DN
553 break;
554 case INTRINSIC_NOT:
6c1abb5c 555 fputs ("NOT ", dumpfile);
6de9cd9a 556 break;
2414e1d6 557 case INTRINSIC_PARENTHESES:
f4679a55 558 fputs ("parens ", dumpfile);
2414e1d6 559 break;
6de9cd9a
DN
560
561 default:
562 gfc_internal_error
6c1abb5c 563 ("show_expr(): Bad intrinsic in expression!");
6de9cd9a
DN
564 }
565
6c1abb5c 566 show_expr (p->value.op.op1);
6de9cd9a 567
58b03ab2 568 if (p->value.op.op2)
6de9cd9a 569 {
6c1abb5c
FXC
570 fputc (' ', dumpfile);
571 show_expr (p->value.op.op2);
6de9cd9a
DN
572 }
573
6c1abb5c 574 fputc (')', dumpfile);
6de9cd9a
DN
575 break;
576
577 case EXPR_FUNCTION:
578 if (p->value.function.name == NULL)
579 {
713485cc 580 fprintf (dumpfile, "%s", p->symtree->n.sym->name);
2a573572 581 if (gfc_is_proc_ptr_comp (p))
713485cc
JW
582 show_ref (p->ref);
583 fputc ('[', dumpfile);
6c1abb5c
FXC
584 show_actual_arglist (p->value.function.actual);
585 fputc (']', dumpfile);
6de9cd9a
DN
586 }
587 else
588 {
713485cc 589 fprintf (dumpfile, "%s", p->value.function.name);
2a573572 590 if (gfc_is_proc_ptr_comp (p))
713485cc
JW
591 show_ref (p->ref);
592 fputc ('[', dumpfile);
593 fputc ('[', dumpfile);
6c1abb5c
FXC
594 show_actual_arglist (p->value.function.actual);
595 fputc (']', dumpfile);
596 fputc (']', dumpfile);
6de9cd9a
DN
597 }
598
599 break;
600
a64a8f2f
DK
601 case EXPR_COMPCALL:
602 show_compcall (p);
603 break;
604
6de9cd9a 605 default:
6c1abb5c 606 gfc_internal_error ("show_expr(): Don't know how to show expr");
6de9cd9a
DN
607 }
608}
609
6de9cd9a
DN
610/* Show symbol attributes. The flavor and intent are followed by
611 whatever single bit attributes are present. */
612
6c1abb5c 613static void
8cf8ca52 614show_attr (symbol_attribute *attr, const char * module)
6de9cd9a 615{
8cf8ca52
TK
616 if (attr->flavor != FL_UNKNOWN)
617 fprintf (dumpfile, "(%s ", gfc_code2string (flavors, attr->flavor));
618 if (attr->access != ACCESS_UNKNOWN)
619 fprintf (dumpfile, "%s ", gfc_code2string (access_types, attr->access));
620 if (attr->proc != PROC_UNKNOWN)
621 fprintf (dumpfile, "%s ", gfc_code2string (procedures, attr->proc));
622 if (attr->save != SAVE_NONE)
623 fprintf (dumpfile, "%s", gfc_code2string (save_status, attr->save));
6de9cd9a 624
8e54f139
TB
625 if (attr->artificial)
626 fputs (" ARTIFICIAL", dumpfile);
6de9cd9a 627 if (attr->allocatable)
6c1abb5c 628 fputs (" ALLOCATABLE", dumpfile);
1eee5628
TB
629 if (attr->asynchronous)
630 fputs (" ASYNCHRONOUS", dumpfile);
be59db2d
TB
631 if (attr->codimension)
632 fputs (" CODIMENSION", dumpfile);
6de9cd9a 633 if (attr->dimension)
6c1abb5c 634 fputs (" DIMENSION", dumpfile);
fe4e525c
TB
635 if (attr->contiguous)
636 fputs (" CONTIGUOUS", dumpfile);
6de9cd9a 637 if (attr->external)
6c1abb5c 638 fputs (" EXTERNAL", dumpfile);
6de9cd9a 639 if (attr->intrinsic)
6c1abb5c 640 fputs (" INTRINSIC", dumpfile);
6de9cd9a 641 if (attr->optional)
6c1abb5c 642 fputs (" OPTIONAL", dumpfile);
6de9cd9a 643 if (attr->pointer)
6c1abb5c 644 fputs (" POINTER", dumpfile);
9aa433c2 645 if (attr->is_protected)
6c1abb5c 646 fputs (" PROTECTED", dumpfile);
06469efd 647 if (attr->value)
6c1abb5c 648 fputs (" VALUE", dumpfile);
775e6c3a 649 if (attr->volatile_)
6c1abb5c 650 fputs (" VOLATILE", dumpfile);
6c7a4dfd 651 if (attr->threadprivate)
6c1abb5c 652 fputs (" THREADPRIVATE", dumpfile);
6de9cd9a 653 if (attr->target)
6c1abb5c 654 fputs (" TARGET", dumpfile);
6de9cd9a 655 if (attr->dummy)
8cf8ca52
TK
656 {
657 fputs (" DUMMY", dumpfile);
658 if (attr->intent != INTENT_UNKNOWN)
659 fprintf (dumpfile, "(%s)", gfc_intent_string (attr->intent));
660 }
661
6de9cd9a 662 if (attr->result)
6c1abb5c 663 fputs (" RESULT", dumpfile);
6de9cd9a 664 if (attr->entry)
6c1abb5c 665 fputs (" ENTRY", dumpfile);
e6ef7325 666 if (attr->is_bind_c)
6c1abb5c 667 fputs (" BIND(C)", dumpfile);
6de9cd9a
DN
668
669 if (attr->data)
6c1abb5c 670 fputs (" DATA", dumpfile);
6de9cd9a 671 if (attr->use_assoc)
8cf8ca52
TK
672 {
673 fputs (" USE-ASSOC", dumpfile);
674 if (module != NULL)
675 fprintf (dumpfile, "(%s)", module);
676 }
677
6de9cd9a 678 if (attr->in_namelist)
6c1abb5c 679 fputs (" IN-NAMELIST", dumpfile);
6de9cd9a 680 if (attr->in_common)
6c1abb5c 681 fputs (" IN-COMMON", dumpfile);
6de9cd9a 682
9e1d712c 683 if (attr->abstract)
52f49934 684 fputs (" ABSTRACT", dumpfile);
6de9cd9a 685 if (attr->function)
6c1abb5c 686 fputs (" FUNCTION", dumpfile);
6de9cd9a 687 if (attr->subroutine)
6c1abb5c 688 fputs (" SUBROUTINE", dumpfile);
6de9cd9a 689 if (attr->implicit_type)
6c1abb5c 690 fputs (" IMPLICIT-TYPE", dumpfile);
6de9cd9a
DN
691
692 if (attr->sequence)
6c1abb5c 693 fputs (" SEQUENCE", dumpfile);
6de9cd9a 694 if (attr->elemental)
6c1abb5c 695 fputs (" ELEMENTAL", dumpfile);
6de9cd9a 696 if (attr->pure)
6c1abb5c 697 fputs (" PURE", dumpfile);
6de9cd9a 698 if (attr->recursive)
6c1abb5c 699 fputs (" RECURSIVE", dumpfile);
6de9cd9a 700
6c1abb5c 701 fputc (')', dumpfile);
6de9cd9a
DN
702}
703
704
705/* Show components of a derived type. */
706
6c1abb5c
FXC
707static void
708show_components (gfc_symbol *sym)
6de9cd9a
DN
709{
710 gfc_component *c;
711
712 for (c = sym->components; c; c = c->next)
713 {
6c1abb5c
FXC
714 fprintf (dumpfile, "(%s ", c->name);
715 show_typespec (&c->ts);
d6c63324
TK
716 if (c->attr.allocatable)
717 fputs (" ALLOCATABLE", dumpfile);
d4b7d0f0 718 if (c->attr.pointer)
6c1abb5c 719 fputs (" POINTER", dumpfile);
713485cc
JW
720 if (c->attr.proc_pointer)
721 fputs (" PPC", dumpfile);
d4b7d0f0 722 if (c->attr.dimension)
6c1abb5c
FXC
723 fputs (" DIMENSION", dumpfile);
724 fputc (' ', dumpfile);
725 show_array_spec (c->as);
d4b7d0f0
JW
726 if (c->attr.access)
727 fprintf (dumpfile, " %s", gfc_code2string (access_types, c->attr.access));
6c1abb5c 728 fputc (')', dumpfile);
6de9cd9a 729 if (c->next != NULL)
6c1abb5c 730 fputc (' ', dumpfile);
6de9cd9a
DN
731 }
732}
733
734
a64a8f2f
DK
735/* Show the f2k_derived namespace with procedure bindings. */
736
737static void
26ef2b42 738show_typebound_proc (gfc_typebound_proc* tb, const char* name)
a64a8f2f 739{
a64a8f2f
DK
740 show_indent ();
741
26ef2b42 742 if (tb->is_generic)
a64a8f2f
DK
743 fputs ("GENERIC", dumpfile);
744 else
745 {
746 fputs ("PROCEDURE, ", dumpfile);
26ef2b42 747 if (tb->nopass)
a64a8f2f
DK
748 fputs ("NOPASS", dumpfile);
749 else
750 {
26ef2b42
DK
751 if (tb->pass_arg)
752 fprintf (dumpfile, "PASS(%s)", tb->pass_arg);
a64a8f2f
DK
753 else
754 fputs ("PASS", dumpfile);
755 }
26ef2b42 756 if (tb->non_overridable)
a64a8f2f
DK
757 fputs (", NON_OVERRIDABLE", dumpfile);
758 }
759
26ef2b42 760 if (tb->access == ACCESS_PUBLIC)
a64a8f2f
DK
761 fputs (", PUBLIC", dumpfile);
762 else
763 fputs (", PRIVATE", dumpfile);
764
26ef2b42 765 fprintf (dumpfile, " :: %s => ", name);
a64a8f2f 766
26ef2b42 767 if (tb->is_generic)
a64a8f2f
DK
768 {
769 gfc_tbp_generic* g;
26ef2b42 770 for (g = tb->u.generic; g; g = g->next)
a64a8f2f
DK
771 {
772 fputs (g->specific_st->name, dumpfile);
773 if (g->next)
774 fputs (", ", dumpfile);
775 }
776 }
777 else
26ef2b42
DK
778 fputs (tb->u.specific->n.sym->name, dumpfile);
779}
780
781static void
782show_typebound_symtree (gfc_symtree* st)
783{
784 gcc_assert (st->n.tb);
785 show_typebound_proc (st->n.tb, st->name);
a64a8f2f
DK
786}
787
788static void
789show_f2k_derived (gfc_namespace* f2k)
790{
791 gfc_finalizer* f;
26ef2b42 792 int op;
a64a8f2f 793
26ef2b42
DK
794 show_indent ();
795 fputs ("Procedure bindings:", dumpfile);
a64a8f2f
DK
796 ++show_level;
797
798 /* Finalizer bindings. */
799 for (f = f2k->finalizers; f; f = f->next)
800 {
801 show_indent ();
8e54f139 802 fprintf (dumpfile, "FINAL %s", f->proc_tree->n.sym->name);
a64a8f2f
DK
803 }
804
805 /* Type-bound procedures. */
26ef2b42
DK
806 gfc_traverse_symtree (f2k->tb_sym_root, &show_typebound_symtree);
807
808 --show_level;
809
810 show_indent ();
811 fputs ("Operator bindings:", dumpfile);
812 ++show_level;
813
814 /* User-defined operators. */
815 gfc_traverse_symtree (f2k->tb_uop_root, &show_typebound_symtree);
816
817 /* Intrinsic operators. */
818 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
819 if (f2k->tb_op[op])
820 show_typebound_proc (f2k->tb_op[op],
821 gfc_op2string ((gfc_intrinsic_op) op));
a64a8f2f
DK
822
823 --show_level;
824}
825
826
6de9cd9a
DN
827/* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
828 show the interface. Information needed to reconstruct the list of
829 specific interfaces associated with a generic symbol is done within
830 that symbol. */
831
6c1abb5c
FXC
832static void
833show_symbol (gfc_symbol *sym)
6de9cd9a
DN
834{
835 gfc_formal_arglist *formal;
836 gfc_interface *intr;
8cf8ca52 837 int i,len;
6de9cd9a
DN
838
839 if (sym == NULL)
840 return;
841
8cf8ca52
TK
842 fprintf (dumpfile, "|| symbol: '%s' ", sym->name);
843 len = strlen (sym->name);
844 for (i=len; i<12; i++)
845 fputc(' ', dumpfile);
6de9cd9a 846
8cf8ca52 847 ++show_level;
7ed979b9 848
8cf8ca52
TK
849 show_indent ();
850 fputs ("type spec : ", dumpfile);
851 show_typespec (&sym->ts);
7ed979b9 852
8cf8ca52
TK
853 show_indent ();
854 fputs ("attributes: ", dumpfile);
855 show_attr (&sym->attr, sym->module);
6de9cd9a
DN
856
857 if (sym->value)
858 {
859 show_indent ();
6c1abb5c
FXC
860 fputs ("value: ", dumpfile);
861 show_expr (sym->value);
6de9cd9a
DN
862 }
863
864 if (sym->as)
865 {
866 show_indent ();
6c1abb5c
FXC
867 fputs ("Array spec:", dumpfile);
868 show_array_spec (sym->as);
6de9cd9a
DN
869 }
870
871 if (sym->generic)
872 {
873 show_indent ();
6c1abb5c 874 fputs ("Generic interfaces:", dumpfile);
6de9cd9a 875 for (intr = sym->generic; intr; intr = intr->next)
6c1abb5c 876 fprintf (dumpfile, " %s", intr->sym->name);
6de9cd9a
DN
877 }
878
6de9cd9a
DN
879 if (sym->result)
880 {
881 show_indent ();
6c1abb5c 882 fprintf (dumpfile, "result: %s", sym->result->name);
6de9cd9a
DN
883 }
884
885 if (sym->components)
886 {
887 show_indent ();
6c1abb5c
FXC
888 fputs ("components: ", dumpfile);
889 show_components (sym);
6de9cd9a
DN
890 }
891
a64a8f2f 892 if (sym->f2k_derived)
cf2b3c22
TB
893 {
894 show_indent ();
7c1dab0d
JW
895 if (sym->hash_value)
896 fprintf (dumpfile, "hash: %d", sym->hash_value);
cf2b3c22
TB
897 show_f2k_derived (sym->f2k_derived);
898 }
a64a8f2f 899
6de9cd9a
DN
900 if (sym->formal)
901 {
902 show_indent ();
6c1abb5c 903 fputs ("Formal arglist:", dumpfile);
6de9cd9a
DN
904
905 for (formal = sym->formal; formal; formal = formal->next)
636dff67
SK
906 {
907 if (formal->sym != NULL)
6c1abb5c 908 fprintf (dumpfile, " %s", formal->sym->name);
636dff67 909 else
6c1abb5c 910 fputs (" [Alt Return]", dumpfile);
636dff67 911 }
6de9cd9a
DN
912 }
913
3609dfbf 914 if (sym->formal_ns && (sym->formal_ns->proc_name != sym)
142f5e4a
AS
915 && sym->attr.proc != PROC_ST_FUNCTION
916 && !sym->attr.entry)
6de9cd9a
DN
917 {
918 show_indent ();
6c1abb5c
FXC
919 fputs ("Formal namespace", dumpfile);
920 show_namespace (sym->formal_ns);
6de9cd9a 921 }
8cf8ca52 922 --show_level;
0a164a3c
PT
923}
924
925
6de9cd9a
DN
926/* Show a user-defined operator. Just prints an operator
927 and the name of the associated subroutine, really. */
30c05595 928
6de9cd9a 929static void
636dff67 930show_uop (gfc_user_op *uop)
6de9cd9a
DN
931{
932 gfc_interface *intr;
933
934 show_indent ();
6c1abb5c 935 fprintf (dumpfile, "%s:", uop->name);
6de9cd9a 936
a1ee985f 937 for (intr = uop->op; intr; intr = intr->next)
6c1abb5c 938 fprintf (dumpfile, " %s", intr->sym->name);
6de9cd9a
DN
939}
940
941
942/* Workhorse function for traversing the user operator symtree. */
943
944static void
636dff67 945traverse_uop (gfc_symtree *st, void (*func) (gfc_user_op *))
6de9cd9a 946{
6de9cd9a
DN
947 if (st == NULL)
948 return;
949
950 (*func) (st->n.uop);
951
952 traverse_uop (st->left, func);
953 traverse_uop (st->right, func);
954}
955
956
957/* Traverse the tree of user operator nodes. */
958
959void
636dff67 960gfc_traverse_user_op (gfc_namespace *ns, void (*func) (gfc_user_op *))
6de9cd9a 961{
6de9cd9a
DN
962 traverse_uop (ns->uop_root, func);
963}
964
965
fbc9b453
TS
966/* Function to display a common block. */
967
968static void
636dff67 969show_common (gfc_symtree *st)
fbc9b453
TS
970{
971 gfc_symbol *s;
972
973 show_indent ();
6c1abb5c 974 fprintf (dumpfile, "common: /%s/ ", st->name);
fbc9b453
TS
975
976 s = st->n.common->head;
977 while (s)
978 {
6c1abb5c 979 fprintf (dumpfile, "%s", s->name);
fbc9b453
TS
980 s = s->common_next;
981 if (s)
6c1abb5c 982 fputs (", ", dumpfile);
fbc9b453 983 }
6c1abb5c 984 fputc ('\n', dumpfile);
dfd6231e 985}
fbc9b453 986
30c05595 987
6de9cd9a
DN
988/* Worker function to display the symbol tree. */
989
990static void
636dff67 991show_symtree (gfc_symtree *st)
6de9cd9a 992{
8cf8ca52
TK
993 int len, i;
994
6de9cd9a 995 show_indent ();
8cf8ca52
TK
996
997 len = strlen(st->name);
998 fprintf (dumpfile, "symtree: '%s'", st->name);
999
1000 for (i=len; i<12; i++)
1001 fputc(' ', dumpfile);
1002
1003 if (st->ambiguous)
1004 fputs( " Ambiguous", dumpfile);
6de9cd9a
DN
1005
1006 if (st->n.sym->ns != gfc_current_ns)
8cf8ca52
TK
1007 fprintf (dumpfile, "|| symbol: '%s' from namespace '%s'", st->n.sym->name,
1008 st->n.sym->ns->proc_name->name);
6de9cd9a 1009 else
6c1abb5c 1010 show_symbol (st->n.sym);
6de9cd9a
DN
1011}
1012
1013
1014/******************* Show gfc_code structures **************/
1015
1016
6de9cd9a 1017/* Show a list of code structures. Mutually recursive with
6c1abb5c 1018 show_code_node(). */
6de9cd9a 1019
6c1abb5c
FXC
1020static void
1021show_code (int level, gfc_code *c)
6de9cd9a 1022{
6de9cd9a 1023 for (; c; c = c->next)
6c1abb5c 1024 show_code_node (level, c);
6de9cd9a
DN
1025}
1026
6c1abb5c 1027static void
f014c653 1028show_omp_namelist (int list_type, gfc_omp_namelist *n)
6c7a4dfd 1029{
dd2fc525
JJ
1030 for (; n; n = n->next)
1031 {
f014c653
JJ
1032 if (list_type == OMP_LIST_REDUCTION)
1033 switch (n->u.reduction_op)
1034 {
1035 case OMP_REDUCTION_PLUS:
1036 case OMP_REDUCTION_TIMES:
1037 case OMP_REDUCTION_MINUS:
1038 case OMP_REDUCTION_AND:
1039 case OMP_REDUCTION_OR:
1040 case OMP_REDUCTION_EQV:
1041 case OMP_REDUCTION_NEQV:
1042 fprintf (dumpfile, "%s:",
1043 gfc_op2string ((gfc_intrinsic_op) n->u.reduction_op));
1044 break;
1045 case OMP_REDUCTION_MAX: fputs ("max:", dumpfile); break;
1046 case OMP_REDUCTION_MIN: fputs ("min:", dumpfile); break;
1047 case OMP_REDUCTION_IAND: fputs ("iand:", dumpfile); break;
1048 case OMP_REDUCTION_IOR: fputs ("ior:", dumpfile); break;
1049 case OMP_REDUCTION_IEOR: fputs ("ieor:", dumpfile); break;
1050 case OMP_REDUCTION_USER:
1051 if (n->udr)
b46ebd6c 1052 fprintf (dumpfile, "%s:", n->udr->udr->name);
f014c653
JJ
1053 break;
1054 default: break;
1055 }
1056 else if (list_type == OMP_LIST_DEPEND)
1057 switch (n->u.depend_op)
1058 {
1059 case OMP_DEPEND_IN: fputs ("in:", dumpfile); break;
1060 case OMP_DEPEND_OUT: fputs ("out:", dumpfile); break;
1061 case OMP_DEPEND_INOUT: fputs ("inout:", dumpfile); break;
1062 default: break;
1063 }
1064 else if (list_type == OMP_LIST_MAP)
1065 switch (n->u.map_op)
1066 {
1067 case OMP_MAP_ALLOC: fputs ("alloc:", dumpfile); break;
1068 case OMP_MAP_TO: fputs ("to:", dumpfile); break;
1069 case OMP_MAP_FROM: fputs ("from:", dumpfile); break;
1070 case OMP_MAP_TOFROM: fputs ("tofrom:", dumpfile); break;
1071 default: break;
1072 }
dd2fc525
JJ
1073 fprintf (dumpfile, "%s", n->sym->name);
1074 if (n->expr)
1075 {
1076 fputc (':', dumpfile);
1077 show_expr (n->expr);
1078 }
1079 if (n->next)
1080 fputc (',', dumpfile);
1081 }
6c7a4dfd
JJ
1082}
1083
41dbbb37
TS
1084
1085/* Show OpenMP or OpenACC clauses. */
1086
1087static void
1088show_omp_clauses (gfc_omp_clauses *omp_clauses)
1089{
1090 int list_type;
1091
1092 switch (omp_clauses->cancel)
1093 {
1094 case OMP_CANCEL_UNKNOWN:
1095 break;
1096 case OMP_CANCEL_PARALLEL:
1097 fputs (" PARALLEL", dumpfile);
1098 break;
1099 case OMP_CANCEL_SECTIONS:
1100 fputs (" SECTIONS", dumpfile);
1101 break;
1102 case OMP_CANCEL_DO:
1103 fputs (" DO", dumpfile);
1104 break;
1105 case OMP_CANCEL_TASKGROUP:
1106 fputs (" TASKGROUP", dumpfile);
1107 break;
1108 }
1109 if (omp_clauses->if_expr)
1110 {
1111 fputs (" IF(", dumpfile);
1112 show_expr (omp_clauses->if_expr);
1113 fputc (')', dumpfile);
1114 }
1115 if (omp_clauses->final_expr)
1116 {
1117 fputs (" FINAL(", dumpfile);
1118 show_expr (omp_clauses->final_expr);
1119 fputc (')', dumpfile);
1120 }
1121 if (omp_clauses->num_threads)
1122 {
1123 fputs (" NUM_THREADS(", dumpfile);
1124 show_expr (omp_clauses->num_threads);
1125 fputc (')', dumpfile);
1126 }
1127 if (omp_clauses->async)
1128 {
1129 fputs (" ASYNC", dumpfile);
1130 if (omp_clauses->async_expr)
1131 {
1132 fputc ('(', dumpfile);
1133 show_expr (omp_clauses->async_expr);
1134 fputc (')', dumpfile);
1135 }
1136 }
1137 if (omp_clauses->num_gangs_expr)
1138 {
1139 fputs (" NUM_GANGS(", dumpfile);
1140 show_expr (omp_clauses->num_gangs_expr);
1141 fputc (')', dumpfile);
1142 }
1143 if (omp_clauses->num_workers_expr)
1144 {
1145 fputs (" NUM_WORKERS(", dumpfile);
1146 show_expr (omp_clauses->num_workers_expr);
1147 fputc (')', dumpfile);
1148 }
1149 if (omp_clauses->vector_length_expr)
1150 {
1151 fputs (" VECTOR_LENGTH(", dumpfile);
1152 show_expr (omp_clauses->vector_length_expr);
1153 fputc (')', dumpfile);
1154 }
1155 if (omp_clauses->gang)
1156 {
1157 fputs (" GANG", dumpfile);
2a70708e 1158 if (omp_clauses->gang_num_expr || omp_clauses->gang_static_expr)
41dbbb37
TS
1159 {
1160 fputc ('(', dumpfile);
2a70708e
CP
1161 if (omp_clauses->gang_num_expr)
1162 {
1163 fprintf (dumpfile, "num:");
1164 show_expr (omp_clauses->gang_num_expr);
1165 }
1166 if (omp_clauses->gang_num_expr && omp_clauses->gang_static)
1167 fputc (',', dumpfile);
1168 if (omp_clauses->gang_static)
1169 {
1170 fprintf (dumpfile, "static:");
1171 if (omp_clauses->gang_static_expr)
1172 show_expr (omp_clauses->gang_static_expr);
1173 else
1174 fputc ('*', dumpfile);
1175 }
41dbbb37
TS
1176 fputc (')', dumpfile);
1177 }
1178 }
1179 if (omp_clauses->worker)
1180 {
1181 fputs (" WORKER", dumpfile);
1182 if (omp_clauses->worker_expr)
1183 {
1184 fputc ('(', dumpfile);
1185 show_expr (omp_clauses->worker_expr);
1186 fputc (')', dumpfile);
1187 }
1188 }
1189 if (omp_clauses->vector)
1190 {
1191 fputs (" VECTOR", dumpfile);
1192 if (omp_clauses->vector_expr)
1193 {
1194 fputc ('(', dumpfile);
1195 show_expr (omp_clauses->vector_expr);
1196 fputc (')', dumpfile);
1197 }
1198 }
1199 if (omp_clauses->sched_kind != OMP_SCHED_NONE)
1200 {
1201 const char *type;
1202 switch (omp_clauses->sched_kind)
1203 {
1204 case OMP_SCHED_STATIC: type = "STATIC"; break;
1205 case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
1206 case OMP_SCHED_GUIDED: type = "GUIDED"; break;
1207 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
1208 case OMP_SCHED_AUTO: type = "AUTO"; break;
1209 default:
1210 gcc_unreachable ();
1211 }
1212 fprintf (dumpfile, " SCHEDULE (%s", type);
1213 if (omp_clauses->chunk_size)
1214 {
1215 fputc (',', dumpfile);
1216 show_expr (omp_clauses->chunk_size);
1217 }
1218 fputc (')', dumpfile);
1219 }
1220 if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
1221 {
1222 const char *type;
1223 switch (omp_clauses->default_sharing)
1224 {
1225 case OMP_DEFAULT_NONE: type = "NONE"; break;
1226 case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
1227 case OMP_DEFAULT_SHARED: type = "SHARED"; break;
1228 case OMP_DEFAULT_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1229 default:
1230 gcc_unreachable ();
1231 }
1232 fprintf (dumpfile, " DEFAULT(%s)", type);
1233 }
1234 if (omp_clauses->tile_list)
1235 {
1236 gfc_expr_list *list;
1237 fputs (" TILE(", dumpfile);
1238 for (list = omp_clauses->tile_list; list; list = list->next)
1239 {
1240 show_expr (list->expr);
dfd6231e 1241 if (list->next)
41dbbb37
TS
1242 fputs (", ", dumpfile);
1243 }
1244 fputc (')', dumpfile);
1245 }
1246 if (omp_clauses->wait_list)
1247 {
1248 gfc_expr_list *list;
1249 fputs (" WAIT(", dumpfile);
1250 for (list = omp_clauses->wait_list; list; list = list->next)
1251 {
1252 show_expr (list->expr);
dfd6231e 1253 if (list->next)
41dbbb37
TS
1254 fputs (", ", dumpfile);
1255 }
1256 fputc (')', dumpfile);
1257 }
1258 if (omp_clauses->seq)
1259 fputs (" SEQ", dumpfile);
1260 if (omp_clauses->independent)
1261 fputs (" INDEPENDENT", dumpfile);
1262 if (omp_clauses->ordered)
1263 fputs (" ORDERED", dumpfile);
1264 if (omp_clauses->untied)
1265 fputs (" UNTIED", dumpfile);
1266 if (omp_clauses->mergeable)
1267 fputs (" MERGEABLE", dumpfile);
1268 if (omp_clauses->collapse)
1269 fprintf (dumpfile, " COLLAPSE(%d)", omp_clauses->collapse);
1270 for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
1271 if (omp_clauses->lists[list_type] != NULL
1272 && list_type != OMP_LIST_COPYPRIVATE)
1273 {
1274 const char *type = NULL;
1275 switch (list_type)
1276 {
1277 case OMP_LIST_USE_DEVICE: type = "USE_DEVICE"; break;
1278 case OMP_LIST_DEVICE_RESIDENT: type = "USE_DEVICE"; break;
1279 case OMP_LIST_CACHE: type = ""; break;
1280 case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
1281 case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1282 case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
1283 case OMP_LIST_SHARED: type = "SHARED"; break;
1284 case OMP_LIST_COPYIN: type = "COPYIN"; break;
1285 case OMP_LIST_UNIFORM: type = "UNIFORM"; break;
1286 case OMP_LIST_ALIGNED: type = "ALIGNED"; break;
1287 case OMP_LIST_LINEAR: type = "LINEAR"; break;
1288 case OMP_LIST_REDUCTION: type = "REDUCTION"; break;
1289 case OMP_LIST_DEPEND: type = "DEPEND"; break;
1290 default:
1291 gcc_unreachable ();
1292 }
1293 fprintf (dumpfile, " %s(", type);
1294 show_omp_namelist (list_type, omp_clauses->lists[list_type]);
1295 fputc (')', dumpfile);
1296 }
1297 if (omp_clauses->safelen_expr)
1298 {
1299 fputs (" SAFELEN(", dumpfile);
1300 show_expr (omp_clauses->safelen_expr);
1301 fputc (')', dumpfile);
1302 }
1303 if (omp_clauses->simdlen_expr)
1304 {
1305 fputs (" SIMDLEN(", dumpfile);
1306 show_expr (omp_clauses->simdlen_expr);
1307 fputc (')', dumpfile);
1308 }
1309 if (omp_clauses->inbranch)
1310 fputs (" INBRANCH", dumpfile);
1311 if (omp_clauses->notinbranch)
1312 fputs (" NOTINBRANCH", dumpfile);
1313 if (omp_clauses->proc_bind != OMP_PROC_BIND_UNKNOWN)
1314 {
1315 const char *type;
1316 switch (omp_clauses->proc_bind)
1317 {
1318 case OMP_PROC_BIND_MASTER: type = "MASTER"; break;
1319 case OMP_PROC_BIND_SPREAD: type = "SPREAD"; break;
1320 case OMP_PROC_BIND_CLOSE: type = "CLOSE"; break;
1321 default:
1322 gcc_unreachable ();
1323 }
1324 fprintf (dumpfile, " PROC_BIND(%s)", type);
1325 }
1326 if (omp_clauses->num_teams)
1327 {
1328 fputs (" NUM_TEAMS(", dumpfile);
1329 show_expr (omp_clauses->num_teams);
1330 fputc (')', dumpfile);
1331 }
1332 if (omp_clauses->device)
1333 {
1334 fputs (" DEVICE(", dumpfile);
1335 show_expr (omp_clauses->device);
1336 fputc (')', dumpfile);
1337 }
1338 if (omp_clauses->thread_limit)
1339 {
1340 fputs (" THREAD_LIMIT(", dumpfile);
1341 show_expr (omp_clauses->thread_limit);
1342 fputc (')', dumpfile);
1343 }
1344 if (omp_clauses->dist_sched_kind != OMP_SCHED_NONE)
1345 {
1346 fprintf (dumpfile, " DIST_SCHEDULE (static");
1347 if (omp_clauses->dist_chunk_size)
1348 {
1349 fputc (',', dumpfile);
1350 show_expr (omp_clauses->dist_chunk_size);
1351 }
1352 fputc (')', dumpfile);
1353 }
1354}
1355
1356/* Show a single OpenMP or OpenACC directive node and everything underneath it
6c7a4dfd
JJ
1357 if necessary. */
1358
1359static void
6c1abb5c 1360show_omp_node (int level, gfc_code *c)
6c7a4dfd
JJ
1361{
1362 gfc_omp_clauses *omp_clauses = NULL;
1363 const char *name = NULL;
41dbbb37 1364 bool is_oacc = false;
6c7a4dfd
JJ
1365
1366 switch (c->op)
1367 {
41dbbb37
TS
1368 case EXEC_OACC_PARALLEL_LOOP: name = "PARALLEL LOOP"; is_oacc = true; break;
1369 case EXEC_OACC_PARALLEL: name = "PARALLEL"; is_oacc = true; break;
1370 case EXEC_OACC_KERNELS_LOOP: name = "KERNELS LOOP"; is_oacc = true; break;
1371 case EXEC_OACC_KERNELS: name = "KERNELS"; is_oacc = true; break;
1372 case EXEC_OACC_DATA: name = "DATA"; is_oacc = true; break;
1373 case EXEC_OACC_HOST_DATA: name = "HOST_DATA"; is_oacc = true; break;
1374 case EXEC_OACC_LOOP: name = "LOOP"; is_oacc = true; break;
1375 case EXEC_OACC_UPDATE: name = "UPDATE"; is_oacc = true; break;
1376 case EXEC_OACC_WAIT: name = "WAIT"; is_oacc = true; break;
1377 case EXEC_OACC_CACHE: name = "CACHE"; is_oacc = true; break;
1378 case EXEC_OACC_ENTER_DATA: name = "ENTER DATA"; is_oacc = true; break;
1379 case EXEC_OACC_EXIT_DATA: name = "EXIT DATA"; is_oacc = true; break;
6c7a4dfd
JJ
1380 case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
1381 case EXEC_OMP_BARRIER: name = "BARRIER"; break;
dd2fc525
JJ
1382 case EXEC_OMP_CANCEL: name = "CANCEL"; break;
1383 case EXEC_OMP_CANCELLATION_POINT: name = "CANCELLATION POINT"; break;
6c7a4dfd
JJ
1384 case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
1385 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
1386 case EXEC_OMP_DO: name = "DO"; break;
dd2fc525 1387 case EXEC_OMP_DO_SIMD: name = "DO SIMD"; break;
6c7a4dfd
JJ
1388 case EXEC_OMP_MASTER: name = "MASTER"; break;
1389 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
1390 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
1391 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
dd2fc525 1392 case EXEC_OMP_PARALLEL_DO_SIMD: name = "PARALLEL DO SIMD"; break;
6c7a4dfd
JJ
1393 case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
1394 case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
1395 case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
dd2fc525 1396 case EXEC_OMP_SIMD: name = "SIMD"; break;
6c7a4dfd 1397 case EXEC_OMP_SINGLE: name = "SINGLE"; break;
a68ab351 1398 case EXEC_OMP_TASK: name = "TASK"; break;
dd2fc525 1399 case EXEC_OMP_TASKGROUP: name = "TASKGROUP"; break;
a68ab351 1400 case EXEC_OMP_TASKWAIT: name = "TASKWAIT"; break;
20906c66 1401 case EXEC_OMP_TASKYIELD: name = "TASKYIELD"; break;
6c7a4dfd
JJ
1402 case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
1403 default:
1404 gcc_unreachable ();
1405 }
41dbbb37 1406 fprintf (dumpfile, "!$%s %s", is_oacc ? "ACC" : "OMP", name);
6c7a4dfd
JJ
1407 switch (c->op)
1408 {
41dbbb37
TS
1409 case EXEC_OACC_PARALLEL_LOOP:
1410 case EXEC_OACC_PARALLEL:
1411 case EXEC_OACC_KERNELS_LOOP:
1412 case EXEC_OACC_KERNELS:
1413 case EXEC_OACC_DATA:
1414 case EXEC_OACC_HOST_DATA:
1415 case EXEC_OACC_LOOP:
1416 case EXEC_OACC_UPDATE:
1417 case EXEC_OACC_WAIT:
1418 case EXEC_OACC_CACHE:
1419 case EXEC_OACC_ENTER_DATA:
1420 case EXEC_OACC_EXIT_DATA:
dd2fc525
JJ
1421 case EXEC_OMP_CANCEL:
1422 case EXEC_OMP_CANCELLATION_POINT:
6c7a4dfd 1423 case EXEC_OMP_DO:
dd2fc525 1424 case EXEC_OMP_DO_SIMD:
6c7a4dfd
JJ
1425 case EXEC_OMP_PARALLEL:
1426 case EXEC_OMP_PARALLEL_DO:
dd2fc525 1427 case EXEC_OMP_PARALLEL_DO_SIMD:
6c7a4dfd
JJ
1428 case EXEC_OMP_PARALLEL_SECTIONS:
1429 case EXEC_OMP_SECTIONS:
dd2fc525 1430 case EXEC_OMP_SIMD:
6c7a4dfd
JJ
1431 case EXEC_OMP_SINGLE:
1432 case EXEC_OMP_WORKSHARE:
1433 case EXEC_OMP_PARALLEL_WORKSHARE:
a68ab351 1434 case EXEC_OMP_TASK:
6c7a4dfd
JJ
1435 omp_clauses = c->ext.omp_clauses;
1436 break;
1437 case EXEC_OMP_CRITICAL:
1438 if (c->ext.omp_name)
6c1abb5c 1439 fprintf (dumpfile, " (%s)", c->ext.omp_name);
6c7a4dfd
JJ
1440 break;
1441 case EXEC_OMP_FLUSH:
1442 if (c->ext.omp_namelist)
1443 {
6c1abb5c 1444 fputs (" (", dumpfile);
f014c653 1445 show_omp_namelist (OMP_LIST_NUM, c->ext.omp_namelist);
6c1abb5c 1446 fputc (')', dumpfile);
6c7a4dfd
JJ
1447 }
1448 return;
1449 case EXEC_OMP_BARRIER:
a68ab351 1450 case EXEC_OMP_TASKWAIT:
20906c66 1451 case EXEC_OMP_TASKYIELD:
6c7a4dfd
JJ
1452 return;
1453 default:
1454 break;
1455 }
1456 if (omp_clauses)
41dbbb37 1457 show_omp_clauses (omp_clauses);
6c1abb5c 1458 fputc ('\n', dumpfile);
41dbbb37
TS
1459
1460 /* OpenACC executable directives don't have associated blocks. */
1461 if (c->op == EXEC_OACC_CACHE || c->op == EXEC_OACC_UPDATE
1462 || c->op == EXEC_OACC_ENTER_DATA || c->op == EXEC_OACC_EXIT_DATA)
1463 return;
6c7a4dfd
JJ
1464 if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
1465 {
1466 gfc_code *d = c->block;
1467 while (d != NULL)
1468 {
6c1abb5c 1469 show_code (level + 1, d->next);
6c7a4dfd
JJ
1470 if (d->block == NULL)
1471 break;
1472 code_indent (level, 0);
6c1abb5c 1473 fputs ("!$OMP SECTION\n", dumpfile);
6c7a4dfd
JJ
1474 d = d->block;
1475 }
1476 }
1477 else
6c1abb5c 1478 show_code (level + 1, c->block->next);
6c7a4dfd
JJ
1479 if (c->op == EXEC_OMP_ATOMIC)
1480 return;
dd2fc525 1481 fputc ('\n', dumpfile);
6c7a4dfd 1482 code_indent (level, 0);
41dbbb37 1483 fprintf (dumpfile, "!$%s END %s", is_oacc ? "ACC" : "OMP", name);
6c7a4dfd
JJ
1484 if (omp_clauses != NULL)
1485 {
1486 if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
1487 {
6c1abb5c 1488 fputs (" COPYPRIVATE(", dumpfile);
f014c653
JJ
1489 show_omp_namelist (OMP_LIST_COPYPRIVATE,
1490 omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
6c1abb5c 1491 fputc (')', dumpfile);
6c7a4dfd
JJ
1492 }
1493 else if (omp_clauses->nowait)
6c1abb5c 1494 fputs (" NOWAIT", dumpfile);
6c7a4dfd
JJ
1495 }
1496 else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
6c1abb5c 1497 fprintf (dumpfile, " (%s)", c->ext.omp_name);
6c7a4dfd 1498}
6de9cd9a 1499
636dff67 1500
6de9cd9a
DN
1501/* Show a single code node and everything underneath it if necessary. */
1502
1503static void
6c1abb5c 1504show_code_node (int level, gfc_code *c)
6de9cd9a
DN
1505{
1506 gfc_forall_iterator *fa;
1507 gfc_open *open;
1508 gfc_case *cp;
1509 gfc_alloc *a;
1510 gfc_code *d;
1511 gfc_close *close;
1512 gfc_filepos *fp;
1513 gfc_inquire *i;
1514 gfc_dt *dt;
c6c15a14 1515 gfc_namespace *ns;
6de9cd9a 1516
8cf8ca52
TK
1517 if (c->here)
1518 {
1519 fputc ('\n', dumpfile);
1520 code_indent (level, c->here);
1521 }
1522 else
1523 show_indent ();
6de9cd9a
DN
1524
1525 switch (c->op)
1526 {
5c71a5e0
TB
1527 case EXEC_END_PROCEDURE:
1528 break;
1529
6de9cd9a 1530 case EXEC_NOP:
6c1abb5c 1531 fputs ("NOP", dumpfile);
6de9cd9a
DN
1532 break;
1533
1534 case EXEC_CONTINUE:
6c1abb5c 1535 fputs ("CONTINUE", dumpfile);
6de9cd9a
DN
1536 break;
1537
3d79abbd 1538 case EXEC_ENTRY:
6c1abb5c 1539 fprintf (dumpfile, "ENTRY %s", c->ext.entry->sym->name);
3d79abbd
PB
1540 break;
1541
6b591ec0 1542 case EXEC_INIT_ASSIGN:
6de9cd9a 1543 case EXEC_ASSIGN:
6c1abb5c 1544 fputs ("ASSIGN ", dumpfile);
a513927a 1545 show_expr (c->expr1);
6c1abb5c
FXC
1546 fputc (' ', dumpfile);
1547 show_expr (c->expr2);
6de9cd9a 1548 break;
3d79abbd 1549
6de9cd9a 1550 case EXEC_LABEL_ASSIGN:
6c1abb5c 1551 fputs ("LABEL ASSIGN ", dumpfile);
a513927a 1552 show_expr (c->expr1);
79bd1948 1553 fprintf (dumpfile, " %d", c->label1->value);
6de9cd9a
DN
1554 break;
1555
1556 case EXEC_POINTER_ASSIGN:
6c1abb5c 1557 fputs ("POINTER ASSIGN ", dumpfile);
a513927a 1558 show_expr (c->expr1);
6c1abb5c
FXC
1559 fputc (' ', dumpfile);
1560 show_expr (c->expr2);
6de9cd9a
DN
1561 break;
1562
1563 case EXEC_GOTO:
6c1abb5c 1564 fputs ("GOTO ", dumpfile);
79bd1948
SK
1565 if (c->label1)
1566 fprintf (dumpfile, "%d", c->label1->value);
6de9cd9a 1567 else
636dff67 1568 {
a513927a 1569 show_expr (c->expr1);
636dff67
SK
1570 d = c->block;
1571 if (d != NULL)
1572 {
6c1abb5c 1573 fputs (", (", dumpfile);
636dff67
SK
1574 for (; d; d = d ->block)
1575 {
79bd1948 1576 code_indent (level, d->label1);
636dff67 1577 if (d->block != NULL)
6c1abb5c 1578 fputc (',', dumpfile);
636dff67 1579 else
6c1abb5c 1580 fputc (')', dumpfile);
636dff67
SK
1581 }
1582 }
1583 }
6de9cd9a
DN
1584 break;
1585
1586 case EXEC_CALL:
aa84a9a5 1587 case EXEC_ASSIGN_CALL:
bfaacea7 1588 if (c->resolved_sym)
6c1abb5c 1589 fprintf (dumpfile, "CALL %s ", c->resolved_sym->name);
bfaacea7 1590 else if (c->symtree)
6c1abb5c 1591 fprintf (dumpfile, "CALL %s ", c->symtree->name);
bfaacea7 1592 else
6c1abb5c 1593 fputs ("CALL ?? ", dumpfile);
bfaacea7 1594
6c1abb5c 1595 show_actual_arglist (c->ext.actual);
6de9cd9a
DN
1596 break;
1597
a64a8f2f
DK
1598 case EXEC_COMPCALL:
1599 fputs ("CALL ", dumpfile);
a513927a 1600 show_compcall (c->expr1);
a64a8f2f
DK
1601 break;
1602
713485cc
JW
1603 case EXEC_CALL_PPC:
1604 fputs ("CALL ", dumpfile);
a513927a 1605 show_expr (c->expr1);
713485cc
JW
1606 show_actual_arglist (c->ext.actual);
1607 break;
1608
6de9cd9a 1609 case EXEC_RETURN:
6c1abb5c 1610 fputs ("RETURN ", dumpfile);
a513927a
SK
1611 if (c->expr1)
1612 show_expr (c->expr1);
6de9cd9a
DN
1613 break;
1614
1615 case EXEC_PAUSE:
6c1abb5c 1616 fputs ("PAUSE ", dumpfile);
6de9cd9a 1617
a513927a
SK
1618 if (c->expr1 != NULL)
1619 show_expr (c->expr1);
6de9cd9a 1620 else
6c1abb5c 1621 fprintf (dumpfile, "%d", c->ext.stop_code);
6de9cd9a
DN
1622
1623 break;
1624
d0a4a61c
TB
1625 case EXEC_ERROR_STOP:
1626 fputs ("ERROR ", dumpfile);
1627 /* Fall through. */
1628
6de9cd9a 1629 case EXEC_STOP:
6c1abb5c 1630 fputs ("STOP ", dumpfile);
6de9cd9a 1631
a513927a
SK
1632 if (c->expr1 != NULL)
1633 show_expr (c->expr1);
6de9cd9a 1634 else
6c1abb5c 1635 fprintf (dumpfile, "%d", c->ext.stop_code);
6de9cd9a
DN
1636
1637 break;
1638
d0a4a61c
TB
1639 case EXEC_SYNC_ALL:
1640 fputs ("SYNC ALL ", dumpfile);
1641 if (c->expr2 != NULL)
1642 {
1643 fputs (" stat=", dumpfile);
1644 show_expr (c->expr2);
1645 }
1646 if (c->expr3 != NULL)
1647 {
1648 fputs (" errmsg=", dumpfile);
1649 show_expr (c->expr3);
1650 }
1651 break;
1652
1653 case EXEC_SYNC_MEMORY:
1654 fputs ("SYNC MEMORY ", dumpfile);
1655 if (c->expr2 != NULL)
1656 {
1657 fputs (" stat=", dumpfile);
1658 show_expr (c->expr2);
1659 }
1660 if (c->expr3 != NULL)
1661 {
1662 fputs (" errmsg=", dumpfile);
1663 show_expr (c->expr3);
1664 }
1665 break;
1666
1667 case EXEC_SYNC_IMAGES:
1668 fputs ("SYNC IMAGES image-set=", dumpfile);
1669 if (c->expr1 != NULL)
1670 show_expr (c->expr1);
1671 else
1672 fputs ("* ", dumpfile);
1673 if (c->expr2 != NULL)
1674 {
1675 fputs (" stat=", dumpfile);
1676 show_expr (c->expr2);
1677 }
1678 if (c->expr3 != NULL)
1679 {
1680 fputs (" errmsg=", dumpfile);
1681 show_expr (c->expr3);
1682 }
1683 break;
1684
5df445a2
TB
1685 case EXEC_EVENT_POST:
1686 case EXEC_EVENT_WAIT:
1687 if (c->op == EXEC_EVENT_POST)
1688 fputs ("EVENT POST ", dumpfile);
1689 else
1690 fputs ("EVENT WAIT ", dumpfile);
1691
1692 fputs ("event-variable=", dumpfile);
1693 if (c->expr1 != NULL)
1694 show_expr (c->expr1);
1695 if (c->expr4 != NULL)
1696 {
1697 fputs (" until_count=", dumpfile);
1698 show_expr (c->expr4);
1699 }
1700 if (c->expr2 != NULL)
1701 {
1702 fputs (" stat=", dumpfile);
1703 show_expr (c->expr2);
1704 }
1705 if (c->expr3 != NULL)
1706 {
1707 fputs (" errmsg=", dumpfile);
1708 show_expr (c->expr3);
1709 }
1710 break;
1711
5493aa17
TB
1712 case EXEC_LOCK:
1713 case EXEC_UNLOCK:
1714 if (c->op == EXEC_LOCK)
1715 fputs ("LOCK ", dumpfile);
1716 else
1717 fputs ("UNLOCK ", dumpfile);
1718
1719 fputs ("lock-variable=", dumpfile);
1720 if (c->expr1 != NULL)
1721 show_expr (c->expr1);
1722 if (c->expr4 != NULL)
1723 {
1724 fputs (" acquired_lock=", dumpfile);
1725 show_expr (c->expr4);
1726 }
1727 if (c->expr2 != NULL)
1728 {
1729 fputs (" stat=", dumpfile);
1730 show_expr (c->expr2);
1731 }
1732 if (c->expr3 != NULL)
1733 {
1734 fputs (" errmsg=", dumpfile);
1735 show_expr (c->expr3);
1736 }
1737 break;
1738
6de9cd9a 1739 case EXEC_ARITHMETIC_IF:
6c1abb5c 1740 fputs ("IF ", dumpfile);
a513927a 1741 show_expr (c->expr1);
6c1abb5c 1742 fprintf (dumpfile, " %d, %d, %d",
79bd1948 1743 c->label1->value, c->label2->value, c->label3->value);
6de9cd9a
DN
1744 break;
1745
1746 case EXEC_IF:
1747 d = c->block;
6c1abb5c 1748 fputs ("IF ", dumpfile);
a513927a 1749 show_expr (d->expr1);
8cf8ca52
TK
1750
1751 ++show_level;
6c1abb5c 1752 show_code (level + 1, d->next);
8cf8ca52 1753 --show_level;
6de9cd9a
DN
1754
1755 d = d->block;
1756 for (; d; d = d->block)
1757 {
1758 code_indent (level, 0);
1759
a513927a 1760 if (d->expr1 == NULL)
8cf8ca52 1761 fputs ("ELSE", dumpfile);
6de9cd9a
DN
1762 else
1763 {
6c1abb5c 1764 fputs ("ELSE IF ", dumpfile);
a513927a 1765 show_expr (d->expr1);
6de9cd9a
DN
1766 }
1767
8cf8ca52 1768 ++show_level;
6c1abb5c 1769 show_code (level + 1, d->next);
8cf8ca52 1770 --show_level;
6de9cd9a
DN
1771 }
1772
8cf8ca52
TK
1773 if (c->label1)
1774 code_indent (level, c->label1);
1775 else
1776 show_indent ();
6de9cd9a 1777
6c1abb5c 1778 fputs ("ENDIF", dumpfile);
6de9cd9a
DN
1779 break;
1780
c6c15a14 1781 case EXEC_BLOCK:
7ed979b9
DK
1782 {
1783 const char* blocktype;
03cf9837 1784 gfc_namespace *saved_ns;
3070e826 1785 gfc_association_list *alist;
03cf9837 1786
7ed979b9
DK
1787 if (c->ext.block.assoc)
1788 blocktype = "ASSOCIATE";
1789 else
1790 blocktype = "BLOCK";
1791 show_indent ();
1792 fprintf (dumpfile, "%s ", blocktype);
3070e826
TK
1793 for (alist = c->ext.block.assoc; alist; alist = alist->next)
1794 {
1795 fprintf (dumpfile, " %s = ", alist->name);
1796 show_expr (alist->target);
1797 }
1798
8cf8ca52 1799 ++show_level;
7ed979b9 1800 ns = c->ext.block.ns;
03cf9837
TK
1801 saved_ns = gfc_current_ns;
1802 gfc_current_ns = ns;
8cf8ca52 1803 gfc_traverse_symtree (ns->sym_root, show_symtree);
03cf9837 1804 gfc_current_ns = saved_ns;
8cf8ca52
TK
1805 show_code (show_level, ns->code);
1806 --show_level;
7ed979b9
DK
1807 show_indent ();
1808 fprintf (dumpfile, "END %s ", blocktype);
1809 break;
1810 }
c6c15a14 1811
3070e826
TK
1812 case EXEC_END_BLOCK:
1813 /* Only come here when there is a label on an
1814 END ASSOCIATE construct. */
1815 break;
1816
6de9cd9a 1817 case EXEC_SELECT:
dfd6231e 1818 case EXEC_SELECT_TYPE:
6de9cd9a 1819 d = c->block;
dfd6231e
PT
1820 if (c->op == EXEC_SELECT_TYPE)
1821 fputs ("SELECT TYPE", dumpfile);
1822 else
1823 fputs ("SELECT CASE ", dumpfile);
a513927a 1824 show_expr (c->expr1);
6c1abb5c 1825 fputc ('\n', dumpfile);
6de9cd9a
DN
1826
1827 for (; d; d = d->block)
1828 {
1829 code_indent (level, 0);
1830
6c1abb5c 1831 fputs ("CASE ", dumpfile);
29a63d67 1832 for (cp = d->ext.block.case_list; cp; cp = cp->next)
6de9cd9a 1833 {
6c1abb5c
FXC
1834 fputc ('(', dumpfile);
1835 show_expr (cp->low);
1836 fputc (' ', dumpfile);
1837 show_expr (cp->high);
1838 fputc (')', dumpfile);
1839 fputc (' ', dumpfile);
6de9cd9a 1840 }
6c1abb5c 1841 fputc ('\n', dumpfile);
6de9cd9a 1842
6c1abb5c 1843 show_code (level + 1, d->next);
6de9cd9a
DN
1844 }
1845
79bd1948 1846 code_indent (level, c->label1);
6c1abb5c 1847 fputs ("END SELECT", dumpfile);
6de9cd9a
DN
1848 break;
1849
1850 case EXEC_WHERE:
6c1abb5c 1851 fputs ("WHERE ", dumpfile);
6de9cd9a
DN
1852
1853 d = c->block;
a513927a 1854 show_expr (d->expr1);
6c1abb5c 1855 fputc ('\n', dumpfile);
6de9cd9a 1856
6c1abb5c 1857 show_code (level + 1, d->next);
6de9cd9a
DN
1858
1859 for (d = d->block; d; d = d->block)
1860 {
1861 code_indent (level, 0);
6c1abb5c 1862 fputs ("ELSE WHERE ", dumpfile);
a513927a 1863 show_expr (d->expr1);
6c1abb5c
FXC
1864 fputc ('\n', dumpfile);
1865 show_code (level + 1, d->next);
6de9cd9a
DN
1866 }
1867
1868 code_indent (level, 0);
6c1abb5c 1869 fputs ("END WHERE", dumpfile);
6de9cd9a
DN
1870 break;
1871
1872
1873 case EXEC_FORALL:
6c1abb5c 1874 fputs ("FORALL ", dumpfile);
6de9cd9a
DN
1875 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1876 {
6c1abb5c
FXC
1877 show_expr (fa->var);
1878 fputc (' ', dumpfile);
1879 show_expr (fa->start);
1880 fputc (':', dumpfile);
1881 show_expr (fa->end);
1882 fputc (':', dumpfile);
1883 show_expr (fa->stride);
6de9cd9a
DN
1884
1885 if (fa->next != NULL)
6c1abb5c 1886 fputc (',', dumpfile);
6de9cd9a
DN
1887 }
1888
a513927a 1889 if (c->expr1 != NULL)
6de9cd9a 1890 {
6c1abb5c 1891 fputc (',', dumpfile);
a513927a 1892 show_expr (c->expr1);
6de9cd9a 1893 }
6c1abb5c 1894 fputc ('\n', dumpfile);
6de9cd9a 1895
6c1abb5c 1896 show_code (level + 1, c->block->next);
6de9cd9a
DN
1897
1898 code_indent (level, 0);
6c1abb5c 1899 fputs ("END FORALL", dumpfile);
6de9cd9a
DN
1900 break;
1901
d0a4a61c
TB
1902 case EXEC_CRITICAL:
1903 fputs ("CRITICAL\n", dumpfile);
1904 show_code (level + 1, c->block->next);
1905 code_indent (level, 0);
1906 fputs ("END CRITICAL", dumpfile);
1907 break;
1908
6de9cd9a 1909 case EXEC_DO:
6c1abb5c 1910 fputs ("DO ", dumpfile);
8cf8ca52
TK
1911 if (c->label1)
1912 fprintf (dumpfile, " %-5d ", c->label1->value);
6de9cd9a 1913
6c1abb5c
FXC
1914 show_expr (c->ext.iterator->var);
1915 fputc ('=', dumpfile);
1916 show_expr (c->ext.iterator->start);
1917 fputc (' ', dumpfile);
1918 show_expr (c->ext.iterator->end);
1919 fputc (' ', dumpfile);
1920 show_expr (c->ext.iterator->step);
6de9cd9a 1921
8cf8ca52 1922 ++show_level;
6c1abb5c 1923 show_code (level + 1, c->block->next);
8cf8ca52 1924 --show_level;
6de9cd9a 1925
8cf8ca52
TK
1926 if (c->label1)
1927 break;
1928
1929 show_indent ();
6c1abb5c 1930 fputs ("END DO", dumpfile);
6de9cd9a
DN
1931 break;
1932
8c6a85e3
TB
1933 case EXEC_DO_CONCURRENT:
1934 fputs ("DO CONCURRENT ", dumpfile);
1935 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1936 {
1937 show_expr (fa->var);
1938 fputc (' ', dumpfile);
1939 show_expr (fa->start);
1940 fputc (':', dumpfile);
1941 show_expr (fa->end);
1942 fputc (':', dumpfile);
1943 show_expr (fa->stride);
1944
1945 if (fa->next != NULL)
1946 fputc (',', dumpfile);
1947 }
1948 show_expr (c->expr1);
1949
1950 show_code (level + 1, c->block->next);
1951 code_indent (level, c->label1);
1952 fputs ("END DO", dumpfile);
1953 break;
1954
6de9cd9a 1955 case EXEC_DO_WHILE:
6c1abb5c 1956 fputs ("DO WHILE ", dumpfile);
a513927a 1957 show_expr (c->expr1);
6c1abb5c 1958 fputc ('\n', dumpfile);
6de9cd9a 1959
6c1abb5c 1960 show_code (level + 1, c->block->next);
6de9cd9a 1961
79bd1948 1962 code_indent (level, c->label1);
6c1abb5c 1963 fputs ("END DO", dumpfile);
6de9cd9a
DN
1964 break;
1965
1966 case EXEC_CYCLE:
6c1abb5c 1967 fputs ("CYCLE", dumpfile);
6de9cd9a 1968 if (c->symtree)
6c1abb5c 1969 fprintf (dumpfile, " %s", c->symtree->n.sym->name);
6de9cd9a
DN
1970 break;
1971
1972 case EXEC_EXIT:
6c1abb5c 1973 fputs ("EXIT", dumpfile);
6de9cd9a 1974 if (c->symtree)
6c1abb5c 1975 fprintf (dumpfile, " %s", c->symtree->n.sym->name);
6de9cd9a
DN
1976 break;
1977
1978 case EXEC_ALLOCATE:
6c1abb5c 1979 fputs ("ALLOCATE ", dumpfile);
a513927a 1980 if (c->expr1)
6de9cd9a 1981 {
6c1abb5c 1982 fputs (" STAT=", dumpfile);
a513927a 1983 show_expr (c->expr1);
6de9cd9a
DN
1984 }
1985
0511ddbb
SK
1986 if (c->expr2)
1987 {
1988 fputs (" ERRMSG=", dumpfile);
1989 show_expr (c->expr2);
1990 }
1991
fabb6f8e
PT
1992 if (c->expr3)
1993 {
1994 if (c->expr3->mold)
1995 fputs (" MOLD=", dumpfile);
1996 else
1997 fputs (" SOURCE=", dumpfile);
1998 show_expr (c->expr3);
1999 }
2000
cf2b3c22 2001 for (a = c->ext.alloc.list; a; a = a->next)
6de9cd9a 2002 {
6c1abb5c
FXC
2003 fputc (' ', dumpfile);
2004 show_expr (a->expr);
6de9cd9a
DN
2005 }
2006
2007 break;
2008
2009 case EXEC_DEALLOCATE:
6c1abb5c 2010 fputs ("DEALLOCATE ", dumpfile);
a513927a 2011 if (c->expr1)
6de9cd9a 2012 {
6c1abb5c 2013 fputs (" STAT=", dumpfile);
a513927a 2014 show_expr (c->expr1);
6de9cd9a
DN
2015 }
2016
0511ddbb
SK
2017 if (c->expr2)
2018 {
2019 fputs (" ERRMSG=", dumpfile);
2020 show_expr (c->expr2);
2021 }
2022
cf2b3c22 2023 for (a = c->ext.alloc.list; a; a = a->next)
6de9cd9a 2024 {
6c1abb5c
FXC
2025 fputc (' ', dumpfile);
2026 show_expr (a->expr);
6de9cd9a
DN
2027 }
2028
2029 break;
2030
2031 case EXEC_OPEN:
6c1abb5c 2032 fputs ("OPEN", dumpfile);
6de9cd9a
DN
2033 open = c->ext.open;
2034
2035 if (open->unit)
2036 {
6c1abb5c
FXC
2037 fputs (" UNIT=", dumpfile);
2038 show_expr (open->unit);
6de9cd9a 2039 }
7aba8abe
TK
2040 if (open->iomsg)
2041 {
6c1abb5c
FXC
2042 fputs (" IOMSG=", dumpfile);
2043 show_expr (open->iomsg);
7aba8abe 2044 }
6de9cd9a
DN
2045 if (open->iostat)
2046 {
6c1abb5c
FXC
2047 fputs (" IOSTAT=", dumpfile);
2048 show_expr (open->iostat);
6de9cd9a
DN
2049 }
2050 if (open->file)
2051 {
6c1abb5c
FXC
2052 fputs (" FILE=", dumpfile);
2053 show_expr (open->file);
6de9cd9a
DN
2054 }
2055 if (open->status)
2056 {
6c1abb5c
FXC
2057 fputs (" STATUS=", dumpfile);
2058 show_expr (open->status);
6de9cd9a
DN
2059 }
2060 if (open->access)
2061 {
6c1abb5c
FXC
2062 fputs (" ACCESS=", dumpfile);
2063 show_expr (open->access);
6de9cd9a
DN
2064 }
2065 if (open->form)
2066 {
6c1abb5c
FXC
2067 fputs (" FORM=", dumpfile);
2068 show_expr (open->form);
6de9cd9a
DN
2069 }
2070 if (open->recl)
2071 {
6c1abb5c
FXC
2072 fputs (" RECL=", dumpfile);
2073 show_expr (open->recl);
6de9cd9a
DN
2074 }
2075 if (open->blank)
2076 {
6c1abb5c
FXC
2077 fputs (" BLANK=", dumpfile);
2078 show_expr (open->blank);
6de9cd9a
DN
2079 }
2080 if (open->position)
2081 {
6c1abb5c
FXC
2082 fputs (" POSITION=", dumpfile);
2083 show_expr (open->position);
6de9cd9a
DN
2084 }
2085 if (open->action)
2086 {
6c1abb5c
FXC
2087 fputs (" ACTION=", dumpfile);
2088 show_expr (open->action);
6de9cd9a
DN
2089 }
2090 if (open->delim)
2091 {
6c1abb5c
FXC
2092 fputs (" DELIM=", dumpfile);
2093 show_expr (open->delim);
6de9cd9a
DN
2094 }
2095 if (open->pad)
2096 {
6c1abb5c
FXC
2097 fputs (" PAD=", dumpfile);
2098 show_expr (open->pad);
6de9cd9a 2099 }
6f0f0b2e
JD
2100 if (open->decimal)
2101 {
6c1abb5c
FXC
2102 fputs (" DECIMAL=", dumpfile);
2103 show_expr (open->decimal);
6f0f0b2e
JD
2104 }
2105 if (open->encoding)
2106 {
6c1abb5c
FXC
2107 fputs (" ENCODING=", dumpfile);
2108 show_expr (open->encoding);
6f0f0b2e
JD
2109 }
2110 if (open->round)
2111 {
6c1abb5c
FXC
2112 fputs (" ROUND=", dumpfile);
2113 show_expr (open->round);
6f0f0b2e
JD
2114 }
2115 if (open->sign)
2116 {
6c1abb5c
FXC
2117 fputs (" SIGN=", dumpfile);
2118 show_expr (open->sign);
6f0f0b2e 2119 }
181c9f4a
TK
2120 if (open->convert)
2121 {
6c1abb5c
FXC
2122 fputs (" CONVERT=", dumpfile);
2123 show_expr (open->convert);
181c9f4a 2124 }
6f0f0b2e
JD
2125 if (open->asynchronous)
2126 {
6c1abb5c
FXC
2127 fputs (" ASYNCHRONOUS=", dumpfile);
2128 show_expr (open->asynchronous);
6f0f0b2e 2129 }
6de9cd9a 2130 if (open->err != NULL)
6c1abb5c 2131 fprintf (dumpfile, " ERR=%d", open->err->value);
6de9cd9a
DN
2132
2133 break;
2134
2135 case EXEC_CLOSE:
6c1abb5c 2136 fputs ("CLOSE", dumpfile);
6de9cd9a
DN
2137 close = c->ext.close;
2138
2139 if (close->unit)
2140 {
6c1abb5c
FXC
2141 fputs (" UNIT=", dumpfile);
2142 show_expr (close->unit);
6de9cd9a 2143 }
7aba8abe
TK
2144 if (close->iomsg)
2145 {
6c1abb5c
FXC
2146 fputs (" IOMSG=", dumpfile);
2147 show_expr (close->iomsg);
7aba8abe 2148 }
6de9cd9a
DN
2149 if (close->iostat)
2150 {
6c1abb5c
FXC
2151 fputs (" IOSTAT=", dumpfile);
2152 show_expr (close->iostat);
6de9cd9a
DN
2153 }
2154 if (close->status)
2155 {
6c1abb5c
FXC
2156 fputs (" STATUS=", dumpfile);
2157 show_expr (close->status);
6de9cd9a
DN
2158 }
2159 if (close->err != NULL)
6c1abb5c 2160 fprintf (dumpfile, " ERR=%d", close->err->value);
6de9cd9a
DN
2161 break;
2162
2163 case EXEC_BACKSPACE:
6c1abb5c 2164 fputs ("BACKSPACE", dumpfile);
6de9cd9a
DN
2165 goto show_filepos;
2166
2167 case EXEC_ENDFILE:
6c1abb5c 2168 fputs ("ENDFILE", dumpfile);
6de9cd9a
DN
2169 goto show_filepos;
2170
2171 case EXEC_REWIND:
6c1abb5c 2172 fputs ("REWIND", dumpfile);
6403ec5f
JB
2173 goto show_filepos;
2174
2175 case EXEC_FLUSH:
6c1abb5c 2176 fputs ("FLUSH", dumpfile);
6de9cd9a
DN
2177
2178 show_filepos:
2179 fp = c->ext.filepos;
2180
2181 if (fp->unit)
2182 {
6c1abb5c
FXC
2183 fputs (" UNIT=", dumpfile);
2184 show_expr (fp->unit);
6de9cd9a 2185 }
7aba8abe
TK
2186 if (fp->iomsg)
2187 {
6c1abb5c
FXC
2188 fputs (" IOMSG=", dumpfile);
2189 show_expr (fp->iomsg);
7aba8abe 2190 }
6de9cd9a
DN
2191 if (fp->iostat)
2192 {
6c1abb5c
FXC
2193 fputs (" IOSTAT=", dumpfile);
2194 show_expr (fp->iostat);
6de9cd9a
DN
2195 }
2196 if (fp->err != NULL)
6c1abb5c 2197 fprintf (dumpfile, " ERR=%d", fp->err->value);
6de9cd9a
DN
2198 break;
2199
2200 case EXEC_INQUIRE:
6c1abb5c 2201 fputs ("INQUIRE", dumpfile);
6de9cd9a
DN
2202 i = c->ext.inquire;
2203
2204 if (i->unit)
2205 {
6c1abb5c
FXC
2206 fputs (" UNIT=", dumpfile);
2207 show_expr (i->unit);
6de9cd9a
DN
2208 }
2209 if (i->file)
2210 {
6c1abb5c
FXC
2211 fputs (" FILE=", dumpfile);
2212 show_expr (i->file);
6de9cd9a
DN
2213 }
2214
7aba8abe
TK
2215 if (i->iomsg)
2216 {
6c1abb5c
FXC
2217 fputs (" IOMSG=", dumpfile);
2218 show_expr (i->iomsg);
7aba8abe 2219 }
6de9cd9a
DN
2220 if (i->iostat)
2221 {
6c1abb5c
FXC
2222 fputs (" IOSTAT=", dumpfile);
2223 show_expr (i->iostat);
6de9cd9a
DN
2224 }
2225 if (i->exist)
2226 {
6c1abb5c
FXC
2227 fputs (" EXIST=", dumpfile);
2228 show_expr (i->exist);
6de9cd9a
DN
2229 }
2230 if (i->opened)
2231 {
6c1abb5c
FXC
2232 fputs (" OPENED=", dumpfile);
2233 show_expr (i->opened);
6de9cd9a
DN
2234 }
2235 if (i->number)
2236 {
6c1abb5c
FXC
2237 fputs (" NUMBER=", dumpfile);
2238 show_expr (i->number);
6de9cd9a
DN
2239 }
2240 if (i->named)
2241 {
6c1abb5c
FXC
2242 fputs (" NAMED=", dumpfile);
2243 show_expr (i->named);
6de9cd9a
DN
2244 }
2245 if (i->name)
2246 {
6c1abb5c
FXC
2247 fputs (" NAME=", dumpfile);
2248 show_expr (i->name);
6de9cd9a
DN
2249 }
2250 if (i->access)
2251 {
6c1abb5c
FXC
2252 fputs (" ACCESS=", dumpfile);
2253 show_expr (i->access);
6de9cd9a
DN
2254 }
2255 if (i->sequential)
2256 {
6c1abb5c
FXC
2257 fputs (" SEQUENTIAL=", dumpfile);
2258 show_expr (i->sequential);
6de9cd9a
DN
2259 }
2260
2261 if (i->direct)
2262 {
6c1abb5c
FXC
2263 fputs (" DIRECT=", dumpfile);
2264 show_expr (i->direct);
6de9cd9a
DN
2265 }
2266 if (i->form)
2267 {
6c1abb5c
FXC
2268 fputs (" FORM=", dumpfile);
2269 show_expr (i->form);
6de9cd9a
DN
2270 }
2271 if (i->formatted)
2272 {
6c1abb5c
FXC
2273 fputs (" FORMATTED", dumpfile);
2274 show_expr (i->formatted);
6de9cd9a
DN
2275 }
2276 if (i->unformatted)
2277 {
6c1abb5c
FXC
2278 fputs (" UNFORMATTED=", dumpfile);
2279 show_expr (i->unformatted);
6de9cd9a
DN
2280 }
2281 if (i->recl)
2282 {
6c1abb5c
FXC
2283 fputs (" RECL=", dumpfile);
2284 show_expr (i->recl);
6de9cd9a
DN
2285 }
2286 if (i->nextrec)
2287 {
6c1abb5c
FXC
2288 fputs (" NEXTREC=", dumpfile);
2289 show_expr (i->nextrec);
6de9cd9a
DN
2290 }
2291 if (i->blank)
2292 {
6c1abb5c
FXC
2293 fputs (" BLANK=", dumpfile);
2294 show_expr (i->blank);
6de9cd9a
DN
2295 }
2296 if (i->position)
2297 {
6c1abb5c
FXC
2298 fputs (" POSITION=", dumpfile);
2299 show_expr (i->position);
6de9cd9a
DN
2300 }
2301 if (i->action)
2302 {
6c1abb5c
FXC
2303 fputs (" ACTION=", dumpfile);
2304 show_expr (i->action);
6de9cd9a
DN
2305 }
2306 if (i->read)
2307 {
6c1abb5c
FXC
2308 fputs (" READ=", dumpfile);
2309 show_expr (i->read);
6de9cd9a
DN
2310 }
2311 if (i->write)
2312 {
6c1abb5c
FXC
2313 fputs (" WRITE=", dumpfile);
2314 show_expr (i->write);
6de9cd9a
DN
2315 }
2316 if (i->readwrite)
2317 {
6c1abb5c
FXC
2318 fputs (" READWRITE=", dumpfile);
2319 show_expr (i->readwrite);
6de9cd9a
DN
2320 }
2321 if (i->delim)
2322 {
6c1abb5c
FXC
2323 fputs (" DELIM=", dumpfile);
2324 show_expr (i->delim);
6de9cd9a
DN
2325 }
2326 if (i->pad)
2327 {
6c1abb5c
FXC
2328 fputs (" PAD=", dumpfile);
2329 show_expr (i->pad);
6de9cd9a 2330 }
181c9f4a
TK
2331 if (i->convert)
2332 {
6c1abb5c
FXC
2333 fputs (" CONVERT=", dumpfile);
2334 show_expr (i->convert);
181c9f4a 2335 }
6f0f0b2e
JD
2336 if (i->asynchronous)
2337 {
6c1abb5c
FXC
2338 fputs (" ASYNCHRONOUS=", dumpfile);
2339 show_expr (i->asynchronous);
6f0f0b2e
JD
2340 }
2341 if (i->decimal)
2342 {
6c1abb5c
FXC
2343 fputs (" DECIMAL=", dumpfile);
2344 show_expr (i->decimal);
6f0f0b2e
JD
2345 }
2346 if (i->encoding)
2347 {
6c1abb5c
FXC
2348 fputs (" ENCODING=", dumpfile);
2349 show_expr (i->encoding);
6f0f0b2e
JD
2350 }
2351 if (i->pending)
2352 {
6c1abb5c
FXC
2353 fputs (" PENDING=", dumpfile);
2354 show_expr (i->pending);
6f0f0b2e
JD
2355 }
2356 if (i->round)
2357 {
6c1abb5c
FXC
2358 fputs (" ROUND=", dumpfile);
2359 show_expr (i->round);
6f0f0b2e
JD
2360 }
2361 if (i->sign)
2362 {
6c1abb5c
FXC
2363 fputs (" SIGN=", dumpfile);
2364 show_expr (i->sign);
6f0f0b2e
JD
2365 }
2366 if (i->size)
2367 {
6c1abb5c
FXC
2368 fputs (" SIZE=", dumpfile);
2369 show_expr (i->size);
6f0f0b2e
JD
2370 }
2371 if (i->id)
2372 {
6c1abb5c
FXC
2373 fputs (" ID=", dumpfile);
2374 show_expr (i->id);
6f0f0b2e 2375 }
6de9cd9a
DN
2376
2377 if (i->err != NULL)
6c1abb5c 2378 fprintf (dumpfile, " ERR=%d", i->err->value);
6de9cd9a
DN
2379 break;
2380
2381 case EXEC_IOLENGTH:
6c1abb5c 2382 fputs ("IOLENGTH ", dumpfile);
a513927a 2383 show_expr (c->expr1);
5e805e44 2384 goto show_dt_code;
6de9cd9a
DN
2385 break;
2386
2387 case EXEC_READ:
6c1abb5c 2388 fputs ("READ", dumpfile);
6de9cd9a
DN
2389 goto show_dt;
2390
2391 case EXEC_WRITE:
6c1abb5c 2392 fputs ("WRITE", dumpfile);
6de9cd9a
DN
2393
2394 show_dt:
2395 dt = c->ext.dt;
2396 if (dt->io_unit)
2397 {
6c1abb5c
FXC
2398 fputs (" UNIT=", dumpfile);
2399 show_expr (dt->io_unit);
6de9cd9a
DN
2400 }
2401
2402 if (dt->format_expr)
2403 {
6c1abb5c
FXC
2404 fputs (" FMT=", dumpfile);
2405 show_expr (dt->format_expr);
6de9cd9a
DN
2406 }
2407
2408 if (dt->format_label != NULL)
6c1abb5c 2409 fprintf (dumpfile, " FMT=%d", dt->format_label->value);
6de9cd9a 2410 if (dt->namelist)
6c1abb5c 2411 fprintf (dumpfile, " NML=%s", dt->namelist->name);
7aba8abe
TK
2412
2413 if (dt->iomsg)
2414 {
6c1abb5c
FXC
2415 fputs (" IOMSG=", dumpfile);
2416 show_expr (dt->iomsg);
7aba8abe 2417 }
6de9cd9a
DN
2418 if (dt->iostat)
2419 {
6c1abb5c
FXC
2420 fputs (" IOSTAT=", dumpfile);
2421 show_expr (dt->iostat);
6de9cd9a
DN
2422 }
2423 if (dt->size)
2424 {
6c1abb5c
FXC
2425 fputs (" SIZE=", dumpfile);
2426 show_expr (dt->size);
6de9cd9a
DN
2427 }
2428 if (dt->rec)
2429 {
6c1abb5c
FXC
2430 fputs (" REC=", dumpfile);
2431 show_expr (dt->rec);
6de9cd9a
DN
2432 }
2433 if (dt->advance)
2434 {
6c1abb5c
FXC
2435 fputs (" ADVANCE=", dumpfile);
2436 show_expr (dt->advance);
6de9cd9a 2437 }
6f0f0b2e
JD
2438 if (dt->id)
2439 {
6c1abb5c
FXC
2440 fputs (" ID=", dumpfile);
2441 show_expr (dt->id);
6f0f0b2e
JD
2442 }
2443 if (dt->pos)
2444 {
6c1abb5c
FXC
2445 fputs (" POS=", dumpfile);
2446 show_expr (dt->pos);
6f0f0b2e
JD
2447 }
2448 if (dt->asynchronous)
2449 {
6c1abb5c
FXC
2450 fputs (" ASYNCHRONOUS=", dumpfile);
2451 show_expr (dt->asynchronous);
6f0f0b2e
JD
2452 }
2453 if (dt->blank)
2454 {
6c1abb5c
FXC
2455 fputs (" BLANK=", dumpfile);
2456 show_expr (dt->blank);
6f0f0b2e
JD
2457 }
2458 if (dt->decimal)
2459 {
6c1abb5c
FXC
2460 fputs (" DECIMAL=", dumpfile);
2461 show_expr (dt->decimal);
6f0f0b2e
JD
2462 }
2463 if (dt->delim)
2464 {
6c1abb5c
FXC
2465 fputs (" DELIM=", dumpfile);
2466 show_expr (dt->delim);
6f0f0b2e
JD
2467 }
2468 if (dt->pad)
2469 {
6c1abb5c
FXC
2470 fputs (" PAD=", dumpfile);
2471 show_expr (dt->pad);
6f0f0b2e
JD
2472 }
2473 if (dt->round)
2474 {
6c1abb5c
FXC
2475 fputs (" ROUND=", dumpfile);
2476 show_expr (dt->round);
6f0f0b2e
JD
2477 }
2478 if (dt->sign)
2479 {
6c1abb5c
FXC
2480 fputs (" SIGN=", dumpfile);
2481 show_expr (dt->sign);
6f0f0b2e 2482 }
6de9cd9a 2483
5e805e44 2484 show_dt_code:
5e805e44 2485 for (c = c->block->next; c; c = c->next)
6c1abb5c 2486 show_code_node (level + (c->next != NULL), c);
5e805e44 2487 return;
6de9cd9a
DN
2488
2489 case EXEC_TRANSFER:
6c1abb5c 2490 fputs ("TRANSFER ", dumpfile);
a513927a 2491 show_expr (c->expr1);
6de9cd9a
DN
2492 break;
2493
2494 case EXEC_DT_END:
6c1abb5c 2495 fputs ("DT_END", dumpfile);
6de9cd9a
DN
2496 dt = c->ext.dt;
2497
2498 if (dt->err != NULL)
6c1abb5c 2499 fprintf (dumpfile, " ERR=%d", dt->err->value);
6de9cd9a 2500 if (dt->end != NULL)
6c1abb5c 2501 fprintf (dumpfile, " END=%d", dt->end->value);
6de9cd9a 2502 if (dt->eor != NULL)
6c1abb5c 2503 fprintf (dumpfile, " EOR=%d", dt->eor->value);
6de9cd9a
DN
2504 break;
2505
41dbbb37
TS
2506 case EXEC_OACC_PARALLEL_LOOP:
2507 case EXEC_OACC_PARALLEL:
2508 case EXEC_OACC_KERNELS_LOOP:
2509 case EXEC_OACC_KERNELS:
2510 case EXEC_OACC_DATA:
2511 case EXEC_OACC_HOST_DATA:
2512 case EXEC_OACC_LOOP:
2513 case EXEC_OACC_UPDATE:
2514 case EXEC_OACC_WAIT:
2515 case EXEC_OACC_CACHE:
2516 case EXEC_OACC_ENTER_DATA:
2517 case EXEC_OACC_EXIT_DATA:
6c7a4dfd 2518 case EXEC_OMP_ATOMIC:
dd2fc525
JJ
2519 case EXEC_OMP_CANCEL:
2520 case EXEC_OMP_CANCELLATION_POINT:
6c7a4dfd
JJ
2521 case EXEC_OMP_BARRIER:
2522 case EXEC_OMP_CRITICAL:
2523 case EXEC_OMP_FLUSH:
2524 case EXEC_OMP_DO:
dd2fc525 2525 case EXEC_OMP_DO_SIMD:
6c7a4dfd
JJ
2526 case EXEC_OMP_MASTER:
2527 case EXEC_OMP_ORDERED:
2528 case EXEC_OMP_PARALLEL:
2529 case EXEC_OMP_PARALLEL_DO:
dd2fc525 2530 case EXEC_OMP_PARALLEL_DO_SIMD:
6c7a4dfd
JJ
2531 case EXEC_OMP_PARALLEL_SECTIONS:
2532 case EXEC_OMP_PARALLEL_WORKSHARE:
2533 case EXEC_OMP_SECTIONS:
dd2fc525 2534 case EXEC_OMP_SIMD:
6c7a4dfd 2535 case EXEC_OMP_SINGLE:
a68ab351 2536 case EXEC_OMP_TASK:
dd2fc525 2537 case EXEC_OMP_TASKGROUP:
a68ab351 2538 case EXEC_OMP_TASKWAIT:
20906c66 2539 case EXEC_OMP_TASKYIELD:
6c7a4dfd 2540 case EXEC_OMP_WORKSHARE:
6c1abb5c 2541 show_omp_node (level, c);
6c7a4dfd
JJ
2542 break;
2543
6de9cd9a 2544 default:
6c1abb5c 2545 gfc_internal_error ("show_code_node(): Bad statement code");
6de9cd9a 2546 }
6de9cd9a
DN
2547}
2548
2549
30c05595 2550/* Show an equivalence chain. */
1854117e 2551
6c1abb5c
FXC
2552static void
2553show_equiv (gfc_equiv *eq)
1854117e
PB
2554{
2555 show_indent ();
6c1abb5c 2556 fputs ("Equivalence: ", dumpfile);
1854117e
PB
2557 while (eq)
2558 {
6c1abb5c 2559 show_expr (eq->expr);
1854117e
PB
2560 eq = eq->eq;
2561 if (eq)
6c1abb5c 2562 fputs (", ", dumpfile);
1854117e
PB
2563 }
2564}
2565
6c1abb5c 2566
6de9cd9a
DN
2567/* Show a freakin' whole namespace. */
2568
6c1abb5c
FXC
2569static void
2570show_namespace (gfc_namespace *ns)
6de9cd9a
DN
2571{
2572 gfc_interface *intr;
2573 gfc_namespace *save;
09639a83 2574 int op;
1854117e 2575 gfc_equiv *eq;
6de9cd9a
DN
2576 int i;
2577
fc2655fb 2578 gcc_assert (ns);
6de9cd9a 2579 save = gfc_current_ns;
6de9cd9a
DN
2580
2581 show_indent ();
6c1abb5c 2582 fputs ("Namespace:", dumpfile);
6de9cd9a 2583
fc2655fb
TB
2584 i = 0;
2585 do
6de9cd9a 2586 {
fc2655fb
TB
2587 int l = i;
2588 while (i < GFC_LETTERS - 1
2589 && gfc_compare_types (&ns->default_type[i+1],
2590 &ns->default_type[l]))
2591 i++;
2592
2593 if (i > l)
2594 fprintf (dumpfile, " %c-%c: ", l+'A', i+'A');
2595 else
2596 fprintf (dumpfile, " %c: ", l+'A');
6de9cd9a 2597
fc2655fb
TB
2598 show_typespec(&ns->default_type[l]);
2599 i++;
2600 } while (i < GFC_LETTERS);
6de9cd9a 2601
fc2655fb
TB
2602 if (ns->proc_name != NULL)
2603 {
2604 show_indent ();
2605 fprintf (dumpfile, "procedure name = %s", ns->proc_name->name);
2606 }
6de9cd9a 2607
fc2655fb
TB
2608 ++show_level;
2609 gfc_current_ns = ns;
2610 gfc_traverse_symtree (ns->common_root, show_common);
fbc9b453 2611
fc2655fb 2612 gfc_traverse_symtree (ns->sym_root, show_symtree);
6de9cd9a 2613
fc2655fb
TB
2614 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
2615 {
2616 /* User operator interfaces */
2617 intr = ns->op[op];
2618 if (intr == NULL)
2619 continue;
6de9cd9a 2620
fc2655fb
TB
2621 show_indent ();
2622 fprintf (dumpfile, "Operator interfaces for %s:",
2623 gfc_op2string ((gfc_intrinsic_op) op));
6de9cd9a 2624
fc2655fb
TB
2625 for (; intr; intr = intr->next)
2626 fprintf (dumpfile, " %s", intr->sym->name);
2627 }
6de9cd9a 2628
fc2655fb
TB
2629 if (ns->uop_root != NULL)
2630 {
2631 show_indent ();
2632 fputs ("User operators:\n", dumpfile);
2633 gfc_traverse_user_op (ns, show_uop);
6de9cd9a 2634 }
dfd6231e 2635
1854117e 2636 for (eq = ns->equiv; eq; eq = eq->next)
6c1abb5c 2637 show_equiv (eq);
6de9cd9a 2638
dc7a8b4b 2639 if (ns->oacc_declare)
41dbbb37 2640 {
dc7a8b4b 2641 struct gfc_oacc_declare *decl;
41dbbb37 2642 /* Dump !$ACC DECLARE clauses. */
dc7a8b4b
JN
2643 for (decl = ns->oacc_declare; decl; decl = decl->next)
2644 {
2645 show_indent ();
2646 fprintf (dumpfile, "!$ACC DECLARE");
2647 show_omp_clauses (decl->clauses);
2648 }
41dbbb37
TS
2649 }
2650
6c1abb5c 2651 fputc ('\n', dumpfile);
8cf8ca52
TK
2652 show_indent ();
2653 fputs ("code:", dumpfile);
7ed979b9 2654 show_code (show_level, ns->code);
8cf8ca52 2655 --show_level;
6de9cd9a
DN
2656
2657 for (ns = ns->contained; ns; ns = ns->sibling)
2658 {
8cf8ca52
TK
2659 fputs ("\nCONTAINS\n", dumpfile);
2660 ++show_level;
6c1abb5c 2661 show_namespace (ns);
8cf8ca52 2662 --show_level;
6de9cd9a
DN
2663 }
2664
6c1abb5c 2665 fputc ('\n', dumpfile);
6de9cd9a
DN
2666 gfc_current_ns = save;
2667}
6c1abb5c
FXC
2668
2669
2670/* Main function for dumping a parse tree. */
2671
2672void
2673gfc_dump_parse_tree (gfc_namespace *ns, FILE *file)
2674{
2675 dumpfile = file;
2676 show_namespace (ns);
2677}
94fae14b 2678