]> gcc.gnu.org Git - gcc.git/blame - gcc/fortran/dump-parse-tree.c
dump-parse-tree.c (show_code_node): Add ERRMSG to the dumping of allocate and dealloc...
[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
0511ddbb
SK
1423 if (c->expr2)
1424 {
1425 fputs (" ERRMSG=", dumpfile);
1426 show_expr (c->expr2);
1427 }
1428
6de9cd9a
DN
1429 for (a = c->ext.alloc_list; a; a = a->next)
1430 {
6c1abb5c
FXC
1431 fputc (' ', dumpfile);
1432 show_expr (a->expr);
6de9cd9a
DN
1433 }
1434
1435 break;
1436
1437 case EXEC_DEALLOCATE:
6c1abb5c 1438 fputs ("DEALLOCATE ", dumpfile);
a513927a 1439 if (c->expr1)
6de9cd9a 1440 {
6c1abb5c 1441 fputs (" STAT=", dumpfile);
a513927a 1442 show_expr (c->expr1);
6de9cd9a
DN
1443 }
1444
0511ddbb
SK
1445 if (c->expr2)
1446 {
1447 fputs (" ERRMSG=", dumpfile);
1448 show_expr (c->expr2);
1449 }
1450
6de9cd9a
DN
1451 for (a = c->ext.alloc_list; a; a = a->next)
1452 {
6c1abb5c
FXC
1453 fputc (' ', dumpfile);
1454 show_expr (a->expr);
6de9cd9a
DN
1455 }
1456
1457 break;
1458
1459 case EXEC_OPEN:
6c1abb5c 1460 fputs ("OPEN", dumpfile);
6de9cd9a
DN
1461 open = c->ext.open;
1462
1463 if (open->unit)
1464 {
6c1abb5c
FXC
1465 fputs (" UNIT=", dumpfile);
1466 show_expr (open->unit);
6de9cd9a 1467 }
7aba8abe
TK
1468 if (open->iomsg)
1469 {
6c1abb5c
FXC
1470 fputs (" IOMSG=", dumpfile);
1471 show_expr (open->iomsg);
7aba8abe 1472 }
6de9cd9a
DN
1473 if (open->iostat)
1474 {
6c1abb5c
FXC
1475 fputs (" IOSTAT=", dumpfile);
1476 show_expr (open->iostat);
6de9cd9a
DN
1477 }
1478 if (open->file)
1479 {
6c1abb5c
FXC
1480 fputs (" FILE=", dumpfile);
1481 show_expr (open->file);
6de9cd9a
DN
1482 }
1483 if (open->status)
1484 {
6c1abb5c
FXC
1485 fputs (" STATUS=", dumpfile);
1486 show_expr (open->status);
6de9cd9a
DN
1487 }
1488 if (open->access)
1489 {
6c1abb5c
FXC
1490 fputs (" ACCESS=", dumpfile);
1491 show_expr (open->access);
6de9cd9a
DN
1492 }
1493 if (open->form)
1494 {
6c1abb5c
FXC
1495 fputs (" FORM=", dumpfile);
1496 show_expr (open->form);
6de9cd9a
DN
1497 }
1498 if (open->recl)
1499 {
6c1abb5c
FXC
1500 fputs (" RECL=", dumpfile);
1501 show_expr (open->recl);
6de9cd9a
DN
1502 }
1503 if (open->blank)
1504 {
6c1abb5c
FXC
1505 fputs (" BLANK=", dumpfile);
1506 show_expr (open->blank);
6de9cd9a
DN
1507 }
1508 if (open->position)
1509 {
6c1abb5c
FXC
1510 fputs (" POSITION=", dumpfile);
1511 show_expr (open->position);
6de9cd9a
DN
1512 }
1513 if (open->action)
1514 {
6c1abb5c
FXC
1515 fputs (" ACTION=", dumpfile);
1516 show_expr (open->action);
6de9cd9a
DN
1517 }
1518 if (open->delim)
1519 {
6c1abb5c
FXC
1520 fputs (" DELIM=", dumpfile);
1521 show_expr (open->delim);
6de9cd9a
DN
1522 }
1523 if (open->pad)
1524 {
6c1abb5c
FXC
1525 fputs (" PAD=", dumpfile);
1526 show_expr (open->pad);
6de9cd9a 1527 }
6f0f0b2e
JD
1528 if (open->decimal)
1529 {
6c1abb5c
FXC
1530 fputs (" DECIMAL=", dumpfile);
1531 show_expr (open->decimal);
6f0f0b2e
JD
1532 }
1533 if (open->encoding)
1534 {
6c1abb5c
FXC
1535 fputs (" ENCODING=", dumpfile);
1536 show_expr (open->encoding);
6f0f0b2e
JD
1537 }
1538 if (open->round)
1539 {
6c1abb5c
FXC
1540 fputs (" ROUND=", dumpfile);
1541 show_expr (open->round);
6f0f0b2e
JD
1542 }
1543 if (open->sign)
1544 {
6c1abb5c
FXC
1545 fputs (" SIGN=", dumpfile);
1546 show_expr (open->sign);
6f0f0b2e 1547 }
181c9f4a
TK
1548 if (open->convert)
1549 {
6c1abb5c
FXC
1550 fputs (" CONVERT=", dumpfile);
1551 show_expr (open->convert);
181c9f4a 1552 }
6f0f0b2e
JD
1553 if (open->asynchronous)
1554 {
6c1abb5c
FXC
1555 fputs (" ASYNCHRONOUS=", dumpfile);
1556 show_expr (open->asynchronous);
6f0f0b2e 1557 }
6de9cd9a 1558 if (open->err != NULL)
6c1abb5c 1559 fprintf (dumpfile, " ERR=%d", open->err->value);
6de9cd9a
DN
1560
1561 break;
1562
1563 case EXEC_CLOSE:
6c1abb5c 1564 fputs ("CLOSE", dumpfile);
6de9cd9a
DN
1565 close = c->ext.close;
1566
1567 if (close->unit)
1568 {
6c1abb5c
FXC
1569 fputs (" UNIT=", dumpfile);
1570 show_expr (close->unit);
6de9cd9a 1571 }
7aba8abe
TK
1572 if (close->iomsg)
1573 {
6c1abb5c
FXC
1574 fputs (" IOMSG=", dumpfile);
1575 show_expr (close->iomsg);
7aba8abe 1576 }
6de9cd9a
DN
1577 if (close->iostat)
1578 {
6c1abb5c
FXC
1579 fputs (" IOSTAT=", dumpfile);
1580 show_expr (close->iostat);
6de9cd9a
DN
1581 }
1582 if (close->status)
1583 {
6c1abb5c
FXC
1584 fputs (" STATUS=", dumpfile);
1585 show_expr (close->status);
6de9cd9a
DN
1586 }
1587 if (close->err != NULL)
6c1abb5c 1588 fprintf (dumpfile, " ERR=%d", close->err->value);
6de9cd9a
DN
1589 break;
1590
1591 case EXEC_BACKSPACE:
6c1abb5c 1592 fputs ("BACKSPACE", dumpfile);
6de9cd9a
DN
1593 goto show_filepos;
1594
1595 case EXEC_ENDFILE:
6c1abb5c 1596 fputs ("ENDFILE", dumpfile);
6de9cd9a
DN
1597 goto show_filepos;
1598
1599 case EXEC_REWIND:
6c1abb5c 1600 fputs ("REWIND", dumpfile);
6403ec5f
JB
1601 goto show_filepos;
1602
1603 case EXEC_FLUSH:
6c1abb5c 1604 fputs ("FLUSH", dumpfile);
6de9cd9a
DN
1605
1606 show_filepos:
1607 fp = c->ext.filepos;
1608
1609 if (fp->unit)
1610 {
6c1abb5c
FXC
1611 fputs (" UNIT=", dumpfile);
1612 show_expr (fp->unit);
6de9cd9a 1613 }
7aba8abe
TK
1614 if (fp->iomsg)
1615 {
6c1abb5c
FXC
1616 fputs (" IOMSG=", dumpfile);
1617 show_expr (fp->iomsg);
7aba8abe 1618 }
6de9cd9a
DN
1619 if (fp->iostat)
1620 {
6c1abb5c
FXC
1621 fputs (" IOSTAT=", dumpfile);
1622 show_expr (fp->iostat);
6de9cd9a
DN
1623 }
1624 if (fp->err != NULL)
6c1abb5c 1625 fprintf (dumpfile, " ERR=%d", fp->err->value);
6de9cd9a
DN
1626 break;
1627
1628 case EXEC_INQUIRE:
6c1abb5c 1629 fputs ("INQUIRE", dumpfile);
6de9cd9a
DN
1630 i = c->ext.inquire;
1631
1632 if (i->unit)
1633 {
6c1abb5c
FXC
1634 fputs (" UNIT=", dumpfile);
1635 show_expr (i->unit);
6de9cd9a
DN
1636 }
1637 if (i->file)
1638 {
6c1abb5c
FXC
1639 fputs (" FILE=", dumpfile);
1640 show_expr (i->file);
6de9cd9a
DN
1641 }
1642
7aba8abe
TK
1643 if (i->iomsg)
1644 {
6c1abb5c
FXC
1645 fputs (" IOMSG=", dumpfile);
1646 show_expr (i->iomsg);
7aba8abe 1647 }
6de9cd9a
DN
1648 if (i->iostat)
1649 {
6c1abb5c
FXC
1650 fputs (" IOSTAT=", dumpfile);
1651 show_expr (i->iostat);
6de9cd9a
DN
1652 }
1653 if (i->exist)
1654 {
6c1abb5c
FXC
1655 fputs (" EXIST=", dumpfile);
1656 show_expr (i->exist);
6de9cd9a
DN
1657 }
1658 if (i->opened)
1659 {
6c1abb5c
FXC
1660 fputs (" OPENED=", dumpfile);
1661 show_expr (i->opened);
6de9cd9a
DN
1662 }
1663 if (i->number)
1664 {
6c1abb5c
FXC
1665 fputs (" NUMBER=", dumpfile);
1666 show_expr (i->number);
6de9cd9a
DN
1667 }
1668 if (i->named)
1669 {
6c1abb5c
FXC
1670 fputs (" NAMED=", dumpfile);
1671 show_expr (i->named);
6de9cd9a
DN
1672 }
1673 if (i->name)
1674 {
6c1abb5c
FXC
1675 fputs (" NAME=", dumpfile);
1676 show_expr (i->name);
6de9cd9a
DN
1677 }
1678 if (i->access)
1679 {
6c1abb5c
FXC
1680 fputs (" ACCESS=", dumpfile);
1681 show_expr (i->access);
6de9cd9a
DN
1682 }
1683 if (i->sequential)
1684 {
6c1abb5c
FXC
1685 fputs (" SEQUENTIAL=", dumpfile);
1686 show_expr (i->sequential);
6de9cd9a
DN
1687 }
1688
1689 if (i->direct)
1690 {
6c1abb5c
FXC
1691 fputs (" DIRECT=", dumpfile);
1692 show_expr (i->direct);
6de9cd9a
DN
1693 }
1694 if (i->form)
1695 {
6c1abb5c
FXC
1696 fputs (" FORM=", dumpfile);
1697 show_expr (i->form);
6de9cd9a
DN
1698 }
1699 if (i->formatted)
1700 {
6c1abb5c
FXC
1701 fputs (" FORMATTED", dumpfile);
1702 show_expr (i->formatted);
6de9cd9a
DN
1703 }
1704 if (i->unformatted)
1705 {
6c1abb5c
FXC
1706 fputs (" UNFORMATTED=", dumpfile);
1707 show_expr (i->unformatted);
6de9cd9a
DN
1708 }
1709 if (i->recl)
1710 {
6c1abb5c
FXC
1711 fputs (" RECL=", dumpfile);
1712 show_expr (i->recl);
6de9cd9a
DN
1713 }
1714 if (i->nextrec)
1715 {
6c1abb5c
FXC
1716 fputs (" NEXTREC=", dumpfile);
1717 show_expr (i->nextrec);
6de9cd9a
DN
1718 }
1719 if (i->blank)
1720 {
6c1abb5c
FXC
1721 fputs (" BLANK=", dumpfile);
1722 show_expr (i->blank);
6de9cd9a
DN
1723 }
1724 if (i->position)
1725 {
6c1abb5c
FXC
1726 fputs (" POSITION=", dumpfile);
1727 show_expr (i->position);
6de9cd9a
DN
1728 }
1729 if (i->action)
1730 {
6c1abb5c
FXC
1731 fputs (" ACTION=", dumpfile);
1732 show_expr (i->action);
6de9cd9a
DN
1733 }
1734 if (i->read)
1735 {
6c1abb5c
FXC
1736 fputs (" READ=", dumpfile);
1737 show_expr (i->read);
6de9cd9a
DN
1738 }
1739 if (i->write)
1740 {
6c1abb5c
FXC
1741 fputs (" WRITE=", dumpfile);
1742 show_expr (i->write);
6de9cd9a
DN
1743 }
1744 if (i->readwrite)
1745 {
6c1abb5c
FXC
1746 fputs (" READWRITE=", dumpfile);
1747 show_expr (i->readwrite);
6de9cd9a
DN
1748 }
1749 if (i->delim)
1750 {
6c1abb5c
FXC
1751 fputs (" DELIM=", dumpfile);
1752 show_expr (i->delim);
6de9cd9a
DN
1753 }
1754 if (i->pad)
1755 {
6c1abb5c
FXC
1756 fputs (" PAD=", dumpfile);
1757 show_expr (i->pad);
6de9cd9a 1758 }
181c9f4a
TK
1759 if (i->convert)
1760 {
6c1abb5c
FXC
1761 fputs (" CONVERT=", dumpfile);
1762 show_expr (i->convert);
181c9f4a 1763 }
6f0f0b2e
JD
1764 if (i->asynchronous)
1765 {
6c1abb5c
FXC
1766 fputs (" ASYNCHRONOUS=", dumpfile);
1767 show_expr (i->asynchronous);
6f0f0b2e
JD
1768 }
1769 if (i->decimal)
1770 {
6c1abb5c
FXC
1771 fputs (" DECIMAL=", dumpfile);
1772 show_expr (i->decimal);
6f0f0b2e
JD
1773 }
1774 if (i->encoding)
1775 {
6c1abb5c
FXC
1776 fputs (" ENCODING=", dumpfile);
1777 show_expr (i->encoding);
6f0f0b2e
JD
1778 }
1779 if (i->pending)
1780 {
6c1abb5c
FXC
1781 fputs (" PENDING=", dumpfile);
1782 show_expr (i->pending);
6f0f0b2e
JD
1783 }
1784 if (i->round)
1785 {
6c1abb5c
FXC
1786 fputs (" ROUND=", dumpfile);
1787 show_expr (i->round);
6f0f0b2e
JD
1788 }
1789 if (i->sign)
1790 {
6c1abb5c
FXC
1791 fputs (" SIGN=", dumpfile);
1792 show_expr (i->sign);
6f0f0b2e
JD
1793 }
1794 if (i->size)
1795 {
6c1abb5c
FXC
1796 fputs (" SIZE=", dumpfile);
1797 show_expr (i->size);
6f0f0b2e
JD
1798 }
1799 if (i->id)
1800 {
6c1abb5c
FXC
1801 fputs (" ID=", dumpfile);
1802 show_expr (i->id);
6f0f0b2e 1803 }
6de9cd9a
DN
1804
1805 if (i->err != NULL)
6c1abb5c 1806 fprintf (dumpfile, " ERR=%d", i->err->value);
6de9cd9a
DN
1807 break;
1808
1809 case EXEC_IOLENGTH:
6c1abb5c 1810 fputs ("IOLENGTH ", dumpfile);
a513927a 1811 show_expr (c->expr1);
5e805e44 1812 goto show_dt_code;
6de9cd9a
DN
1813 break;
1814
1815 case EXEC_READ:
6c1abb5c 1816 fputs ("READ", dumpfile);
6de9cd9a
DN
1817 goto show_dt;
1818
1819 case EXEC_WRITE:
6c1abb5c 1820 fputs ("WRITE", dumpfile);
6de9cd9a
DN
1821
1822 show_dt:
1823 dt = c->ext.dt;
1824 if (dt->io_unit)
1825 {
6c1abb5c
FXC
1826 fputs (" UNIT=", dumpfile);
1827 show_expr (dt->io_unit);
6de9cd9a
DN
1828 }
1829
1830 if (dt->format_expr)
1831 {
6c1abb5c
FXC
1832 fputs (" FMT=", dumpfile);
1833 show_expr (dt->format_expr);
6de9cd9a
DN
1834 }
1835
1836 if (dt->format_label != NULL)
6c1abb5c 1837 fprintf (dumpfile, " FMT=%d", dt->format_label->value);
6de9cd9a 1838 if (dt->namelist)
6c1abb5c 1839 fprintf (dumpfile, " NML=%s", dt->namelist->name);
7aba8abe
TK
1840
1841 if (dt->iomsg)
1842 {
6c1abb5c
FXC
1843 fputs (" IOMSG=", dumpfile);
1844 show_expr (dt->iomsg);
7aba8abe 1845 }
6de9cd9a
DN
1846 if (dt->iostat)
1847 {
6c1abb5c
FXC
1848 fputs (" IOSTAT=", dumpfile);
1849 show_expr (dt->iostat);
6de9cd9a
DN
1850 }
1851 if (dt->size)
1852 {
6c1abb5c
FXC
1853 fputs (" SIZE=", dumpfile);
1854 show_expr (dt->size);
6de9cd9a
DN
1855 }
1856 if (dt->rec)
1857 {
6c1abb5c
FXC
1858 fputs (" REC=", dumpfile);
1859 show_expr (dt->rec);
6de9cd9a
DN
1860 }
1861 if (dt->advance)
1862 {
6c1abb5c
FXC
1863 fputs (" ADVANCE=", dumpfile);
1864 show_expr (dt->advance);
6de9cd9a 1865 }
6f0f0b2e
JD
1866 if (dt->id)
1867 {
6c1abb5c
FXC
1868 fputs (" ID=", dumpfile);
1869 show_expr (dt->id);
6f0f0b2e
JD
1870 }
1871 if (dt->pos)
1872 {
6c1abb5c
FXC
1873 fputs (" POS=", dumpfile);
1874 show_expr (dt->pos);
6f0f0b2e
JD
1875 }
1876 if (dt->asynchronous)
1877 {
6c1abb5c
FXC
1878 fputs (" ASYNCHRONOUS=", dumpfile);
1879 show_expr (dt->asynchronous);
6f0f0b2e
JD
1880 }
1881 if (dt->blank)
1882 {
6c1abb5c
FXC
1883 fputs (" BLANK=", dumpfile);
1884 show_expr (dt->blank);
6f0f0b2e
JD
1885 }
1886 if (dt->decimal)
1887 {
6c1abb5c
FXC
1888 fputs (" DECIMAL=", dumpfile);
1889 show_expr (dt->decimal);
6f0f0b2e
JD
1890 }
1891 if (dt->delim)
1892 {
6c1abb5c
FXC
1893 fputs (" DELIM=", dumpfile);
1894 show_expr (dt->delim);
6f0f0b2e
JD
1895 }
1896 if (dt->pad)
1897 {
6c1abb5c
FXC
1898 fputs (" PAD=", dumpfile);
1899 show_expr (dt->pad);
6f0f0b2e
JD
1900 }
1901 if (dt->round)
1902 {
6c1abb5c
FXC
1903 fputs (" ROUND=", dumpfile);
1904 show_expr (dt->round);
6f0f0b2e
JD
1905 }
1906 if (dt->sign)
1907 {
6c1abb5c
FXC
1908 fputs (" SIGN=", dumpfile);
1909 show_expr (dt->sign);
6f0f0b2e 1910 }
6de9cd9a 1911
5e805e44 1912 show_dt_code:
6c1abb5c 1913 fputc ('\n', dumpfile);
5e805e44 1914 for (c = c->block->next; c; c = c->next)
6c1abb5c 1915 show_code_node (level + (c->next != NULL), c);
5e805e44 1916 return;
6de9cd9a
DN
1917
1918 case EXEC_TRANSFER:
6c1abb5c 1919 fputs ("TRANSFER ", dumpfile);
a513927a 1920 show_expr (c->expr1);
6de9cd9a
DN
1921 break;
1922
1923 case EXEC_DT_END:
6c1abb5c 1924 fputs ("DT_END", dumpfile);
6de9cd9a
DN
1925 dt = c->ext.dt;
1926
1927 if (dt->err != NULL)
6c1abb5c 1928 fprintf (dumpfile, " ERR=%d", dt->err->value);
6de9cd9a 1929 if (dt->end != NULL)
6c1abb5c 1930 fprintf (dumpfile, " END=%d", dt->end->value);
6de9cd9a 1931 if (dt->eor != NULL)
6c1abb5c 1932 fprintf (dumpfile, " EOR=%d", dt->eor->value);
6de9cd9a
DN
1933 break;
1934
6c7a4dfd
JJ
1935 case EXEC_OMP_ATOMIC:
1936 case EXEC_OMP_BARRIER:
1937 case EXEC_OMP_CRITICAL:
1938 case EXEC_OMP_FLUSH:
1939 case EXEC_OMP_DO:
1940 case EXEC_OMP_MASTER:
1941 case EXEC_OMP_ORDERED:
1942 case EXEC_OMP_PARALLEL:
1943 case EXEC_OMP_PARALLEL_DO:
1944 case EXEC_OMP_PARALLEL_SECTIONS:
1945 case EXEC_OMP_PARALLEL_WORKSHARE:
1946 case EXEC_OMP_SECTIONS:
1947 case EXEC_OMP_SINGLE:
a68ab351
JJ
1948 case EXEC_OMP_TASK:
1949 case EXEC_OMP_TASKWAIT:
6c7a4dfd 1950 case EXEC_OMP_WORKSHARE:
6c1abb5c 1951 show_omp_node (level, c);
6c7a4dfd
JJ
1952 break;
1953
6de9cd9a 1954 default:
6c1abb5c 1955 gfc_internal_error ("show_code_node(): Bad statement code");
6de9cd9a
DN
1956 }
1957
6c1abb5c 1958 fputc ('\n', dumpfile);
6de9cd9a
DN
1959}
1960
1961
30c05595 1962/* Show an equivalence chain. */
1854117e 1963
6c1abb5c
FXC
1964static void
1965show_equiv (gfc_equiv *eq)
1854117e
PB
1966{
1967 show_indent ();
6c1abb5c 1968 fputs ("Equivalence: ", dumpfile);
1854117e
PB
1969 while (eq)
1970 {
6c1abb5c 1971 show_expr (eq->expr);
1854117e
PB
1972 eq = eq->eq;
1973 if (eq)
6c1abb5c 1974 fputs (", ", dumpfile);
1854117e
PB
1975 }
1976}
1977
6c1abb5c 1978
6de9cd9a
DN
1979/* Show a freakin' whole namespace. */
1980
6c1abb5c
FXC
1981static void
1982show_namespace (gfc_namespace *ns)
6de9cd9a
DN
1983{
1984 gfc_interface *intr;
1985 gfc_namespace *save;
09639a83 1986 int op;
1854117e 1987 gfc_equiv *eq;
6de9cd9a
DN
1988 int i;
1989
1990 save = gfc_current_ns;
1991 show_level++;
1992
1993 show_indent ();
6c1abb5c 1994 fputs ("Namespace:", dumpfile);
6de9cd9a
DN
1995
1996 if (ns != NULL)
1997 {
1998 i = 0;
1999 do
2000 {
2001 int l = i;
2002 while (i < GFC_LETTERS - 1
2003 && gfc_compare_types(&ns->default_type[i+1],
2004 &ns->default_type[l]))
2005 i++;
2006
2007 if (i > l)
6c1abb5c 2008 fprintf (dumpfile, " %c-%c: ", l+'A', i+'A');
6de9cd9a 2009 else
6c1abb5c 2010 fprintf (dumpfile, " %c: ", l+'A');
6de9cd9a 2011
6c1abb5c 2012 show_typespec(&ns->default_type[l]);
6de9cd9a
DN
2013 i++;
2014 } while (i < GFC_LETTERS);
2015
2016 if (ns->proc_name != NULL)
2017 {
2018 show_indent ();
6c1abb5c 2019 fprintf (dumpfile, "procedure name = %s", ns->proc_name->name);
6de9cd9a
DN
2020 }
2021
2022 gfc_current_ns = ns;
fbc9b453
TS
2023 gfc_traverse_symtree (ns->common_root, show_common);
2024
9056bd70 2025 gfc_traverse_symtree (ns->sym_root, show_symtree);
6de9cd9a
DN
2026
2027 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
2028 {
2029 /* User operator interfaces */
a1ee985f 2030 intr = ns->op[op];
6de9cd9a
DN
2031 if (intr == NULL)
2032 continue;
2033
2034 show_indent ();
6c1abb5c 2035 fprintf (dumpfile, "Operator interfaces for %s:",
09639a83 2036 gfc_op2string ((gfc_intrinsic_op) op));
6de9cd9a
DN
2037
2038 for (; intr; intr = intr->next)
6c1abb5c 2039 fprintf (dumpfile, " %s", intr->sym->name);
6de9cd9a
DN
2040 }
2041
2042 if (ns->uop_root != NULL)
2043 {
2044 show_indent ();
6c1abb5c 2045 fputs ("User operators:\n", dumpfile);
6de9cd9a
DN
2046 gfc_traverse_user_op (ns, show_uop);
2047 }
2048 }
1854117e
PB
2049
2050 for (eq = ns->equiv; eq; eq = eq->next)
6c1abb5c 2051 show_equiv (eq);
6de9cd9a 2052
6c1abb5c
FXC
2053 fputc ('\n', dumpfile);
2054 fputc ('\n', dumpfile);
6de9cd9a 2055
6c1abb5c 2056 show_code (0, ns->code);
6de9cd9a
DN
2057
2058 for (ns = ns->contained; ns; ns = ns->sibling)
2059 {
2060 show_indent ();
6c1abb5c
FXC
2061 fputs ("CONTAINS\n", dumpfile);
2062 show_namespace (ns);
6de9cd9a
DN
2063 }
2064
2065 show_level--;
6c1abb5c 2066 fputc ('\n', dumpfile);
6de9cd9a
DN
2067 gfc_current_ns = save;
2068}
6c1abb5c
FXC
2069
2070
2071/* Main function for dumping a parse tree. */
2072
2073void
2074gfc_dump_parse_tree (gfc_namespace *ns, FILE *file)
2075{
2076 dumpfile = file;
2077 show_namespace (ns);
2078}
This page took 1.793256 seconds and 5 git commands to generate.