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