2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
4 Contributed by Steven Bosscher
6 This file is part of GCC.
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
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
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/>. */
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.
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
37 /* Keep track of indentation for symbol tree dumps. */
38 static int show_level = 0;
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;
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);
50 /* Do indentation for a specific level. */
53 code_indent (int level, gfc_st_label *label)
58 fprintf (dumpfile, "%-5d ", label->value);
60 fputs (" ", dumpfile);
62 for (i = 0; i < 2 * level; i++)
63 fputc (' ', dumpfile);
67 /* Simple indentation at the current level. This one
68 is used to show symbols. */
73 fputc ('\n', dumpfile);
74 code_indent (show_level, NULL);
78 /* Show type-specific information. */
81 show_typespec (gfc_typespec *ts)
83 fprintf (dumpfile, "(%s ", gfc_basic_typename (ts->type));
88 fprintf (dumpfile, "%s", ts->u.derived->name);
92 show_expr (ts->u.cl->length);
96 fprintf (dumpfile, "%d", ts->kind);
100 fputc (')', dumpfile);
104 /* Show an actual argument list. */
107 show_actual_arglist (gfc_actual_arglist *a)
109 fputc ('(', dumpfile);
111 for (; a; a = a->next)
113 fputc ('(', dumpfile);
115 fprintf (dumpfile, "%s = ", a->name);
119 fputs ("(arg not-present)", dumpfile);
121 fputc (')', dumpfile);
123 fputc (' ', dumpfile);
126 fputc (')', dumpfile);
130 /* Show a gfc_array_spec array specification structure. */
133 show_array_spec (gfc_array_spec *as)
140 fputs ("()", dumpfile);
144 fprintf (dumpfile, "(%d", as->rank);
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;
155 gfc_internal_error ("show_array_spec(): Unhandled array shape "
158 fprintf (dumpfile, " %s ", c);
160 for (i = 0; i < as->rank; i++)
162 show_expr (as->lower[i]);
163 fputc (' ', dumpfile);
164 show_expr (as->upper[i]);
165 fputc (' ', dumpfile);
169 fputc (')', dumpfile);
173 /* Show a gfc_array_ref array reference structure. */
176 show_array_ref (gfc_array_ref * ar)
180 fputc ('(', dumpfile);
185 fputs ("FULL", dumpfile);
189 for (i = 0; i < ar->dimen; i++)
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. */
198 if (ar->start[i] != NULL)
199 show_expr (ar->start[i]);
201 if (ar->dimen_type[i] == DIMEN_RANGE)
203 fputc (':', dumpfile);
205 if (ar->end[i] != NULL)
206 show_expr (ar->end[i]);
208 if (ar->stride[i] != NULL)
210 fputc (':', dumpfile);
211 show_expr (ar->stride[i]);
215 if (i != ar->dimen - 1)
216 fputs (" , ", dumpfile);
221 for (i = 0; i < ar->dimen; i++)
223 show_expr (ar->start[i]);
224 if (i != ar->dimen - 1)
225 fputs (" , ", dumpfile);
230 fputs ("UNKNOWN", dumpfile);
234 gfc_internal_error ("show_array_ref(): Unknown array reference");
237 fputc (')', dumpfile);
241 /* Show a list of gfc_ref structures. */
244 show_ref (gfc_ref *p)
246 for (; p; p = p->next)
250 show_array_ref (&p->u.ar);
254 fprintf (dumpfile, " %% %s", p->u.c.component->name);
258 fputc ('(', dumpfile);
259 show_expr (p->u.ss.start);
260 fputc (':', dumpfile);
261 show_expr (p->u.ss.end);
262 fputc (')', dumpfile);
266 gfc_internal_error ("show_ref(): Bad component code");
271 /* Display a constructor. Works recursively for array constructors. */
274 show_constructor (gfc_constructor *c)
276 for (; c; c = c->next)
278 if (c->iterator == NULL)
282 fputc ('(', dumpfile);
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);
294 fputc (')', dumpfile);
298 fputs (" , ", dumpfile);
304 show_char_const (const gfc_char_t *c, int length)
308 fputc ('\'', dumpfile);
309 for (i = 0; i < length; i++)
312 fputs ("''", dumpfile);
314 fputs (gfc_print_wide_char (c[i]), dumpfile);
316 fputc ('\'', dumpfile);
320 /* Show a component-call expression. */
323 show_compcall (gfc_expr* p)
325 gcc_assert (p->expr_type == EXPR_COMPCALL);
327 fprintf (dumpfile, "%s", p->symtree->n.sym->name);
329 fprintf (dumpfile, "%s", p->value.compcall.name);
331 show_actual_arglist (p->value.compcall.actual);
335 /* Show an expression. */
338 show_expr (gfc_expr *p)
345 fputs ("()", dumpfile);
349 switch (p->expr_type)
352 show_char_const (p->value.character.string, p->value.character.length);
357 fprintf (dumpfile, "%s(", p->ts.u.derived->name);
358 show_constructor (p->value.constructor);
359 fputc (')', dumpfile);
363 fputs ("(/ ", dumpfile);
364 show_constructor (p->value.constructor);
365 fputs (" /)", dumpfile);
371 fputs ("NULL()", dumpfile);
378 mpz_out_str (stdout, 10, p->value.integer);
380 if (p->ts.kind != gfc_default_integer_kind)
381 fprintf (dumpfile, "_%d", p->ts.kind);
385 if (p->value.logical)
386 fputs (".true.", dumpfile);
388 fputs (".false.", dumpfile);
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);
398 show_char_const (p->value.character.string,
399 p->value.character.length);
403 fputs ("(complex ", dumpfile);
405 mpfr_out_str (stdout, 10, 0, mpc_realref (p->value.complex),
407 if (p->ts.kind != gfc_default_complex_kind)
408 fprintf (dumpfile, "_%d", p->ts.kind);
410 fputc (' ', dumpfile);
412 mpfr_out_str (stdout, 10, 0, mpc_imagref (p->value.complex),
414 if (p->ts.kind != gfc_default_complex_kind)
415 fprintf (dumpfile, "_%d", p->ts.kind);
417 fputc (')', dumpfile);
421 fprintf (dumpfile, "%dH", p->representation.length);
422 c = p->representation.string;
423 for (i = 0; i < p->representation.length; i++, c++)
425 fputc (*c, dumpfile);
430 fputs ("???", dumpfile);
434 if (p->representation.string)
436 fputs (" {", dumpfile);
437 c = p->representation.string;
438 for (i = 0; i < p->representation.length; i++, c++)
440 fprintf (dumpfile, "%.2x", (unsigned int) *c);
441 if (i < p->representation.length - 1)
442 fputc (',', dumpfile);
444 fputc ('}', dumpfile);
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);
457 fputc ('(', dumpfile);
458 switch (p->value.op.op)
460 case INTRINSIC_UPLUS:
461 fputs ("U+ ", dumpfile);
463 case INTRINSIC_UMINUS:
464 fputs ("U- ", dumpfile);
467 fputs ("+ ", dumpfile);
469 case INTRINSIC_MINUS:
470 fputs ("- ", dumpfile);
472 case INTRINSIC_TIMES:
473 fputs ("* ", dumpfile);
475 case INTRINSIC_DIVIDE:
476 fputs ("/ ", dumpfile);
478 case INTRINSIC_POWER:
479 fputs ("** ", dumpfile);
481 case INTRINSIC_CONCAT:
482 fputs ("// ", dumpfile);
485 fputs ("AND ", dumpfile);
488 fputs ("OR ", dumpfile);
491 fputs ("EQV ", dumpfile);
494 fputs ("NEQV ", dumpfile);
497 case INTRINSIC_EQ_OS:
498 fputs ("= ", dumpfile);
501 case INTRINSIC_NE_OS:
502 fputs ("/= ", dumpfile);
505 case INTRINSIC_GT_OS:
506 fputs ("> ", dumpfile);
509 case INTRINSIC_GE_OS:
510 fputs (">= ", dumpfile);
513 case INTRINSIC_LT_OS:
514 fputs ("< ", dumpfile);
517 case INTRINSIC_LE_OS:
518 fputs ("<= ", dumpfile);
521 fputs ("NOT ", dumpfile);
523 case INTRINSIC_PARENTHESES:
524 fputs ("parens", dumpfile);
529 ("show_expr(): Bad intrinsic in expression!");
532 show_expr (p->value.op.op1);
536 fputc (' ', dumpfile);
537 show_expr (p->value.op.op2);
540 fputc (')', dumpfile);
544 if (p->value.function.name == NULL)
546 fprintf (dumpfile, "%s", p->symtree->n.sym->name);
547 if (gfc_is_proc_ptr_comp (p, NULL))
549 fputc ('[', dumpfile);
550 show_actual_arglist (p->value.function.actual);
551 fputc (']', dumpfile);
555 fprintf (dumpfile, "%s", p->value.function.name);
556 if (gfc_is_proc_ptr_comp (p, NULL))
558 fputc ('[', dumpfile);
559 fputc ('[', dumpfile);
560 show_actual_arglist (p->value.function.actual);
561 fputc (']', dumpfile);
562 fputc (']', dumpfile);
572 gfc_internal_error ("show_expr(): Don't know how to show expr");
576 /* Show symbol attributes. The flavor and intent are followed by
577 whatever single bit attributes are present. */
580 show_attr (symbol_attribute *attr)
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));
590 if (attr->allocatable)
591 fputs (" ALLOCATABLE", dumpfile);
592 if (attr->asynchronous)
593 fputs (" ASYNCHRONOUS", dumpfile);
595 fputs (" DIMENSION", dumpfile);
597 fputs (" EXTERNAL", dumpfile);
599 fputs (" INTRINSIC", dumpfile);
601 fputs (" OPTIONAL", dumpfile);
603 fputs (" POINTER", dumpfile);
604 if (attr->is_protected)
605 fputs (" PROTECTED", dumpfile);
607 fputs (" VALUE", dumpfile);
609 fputs (" VOLATILE", dumpfile);
610 if (attr->threadprivate)
611 fputs (" THREADPRIVATE", dumpfile);
613 fputs (" TARGET", dumpfile);
615 fputs (" DUMMY", dumpfile);
617 fputs (" RESULT", dumpfile);
619 fputs (" ENTRY", dumpfile);
621 fputs (" BIND(C)", dumpfile);
624 fputs (" DATA", dumpfile);
626 fputs (" USE-ASSOC", dumpfile);
627 if (attr->in_namelist)
628 fputs (" IN-NAMELIST", dumpfile);
630 fputs (" IN-COMMON", dumpfile);
633 fputs (" ABSTRACT", dumpfile);
635 fputs (" FUNCTION", dumpfile);
636 if (attr->subroutine)
637 fputs (" SUBROUTINE", dumpfile);
638 if (attr->implicit_type)
639 fputs (" IMPLICIT-TYPE", dumpfile);
642 fputs (" SEQUENCE", dumpfile);
644 fputs (" ELEMENTAL", dumpfile);
646 fputs (" PURE", dumpfile);
648 fputs (" RECURSIVE", dumpfile);
650 fputc (')', dumpfile);
654 /* Show components of a derived type. */
657 show_components (gfc_symbol *sym)
661 for (c = sym->components; c; c = c->next)
663 fprintf (dumpfile, "(%s ", c->name);
664 show_typespec (&c->ts);
666 fputs (" POINTER", dumpfile);
667 if (c->attr.proc_pointer)
668 fputs (" PPC", dumpfile);
669 if (c->attr.dimension)
670 fputs (" DIMENSION", dumpfile);
671 fputc (' ', dumpfile);
672 show_array_spec (c->as);
674 fprintf (dumpfile, " %s", gfc_code2string (access_types, c->attr.access));
675 fputc (')', dumpfile);
677 fputc (' ', dumpfile);
682 /* Show the f2k_derived namespace with procedure bindings. */
685 show_typebound_proc (gfc_typebound_proc* tb, const char* name)
690 fputs ("GENERIC", dumpfile);
693 fputs ("PROCEDURE, ", dumpfile);
695 fputs ("NOPASS", dumpfile);
699 fprintf (dumpfile, "PASS(%s)", tb->pass_arg);
701 fputs ("PASS", dumpfile);
703 if (tb->non_overridable)
704 fputs (", NON_OVERRIDABLE", dumpfile);
707 if (tb->access == ACCESS_PUBLIC)
708 fputs (", PUBLIC", dumpfile);
710 fputs (", PRIVATE", dumpfile);
712 fprintf (dumpfile, " :: %s => ", name);
717 for (g = tb->u.generic; g; g = g->next)
719 fputs (g->specific_st->name, dumpfile);
721 fputs (", ", dumpfile);
725 fputs (tb->u.specific->n.sym->name, dumpfile);
729 show_typebound_symtree (gfc_symtree* st)
731 gcc_assert (st->n.tb);
732 show_typebound_proc (st->n.tb, st->name);
736 show_f2k_derived (gfc_namespace* f2k)
742 fputs ("Procedure bindings:", dumpfile);
745 /* Finalizer bindings. */
746 for (f = f2k->finalizers; f; f = f->next)
749 fprintf (dumpfile, "FINAL %s", f->proc_sym->name);
752 /* Type-bound procedures. */
753 gfc_traverse_symtree (f2k->tb_sym_root, &show_typebound_symtree);
758 fputs ("Operator bindings:", dumpfile);
761 /* User-defined operators. */
762 gfc_traverse_symtree (f2k->tb_uop_root, &show_typebound_symtree);
764 /* Intrinsic operators. */
765 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
767 show_typebound_proc (f2k->tb_op[op],
768 gfc_op2string ((gfc_intrinsic_op) op));
774 /* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
775 show the interface. Information needed to reconstruct the list of
776 specific interfaces associated with a generic symbol is done within
780 show_symbol (gfc_symbol *sym)
782 gfc_formal_arglist *formal;
790 fprintf (dumpfile, "symbol %s ", sym->name);
791 show_typespec (&sym->ts);
792 show_attr (&sym->attr);
797 fputs ("value: ", dumpfile);
798 show_expr (sym->value);
804 fputs ("Array spec:", dumpfile);
805 show_array_spec (sym->as);
811 fputs ("Generic interfaces:", dumpfile);
812 for (intr = sym->generic; intr; intr = intr->next)
813 fprintf (dumpfile, " %s", intr->sym->name);
819 fprintf (dumpfile, "result: %s", sym->result->name);
825 fputs ("components: ", dumpfile);
826 show_components (sym);
829 if (sym->f2k_derived)
833 fprintf (dumpfile, "hash: %d", sym->hash_value);
834 show_f2k_derived (sym->f2k_derived);
840 fputs ("Formal arglist:", dumpfile);
842 for (formal = sym->formal; formal; formal = formal->next)
844 if (formal->sym != NULL)
845 fprintf (dumpfile, " %s", formal->sym->name);
847 fputs (" [Alt Return]", dumpfile);
854 fputs ("Formal namespace", dumpfile);
855 show_namespace (sym->formal_ns);
858 fputc ('\n', dumpfile);
862 /* Show a user-defined operator. Just prints an operator
863 and the name of the associated subroutine, really. */
866 show_uop (gfc_user_op *uop)
871 fprintf (dumpfile, "%s:", uop->name);
873 for (intr = uop->op; intr; intr = intr->next)
874 fprintf (dumpfile, " %s", intr->sym->name);
878 /* Workhorse function for traversing the user operator symtree. */
881 traverse_uop (gfc_symtree *st, void (*func) (gfc_user_op *))
888 traverse_uop (st->left, func);
889 traverse_uop (st->right, func);
893 /* Traverse the tree of user operator nodes. */
896 gfc_traverse_user_op (gfc_namespace *ns, void (*func) (gfc_user_op *))
898 traverse_uop (ns->uop_root, func);
902 /* Function to display a common block. */
905 show_common (gfc_symtree *st)
910 fprintf (dumpfile, "common: /%s/ ", st->name);
912 s = st->n.common->head;
915 fprintf (dumpfile, "%s", s->name);
918 fputs (", ", dumpfile);
920 fputc ('\n', dumpfile);
924 /* Worker function to display the symbol tree. */
927 show_symtree (gfc_symtree *st)
930 fprintf (dumpfile, "symtree: %s Ambig %d", st->name, st->ambiguous);
932 if (st->n.sym->ns != gfc_current_ns)
933 fprintf (dumpfile, " from namespace %s", st->n.sym->ns->proc_name->name);
935 show_symbol (st->n.sym);
939 /******************* Show gfc_code structures **************/
942 /* Show a list of code structures. Mutually recursive with
946 show_code (int level, gfc_code *c)
948 for (; c; c = c->next)
949 show_code_node (level, c);
953 show_namelist (gfc_namelist *n)
955 for (; n->next; n = n->next)
956 fprintf (dumpfile, "%s,", n->sym->name);
957 fprintf (dumpfile, "%s", n->sym->name);
960 /* Show a single OpenMP directive node and everything underneath it
964 show_omp_node (int level, gfc_code *c)
966 gfc_omp_clauses *omp_clauses = NULL;
967 const char *name = NULL;
971 case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
972 case EXEC_OMP_BARRIER: name = "BARRIER"; break;
973 case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
974 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
975 case EXEC_OMP_DO: name = "DO"; break;
976 case EXEC_OMP_MASTER: name = "MASTER"; break;
977 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
978 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
979 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
980 case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
981 case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
982 case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
983 case EXEC_OMP_SINGLE: name = "SINGLE"; break;
984 case EXEC_OMP_TASK: name = "TASK"; break;
985 case EXEC_OMP_TASKWAIT: name = "TASKWAIT"; break;
986 case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
990 fprintf (dumpfile, "!$OMP %s", name);
994 case EXEC_OMP_PARALLEL:
995 case EXEC_OMP_PARALLEL_DO:
996 case EXEC_OMP_PARALLEL_SECTIONS:
997 case EXEC_OMP_SECTIONS:
998 case EXEC_OMP_SINGLE:
999 case EXEC_OMP_WORKSHARE:
1000 case EXEC_OMP_PARALLEL_WORKSHARE:
1002 omp_clauses = c->ext.omp_clauses;
1004 case EXEC_OMP_CRITICAL:
1005 if (c->ext.omp_name)
1006 fprintf (dumpfile, " (%s)", c->ext.omp_name);
1008 case EXEC_OMP_FLUSH:
1009 if (c->ext.omp_namelist)
1011 fputs (" (", dumpfile);
1012 show_namelist (c->ext.omp_namelist);
1013 fputc (')', dumpfile);
1016 case EXEC_OMP_BARRIER:
1017 case EXEC_OMP_TASKWAIT:
1026 if (omp_clauses->if_expr)
1028 fputs (" IF(", dumpfile);
1029 show_expr (omp_clauses->if_expr);
1030 fputc (')', dumpfile);
1032 if (omp_clauses->num_threads)
1034 fputs (" NUM_THREADS(", dumpfile);
1035 show_expr (omp_clauses->num_threads);
1036 fputc (')', dumpfile);
1038 if (omp_clauses->sched_kind != OMP_SCHED_NONE)
1041 switch (omp_clauses->sched_kind)
1043 case OMP_SCHED_STATIC: type = "STATIC"; break;
1044 case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
1045 case OMP_SCHED_GUIDED: type = "GUIDED"; break;
1046 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
1047 case OMP_SCHED_AUTO: type = "AUTO"; break;
1051 fprintf (dumpfile, " SCHEDULE (%s", type);
1052 if (omp_clauses->chunk_size)
1054 fputc (',', dumpfile);
1055 show_expr (omp_clauses->chunk_size);
1057 fputc (')', dumpfile);
1059 if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
1062 switch (omp_clauses->default_sharing)
1064 case OMP_DEFAULT_NONE: type = "NONE"; break;
1065 case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
1066 case OMP_DEFAULT_SHARED: type = "SHARED"; break;
1067 case OMP_DEFAULT_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1071 fprintf (dumpfile, " DEFAULT(%s)", type);
1073 if (omp_clauses->ordered)
1074 fputs (" ORDERED", dumpfile);
1075 if (omp_clauses->untied)
1076 fputs (" UNTIED", dumpfile);
1077 if (omp_clauses->collapse)
1078 fprintf (dumpfile, " COLLAPSE(%d)", omp_clauses->collapse);
1079 for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
1080 if (omp_clauses->lists[list_type] != NULL
1081 && list_type != OMP_LIST_COPYPRIVATE)
1084 if (list_type >= OMP_LIST_REDUCTION_FIRST)
1088 case OMP_LIST_PLUS: type = "+"; break;
1089 case OMP_LIST_MULT: type = "*"; break;
1090 case OMP_LIST_SUB: type = "-"; break;
1091 case OMP_LIST_AND: type = ".AND."; break;
1092 case OMP_LIST_OR: type = ".OR."; break;
1093 case OMP_LIST_EQV: type = ".EQV."; break;
1094 case OMP_LIST_NEQV: type = ".NEQV."; break;
1095 case OMP_LIST_MAX: type = "MAX"; break;
1096 case OMP_LIST_MIN: type = "MIN"; break;
1097 case OMP_LIST_IAND: type = "IAND"; break;
1098 case OMP_LIST_IOR: type = "IOR"; break;
1099 case OMP_LIST_IEOR: type = "IEOR"; break;
1103 fprintf (dumpfile, " REDUCTION(%s:", type);
1109 case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
1110 case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1111 case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
1112 case OMP_LIST_SHARED: type = "SHARED"; break;
1113 case OMP_LIST_COPYIN: type = "COPYIN"; break;
1117 fprintf (dumpfile, " %s(", type);
1119 show_namelist (omp_clauses->lists[list_type]);
1120 fputc (')', dumpfile);
1123 fputc ('\n', dumpfile);
1124 if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
1126 gfc_code *d = c->block;
1129 show_code (level + 1, d->next);
1130 if (d->block == NULL)
1132 code_indent (level, 0);
1133 fputs ("!$OMP SECTION\n", dumpfile);
1138 show_code (level + 1, c->block->next);
1139 if (c->op == EXEC_OMP_ATOMIC)
1141 code_indent (level, 0);
1142 fprintf (dumpfile, "!$OMP END %s", name);
1143 if (omp_clauses != NULL)
1145 if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
1147 fputs (" COPYPRIVATE(", dumpfile);
1148 show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
1149 fputc (')', dumpfile);
1151 else if (omp_clauses->nowait)
1152 fputs (" NOWAIT", dumpfile);
1154 else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
1155 fprintf (dumpfile, " (%s)", c->ext.omp_name);
1159 /* Show a single code node and everything underneath it if necessary. */
1162 show_code_node (int level, gfc_code *c)
1164 gfc_forall_iterator *fa;
1174 code_indent (level, c->here);
1178 case EXEC_END_PROCEDURE:
1182 fputs ("NOP", dumpfile);
1186 fputs ("CONTINUE", dumpfile);
1190 fprintf (dumpfile, "ENTRY %s", c->ext.entry->sym->name);
1193 case EXEC_INIT_ASSIGN:
1195 fputs ("ASSIGN ", dumpfile);
1196 show_expr (c->expr1);
1197 fputc (' ', dumpfile);
1198 show_expr (c->expr2);
1201 case EXEC_LABEL_ASSIGN:
1202 fputs ("LABEL ASSIGN ", dumpfile);
1203 show_expr (c->expr1);
1204 fprintf (dumpfile, " %d", c->label1->value);
1207 case EXEC_POINTER_ASSIGN:
1208 fputs ("POINTER ASSIGN ", dumpfile);
1209 show_expr (c->expr1);
1210 fputc (' ', dumpfile);
1211 show_expr (c->expr2);
1215 fputs ("GOTO ", dumpfile);
1217 fprintf (dumpfile, "%d", c->label1->value);
1220 show_expr (c->expr1);
1224 fputs (", (", dumpfile);
1225 for (; d; d = d ->block)
1227 code_indent (level, d->label1);
1228 if (d->block != NULL)
1229 fputc (',', dumpfile);
1231 fputc (')', dumpfile);
1238 case EXEC_ASSIGN_CALL:
1239 if (c->resolved_sym)
1240 fprintf (dumpfile, "CALL %s ", c->resolved_sym->name);
1241 else if (c->symtree)
1242 fprintf (dumpfile, "CALL %s ", c->symtree->name);
1244 fputs ("CALL ?? ", dumpfile);
1246 show_actual_arglist (c->ext.actual);
1250 fputs ("CALL ", dumpfile);
1251 show_compcall (c->expr1);
1255 fputs ("CALL ", dumpfile);
1256 show_expr (c->expr1);
1257 show_actual_arglist (c->ext.actual);
1261 fputs ("RETURN ", dumpfile);
1263 show_expr (c->expr1);
1267 fputs ("PAUSE ", dumpfile);
1269 if (c->expr1 != NULL)
1270 show_expr (c->expr1);
1272 fprintf (dumpfile, "%d", c->ext.stop_code);
1276 case EXEC_ERROR_STOP:
1277 fputs ("ERROR ", dumpfile);
1281 fputs ("STOP ", dumpfile);
1283 if (c->expr1 != NULL)
1284 show_expr (c->expr1);
1286 fprintf (dumpfile, "%d", c->ext.stop_code);
1291 fputs ("SYNC ALL ", dumpfile);
1292 if (c->expr2 != NULL)
1294 fputs (" stat=", dumpfile);
1295 show_expr (c->expr2);
1297 if (c->expr3 != NULL)
1299 fputs (" errmsg=", dumpfile);
1300 show_expr (c->expr3);
1304 case EXEC_SYNC_MEMORY:
1305 fputs ("SYNC MEMORY ", dumpfile);
1306 if (c->expr2 != NULL)
1308 fputs (" stat=", dumpfile);
1309 show_expr (c->expr2);
1311 if (c->expr3 != NULL)
1313 fputs (" errmsg=", dumpfile);
1314 show_expr (c->expr3);
1318 case EXEC_SYNC_IMAGES:
1319 fputs ("SYNC IMAGES image-set=", dumpfile);
1320 if (c->expr1 != NULL)
1321 show_expr (c->expr1);
1323 fputs ("* ", dumpfile);
1324 if (c->expr2 != NULL)
1326 fputs (" stat=", dumpfile);
1327 show_expr (c->expr2);
1329 if (c->expr3 != NULL)
1331 fputs (" errmsg=", dumpfile);
1332 show_expr (c->expr3);
1336 case EXEC_ARITHMETIC_IF:
1337 fputs ("IF ", dumpfile);
1338 show_expr (c->expr1);
1339 fprintf (dumpfile, " %d, %d, %d",
1340 c->label1->value, c->label2->value, c->label3->value);
1345 fputs ("IF ", dumpfile);
1346 show_expr (d->expr1);
1347 fputc ('\n', dumpfile);
1348 show_code (level + 1, d->next);
1351 for (; d; d = d->block)
1353 code_indent (level, 0);
1355 if (d->expr1 == NULL)
1356 fputs ("ELSE\n", dumpfile);
1359 fputs ("ELSE IF ", dumpfile);
1360 show_expr (d->expr1);
1361 fputc ('\n', dumpfile);
1364 show_code (level + 1, d->next);
1367 code_indent (level, c->label1);
1369 fputs ("ENDIF", dumpfile);
1374 fputs ("SELECT CASE ", dumpfile);
1375 show_expr (c->expr1);
1376 fputc ('\n', dumpfile);
1378 for (; d; d = d->block)
1380 code_indent (level, 0);
1382 fputs ("CASE ", dumpfile);
1383 for (cp = d->ext.case_list; cp; cp = cp->next)
1385 fputc ('(', dumpfile);
1386 show_expr (cp->low);
1387 fputc (' ', dumpfile);
1388 show_expr (cp->high);
1389 fputc (')', dumpfile);
1390 fputc (' ', dumpfile);
1392 fputc ('\n', dumpfile);
1394 show_code (level + 1, d->next);
1397 code_indent (level, c->label1);
1398 fputs ("END SELECT", dumpfile);
1402 fputs ("WHERE ", dumpfile);
1405 show_expr (d->expr1);
1406 fputc ('\n', dumpfile);
1408 show_code (level + 1, d->next);
1410 for (d = d->block; d; d = d->block)
1412 code_indent (level, 0);
1413 fputs ("ELSE WHERE ", dumpfile);
1414 show_expr (d->expr1);
1415 fputc ('\n', dumpfile);
1416 show_code (level + 1, d->next);
1419 code_indent (level, 0);
1420 fputs ("END WHERE", dumpfile);
1425 fputs ("FORALL ", dumpfile);
1426 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1428 show_expr (fa->var);
1429 fputc (' ', dumpfile);
1430 show_expr (fa->start);
1431 fputc (':', dumpfile);
1432 show_expr (fa->end);
1433 fputc (':', dumpfile);
1434 show_expr (fa->stride);
1436 if (fa->next != NULL)
1437 fputc (',', dumpfile);
1440 if (c->expr1 != NULL)
1442 fputc (',', dumpfile);
1443 show_expr (c->expr1);
1445 fputc ('\n', dumpfile);
1447 show_code (level + 1, c->block->next);
1449 code_indent (level, 0);
1450 fputs ("END FORALL", dumpfile);
1454 fputs ("CRITICAL\n", dumpfile);
1455 show_code (level + 1, c->block->next);
1456 code_indent (level, 0);
1457 fputs ("END CRITICAL", dumpfile);
1461 fputs ("DO ", dumpfile);
1463 show_expr (c->ext.iterator->var);
1464 fputc ('=', dumpfile);
1465 show_expr (c->ext.iterator->start);
1466 fputc (' ', dumpfile);
1467 show_expr (c->ext.iterator->end);
1468 fputc (' ', dumpfile);
1469 show_expr (c->ext.iterator->step);
1470 fputc ('\n', dumpfile);
1472 show_code (level + 1, c->block->next);
1474 code_indent (level, 0);
1475 fputs ("END DO", dumpfile);
1479 fputs ("DO WHILE ", dumpfile);
1480 show_expr (c->expr1);
1481 fputc ('\n', dumpfile);
1483 show_code (level + 1, c->block->next);
1485 code_indent (level, c->label1);
1486 fputs ("END DO", dumpfile);
1490 fputs ("CYCLE", dumpfile);
1492 fprintf (dumpfile, " %s", c->symtree->n.sym->name);
1496 fputs ("EXIT", dumpfile);
1498 fprintf (dumpfile, " %s", c->symtree->n.sym->name);
1502 fputs ("ALLOCATE ", dumpfile);
1505 fputs (" STAT=", dumpfile);
1506 show_expr (c->expr1);
1511 fputs (" ERRMSG=", dumpfile);
1512 show_expr (c->expr2);
1515 for (a = c->ext.alloc.list; a; a = a->next)
1517 fputc (' ', dumpfile);
1518 show_expr (a->expr);
1523 case EXEC_DEALLOCATE:
1524 fputs ("DEALLOCATE ", dumpfile);
1527 fputs (" STAT=", dumpfile);
1528 show_expr (c->expr1);
1533 fputs (" ERRMSG=", dumpfile);
1534 show_expr (c->expr2);
1537 for (a = c->ext.alloc.list; a; a = a->next)
1539 fputc (' ', dumpfile);
1540 show_expr (a->expr);
1546 fputs ("OPEN", dumpfile);
1551 fputs (" UNIT=", dumpfile);
1552 show_expr (open->unit);
1556 fputs (" IOMSG=", dumpfile);
1557 show_expr (open->iomsg);
1561 fputs (" IOSTAT=", dumpfile);
1562 show_expr (open->iostat);
1566 fputs (" FILE=", dumpfile);
1567 show_expr (open->file);
1571 fputs (" STATUS=", dumpfile);
1572 show_expr (open->status);
1576 fputs (" ACCESS=", dumpfile);
1577 show_expr (open->access);
1581 fputs (" FORM=", dumpfile);
1582 show_expr (open->form);
1586 fputs (" RECL=", dumpfile);
1587 show_expr (open->recl);
1591 fputs (" BLANK=", dumpfile);
1592 show_expr (open->blank);
1596 fputs (" POSITION=", dumpfile);
1597 show_expr (open->position);
1601 fputs (" ACTION=", dumpfile);
1602 show_expr (open->action);
1606 fputs (" DELIM=", dumpfile);
1607 show_expr (open->delim);
1611 fputs (" PAD=", dumpfile);
1612 show_expr (open->pad);
1616 fputs (" DECIMAL=", dumpfile);
1617 show_expr (open->decimal);
1621 fputs (" ENCODING=", dumpfile);
1622 show_expr (open->encoding);
1626 fputs (" ROUND=", dumpfile);
1627 show_expr (open->round);
1631 fputs (" SIGN=", dumpfile);
1632 show_expr (open->sign);
1636 fputs (" CONVERT=", dumpfile);
1637 show_expr (open->convert);
1639 if (open->asynchronous)
1641 fputs (" ASYNCHRONOUS=", dumpfile);
1642 show_expr (open->asynchronous);
1644 if (open->err != NULL)
1645 fprintf (dumpfile, " ERR=%d", open->err->value);
1650 fputs ("CLOSE", dumpfile);
1651 close = c->ext.close;
1655 fputs (" UNIT=", dumpfile);
1656 show_expr (close->unit);
1660 fputs (" IOMSG=", dumpfile);
1661 show_expr (close->iomsg);
1665 fputs (" IOSTAT=", dumpfile);
1666 show_expr (close->iostat);
1670 fputs (" STATUS=", dumpfile);
1671 show_expr (close->status);
1673 if (close->err != NULL)
1674 fprintf (dumpfile, " ERR=%d", close->err->value);
1677 case EXEC_BACKSPACE:
1678 fputs ("BACKSPACE", dumpfile);
1682 fputs ("ENDFILE", dumpfile);
1686 fputs ("REWIND", dumpfile);
1690 fputs ("FLUSH", dumpfile);
1693 fp = c->ext.filepos;
1697 fputs (" UNIT=", dumpfile);
1698 show_expr (fp->unit);
1702 fputs (" IOMSG=", dumpfile);
1703 show_expr (fp->iomsg);
1707 fputs (" IOSTAT=", dumpfile);
1708 show_expr (fp->iostat);
1710 if (fp->err != NULL)
1711 fprintf (dumpfile, " ERR=%d", fp->err->value);
1715 fputs ("INQUIRE", dumpfile);
1720 fputs (" UNIT=", dumpfile);
1721 show_expr (i->unit);
1725 fputs (" FILE=", dumpfile);
1726 show_expr (i->file);
1731 fputs (" IOMSG=", dumpfile);
1732 show_expr (i->iomsg);
1736 fputs (" IOSTAT=", dumpfile);
1737 show_expr (i->iostat);
1741 fputs (" EXIST=", dumpfile);
1742 show_expr (i->exist);
1746 fputs (" OPENED=", dumpfile);
1747 show_expr (i->opened);
1751 fputs (" NUMBER=", dumpfile);
1752 show_expr (i->number);
1756 fputs (" NAMED=", dumpfile);
1757 show_expr (i->named);
1761 fputs (" NAME=", dumpfile);
1762 show_expr (i->name);
1766 fputs (" ACCESS=", dumpfile);
1767 show_expr (i->access);
1771 fputs (" SEQUENTIAL=", dumpfile);
1772 show_expr (i->sequential);
1777 fputs (" DIRECT=", dumpfile);
1778 show_expr (i->direct);
1782 fputs (" FORM=", dumpfile);
1783 show_expr (i->form);
1787 fputs (" FORMATTED", dumpfile);
1788 show_expr (i->formatted);
1792 fputs (" UNFORMATTED=", dumpfile);
1793 show_expr (i->unformatted);
1797 fputs (" RECL=", dumpfile);
1798 show_expr (i->recl);
1802 fputs (" NEXTREC=", dumpfile);
1803 show_expr (i->nextrec);
1807 fputs (" BLANK=", dumpfile);
1808 show_expr (i->blank);
1812 fputs (" POSITION=", dumpfile);
1813 show_expr (i->position);
1817 fputs (" ACTION=", dumpfile);
1818 show_expr (i->action);
1822 fputs (" READ=", dumpfile);
1823 show_expr (i->read);
1827 fputs (" WRITE=", dumpfile);
1828 show_expr (i->write);
1832 fputs (" READWRITE=", dumpfile);
1833 show_expr (i->readwrite);
1837 fputs (" DELIM=", dumpfile);
1838 show_expr (i->delim);
1842 fputs (" PAD=", dumpfile);
1847 fputs (" CONVERT=", dumpfile);
1848 show_expr (i->convert);
1850 if (i->asynchronous)
1852 fputs (" ASYNCHRONOUS=", dumpfile);
1853 show_expr (i->asynchronous);
1857 fputs (" DECIMAL=", dumpfile);
1858 show_expr (i->decimal);
1862 fputs (" ENCODING=", dumpfile);
1863 show_expr (i->encoding);
1867 fputs (" PENDING=", dumpfile);
1868 show_expr (i->pending);
1872 fputs (" ROUND=", dumpfile);
1873 show_expr (i->round);
1877 fputs (" SIGN=", dumpfile);
1878 show_expr (i->sign);
1882 fputs (" SIZE=", dumpfile);
1883 show_expr (i->size);
1887 fputs (" ID=", dumpfile);
1892 fprintf (dumpfile, " ERR=%d", i->err->value);
1896 fputs ("IOLENGTH ", dumpfile);
1897 show_expr (c->expr1);
1902 fputs ("READ", dumpfile);
1906 fputs ("WRITE", dumpfile);
1912 fputs (" UNIT=", dumpfile);
1913 show_expr (dt->io_unit);
1916 if (dt->format_expr)
1918 fputs (" FMT=", dumpfile);
1919 show_expr (dt->format_expr);
1922 if (dt->format_label != NULL)
1923 fprintf (dumpfile, " FMT=%d", dt->format_label->value);
1925 fprintf (dumpfile, " NML=%s", dt->namelist->name);
1929 fputs (" IOMSG=", dumpfile);
1930 show_expr (dt->iomsg);
1934 fputs (" IOSTAT=", dumpfile);
1935 show_expr (dt->iostat);
1939 fputs (" SIZE=", dumpfile);
1940 show_expr (dt->size);
1944 fputs (" REC=", dumpfile);
1945 show_expr (dt->rec);
1949 fputs (" ADVANCE=", dumpfile);
1950 show_expr (dt->advance);
1954 fputs (" ID=", dumpfile);
1959 fputs (" POS=", dumpfile);
1960 show_expr (dt->pos);
1962 if (dt->asynchronous)
1964 fputs (" ASYNCHRONOUS=", dumpfile);
1965 show_expr (dt->asynchronous);
1969 fputs (" BLANK=", dumpfile);
1970 show_expr (dt->blank);
1974 fputs (" DECIMAL=", dumpfile);
1975 show_expr (dt->decimal);
1979 fputs (" DELIM=", dumpfile);
1980 show_expr (dt->delim);
1984 fputs (" PAD=", dumpfile);
1985 show_expr (dt->pad);
1989 fputs (" ROUND=", dumpfile);
1990 show_expr (dt->round);
1994 fputs (" SIGN=", dumpfile);
1995 show_expr (dt->sign);
1999 fputc ('\n', dumpfile);
2000 for (c = c->block->next; c; c = c->next)
2001 show_code_node (level + (c->next != NULL), c);
2005 fputs ("TRANSFER ", dumpfile);
2006 show_expr (c->expr1);
2010 fputs ("DT_END", dumpfile);
2013 if (dt->err != NULL)
2014 fprintf (dumpfile, " ERR=%d", dt->err->value);
2015 if (dt->end != NULL)
2016 fprintf (dumpfile, " END=%d", dt->end->value);
2017 if (dt->eor != NULL)
2018 fprintf (dumpfile, " EOR=%d", dt->eor->value);
2021 case EXEC_OMP_ATOMIC:
2022 case EXEC_OMP_BARRIER:
2023 case EXEC_OMP_CRITICAL:
2024 case EXEC_OMP_FLUSH:
2026 case EXEC_OMP_MASTER:
2027 case EXEC_OMP_ORDERED:
2028 case EXEC_OMP_PARALLEL:
2029 case EXEC_OMP_PARALLEL_DO:
2030 case EXEC_OMP_PARALLEL_SECTIONS:
2031 case EXEC_OMP_PARALLEL_WORKSHARE:
2032 case EXEC_OMP_SECTIONS:
2033 case EXEC_OMP_SINGLE:
2035 case EXEC_OMP_TASKWAIT:
2036 case EXEC_OMP_WORKSHARE:
2037 show_omp_node (level, c);
2041 gfc_internal_error ("show_code_node(): Bad statement code");
2044 fputc ('\n', dumpfile);
2048 /* Show an equivalence chain. */
2051 show_equiv (gfc_equiv *eq)
2054 fputs ("Equivalence: ", dumpfile);
2057 show_expr (eq->expr);
2060 fputs (", ", dumpfile);
2065 /* Show a freakin' whole namespace. */
2068 show_namespace (gfc_namespace *ns)
2070 gfc_interface *intr;
2071 gfc_namespace *save;
2076 save = gfc_current_ns;
2080 fputs ("Namespace:", dumpfile);
2088 while (i < GFC_LETTERS - 1
2089 && gfc_compare_types(&ns->default_type[i+1],
2090 &ns->default_type[l]))
2094 fprintf (dumpfile, " %c-%c: ", l+'A', i+'A');
2096 fprintf (dumpfile, " %c: ", l+'A');
2098 show_typespec(&ns->default_type[l]);
2100 } while (i < GFC_LETTERS);
2102 if (ns->proc_name != NULL)
2105 fprintf (dumpfile, "procedure name = %s", ns->proc_name->name);
2108 gfc_current_ns = ns;
2109 gfc_traverse_symtree (ns->common_root, show_common);
2111 gfc_traverse_symtree (ns->sym_root, show_symtree);
2113 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
2115 /* User operator interfaces */
2121 fprintf (dumpfile, "Operator interfaces for %s:",
2122 gfc_op2string ((gfc_intrinsic_op) op));
2124 for (; intr; intr = intr->next)
2125 fprintf (dumpfile, " %s", intr->sym->name);
2128 if (ns->uop_root != NULL)
2131 fputs ("User operators:\n", dumpfile);
2132 gfc_traverse_user_op (ns, show_uop);
2136 for (eq = ns->equiv; eq; eq = eq->next)
2139 fputc ('\n', dumpfile);
2140 fputc ('\n', dumpfile);
2142 show_code (0, ns->code);
2144 for (ns = ns->contained; ns; ns = ns->sibling)
2147 fputs ("CONTAINS\n", dumpfile);
2148 show_namespace (ns);
2152 fputc ('\n', dumpfile);
2153 gfc_current_ns = save;
2157 /* Main function for dumping a parse tree. */
2160 gfc_dump_parse_tree (gfc_namespace *ns, FILE *file)
2163 show_namespace (ns);