2 Copyright (C) 2003, 2004, 2005, 2006, 2007
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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
24 /* Actually this is just a collection of routines that used to be
25 scattered around the sources. Now that they are all in a single
26 file, almost all of them can be static, and the other files don't
27 have this mess in them.
29 As a nice side-effect, this file can act as documentation of the
30 gfc_code and gfc_expr structures and all their friends and
38 /* Keep track of indentation for symbol tree dumps. */
39 static int show_level = 0;
41 /* Do indentation for a specific level. */
44 code_indent (int level, gfc_st_label *label)
49 gfc_status ("%-5d ", label->value);
53 for (i = 0; i < 2 * level; i++)
54 gfc_status_char (' ');
58 /* Simple indentation at the current level. This one
59 is used to show symbols. */
65 code_indent (show_level, NULL);
69 /* Show type-specific information. */
72 gfc_show_typespec (gfc_typespec *ts)
74 gfc_status ("(%s ", gfc_basic_typename (ts->type));
79 gfc_status ("%s", ts->derived->name);
83 gfc_show_expr (ts->cl->length);
87 gfc_status ("%d", ts->kind);
95 /* Show an actual argument list. */
98 gfc_show_actual_arglist (gfc_actual_arglist *a)
102 for (; a; a = a->next)
104 gfc_status_char ('(');
106 gfc_status ("%s = ", a->name);
108 gfc_show_expr (a->expr);
110 gfc_status ("(arg not-present)");
112 gfc_status_char (')');
121 /* Show a gfc_array_spec array specification structure. */
124 gfc_show_array_spec (gfc_array_spec *as)
135 gfc_status ("(%d", as->rank);
141 case AS_EXPLICIT: c = "AS_EXPLICIT"; break;
142 case AS_DEFERRED: c = "AS_DEFERRED"; break;
143 case AS_ASSUMED_SIZE: c = "AS_ASSUMED_SIZE"; break;
144 case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
146 gfc_internal_error ("gfc_show_array_spec(): Unhandled array shape "
149 gfc_status (" %s ", c);
151 for (i = 0; i < as->rank; i++)
153 gfc_show_expr (as->lower[i]);
154 gfc_status_char (' ');
155 gfc_show_expr (as->upper[i]);
156 gfc_status_char (' ');
164 /* Show a gfc_array_ref array reference structure. */
167 gfc_show_array_ref (gfc_array_ref * ar)
171 gfc_status_char ('(');
180 for (i = 0; i < ar->dimen; i++)
182 /* There are two types of array sections: either the
183 elements are identified by an integer array ('vector'),
184 or by an index range. In the former case we only have to
185 print the start expression which contains the vector, in
186 the latter case we have to print any of lower and upper
187 bound and the stride, if they're present. */
189 if (ar->start[i] != NULL)
190 gfc_show_expr (ar->start[i]);
192 if (ar->dimen_type[i] == DIMEN_RANGE)
194 gfc_status_char (':');
196 if (ar->end[i] != NULL)
197 gfc_show_expr (ar->end[i]);
199 if (ar->stride[i] != NULL)
201 gfc_status_char (':');
202 gfc_show_expr (ar->stride[i]);
206 if (i != ar->dimen - 1)
212 for (i = 0; i < ar->dimen; i++)
214 gfc_show_expr (ar->start[i]);
215 if (i != ar->dimen - 1)
221 gfc_status ("UNKNOWN");
225 gfc_internal_error ("gfc_show_array_ref(): Unknown array reference");
228 gfc_status_char (')');
232 /* Show a list of gfc_ref structures. */
235 gfc_show_ref (gfc_ref *p)
237 for (; p; p = p->next)
241 gfc_show_array_ref (&p->u.ar);
245 gfc_status (" %% %s", p->u.c.component->name);
249 gfc_status_char ('(');
250 gfc_show_expr (p->u.ss.start);
251 gfc_status_char (':');
252 gfc_show_expr (p->u.ss.end);
253 gfc_status_char (')');
257 gfc_internal_error ("gfc_show_ref(): Bad component code");
262 /* Display a constructor. Works recursively for array constructors. */
265 gfc_show_constructor (gfc_constructor *c)
267 for (; c; c = c->next)
269 if (c->iterator == NULL)
270 gfc_show_expr (c->expr);
273 gfc_status_char ('(');
274 gfc_show_expr (c->expr);
276 gfc_status_char (' ');
277 gfc_show_expr (c->iterator->var);
278 gfc_status_char ('=');
279 gfc_show_expr (c->iterator->start);
280 gfc_status_char (',');
281 gfc_show_expr (c->iterator->end);
282 gfc_status_char (',');
283 gfc_show_expr (c->iterator->step);
285 gfc_status_char (')');
294 /* Show an expression. */
297 gfc_show_expr (gfc_expr *p)
308 switch (p->expr_type)
311 c = p->value.character.string;
313 for (i = 0; i < p->value.character.length; i++, c++)
318 gfc_status ("%c", *c);
321 gfc_show_ref (p->ref);
325 gfc_status ("%s(", p->ts.derived->name);
326 gfc_show_constructor (p->value.constructor);
327 gfc_status_char (')');
332 gfc_show_constructor (p->value.constructor);
335 gfc_show_ref (p->ref);
339 gfc_status ("NULL()");
346 mpz_out_str (stdout, 10, p->value.integer);
348 if (p->ts.kind != gfc_default_integer_kind)
349 gfc_status ("_%d", p->ts.kind);
353 if (p->value.logical)
354 gfc_status (".true.");
356 gfc_status (".false.");
360 mpfr_out_str (stdout, 10, 0, p->value.real, GFC_RND_MODE);
361 if (p->ts.kind != gfc_default_real_kind)
362 gfc_status ("_%d", p->ts.kind);
366 c = p->value.character.string;
368 gfc_status_char ('\'');
370 for (i = 0; i < p->value.character.length; i++, c++)
375 gfc_status_char (*c);
378 gfc_status_char ('\'');
383 gfc_status ("(complex ");
385 mpfr_out_str (stdout, 10, 0, p->value.complex.r, GFC_RND_MODE);
386 if (p->ts.kind != gfc_default_complex_kind)
387 gfc_status ("_%d", p->ts.kind);
391 mpfr_out_str (stdout, 10, 0, p->value.complex.i, GFC_RND_MODE);
392 if (p->ts.kind != gfc_default_complex_kind)
393 gfc_status ("_%d", p->ts.kind);
399 gfc_status ("%dH", p->representation.length);
400 c = p->representation.string;
401 for (i = 0; i < p->representation.length; i++, c++)
403 gfc_status_char (*c);
412 if (p->representation.string)
415 c = p->representation.string;
416 for (i = 0; i < p->representation.length; i++, c++)
418 gfc_status ("%.2x", (unsigned int) *c);
419 if (i < p->representation.length - 1)
420 gfc_status_char (',');
422 gfc_status_char ('}');
428 if (p->symtree->n.sym->ns && p->symtree->n.sym->ns->proc_name)
429 gfc_status ("%s:", p->symtree->n.sym->ns->proc_name->name);
430 gfc_status ("%s", p->symtree->n.sym->name);
431 gfc_show_ref (p->ref);
436 switch (p->value.op.operator)
438 case INTRINSIC_UPLUS:
441 case INTRINSIC_UMINUS:
447 case INTRINSIC_MINUS:
450 case INTRINSIC_TIMES:
453 case INTRINSIC_DIVIDE:
456 case INTRINSIC_POWER:
459 case INTRINSIC_CONCAT:
472 gfc_status ("NEQV ");
475 case INTRINSIC_EQ_OS:
479 case INTRINSIC_NE_OS:
483 case INTRINSIC_GT_OS:
487 case INTRINSIC_GE_OS:
491 case INTRINSIC_LT_OS:
495 case INTRINSIC_LE_OS:
501 case INTRINSIC_PARENTHESES:
502 gfc_status ("parens");
507 ("gfc_show_expr(): Bad intrinsic in expression!");
510 gfc_show_expr (p->value.op.op1);
515 gfc_show_expr (p->value.op.op2);
522 if (p->value.function.name == NULL)
524 gfc_status ("%s[", p->symtree->n.sym->name);
525 gfc_show_actual_arglist (p->value.function.actual);
526 gfc_status_char (']');
530 gfc_status ("%s[[", p->value.function.name);
531 gfc_show_actual_arglist (p->value.function.actual);
532 gfc_status_char (']');
533 gfc_status_char (']');
539 gfc_internal_error ("gfc_show_expr(): Don't know how to show expr");
544 /* Show symbol attributes. The flavor and intent are followed by
545 whatever single bit attributes are present. */
548 gfc_show_attr (symbol_attribute *attr)
551 gfc_status ("(%s %s %s %s %s", gfc_code2string (flavors, attr->flavor),
552 gfc_intent_string (attr->intent),
553 gfc_code2string (access_types, attr->access),
554 gfc_code2string (procedures, attr->proc),
555 gfc_code2string (save_status, attr->save));
557 if (attr->allocatable)
558 gfc_status (" ALLOCATABLE");
560 gfc_status (" DIMENSION");
562 gfc_status (" EXTERNAL");
564 gfc_status (" INTRINSIC");
566 gfc_status (" OPTIONAL");
568 gfc_status (" POINTER");
570 gfc_status (" PROTECTED");
572 gfc_status (" VALUE");
574 gfc_status (" VOLATILE");
575 if (attr->threadprivate)
576 gfc_status (" THREADPRIVATE");
578 gfc_status (" TARGET");
580 gfc_status (" DUMMY");
582 gfc_status (" RESULT");
584 gfc_status (" ENTRY");
587 gfc_status (" DATA");
589 gfc_status (" USE-ASSOC");
590 if (attr->in_namelist)
591 gfc_status (" IN-NAMELIST");
593 gfc_status (" IN-COMMON");
596 gfc_status (" FUNCTION");
597 if (attr->subroutine)
598 gfc_status (" SUBROUTINE");
599 if (attr->implicit_type)
600 gfc_status (" IMPLICIT-TYPE");
603 gfc_status (" SEQUENCE");
605 gfc_status (" ELEMENTAL");
607 gfc_status (" PURE");
609 gfc_status (" RECURSIVE");
615 /* Show components of a derived type. */
618 gfc_show_components (gfc_symbol *sym)
622 for (c = sym->components; c; c = c->next)
624 gfc_status ("(%s ", c->name);
625 gfc_show_typespec (&c->ts);
627 gfc_status (" POINTER");
629 gfc_status (" DIMENSION");
630 gfc_status_char (' ');
631 gfc_show_array_spec (c->as);
633 gfc_status (" %s", gfc_code2string (access_types, c->access));
636 gfc_status_char (' ');
641 /* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
642 show the interface. Information needed to reconstruct the list of
643 specific interfaces associated with a generic symbol is done within
647 gfc_show_symbol (gfc_symbol *sym)
649 gfc_formal_arglist *formal;
657 gfc_status ("symbol %s ", sym->name);
658 gfc_show_typespec (&sym->ts);
659 gfc_show_attr (&sym->attr);
664 gfc_status ("value: ");
665 gfc_show_expr (sym->value);
671 gfc_status ("Array spec:");
672 gfc_show_array_spec (sym->as);
678 gfc_status ("Generic interfaces:");
679 for (intr = sym->generic; intr; intr = intr->next)
680 gfc_status (" %s", intr->sym->name);
686 gfc_status ("result: %s", sym->result->name);
692 gfc_status ("components: ");
693 gfc_show_components (sym);
699 gfc_status ("Formal arglist:");
701 for (formal = sym->formal; formal; formal = formal->next)
703 if (formal->sym != NULL)
704 gfc_status (" %s", formal->sym->name);
706 gfc_status (" [Alt Return]");
713 gfc_status ("Formal namespace");
714 gfc_show_namespace (sym->formal_ns);
717 gfc_status_char ('\n');
721 /* Show a user-defined operator. Just prints an operator
722 and the name of the associated subroutine, really. */
725 show_uop (gfc_user_op *uop)
730 gfc_status ("%s:", uop->name);
732 for (intr = uop->operator; intr; intr = intr->next)
733 gfc_status (" %s", intr->sym->name);
737 /* Workhorse function for traversing the user operator symtree. */
740 traverse_uop (gfc_symtree *st, void (*func) (gfc_user_op *))
747 traverse_uop (st->left, func);
748 traverse_uop (st->right, func);
752 /* Traverse the tree of user operator nodes. */
755 gfc_traverse_user_op (gfc_namespace *ns, void (*func) (gfc_user_op *))
757 traverse_uop (ns->uop_root, func);
761 /* Function to display a common block. */
764 show_common (gfc_symtree *st)
769 gfc_status ("common: /%s/ ", st->name);
771 s = st->n.common->head;
774 gfc_status ("%s", s->name);
779 gfc_status_char ('\n');
783 /* Worker function to display the symbol tree. */
786 show_symtree (gfc_symtree *st)
789 gfc_status ("symtree: %s Ambig %d", st->name, st->ambiguous);
791 if (st->n.sym->ns != gfc_current_ns)
792 gfc_status (" from namespace %s", st->n.sym->ns->proc_name->name);
794 gfc_show_symbol (st->n.sym);
798 /******************* Show gfc_code structures **************/
802 static void gfc_show_code_node (int, gfc_code *);
804 /* Show a list of code structures. Mutually recursive with
805 gfc_show_code_node(). */
808 gfc_show_code (int level, gfc_code *c)
810 for (; c; c = c->next)
811 gfc_show_code_node (level, c);
815 gfc_show_namelist (gfc_namelist *n)
817 for (; n->next; n = n->next)
818 gfc_status ("%s,", n->sym->name);
819 gfc_status ("%s", n->sym->name);
822 /* Show a single OpenMP directive node and everything underneath it
826 gfc_show_omp_node (int level, gfc_code *c)
828 gfc_omp_clauses *omp_clauses = NULL;
829 const char *name = NULL;
833 case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
834 case EXEC_OMP_BARRIER: name = "BARRIER"; break;
835 case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
836 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
837 case EXEC_OMP_DO: name = "DO"; break;
838 case EXEC_OMP_MASTER: name = "MASTER"; break;
839 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
840 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
841 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
842 case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
843 case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
844 case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
845 case EXEC_OMP_SINGLE: name = "SINGLE"; break;
846 case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
850 gfc_status ("!$OMP %s", name);
854 case EXEC_OMP_PARALLEL:
855 case EXEC_OMP_PARALLEL_DO:
856 case EXEC_OMP_PARALLEL_SECTIONS:
857 case EXEC_OMP_SECTIONS:
858 case EXEC_OMP_SINGLE:
859 case EXEC_OMP_WORKSHARE:
860 case EXEC_OMP_PARALLEL_WORKSHARE:
861 omp_clauses = c->ext.omp_clauses;
863 case EXEC_OMP_CRITICAL:
865 gfc_status (" (%s)", c->ext.omp_name);
868 if (c->ext.omp_namelist)
871 gfc_show_namelist (c->ext.omp_namelist);
872 gfc_status_char (')');
875 case EXEC_OMP_BARRIER:
884 if (omp_clauses->if_expr)
887 gfc_show_expr (omp_clauses->if_expr);
888 gfc_status_char (')');
890 if (omp_clauses->num_threads)
892 gfc_status (" NUM_THREADS(");
893 gfc_show_expr (omp_clauses->num_threads);
894 gfc_status_char (')');
896 if (omp_clauses->sched_kind != OMP_SCHED_NONE)
899 switch (omp_clauses->sched_kind)
901 case OMP_SCHED_STATIC: type = "STATIC"; break;
902 case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
903 case OMP_SCHED_GUIDED: type = "GUIDED"; break;
904 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
908 gfc_status (" SCHEDULE (%s", type);
909 if (omp_clauses->chunk_size)
911 gfc_status_char (',');
912 gfc_show_expr (omp_clauses->chunk_size);
914 gfc_status_char (')');
916 if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
919 switch (omp_clauses->default_sharing)
921 case OMP_DEFAULT_NONE: type = "NONE"; break;
922 case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
923 case OMP_DEFAULT_SHARED: type = "SHARED"; break;
924 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
928 gfc_status (" DEFAULT(%s)", type);
930 if (omp_clauses->ordered)
931 gfc_status (" ORDERED");
932 for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
933 if (omp_clauses->lists[list_type] != NULL
934 && list_type != OMP_LIST_COPYPRIVATE)
937 if (list_type >= OMP_LIST_REDUCTION_FIRST)
941 case OMP_LIST_PLUS: type = "+"; break;
942 case OMP_LIST_MULT: type = "*"; break;
943 case OMP_LIST_SUB: type = "-"; break;
944 case OMP_LIST_AND: type = ".AND."; break;
945 case OMP_LIST_OR: type = ".OR."; break;
946 case OMP_LIST_EQV: type = ".EQV."; break;
947 case OMP_LIST_NEQV: type = ".NEQV."; break;
948 case OMP_LIST_MAX: type = "MAX"; break;
949 case OMP_LIST_MIN: type = "MIN"; break;
950 case OMP_LIST_IAND: type = "IAND"; break;
951 case OMP_LIST_IOR: type = "IOR"; break;
952 case OMP_LIST_IEOR: type = "IEOR"; break;
956 gfc_status (" REDUCTION(%s:", type);
962 case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
963 case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
964 case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
965 case OMP_LIST_SHARED: type = "SHARED"; break;
966 case OMP_LIST_COPYIN: type = "COPYIN"; break;
970 gfc_status (" %s(", type);
972 gfc_show_namelist (omp_clauses->lists[list_type]);
973 gfc_status_char (')');
976 gfc_status_char ('\n');
977 if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
979 gfc_code *d = c->block;
982 gfc_show_code (level + 1, d->next);
983 if (d->block == NULL)
985 code_indent (level, 0);
986 gfc_status ("!$OMP SECTION\n");
991 gfc_show_code (level + 1, c->block->next);
992 if (c->op == EXEC_OMP_ATOMIC)
994 code_indent (level, 0);
995 gfc_status ("!$OMP END %s", name);
996 if (omp_clauses != NULL)
998 if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
1000 gfc_status (" COPYPRIVATE(");
1001 gfc_show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
1002 gfc_status_char (')');
1004 else if (omp_clauses->nowait)
1005 gfc_status (" NOWAIT");
1007 else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
1008 gfc_status (" (%s)", c->ext.omp_name);
1012 /* Show a single code node and everything underneath it if necessary. */
1015 gfc_show_code_node (int level, gfc_code *c)
1017 gfc_forall_iterator *fa;
1027 code_indent (level, c->here);
1036 gfc_status ("CONTINUE");
1040 gfc_status ("ENTRY %s", c->ext.entry->sym->name);
1043 case EXEC_INIT_ASSIGN:
1045 gfc_status ("ASSIGN ");
1046 gfc_show_expr (c->expr);
1047 gfc_status_char (' ');
1048 gfc_show_expr (c->expr2);
1051 case EXEC_LABEL_ASSIGN:
1052 gfc_status ("LABEL ASSIGN ");
1053 gfc_show_expr (c->expr);
1054 gfc_status (" %d", c->label->value);
1057 case EXEC_POINTER_ASSIGN:
1058 gfc_status ("POINTER ASSIGN ");
1059 gfc_show_expr (c->expr);
1060 gfc_status_char (' ');
1061 gfc_show_expr (c->expr2);
1065 gfc_status ("GOTO ");
1067 gfc_status ("%d", c->label->value);
1070 gfc_show_expr (c->expr);
1075 for (; d; d = d ->block)
1077 code_indent (level, d->label);
1078 if (d->block != NULL)
1079 gfc_status_char (',');
1081 gfc_status_char (')');
1088 if (c->resolved_sym)
1089 gfc_status ("CALL %s ", c->resolved_sym->name);
1090 else if (c->symtree)
1091 gfc_status ("CALL %s ", c->symtree->name);
1093 gfc_status ("CALL ?? ");
1095 gfc_show_actual_arglist (c->ext.actual);
1099 gfc_status ("RETURN ");
1101 gfc_show_expr (c->expr);
1105 gfc_status ("PAUSE ");
1107 if (c->expr != NULL)
1108 gfc_show_expr (c->expr);
1110 gfc_status ("%d", c->ext.stop_code);
1115 gfc_status ("STOP ");
1117 if (c->expr != NULL)
1118 gfc_show_expr (c->expr);
1120 gfc_status ("%d", c->ext.stop_code);
1124 case EXEC_ARITHMETIC_IF:
1126 gfc_show_expr (c->expr);
1127 gfc_status (" %d, %d, %d",
1128 c->label->value, c->label2->value, c->label3->value);
1134 gfc_show_expr (d->expr);
1135 gfc_status_char ('\n');
1136 gfc_show_code (level + 1, d->next);
1139 for (; d; d = d->block)
1141 code_indent (level, 0);
1143 if (d->expr == NULL)
1144 gfc_status ("ELSE\n");
1147 gfc_status ("ELSE IF ");
1148 gfc_show_expr (d->expr);
1149 gfc_status_char ('\n');
1152 gfc_show_code (level + 1, d->next);
1155 code_indent (level, c->label);
1157 gfc_status ("ENDIF");
1162 gfc_status ("SELECT CASE ");
1163 gfc_show_expr (c->expr);
1164 gfc_status_char ('\n');
1166 for (; d; d = d->block)
1168 code_indent (level, 0);
1170 gfc_status ("CASE ");
1171 for (cp = d->ext.case_list; cp; cp = cp->next)
1173 gfc_status_char ('(');
1174 gfc_show_expr (cp->low);
1175 gfc_status_char (' ');
1176 gfc_show_expr (cp->high);
1177 gfc_status_char (')');
1178 gfc_status_char (' ');
1180 gfc_status_char ('\n');
1182 gfc_show_code (level + 1, d->next);
1185 code_indent (level, c->label);
1186 gfc_status ("END SELECT");
1190 gfc_status ("WHERE ");
1193 gfc_show_expr (d->expr);
1194 gfc_status_char ('\n');
1196 gfc_show_code (level + 1, d->next);
1198 for (d = d->block; d; d = d->block)
1200 code_indent (level, 0);
1201 gfc_status ("ELSE WHERE ");
1202 gfc_show_expr (d->expr);
1203 gfc_status_char ('\n');
1204 gfc_show_code (level + 1, d->next);
1207 code_indent (level, 0);
1208 gfc_status ("END WHERE");
1213 gfc_status ("FORALL ");
1214 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1216 gfc_show_expr (fa->var);
1217 gfc_status_char (' ');
1218 gfc_show_expr (fa->start);
1219 gfc_status_char (':');
1220 gfc_show_expr (fa->end);
1221 gfc_status_char (':');
1222 gfc_show_expr (fa->stride);
1224 if (fa->next != NULL)
1225 gfc_status_char (',');
1228 if (c->expr != NULL)
1230 gfc_status_char (',');
1231 gfc_show_expr (c->expr);
1233 gfc_status_char ('\n');
1235 gfc_show_code (level + 1, c->block->next);
1237 code_indent (level, 0);
1238 gfc_status ("END FORALL");
1244 gfc_show_expr (c->ext.iterator->var);
1245 gfc_status_char ('=');
1246 gfc_show_expr (c->ext.iterator->start);
1247 gfc_status_char (' ');
1248 gfc_show_expr (c->ext.iterator->end);
1249 gfc_status_char (' ');
1250 gfc_show_expr (c->ext.iterator->step);
1251 gfc_status_char ('\n');
1253 gfc_show_code (level + 1, c->block->next);
1255 code_indent (level, 0);
1256 gfc_status ("END DO");
1260 gfc_status ("DO WHILE ");
1261 gfc_show_expr (c->expr);
1262 gfc_status_char ('\n');
1264 gfc_show_code (level + 1, c->block->next);
1266 code_indent (level, c->label);
1267 gfc_status ("END DO");
1271 gfc_status ("CYCLE");
1273 gfc_status (" %s", c->symtree->n.sym->name);
1277 gfc_status ("EXIT");
1279 gfc_status (" %s", c->symtree->n.sym->name);
1283 gfc_status ("ALLOCATE ");
1286 gfc_status (" STAT=");
1287 gfc_show_expr (c->expr);
1290 for (a = c->ext.alloc_list; a; a = a->next)
1292 gfc_status_char (' ');
1293 gfc_show_expr (a->expr);
1298 case EXEC_DEALLOCATE:
1299 gfc_status ("DEALLOCATE ");
1302 gfc_status (" STAT=");
1303 gfc_show_expr (c->expr);
1306 for (a = c->ext.alloc_list; a; a = a->next)
1308 gfc_status_char (' ');
1309 gfc_show_expr (a->expr);
1315 gfc_status ("OPEN");
1320 gfc_status (" UNIT=");
1321 gfc_show_expr (open->unit);
1325 gfc_status (" IOMSG=");
1326 gfc_show_expr (open->iomsg);
1330 gfc_status (" IOSTAT=");
1331 gfc_show_expr (open->iostat);
1335 gfc_status (" FILE=");
1336 gfc_show_expr (open->file);
1340 gfc_status (" STATUS=");
1341 gfc_show_expr (open->status);
1345 gfc_status (" ACCESS=");
1346 gfc_show_expr (open->access);
1350 gfc_status (" FORM=");
1351 gfc_show_expr (open->form);
1355 gfc_status (" RECL=");
1356 gfc_show_expr (open->recl);
1360 gfc_status (" BLANK=");
1361 gfc_show_expr (open->blank);
1365 gfc_status (" POSITION=");
1366 gfc_show_expr (open->position);
1370 gfc_status (" ACTION=");
1371 gfc_show_expr (open->action);
1375 gfc_status (" DELIM=");
1376 gfc_show_expr (open->delim);
1380 gfc_status (" PAD=");
1381 gfc_show_expr (open->pad);
1385 gfc_status (" CONVERT=");
1386 gfc_show_expr (open->convert);
1388 if (open->err != NULL)
1389 gfc_status (" ERR=%d", open->err->value);
1394 gfc_status ("CLOSE");
1395 close = c->ext.close;
1399 gfc_status (" UNIT=");
1400 gfc_show_expr (close->unit);
1404 gfc_status (" IOMSG=");
1405 gfc_show_expr (close->iomsg);
1409 gfc_status (" IOSTAT=");
1410 gfc_show_expr (close->iostat);
1414 gfc_status (" STATUS=");
1415 gfc_show_expr (close->status);
1417 if (close->err != NULL)
1418 gfc_status (" ERR=%d", close->err->value);
1421 case EXEC_BACKSPACE:
1422 gfc_status ("BACKSPACE");
1426 gfc_status ("ENDFILE");
1430 gfc_status ("REWIND");
1434 gfc_status ("FLUSH");
1437 fp = c->ext.filepos;
1441 gfc_status (" UNIT=");
1442 gfc_show_expr (fp->unit);
1446 gfc_status (" IOMSG=");
1447 gfc_show_expr (fp->iomsg);
1451 gfc_status (" IOSTAT=");
1452 gfc_show_expr (fp->iostat);
1454 if (fp->err != NULL)
1455 gfc_status (" ERR=%d", fp->err->value);
1459 gfc_status ("INQUIRE");
1464 gfc_status (" UNIT=");
1465 gfc_show_expr (i->unit);
1469 gfc_status (" FILE=");
1470 gfc_show_expr (i->file);
1475 gfc_status (" IOMSG=");
1476 gfc_show_expr (i->iomsg);
1480 gfc_status (" IOSTAT=");
1481 gfc_show_expr (i->iostat);
1485 gfc_status (" EXIST=");
1486 gfc_show_expr (i->exist);
1490 gfc_status (" OPENED=");
1491 gfc_show_expr (i->opened);
1495 gfc_status (" NUMBER=");
1496 gfc_show_expr (i->number);
1500 gfc_status (" NAMED=");
1501 gfc_show_expr (i->named);
1505 gfc_status (" NAME=");
1506 gfc_show_expr (i->name);
1510 gfc_status (" ACCESS=");
1511 gfc_show_expr (i->access);
1515 gfc_status (" SEQUENTIAL=");
1516 gfc_show_expr (i->sequential);
1521 gfc_status (" DIRECT=");
1522 gfc_show_expr (i->direct);
1526 gfc_status (" FORM=");
1527 gfc_show_expr (i->form);
1531 gfc_status (" FORMATTED");
1532 gfc_show_expr (i->formatted);
1536 gfc_status (" UNFORMATTED=");
1537 gfc_show_expr (i->unformatted);
1541 gfc_status (" RECL=");
1542 gfc_show_expr (i->recl);
1546 gfc_status (" NEXTREC=");
1547 gfc_show_expr (i->nextrec);
1551 gfc_status (" BLANK=");
1552 gfc_show_expr (i->blank);
1556 gfc_status (" POSITION=");
1557 gfc_show_expr (i->position);
1561 gfc_status (" ACTION=");
1562 gfc_show_expr (i->action);
1566 gfc_status (" READ=");
1567 gfc_show_expr (i->read);
1571 gfc_status (" WRITE=");
1572 gfc_show_expr (i->write);
1576 gfc_status (" READWRITE=");
1577 gfc_show_expr (i->readwrite);
1581 gfc_status (" DELIM=");
1582 gfc_show_expr (i->delim);
1586 gfc_status (" PAD=");
1587 gfc_show_expr (i->pad);
1591 gfc_status (" CONVERT=");
1592 gfc_show_expr (i->convert);
1596 gfc_status (" ERR=%d", i->err->value);
1600 gfc_status ("IOLENGTH ");
1601 gfc_show_expr (c->expr);
1606 gfc_status ("READ");
1610 gfc_status ("WRITE");
1616 gfc_status (" UNIT=");
1617 gfc_show_expr (dt->io_unit);
1620 if (dt->format_expr)
1622 gfc_status (" FMT=");
1623 gfc_show_expr (dt->format_expr);
1626 if (dt->format_label != NULL)
1627 gfc_status (" FMT=%d", dt->format_label->value);
1629 gfc_status (" NML=%s", dt->namelist->name);
1633 gfc_status (" IOMSG=");
1634 gfc_show_expr (dt->iomsg);
1638 gfc_status (" IOSTAT=");
1639 gfc_show_expr (dt->iostat);
1643 gfc_status (" SIZE=");
1644 gfc_show_expr (dt->size);
1648 gfc_status (" REC=");
1649 gfc_show_expr (dt->rec);
1653 gfc_status (" ADVANCE=");
1654 gfc_show_expr (dt->advance);
1658 gfc_status_char ('\n');
1659 for (c = c->block->next; c; c = c->next)
1660 gfc_show_code_node (level + (c->next != NULL), c);
1664 gfc_status ("TRANSFER ");
1665 gfc_show_expr (c->expr);
1669 gfc_status ("DT_END");
1672 if (dt->err != NULL)
1673 gfc_status (" ERR=%d", dt->err->value);
1674 if (dt->end != NULL)
1675 gfc_status (" END=%d", dt->end->value);
1676 if (dt->eor != NULL)
1677 gfc_status (" EOR=%d", dt->eor->value);
1680 case EXEC_OMP_ATOMIC:
1681 case EXEC_OMP_BARRIER:
1682 case EXEC_OMP_CRITICAL:
1683 case EXEC_OMP_FLUSH:
1685 case EXEC_OMP_MASTER:
1686 case EXEC_OMP_ORDERED:
1687 case EXEC_OMP_PARALLEL:
1688 case EXEC_OMP_PARALLEL_DO:
1689 case EXEC_OMP_PARALLEL_SECTIONS:
1690 case EXEC_OMP_PARALLEL_WORKSHARE:
1691 case EXEC_OMP_SECTIONS:
1692 case EXEC_OMP_SINGLE:
1693 case EXEC_OMP_WORKSHARE:
1694 gfc_show_omp_node (level, c);
1698 gfc_internal_error ("gfc_show_code_node(): Bad statement code");
1701 gfc_status_char ('\n');
1705 /* Show an equivalence chain. */
1708 gfc_show_equiv (gfc_equiv *eq)
1711 gfc_status ("Equivalence: ");
1714 gfc_show_expr (eq->expr);
1722 /* Show a freakin' whole namespace. */
1725 gfc_show_namespace (gfc_namespace *ns)
1727 gfc_interface *intr;
1728 gfc_namespace *save;
1729 gfc_intrinsic_op op;
1733 save = gfc_current_ns;
1737 gfc_status ("Namespace:");
1745 while (i < GFC_LETTERS - 1
1746 && gfc_compare_types(&ns->default_type[i+1],
1747 &ns->default_type[l]))
1751 gfc_status(" %c-%c: ", l+'A', i+'A');
1753 gfc_status(" %c: ", l+'A');
1755 gfc_show_typespec(&ns->default_type[l]);
1757 } while (i < GFC_LETTERS);
1759 if (ns->proc_name != NULL)
1762 gfc_status ("procedure name = %s", ns->proc_name->name);
1765 gfc_current_ns = ns;
1766 gfc_traverse_symtree (ns->common_root, show_common);
1768 gfc_traverse_symtree (ns->sym_root, show_symtree);
1770 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
1772 /* User operator interfaces */
1773 intr = ns->operator[op];
1778 gfc_status ("Operator interfaces for %s:", gfc_op2string (op));
1780 for (; intr; intr = intr->next)
1781 gfc_status (" %s", intr->sym->name);
1784 if (ns->uop_root != NULL)
1787 gfc_status ("User operators:\n");
1788 gfc_traverse_user_op (ns, show_uop);
1792 for (eq = ns->equiv; eq; eq = eq->next)
1793 gfc_show_equiv (eq);
1795 gfc_status_char ('\n');
1796 gfc_status_char ('\n');
1798 gfc_show_code (0, ns->code);
1800 for (ns = ns->contained; ns; ns = ns->sibling)
1803 gfc_status ("CONTAINS\n");
1804 gfc_show_namespace (ns);
1808 gfc_status_char ('\n');
1809 gfc_current_ns = save;