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