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 ");
495 case INTRINSIC_PARENTHESES:
496 gfc_status ("parens");
501 ("gfc_show_expr(): Bad intrinsic in expression!");
504 gfc_show_expr (p->value.op.op1);
509 gfc_show_expr (p->value.op.op2);
516 if (p->value.function.name == NULL)
518 gfc_status ("%s[", p->symtree->n.sym->name);
519 gfc_show_actual_arglist (p->value.function.actual);
520 gfc_status_char (']');
524 gfc_status ("%s[[", p->value.function.name);
525 gfc_show_actual_arglist (p->value.function.actual);
526 gfc_status_char (']');
527 gfc_status_char (']');
533 gfc_internal_error ("gfc_show_expr(): Don't know how to show expr");
538 /* Show symbol attributes. The flavor and intent are followed by
539 whatever single bit attributes are present. */
542 gfc_show_attr (symbol_attribute *attr)
545 gfc_status ("(%s %s %s %s %s", gfc_code2string (flavors, attr->flavor),
546 gfc_intent_string (attr->intent),
547 gfc_code2string (access_types, attr->access),
548 gfc_code2string (procedures, attr->proc),
549 gfc_code2string (save_status, attr->save));
551 if (attr->allocatable)
552 gfc_status (" ALLOCATABLE");
554 gfc_status (" DIMENSION");
556 gfc_status (" EXTERNAL");
558 gfc_status (" INTRINSIC");
560 gfc_status (" OPTIONAL");
562 gfc_status (" POINTER");
564 gfc_status (" PROTECTED");
566 gfc_status (" VALUE");
568 gfc_status (" VOLATILE");
569 if (attr->threadprivate)
570 gfc_status (" THREADPRIVATE");
572 gfc_status (" TARGET");
574 gfc_status (" DUMMY");
576 gfc_status (" RESULT");
578 gfc_status (" ENTRY");
581 gfc_status (" DATA");
583 gfc_status (" USE-ASSOC");
584 if (attr->in_namelist)
585 gfc_status (" IN-NAMELIST");
587 gfc_status (" IN-COMMON");
590 gfc_status (" FUNCTION");
591 if (attr->subroutine)
592 gfc_status (" SUBROUTINE");
593 if (attr->implicit_type)
594 gfc_status (" IMPLICIT-TYPE");
597 gfc_status (" SEQUENCE");
599 gfc_status (" ELEMENTAL");
601 gfc_status (" PURE");
603 gfc_status (" RECURSIVE");
609 /* Show components of a derived type. */
612 gfc_show_components (gfc_symbol *sym)
616 for (c = sym->components; c; c = c->next)
618 gfc_status ("(%s ", c->name);
619 gfc_show_typespec (&c->ts);
621 gfc_status (" POINTER");
623 gfc_status (" DIMENSION");
624 gfc_status_char (' ');
625 gfc_show_array_spec (c->as);
627 gfc_status (" %s", gfc_code2string (access_types, c->access));
630 gfc_status_char (' ');
635 /* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
636 show the interface. Information needed to reconstruct the list of
637 specific interfaces associated with a generic symbol is done within
641 gfc_show_symbol (gfc_symbol *sym)
643 gfc_formal_arglist *formal;
651 gfc_status ("symbol %s ", sym->name);
652 gfc_show_typespec (&sym->ts);
653 gfc_show_attr (&sym->attr);
658 gfc_status ("value: ");
659 gfc_show_expr (sym->value);
665 gfc_status ("Array spec:");
666 gfc_show_array_spec (sym->as);
672 gfc_status ("Generic interfaces:");
673 for (intr = sym->generic; intr; intr = intr->next)
674 gfc_status (" %s", intr->sym->name);
680 gfc_status ("result: %s", sym->result->name);
686 gfc_status ("components: ");
687 gfc_show_components (sym);
693 gfc_status ("Formal arglist:");
695 for (formal = sym->formal; formal; formal = formal->next)
697 if (formal->sym != NULL)
698 gfc_status (" %s", formal->sym->name);
700 gfc_status (" [Alt Return]");
707 gfc_status ("Formal namespace");
708 gfc_show_namespace (sym->formal_ns);
711 gfc_status_char ('\n');
715 /* Show a user-defined operator. Just prints an operator
716 and the name of the associated subroutine, really. */
719 show_uop (gfc_user_op *uop)
724 gfc_status ("%s:", uop->name);
726 for (intr = uop->operator; intr; intr = intr->next)
727 gfc_status (" %s", intr->sym->name);
731 /* Workhorse function for traversing the user operator symtree. */
734 traverse_uop (gfc_symtree *st, void (*func) (gfc_user_op *))
741 traverse_uop (st->left, func);
742 traverse_uop (st->right, func);
746 /* Traverse the tree of user operator nodes. */
749 gfc_traverse_user_op (gfc_namespace *ns, void (*func) (gfc_user_op *))
751 traverse_uop (ns->uop_root, func);
755 /* Function to display a common block. */
758 show_common (gfc_symtree *st)
763 gfc_status ("common: /%s/ ", st->name);
765 s = st->n.common->head;
768 gfc_status ("%s", s->name);
773 gfc_status_char ('\n');
777 /* Worker function to display the symbol tree. */
780 show_symtree (gfc_symtree *st)
783 gfc_status ("symtree: %s Ambig %d", st->name, st->ambiguous);
785 if (st->n.sym->ns != gfc_current_ns)
786 gfc_status (" from namespace %s", st->n.sym->ns->proc_name->name);
788 gfc_show_symbol (st->n.sym);
792 /******************* Show gfc_code structures **************/
796 static void gfc_show_code_node (int, gfc_code *);
798 /* Show a list of code structures. Mutually recursive with
799 gfc_show_code_node(). */
802 gfc_show_code (int level, gfc_code *c)
804 for (; c; c = c->next)
805 gfc_show_code_node (level, c);
809 gfc_show_namelist (gfc_namelist *n)
811 for (; n->next; n = n->next)
812 gfc_status ("%s,", n->sym->name);
813 gfc_status ("%s", n->sym->name);
816 /* Show a single OpenMP directive node and everything underneath it
820 gfc_show_omp_node (int level, gfc_code *c)
822 gfc_omp_clauses *omp_clauses = NULL;
823 const char *name = NULL;
827 case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
828 case EXEC_OMP_BARRIER: name = "BARRIER"; break;
829 case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
830 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
831 case EXEC_OMP_DO: name = "DO"; break;
832 case EXEC_OMP_MASTER: name = "MASTER"; break;
833 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
834 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
835 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
836 case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
837 case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
838 case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
839 case EXEC_OMP_SINGLE: name = "SINGLE"; break;
840 case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
844 gfc_status ("!$OMP %s", name);
848 case EXEC_OMP_PARALLEL:
849 case EXEC_OMP_PARALLEL_DO:
850 case EXEC_OMP_PARALLEL_SECTIONS:
851 case EXEC_OMP_SECTIONS:
852 case EXEC_OMP_SINGLE:
853 case EXEC_OMP_WORKSHARE:
854 case EXEC_OMP_PARALLEL_WORKSHARE:
855 omp_clauses = c->ext.omp_clauses;
857 case EXEC_OMP_CRITICAL:
859 gfc_status (" (%s)", c->ext.omp_name);
862 if (c->ext.omp_namelist)
865 gfc_show_namelist (c->ext.omp_namelist);
866 gfc_status_char (')');
869 case EXEC_OMP_BARRIER:
878 if (omp_clauses->if_expr)
881 gfc_show_expr (omp_clauses->if_expr);
882 gfc_status_char (')');
884 if (omp_clauses->num_threads)
886 gfc_status (" NUM_THREADS(");
887 gfc_show_expr (omp_clauses->num_threads);
888 gfc_status_char (')');
890 if (omp_clauses->sched_kind != OMP_SCHED_NONE)
893 switch (omp_clauses->sched_kind)
895 case OMP_SCHED_STATIC: type = "STATIC"; break;
896 case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
897 case OMP_SCHED_GUIDED: type = "GUIDED"; break;
898 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
902 gfc_status (" SCHEDULE (%s", type);
903 if (omp_clauses->chunk_size)
905 gfc_status_char (',');
906 gfc_show_expr (omp_clauses->chunk_size);
908 gfc_status_char (')');
910 if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
913 switch (omp_clauses->default_sharing)
915 case OMP_DEFAULT_NONE: type = "NONE"; break;
916 case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
917 case OMP_DEFAULT_SHARED: type = "SHARED"; break;
918 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
922 gfc_status (" DEFAULT(%s)", type);
924 if (omp_clauses->ordered)
925 gfc_status (" ORDERED");
926 for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
927 if (omp_clauses->lists[list_type] != NULL
928 && list_type != OMP_LIST_COPYPRIVATE)
931 if (list_type >= OMP_LIST_REDUCTION_FIRST)
935 case OMP_LIST_PLUS: type = "+"; break;
936 case OMP_LIST_MULT: type = "*"; break;
937 case OMP_LIST_SUB: type = "-"; break;
938 case OMP_LIST_AND: type = ".AND."; break;
939 case OMP_LIST_OR: type = ".OR."; break;
940 case OMP_LIST_EQV: type = ".EQV."; break;
941 case OMP_LIST_NEQV: type = ".NEQV."; break;
942 case OMP_LIST_MAX: type = "MAX"; break;
943 case OMP_LIST_MIN: type = "MIN"; break;
944 case OMP_LIST_IAND: type = "IAND"; break;
945 case OMP_LIST_IOR: type = "IOR"; break;
946 case OMP_LIST_IEOR: type = "IEOR"; break;
950 gfc_status (" REDUCTION(%s:", type);
956 case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
957 case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
958 case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
959 case OMP_LIST_SHARED: type = "SHARED"; break;
960 case OMP_LIST_COPYIN: type = "COPYIN"; break;
964 gfc_status (" %s(", type);
966 gfc_show_namelist (omp_clauses->lists[list_type]);
967 gfc_status_char (')');
970 gfc_status_char ('\n');
971 if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
973 gfc_code *d = c->block;
976 gfc_show_code (level + 1, d->next);
977 if (d->block == NULL)
979 code_indent (level, 0);
980 gfc_status ("!$OMP SECTION\n");
985 gfc_show_code (level + 1, c->block->next);
986 if (c->op == EXEC_OMP_ATOMIC)
988 code_indent (level, 0);
989 gfc_status ("!$OMP END %s", name);
990 if (omp_clauses != NULL)
992 if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
994 gfc_status (" COPYPRIVATE(");
995 gfc_show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
996 gfc_status_char (')');
998 else if (omp_clauses->nowait)
999 gfc_status (" NOWAIT");
1001 else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
1002 gfc_status (" (%s)", c->ext.omp_name);
1006 /* Show a single code node and everything underneath it if necessary. */
1009 gfc_show_code_node (int level, gfc_code *c)
1011 gfc_forall_iterator *fa;
1021 code_indent (level, c->here);
1030 gfc_status ("CONTINUE");
1034 gfc_status ("ENTRY %s", c->ext.entry->sym->name);
1037 case EXEC_INIT_ASSIGN:
1039 gfc_status ("ASSIGN ");
1040 gfc_show_expr (c->expr);
1041 gfc_status_char (' ');
1042 gfc_show_expr (c->expr2);
1045 case EXEC_LABEL_ASSIGN:
1046 gfc_status ("LABEL ASSIGN ");
1047 gfc_show_expr (c->expr);
1048 gfc_status (" %d", c->label->value);
1051 case EXEC_POINTER_ASSIGN:
1052 gfc_status ("POINTER ASSIGN ");
1053 gfc_show_expr (c->expr);
1054 gfc_status_char (' ');
1055 gfc_show_expr (c->expr2);
1059 gfc_status ("GOTO ");
1061 gfc_status ("%d", c->label->value);
1064 gfc_show_expr (c->expr);
1069 for (; d; d = d ->block)
1071 code_indent (level, d->label);
1072 if (d->block != NULL)
1073 gfc_status_char (',');
1075 gfc_status_char (')');
1082 if (c->resolved_sym)
1083 gfc_status ("CALL %s ", c->resolved_sym->name);
1084 else if (c->symtree)
1085 gfc_status ("CALL %s ", c->symtree->name);
1087 gfc_status ("CALL ?? ");
1089 gfc_show_actual_arglist (c->ext.actual);
1093 gfc_status ("RETURN ");
1095 gfc_show_expr (c->expr);
1099 gfc_status ("PAUSE ");
1101 if (c->expr != NULL)
1102 gfc_show_expr (c->expr);
1104 gfc_status ("%d", c->ext.stop_code);
1109 gfc_status ("STOP ");
1111 if (c->expr != NULL)
1112 gfc_show_expr (c->expr);
1114 gfc_status ("%d", c->ext.stop_code);
1118 case EXEC_ARITHMETIC_IF:
1120 gfc_show_expr (c->expr);
1121 gfc_status (" %d, %d, %d",
1122 c->label->value, c->label2->value, c->label3->value);
1128 gfc_show_expr (d->expr);
1129 gfc_status_char ('\n');
1130 gfc_show_code (level + 1, d->next);
1133 for (; d; d = d->block)
1135 code_indent (level, 0);
1137 if (d->expr == NULL)
1138 gfc_status ("ELSE\n");
1141 gfc_status ("ELSE IF ");
1142 gfc_show_expr (d->expr);
1143 gfc_status_char ('\n');
1146 gfc_show_code (level + 1, d->next);
1149 code_indent (level, c->label);
1151 gfc_status ("ENDIF");
1156 gfc_status ("SELECT CASE ");
1157 gfc_show_expr (c->expr);
1158 gfc_status_char ('\n');
1160 for (; d; d = d->block)
1162 code_indent (level, 0);
1164 gfc_status ("CASE ");
1165 for (cp = d->ext.case_list; cp; cp = cp->next)
1167 gfc_status_char ('(');
1168 gfc_show_expr (cp->low);
1169 gfc_status_char (' ');
1170 gfc_show_expr (cp->high);
1171 gfc_status_char (')');
1172 gfc_status_char (' ');
1174 gfc_status_char ('\n');
1176 gfc_show_code (level + 1, d->next);
1179 code_indent (level, c->label);
1180 gfc_status ("END SELECT");
1184 gfc_status ("WHERE ");
1187 gfc_show_expr (d->expr);
1188 gfc_status_char ('\n');
1190 gfc_show_code (level + 1, d->next);
1192 for (d = d->block; d; d = d->block)
1194 code_indent (level, 0);
1195 gfc_status ("ELSE WHERE ");
1196 gfc_show_expr (d->expr);
1197 gfc_status_char ('\n');
1198 gfc_show_code (level + 1, d->next);
1201 code_indent (level, 0);
1202 gfc_status ("END WHERE");
1207 gfc_status ("FORALL ");
1208 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1210 gfc_show_expr (fa->var);
1211 gfc_status_char (' ');
1212 gfc_show_expr (fa->start);
1213 gfc_status_char (':');
1214 gfc_show_expr (fa->end);
1215 gfc_status_char (':');
1216 gfc_show_expr (fa->stride);
1218 if (fa->next != NULL)
1219 gfc_status_char (',');
1222 if (c->expr != NULL)
1224 gfc_status_char (',');
1225 gfc_show_expr (c->expr);
1227 gfc_status_char ('\n');
1229 gfc_show_code (level + 1, c->block->next);
1231 code_indent (level, 0);
1232 gfc_status ("END FORALL");
1238 gfc_show_expr (c->ext.iterator->var);
1239 gfc_status_char ('=');
1240 gfc_show_expr (c->ext.iterator->start);
1241 gfc_status_char (' ');
1242 gfc_show_expr (c->ext.iterator->end);
1243 gfc_status_char (' ');
1244 gfc_show_expr (c->ext.iterator->step);
1245 gfc_status_char ('\n');
1247 gfc_show_code (level + 1, c->block->next);
1249 code_indent (level, 0);
1250 gfc_status ("END DO");
1254 gfc_status ("DO WHILE ");
1255 gfc_show_expr (c->expr);
1256 gfc_status_char ('\n');
1258 gfc_show_code (level + 1, c->block->next);
1260 code_indent (level, c->label);
1261 gfc_status ("END DO");
1265 gfc_status ("CYCLE");
1267 gfc_status (" %s", c->symtree->n.sym->name);
1271 gfc_status ("EXIT");
1273 gfc_status (" %s", c->symtree->n.sym->name);
1277 gfc_status ("ALLOCATE ");
1280 gfc_status (" STAT=");
1281 gfc_show_expr (c->expr);
1284 for (a = c->ext.alloc_list; a; a = a->next)
1286 gfc_status_char (' ');
1287 gfc_show_expr (a->expr);
1292 case EXEC_DEALLOCATE:
1293 gfc_status ("DEALLOCATE ");
1296 gfc_status (" STAT=");
1297 gfc_show_expr (c->expr);
1300 for (a = c->ext.alloc_list; a; a = a->next)
1302 gfc_status_char (' ');
1303 gfc_show_expr (a->expr);
1309 gfc_status ("OPEN");
1314 gfc_status (" UNIT=");
1315 gfc_show_expr (open->unit);
1319 gfc_status (" IOMSG=");
1320 gfc_show_expr (open->iomsg);
1324 gfc_status (" IOSTAT=");
1325 gfc_show_expr (open->iostat);
1329 gfc_status (" FILE=");
1330 gfc_show_expr (open->file);
1334 gfc_status (" STATUS=");
1335 gfc_show_expr (open->status);
1339 gfc_status (" ACCESS=");
1340 gfc_show_expr (open->access);
1344 gfc_status (" FORM=");
1345 gfc_show_expr (open->form);
1349 gfc_status (" RECL=");
1350 gfc_show_expr (open->recl);
1354 gfc_status (" BLANK=");
1355 gfc_show_expr (open->blank);
1359 gfc_status (" POSITION=");
1360 gfc_show_expr (open->position);
1364 gfc_status (" ACTION=");
1365 gfc_show_expr (open->action);
1369 gfc_status (" DELIM=");
1370 gfc_show_expr (open->delim);
1374 gfc_status (" PAD=");
1375 gfc_show_expr (open->pad);
1379 gfc_status (" CONVERT=");
1380 gfc_show_expr (open->convert);
1382 if (open->err != NULL)
1383 gfc_status (" ERR=%d", open->err->value);
1388 gfc_status ("CLOSE");
1389 close = c->ext.close;
1393 gfc_status (" UNIT=");
1394 gfc_show_expr (close->unit);
1398 gfc_status (" IOMSG=");
1399 gfc_show_expr (close->iomsg);
1403 gfc_status (" IOSTAT=");
1404 gfc_show_expr (close->iostat);
1408 gfc_status (" STATUS=");
1409 gfc_show_expr (close->status);
1411 if (close->err != NULL)
1412 gfc_status (" ERR=%d", close->err->value);
1415 case EXEC_BACKSPACE:
1416 gfc_status ("BACKSPACE");
1420 gfc_status ("ENDFILE");
1424 gfc_status ("REWIND");
1428 gfc_status ("FLUSH");
1431 fp = c->ext.filepos;
1435 gfc_status (" UNIT=");
1436 gfc_show_expr (fp->unit);
1440 gfc_status (" IOMSG=");
1441 gfc_show_expr (fp->iomsg);
1445 gfc_status (" IOSTAT=");
1446 gfc_show_expr (fp->iostat);
1448 if (fp->err != NULL)
1449 gfc_status (" ERR=%d", fp->err->value);
1453 gfc_status ("INQUIRE");
1458 gfc_status (" UNIT=");
1459 gfc_show_expr (i->unit);
1463 gfc_status (" FILE=");
1464 gfc_show_expr (i->file);
1469 gfc_status (" IOMSG=");
1470 gfc_show_expr (i->iomsg);
1474 gfc_status (" IOSTAT=");
1475 gfc_show_expr (i->iostat);
1479 gfc_status (" EXIST=");
1480 gfc_show_expr (i->exist);
1484 gfc_status (" OPENED=");
1485 gfc_show_expr (i->opened);
1489 gfc_status (" NUMBER=");
1490 gfc_show_expr (i->number);
1494 gfc_status (" NAMED=");
1495 gfc_show_expr (i->named);
1499 gfc_status (" NAME=");
1500 gfc_show_expr (i->name);
1504 gfc_status (" ACCESS=");
1505 gfc_show_expr (i->access);
1509 gfc_status (" SEQUENTIAL=");
1510 gfc_show_expr (i->sequential);
1515 gfc_status (" DIRECT=");
1516 gfc_show_expr (i->direct);
1520 gfc_status (" FORM=");
1521 gfc_show_expr (i->form);
1525 gfc_status (" FORMATTED");
1526 gfc_show_expr (i->formatted);
1530 gfc_status (" UNFORMATTED=");
1531 gfc_show_expr (i->unformatted);
1535 gfc_status (" RECL=");
1536 gfc_show_expr (i->recl);
1540 gfc_status (" NEXTREC=");
1541 gfc_show_expr (i->nextrec);
1545 gfc_status (" BLANK=");
1546 gfc_show_expr (i->blank);
1550 gfc_status (" POSITION=");
1551 gfc_show_expr (i->position);
1555 gfc_status (" ACTION=");
1556 gfc_show_expr (i->action);
1560 gfc_status (" READ=");
1561 gfc_show_expr (i->read);
1565 gfc_status (" WRITE=");
1566 gfc_show_expr (i->write);
1570 gfc_status (" READWRITE=");
1571 gfc_show_expr (i->readwrite);
1575 gfc_status (" DELIM=");
1576 gfc_show_expr (i->delim);
1580 gfc_status (" PAD=");
1581 gfc_show_expr (i->pad);
1585 gfc_status (" CONVERT=");
1586 gfc_show_expr (i->convert);
1590 gfc_status (" ERR=%d", i->err->value);
1594 gfc_status ("IOLENGTH ");
1595 gfc_show_expr (c->expr);
1600 gfc_status ("READ");
1604 gfc_status ("WRITE");
1610 gfc_status (" UNIT=");
1611 gfc_show_expr (dt->io_unit);
1614 if (dt->format_expr)
1616 gfc_status (" FMT=");
1617 gfc_show_expr (dt->format_expr);
1620 if (dt->format_label != NULL)
1621 gfc_status (" FMT=%d", dt->format_label->value);
1623 gfc_status (" NML=%s", dt->namelist->name);
1627 gfc_status (" IOMSG=");
1628 gfc_show_expr (dt->iomsg);
1632 gfc_status (" IOSTAT=");
1633 gfc_show_expr (dt->iostat);
1637 gfc_status (" SIZE=");
1638 gfc_show_expr (dt->size);
1642 gfc_status (" REC=");
1643 gfc_show_expr (dt->rec);
1647 gfc_status (" ADVANCE=");
1648 gfc_show_expr (dt->advance);
1652 gfc_status_char ('\n');
1653 for (c = c->block->next; c; c = c->next)
1654 gfc_show_code_node (level + (c->next != NULL), c);
1658 gfc_status ("TRANSFER ");
1659 gfc_show_expr (c->expr);
1663 gfc_status ("DT_END");
1666 if (dt->err != NULL)
1667 gfc_status (" ERR=%d", dt->err->value);
1668 if (dt->end != NULL)
1669 gfc_status (" END=%d", dt->end->value);
1670 if (dt->eor != NULL)
1671 gfc_status (" EOR=%d", dt->eor->value);
1674 case EXEC_OMP_ATOMIC:
1675 case EXEC_OMP_BARRIER:
1676 case EXEC_OMP_CRITICAL:
1677 case EXEC_OMP_FLUSH:
1679 case EXEC_OMP_MASTER:
1680 case EXEC_OMP_ORDERED:
1681 case EXEC_OMP_PARALLEL:
1682 case EXEC_OMP_PARALLEL_DO:
1683 case EXEC_OMP_PARALLEL_SECTIONS:
1684 case EXEC_OMP_PARALLEL_WORKSHARE:
1685 case EXEC_OMP_SECTIONS:
1686 case EXEC_OMP_SINGLE:
1687 case EXEC_OMP_WORKSHARE:
1688 gfc_show_omp_node (level, c);
1692 gfc_internal_error ("gfc_show_code_node(): Bad statement code");
1695 gfc_status_char ('\n');
1699 /* Show an equivalence chain. */
1702 gfc_show_equiv (gfc_equiv *eq)
1705 gfc_status ("Equivalence: ");
1708 gfc_show_expr (eq->expr);
1716 /* Show a freakin' whole namespace. */
1719 gfc_show_namespace (gfc_namespace *ns)
1721 gfc_interface *intr;
1722 gfc_namespace *save;
1723 gfc_intrinsic_op op;
1727 save = gfc_current_ns;
1731 gfc_status ("Namespace:");
1739 while (i < GFC_LETTERS - 1
1740 && gfc_compare_types(&ns->default_type[i+1],
1741 &ns->default_type[l]))
1745 gfc_status(" %c-%c: ", l+'A', i+'A');
1747 gfc_status(" %c: ", l+'A');
1749 gfc_show_typespec(&ns->default_type[l]);
1751 } while (i < GFC_LETTERS);
1753 if (ns->proc_name != NULL)
1756 gfc_status ("procedure name = %s", ns->proc_name->name);
1759 gfc_current_ns = ns;
1760 gfc_traverse_symtree (ns->common_root, show_common);
1762 gfc_traverse_symtree (ns->sym_root, show_symtree);
1764 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
1766 /* User operator interfaces */
1767 intr = ns->operator[op];
1772 gfc_status ("Operator interfaces for %s:", gfc_op2string (op));
1774 for (; intr; intr = intr->next)
1775 gfc_status (" %s", intr->sym->name);
1778 if (ns->uop_root != NULL)
1781 gfc_status ("User operators:\n");
1782 gfc_traverse_user_op (ns, show_uop);
1786 for (eq = ns->equiv; eq; eq = eq->next)
1787 gfc_show_equiv (eq);
1789 gfc_status_char ('\n');
1790 gfc_status_char ('\n');
1792 gfc_show_code (0, ns->code);
1794 for (ns = ns->contained; ns; ns = ns->sibling)
1797 gfc_status ("CONTAINS\n");
1798 gfc_show_namespace (ns);
1802 gfc_status_char ('\n');
1803 gfc_current_ns = save;