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