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