* Make-lang.in (GFORTRAN_TARGET_INSTALL_NAME): Define.
[official-gcc.git] / gcc / fortran / dump-parse-tree.c
blob8068b10d35fb3f80787c55be24175b5da0434b7b
1 /* Parse tree dumper
2 Copyright (C) 2003, 2004, 2005 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
10 version.
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
15 for more details.
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
20 02110-1301, USA. */
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
30 relatives.
32 TODO: Dump DATA. */
34 #include "config.h"
35 #include "gfortran.h"
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
42 this one. */
43 static void gfc_show_expr (gfc_expr *);
45 /* Do indentation for a specific level. */
47 static inline void
48 code_indent (int level, gfc_st_label * label)
50 int i;
52 if (label != NULL)
53 gfc_status ("%-5d ", label->value);
54 else
55 gfc_status (" ");
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. */
64 static inline void
65 show_indent (void)
67 gfc_status ("\n");
68 code_indent (show_level, NULL);
72 /* Show type-specific information. */
73 static void
74 gfc_show_typespec (gfc_typespec * ts)
77 gfc_status ("(%s ", gfc_basic_typename (ts->type));
79 switch (ts->type)
81 case BT_DERIVED:
82 gfc_status ("%s", ts->derived->name);
83 break;
85 case BT_CHARACTER:
86 gfc_show_expr (ts->cl->length);
87 break;
89 default:
90 gfc_status ("%d", ts->kind);
91 break;
94 gfc_status (")");
98 /* Show an actual argument list. */
100 static void
101 gfc_show_actual_arglist (gfc_actual_arglist * a)
104 gfc_status ("(");
106 for (; a; a = a->next)
108 gfc_status_char ('(');
109 if (a->name != NULL)
110 gfc_status ("%s = ", a->name);
111 if (a->expr != NULL)
112 gfc_show_expr (a->expr);
113 else
114 gfc_status ("(arg not-present)");
116 gfc_status_char (')');
117 if (a->next != NULL)
118 gfc_status (" ");
121 gfc_status (")");
125 /* Show a gfc_array_spec array specification structure. */
127 static void
128 gfc_show_array_spec (gfc_array_spec * as)
130 const char *c;
131 int i;
133 if (as == NULL)
135 gfc_status ("()");
136 return;
139 gfc_status ("(%d", as->rank);
141 if (as->rank != 0)
143 switch (as->type)
145 case AS_EXPLICIT: c = "AS_EXPLICIT"; break;
146 case AS_DEFERRED: c = "AS_DEFERRED"; break;
147 case AS_ASSUMED_SIZE: c = "AS_ASSUMED_SIZE"; break;
148 case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
149 default:
150 gfc_internal_error
151 ("gfc_show_array_spec(): Unhandled array shape type.");
153 gfc_status (" %s ", c);
155 for (i = 0; i < as->rank; i++)
157 gfc_show_expr (as->lower[i]);
158 gfc_status_char (' ');
159 gfc_show_expr (as->upper[i]);
160 gfc_status_char (' ');
164 gfc_status (")");
168 /* Show a gfc_array_ref array reference structure. */
170 static void
171 gfc_show_array_ref (gfc_array_ref * ar)
173 int i;
175 gfc_status_char ('(');
177 switch (ar->type)
179 case AR_FULL:
180 gfc_status ("FULL");
181 break;
183 case AR_SECTION:
184 for (i = 0; i < ar->dimen; i++)
186 /* There are two types of array sections: either the
187 elements are identified by an integer array ('vector'),
188 or by an index range. In the former case we only have to
189 print the start expression which contains the vector, in
190 the latter case we have to print any of lower and upper
191 bound and the stride, if they're present. */
193 if (ar->start[i] != NULL)
194 gfc_show_expr (ar->start[i]);
196 if (ar->dimen_type[i] == DIMEN_RANGE)
198 gfc_status_char (':');
200 if (ar->end[i] != NULL)
201 gfc_show_expr (ar->end[i]);
203 if (ar->stride[i] != NULL)
205 gfc_status_char (':');
206 gfc_show_expr (ar->stride[i]);
210 if (i != ar->dimen - 1)
211 gfc_status (" , ");
213 break;
215 case AR_ELEMENT:
216 for (i = 0; i < ar->dimen; i++)
218 gfc_show_expr (ar->start[i]);
219 if (i != ar->dimen - 1)
220 gfc_status (" , ");
222 break;
224 case AR_UNKNOWN:
225 gfc_status ("UNKNOWN");
226 break;
228 default:
229 gfc_internal_error ("gfc_show_array_ref(): Unknown array reference");
232 gfc_status_char (')');
236 /* Show a list of gfc_ref structures. */
238 static void
239 gfc_show_ref (gfc_ref * p)
242 for (; p; p = p->next)
243 switch (p->type)
245 case REF_ARRAY:
246 gfc_show_array_ref (&p->u.ar);
247 break;
249 case REF_COMPONENT:
250 gfc_status (" %% %s", p->u.c.component->name);
251 break;
253 case REF_SUBSTRING:
254 gfc_status_char ('(');
255 gfc_show_expr (p->u.ss.start);
256 gfc_status_char (':');
257 gfc_show_expr (p->u.ss.end);
258 gfc_status_char (')');
259 break;
261 default:
262 gfc_internal_error ("gfc_show_ref(): Bad component code");
267 /* Display a constructor. Works recursively for array constructors. */
269 static void
270 gfc_show_constructor (gfc_constructor * c)
273 for (; c; c = c->next)
275 if (c->iterator == NULL)
276 gfc_show_expr (c->expr);
277 else
279 gfc_status_char ('(');
280 gfc_show_expr (c->expr);
282 gfc_status_char (' ');
283 gfc_show_expr (c->iterator->var);
284 gfc_status_char ('=');
285 gfc_show_expr (c->iterator->start);
286 gfc_status_char (',');
287 gfc_show_expr (c->iterator->end);
288 gfc_status_char (',');
289 gfc_show_expr (c->iterator->step);
291 gfc_status_char (')');
294 if (c->next != NULL)
295 gfc_status (" , ");
300 /* Show an expression. */
302 static void
303 gfc_show_expr (gfc_expr * p)
305 const char *c;
306 int i;
308 if (p == NULL)
310 gfc_status ("()");
311 return;
314 switch (p->expr_type)
316 case EXPR_SUBSTRING:
317 c = p->value.character.string;
319 for (i = 0; i < p->value.character.length; i++, c++)
321 if (*c == '\'')
322 gfc_status ("''");
323 else
324 gfc_status ("%c", *c);
327 gfc_show_ref (p->ref);
328 break;
330 case EXPR_STRUCTURE:
331 gfc_status ("%s(", p->ts.derived->name);
332 gfc_show_constructor (p->value.constructor);
333 gfc_status_char (')');
334 break;
336 case EXPR_ARRAY:
337 gfc_status ("(/ ");
338 gfc_show_constructor (p->value.constructor);
339 gfc_status (" /)");
341 gfc_show_ref (p->ref);
342 break;
344 case EXPR_NULL:
345 gfc_status ("NULL()");
346 break;
348 case EXPR_CONSTANT:
349 switch (p->ts.type)
351 case BT_INTEGER:
352 mpz_out_str (stdout, 10, p->value.integer);
354 if (p->ts.kind != gfc_default_integer_kind)
355 gfc_status ("_%d", p->ts.kind);
356 break;
358 case BT_LOGICAL:
359 if (p->value.logical)
360 gfc_status (".true.");
361 else
362 gfc_status (".false.");
363 break;
365 case BT_REAL:
366 mpfr_out_str (stdout, 10, 0, p->value.real, GFC_RND_MODE);
367 if (p->ts.kind != gfc_default_real_kind)
368 gfc_status ("_%d", p->ts.kind);
369 break;
371 case BT_CHARACTER:
372 c = p->value.character.string;
374 gfc_status_char ('\'');
376 for (i = 0; i < p->value.character.length; i++, c++)
378 if (*c == '\'')
379 gfc_status ("''");
380 else
381 gfc_status_char (*c);
384 gfc_status_char ('\'');
386 break;
388 case BT_COMPLEX:
389 gfc_status ("(complex ");
391 mpfr_out_str (stdout, 10, 0, p->value.complex.r, GFC_RND_MODE);
392 if (p->ts.kind != gfc_default_complex_kind)
393 gfc_status ("_%d", p->ts.kind);
395 gfc_status (" ");
397 mpfr_out_str (stdout, 10, 0, p->value.complex.i, GFC_RND_MODE);
398 if (p->ts.kind != gfc_default_complex_kind)
399 gfc_status ("_%d", p->ts.kind);
401 gfc_status (")");
402 break;
404 default:
405 gfc_status ("???");
406 break;
409 break;
411 case EXPR_VARIABLE:
412 if (p->symtree->n.sym->ns && p->symtree->n.sym->ns->proc_name)
413 gfc_status ("%s:", p->symtree->n.sym->ns->proc_name->name);
414 gfc_status ("%s", p->symtree->n.sym->name);
415 gfc_show_ref (p->ref);
416 break;
418 case EXPR_OP:
419 gfc_status ("(");
420 switch (p->value.op.operator)
422 case INTRINSIC_UPLUS:
423 gfc_status ("U+ ");
424 break;
425 case INTRINSIC_UMINUS:
426 gfc_status ("U- ");
427 break;
428 case INTRINSIC_PLUS:
429 gfc_status ("+ ");
430 break;
431 case INTRINSIC_MINUS:
432 gfc_status ("- ");
433 break;
434 case INTRINSIC_TIMES:
435 gfc_status ("* ");
436 break;
437 case INTRINSIC_DIVIDE:
438 gfc_status ("/ ");
439 break;
440 case INTRINSIC_POWER:
441 gfc_status ("** ");
442 break;
443 case INTRINSIC_CONCAT:
444 gfc_status ("// ");
445 break;
446 case INTRINSIC_AND:
447 gfc_status ("AND ");
448 break;
449 case INTRINSIC_OR:
450 gfc_status ("OR ");
451 break;
452 case INTRINSIC_EQV:
453 gfc_status ("EQV ");
454 break;
455 case INTRINSIC_NEQV:
456 gfc_status ("NEQV ");
457 break;
458 case INTRINSIC_EQ:
459 gfc_status ("= ");
460 break;
461 case INTRINSIC_NE:
462 gfc_status ("<> ");
463 break;
464 case INTRINSIC_GT:
465 gfc_status ("> ");
466 break;
467 case INTRINSIC_GE:
468 gfc_status (">= ");
469 break;
470 case INTRINSIC_LT:
471 gfc_status ("< ");
472 break;
473 case INTRINSIC_LE:
474 gfc_status ("<= ");
475 break;
476 case INTRINSIC_NOT:
477 gfc_status ("NOT ");
478 break;
480 default:
481 gfc_internal_error
482 ("gfc_show_expr(): Bad intrinsic in expression!");
485 gfc_show_expr (p->value.op.op1);
487 if (p->value.op.op2)
489 gfc_status (" ");
490 gfc_show_expr (p->value.op.op2);
493 gfc_status (")");
494 break;
496 case EXPR_FUNCTION:
497 if (p->value.function.name == NULL)
499 gfc_status ("%s[", p->symtree->n.sym->name);
500 gfc_show_actual_arglist (p->value.function.actual);
501 gfc_status_char (']');
503 else
505 gfc_status ("%s[[", p->value.function.name);
506 gfc_show_actual_arglist (p->value.function.actual);
507 gfc_status_char (']');
508 gfc_status_char (']');
511 break;
513 default:
514 gfc_internal_error ("gfc_show_expr(): Don't know how to show expr");
519 /* Show symbol attributes. The flavor and intent are followed by
520 whatever single bit attributes are present. */
522 static void
523 gfc_show_attr (symbol_attribute * attr)
526 gfc_status ("(%s %s %s %s", gfc_code2string (flavors, attr->flavor),
527 gfc_intent_string (attr->intent),
528 gfc_code2string (access_types, attr->access),
529 gfc_code2string (procedures, attr->proc));
531 if (attr->allocatable)
532 gfc_status (" ALLOCATABLE");
533 if (attr->dimension)
534 gfc_status (" DIMENSION");
535 if (attr->external)
536 gfc_status (" EXTERNAL");
537 if (attr->intrinsic)
538 gfc_status (" INTRINSIC");
539 if (attr->optional)
540 gfc_status (" OPTIONAL");
541 if (attr->pointer)
542 gfc_status (" POINTER");
543 if (attr->save)
544 gfc_status (" SAVE");
545 if (attr->target)
546 gfc_status (" TARGET");
547 if (attr->dummy)
548 gfc_status (" DUMMY");
549 if (attr->result)
550 gfc_status (" RESULT");
551 if (attr->entry)
552 gfc_status (" ENTRY");
554 if (attr->data)
555 gfc_status (" DATA");
556 if (attr->use_assoc)
557 gfc_status (" USE-ASSOC");
558 if (attr->in_namelist)
559 gfc_status (" IN-NAMELIST");
560 if (attr->in_common)
561 gfc_status (" IN-COMMON");
563 if (attr->function)
564 gfc_status (" FUNCTION");
565 if (attr->subroutine)
566 gfc_status (" SUBROUTINE");
567 if (attr->implicit_type)
568 gfc_status (" IMPLICIT-TYPE");
570 if (attr->sequence)
571 gfc_status (" SEQUENCE");
572 if (attr->elemental)
573 gfc_status (" ELEMENTAL");
574 if (attr->pure)
575 gfc_status (" PURE");
576 if (attr->recursive)
577 gfc_status (" RECURSIVE");
579 gfc_status (")");
583 /* Show components of a derived type. */
585 static void
586 gfc_show_components (gfc_symbol * sym)
588 gfc_component *c;
590 for (c = sym->components; c; c = c->next)
592 gfc_status ("(%s ", c->name);
593 gfc_show_typespec (&c->ts);
594 if (c->pointer)
595 gfc_status (" POINTER");
596 if (c->dimension)
597 gfc_status (" DIMENSION");
598 gfc_status_char (' ');
599 gfc_show_array_spec (c->as);
600 gfc_status (")");
601 if (c->next != NULL)
602 gfc_status_char (' ');
607 /* Show a symbol. If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
608 show the interface. Information needed to reconstruct the list of
609 specific interfaces associated with a generic symbol is done within
610 that symbol. */
612 static void
613 gfc_show_symbol (gfc_symbol * sym)
615 gfc_formal_arglist *formal;
616 gfc_interface *intr;
618 if (sym == NULL)
619 return;
621 show_indent ();
623 gfc_status ("symbol %s ", sym->name);
624 gfc_show_typespec (&sym->ts);
625 gfc_show_attr (&sym->attr);
627 if (sym->value)
629 show_indent ();
630 gfc_status ("value: ");
631 gfc_show_expr (sym->value);
634 if (sym->as)
636 show_indent ();
637 gfc_status ("Array spec:");
638 gfc_show_array_spec (sym->as);
641 if (sym->generic)
643 show_indent ();
644 gfc_status ("Generic interfaces:");
645 for (intr = sym->generic; intr; intr = intr->next)
646 gfc_status (" %s", intr->sym->name);
649 if (sym->result)
651 show_indent ();
652 gfc_status ("result: %s", sym->result->name);
655 if (sym->components)
657 show_indent ();
658 gfc_status ("components: ");
659 gfc_show_components (sym);
662 if (sym->formal)
664 show_indent ();
665 gfc_status ("Formal arglist:");
667 for (formal = sym->formal; formal; formal = formal->next)
669 if (formal->sym != NULL)
670 gfc_status (" %s", formal->sym->name);
671 else
672 gfc_status (" [Alt Return]");
676 if (sym->formal_ns)
678 show_indent ();
679 gfc_status ("Formal namespace");
680 gfc_show_namespace (sym->formal_ns);
683 gfc_status_char ('\n');
687 /* Show a user-defined operator. Just prints an operator
688 and the name of the associated subroutine, really. */
689 static void
690 show_uop (gfc_user_op * uop)
692 gfc_interface *intr;
694 show_indent ();
695 gfc_status ("%s:", uop->name);
697 for (intr = uop->operator; intr; intr = intr->next)
698 gfc_status (" %s", intr->sym->name);
702 /* Workhorse function for traversing the user operator symtree. */
704 static void
705 traverse_uop (gfc_symtree * st, void (*func) (gfc_user_op *))
708 if (st == NULL)
709 return;
711 (*func) (st->n.uop);
713 traverse_uop (st->left, func);
714 traverse_uop (st->right, func);
718 /* Traverse the tree of user operator nodes. */
720 void
721 gfc_traverse_user_op (gfc_namespace * ns, void (*func) (gfc_user_op *))
724 traverse_uop (ns->uop_root, func);
728 /* Function to display a common block. */
730 static void
731 show_common (gfc_symtree * st)
733 gfc_symbol *s;
735 show_indent ();
736 gfc_status ("common: /%s/ ", st->name);
738 s = st->n.common->head;
739 while (s)
741 gfc_status ("%s", s->name);
742 s = s->common_next;
743 if (s)
744 gfc_status (", ");
746 gfc_status_char ('\n');
749 /* Worker function to display the symbol tree. */
751 static void
752 show_symtree (gfc_symtree * st)
755 show_indent ();
756 gfc_status ("symtree: %s Ambig %d", st->name, st->ambiguous);
758 if (st->n.sym->ns != gfc_current_ns)
759 /* Do nothing
760 gfc_status (" from namespace %s", st->n.sym->ns->proc_name->name); */
762 else
763 gfc_show_symbol (st->n.sym);
767 /******************* Show gfc_code structures **************/
771 static void gfc_show_code_node (int level, gfc_code * c);
773 /* Show a list of code structures. Mutually recursive with
774 gfc_show_code_node(). */
776 static void
777 gfc_show_code (int level, gfc_code * c)
780 for (; c; c = c->next)
781 gfc_show_code_node (level, c);
785 /* Show a single code node and everything underneath it if necessary. */
787 static void
788 gfc_show_code_node (int level, gfc_code * c)
790 gfc_forall_iterator *fa;
791 gfc_open *open;
792 gfc_case *cp;
793 gfc_alloc *a;
794 gfc_code *d;
795 gfc_close *close;
796 gfc_filepos *fp;
797 gfc_inquire *i;
798 gfc_dt *dt;
800 code_indent (level, c->here);
802 switch (c->op)
804 case EXEC_NOP:
805 gfc_status ("NOP");
806 break;
808 case EXEC_CONTINUE:
809 gfc_status ("CONTINUE");
810 break;
812 case EXEC_ENTRY:
813 gfc_status ("ENTRY %s", c->ext.entry->sym->name);
814 break;
816 case EXEC_ASSIGN:
817 gfc_status ("ASSIGN ");
818 gfc_show_expr (c->expr);
819 gfc_status_char (' ');
820 gfc_show_expr (c->expr2);
821 break;
823 case EXEC_LABEL_ASSIGN:
824 gfc_status ("LABEL ASSIGN ");
825 gfc_show_expr (c->expr);
826 gfc_status (" %d", c->label->value);
827 break;
829 case EXEC_POINTER_ASSIGN:
830 gfc_status ("POINTER ASSIGN ");
831 gfc_show_expr (c->expr);
832 gfc_status_char (' ');
833 gfc_show_expr (c->expr2);
834 break;
836 case EXEC_GOTO:
837 gfc_status ("GOTO ");
838 if (c->label)
839 gfc_status ("%d", c->label->value);
840 else
842 gfc_show_expr (c->expr);
843 d = c->block;
844 if (d != NULL)
846 gfc_status (", (");
847 for (; d; d = d ->block)
849 code_indent (level, d->label);
850 if (d->block != NULL)
851 gfc_status_char (',');
852 else
853 gfc_status_char (')');
857 break;
859 case EXEC_CALL:
860 gfc_status ("CALL %s ", c->resolved_sym->name);
861 gfc_show_actual_arglist (c->ext.actual);
862 break;
864 case EXEC_RETURN:
865 gfc_status ("RETURN ");
866 if (c->expr)
867 gfc_show_expr (c->expr);
868 break;
870 case EXEC_PAUSE:
871 gfc_status ("PAUSE ");
873 if (c->expr != NULL)
874 gfc_show_expr (c->expr);
875 else
876 gfc_status ("%d", c->ext.stop_code);
878 break;
880 case EXEC_STOP:
881 gfc_status ("STOP ");
883 if (c->expr != NULL)
884 gfc_show_expr (c->expr);
885 else
886 gfc_status ("%d", c->ext.stop_code);
888 break;
890 case EXEC_ARITHMETIC_IF:
891 gfc_status ("IF ");
892 gfc_show_expr (c->expr);
893 gfc_status (" %d, %d, %d",
894 c->label->value, c->label2->value, c->label3->value);
895 break;
897 case EXEC_IF:
898 d = c->block;
899 gfc_status ("IF ");
900 gfc_show_expr (d->expr);
901 gfc_status_char ('\n');
902 gfc_show_code (level + 1, d->next);
904 d = d->block;
905 for (; d; d = d->block)
907 code_indent (level, 0);
909 if (d->expr == NULL)
910 gfc_status ("ELSE\n");
911 else
913 gfc_status ("ELSE IF ");
914 gfc_show_expr (d->expr);
915 gfc_status_char ('\n');
918 gfc_show_code (level + 1, d->next);
921 code_indent (level, c->label);
923 gfc_status ("ENDIF");
924 break;
926 case EXEC_SELECT:
927 d = c->block;
928 gfc_status ("SELECT CASE ");
929 gfc_show_expr (c->expr);
930 gfc_status_char ('\n');
932 for (; d; d = d->block)
934 code_indent (level, 0);
936 gfc_status ("CASE ");
937 for (cp = d->ext.case_list; cp; cp = cp->next)
939 gfc_status_char ('(');
940 gfc_show_expr (cp->low);
941 gfc_status_char (' ');
942 gfc_show_expr (cp->high);
943 gfc_status_char (')');
944 gfc_status_char (' ');
946 gfc_status_char ('\n');
948 gfc_show_code (level + 1, d->next);
951 code_indent (level, c->label);
952 gfc_status ("END SELECT");
953 break;
955 case EXEC_WHERE:
956 gfc_status ("WHERE ");
958 d = c->block;
959 gfc_show_expr (d->expr);
960 gfc_status_char ('\n');
962 gfc_show_code (level + 1, d->next);
964 for (d = d->block; d; d = d->block)
966 code_indent (level, 0);
967 gfc_status ("ELSE WHERE ");
968 gfc_show_expr (d->expr);
969 gfc_status_char ('\n');
970 gfc_show_code (level + 1, d->next);
973 code_indent (level, 0);
974 gfc_status ("END WHERE");
975 break;
978 case EXEC_FORALL:
979 gfc_status ("FORALL ");
980 for (fa = c->ext.forall_iterator; fa; fa = fa->next)
982 gfc_show_expr (fa->var);
983 gfc_status_char (' ');
984 gfc_show_expr (fa->start);
985 gfc_status_char (':');
986 gfc_show_expr (fa->end);
987 gfc_status_char (':');
988 gfc_show_expr (fa->stride);
990 if (fa->next != NULL)
991 gfc_status_char (',');
994 if (c->expr != NULL)
996 gfc_status_char (',');
997 gfc_show_expr (c->expr);
999 gfc_status_char ('\n');
1001 gfc_show_code (level + 1, c->block->next);
1003 code_indent (level, 0);
1004 gfc_status ("END FORALL");
1005 break;
1007 case EXEC_DO:
1008 gfc_status ("DO ");
1010 gfc_show_expr (c->ext.iterator->var);
1011 gfc_status_char ('=');
1012 gfc_show_expr (c->ext.iterator->start);
1013 gfc_status_char (' ');
1014 gfc_show_expr (c->ext.iterator->end);
1015 gfc_status_char (' ');
1016 gfc_show_expr (c->ext.iterator->step);
1017 gfc_status_char ('\n');
1019 gfc_show_code (level + 1, c->block->next);
1021 code_indent (level, 0);
1022 gfc_status ("END DO");
1023 break;
1025 case EXEC_DO_WHILE:
1026 gfc_status ("DO WHILE ");
1027 gfc_show_expr (c->expr);
1028 gfc_status_char ('\n');
1030 gfc_show_code (level + 1, c->block->next);
1032 code_indent (level, c->label);
1033 gfc_status ("END DO");
1034 break;
1036 case EXEC_CYCLE:
1037 gfc_status ("CYCLE");
1038 if (c->symtree)
1039 gfc_status (" %s", c->symtree->n.sym->name);
1040 break;
1042 case EXEC_EXIT:
1043 gfc_status ("EXIT");
1044 if (c->symtree)
1045 gfc_status (" %s", c->symtree->n.sym->name);
1046 break;
1048 case EXEC_ALLOCATE:
1049 gfc_status ("ALLOCATE ");
1050 if (c->expr)
1052 gfc_status (" STAT=");
1053 gfc_show_expr (c->expr);
1056 for (a = c->ext.alloc_list; a; a = a->next)
1058 gfc_status_char (' ');
1059 gfc_show_expr (a->expr);
1062 break;
1064 case EXEC_DEALLOCATE:
1065 gfc_status ("DEALLOCATE ");
1066 if (c->expr)
1068 gfc_status (" STAT=");
1069 gfc_show_expr (c->expr);
1072 for (a = c->ext.alloc_list; a; a = a->next)
1074 gfc_status_char (' ');
1075 gfc_show_expr (a->expr);
1078 break;
1080 case EXEC_OPEN:
1081 gfc_status ("OPEN");
1082 open = c->ext.open;
1084 if (open->unit)
1086 gfc_status (" UNIT=");
1087 gfc_show_expr (open->unit);
1089 if (open->iomsg)
1091 gfc_status (" IOMSG=");
1092 gfc_show_expr (open->iomsg);
1094 if (open->iostat)
1096 gfc_status (" IOSTAT=");
1097 gfc_show_expr (open->iostat);
1099 if (open->file)
1101 gfc_status (" FILE=");
1102 gfc_show_expr (open->file);
1104 if (open->status)
1106 gfc_status (" STATUS=");
1107 gfc_show_expr (open->status);
1109 if (open->access)
1111 gfc_status (" ACCESS=");
1112 gfc_show_expr (open->access);
1114 if (open->form)
1116 gfc_status (" FORM=");
1117 gfc_show_expr (open->form);
1119 if (open->recl)
1121 gfc_status (" RECL=");
1122 gfc_show_expr (open->recl);
1124 if (open->blank)
1126 gfc_status (" BLANK=");
1127 gfc_show_expr (open->blank);
1129 if (open->position)
1131 gfc_status (" POSITION=");
1132 gfc_show_expr (open->position);
1134 if (open->action)
1136 gfc_status (" ACTION=");
1137 gfc_show_expr (open->action);
1139 if (open->delim)
1141 gfc_status (" DELIM=");
1142 gfc_show_expr (open->delim);
1144 if (open->pad)
1146 gfc_status (" PAD=");
1147 gfc_show_expr (open->pad);
1149 if (open->err != NULL)
1150 gfc_status (" ERR=%d", open->err->value);
1152 break;
1154 case EXEC_CLOSE:
1155 gfc_status ("CLOSE");
1156 close = c->ext.close;
1158 if (close->unit)
1160 gfc_status (" UNIT=");
1161 gfc_show_expr (close->unit);
1163 if (close->iomsg)
1165 gfc_status (" IOMSG=");
1166 gfc_show_expr (close->iomsg);
1168 if (close->iostat)
1170 gfc_status (" IOSTAT=");
1171 gfc_show_expr (close->iostat);
1173 if (close->status)
1175 gfc_status (" STATUS=");
1176 gfc_show_expr (close->status);
1178 if (close->err != NULL)
1179 gfc_status (" ERR=%d", close->err->value);
1180 break;
1182 case EXEC_BACKSPACE:
1183 gfc_status ("BACKSPACE");
1184 goto show_filepos;
1186 case EXEC_ENDFILE:
1187 gfc_status ("ENDFILE");
1188 goto show_filepos;
1190 case EXEC_REWIND:
1191 gfc_status ("REWIND");
1192 goto show_filepos;
1194 case EXEC_FLUSH:
1195 gfc_status ("FLUSH");
1197 show_filepos:
1198 fp = c->ext.filepos;
1200 if (fp->unit)
1202 gfc_status (" UNIT=");
1203 gfc_show_expr (fp->unit);
1205 if (fp->iomsg)
1207 gfc_status (" IOMSG=");
1208 gfc_show_expr (fp->iomsg);
1210 if (fp->iostat)
1212 gfc_status (" IOSTAT=");
1213 gfc_show_expr (fp->iostat);
1215 if (fp->err != NULL)
1216 gfc_status (" ERR=%d", fp->err->value);
1217 break;
1219 case EXEC_INQUIRE:
1220 gfc_status ("INQUIRE");
1221 i = c->ext.inquire;
1223 if (i->unit)
1225 gfc_status (" UNIT=");
1226 gfc_show_expr (i->unit);
1228 if (i->file)
1230 gfc_status (" FILE=");
1231 gfc_show_expr (i->file);
1234 if (i->iomsg)
1236 gfc_status (" IOMSG=");
1237 gfc_show_expr (i->iomsg);
1239 if (i->iostat)
1241 gfc_status (" IOSTAT=");
1242 gfc_show_expr (i->iostat);
1244 if (i->exist)
1246 gfc_status (" EXIST=");
1247 gfc_show_expr (i->exist);
1249 if (i->opened)
1251 gfc_status (" OPENED=");
1252 gfc_show_expr (i->opened);
1254 if (i->number)
1256 gfc_status (" NUMBER=");
1257 gfc_show_expr (i->number);
1259 if (i->named)
1261 gfc_status (" NAMED=");
1262 gfc_show_expr (i->named);
1264 if (i->name)
1266 gfc_status (" NAME=");
1267 gfc_show_expr (i->name);
1269 if (i->access)
1271 gfc_status (" ACCESS=");
1272 gfc_show_expr (i->access);
1274 if (i->sequential)
1276 gfc_status (" SEQUENTIAL=");
1277 gfc_show_expr (i->sequential);
1280 if (i->direct)
1282 gfc_status (" DIRECT=");
1283 gfc_show_expr (i->direct);
1285 if (i->form)
1287 gfc_status (" FORM=");
1288 gfc_show_expr (i->form);
1290 if (i->formatted)
1292 gfc_status (" FORMATTED");
1293 gfc_show_expr (i->formatted);
1295 if (i->unformatted)
1297 gfc_status (" UNFORMATTED=");
1298 gfc_show_expr (i->unformatted);
1300 if (i->recl)
1302 gfc_status (" RECL=");
1303 gfc_show_expr (i->recl);
1305 if (i->nextrec)
1307 gfc_status (" NEXTREC=");
1308 gfc_show_expr (i->nextrec);
1310 if (i->blank)
1312 gfc_status (" BLANK=");
1313 gfc_show_expr (i->blank);
1315 if (i->position)
1317 gfc_status (" POSITION=");
1318 gfc_show_expr (i->position);
1320 if (i->action)
1322 gfc_status (" ACTION=");
1323 gfc_show_expr (i->action);
1325 if (i->read)
1327 gfc_status (" READ=");
1328 gfc_show_expr (i->read);
1330 if (i->write)
1332 gfc_status (" WRITE=");
1333 gfc_show_expr (i->write);
1335 if (i->readwrite)
1337 gfc_status (" READWRITE=");
1338 gfc_show_expr (i->readwrite);
1340 if (i->delim)
1342 gfc_status (" DELIM=");
1343 gfc_show_expr (i->delim);
1345 if (i->pad)
1347 gfc_status (" PAD=");
1348 gfc_show_expr (i->pad);
1351 if (i->err != NULL)
1352 gfc_status (" ERR=%d", i->err->value);
1353 break;
1355 case EXEC_IOLENGTH:
1356 gfc_status ("IOLENGTH ");
1357 gfc_show_expr (c->expr);
1358 break;
1360 case EXEC_READ:
1361 gfc_status ("READ");
1362 goto show_dt;
1364 case EXEC_WRITE:
1365 gfc_status ("WRITE");
1367 show_dt:
1368 dt = c->ext.dt;
1369 if (dt->io_unit)
1371 gfc_status (" UNIT=");
1372 gfc_show_expr (dt->io_unit);
1375 if (dt->format_expr)
1377 gfc_status (" FMT=");
1378 gfc_show_expr (dt->format_expr);
1381 if (dt->format_label != NULL)
1382 gfc_status (" FMT=%d", dt->format_label->value);
1383 if (dt->namelist)
1384 gfc_status (" NML=%s", dt->namelist->name);
1386 if (dt->iomsg)
1388 gfc_status (" IOMSG=");
1389 gfc_show_expr (dt->iomsg);
1391 if (dt->iostat)
1393 gfc_status (" IOSTAT=");
1394 gfc_show_expr (dt->iostat);
1396 if (dt->size)
1398 gfc_status (" SIZE=");
1399 gfc_show_expr (dt->size);
1401 if (dt->rec)
1403 gfc_status (" REC=");
1404 gfc_show_expr (dt->rec);
1406 if (dt->advance)
1408 gfc_status (" ADVANCE=");
1409 gfc_show_expr (dt->advance);
1412 break;
1414 case EXEC_TRANSFER:
1415 gfc_status ("TRANSFER ");
1416 gfc_show_expr (c->expr);
1417 break;
1419 case EXEC_DT_END:
1420 gfc_status ("DT_END");
1421 dt = c->ext.dt;
1423 if (dt->err != NULL)
1424 gfc_status (" ERR=%d", dt->err->value);
1425 if (dt->end != NULL)
1426 gfc_status (" END=%d", dt->end->value);
1427 if (dt->eor != NULL)
1428 gfc_status (" EOR=%d", dt->eor->value);
1429 break;
1431 default:
1432 gfc_internal_error ("gfc_show_code_node(): Bad statement code");
1435 gfc_status_char ('\n');
1439 /* Show and equivalence chain. */
1441 static void
1442 gfc_show_equiv (gfc_equiv *eq)
1444 show_indent ();
1445 gfc_status ("Equivalence: ");
1446 while (eq)
1448 gfc_show_expr (eq->expr);
1449 eq = eq->eq;
1450 if (eq)
1451 gfc_status (", ");
1456 /* Show a freakin' whole namespace. */
1458 void
1459 gfc_show_namespace (gfc_namespace * ns)
1461 gfc_interface *intr;
1462 gfc_namespace *save;
1463 gfc_intrinsic_op op;
1464 gfc_equiv *eq;
1465 int i;
1467 save = gfc_current_ns;
1468 show_level++;
1470 show_indent ();
1471 gfc_status ("Namespace:");
1473 if (ns != NULL)
1475 i = 0;
1478 int l = i;
1479 while (i < GFC_LETTERS - 1
1480 && gfc_compare_types(&ns->default_type[i+1],
1481 &ns->default_type[l]))
1482 i++;
1484 if (i > l)
1485 gfc_status(" %c-%c: ", l+'A', i+'A');
1486 else
1487 gfc_status(" %c: ", l+'A');
1489 gfc_show_typespec(&ns->default_type[l]);
1490 i++;
1491 } while (i < GFC_LETTERS);
1493 if (ns->proc_name != NULL)
1495 show_indent ();
1496 gfc_status ("procedure name = %s", ns->proc_name->name);
1499 gfc_current_ns = ns;
1500 gfc_traverse_symtree (ns->common_root, show_common);
1502 gfc_traverse_symtree (ns->sym_root, show_symtree);
1504 for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
1506 /* User operator interfaces */
1507 intr = ns->operator[op];
1508 if (intr == NULL)
1509 continue;
1511 show_indent ();
1512 gfc_status ("Operator interfaces for %s:", gfc_op2string (op));
1514 for (; intr; intr = intr->next)
1515 gfc_status (" %s", intr->sym->name);
1518 if (ns->uop_root != NULL)
1520 show_indent ();
1521 gfc_status ("User operators:\n");
1522 gfc_traverse_user_op (ns, show_uop);
1526 for (eq = ns->equiv; eq; eq = eq->next)
1527 gfc_show_equiv (eq);
1529 gfc_status_char ('\n');
1530 gfc_status_char ('\n');
1532 gfc_show_code (0, ns->code);
1534 for (ns = ns->contained; ns; ns = ns->sibling)
1536 show_indent ();
1537 gfc_status ("CONTAINS\n");
1538 gfc_show_namespace (ns);
1541 show_level--;
1542 gfc_status_char ('\n');
1543 gfc_current_ns = save;