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 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 /* Do indentation for a specific level. */
43 code_indent (int level, gfc_st_label *label)
48 gfc_status ("%-5d ", label->value);
52 for (i = 0; i < 2 * level; i++)
53 gfc_status_char (' ');
57 /* Simple indentation at the current level. This one
58 is used to show symbols. */
64 code_indent (show_level, NULL);
68 /* Show type-specific information. */
71 gfc_show_typespec (gfc_typespec *ts)
73 gfc_status ("(%s ", gfc_basic_typename (ts->type));
78 gfc_status ("%s", ts->derived->name);
82 gfc_show_expr (ts->cl->length);
86 gfc_status ("%d", ts->kind);
94 /* Show an actual argument list. */
97 gfc_show_actual_arglist (gfc_actual_arglist *a)
101 for (; a; a = a->next)
103 gfc_status_char ('(');
105 gfc_status ("%s = ", a->name);
107 gfc_show_expr (a->expr);
109 gfc_status ("(arg not-present)");
111 gfc_status_char (')');
120 /* Show a gfc_array_spec array specification structure. */
123 gfc_show_array_spec (gfc_array_spec *as)
134 gfc_status ("(%d", as->rank);
140 case AS_EXPLICIT: c = "AS_EXPLICIT"; break;
141 case AS_DEFERRED: c = "AS_DEFERRED"; break;
142 case AS_ASSUMED_SIZE: c = "AS_ASSUMED_SIZE"; break;
143 case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
145 gfc_internal_error ("gfc_show_array_spec(): Unhandled array shape "
148 gfc_status (" %s ", c);
150 for (i = 0; i < as->rank; i++)
152 gfc_show_expr (as->lower[i]);
153 gfc_status_char (' ');
154 gfc_show_expr (as->upper[i]);
155 gfc_status_char (' ');
163 /* Show a gfc_array_ref array reference structure. */
166 gfc_show_array_ref (gfc_array_ref * ar)
170 gfc_status_char ('(');
179 for (i = 0; i < ar->dimen; i++)
181 /* There are two types of array sections: either the
182 elements are identified by an integer array ('vector'),
183 or by an index range. In the former case we only have to
184 print the start expression which contains the vector, in
185 the latter case we have to print any of lower and upper
186 bound and the stride, if they're present. */
188 if (ar->start[i] != NULL)
189 gfc_show_expr (ar->start[i]);
191 if (ar->dimen_type[i] == DIMEN_RANGE)
193 gfc_status_char (':');
195 if (ar->end[i] != NULL)
196 gfc_show_expr (ar->end[i]);
198 if (ar->stride[i] != NULL)
200 gfc_status_char (':');
201 gfc_show_expr (ar->stride[i]);
205 if (i != ar->dimen - 1)
211 for (i = 0; i < ar->dimen; i++)
213 gfc_show_expr (ar->start[i]);
214 if (i != ar->dimen - 1)
220 gfc_status ("UNKNOWN");
224 gfc_internal_error ("gfc_show_array_ref(): Unknown array reference");
227 gfc_status_char (')');
231 /* Show a list of gfc_ref structures. */
234 gfc_show_ref (gfc_ref *p)
236 for (; p; p = p->next)
240 gfc_show_array_ref (&p->u.ar);
244 gfc_status (" %% %s", p->u.c.component->name);
248 gfc_status_char ('(');
249 gfc_show_expr (p->u.ss.start);
250 gfc_status_char (':');
251 gfc_show_expr (p->u.ss.end);
252 gfc_status_char (')');
256 gfc_internal_error ("gfc_show_ref(): Bad component code");
261 /* Display a constructor. Works recursively for array constructors. */
264 gfc_show_constructor (gfc_constructor *c)
266 for (; c; c = c->next)
268 if (c->iterator == NULL)
269 gfc_show_expr (c->expr);
272 gfc_status_char ('(');
273 gfc_show_expr (c->expr);
275 gfc_status_char (' ');
276 gfc_show_expr (c->iterator->var);
277 gfc_status_char ('=');
278 gfc_show_expr (c->iterator->start);
279 gfc_status_char (',');
280 gfc_show_expr (c->iterator->end);
281 gfc_status_char (',');
282 gfc_show_expr (c->iterator->step);
284 gfc_status_char (')');
294 show_char_const (const char *c, int length)
298 gfc_status_char ('\'');
299 for (i = 0; i < length; i++)
303 else if (ISPRINT (c[i]))
304 gfc_status_char (c[i]);
307 gfc_status ("' // ACHAR(");
309 gfc_status (") // '");
312 gfc_status_char ('\'');
315 /* Show an expression. */
318 gfc_show_expr (gfc_expr *p)
329 switch (p->expr_type)
332 show_char_const (p->value.character.string, p->value.character.length);
333 gfc_show_ref (p->ref);
337 gfc_status ("%s(", p->ts.derived->name);
338 gfc_show_constructor (p->value.constructor);
339 gfc_status_char (')');
344 gfc_show_constructor (p->value.constructor);
347 gfc_show_ref (p->ref);
351 gfc_status ("NULL()");
358 mpz_out_str (stdout, 10, p->value.integer);
360 if (p->ts.kind != gfc_default_integer_kind)
361 gfc_status ("_%d", p->ts.kind);
365 if (p->value.logical)
366 gfc_status (".true.");
368 gfc_status (".false.");
372 mpfr_out_str (stdout, 10, 0, p->value.real, GFC_RND_MODE);
373 if (p->ts.kind != gfc_default_real_kind)
374 gfc_status ("_%d", p->ts.kind);
378 show_char_const (p->value.character.string,
379 p->value.character.length);
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 (" ABSTRACT INTERFACE");
598 gfc_status (" FUNCTION");
599 if (attr->subroutine)
600 gfc_status (" SUBROUTINE");
601 if (attr->implicit_type)
602 gfc_status (" IMPLICIT-TYPE");
605 gfc_status (" SEQUENCE");
607 gfc_status (" ELEMENTAL");
609 gfc_status (" PURE");
611 gfc_status (" RECURSIVE");
617 /* Show components of a derived type. */
620 gfc_show_components (gfc_symbol *sym)
624 for (c = sym->components; c; c = c->next)
626 gfc_status ("(%s ", c->name);
627 gfc_show_typespec (&c->ts);
629 gfc_status (" POINTER");
631 gfc_status (" DIMENSION");
632 gfc_status_char (' ');
633 gfc_show_array_spec (c->as);
635 gfc_status (" %s", gfc_code2string (access_types, c->access));
638 gfc_status_char (' ');
643 /* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
644 show the interface. Information needed to reconstruct the list of
645 specific interfaces associated with a generic symbol is done within
649 gfc_show_symbol (gfc_symbol *sym)
651 gfc_formal_arglist *formal;
659 gfc_status ("symbol %s ", sym->name);
660 gfc_show_typespec (&sym->ts);
661 gfc_show_attr (&sym->attr);
666 gfc_status ("value: ");
667 gfc_show_expr (sym->value);
673 gfc_status ("Array spec:");
674 gfc_show_array_spec (sym->as);
680 gfc_status ("Generic interfaces:");
681 for (intr = sym->generic; intr; intr = intr->next)
682 gfc_status (" %s", intr->sym->name);
688 gfc_status ("result: %s", sym->result->name);
694 gfc_status ("components: ");
695 gfc_show_components (sym);
701 gfc_status ("Formal arglist:");
703 for (formal = sym->formal; formal; formal = formal->next)
705 if (formal->sym != NULL)
706 gfc_status (" %s", formal->sym->name);
708 gfc_status (" [Alt Return]");
715 gfc_status ("Formal namespace");
716 gfc_show_namespace (sym->formal_ns);
719 gfc_status_char ('\n');
723 /* Show a user-defined operator. Just prints an operator
724 and the name of the associated subroutine, really. */
727 show_uop (gfc_user_op *uop)
732 gfc_status ("%s:", uop->name);
734 for (intr = uop->operator; intr; intr = intr->next)
735 gfc_status (" %s", intr->sym->name);
739 /* Workhorse function for traversing the user operator symtree. */
742 traverse_uop (gfc_symtree *st, void (*func) (gfc_user_op *))
749 traverse_uop (st->left, func);
750 traverse_uop (st->right, func);
754 /* Traverse the tree of user operator nodes. */
757 gfc_traverse_user_op (gfc_namespace *ns, void (*func) (gfc_user_op *))
759 traverse_uop (ns->uop_root, func);
763 /* Function to display a common block. */
766 show_common (gfc_symtree *st)
771 gfc_status ("common: /%s/ ", st->name);
773 s = st->n.common->head;
776 gfc_status ("%s", s->name);
781 gfc_status_char ('\n');
785 /* Worker function to display the symbol tree. */
788 show_symtree (gfc_symtree *st)
791 gfc_status ("symtree: %s Ambig %d", st->name, st->ambiguous);
793 if (st->n.sym->ns != gfc_current_ns)
794 gfc_status (" from namespace %s", st->n.sym->ns->proc_name->name);
796 gfc_show_symbol (st->n.sym);
800 /******************* Show gfc_code structures **************/
804 static void gfc_show_code_node (int, gfc_code *);
806 /* Show a list of code structures. Mutually recursive with
807 gfc_show_code_node(). */
810 gfc_show_code (int level, gfc_code *c)
812 for (; c; c = c->next)
813 gfc_show_code_node (level, c);
817 gfc_show_namelist (gfc_namelist *n)
819 for (; n->next; n = n->next)
820 gfc_status ("%s,", n->sym->name);
821 gfc_status ("%s", n->sym->name);
824 /* Show a single OpenMP directive node and everything underneath it
828 gfc_show_omp_node (int level, gfc_code *c)
830 gfc_omp_clauses *omp_clauses = NULL;
831 const char *name = NULL;
835 case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
836 case EXEC_OMP_BARRIER: name = "BARRIER"; break;
837 case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
838 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
839 case EXEC_OMP_DO: name = "DO"; break;
840 case EXEC_OMP_MASTER: name = "MASTER"; break;
841 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
842 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
843 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
844 case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
845 case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
846 case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
847 case EXEC_OMP_SINGLE: name = "SINGLE"; break;
848 case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
852 gfc_status ("!$OMP %s", name);
856 case EXEC_OMP_PARALLEL:
857 case EXEC_OMP_PARALLEL_DO:
858 case EXEC_OMP_PARALLEL_SECTIONS:
859 case EXEC_OMP_SECTIONS:
860 case EXEC_OMP_SINGLE:
861 case EXEC_OMP_WORKSHARE:
862 case EXEC_OMP_PARALLEL_WORKSHARE:
863 omp_clauses = c->ext.omp_clauses;
865 case EXEC_OMP_CRITICAL:
867 gfc_status (" (%s)", c->ext.omp_name);
870 if (c->ext.omp_namelist)
873 gfc_show_namelist (c->ext.omp_namelist);
874 gfc_status_char (')');
877 case EXEC_OMP_BARRIER:
886 if (omp_clauses->if_expr)
889 gfc_show_expr (omp_clauses->if_expr);
890 gfc_status_char (')');
892 if (omp_clauses->num_threads)
894 gfc_status (" NUM_THREADS(");
895 gfc_show_expr (omp_clauses->num_threads);
896 gfc_status_char (')');
898 if (omp_clauses->sched_kind != OMP_SCHED_NONE)
901 switch (omp_clauses->sched_kind)
903 case OMP_SCHED_STATIC: type = "STATIC"; break;
904 case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
905 case OMP_SCHED_GUIDED: type = "GUIDED"; break;
906 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
910 gfc_status (" SCHEDULE (%s", type);
911 if (omp_clauses->chunk_size)
913 gfc_status_char (',');
914 gfc_show_expr (omp_clauses->chunk_size);
916 gfc_status_char (')');
918 if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
921 switch (omp_clauses->default_sharing)
923 case OMP_DEFAULT_NONE: type = "NONE"; break;
924 case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
925 case OMP_DEFAULT_SHARED: type = "SHARED"; break;
926 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
930 gfc_status (" DEFAULT(%s)", type);
932 if (omp_clauses->ordered)
933 gfc_status (" ORDERED");
934 for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
935 if (omp_clauses->lists[list_type] != NULL
936 && list_type != OMP_LIST_COPYPRIVATE)
939 if (list_type >= OMP_LIST_REDUCTION_FIRST)
943 case OMP_LIST_PLUS: type = "+"; break;
944 case OMP_LIST_MULT: type = "*"; break;
945 case OMP_LIST_SUB: type = "-"; break;
946 case OMP_LIST_AND: type = ".AND."; break;
947 case OMP_LIST_OR: type = ".OR."; break;
948 case OMP_LIST_EQV: type = ".EQV."; break;
949 case OMP_LIST_NEQV: type = ".NEQV."; break;
950 case OMP_LIST_MAX: type = "MAX"; break;
951 case OMP_LIST_MIN: type = "MIN"; break;
952 case OMP_LIST_IAND: type = "IAND"; break;
953 case OMP_LIST_IOR: type = "IOR"; break;
954 case OMP_LIST_IEOR: type = "IEOR"; break;
958 gfc_status (" REDUCTION(%s:", type);
964 case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
965 case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
966 case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
967 case OMP_LIST_SHARED: type = "SHARED"; break;
968 case OMP_LIST_COPYIN: type = "COPYIN"; break;
972 gfc_status (" %s(", type);
974 gfc_show_namelist (omp_clauses->lists[list_type]);
975 gfc_status_char (')');
978 gfc_status_char ('\n');
979 if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
981 gfc_code *d = c->block;
984 gfc_show_code (level + 1, d->next);
985 if (d->block == NULL)
987 code_indent (level, 0);
988 gfc_status ("!$OMP SECTION\n");
993 gfc_show_code (level + 1, c->block->next);
994 if (c->op == EXEC_OMP_ATOMIC)
996 code_indent (level, 0);
997 gfc_status ("!$OMP END %s", name);
998 if (omp_clauses != NULL)
1000 if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
1002 gfc_status (" COPYPRIVATE(");
1003 gfc_show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
1004 gfc_status_char (')');
1006 else if (omp_clauses->nowait)
1007 gfc_status (" NOWAIT");
1009 else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
1010 gfc_status (" (%s)", c->ext.omp_name);
1014 /* Show a single code node and everything underneath it if necessary. */
1017 gfc_show_code_node (int level, gfc_code *c)
1019 gfc_forall_iterator *fa;
1029 code_indent (level, c->here);
1038 gfc_status ("CONTINUE");
1042 gfc_status ("ENTRY %s", c->ext.entry->sym->name);
1045 case EXEC_INIT_ASSIGN:
1047 gfc_status ("ASSIGN ");
1048 gfc_show_expr (c->expr);
1049 gfc_status_char (' ');
1050 gfc_show_expr (c->expr2);
1053 case EXEC_LABEL_ASSIGN:
1054 gfc_status ("LABEL ASSIGN ");
1055 gfc_show_expr (c->expr);
1056 gfc_status (" %d", c->label->value);
1059 case EXEC_POINTER_ASSIGN:
1060 gfc_status ("POINTER ASSIGN ");
1061 gfc_show_expr (c->expr);
1062 gfc_status_char (' ');
1063 gfc_show_expr (c->expr2);
1067 gfc_status ("GOTO ");
1069 gfc_status ("%d", c->label->value);
1072 gfc_show_expr (c->expr);
1077 for (; d; d = d ->block)
1079 code_indent (level, d->label);
1080 if (d->block != NULL)
1081 gfc_status_char (',');
1083 gfc_status_char (')');
1090 case EXEC_ASSIGN_CALL:
1091 if (c->resolved_sym)
1092 gfc_status ("CALL %s ", c->resolved_sym->name);
1093 else if (c->symtree)
1094 gfc_status ("CALL %s ", c->symtree->name);
1096 gfc_status ("CALL ?? ");
1098 gfc_show_actual_arglist (c->ext.actual);
1102 gfc_status ("RETURN ");
1104 gfc_show_expr (c->expr);
1108 gfc_status ("PAUSE ");
1110 if (c->expr != NULL)
1111 gfc_show_expr (c->expr);
1113 gfc_status ("%d", c->ext.stop_code);
1118 gfc_status ("STOP ");
1120 if (c->expr != NULL)
1121 gfc_show_expr (c->expr);
1123 gfc_status ("%d", c->ext.stop_code);
1127 case EXEC_ARITHMETIC_IF:
1129 gfc_show_expr (c->expr);
1130 gfc_status (" %d, %d, %d",
1131 c->label->value, c->label2->value, c->label3->value);
1137 gfc_show_expr (d->expr);
1138 gfc_status_char ('\n');
1139 gfc_show_code (level + 1, d->next);
1142 for (; d; d = d->block)
1144 code_indent (level, 0);
1146 if (d->expr == NULL)
1147 gfc_status ("ELSE\n");
1150 gfc_status ("ELSE IF ");
1151 gfc_show_expr (d->expr);
1152 gfc_status_char ('\n');
1155 gfc_show_code (level + 1, d->next);
1158 code_indent (level, c->label);
1160 gfc_status ("ENDIF");
1165 gfc_status ("SELECT CASE ");
1166 gfc_show_expr (c->expr);
1167 gfc_status_char ('\n');
1169 for (; d; d = d->block)
1171 code_indent (level, 0);
1173 gfc_status ("CASE ");
1174 for (cp = d->ext.case_list; cp; cp = cp->next)
1176 gfc_status_char ('(');
1177 gfc_show_expr (cp->low);
1178 gfc_status_char (' ');
1179 gfc_show_expr (cp->high);
1180 gfc_status_char (')');
1181 gfc_status_char (' ');
1183 gfc_status_char ('\n');
1185 gfc_show_code (level + 1, d->next);
1188 code_indent (level, c->label);
1189 gfc_status ("END SELECT");
1193 gfc_status ("WHERE ");
1196 gfc_show_expr (d->expr);
1197 gfc_status_char ('\n');
1199 gfc_show_code (level + 1, d->next);
1201 for (d = d->block; d; d = d->block)
1203 code_indent (level, 0);
1204 gfc_status ("ELSE WHERE ");
1205 gfc_show_expr (d->expr);
1206 gfc_status_char ('\n');
1207 gfc_show_code (level + 1, d->next);
1210 code_indent (level, 0);
1211 gfc_status ("END WHERE");
1216 gfc_status ("FORALL ");
1217 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1219 gfc_show_expr (fa->var);
1220 gfc_status_char (' ');
1221 gfc_show_expr (fa->start);
1222 gfc_status_char (':');
1223 gfc_show_expr (fa->end);
1224 gfc_status_char (':');
1225 gfc_show_expr (fa->stride);
1227 if (fa->next != NULL)
1228 gfc_status_char (',');
1231 if (c->expr != NULL)
1233 gfc_status_char (',');
1234 gfc_show_expr (c->expr);
1236 gfc_status_char ('\n');
1238 gfc_show_code (level + 1, c->block->next);
1240 code_indent (level, 0);
1241 gfc_status ("END FORALL");
1247 gfc_show_expr (c->ext.iterator->var);
1248 gfc_status_char ('=');
1249 gfc_show_expr (c->ext.iterator->start);
1250 gfc_status_char (' ');
1251 gfc_show_expr (c->ext.iterator->end);
1252 gfc_status_char (' ');
1253 gfc_show_expr (c->ext.iterator->step);
1254 gfc_status_char ('\n');
1256 gfc_show_code (level + 1, c->block->next);
1258 code_indent (level, 0);
1259 gfc_status ("END DO");
1263 gfc_status ("DO WHILE ");
1264 gfc_show_expr (c->expr);
1265 gfc_status_char ('\n');
1267 gfc_show_code (level + 1, c->block->next);
1269 code_indent (level, c->label);
1270 gfc_status ("END DO");
1274 gfc_status ("CYCLE");
1276 gfc_status (" %s", c->symtree->n.sym->name);
1280 gfc_status ("EXIT");
1282 gfc_status (" %s", c->symtree->n.sym->name);
1286 gfc_status ("ALLOCATE ");
1289 gfc_status (" STAT=");
1290 gfc_show_expr (c->expr);
1293 for (a = c->ext.alloc_list; a; a = a->next)
1295 gfc_status_char (' ');
1296 gfc_show_expr (a->expr);
1301 case EXEC_DEALLOCATE:
1302 gfc_status ("DEALLOCATE ");
1305 gfc_status (" STAT=");
1306 gfc_show_expr (c->expr);
1309 for (a = c->ext.alloc_list; a; a = a->next)
1311 gfc_status_char (' ');
1312 gfc_show_expr (a->expr);
1318 gfc_status ("OPEN");
1323 gfc_status (" UNIT=");
1324 gfc_show_expr (open->unit);
1328 gfc_status (" IOMSG=");
1329 gfc_show_expr (open->iomsg);
1333 gfc_status (" IOSTAT=");
1334 gfc_show_expr (open->iostat);
1338 gfc_status (" FILE=");
1339 gfc_show_expr (open->file);
1343 gfc_status (" STATUS=");
1344 gfc_show_expr (open->status);
1348 gfc_status (" ACCESS=");
1349 gfc_show_expr (open->access);
1353 gfc_status (" FORM=");
1354 gfc_show_expr (open->form);
1358 gfc_status (" RECL=");
1359 gfc_show_expr (open->recl);
1363 gfc_status (" BLANK=");
1364 gfc_show_expr (open->blank);
1368 gfc_status (" POSITION=");
1369 gfc_show_expr (open->position);
1373 gfc_status (" ACTION=");
1374 gfc_show_expr (open->action);
1378 gfc_status (" DELIM=");
1379 gfc_show_expr (open->delim);
1383 gfc_status (" PAD=");
1384 gfc_show_expr (open->pad);
1388 gfc_status (" CONVERT=");
1389 gfc_show_expr (open->convert);
1391 if (open->err != NULL)
1392 gfc_status (" ERR=%d", open->err->value);
1397 gfc_status ("CLOSE");
1398 close = c->ext.close;
1402 gfc_status (" UNIT=");
1403 gfc_show_expr (close->unit);
1407 gfc_status (" IOMSG=");
1408 gfc_show_expr (close->iomsg);
1412 gfc_status (" IOSTAT=");
1413 gfc_show_expr (close->iostat);
1417 gfc_status (" STATUS=");
1418 gfc_show_expr (close->status);
1420 if (close->err != NULL)
1421 gfc_status (" ERR=%d", close->err->value);
1424 case EXEC_BACKSPACE:
1425 gfc_status ("BACKSPACE");
1429 gfc_status ("ENDFILE");
1433 gfc_status ("REWIND");
1437 gfc_status ("FLUSH");
1440 fp = c->ext.filepos;
1444 gfc_status (" UNIT=");
1445 gfc_show_expr (fp->unit);
1449 gfc_status (" IOMSG=");
1450 gfc_show_expr (fp->iomsg);
1454 gfc_status (" IOSTAT=");
1455 gfc_show_expr (fp->iostat);
1457 if (fp->err != NULL)
1458 gfc_status (" ERR=%d", fp->err->value);
1462 gfc_status ("INQUIRE");
1467 gfc_status (" UNIT=");
1468 gfc_show_expr (i->unit);
1472 gfc_status (" FILE=");
1473 gfc_show_expr (i->file);
1478 gfc_status (" IOMSG=");
1479 gfc_show_expr (i->iomsg);
1483 gfc_status (" IOSTAT=");
1484 gfc_show_expr (i->iostat);
1488 gfc_status (" EXIST=");
1489 gfc_show_expr (i->exist);
1493 gfc_status (" OPENED=");
1494 gfc_show_expr (i->opened);
1498 gfc_status (" NUMBER=");
1499 gfc_show_expr (i->number);
1503 gfc_status (" NAMED=");
1504 gfc_show_expr (i->named);
1508 gfc_status (" NAME=");
1509 gfc_show_expr (i->name);
1513 gfc_status (" ACCESS=");
1514 gfc_show_expr (i->access);
1518 gfc_status (" SEQUENTIAL=");
1519 gfc_show_expr (i->sequential);
1524 gfc_status (" DIRECT=");
1525 gfc_show_expr (i->direct);
1529 gfc_status (" FORM=");
1530 gfc_show_expr (i->form);
1534 gfc_status (" FORMATTED");
1535 gfc_show_expr (i->formatted);
1539 gfc_status (" UNFORMATTED=");
1540 gfc_show_expr (i->unformatted);
1544 gfc_status (" RECL=");
1545 gfc_show_expr (i->recl);
1549 gfc_status (" NEXTREC=");
1550 gfc_show_expr (i->nextrec);
1554 gfc_status (" BLANK=");
1555 gfc_show_expr (i->blank);
1559 gfc_status (" POSITION=");
1560 gfc_show_expr (i->position);
1564 gfc_status (" ACTION=");
1565 gfc_show_expr (i->action);
1569 gfc_status (" READ=");
1570 gfc_show_expr (i->read);
1574 gfc_status (" WRITE=");
1575 gfc_show_expr (i->write);
1579 gfc_status (" READWRITE=");
1580 gfc_show_expr (i->readwrite);
1584 gfc_status (" DELIM=");
1585 gfc_show_expr (i->delim);
1589 gfc_status (" PAD=");
1590 gfc_show_expr (i->pad);
1594 gfc_status (" CONVERT=");
1595 gfc_show_expr (i->convert);
1599 gfc_status (" ERR=%d", i->err->value);
1603 gfc_status ("IOLENGTH ");
1604 gfc_show_expr (c->expr);
1609 gfc_status ("READ");
1613 gfc_status ("WRITE");
1619 gfc_status (" UNIT=");
1620 gfc_show_expr (dt->io_unit);
1623 if (dt->format_expr)
1625 gfc_status (" FMT=");
1626 gfc_show_expr (dt->format_expr);
1629 if (dt->format_label != NULL)
1630 gfc_status (" FMT=%d", dt->format_label->value);
1632 gfc_status (" NML=%s", dt->namelist->name);
1636 gfc_status (" IOMSG=");
1637 gfc_show_expr (dt->iomsg);
1641 gfc_status (" IOSTAT=");
1642 gfc_show_expr (dt->iostat);
1646 gfc_status (" SIZE=");
1647 gfc_show_expr (dt->size);
1651 gfc_status (" REC=");
1652 gfc_show_expr (dt->rec);
1656 gfc_status (" ADVANCE=");
1657 gfc_show_expr (dt->advance);
1661 gfc_status_char ('\n');
1662 for (c = c->block->next; c; c = c->next)
1663 gfc_show_code_node (level + (c->next != NULL), c);
1667 gfc_status ("TRANSFER ");
1668 gfc_show_expr (c->expr);
1672 gfc_status ("DT_END");
1675 if (dt->err != NULL)
1676 gfc_status (" ERR=%d", dt->err->value);
1677 if (dt->end != NULL)
1678 gfc_status (" END=%d", dt->end->value);
1679 if (dt->eor != NULL)
1680 gfc_status (" EOR=%d", dt->eor->value);
1683 case EXEC_OMP_ATOMIC:
1684 case EXEC_OMP_BARRIER:
1685 case EXEC_OMP_CRITICAL:
1686 case EXEC_OMP_FLUSH:
1688 case EXEC_OMP_MASTER:
1689 case EXEC_OMP_ORDERED:
1690 case EXEC_OMP_PARALLEL:
1691 case EXEC_OMP_PARALLEL_DO:
1692 case EXEC_OMP_PARALLEL_SECTIONS:
1693 case EXEC_OMP_PARALLEL_WORKSHARE:
1694 case EXEC_OMP_SECTIONS:
1695 case EXEC_OMP_SINGLE:
1696 case EXEC_OMP_WORKSHARE:
1697 gfc_show_omp_node (level, c);
1701 gfc_internal_error ("gfc_show_code_node(): Bad statement code");
1704 gfc_status_char ('\n');
1708 /* Show an equivalence chain. */
1711 gfc_show_equiv (gfc_equiv *eq)
1714 gfc_status ("Equivalence: ");
1717 gfc_show_expr (eq->expr);
1725 /* Show a freakin' whole namespace. */
1728 gfc_show_namespace (gfc_namespace *ns)
1730 gfc_interface *intr;
1731 gfc_namespace *save;
1732 gfc_intrinsic_op op;
1736 save = gfc_current_ns;
1740 gfc_status ("Namespace:");
1748 while (i < GFC_LETTERS - 1
1749 && gfc_compare_types(&ns->default_type[i+1],
1750 &ns->default_type[l]))
1754 gfc_status(" %c-%c: ", l+'A', i+'A');
1756 gfc_status(" %c: ", l+'A');
1758 gfc_show_typespec(&ns->default_type[l]);
1760 } while (i < GFC_LETTERS);
1762 if (ns->proc_name != NULL)
1765 gfc_status ("procedure name = %s", ns->proc_name->name);
1768 gfc_current_ns = ns;
1769 gfc_traverse_symtree (ns->common_root, show_common);
1771 gfc_traverse_symtree (ns->sym_root, show_symtree);
1773 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
1775 /* User operator interfaces */
1776 intr = ns->operator[op];
1781 gfc_status ("Operator interfaces for %s:", gfc_op2string (op));
1783 for (; intr; intr = intr->next)
1784 gfc_status (" %s", intr->sym->name);
1787 if (ns->uop_root != NULL)
1790 gfc_status ("User operators:\n");
1791 gfc_traverse_user_op (ns, show_uop);
1795 for (eq = ns->equiv; eq; eq = eq->next)
1796 gfc_show_equiv (eq);
1798 gfc_status_char ('\n');
1799 gfc_status_char ('\n');
1801 gfc_show_code (0, ns->code);
1803 for (ns = ns->contained; ns; ns = ns->sibling)
1806 gfc_status ("CONTAINS\n");
1807 gfc_show_namespace (ns);
1811 gfc_status_char ('\n');
1812 gfc_current_ns = save;