2 Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
3 Contributed by Steven Bosscher
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING. If not, write to the Free
19 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
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)
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)
103 for (; a; a = a->next)
105 gfc_status_char ('(');
107 gfc_status ("%s = ", a->name);
109 gfc_show_expr (a->expr);
111 gfc_status ("(arg not-present)");
113 gfc_status_char (')');
122 /* Show a gfc_array_spec array specification structure. */
125 gfc_show_array_spec (gfc_array_spec * as)
136 gfc_status ("(%d", as->rank);
142 case AS_EXPLICIT: c = "AS_EXPLICIT"; break;
143 case AS_DEFERRED: c = "AS_DEFERRED"; break;
144 case AS_ASSUMED_SIZE: c = "AS_ASSUMED_SIZE"; break;
145 case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
148 ("gfc_show_array_spec(): Unhandled array shape type.");
150 gfc_status (" %s ", c);
152 for (i = 0; i < as->rank; i++)
154 gfc_show_expr (as->lower[i]);
155 gfc_status_char (' ');
156 gfc_show_expr (as->upper[i]);
157 gfc_status_char (' ');
165 /* Show a gfc_array_ref array reference structure. */
168 gfc_show_array_ref (gfc_array_ref * ar)
172 gfc_status_char ('(');
181 for (i = 0; i < ar->dimen; i++)
183 /* There are two types of array sections: either the
184 elements are identified by an integer array ('vector'),
185 or by an index range. In the former case we only have to
186 print the start expression which contains the vector, in
187 the latter case we have to print any of lower and upper
188 bound and the stride, if they're present. */
190 if (ar->start[i] != NULL)
191 gfc_show_expr (ar->start[i]);
193 if (ar->dimen_type[i] == DIMEN_RANGE)
195 gfc_status_char (':');
197 if (ar->end[i] != NULL)
198 gfc_show_expr (ar->end[i]);
200 if (ar->stride[i] != NULL)
202 gfc_status_char (':');
203 gfc_show_expr (ar->stride[i]);
207 if (i != ar->dimen - 1)
213 for (i = 0; i < ar->dimen; i++)
215 gfc_show_expr (ar->start[i]);
216 if (i != ar->dimen - 1)
222 gfc_status ("UNKNOWN");
226 gfc_internal_error ("gfc_show_array_ref(): Unknown array reference");
229 gfc_status_char (')');
233 /* Show a list of gfc_ref structures. */
236 gfc_show_ref (gfc_ref * p)
239 for (; p; p = p->next)
243 gfc_show_array_ref (&p->u.ar);
247 gfc_status (" %% %s", p->u.c.component->name);
251 gfc_status_char ('(');
252 gfc_show_expr (p->u.ss.start);
253 gfc_status_char (':');
254 gfc_show_expr (p->u.ss.end);
255 gfc_status_char (')');
259 gfc_internal_error ("gfc_show_ref(): Bad component code");
264 /* Display a constructor. Works recursively for array constructors. */
267 gfc_show_constructor (gfc_constructor * c)
270 for (; c; c = c->next)
272 if (c->iterator == NULL)
273 gfc_show_expr (c->expr);
276 gfc_status_char ('(');
277 gfc_show_expr (c->expr);
279 gfc_status_char (' ');
280 gfc_show_expr (c->iterator->var);
281 gfc_status_char ('=');
282 gfc_show_expr (c->iterator->start);
283 gfc_status_char (',');
284 gfc_show_expr (c->iterator->end);
285 gfc_status_char (',');
286 gfc_show_expr (c->iterator->step);
288 gfc_status_char (')');
297 /* Show an expression. */
300 gfc_show_expr (gfc_expr * p)
311 switch (p->expr_type)
314 c = p->value.character.string;
316 for (i = 0; i < p->value.character.length; i++, c++)
321 gfc_status ("%c", *c);
324 gfc_show_ref (p->ref);
328 gfc_status ("%s(", p->ts.derived->name);
329 gfc_show_constructor (p->value.constructor);
330 gfc_status_char (')');
335 gfc_show_constructor (p->value.constructor);
338 gfc_show_ref (p->ref);
342 gfc_status ("NULL()");
346 if (p->from_H || p->ts.type == BT_HOLLERITH)
348 gfc_status ("%dH", p->value.character.length);
349 c = p->value.character.string;
350 for (i = 0; i < p->value.character.length; i++, c++)
352 gfc_status_char (*c);
359 mpz_out_str (stdout, 10, p->value.integer);
361 if (p->ts.kind != gfc_default_integer_kind)
362 gfc_status ("_%d", p->ts.kind);
366 if (p->value.logical)
367 gfc_status (".true.");
369 gfc_status (".false.");
373 mpfr_out_str (stdout, 10, 0, p->value.real, GFC_RND_MODE);
374 if (p->ts.kind != gfc_default_real_kind)
375 gfc_status ("_%d", p->ts.kind);
379 c = p->value.character.string;
381 gfc_status_char ('\'');
383 for (i = 0; i < p->value.character.length; i++, c++)
388 gfc_status_char (*c);
391 gfc_status_char ('\'');
396 gfc_status ("(complex ");
398 mpfr_out_str (stdout, 10, 0, p->value.complex.r, GFC_RND_MODE);
399 if (p->ts.kind != gfc_default_complex_kind)
400 gfc_status ("_%d", p->ts.kind);
404 mpfr_out_str (stdout, 10, 0, p->value.complex.i, GFC_RND_MODE);
405 if (p->ts.kind != gfc_default_complex_kind)
406 gfc_status ("_%d", p->ts.kind);
419 if (p->symtree->n.sym->ns && p->symtree->n.sym->ns->proc_name)
420 gfc_status ("%s:", p->symtree->n.sym->ns->proc_name->name);
421 gfc_status ("%s", p->symtree->n.sym->name);
422 gfc_show_ref (p->ref);
427 switch (p->value.op.operator)
429 case INTRINSIC_UPLUS:
432 case INTRINSIC_UMINUS:
438 case INTRINSIC_MINUS:
441 case INTRINSIC_TIMES:
444 case INTRINSIC_DIVIDE:
447 case INTRINSIC_POWER:
450 case INTRINSIC_CONCAT:
463 gfc_status ("NEQV ");
486 case INTRINSIC_PARENTHESES:
487 gfc_status ("parens");
492 ("gfc_show_expr(): Bad intrinsic in expression!");
495 gfc_show_expr (p->value.op.op1);
500 gfc_show_expr (p->value.op.op2);
507 if (p->value.function.name == NULL)
509 gfc_status ("%s[", p->symtree->n.sym->name);
510 gfc_show_actual_arglist (p->value.function.actual);
511 gfc_status_char (']');
515 gfc_status ("%s[[", p->value.function.name);
516 gfc_show_actual_arglist (p->value.function.actual);
517 gfc_status_char (']');
518 gfc_status_char (']');
524 gfc_internal_error ("gfc_show_expr(): Don't know how to show expr");
529 /* Show symbol attributes. The flavor and intent are followed by
530 whatever single bit attributes are present. */
533 gfc_show_attr (symbol_attribute * attr)
536 gfc_status ("(%s %s %s %s", gfc_code2string (flavors, attr->flavor),
537 gfc_intent_string (attr->intent),
538 gfc_code2string (access_types, attr->access),
539 gfc_code2string (procedures, attr->proc));
541 if (attr->allocatable)
542 gfc_status (" ALLOCATABLE");
544 gfc_status (" DIMENSION");
546 gfc_status (" EXTERNAL");
548 gfc_status (" INTRINSIC");
550 gfc_status (" OPTIONAL");
552 gfc_status (" POINTER");
554 gfc_status (" PROTECTED");
556 gfc_status (" SAVE");
558 gfc_status (" VALUE");
560 gfc_status (" VOLATILE");
561 if (attr->threadprivate)
562 gfc_status (" THREADPRIVATE");
564 gfc_status (" TARGET");
566 gfc_status (" DUMMY");
568 gfc_status (" RESULT");
570 gfc_status (" ENTRY");
573 gfc_status (" DATA");
575 gfc_status (" USE-ASSOC");
576 if (attr->in_namelist)
577 gfc_status (" IN-NAMELIST");
579 gfc_status (" IN-COMMON");
582 gfc_status (" FUNCTION");
583 if (attr->subroutine)
584 gfc_status (" SUBROUTINE");
585 if (attr->implicit_type)
586 gfc_status (" IMPLICIT-TYPE");
589 gfc_status (" SEQUENCE");
591 gfc_status (" ELEMENTAL");
593 gfc_status (" PURE");
595 gfc_status (" RECURSIVE");
601 /* Show components of a derived type. */
604 gfc_show_components (gfc_symbol * sym)
608 for (c = sym->components; c; c = c->next)
610 gfc_status ("(%s ", c->name);
611 gfc_show_typespec (&c->ts);
613 gfc_status (" POINTER");
615 gfc_status (" DIMENSION");
616 gfc_status_char (' ');
617 gfc_show_array_spec (c->as);
620 gfc_status_char (' ');
625 /* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
626 show the interface. Information needed to reconstruct the list of
627 specific interfaces associated with a generic symbol is done within
631 gfc_show_symbol (gfc_symbol * sym)
633 gfc_formal_arglist *formal;
641 gfc_status ("symbol %s ", sym->name);
642 gfc_show_typespec (&sym->ts);
643 gfc_show_attr (&sym->attr);
648 gfc_status ("value: ");
649 gfc_show_expr (sym->value);
655 gfc_status ("Array spec:");
656 gfc_show_array_spec (sym->as);
662 gfc_status ("Generic interfaces:");
663 for (intr = sym->generic; intr; intr = intr->next)
664 gfc_status (" %s", intr->sym->name);
670 gfc_status ("result: %s", sym->result->name);
676 gfc_status ("components: ");
677 gfc_show_components (sym);
683 gfc_status ("Formal arglist:");
685 for (formal = sym->formal; formal; formal = formal->next)
687 if (formal->sym != NULL)
688 gfc_status (" %s", formal->sym->name);
690 gfc_status (" [Alt Return]");
697 gfc_status ("Formal namespace");
698 gfc_show_namespace (sym->formal_ns);
701 gfc_status_char ('\n');
705 /* Show a user-defined operator. Just prints an operator
706 and the name of the associated subroutine, really. */
709 show_uop (gfc_user_op * uop)
714 gfc_status ("%s:", uop->name);
716 for (intr = uop->operator; intr; intr = intr->next)
717 gfc_status (" %s", intr->sym->name);
721 /* Workhorse function for traversing the user operator symtree. */
724 traverse_uop (gfc_symtree * st, void (*func) (gfc_user_op *))
732 traverse_uop (st->left, func);
733 traverse_uop (st->right, func);
737 /* Traverse the tree of user operator nodes. */
740 gfc_traverse_user_op (gfc_namespace * ns, void (*func) (gfc_user_op *))
743 traverse_uop (ns->uop_root, func);
747 /* Function to display a common block. */
750 show_common (gfc_symtree * st)
755 gfc_status ("common: /%s/ ", st->name);
757 s = st->n.common->head;
760 gfc_status ("%s", s->name);
765 gfc_status_char ('\n');
769 /* Worker function to display the symbol tree. */
772 show_symtree (gfc_symtree * st)
776 gfc_status ("symtree: %s Ambig %d", st->name, st->ambiguous);
778 if (st->n.sym->ns != gfc_current_ns)
779 gfc_status (" from namespace %s", st->n.sym->ns->proc_name->name);
781 gfc_show_symbol (st->n.sym);
785 /******************* Show gfc_code structures **************/
789 static void gfc_show_code_node (int level, gfc_code * c);
791 /* Show a list of code structures. Mutually recursive with
792 gfc_show_code_node(). */
795 gfc_show_code (int level, gfc_code * c)
798 for (; c; c = c->next)
799 gfc_show_code_node (level, c);
803 gfc_show_namelist (gfc_namelist *n)
805 for (; n->next; n = n->next)
806 gfc_status ("%s,", n->sym->name);
807 gfc_status ("%s", n->sym->name);
810 /* Show a single OpenMP directive node and everything underneath it
814 gfc_show_omp_node (int level, gfc_code * c)
816 gfc_omp_clauses *omp_clauses = NULL;
817 const char *name = NULL;
821 case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
822 case EXEC_OMP_BARRIER: name = "BARRIER"; break;
823 case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
824 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
825 case EXEC_OMP_DO: name = "DO"; break;
826 case EXEC_OMP_MASTER: name = "MASTER"; break;
827 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
828 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
829 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
830 case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
831 case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
832 case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
833 case EXEC_OMP_SINGLE: name = "SINGLE"; break;
834 case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
838 gfc_status ("!$OMP %s", name);
842 case EXEC_OMP_PARALLEL:
843 case EXEC_OMP_PARALLEL_DO:
844 case EXEC_OMP_PARALLEL_SECTIONS:
845 case EXEC_OMP_SECTIONS:
846 case EXEC_OMP_SINGLE:
847 case EXEC_OMP_WORKSHARE:
848 case EXEC_OMP_PARALLEL_WORKSHARE:
849 omp_clauses = c->ext.omp_clauses;
851 case EXEC_OMP_CRITICAL:
853 gfc_status (" (%s)", c->ext.omp_name);
856 if (c->ext.omp_namelist)
859 gfc_show_namelist (c->ext.omp_namelist);
860 gfc_status_char (')');
863 case EXEC_OMP_BARRIER:
872 if (omp_clauses->if_expr)
875 gfc_show_expr (omp_clauses->if_expr);
876 gfc_status_char (')');
878 if (omp_clauses->num_threads)
880 gfc_status (" NUM_THREADS(");
881 gfc_show_expr (omp_clauses->num_threads);
882 gfc_status_char (')');
884 if (omp_clauses->sched_kind != OMP_SCHED_NONE)
887 switch (omp_clauses->sched_kind)
889 case OMP_SCHED_STATIC: type = "STATIC"; break;
890 case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
891 case OMP_SCHED_GUIDED: type = "GUIDED"; break;
892 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
896 gfc_status (" SCHEDULE (%s", type);
897 if (omp_clauses->chunk_size)
899 gfc_status_char (',');
900 gfc_show_expr (omp_clauses->chunk_size);
902 gfc_status_char (')');
904 if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
907 switch (omp_clauses->default_sharing)
909 case OMP_DEFAULT_NONE: type = "NONE"; break;
910 case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
911 case OMP_DEFAULT_SHARED: type = "SHARED"; break;
912 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
916 gfc_status (" DEFAULT(%s)", type);
918 if (omp_clauses->ordered)
919 gfc_status (" ORDERED");
920 for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
921 if (omp_clauses->lists[list_type] != NULL
922 && list_type != OMP_LIST_COPYPRIVATE)
925 if (list_type >= OMP_LIST_REDUCTION_FIRST)
929 case OMP_LIST_PLUS: type = "+"; break;
930 case OMP_LIST_MULT: type = "*"; break;
931 case OMP_LIST_SUB: type = "-"; break;
932 case OMP_LIST_AND: type = ".AND."; break;
933 case OMP_LIST_OR: type = ".OR."; break;
934 case OMP_LIST_EQV: type = ".EQV."; break;
935 case OMP_LIST_NEQV: type = ".NEQV."; break;
936 case OMP_LIST_MAX: type = "MAX"; break;
937 case OMP_LIST_MIN: type = "MIN"; break;
938 case OMP_LIST_IAND: type = "IAND"; break;
939 case OMP_LIST_IOR: type = "IOR"; break;
940 case OMP_LIST_IEOR: type = "IEOR"; break;
944 gfc_status (" REDUCTION(%s:", type);
950 case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
951 case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
952 case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
953 case OMP_LIST_SHARED: type = "SHARED"; break;
954 case OMP_LIST_COPYIN: type = "COPYIN"; break;
958 gfc_status (" %s(", type);
960 gfc_show_namelist (omp_clauses->lists[list_type]);
961 gfc_status_char (')');
964 gfc_status_char ('\n');
965 if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
967 gfc_code *d = c->block;
970 gfc_show_code (level + 1, d->next);
971 if (d->block == NULL)
973 code_indent (level, 0);
974 gfc_status ("!$OMP SECTION\n");
979 gfc_show_code (level + 1, c->block->next);
980 if (c->op == EXEC_OMP_ATOMIC)
982 code_indent (level, 0);
983 gfc_status ("!$OMP END %s", name);
984 if (omp_clauses != NULL)
986 if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
988 gfc_status (" COPYPRIVATE(");
989 gfc_show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
990 gfc_status_char (')');
992 else if (omp_clauses->nowait)
993 gfc_status (" NOWAIT");
995 else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
996 gfc_status (" (%s)", c->ext.omp_name);
999 /* Show a single code node and everything underneath it if necessary. */
1002 gfc_show_code_node (int level, gfc_code * c)
1004 gfc_forall_iterator *fa;
1014 code_indent (level, c->here);
1023 gfc_status ("CONTINUE");
1027 gfc_status ("ENTRY %s", c->ext.entry->sym->name);
1030 case EXEC_INIT_ASSIGN:
1032 gfc_status ("ASSIGN ");
1033 gfc_show_expr (c->expr);
1034 gfc_status_char (' ');
1035 gfc_show_expr (c->expr2);
1038 case EXEC_LABEL_ASSIGN:
1039 gfc_status ("LABEL ASSIGN ");
1040 gfc_show_expr (c->expr);
1041 gfc_status (" %d", c->label->value);
1044 case EXEC_POINTER_ASSIGN:
1045 gfc_status ("POINTER ASSIGN ");
1046 gfc_show_expr (c->expr);
1047 gfc_status_char (' ');
1048 gfc_show_expr (c->expr2);
1052 gfc_status ("GOTO ");
1054 gfc_status ("%d", c->label->value);
1057 gfc_show_expr (c->expr);
1062 for (; d; d = d ->block)
1064 code_indent (level, d->label);
1065 if (d->block != NULL)
1066 gfc_status_char (',');
1068 gfc_status_char (')');
1075 if (c->resolved_sym)
1076 gfc_status ("CALL %s ", c->resolved_sym->name);
1077 else if (c->symtree)
1078 gfc_status ("CALL %s ", c->symtree->name);
1080 gfc_status ("CALL ?? ");
1082 gfc_show_actual_arglist (c->ext.actual);
1086 gfc_status ("RETURN ");
1088 gfc_show_expr (c->expr);
1092 gfc_status ("PAUSE ");
1094 if (c->expr != NULL)
1095 gfc_show_expr (c->expr);
1097 gfc_status ("%d", c->ext.stop_code);
1102 gfc_status ("STOP ");
1104 if (c->expr != NULL)
1105 gfc_show_expr (c->expr);
1107 gfc_status ("%d", c->ext.stop_code);
1111 case EXEC_ARITHMETIC_IF:
1113 gfc_show_expr (c->expr);
1114 gfc_status (" %d, %d, %d",
1115 c->label->value, c->label2->value, c->label3->value);
1121 gfc_show_expr (d->expr);
1122 gfc_status_char ('\n');
1123 gfc_show_code (level + 1, d->next);
1126 for (; d; d = d->block)
1128 code_indent (level, 0);
1130 if (d->expr == NULL)
1131 gfc_status ("ELSE\n");
1134 gfc_status ("ELSE IF ");
1135 gfc_show_expr (d->expr);
1136 gfc_status_char ('\n');
1139 gfc_show_code (level + 1, d->next);
1142 code_indent (level, c->label);
1144 gfc_status ("ENDIF");
1149 gfc_status ("SELECT CASE ");
1150 gfc_show_expr (c->expr);
1151 gfc_status_char ('\n');
1153 for (; d; d = d->block)
1155 code_indent (level, 0);
1157 gfc_status ("CASE ");
1158 for (cp = d->ext.case_list; cp; cp = cp->next)
1160 gfc_status_char ('(');
1161 gfc_show_expr (cp->low);
1162 gfc_status_char (' ');
1163 gfc_show_expr (cp->high);
1164 gfc_status_char (')');
1165 gfc_status_char (' ');
1167 gfc_status_char ('\n');
1169 gfc_show_code (level + 1, d->next);
1172 code_indent (level, c->label);
1173 gfc_status ("END SELECT");
1177 gfc_status ("WHERE ");
1180 gfc_show_expr (d->expr);
1181 gfc_status_char ('\n');
1183 gfc_show_code (level + 1, d->next);
1185 for (d = d->block; d; d = d->block)
1187 code_indent (level, 0);
1188 gfc_status ("ELSE WHERE ");
1189 gfc_show_expr (d->expr);
1190 gfc_status_char ('\n');
1191 gfc_show_code (level + 1, d->next);
1194 code_indent (level, 0);
1195 gfc_status ("END WHERE");
1200 gfc_status ("FORALL ");
1201 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1203 gfc_show_expr (fa->var);
1204 gfc_status_char (' ');
1205 gfc_show_expr (fa->start);
1206 gfc_status_char (':');
1207 gfc_show_expr (fa->end);
1208 gfc_status_char (':');
1209 gfc_show_expr (fa->stride);
1211 if (fa->next != NULL)
1212 gfc_status_char (',');
1215 if (c->expr != NULL)
1217 gfc_status_char (',');
1218 gfc_show_expr (c->expr);
1220 gfc_status_char ('\n');
1222 gfc_show_code (level + 1, c->block->next);
1224 code_indent (level, 0);
1225 gfc_status ("END FORALL");
1231 gfc_show_expr (c->ext.iterator->var);
1232 gfc_status_char ('=');
1233 gfc_show_expr (c->ext.iterator->start);
1234 gfc_status_char (' ');
1235 gfc_show_expr (c->ext.iterator->end);
1236 gfc_status_char (' ');
1237 gfc_show_expr (c->ext.iterator->step);
1238 gfc_status_char ('\n');
1240 gfc_show_code (level + 1, c->block->next);
1242 code_indent (level, 0);
1243 gfc_status ("END DO");
1247 gfc_status ("DO WHILE ");
1248 gfc_show_expr (c->expr);
1249 gfc_status_char ('\n');
1251 gfc_show_code (level + 1, c->block->next);
1253 code_indent (level, c->label);
1254 gfc_status ("END DO");
1258 gfc_status ("CYCLE");
1260 gfc_status (" %s", c->symtree->n.sym->name);
1264 gfc_status ("EXIT");
1266 gfc_status (" %s", c->symtree->n.sym->name);
1270 gfc_status ("ALLOCATE ");
1273 gfc_status (" STAT=");
1274 gfc_show_expr (c->expr);
1277 for (a = c->ext.alloc_list; a; a = a->next)
1279 gfc_status_char (' ');
1280 gfc_show_expr (a->expr);
1285 case EXEC_DEALLOCATE:
1286 gfc_status ("DEALLOCATE ");
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);
1302 gfc_status ("OPEN");
1307 gfc_status (" UNIT=");
1308 gfc_show_expr (open->unit);
1312 gfc_status (" IOMSG=");
1313 gfc_show_expr (open->iomsg);
1317 gfc_status (" IOSTAT=");
1318 gfc_show_expr (open->iostat);
1322 gfc_status (" FILE=");
1323 gfc_show_expr (open->file);
1327 gfc_status (" STATUS=");
1328 gfc_show_expr (open->status);
1332 gfc_status (" ACCESS=");
1333 gfc_show_expr (open->access);
1337 gfc_status (" FORM=");
1338 gfc_show_expr (open->form);
1342 gfc_status (" RECL=");
1343 gfc_show_expr (open->recl);
1347 gfc_status (" BLANK=");
1348 gfc_show_expr (open->blank);
1352 gfc_status (" POSITION=");
1353 gfc_show_expr (open->position);
1357 gfc_status (" ACTION=");
1358 gfc_show_expr (open->action);
1362 gfc_status (" DELIM=");
1363 gfc_show_expr (open->delim);
1367 gfc_status (" PAD=");
1368 gfc_show_expr (open->pad);
1372 gfc_status (" CONVERT=");
1373 gfc_show_expr (open->convert);
1375 if (open->err != NULL)
1376 gfc_status (" ERR=%d", open->err->value);
1381 gfc_status ("CLOSE");
1382 close = c->ext.close;
1386 gfc_status (" UNIT=");
1387 gfc_show_expr (close->unit);
1391 gfc_status (" IOMSG=");
1392 gfc_show_expr (close->iomsg);
1396 gfc_status (" IOSTAT=");
1397 gfc_show_expr (close->iostat);
1401 gfc_status (" STATUS=");
1402 gfc_show_expr (close->status);
1404 if (close->err != NULL)
1405 gfc_status (" ERR=%d", close->err->value);
1408 case EXEC_BACKSPACE:
1409 gfc_status ("BACKSPACE");
1413 gfc_status ("ENDFILE");
1417 gfc_status ("REWIND");
1421 gfc_status ("FLUSH");
1424 fp = c->ext.filepos;
1428 gfc_status (" UNIT=");
1429 gfc_show_expr (fp->unit);
1433 gfc_status (" IOMSG=");
1434 gfc_show_expr (fp->iomsg);
1438 gfc_status (" IOSTAT=");
1439 gfc_show_expr (fp->iostat);
1441 if (fp->err != NULL)
1442 gfc_status (" ERR=%d", fp->err->value);
1446 gfc_status ("INQUIRE");
1451 gfc_status (" UNIT=");
1452 gfc_show_expr (i->unit);
1456 gfc_status (" FILE=");
1457 gfc_show_expr (i->file);
1462 gfc_status (" IOMSG=");
1463 gfc_show_expr (i->iomsg);
1467 gfc_status (" IOSTAT=");
1468 gfc_show_expr (i->iostat);
1472 gfc_status (" EXIST=");
1473 gfc_show_expr (i->exist);
1477 gfc_status (" OPENED=");
1478 gfc_show_expr (i->opened);
1482 gfc_status (" NUMBER=");
1483 gfc_show_expr (i->number);
1487 gfc_status (" NAMED=");
1488 gfc_show_expr (i->named);
1492 gfc_status (" NAME=");
1493 gfc_show_expr (i->name);
1497 gfc_status (" ACCESS=");
1498 gfc_show_expr (i->access);
1502 gfc_status (" SEQUENTIAL=");
1503 gfc_show_expr (i->sequential);
1508 gfc_status (" DIRECT=");
1509 gfc_show_expr (i->direct);
1513 gfc_status (" FORM=");
1514 gfc_show_expr (i->form);
1518 gfc_status (" FORMATTED");
1519 gfc_show_expr (i->formatted);
1523 gfc_status (" UNFORMATTED=");
1524 gfc_show_expr (i->unformatted);
1528 gfc_status (" RECL=");
1529 gfc_show_expr (i->recl);
1533 gfc_status (" NEXTREC=");
1534 gfc_show_expr (i->nextrec);
1538 gfc_status (" BLANK=");
1539 gfc_show_expr (i->blank);
1543 gfc_status (" POSITION=");
1544 gfc_show_expr (i->position);
1548 gfc_status (" ACTION=");
1549 gfc_show_expr (i->action);
1553 gfc_status (" READ=");
1554 gfc_show_expr (i->read);
1558 gfc_status (" WRITE=");
1559 gfc_show_expr (i->write);
1563 gfc_status (" READWRITE=");
1564 gfc_show_expr (i->readwrite);
1568 gfc_status (" DELIM=");
1569 gfc_show_expr (i->delim);
1573 gfc_status (" PAD=");
1574 gfc_show_expr (i->pad);
1578 gfc_status (" CONVERT=");
1579 gfc_show_expr (i->convert);
1583 gfc_status (" ERR=%d", i->err->value);
1587 gfc_status ("IOLENGTH ");
1588 gfc_show_expr (c->expr);
1593 gfc_status ("READ");
1597 gfc_status ("WRITE");
1603 gfc_status (" UNIT=");
1604 gfc_show_expr (dt->io_unit);
1607 if (dt->format_expr)
1609 gfc_status (" FMT=");
1610 gfc_show_expr (dt->format_expr);
1613 if (dt->format_label != NULL)
1614 gfc_status (" FMT=%d", dt->format_label->value);
1616 gfc_status (" NML=%s", dt->namelist->name);
1620 gfc_status (" IOMSG=");
1621 gfc_show_expr (dt->iomsg);
1625 gfc_status (" IOSTAT=");
1626 gfc_show_expr (dt->iostat);
1630 gfc_status (" SIZE=");
1631 gfc_show_expr (dt->size);
1635 gfc_status (" REC=");
1636 gfc_show_expr (dt->rec);
1640 gfc_status (" ADVANCE=");
1641 gfc_show_expr (dt->advance);
1645 gfc_status_char ('\n');
1646 for (c = c->block->next; c; c = c->next)
1647 gfc_show_code_node (level + (c->next != NULL), c);
1651 gfc_status ("TRANSFER ");
1652 gfc_show_expr (c->expr);
1656 gfc_status ("DT_END");
1659 if (dt->err != NULL)
1660 gfc_status (" ERR=%d", dt->err->value);
1661 if (dt->end != NULL)
1662 gfc_status (" END=%d", dt->end->value);
1663 if (dt->eor != NULL)
1664 gfc_status (" EOR=%d", dt->eor->value);
1667 case EXEC_OMP_ATOMIC:
1668 case EXEC_OMP_BARRIER:
1669 case EXEC_OMP_CRITICAL:
1670 case EXEC_OMP_FLUSH:
1672 case EXEC_OMP_MASTER:
1673 case EXEC_OMP_ORDERED:
1674 case EXEC_OMP_PARALLEL:
1675 case EXEC_OMP_PARALLEL_DO:
1676 case EXEC_OMP_PARALLEL_SECTIONS:
1677 case EXEC_OMP_PARALLEL_WORKSHARE:
1678 case EXEC_OMP_SECTIONS:
1679 case EXEC_OMP_SINGLE:
1680 case EXEC_OMP_WORKSHARE:
1681 gfc_show_omp_node (level, c);
1685 gfc_internal_error ("gfc_show_code_node(): Bad statement code");
1688 gfc_status_char ('\n');
1692 /* Show an equivalence chain. */
1695 gfc_show_equiv (gfc_equiv *eq)
1698 gfc_status ("Equivalence: ");
1701 gfc_show_expr (eq->expr);
1709 /* Show a freakin' whole namespace. */
1712 gfc_show_namespace (gfc_namespace * ns)
1714 gfc_interface *intr;
1715 gfc_namespace *save;
1716 gfc_intrinsic_op op;
1720 save = gfc_current_ns;
1724 gfc_status ("Namespace:");
1732 while (i < GFC_LETTERS - 1
1733 && gfc_compare_types(&ns->default_type[i+1],
1734 &ns->default_type[l]))
1738 gfc_status(" %c-%c: ", l+'A', i+'A');
1740 gfc_status(" %c: ", l+'A');
1742 gfc_show_typespec(&ns->default_type[l]);
1744 } while (i < GFC_LETTERS);
1746 if (ns->proc_name != NULL)
1749 gfc_status ("procedure name = %s", ns->proc_name->name);
1752 gfc_current_ns = ns;
1753 gfc_traverse_symtree (ns->common_root, show_common);
1755 gfc_traverse_symtree (ns->sym_root, show_symtree);
1757 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
1759 /* User operator interfaces */
1760 intr = ns->operator[op];
1765 gfc_status ("Operator interfaces for %s:", gfc_op2string (op));
1767 for (; intr; intr = intr->next)
1768 gfc_status (" %s", intr->sym->name);
1771 if (ns->uop_root != NULL)
1774 gfc_status ("User operators:\n");
1775 gfc_traverse_user_op (ns, show_uop);
1779 for (eq = ns->equiv; eq; eq = eq->next)
1780 gfc_show_equiv (eq);
1782 gfc_status_char ('\n');
1783 gfc_status_char ('\n');
1785 gfc_show_code (0, ns->code);
1787 for (ns = ns->contained; ns; ns = ns->sibling)
1790 gfc_status ("CONTAINS\n");
1791 gfc_show_namespace (ns);
1795 gfc_status_char ('\n');
1796 gfc_current_ns = save;