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