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;
41 /* Forward declaration because this one needs all, and all need
43 static void gfc_show_expr (gfc_expr *);
45 /* Do indentation for a specific level. */
48 code_indent (int level, gfc_st_label * label)
53 gfc_status ("%-5d ", label->value);
57 for (i = 0; i < 2 * level; i++)
58 gfc_status_char (' ');
62 /* Simple indentation at the current level. This one
63 is used to show symbols. */
69 code_indent (show_level, NULL);
73 /* Show type-specific information. */
76 gfc_show_typespec (gfc_typespec * ts)
79 gfc_status ("(%s ", gfc_basic_typename (ts->type));
84 gfc_status ("%s", ts->derived->name);
88 gfc_show_expr (ts->cl->length);
92 gfc_status ("%d", ts->kind);
100 /* Show an actual argument list. */
103 gfc_show_actual_arglist (gfc_actual_arglist * a)
108 for (; a; a = a->next)
110 gfc_status_char ('(');
112 gfc_status ("%s = ", a->name);
114 gfc_show_expr (a->expr);
116 gfc_status ("(arg not-present)");
118 gfc_status_char (')');
127 /* Show a gfc_array_spec array specification structure. */
130 gfc_show_array_spec (gfc_array_spec * as)
141 gfc_status ("(%d", as->rank);
147 case AS_EXPLICIT: c = "AS_EXPLICIT"; break;
148 case AS_DEFERRED: c = "AS_DEFERRED"; break;
149 case AS_ASSUMED_SIZE: c = "AS_ASSUMED_SIZE"; break;
150 case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
153 ("gfc_show_array_spec(): Unhandled array shape type.");
155 gfc_status (" %s ", c);
157 for (i = 0; i < as->rank; i++)
159 gfc_show_expr (as->lower[i]);
160 gfc_status_char (' ');
161 gfc_show_expr (as->upper[i]);
162 gfc_status_char (' ');
170 /* Show a gfc_array_ref array reference structure. */
173 gfc_show_array_ref (gfc_array_ref * ar)
177 gfc_status_char ('(');
186 for (i = 0; i < ar->dimen; i++)
188 /* There are two types of array sections: either the
189 elements are identified by an integer array ('vector'),
190 or by an index range. In the former case we only have to
191 print the start expression which contains the vector, in
192 the latter case we have to print any of lower and upper
193 bound and the stride, if they're present. */
195 if (ar->start[i] != NULL)
196 gfc_show_expr (ar->start[i]);
198 if (ar->dimen_type[i] == DIMEN_RANGE)
200 gfc_status_char (':');
202 if (ar->end[i] != NULL)
203 gfc_show_expr (ar->end[i]);
205 if (ar->stride[i] != NULL)
207 gfc_status_char (':');
208 gfc_show_expr (ar->stride[i]);
212 if (i != ar->dimen - 1)
218 for (i = 0; i < ar->dimen; i++)
220 gfc_show_expr (ar->start[i]);
221 if (i != ar->dimen - 1)
227 gfc_status ("UNKNOWN");
231 gfc_internal_error ("gfc_show_array_ref(): Unknown array reference");
234 gfc_status_char (')');
238 /* Show a list of gfc_ref structures. */
241 gfc_show_ref (gfc_ref * p)
244 for (; p; p = p->next)
248 gfc_show_array_ref (&p->u.ar);
252 gfc_status (" %% %s", p->u.c.component->name);
256 gfc_status_char ('(');
257 gfc_show_expr (p->u.ss.start);
258 gfc_status_char (':');
259 gfc_show_expr (p->u.ss.end);
260 gfc_status_char (')');
264 gfc_internal_error ("gfc_show_ref(): Bad component code");
269 /* Display a constructor. Works recursively for array constructors. */
272 gfc_show_constructor (gfc_constructor * c)
275 for (; c; c = c->next)
277 if (c->iterator == NULL)
278 gfc_show_expr (c->expr);
281 gfc_status_char ('(');
282 gfc_show_expr (c->expr);
284 gfc_status_char (' ');
285 gfc_show_expr (c->iterator->var);
286 gfc_status_char ('=');
287 gfc_show_expr (c->iterator->start);
288 gfc_status_char (',');
289 gfc_show_expr (c->iterator->end);
290 gfc_status_char (',');
291 gfc_show_expr (c->iterator->step);
293 gfc_status_char (')');
302 /* Show an expression. */
305 gfc_show_expr (gfc_expr * p)
316 switch (p->expr_type)
319 c = p->value.character.string;
321 for (i = 0; i < p->value.character.length; i++, c++)
326 gfc_status ("%c", *c);
329 gfc_show_ref (p->ref);
333 gfc_status ("%s(", p->ts.derived->name);
334 gfc_show_constructor (p->value.constructor);
335 gfc_status_char (')');
340 gfc_show_constructor (p->value.constructor);
343 gfc_show_ref (p->ref);
347 gfc_status ("NULL()");
354 mpz_out_str (stdout, 10, p->value.integer);
356 if (p->ts.kind != gfc_default_integer_kind)
357 gfc_status ("_%d", p->ts.kind);
361 if (p->value.logical)
362 gfc_status (".true.");
364 gfc_status (".false.");
368 mpfr_out_str (stdout, 10, 0, p->value.real, GFC_RND_MODE);
369 if (p->ts.kind != gfc_default_real_kind)
370 gfc_status ("_%d", p->ts.kind);
374 c = p->value.character.string;
376 gfc_status_char ('\'');
378 for (i = 0; i < p->value.character.length; i++, c++)
383 gfc_status_char (*c);
386 gfc_status_char ('\'');
391 gfc_status ("(complex ");
393 mpfr_out_str (stdout, 10, 0, p->value.complex.r, GFC_RND_MODE);
394 if (p->ts.kind != gfc_default_complex_kind)
395 gfc_status ("_%d", p->ts.kind);
399 mpfr_out_str (stdout, 10, 0, p->value.complex.i, GFC_RND_MODE);
400 if (p->ts.kind != gfc_default_complex_kind)
401 gfc_status ("_%d", p->ts.kind);
414 if (p->symtree->n.sym->ns && p->symtree->n.sym->ns->proc_name)
415 gfc_status ("%s:", p->symtree->n.sym->ns->proc_name->name);
416 gfc_status ("%s", p->symtree->n.sym->name);
417 gfc_show_ref (p->ref);
422 switch (p->value.op.operator)
424 case INTRINSIC_UPLUS:
427 case INTRINSIC_UMINUS:
433 case INTRINSIC_MINUS:
436 case INTRINSIC_TIMES:
439 case INTRINSIC_DIVIDE:
442 case INTRINSIC_POWER:
445 case INTRINSIC_CONCAT:
458 gfc_status ("NEQV ");
481 case INTRINSIC_PARENTHESES:
482 gfc_status ("parens");
487 ("gfc_show_expr(): Bad intrinsic in expression!");
490 gfc_show_expr (p->value.op.op1);
495 gfc_show_expr (p->value.op.op2);
502 if (p->value.function.name == NULL)
504 gfc_status ("%s[", p->symtree->n.sym->name);
505 gfc_show_actual_arglist (p->value.function.actual);
506 gfc_status_char (']');
510 gfc_status ("%s[[", p->value.function.name);
511 gfc_show_actual_arglist (p->value.function.actual);
512 gfc_status_char (']');
513 gfc_status_char (']');
519 gfc_internal_error ("gfc_show_expr(): Don't know how to show expr");
524 /* Show symbol attributes. The flavor and intent are followed by
525 whatever single bit attributes are present. */
528 gfc_show_attr (symbol_attribute * attr)
531 gfc_status ("(%s %s %s %s", gfc_code2string (flavors, attr->flavor),
532 gfc_intent_string (attr->intent),
533 gfc_code2string (access_types, attr->access),
534 gfc_code2string (procedures, attr->proc));
536 if (attr->allocatable)
537 gfc_status (" ALLOCATABLE");
539 gfc_status (" DIMENSION");
541 gfc_status (" EXTERNAL");
543 gfc_status (" INTRINSIC");
545 gfc_status (" OPTIONAL");
547 gfc_status (" POINTER");
549 gfc_status (" SAVE");
550 if (attr->threadprivate)
551 gfc_status (" THREADPRIVATE");
553 gfc_status (" TARGET");
555 gfc_status (" DUMMY");
557 gfc_status (" RESULT");
559 gfc_status (" ENTRY");
562 gfc_status (" DATA");
564 gfc_status (" USE-ASSOC");
565 if (attr->in_namelist)
566 gfc_status (" IN-NAMELIST");
568 gfc_status (" IN-COMMON");
571 gfc_status (" FUNCTION");
572 if (attr->subroutine)
573 gfc_status (" SUBROUTINE");
574 if (attr->implicit_type)
575 gfc_status (" IMPLICIT-TYPE");
578 gfc_status (" SEQUENCE");
580 gfc_status (" ELEMENTAL");
582 gfc_status (" PURE");
584 gfc_status (" RECURSIVE");
590 /* Show components of a derived type. */
593 gfc_show_components (gfc_symbol * sym)
597 for (c = sym->components; c; c = c->next)
599 gfc_status ("(%s ", c->name);
600 gfc_show_typespec (&c->ts);
602 gfc_status (" POINTER");
604 gfc_status (" DIMENSION");
605 gfc_status_char (' ');
606 gfc_show_array_spec (c->as);
609 gfc_status_char (' ');
614 /* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
615 show the interface. Information needed to reconstruct the list of
616 specific interfaces associated with a generic symbol is done within
620 gfc_show_symbol (gfc_symbol * sym)
622 gfc_formal_arglist *formal;
630 gfc_status ("symbol %s ", sym->name);
631 gfc_show_typespec (&sym->ts);
632 gfc_show_attr (&sym->attr);
637 gfc_status ("value: ");
638 gfc_show_expr (sym->value);
644 gfc_status ("Array spec:");
645 gfc_show_array_spec (sym->as);
651 gfc_status ("Generic interfaces:");
652 for (intr = sym->generic; intr; intr = intr->next)
653 gfc_status (" %s", intr->sym->name);
659 gfc_status ("result: %s", sym->result->name);
665 gfc_status ("components: ");
666 gfc_show_components (sym);
672 gfc_status ("Formal arglist:");
674 for (formal = sym->formal; formal; formal = formal->next)
676 if (formal->sym != NULL)
677 gfc_status (" %s", formal->sym->name);
679 gfc_status (" [Alt Return]");
686 gfc_status ("Formal namespace");
687 gfc_show_namespace (sym->formal_ns);
690 gfc_status_char ('\n');
694 /* Show a user-defined operator. Just prints an operator
695 and the name of the associated subroutine, really. */
698 show_uop (gfc_user_op * uop)
703 gfc_status ("%s:", uop->name);
705 for (intr = uop->operator; intr; intr = intr->next)
706 gfc_status (" %s", intr->sym->name);
710 /* Workhorse function for traversing the user operator symtree. */
713 traverse_uop (gfc_symtree * st, void (*func) (gfc_user_op *))
721 traverse_uop (st->left, func);
722 traverse_uop (st->right, func);
726 /* Traverse the tree of user operator nodes. */
729 gfc_traverse_user_op (gfc_namespace * ns, void (*func) (gfc_user_op *))
732 traverse_uop (ns->uop_root, func);
736 /* Function to display a common block. */
739 show_common (gfc_symtree * st)
744 gfc_status ("common: /%s/ ", st->name);
746 s = st->n.common->head;
749 gfc_status ("%s", s->name);
754 gfc_status_char ('\n');
758 /* Worker function to display the symbol tree. */
761 show_symtree (gfc_symtree * st)
765 gfc_status ("symtree: %s Ambig %d", st->name, st->ambiguous);
767 if (st->n.sym->ns != gfc_current_ns)
768 gfc_status (" from namespace %s", st->n.sym->ns->proc_name->name);
770 gfc_show_symbol (st->n.sym);
774 /******************* Show gfc_code structures **************/
778 static void gfc_show_code_node (int level, gfc_code * c);
780 /* Show a list of code structures. Mutually recursive with
781 gfc_show_code_node(). */
784 gfc_show_code (int level, gfc_code * c)
787 for (; c; c = c->next)
788 gfc_show_code_node (level, c);
792 gfc_show_namelist (gfc_namelist *n)
794 for (; n->next; n = n->next)
795 gfc_status ("%s,", n->sym->name);
796 gfc_status ("%s", n->sym->name);
799 /* Show a single OpenMP directive node and everything underneath it
803 gfc_show_omp_node (int level, gfc_code * c)
805 gfc_omp_clauses *omp_clauses = NULL;
806 const char *name = NULL;
810 case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
811 case EXEC_OMP_BARRIER: name = "BARRIER"; break;
812 case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
813 case EXEC_OMP_FLUSH: name = "FLUSH"; break;
814 case EXEC_OMP_DO: name = "DO"; break;
815 case EXEC_OMP_MASTER: name = "MASTER"; break;
816 case EXEC_OMP_ORDERED: name = "ORDERED"; break;
817 case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
818 case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
819 case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
820 case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
821 case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
822 case EXEC_OMP_SINGLE: name = "SINGLE"; break;
823 case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
827 gfc_status ("!$OMP %s", name);
831 case EXEC_OMP_PARALLEL:
832 case EXEC_OMP_PARALLEL_DO:
833 case EXEC_OMP_PARALLEL_SECTIONS:
834 case EXEC_OMP_SECTIONS:
835 case EXEC_OMP_SINGLE:
836 case EXEC_OMP_WORKSHARE:
837 case EXEC_OMP_PARALLEL_WORKSHARE:
838 omp_clauses = c->ext.omp_clauses;
840 case EXEC_OMP_CRITICAL:
842 gfc_status (" (%s)", c->ext.omp_name);
845 if (c->ext.omp_namelist)
848 gfc_show_namelist (c->ext.omp_namelist);
849 gfc_status_char (')');
852 case EXEC_OMP_BARRIER:
861 if (omp_clauses->if_expr)
864 gfc_show_expr (omp_clauses->if_expr);
865 gfc_status_char (')');
867 if (omp_clauses->num_threads)
869 gfc_status (" NUM_THREADS(");
870 gfc_show_expr (omp_clauses->num_threads);
871 gfc_status_char (')');
873 if (omp_clauses->sched_kind != OMP_SCHED_NONE)
876 switch (omp_clauses->sched_kind)
878 case OMP_SCHED_STATIC: type = "STATIC"; break;
879 case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
880 case OMP_SCHED_GUIDED: type = "GUIDED"; break;
881 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
885 gfc_status (" SCHEDULE (%s", type);
886 if (omp_clauses->chunk_size)
888 gfc_status_char (',');
889 gfc_show_expr (omp_clauses->chunk_size);
891 gfc_status_char (')');
893 if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
896 switch (omp_clauses->default_sharing)
898 case OMP_DEFAULT_NONE: type = "NONE"; break;
899 case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
900 case OMP_DEFAULT_SHARED: type = "SHARED"; break;
901 case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
905 gfc_status (" DEFAULT(%s)", type);
907 if (omp_clauses->ordered)
908 gfc_status (" ORDERED");
909 for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
910 if (omp_clauses->lists[list_type] != NULL
911 && list_type != OMP_LIST_COPYPRIVATE)
914 if (list_type >= OMP_LIST_REDUCTION_FIRST)
918 case OMP_LIST_PLUS: type = "+"; break;
919 case OMP_LIST_MULT: type = "*"; break;
920 case OMP_LIST_SUB: type = "-"; break;
921 case OMP_LIST_AND: type = ".AND."; break;
922 case OMP_LIST_OR: type = ".OR."; break;
923 case OMP_LIST_EQV: type = ".EQV."; break;
924 case OMP_LIST_NEQV: type = ".NEQV."; break;
925 case OMP_LIST_MAX: type = "MAX"; break;
926 case OMP_LIST_MIN: type = "MIN"; break;
927 case OMP_LIST_IAND: type = "IAND"; break;
928 case OMP_LIST_IOR: type = "IOR"; break;
929 case OMP_LIST_IEOR: type = "IEOR"; break;
933 gfc_status (" REDUCTION(%s:", type);
939 case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
940 case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
941 case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
942 case OMP_LIST_SHARED: type = "SHARED"; break;
943 case OMP_LIST_COPYIN: type = "COPYIN"; break;
947 gfc_status (" %s(", type);
949 gfc_show_namelist (omp_clauses->lists[list_type]);
950 gfc_status_char (')');
953 gfc_status_char ('\n');
954 if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
956 gfc_code *d = c->block;
959 gfc_show_code (level + 1, d->next);
960 if (d->block == NULL)
962 code_indent (level, 0);
963 gfc_status ("!$OMP SECTION\n");
968 gfc_show_code (level + 1, c->block->next);
969 if (c->op == EXEC_OMP_ATOMIC)
971 code_indent (level, 0);
972 gfc_status ("!$OMP END %s", name);
973 if (omp_clauses != NULL)
975 if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
977 gfc_status (" COPYPRIVATE(");
978 gfc_show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
979 gfc_status_char (')');
981 else if (omp_clauses->nowait)
982 gfc_status (" NOWAIT");
984 else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
985 gfc_status (" (%s)", c->ext.omp_name);
988 /* Show a single code node and everything underneath it if necessary. */
991 gfc_show_code_node (int level, gfc_code * c)
993 gfc_forall_iterator *fa;
1003 code_indent (level, c->here);
1012 gfc_status ("CONTINUE");
1016 gfc_status ("ENTRY %s", c->ext.entry->sym->name);
1020 gfc_status ("ASSIGN ");
1021 gfc_show_expr (c->expr);
1022 gfc_status_char (' ');
1023 gfc_show_expr (c->expr2);
1026 case EXEC_LABEL_ASSIGN:
1027 gfc_status ("LABEL ASSIGN ");
1028 gfc_show_expr (c->expr);
1029 gfc_status (" %d", c->label->value);
1032 case EXEC_POINTER_ASSIGN:
1033 gfc_status ("POINTER ASSIGN ");
1034 gfc_show_expr (c->expr);
1035 gfc_status_char (' ');
1036 gfc_show_expr (c->expr2);
1040 gfc_status ("GOTO ");
1042 gfc_status ("%d", c->label->value);
1045 gfc_show_expr (c->expr);
1050 for (; d; d = d ->block)
1052 code_indent (level, d->label);
1053 if (d->block != NULL)
1054 gfc_status_char (',');
1056 gfc_status_char (')');
1063 gfc_status ("CALL %s ", c->resolved_sym->name);
1064 gfc_show_actual_arglist (c->ext.actual);
1068 gfc_status ("RETURN ");
1070 gfc_show_expr (c->expr);
1074 gfc_status ("PAUSE ");
1076 if (c->expr != NULL)
1077 gfc_show_expr (c->expr);
1079 gfc_status ("%d", c->ext.stop_code);
1084 gfc_status ("STOP ");
1086 if (c->expr != NULL)
1087 gfc_show_expr (c->expr);
1089 gfc_status ("%d", c->ext.stop_code);
1093 case EXEC_ARITHMETIC_IF:
1095 gfc_show_expr (c->expr);
1096 gfc_status (" %d, %d, %d",
1097 c->label->value, c->label2->value, c->label3->value);
1103 gfc_show_expr (d->expr);
1104 gfc_status_char ('\n');
1105 gfc_show_code (level + 1, d->next);
1108 for (; d; d = d->block)
1110 code_indent (level, 0);
1112 if (d->expr == NULL)
1113 gfc_status ("ELSE\n");
1116 gfc_status ("ELSE IF ");
1117 gfc_show_expr (d->expr);
1118 gfc_status_char ('\n');
1121 gfc_show_code (level + 1, d->next);
1124 code_indent (level, c->label);
1126 gfc_status ("ENDIF");
1131 gfc_status ("SELECT CASE ");
1132 gfc_show_expr (c->expr);
1133 gfc_status_char ('\n');
1135 for (; d; d = d->block)
1137 code_indent (level, 0);
1139 gfc_status ("CASE ");
1140 for (cp = d->ext.case_list; cp; cp = cp->next)
1142 gfc_status_char ('(');
1143 gfc_show_expr (cp->low);
1144 gfc_status_char (' ');
1145 gfc_show_expr (cp->high);
1146 gfc_status_char (')');
1147 gfc_status_char (' ');
1149 gfc_status_char ('\n');
1151 gfc_show_code (level + 1, d->next);
1154 code_indent (level, c->label);
1155 gfc_status ("END SELECT");
1159 gfc_status ("WHERE ");
1162 gfc_show_expr (d->expr);
1163 gfc_status_char ('\n');
1165 gfc_show_code (level + 1, d->next);
1167 for (d = d->block; d; d = d->block)
1169 code_indent (level, 0);
1170 gfc_status ("ELSE WHERE ");
1171 gfc_show_expr (d->expr);
1172 gfc_status_char ('\n');
1173 gfc_show_code (level + 1, d->next);
1176 code_indent (level, 0);
1177 gfc_status ("END WHERE");
1182 gfc_status ("FORALL ");
1183 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1185 gfc_show_expr (fa->var);
1186 gfc_status_char (' ');
1187 gfc_show_expr (fa->start);
1188 gfc_status_char (':');
1189 gfc_show_expr (fa->end);
1190 gfc_status_char (':');
1191 gfc_show_expr (fa->stride);
1193 if (fa->next != NULL)
1194 gfc_status_char (',');
1197 if (c->expr != NULL)
1199 gfc_status_char (',');
1200 gfc_show_expr (c->expr);
1202 gfc_status_char ('\n');
1204 gfc_show_code (level + 1, c->block->next);
1206 code_indent (level, 0);
1207 gfc_status ("END FORALL");
1213 gfc_show_expr (c->ext.iterator->var);
1214 gfc_status_char ('=');
1215 gfc_show_expr (c->ext.iterator->start);
1216 gfc_status_char (' ');
1217 gfc_show_expr (c->ext.iterator->end);
1218 gfc_status_char (' ');
1219 gfc_show_expr (c->ext.iterator->step);
1220 gfc_status_char ('\n');
1222 gfc_show_code (level + 1, c->block->next);
1224 code_indent (level, 0);
1225 gfc_status ("END DO");
1229 gfc_status ("DO WHILE ");
1230 gfc_show_expr (c->expr);
1231 gfc_status_char ('\n');
1233 gfc_show_code (level + 1, c->block->next);
1235 code_indent (level, c->label);
1236 gfc_status ("END DO");
1240 gfc_status ("CYCLE");
1242 gfc_status (" %s", c->symtree->n.sym->name);
1246 gfc_status ("EXIT");
1248 gfc_status (" %s", c->symtree->n.sym->name);
1252 gfc_status ("ALLOCATE ");
1255 gfc_status (" STAT=");
1256 gfc_show_expr (c->expr);
1259 for (a = c->ext.alloc_list; a; a = a->next)
1261 gfc_status_char (' ');
1262 gfc_show_expr (a->expr);
1267 case EXEC_DEALLOCATE:
1268 gfc_status ("DEALLOCATE ");
1271 gfc_status (" STAT=");
1272 gfc_show_expr (c->expr);
1275 for (a = c->ext.alloc_list; a; a = a->next)
1277 gfc_status_char (' ');
1278 gfc_show_expr (a->expr);
1284 gfc_status ("OPEN");
1289 gfc_status (" UNIT=");
1290 gfc_show_expr (open->unit);
1294 gfc_status (" IOMSG=");
1295 gfc_show_expr (open->iomsg);
1299 gfc_status (" IOSTAT=");
1300 gfc_show_expr (open->iostat);
1304 gfc_status (" FILE=");
1305 gfc_show_expr (open->file);
1309 gfc_status (" STATUS=");
1310 gfc_show_expr (open->status);
1314 gfc_status (" ACCESS=");
1315 gfc_show_expr (open->access);
1319 gfc_status (" FORM=");
1320 gfc_show_expr (open->form);
1324 gfc_status (" RECL=");
1325 gfc_show_expr (open->recl);
1329 gfc_status (" BLANK=");
1330 gfc_show_expr (open->blank);
1334 gfc_status (" POSITION=");
1335 gfc_show_expr (open->position);
1339 gfc_status (" ACTION=");
1340 gfc_show_expr (open->action);
1344 gfc_status (" DELIM=");
1345 gfc_show_expr (open->delim);
1349 gfc_status (" PAD=");
1350 gfc_show_expr (open->pad);
1354 gfc_status (" CONVERT=");
1355 gfc_show_expr (open->convert);
1357 if (open->err != NULL)
1358 gfc_status (" ERR=%d", open->err->value);
1363 gfc_status ("CLOSE");
1364 close = c->ext.close;
1368 gfc_status (" UNIT=");
1369 gfc_show_expr (close->unit);
1373 gfc_status (" IOMSG=");
1374 gfc_show_expr (close->iomsg);
1378 gfc_status (" IOSTAT=");
1379 gfc_show_expr (close->iostat);
1383 gfc_status (" STATUS=");
1384 gfc_show_expr (close->status);
1386 if (close->err != NULL)
1387 gfc_status (" ERR=%d", close->err->value);
1390 case EXEC_BACKSPACE:
1391 gfc_status ("BACKSPACE");
1395 gfc_status ("ENDFILE");
1399 gfc_status ("REWIND");
1403 gfc_status ("FLUSH");
1406 fp = c->ext.filepos;
1410 gfc_status (" UNIT=");
1411 gfc_show_expr (fp->unit);
1415 gfc_status (" IOMSG=");
1416 gfc_show_expr (fp->iomsg);
1420 gfc_status (" IOSTAT=");
1421 gfc_show_expr (fp->iostat);
1423 if (fp->err != NULL)
1424 gfc_status (" ERR=%d", fp->err->value);
1428 gfc_status ("INQUIRE");
1433 gfc_status (" UNIT=");
1434 gfc_show_expr (i->unit);
1438 gfc_status (" FILE=");
1439 gfc_show_expr (i->file);
1444 gfc_status (" IOMSG=");
1445 gfc_show_expr (i->iomsg);
1449 gfc_status (" IOSTAT=");
1450 gfc_show_expr (i->iostat);
1454 gfc_status (" EXIST=");
1455 gfc_show_expr (i->exist);
1459 gfc_status (" OPENED=");
1460 gfc_show_expr (i->opened);
1464 gfc_status (" NUMBER=");
1465 gfc_show_expr (i->number);
1469 gfc_status (" NAMED=");
1470 gfc_show_expr (i->named);
1474 gfc_status (" NAME=");
1475 gfc_show_expr (i->name);
1479 gfc_status (" ACCESS=");
1480 gfc_show_expr (i->access);
1484 gfc_status (" SEQUENTIAL=");
1485 gfc_show_expr (i->sequential);
1490 gfc_status (" DIRECT=");
1491 gfc_show_expr (i->direct);
1495 gfc_status (" FORM=");
1496 gfc_show_expr (i->form);
1500 gfc_status (" FORMATTED");
1501 gfc_show_expr (i->formatted);
1505 gfc_status (" UNFORMATTED=");
1506 gfc_show_expr (i->unformatted);
1510 gfc_status (" RECL=");
1511 gfc_show_expr (i->recl);
1515 gfc_status (" NEXTREC=");
1516 gfc_show_expr (i->nextrec);
1520 gfc_status (" BLANK=");
1521 gfc_show_expr (i->blank);
1525 gfc_status (" POSITION=");
1526 gfc_show_expr (i->position);
1530 gfc_status (" ACTION=");
1531 gfc_show_expr (i->action);
1535 gfc_status (" READ=");
1536 gfc_show_expr (i->read);
1540 gfc_status (" WRITE=");
1541 gfc_show_expr (i->write);
1545 gfc_status (" READWRITE=");
1546 gfc_show_expr (i->readwrite);
1550 gfc_status (" DELIM=");
1551 gfc_show_expr (i->delim);
1555 gfc_status (" PAD=");
1556 gfc_show_expr (i->pad);
1560 gfc_status (" CONVERT=");
1561 gfc_show_expr (i->convert);
1565 gfc_status (" ERR=%d", i->err->value);
1569 gfc_status ("IOLENGTH ");
1570 gfc_show_expr (c->expr);
1575 gfc_status ("READ");
1579 gfc_status ("WRITE");
1585 gfc_status (" UNIT=");
1586 gfc_show_expr (dt->io_unit);
1589 if (dt->format_expr)
1591 gfc_status (" FMT=");
1592 gfc_show_expr (dt->format_expr);
1595 if (dt->format_label != NULL)
1596 gfc_status (" FMT=%d", dt->format_label->value);
1598 gfc_status (" NML=%s", dt->namelist->name);
1602 gfc_status (" IOMSG=");
1603 gfc_show_expr (dt->iomsg);
1607 gfc_status (" IOSTAT=");
1608 gfc_show_expr (dt->iostat);
1612 gfc_status (" SIZE=");
1613 gfc_show_expr (dt->size);
1617 gfc_status (" REC=");
1618 gfc_show_expr (dt->rec);
1622 gfc_status (" ADVANCE=");
1623 gfc_show_expr (dt->advance);
1627 gfc_status_char ('\n');
1628 for (c = c->block->next; c; c = c->next)
1629 gfc_show_code_node (level + (c->next != NULL), c);
1633 gfc_status ("TRANSFER ");
1634 gfc_show_expr (c->expr);
1638 gfc_status ("DT_END");
1641 if (dt->err != NULL)
1642 gfc_status (" ERR=%d", dt->err->value);
1643 if (dt->end != NULL)
1644 gfc_status (" END=%d", dt->end->value);
1645 if (dt->eor != NULL)
1646 gfc_status (" EOR=%d", dt->eor->value);
1649 case EXEC_OMP_ATOMIC:
1650 case EXEC_OMP_BARRIER:
1651 case EXEC_OMP_CRITICAL:
1652 case EXEC_OMP_FLUSH:
1654 case EXEC_OMP_MASTER:
1655 case EXEC_OMP_ORDERED:
1656 case EXEC_OMP_PARALLEL:
1657 case EXEC_OMP_PARALLEL_DO:
1658 case EXEC_OMP_PARALLEL_SECTIONS:
1659 case EXEC_OMP_PARALLEL_WORKSHARE:
1660 case EXEC_OMP_SECTIONS:
1661 case EXEC_OMP_SINGLE:
1662 case EXEC_OMP_WORKSHARE:
1663 gfc_show_omp_node (level, c);
1667 gfc_internal_error ("gfc_show_code_node(): Bad statement code");
1670 gfc_status_char ('\n');
1674 /* Show an equivalence chain. */
1677 gfc_show_equiv (gfc_equiv *eq)
1680 gfc_status ("Equivalence: ");
1683 gfc_show_expr (eq->expr);
1691 /* Show a freakin' whole namespace. */
1694 gfc_show_namespace (gfc_namespace * ns)
1696 gfc_interface *intr;
1697 gfc_namespace *save;
1698 gfc_intrinsic_op op;
1702 save = gfc_current_ns;
1706 gfc_status ("Namespace:");
1714 while (i < GFC_LETTERS - 1
1715 && gfc_compare_types(&ns->default_type[i+1],
1716 &ns->default_type[l]))
1720 gfc_status(" %c-%c: ", l+'A', i+'A');
1722 gfc_status(" %c: ", l+'A');
1724 gfc_show_typespec(&ns->default_type[l]);
1726 } while (i < GFC_LETTERS);
1728 if (ns->proc_name != NULL)
1731 gfc_status ("procedure name = %s", ns->proc_name->name);
1734 gfc_current_ns = ns;
1735 gfc_traverse_symtree (ns->common_root, show_common);
1737 gfc_traverse_symtree (ns->sym_root, show_symtree);
1739 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
1741 /* User operator interfaces */
1742 intr = ns->operator[op];
1747 gfc_status ("Operator interfaces for %s:", gfc_op2string (op));
1749 for (; intr; intr = intr->next)
1750 gfc_status (" %s", intr->sym->name);
1753 if (ns->uop_root != NULL)
1756 gfc_status ("User operators:\n");
1757 gfc_traverse_user_op (ns, show_uop);
1761 for (eq = ns->equiv; eq; eq = eq->next)
1762 gfc_show_equiv (eq);
1764 gfc_status_char ('\n');
1765 gfc_status_char ('\n');
1767 gfc_show_code (0, ns->code);
1769 for (ns = ns->contained; ns; ns = ns->sibling)
1772 gfc_status ("CONTAINS\n");
1773 gfc_show_namespace (ns);
1777 gfc_status_char ('\n');
1778 gfc_current_ns = save;