1 /* Parse tree dumper
2    Copyright (C) 2003-2013 Free Software Foundation, Inc.
3    Contributed by Steven Bosscher
4 
5 This file is part of GCC.
6 
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 3, or (at your option) any later
10 version.
11 
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.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 
22 /* Actually this is just a collection of routines that used to be
23    scattered around the sources.  Now that they are all in a single
24    file, almost all of them can be static, and the other files don't
25    have this mess in them.
26 
27    As a nice side-effect, this file can act as documentation of the
28    gfc_code and gfc_expr structures and all their friends and
29    relatives.
30 
31    TODO: Dump DATA.  */
32 
33 #include "config.h"
34 #include "system.h"
35 #include "coretypes.h"
36 #include "gfortran.h"
37 #include "constructor.h"
38 
39 /* Keep track of indentation for symbol tree dumps.  */
40 static int show_level = 0;
41 
42 /* The file handle we're dumping to is kept in a static variable.  This
43    is not too cool, but it avoids a lot of passing it around.  */
44 static FILE *dumpfile;
45 
46 /* Forward declaration of some of the functions.  */
47 static void show_expr (gfc_expr *p);
48 static void show_code_node (int, gfc_code *);
49 static void show_namespace (gfc_namespace *ns);
50 
51 
52 /* Allow dumping of an expression in the debugger.  */
53 void gfc_debug_expr (gfc_expr *);
54 
55 void
gfc_debug_expr(gfc_expr * e)56 gfc_debug_expr (gfc_expr *e)
57 {
58   FILE *tmp = dumpfile;
59   dumpfile = stderr;
60   show_expr (e);
61   fputc ('\n', dumpfile);
62   dumpfile = tmp;
63 }
64 
65 
66 /* Do indentation for a specific level.  */
67 
68 static inline void
code_indent(int level,gfc_st_label * label)69 code_indent (int level, gfc_st_label *label)
70 {
71   int i;
72 
73   if (label != NULL)
74     fprintf (dumpfile, "%-5d ", label->value);
75 
76   for (i = 0; i < (2 * level - (label ? 6 : 0)); i++)
77     fputc (' ', dumpfile);
78 }
79 
80 
81 /* Simple indentation at the current level.  This one
82    is used to show symbols.  */
83 
84 static inline void
show_indent(void)85 show_indent (void)
86 {
87   fputc ('\n', dumpfile);
88   code_indent (show_level, NULL);
89 }
90 
91 
92 /* Show type-specific information.  */
93 
94 static void
show_typespec(gfc_typespec * ts)95 show_typespec (gfc_typespec *ts)
96 {
97   if (ts->type == BT_ASSUMED)
98     {
99       fputs ("(TYPE(*))", dumpfile);
100       return;
101     }
102 
103   fprintf (dumpfile, "(%s ", gfc_basic_typename (ts->type));
104 
105   switch (ts->type)
106     {
107     case BT_DERIVED:
108     case BT_CLASS:
109       fprintf (dumpfile, "%s", ts->u.derived->name);
110       break;
111 
112     case BT_CHARACTER:
113       if (ts->u.cl)
114 	show_expr (ts->u.cl->length);
115       fprintf(dumpfile, " %d", ts->kind);
116       break;
117 
118     default:
119       fprintf (dumpfile, "%d", ts->kind);
120       break;
121     }
122 
123   fputc (')', dumpfile);
124 }
125 
126 
127 /* Show an actual argument list.  */
128 
129 static void
show_actual_arglist(gfc_actual_arglist * a)130 show_actual_arglist (gfc_actual_arglist *a)
131 {
132   fputc ('(', dumpfile);
133 
134   for (; a; a = a->next)
135     {
136       fputc ('(', dumpfile);
137       if (a->name != NULL)
138 	fprintf (dumpfile, "%s = ", a->name);
139       if (a->expr != NULL)
140 	show_expr (a->expr);
141       else
142 	fputs ("(arg not-present)", dumpfile);
143 
144       fputc (')', dumpfile);
145       if (a->next != NULL)
146 	fputc (' ', dumpfile);
147     }
148 
149   fputc (')', dumpfile);
150 }
151 
152 
153 /* Show a gfc_array_spec array specification structure.  */
154 
155 static void
show_array_spec(gfc_array_spec * as)156 show_array_spec (gfc_array_spec *as)
157 {
158   const char *c;
159   int i;
160 
161   if (as == NULL)
162     {
163       fputs ("()", dumpfile);
164       return;
165     }
166 
167   fprintf (dumpfile, "(%d [%d]", as->rank, as->corank);
168 
169   if (as->rank + as->corank > 0 || as->rank == -1)
170     {
171       switch (as->type)
172       {
173 	case AS_EXPLICIT:      c = "AS_EXPLICIT";      break;
174 	case AS_DEFERRED:      c = "AS_DEFERRED";      break;
175 	case AS_ASSUMED_SIZE:  c = "AS_ASSUMED_SIZE";  break;
176 	case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
177 	case AS_ASSUMED_RANK:  c = "AS_ASSUMED_RANK";  break;
178 	default:
179 	  gfc_internal_error ("show_array_spec(): Unhandled array shape "
180 			      "type.");
181       }
182       fprintf (dumpfile, " %s ", c);
183 
184       for (i = 0; i < as->rank + as->corank; i++)
185 	{
186 	  show_expr (as->lower[i]);
187 	  fputc (' ', dumpfile);
188 	  show_expr (as->upper[i]);
189 	  fputc (' ', dumpfile);
190 	}
191     }
192 
193   fputc (')', dumpfile);
194 }
195 
196 
197 /* Show a gfc_array_ref array reference structure.  */
198 
199 static void
show_array_ref(gfc_array_ref * ar)200 show_array_ref (gfc_array_ref * ar)
201 {
202   int i;
203 
204   fputc ('(', dumpfile);
205 
206   switch (ar->type)
207     {
208     case AR_FULL:
209       fputs ("FULL", dumpfile);
210       break;
211 
212     case AR_SECTION:
213       for (i = 0; i < ar->dimen; i++)
214 	{
215 	  /* There are two types of array sections: either the
216 	     elements are identified by an integer array ('vector'),
217 	     or by an index range. In the former case we only have to
218 	     print the start expression which contains the vector, in
219 	     the latter case we have to print any of lower and upper
220 	     bound and the stride, if they're present.  */
221 
222 	  if (ar->start[i] != NULL)
223 	    show_expr (ar->start[i]);
224 
225 	  if (ar->dimen_type[i] == DIMEN_RANGE)
226 	    {
227 	      fputc (':', dumpfile);
228 
229 	      if (ar->end[i] != NULL)
230 		show_expr (ar->end[i]);
231 
232 	      if (ar->stride[i] != NULL)
233 		{
234 		  fputc (':', dumpfile);
235 		  show_expr (ar->stride[i]);
236 		}
237 	    }
238 
239 	  if (i != ar->dimen - 1)
240 	    fputs (" , ", dumpfile);
241 	}
242       break;
243 
244     case AR_ELEMENT:
245       for (i = 0; i < ar->dimen; i++)
246 	{
247 	  show_expr (ar->start[i]);
248 	  if (i != ar->dimen - 1)
249 	    fputs (" , ", dumpfile);
250 	}
251       break;
252 
253     case AR_UNKNOWN:
254       fputs ("UNKNOWN", dumpfile);
255       break;
256 
257     default:
258       gfc_internal_error ("show_array_ref(): Unknown array reference");
259     }
260 
261   fputc (')', dumpfile);
262 }
263 
264 
265 /* Show a list of gfc_ref structures.  */
266 
267 static void
show_ref(gfc_ref * p)268 show_ref (gfc_ref *p)
269 {
270   for (; p; p = p->next)
271     switch (p->type)
272       {
273       case REF_ARRAY:
274 	show_array_ref (&p->u.ar);
275 	break;
276 
277       case REF_COMPONENT:
278 	fprintf (dumpfile, " %% %s", p->u.c.component->name);
279 	break;
280 
281       case REF_SUBSTRING:
282 	fputc ('(', dumpfile);
283 	show_expr (p->u.ss.start);
284 	fputc (':', dumpfile);
285 	show_expr (p->u.ss.end);
286 	fputc (')', dumpfile);
287 	break;
288 
289       default:
290 	gfc_internal_error ("show_ref(): Bad component code");
291       }
292 }
293 
294 
295 /* Display a constructor.  Works recursively for array constructors.  */
296 
297 static void
show_constructor(gfc_constructor_base base)298 show_constructor (gfc_constructor_base base)
299 {
300   gfc_constructor *c;
301   for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
302     {
303       if (c->iterator == NULL)
304 	show_expr (c->expr);
305       else
306 	{
307 	  fputc ('(', dumpfile);
308 	  show_expr (c->expr);
309 
310 	  fputc (' ', dumpfile);
311 	  show_expr (c->iterator->var);
312 	  fputc ('=', dumpfile);
313 	  show_expr (c->iterator->start);
314 	  fputc (',', dumpfile);
315 	  show_expr (c->iterator->end);
316 	  fputc (',', dumpfile);
317 	  show_expr (c->iterator->step);
318 
319 	  fputc (')', dumpfile);
320 	}
321 
322       if (gfc_constructor_next (c) != NULL)
323 	fputs (" , ", dumpfile);
324     }
325 }
326 
327 
328 static void
show_char_const(const gfc_char_t * c,int length)329 show_char_const (const gfc_char_t *c, int length)
330 {
331   int i;
332 
333   fputc ('\'', dumpfile);
334   for (i = 0; i < length; i++)
335     {
336       if (c[i] == '\'')
337 	fputs ("''", dumpfile);
338       else
339 	fputs (gfc_print_wide_char (c[i]), dumpfile);
340     }
341   fputc ('\'', dumpfile);
342 }
343 
344 
345 /* Show a component-call expression.  */
346 
347 static void
show_compcall(gfc_expr * p)348 show_compcall (gfc_expr* p)
349 {
350   gcc_assert (p->expr_type == EXPR_COMPCALL);
351 
352   fprintf (dumpfile, "%s", p->symtree->n.sym->name);
353   show_ref (p->ref);
354   fprintf (dumpfile, "%s", p->value.compcall.name);
355 
356   show_actual_arglist (p->value.compcall.actual);
357 }
358 
359 
360 /* Show an expression.  */
361 
362 static void
show_expr(gfc_expr * p)363 show_expr (gfc_expr *p)
364 {
365   const char *c;
366   int i;
367 
368   if (p == NULL)
369     {
370       fputs ("()", dumpfile);
371       return;
372     }
373 
374   switch (p->expr_type)
375     {
376     case EXPR_SUBSTRING:
377       show_char_const (p->value.character.string, p->value.character.length);
378       show_ref (p->ref);
379       break;
380 
381     case EXPR_STRUCTURE:
382       fprintf (dumpfile, "%s(", p->ts.u.derived->name);
383       show_constructor (p->value.constructor);
384       fputc (')', dumpfile);
385       break;
386 
387     case EXPR_ARRAY:
388       fputs ("(/ ", dumpfile);
389       show_constructor (p->value.constructor);
390       fputs (" /)", dumpfile);
391 
392       show_ref (p->ref);
393       break;
394 
395     case EXPR_NULL:
396       fputs ("NULL()", dumpfile);
397       break;
398 
399     case EXPR_CONSTANT:
400       switch (p->ts.type)
401 	{
402 	case BT_INTEGER:
403 	  mpz_out_str (stdout, 10, p->value.integer);
404 
405 	  if (p->ts.kind != gfc_default_integer_kind)
406 	    fprintf (dumpfile, "_%d", p->ts.kind);
407 	  break;
408 
409 	case BT_LOGICAL:
410 	  if (p->value.logical)
411 	    fputs (".true.", dumpfile);
412 	  else
413 	    fputs (".false.", dumpfile);
414 	  break;
415 
416 	case BT_REAL:
417 	  mpfr_out_str (stdout, 10, 0, p->value.real, GFC_RND_MODE);
418 	  if (p->ts.kind != gfc_default_real_kind)
419 	    fprintf (dumpfile, "_%d", p->ts.kind);
420 	  break;
421 
422 	case BT_CHARACTER:
423 	  show_char_const (p->value.character.string,
424 			   p->value.character.length);
425 	  break;
426 
427 	case BT_COMPLEX:
428 	  fputs ("(complex ", dumpfile);
429 
430 	  mpfr_out_str (stdout, 10, 0, mpc_realref (p->value.complex),
431 			GFC_RND_MODE);
432 	  if (p->ts.kind != gfc_default_complex_kind)
433 	    fprintf (dumpfile, "_%d", p->ts.kind);
434 
435 	  fputc (' ', dumpfile);
436 
437 	  mpfr_out_str (stdout, 10, 0, mpc_imagref (p->value.complex),
438 			GFC_RND_MODE);
439 	  if (p->ts.kind != gfc_default_complex_kind)
440 	    fprintf (dumpfile, "_%d", p->ts.kind);
441 
442 	  fputc (')', dumpfile);
443 	  break;
444 
445 	case BT_HOLLERITH:
446 	  fprintf (dumpfile, "%dH", p->representation.length);
447 	  c = p->representation.string;
448 	  for (i = 0; i < p->representation.length; i++, c++)
449 	    {
450 	      fputc (*c, dumpfile);
451 	    }
452 	  break;
453 
454 	default:
455 	  fputs ("???", dumpfile);
456 	  break;
457 	}
458 
459       if (p->representation.string)
460 	{
461 	  fputs (" {", dumpfile);
462 	  c = p->representation.string;
463 	  for (i = 0; i < p->representation.length; i++, c++)
464 	    {
465 	      fprintf (dumpfile, "%.2x", (unsigned int) *c);
466 	      if (i < p->representation.length - 1)
467 		fputc (',', dumpfile);
468 	    }
469 	  fputc ('}', dumpfile);
470 	}
471 
472       break;
473 
474     case EXPR_VARIABLE:
475       if (p->symtree->n.sym->ns && p->symtree->n.sym->ns->proc_name)
476 	fprintf (dumpfile, "%s:", p->symtree->n.sym->ns->proc_name->name);
477       fprintf (dumpfile, "%s", p->symtree->n.sym->name);
478       show_ref (p->ref);
479       break;
480 
481     case EXPR_OP:
482       fputc ('(', dumpfile);
483       switch (p->value.op.op)
484 	{
485 	case INTRINSIC_UPLUS:
486 	  fputs ("U+ ", dumpfile);
487 	  break;
488 	case INTRINSIC_UMINUS:
489 	  fputs ("U- ", dumpfile);
490 	  break;
491 	case INTRINSIC_PLUS:
492 	  fputs ("+ ", dumpfile);
493 	  break;
494 	case INTRINSIC_MINUS:
495 	  fputs ("- ", dumpfile);
496 	  break;
497 	case INTRINSIC_TIMES:
498 	  fputs ("* ", dumpfile);
499 	  break;
500 	case INTRINSIC_DIVIDE:
501 	  fputs ("/ ", dumpfile);
502 	  break;
503 	case INTRINSIC_POWER:
504 	  fputs ("** ", dumpfile);
505 	  break;
506 	case INTRINSIC_CONCAT:
507 	  fputs ("// ", dumpfile);
508 	  break;
509 	case INTRINSIC_AND:
510 	  fputs ("AND ", dumpfile);
511 	  break;
512 	case INTRINSIC_OR:
513 	  fputs ("OR ", dumpfile);
514 	  break;
515 	case INTRINSIC_EQV:
516 	  fputs ("EQV ", dumpfile);
517 	  break;
518 	case INTRINSIC_NEQV:
519 	  fputs ("NEQV ", dumpfile);
520 	  break;
521 	case INTRINSIC_EQ:
522 	case INTRINSIC_EQ_OS:
523 	  fputs ("= ", dumpfile);
524 	  break;
525 	case INTRINSIC_NE:
526 	case INTRINSIC_NE_OS:
527 	  fputs ("/= ", dumpfile);
528 	  break;
529 	case INTRINSIC_GT:
530 	case INTRINSIC_GT_OS:
531 	  fputs ("> ", dumpfile);
532 	  break;
533 	case INTRINSIC_GE:
534 	case INTRINSIC_GE_OS:
535 	  fputs (">= ", dumpfile);
536 	  break;
537 	case INTRINSIC_LT:
538 	case INTRINSIC_LT_OS:
539 	  fputs ("< ", dumpfile);
540 	  break;
541 	case INTRINSIC_LE:
542 	case INTRINSIC_LE_OS:
543 	  fputs ("<= ", dumpfile);
544 	  break;
545 	case INTRINSIC_NOT:
546 	  fputs ("NOT ", dumpfile);
547 	  break;
548 	case INTRINSIC_PARENTHESES:
549 	  fputs ("parens ", dumpfile);
550 	  break;
551 
552 	default:
553 	  gfc_internal_error
554 	    ("show_expr(): Bad intrinsic in expression!");
555 	}
556 
557       show_expr (p->value.op.op1);
558 
559       if (p->value.op.op2)
560 	{
561 	  fputc (' ', dumpfile);
562 	  show_expr (p->value.op.op2);
563 	}
564 
565       fputc (')', dumpfile);
566       break;
567 
568     case EXPR_FUNCTION:
569       if (p->value.function.name == NULL)
570 	{
571 	  fprintf (dumpfile, "%s", p->symtree->n.sym->name);
572 	  if (gfc_is_proc_ptr_comp (p))
573 	    show_ref (p->ref);
574 	  fputc ('[', dumpfile);
575 	  show_actual_arglist (p->value.function.actual);
576 	  fputc (']', dumpfile);
577 	}
578       else
579 	{
580 	  fprintf (dumpfile, "%s", p->value.function.name);
581 	  if (gfc_is_proc_ptr_comp (p))
582 	    show_ref (p->ref);
583 	  fputc ('[', dumpfile);
584 	  fputc ('[', dumpfile);
585 	  show_actual_arglist (p->value.function.actual);
586 	  fputc (']', dumpfile);
587 	  fputc (']', dumpfile);
588 	}
589 
590       break;
591 
592     case EXPR_COMPCALL:
593       show_compcall (p);
594       break;
595 
596     default:
597       gfc_internal_error ("show_expr(): Don't know how to show expr");
598     }
599 }
600 
601 /* Show symbol attributes.  The flavor and intent are followed by
602    whatever single bit attributes are present.  */
603 
604 static void
show_attr(symbol_attribute * attr,const char * module)605 show_attr (symbol_attribute *attr, const char * module)
606 {
607   if (attr->flavor != FL_UNKNOWN)
608     fprintf (dumpfile, "(%s ", gfc_code2string (flavors, attr->flavor));
609   if (attr->access != ACCESS_UNKNOWN)
610     fprintf (dumpfile, "%s ", gfc_code2string (access_types, attr->access));
611   if (attr->proc != PROC_UNKNOWN)
612     fprintf (dumpfile, "%s ", gfc_code2string (procedures, attr->proc));
613   if (attr->save != SAVE_NONE)
614     fprintf (dumpfile, "%s", gfc_code2string (save_status, attr->save));
615 
616   if (attr->artificial)
617     fputs (" ARTIFICIAL", dumpfile);
618   if (attr->allocatable)
619     fputs (" ALLOCATABLE", dumpfile);
620   if (attr->asynchronous)
621     fputs (" ASYNCHRONOUS", dumpfile);
622   if (attr->codimension)
623     fputs (" CODIMENSION", dumpfile);
624   if (attr->dimension)
625     fputs (" DIMENSION", dumpfile);
626   if (attr->contiguous)
627     fputs (" CONTIGUOUS", dumpfile);
628   if (attr->external)
629     fputs (" EXTERNAL", dumpfile);
630   if (attr->intrinsic)
631     fputs (" INTRINSIC", dumpfile);
632   if (attr->optional)
633     fputs (" OPTIONAL", dumpfile);
634   if (attr->pointer)
635     fputs (" POINTER", dumpfile);
636   if (attr->is_protected)
637     fputs (" PROTECTED", dumpfile);
638   if (attr->value)
639     fputs (" VALUE", dumpfile);
640   if (attr->volatile_)
641     fputs (" VOLATILE", dumpfile);
642   if (attr->threadprivate)
643     fputs (" THREADPRIVATE", dumpfile);
644   if (attr->target)
645     fputs (" TARGET", dumpfile);
646   if (attr->dummy)
647     {
648       fputs (" DUMMY", dumpfile);
649       if (attr->intent != INTENT_UNKNOWN)
650 	fprintf (dumpfile, "(%s)", gfc_intent_string (attr->intent));
651     }
652 
653   if (attr->result)
654     fputs (" RESULT", dumpfile);
655   if (attr->entry)
656     fputs (" ENTRY", dumpfile);
657   if (attr->is_bind_c)
658     fputs (" BIND(C)", dumpfile);
659 
660   if (attr->data)
661     fputs (" DATA", dumpfile);
662   if (attr->use_assoc)
663     {
664       fputs (" USE-ASSOC", dumpfile);
665       if (module != NULL)
666 	fprintf (dumpfile, "(%s)", module);
667     }
668 
669   if (attr->in_namelist)
670     fputs (" IN-NAMELIST", dumpfile);
671   if (attr->in_common)
672     fputs (" IN-COMMON", dumpfile);
673 
674   if (attr->abstract)
675     fputs (" ABSTRACT", dumpfile);
676   if (attr->function)
677     fputs (" FUNCTION", dumpfile);
678   if (attr->subroutine)
679     fputs (" SUBROUTINE", dumpfile);
680   if (attr->implicit_type)
681     fputs (" IMPLICIT-TYPE", dumpfile);
682 
683   if (attr->sequence)
684     fputs (" SEQUENCE", dumpfile);
685   if (attr->elemental)
686     fputs (" ELEMENTAL", dumpfile);
687   if (attr->pure)
688     fputs (" PURE", dumpfile);
689   if (attr->recursive)
690     fputs (" RECURSIVE", dumpfile);
691 
692   fputc (')', dumpfile);
693 }
694 
695 
696 /* Show components of a derived type.  */
697 
698 static void
show_components(gfc_symbol * sym)699 show_components (gfc_symbol *sym)
700 {
701   gfc_component *c;
702 
703   for (c = sym->components; c; c = c->next)
704     {
705       fprintf (dumpfile, "(%s ", c->name);
706       show_typespec (&c->ts);
707       if (c->attr.allocatable)
708 	fputs (" ALLOCATABLE", dumpfile);
709       if (c->attr.pointer)
710 	fputs (" POINTER", dumpfile);
711       if (c->attr.proc_pointer)
712 	fputs (" PPC", dumpfile);
713       if (c->attr.dimension)
714 	fputs (" DIMENSION", dumpfile);
715       fputc (' ', dumpfile);
716       show_array_spec (c->as);
717       if (c->attr.access)
718 	fprintf (dumpfile, " %s", gfc_code2string (access_types, c->attr.access));
719       fputc (')', dumpfile);
720       if (c->next != NULL)
721 	fputc (' ', dumpfile);
722     }
723 }
724 
725 
726 /* Show the f2k_derived namespace with procedure bindings.  */
727 
728 static void
show_typebound_proc(gfc_typebound_proc * tb,const char * name)729 show_typebound_proc (gfc_typebound_proc* tb, const char* name)
730 {
731   show_indent ();
732 
733   if (tb->is_generic)
734     fputs ("GENERIC", dumpfile);
735   else
736     {
737       fputs ("PROCEDURE, ", dumpfile);
738       if (tb->nopass)
739 	fputs ("NOPASS", dumpfile);
740       else
741 	{
742 	  if (tb->pass_arg)
743 	    fprintf (dumpfile, "PASS(%s)", tb->pass_arg);
744 	  else
745 	    fputs ("PASS", dumpfile);
746 	}
747       if (tb->non_overridable)
748 	fputs (", NON_OVERRIDABLE", dumpfile);
749     }
750 
751   if (tb->access == ACCESS_PUBLIC)
752     fputs (", PUBLIC", dumpfile);
753   else
754     fputs (", PRIVATE", dumpfile);
755 
756   fprintf (dumpfile, " :: %s => ", name);
757 
758   if (tb->is_generic)
759     {
760       gfc_tbp_generic* g;
761       for (g = tb->u.generic; g; g = g->next)
762 	{
763 	  fputs (g->specific_st->name, dumpfile);
764 	  if (g->next)
765 	    fputs (", ", dumpfile);
766 	}
767     }
768   else
769     fputs (tb->u.specific->n.sym->name, dumpfile);
770 }
771 
772 static void
show_typebound_symtree(gfc_symtree * st)773 show_typebound_symtree (gfc_symtree* st)
774 {
775   gcc_assert (st->n.tb);
776   show_typebound_proc (st->n.tb, st->name);
777 }
778 
779 static void
show_f2k_derived(gfc_namespace * f2k)780 show_f2k_derived (gfc_namespace* f2k)
781 {
782   gfc_finalizer* f;
783   int op;
784 
785   show_indent ();
786   fputs ("Procedure bindings:", dumpfile);
787   ++show_level;
788 
789   /* Finalizer bindings.  */
790   for (f = f2k->finalizers; f; f = f->next)
791     {
792       show_indent ();
793       fprintf (dumpfile, "FINAL %s", f->proc_tree->n.sym->name);
794     }
795 
796   /* Type-bound procedures.  */
797   gfc_traverse_symtree (f2k->tb_sym_root, &show_typebound_symtree);
798 
799   --show_level;
800 
801   show_indent ();
802   fputs ("Operator bindings:", dumpfile);
803   ++show_level;
804 
805   /* User-defined operators.  */
806   gfc_traverse_symtree (f2k->tb_uop_root, &show_typebound_symtree);
807 
808   /* Intrinsic operators.  */
809   for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
810     if (f2k->tb_op[op])
811       show_typebound_proc (f2k->tb_op[op],
812 			   gfc_op2string ((gfc_intrinsic_op) op));
813 
814   --show_level;
815 }
816 
817 
818 /* Show a symbol.  If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
819    show the interface.  Information needed to reconstruct the list of
820    specific interfaces associated with a generic symbol is done within
821    that symbol.  */
822 
823 static void
show_symbol(gfc_symbol * sym)824 show_symbol (gfc_symbol *sym)
825 {
826   gfc_formal_arglist *formal;
827   gfc_interface *intr;
828   int i,len;
829 
830   if (sym == NULL)
831     return;
832 
833   fprintf (dumpfile, "|| symbol: '%s' ", sym->name);
834   len = strlen (sym->name);
835   for (i=len; i<12; i++)
836     fputc(' ', dumpfile);
837 
838   ++show_level;
839 
840   show_indent ();
841   fputs ("type spec : ", dumpfile);
842   show_typespec (&sym->ts);
843 
844   show_indent ();
845   fputs ("attributes: ", dumpfile);
846   show_attr (&sym->attr, sym->module);
847 
848   if (sym->value)
849     {
850       show_indent ();
851       fputs ("value: ", dumpfile);
852       show_expr (sym->value);
853     }
854 
855   if (sym->as)
856     {
857       show_indent ();
858       fputs ("Array spec:", dumpfile);
859       show_array_spec (sym->as);
860     }
861 
862   if (sym->generic)
863     {
864       show_indent ();
865       fputs ("Generic interfaces:", dumpfile);
866       for (intr = sym->generic; intr; intr = intr->next)
867 	fprintf (dumpfile, " %s", intr->sym->name);
868     }
869 
870   if (sym->result)
871     {
872       show_indent ();
873       fprintf (dumpfile, "result: %s", sym->result->name);
874     }
875 
876   if (sym->components)
877     {
878       show_indent ();
879       fputs ("components: ", dumpfile);
880       show_components (sym);
881     }
882 
883   if (sym->f2k_derived)
884     {
885       show_indent ();
886       if (sym->hash_value)
887 	fprintf (dumpfile, "hash: %d", sym->hash_value);
888       show_f2k_derived (sym->f2k_derived);
889     }
890 
891   if (sym->formal)
892     {
893       show_indent ();
894       fputs ("Formal arglist:", dumpfile);
895 
896       for (formal = sym->formal; formal; formal = formal->next)
897 	{
898 	  if (formal->sym != NULL)
899 	    fprintf (dumpfile, " %s", formal->sym->name);
900 	  else
901 	    fputs (" [Alt Return]", dumpfile);
902 	}
903     }
904 
905   if (sym->formal_ns && (sym->formal_ns->proc_name != sym)
906       && sym->attr.proc != PROC_ST_FUNCTION
907       && !sym->attr.entry)
908     {
909       show_indent ();
910       fputs ("Formal namespace", dumpfile);
911       show_namespace (sym->formal_ns);
912     }
913   --show_level;
914 }
915 
916 
917 /* Show a user-defined operator.  Just prints an operator
918    and the name of the associated subroutine, really.  */
919 
920 static void
show_uop(gfc_user_op * uop)921 show_uop (gfc_user_op *uop)
922 {
923   gfc_interface *intr;
924 
925   show_indent ();
926   fprintf (dumpfile, "%s:", uop->name);
927 
928   for (intr = uop->op; intr; intr = intr->next)
929     fprintf (dumpfile, " %s", intr->sym->name);
930 }
931 
932 
933 /* Workhorse function for traversing the user operator symtree.  */
934 
935 static void
traverse_uop(gfc_symtree * st,void (* func)(gfc_user_op *))936 traverse_uop (gfc_symtree *st, void (*func) (gfc_user_op *))
937 {
938   if (st == NULL)
939     return;
940 
941   (*func) (st->n.uop);
942 
943   traverse_uop (st->left, func);
944   traverse_uop (st->right, func);
945 }
946 
947 
948 /* Traverse the tree of user operator nodes.  */
949 
950 void
gfc_traverse_user_op(gfc_namespace * ns,void (* func)(gfc_user_op *))951 gfc_traverse_user_op (gfc_namespace *ns, void (*func) (gfc_user_op *))
952 {
953   traverse_uop (ns->uop_root, func);
954 }
955 
956 
957 /* Function to display a common block.  */
958 
959 static void
show_common(gfc_symtree * st)960 show_common (gfc_symtree *st)
961 {
962   gfc_symbol *s;
963 
964   show_indent ();
965   fprintf (dumpfile, "common: /%s/ ", st->name);
966 
967   s = st->n.common->head;
968   while (s)
969     {
970       fprintf (dumpfile, "%s", s->name);
971       s = s->common_next;
972       if (s)
973 	fputs (", ", dumpfile);
974     }
975   fputc ('\n', dumpfile);
976 }
977 
978 
979 /* Worker function to display the symbol tree.  */
980 
981 static void
show_symtree(gfc_symtree * st)982 show_symtree (gfc_symtree *st)
983 {
984   int len, i;
985 
986   show_indent ();
987 
988   len = strlen(st->name);
989   fprintf (dumpfile, "symtree: '%s'", st->name);
990 
991   for (i=len; i<12; i++)
992     fputc(' ', dumpfile);
993 
994   if (st->ambiguous)
995     fputs( " Ambiguous", dumpfile);
996 
997   if (st->n.sym->ns != gfc_current_ns)
998     fprintf (dumpfile, "|| symbol: '%s' from namespace '%s'", st->n.sym->name,
999 	     st->n.sym->ns->proc_name->name);
1000   else
1001     show_symbol (st->n.sym);
1002 }
1003 
1004 
1005 /******************* Show gfc_code structures **************/
1006 
1007 
1008 /* Show a list of code structures.  Mutually recursive with
1009    show_code_node().  */
1010 
1011 static void
show_code(int level,gfc_code * c)1012 show_code (int level, gfc_code *c)
1013 {
1014   for (; c; c = c->next)
1015     show_code_node (level, c);
1016 }
1017 
1018 static void
show_namelist(gfc_namelist * n)1019 show_namelist (gfc_namelist *n)
1020 {
1021   for (; n->next; n = n->next)
1022     fprintf (dumpfile, "%s,", n->sym->name);
1023   fprintf (dumpfile, "%s", n->sym->name);
1024 }
1025 
1026 /* Show a single OpenMP directive node and everything underneath it
1027    if necessary.  */
1028 
1029 static void
show_omp_node(int level,gfc_code * c)1030 show_omp_node (int level, gfc_code *c)
1031 {
1032   gfc_omp_clauses *omp_clauses = NULL;
1033   const char *name = NULL;
1034 
1035   switch (c->op)
1036     {
1037     case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
1038     case EXEC_OMP_BARRIER: name = "BARRIER"; break;
1039     case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
1040     case EXEC_OMP_FLUSH: name = "FLUSH"; break;
1041     case EXEC_OMP_DO: name = "DO"; break;
1042     case EXEC_OMP_MASTER: name = "MASTER"; break;
1043     case EXEC_OMP_ORDERED: name = "ORDERED"; break;
1044     case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
1045     case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
1046     case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
1047     case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
1048     case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
1049     case EXEC_OMP_SINGLE: name = "SINGLE"; break;
1050     case EXEC_OMP_TASK: name = "TASK"; break;
1051     case EXEC_OMP_TASKWAIT: name = "TASKWAIT"; break;
1052     case EXEC_OMP_TASKYIELD: name = "TASKYIELD"; break;
1053     case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
1054     default:
1055       gcc_unreachable ();
1056     }
1057   fprintf (dumpfile, "!$OMP %s", name);
1058   switch (c->op)
1059     {
1060     case EXEC_OMP_DO:
1061     case EXEC_OMP_PARALLEL:
1062     case EXEC_OMP_PARALLEL_DO:
1063     case EXEC_OMP_PARALLEL_SECTIONS:
1064     case EXEC_OMP_SECTIONS:
1065     case EXEC_OMP_SINGLE:
1066     case EXEC_OMP_WORKSHARE:
1067     case EXEC_OMP_PARALLEL_WORKSHARE:
1068     case EXEC_OMP_TASK:
1069       omp_clauses = c->ext.omp_clauses;
1070       break;
1071     case EXEC_OMP_CRITICAL:
1072       if (c->ext.omp_name)
1073 	fprintf (dumpfile, " (%s)", c->ext.omp_name);
1074       break;
1075     case EXEC_OMP_FLUSH:
1076       if (c->ext.omp_namelist)
1077 	{
1078 	  fputs (" (", dumpfile);
1079 	  show_namelist (c->ext.omp_namelist);
1080 	  fputc (')', dumpfile);
1081 	}
1082       return;
1083     case EXEC_OMP_BARRIER:
1084     case EXEC_OMP_TASKWAIT:
1085     case EXEC_OMP_TASKYIELD:
1086       return;
1087     default:
1088       break;
1089     }
1090   if (omp_clauses)
1091     {
1092       int list_type;
1093 
1094       if (omp_clauses->if_expr)
1095 	{
1096 	  fputs (" IF(", dumpfile);
1097 	  show_expr (omp_clauses->if_expr);
1098 	  fputc (')', dumpfile);
1099 	}
1100       if (omp_clauses->final_expr)
1101 	{
1102 	  fputs (" FINAL(", dumpfile);
1103 	  show_expr (omp_clauses->final_expr);
1104 	  fputc (')', dumpfile);
1105 	}
1106       if (omp_clauses->num_threads)
1107 	{
1108 	  fputs (" NUM_THREADS(", dumpfile);
1109 	  show_expr (omp_clauses->num_threads);
1110 	  fputc (')', dumpfile);
1111 	}
1112       if (omp_clauses->sched_kind != OMP_SCHED_NONE)
1113 	{
1114 	  const char *type;
1115 	  switch (omp_clauses->sched_kind)
1116 	    {
1117 	    case OMP_SCHED_STATIC: type = "STATIC"; break;
1118 	    case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
1119 	    case OMP_SCHED_GUIDED: type = "GUIDED"; break;
1120 	    case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
1121 	    case OMP_SCHED_AUTO: type = "AUTO"; break;
1122 	    default:
1123 	      gcc_unreachable ();
1124 	    }
1125 	  fprintf (dumpfile, " SCHEDULE (%s", type);
1126 	  if (omp_clauses->chunk_size)
1127 	    {
1128 	      fputc (',', dumpfile);
1129 	      show_expr (omp_clauses->chunk_size);
1130 	    }
1131 	  fputc (')', dumpfile);
1132 	}
1133       if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
1134 	{
1135 	  const char *type;
1136 	  switch (omp_clauses->default_sharing)
1137 	    {
1138 	    case OMP_DEFAULT_NONE: type = "NONE"; break;
1139 	    case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
1140 	    case OMP_DEFAULT_SHARED: type = "SHARED"; break;
1141 	    case OMP_DEFAULT_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1142 	    default:
1143 	      gcc_unreachable ();
1144 	    }
1145 	  fprintf (dumpfile, " DEFAULT(%s)", type);
1146 	}
1147       if (omp_clauses->ordered)
1148 	fputs (" ORDERED", dumpfile);
1149       if (omp_clauses->untied)
1150 	fputs (" UNTIED", dumpfile);
1151       if (omp_clauses->mergeable)
1152 	fputs (" MERGEABLE", dumpfile);
1153       if (omp_clauses->collapse)
1154 	fprintf (dumpfile, " COLLAPSE(%d)", omp_clauses->collapse);
1155       for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
1156 	if (omp_clauses->lists[list_type] != NULL
1157 	    && list_type != OMP_LIST_COPYPRIVATE)
1158 	  {
1159 	    const char *type;
1160 	    if (list_type >= OMP_LIST_REDUCTION_FIRST)
1161 	      {
1162 		switch (list_type)
1163 		  {
1164 		  case OMP_LIST_PLUS: type = "+"; break;
1165 		  case OMP_LIST_MULT: type = "*"; break;
1166 		  case OMP_LIST_SUB: type = "-"; break;
1167 		  case OMP_LIST_AND: type = ".AND."; break;
1168 		  case OMP_LIST_OR: type = ".OR."; break;
1169 		  case OMP_LIST_EQV: type = ".EQV."; break;
1170 		  case OMP_LIST_NEQV: type = ".NEQV."; break;
1171 		  case OMP_LIST_MAX: type = "MAX"; break;
1172 		  case OMP_LIST_MIN: type = "MIN"; break;
1173 		  case OMP_LIST_IAND: type = "IAND"; break;
1174 		  case OMP_LIST_IOR: type = "IOR"; break;
1175 		  case OMP_LIST_IEOR: type = "IEOR"; break;
1176 		  default:
1177 		    gcc_unreachable ();
1178 		  }
1179 		fprintf (dumpfile, " REDUCTION(%s:", type);
1180 	      }
1181 	    else
1182 	      {
1183 		switch (list_type)
1184 		  {
1185 		  case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
1186 		  case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1187 		  case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
1188 		  case OMP_LIST_SHARED: type = "SHARED"; break;
1189 		  case OMP_LIST_COPYIN: type = "COPYIN"; break;
1190 		  default:
1191 		    gcc_unreachable ();
1192 		  }
1193 		fprintf (dumpfile, " %s(", type);
1194 	      }
1195 	    show_namelist (omp_clauses->lists[list_type]);
1196 	    fputc (')', dumpfile);
1197 	  }
1198     }
1199   fputc ('\n', dumpfile);
1200   if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
1201     {
1202       gfc_code *d = c->block;
1203       while (d != NULL)
1204 	{
1205 	  show_code (level + 1, d->next);
1206 	  if (d->block == NULL)
1207 	    break;
1208 	  code_indent (level, 0);
1209 	  fputs ("!$OMP SECTION\n", dumpfile);
1210 	  d = d->block;
1211 	}
1212     }
1213   else
1214     show_code (level + 1, c->block->next);
1215   if (c->op == EXEC_OMP_ATOMIC)
1216     return;
1217   code_indent (level, 0);
1218   fprintf (dumpfile, "!$OMP END %s", name);
1219   if (omp_clauses != NULL)
1220     {
1221       if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
1222 	{
1223 	  fputs (" COPYPRIVATE(", dumpfile);
1224 	  show_namelist (omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
1225 	  fputc (')', dumpfile);
1226 	}
1227       else if (omp_clauses->nowait)
1228 	fputs (" NOWAIT", dumpfile);
1229     }
1230   else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_name)
1231     fprintf (dumpfile, " (%s)", c->ext.omp_name);
1232 }
1233 
1234 
1235 /* Show a single code node and everything underneath it if necessary.  */
1236 
1237 static void
show_code_node(int level,gfc_code * c)1238 show_code_node (int level, gfc_code *c)
1239 {
1240   gfc_forall_iterator *fa;
1241   gfc_open *open;
1242   gfc_case *cp;
1243   gfc_alloc *a;
1244   gfc_code *d;
1245   gfc_close *close;
1246   gfc_filepos *fp;
1247   gfc_inquire *i;
1248   gfc_dt *dt;
1249   gfc_namespace *ns;
1250 
1251   if (c->here)
1252     {
1253       fputc ('\n', dumpfile);
1254       code_indent (level, c->here);
1255     }
1256   else
1257     show_indent ();
1258 
1259   switch (c->op)
1260     {
1261     case EXEC_END_PROCEDURE:
1262       break;
1263 
1264     case EXEC_NOP:
1265       fputs ("NOP", dumpfile);
1266       break;
1267 
1268     case EXEC_CONTINUE:
1269       fputs ("CONTINUE", dumpfile);
1270       break;
1271 
1272     case EXEC_ENTRY:
1273       fprintf (dumpfile, "ENTRY %s", c->ext.entry->sym->name);
1274       break;
1275 
1276     case EXEC_INIT_ASSIGN:
1277     case EXEC_ASSIGN:
1278       fputs ("ASSIGN ", dumpfile);
1279       show_expr (c->expr1);
1280       fputc (' ', dumpfile);
1281       show_expr (c->expr2);
1282       break;
1283 
1284     case EXEC_LABEL_ASSIGN:
1285       fputs ("LABEL ASSIGN ", dumpfile);
1286       show_expr (c->expr1);
1287       fprintf (dumpfile, " %d", c->label1->value);
1288       break;
1289 
1290     case EXEC_POINTER_ASSIGN:
1291       fputs ("POINTER ASSIGN ", dumpfile);
1292       show_expr (c->expr1);
1293       fputc (' ', dumpfile);
1294       show_expr (c->expr2);
1295       break;
1296 
1297     case EXEC_GOTO:
1298       fputs ("GOTO ", dumpfile);
1299       if (c->label1)
1300 	fprintf (dumpfile, "%d", c->label1->value);
1301       else
1302 	{
1303 	  show_expr (c->expr1);
1304 	  d = c->block;
1305 	  if (d != NULL)
1306 	    {
1307 	      fputs (", (", dumpfile);
1308 	      for (; d; d = d ->block)
1309 		{
1310 		  code_indent (level, d->label1);
1311 		  if (d->block != NULL)
1312 		    fputc (',', dumpfile);
1313 		  else
1314 		    fputc (')', dumpfile);
1315 		}
1316 	    }
1317 	}
1318       break;
1319 
1320     case EXEC_CALL:
1321     case EXEC_ASSIGN_CALL:
1322       if (c->resolved_sym)
1323 	fprintf (dumpfile, "CALL %s ", c->resolved_sym->name);
1324       else if (c->symtree)
1325 	fprintf (dumpfile, "CALL %s ", c->symtree->name);
1326       else
1327 	fputs ("CALL ?? ", dumpfile);
1328 
1329       show_actual_arglist (c->ext.actual);
1330       break;
1331 
1332     case EXEC_COMPCALL:
1333       fputs ("CALL ", dumpfile);
1334       show_compcall (c->expr1);
1335       break;
1336 
1337     case EXEC_CALL_PPC:
1338       fputs ("CALL ", dumpfile);
1339       show_expr (c->expr1);
1340       show_actual_arglist (c->ext.actual);
1341       break;
1342 
1343     case EXEC_RETURN:
1344       fputs ("RETURN ", dumpfile);
1345       if (c->expr1)
1346 	show_expr (c->expr1);
1347       break;
1348 
1349     case EXEC_PAUSE:
1350       fputs ("PAUSE ", dumpfile);
1351 
1352       if (c->expr1 != NULL)
1353 	show_expr (c->expr1);
1354       else
1355 	fprintf (dumpfile, "%d", c->ext.stop_code);
1356 
1357       break;
1358 
1359     case EXEC_ERROR_STOP:
1360       fputs ("ERROR ", dumpfile);
1361       /* Fall through.  */
1362 
1363     case EXEC_STOP:
1364       fputs ("STOP ", dumpfile);
1365 
1366       if (c->expr1 != NULL)
1367 	show_expr (c->expr1);
1368       else
1369 	fprintf (dumpfile, "%d", c->ext.stop_code);
1370 
1371       break;
1372 
1373     case EXEC_SYNC_ALL:
1374       fputs ("SYNC ALL ", dumpfile);
1375       if (c->expr2 != NULL)
1376 	{
1377 	  fputs (" stat=", dumpfile);
1378 	  show_expr (c->expr2);
1379 	}
1380       if (c->expr3 != NULL)
1381 	{
1382 	  fputs (" errmsg=", dumpfile);
1383 	  show_expr (c->expr3);
1384 	}
1385       break;
1386 
1387     case EXEC_SYNC_MEMORY:
1388       fputs ("SYNC MEMORY ", dumpfile);
1389       if (c->expr2 != NULL)
1390  	{
1391 	  fputs (" stat=", dumpfile);
1392 	  show_expr (c->expr2);
1393 	}
1394       if (c->expr3 != NULL)
1395 	{
1396 	  fputs (" errmsg=", dumpfile);
1397 	  show_expr (c->expr3);
1398 	}
1399       break;
1400 
1401     case EXEC_SYNC_IMAGES:
1402       fputs ("SYNC IMAGES  image-set=", dumpfile);
1403       if (c->expr1 != NULL)
1404 	show_expr (c->expr1);
1405       else
1406 	fputs ("* ", dumpfile);
1407       if (c->expr2 != NULL)
1408 	{
1409 	  fputs (" stat=", dumpfile);
1410 	  show_expr (c->expr2);
1411 	}
1412       if (c->expr3 != NULL)
1413 	{
1414 	  fputs (" errmsg=", dumpfile);
1415 	  show_expr (c->expr3);
1416 	}
1417       break;
1418 
1419     case EXEC_LOCK:
1420     case EXEC_UNLOCK:
1421       if (c->op == EXEC_LOCK)
1422 	fputs ("LOCK ", dumpfile);
1423       else
1424 	fputs ("UNLOCK ", dumpfile);
1425 
1426       fputs ("lock-variable=", dumpfile);
1427       if (c->expr1 != NULL)
1428 	show_expr (c->expr1);
1429       if (c->expr4 != NULL)
1430 	{
1431 	  fputs (" acquired_lock=", dumpfile);
1432 	  show_expr (c->expr4);
1433 	}
1434       if (c->expr2 != NULL)
1435 	{
1436 	  fputs (" stat=", dumpfile);
1437 	  show_expr (c->expr2);
1438 	}
1439       if (c->expr3 != NULL)
1440 	{
1441 	  fputs (" errmsg=", dumpfile);
1442 	  show_expr (c->expr3);
1443 	}
1444       break;
1445 
1446     case EXEC_ARITHMETIC_IF:
1447       fputs ("IF ", dumpfile);
1448       show_expr (c->expr1);
1449       fprintf (dumpfile, " %d, %d, %d",
1450 		  c->label1->value, c->label2->value, c->label3->value);
1451       break;
1452 
1453     case EXEC_IF:
1454       d = c->block;
1455       fputs ("IF ", dumpfile);
1456       show_expr (d->expr1);
1457 
1458       ++show_level;
1459       show_code (level + 1, d->next);
1460       --show_level;
1461 
1462       d = d->block;
1463       for (; d; d = d->block)
1464 	{
1465 	  code_indent (level, 0);
1466 
1467 	  if (d->expr1 == NULL)
1468 	    fputs ("ELSE", dumpfile);
1469 	  else
1470 	    {
1471 	      fputs ("ELSE IF ", dumpfile);
1472 	      show_expr (d->expr1);
1473 	    }
1474 
1475 	  ++show_level;
1476 	  show_code (level + 1, d->next);
1477 	  --show_level;
1478 	}
1479 
1480       if (c->label1)
1481 	code_indent (level, c->label1);
1482       else
1483 	show_indent ();
1484 
1485       fputs ("ENDIF", dumpfile);
1486       break;
1487 
1488     case EXEC_BLOCK:
1489       {
1490 	const char* blocktype;
1491 	gfc_namespace *saved_ns;
1492 
1493 	if (c->ext.block.assoc)
1494 	  blocktype = "ASSOCIATE";
1495 	else
1496 	  blocktype = "BLOCK";
1497 	show_indent ();
1498 	fprintf (dumpfile, "%s ", blocktype);
1499 	++show_level;
1500 	ns = c->ext.block.ns;
1501 	saved_ns = gfc_current_ns;
1502 	gfc_current_ns = ns;
1503 	gfc_traverse_symtree (ns->sym_root, show_symtree);
1504 	gfc_current_ns = saved_ns;
1505 	show_code (show_level, ns->code);
1506 	--show_level;
1507 	show_indent ();
1508 	fprintf (dumpfile, "END %s ", blocktype);
1509 	break;
1510       }
1511 
1512     case EXEC_SELECT:
1513       d = c->block;
1514       fputs ("SELECT CASE ", dumpfile);
1515       show_expr (c->expr1);
1516       fputc ('\n', dumpfile);
1517 
1518       for (; d; d = d->block)
1519 	{
1520 	  code_indent (level, 0);
1521 
1522 	  fputs ("CASE ", dumpfile);
1523 	  for (cp = d->ext.block.case_list; cp; cp = cp->next)
1524 	    {
1525 	      fputc ('(', dumpfile);
1526 	      show_expr (cp->low);
1527 	      fputc (' ', dumpfile);
1528 	      show_expr (cp->high);
1529 	      fputc (')', dumpfile);
1530 	      fputc (' ', dumpfile);
1531 	    }
1532 	  fputc ('\n', dumpfile);
1533 
1534 	  show_code (level + 1, d->next);
1535 	}
1536 
1537       code_indent (level, c->label1);
1538       fputs ("END SELECT", dumpfile);
1539       break;
1540 
1541     case EXEC_WHERE:
1542       fputs ("WHERE ", dumpfile);
1543 
1544       d = c->block;
1545       show_expr (d->expr1);
1546       fputc ('\n', dumpfile);
1547 
1548       show_code (level + 1, d->next);
1549 
1550       for (d = d->block; d; d = d->block)
1551 	{
1552 	  code_indent (level, 0);
1553 	  fputs ("ELSE WHERE ", dumpfile);
1554 	  show_expr (d->expr1);
1555 	  fputc ('\n', dumpfile);
1556 	  show_code (level + 1, d->next);
1557 	}
1558 
1559       code_indent (level, 0);
1560       fputs ("END WHERE", dumpfile);
1561       break;
1562 
1563 
1564     case EXEC_FORALL:
1565       fputs ("FORALL ", dumpfile);
1566       for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1567 	{
1568 	  show_expr (fa->var);
1569 	  fputc (' ', dumpfile);
1570 	  show_expr (fa->start);
1571 	  fputc (':', dumpfile);
1572 	  show_expr (fa->end);
1573 	  fputc (':', dumpfile);
1574 	  show_expr (fa->stride);
1575 
1576 	  if (fa->next != NULL)
1577 	    fputc (',', dumpfile);
1578 	}
1579 
1580       if (c->expr1 != NULL)
1581 	{
1582 	  fputc (',', dumpfile);
1583 	  show_expr (c->expr1);
1584 	}
1585       fputc ('\n', dumpfile);
1586 
1587       show_code (level + 1, c->block->next);
1588 
1589       code_indent (level, 0);
1590       fputs ("END FORALL", dumpfile);
1591       break;
1592 
1593     case EXEC_CRITICAL:
1594       fputs ("CRITICAL\n", dumpfile);
1595       show_code (level + 1, c->block->next);
1596       code_indent (level, 0);
1597       fputs ("END CRITICAL", dumpfile);
1598       break;
1599 
1600     case EXEC_DO:
1601       fputs ("DO ", dumpfile);
1602       if (c->label1)
1603 	fprintf (dumpfile, " %-5d ", c->label1->value);
1604 
1605       show_expr (c->ext.iterator->var);
1606       fputc ('=', dumpfile);
1607       show_expr (c->ext.iterator->start);
1608       fputc (' ', dumpfile);
1609       show_expr (c->ext.iterator->end);
1610       fputc (' ', dumpfile);
1611       show_expr (c->ext.iterator->step);
1612 
1613       ++show_level;
1614       show_code (level + 1, c->block->next);
1615       --show_level;
1616 
1617       if (c->label1)
1618 	break;
1619 
1620       show_indent ();
1621       fputs ("END DO", dumpfile);
1622       break;
1623 
1624     case EXEC_DO_CONCURRENT:
1625       fputs ("DO CONCURRENT ", dumpfile);
1626       for (fa = c->ext.forall_iterator; fa; fa = fa->next)
1627         {
1628           show_expr (fa->var);
1629           fputc (' ', dumpfile);
1630           show_expr (fa->start);
1631           fputc (':', dumpfile);
1632           show_expr (fa->end);
1633           fputc (':', dumpfile);
1634           show_expr (fa->stride);
1635 
1636           if (fa->next != NULL)
1637             fputc (',', dumpfile);
1638         }
1639       show_expr (c->expr1);
1640 
1641       show_code (level + 1, c->block->next);
1642       code_indent (level, c->label1);
1643       fputs ("END DO", dumpfile);
1644       break;
1645 
1646     case EXEC_DO_WHILE:
1647       fputs ("DO WHILE ", dumpfile);
1648       show_expr (c->expr1);
1649       fputc ('\n', dumpfile);
1650 
1651       show_code (level + 1, c->block->next);
1652 
1653       code_indent (level, c->label1);
1654       fputs ("END DO", dumpfile);
1655       break;
1656 
1657     case EXEC_CYCLE:
1658       fputs ("CYCLE", dumpfile);
1659       if (c->symtree)
1660 	fprintf (dumpfile, " %s", c->symtree->n.sym->name);
1661       break;
1662 
1663     case EXEC_EXIT:
1664       fputs ("EXIT", dumpfile);
1665       if (c->symtree)
1666 	fprintf (dumpfile, " %s", c->symtree->n.sym->name);
1667       break;
1668 
1669     case EXEC_ALLOCATE:
1670       fputs ("ALLOCATE ", dumpfile);
1671       if (c->expr1)
1672 	{
1673 	  fputs (" STAT=", dumpfile);
1674 	  show_expr (c->expr1);
1675 	}
1676 
1677       if (c->expr2)
1678 	{
1679 	  fputs (" ERRMSG=", dumpfile);
1680 	  show_expr (c->expr2);
1681 	}
1682 
1683       if (c->expr3)
1684 	{
1685 	  if (c->expr3->mold)
1686 	    fputs (" MOLD=", dumpfile);
1687 	  else
1688 	    fputs (" SOURCE=", dumpfile);
1689 	  show_expr (c->expr3);
1690 	}
1691 
1692       for (a = c->ext.alloc.list; a; a = a->next)
1693 	{
1694 	  fputc (' ', dumpfile);
1695 	  show_expr (a->expr);
1696 	}
1697 
1698       break;
1699 
1700     case EXEC_DEALLOCATE:
1701       fputs ("DEALLOCATE ", dumpfile);
1702       if (c->expr1)
1703 	{
1704 	  fputs (" STAT=", dumpfile);
1705 	  show_expr (c->expr1);
1706 	}
1707 
1708       if (c->expr2)
1709 	{
1710 	  fputs (" ERRMSG=", dumpfile);
1711 	  show_expr (c->expr2);
1712 	}
1713 
1714       for (a = c->ext.alloc.list; a; a = a->next)
1715 	{
1716 	  fputc (' ', dumpfile);
1717 	  show_expr (a->expr);
1718 	}
1719 
1720       break;
1721 
1722     case EXEC_OPEN:
1723       fputs ("OPEN", dumpfile);
1724       open = c->ext.open;
1725 
1726       if (open->unit)
1727 	{
1728 	  fputs (" UNIT=", dumpfile);
1729 	  show_expr (open->unit);
1730 	}
1731       if (open->iomsg)
1732 	{
1733 	  fputs (" IOMSG=", dumpfile);
1734 	  show_expr (open->iomsg);
1735 	}
1736       if (open->iostat)
1737 	{
1738 	  fputs (" IOSTAT=", dumpfile);
1739 	  show_expr (open->iostat);
1740 	}
1741       if (open->file)
1742 	{
1743 	  fputs (" FILE=", dumpfile);
1744 	  show_expr (open->file);
1745 	}
1746       if (open->status)
1747 	{
1748 	  fputs (" STATUS=", dumpfile);
1749 	  show_expr (open->status);
1750 	}
1751       if (open->access)
1752 	{
1753 	  fputs (" ACCESS=", dumpfile);
1754 	  show_expr (open->access);
1755 	}
1756       if (open->form)
1757 	{
1758 	  fputs (" FORM=", dumpfile);
1759 	  show_expr (open->form);
1760 	}
1761       if (open->recl)
1762 	{
1763 	  fputs (" RECL=", dumpfile);
1764 	  show_expr (open->recl);
1765 	}
1766       if (open->blank)
1767 	{
1768 	  fputs (" BLANK=", dumpfile);
1769 	  show_expr (open->blank);
1770 	}
1771       if (open->position)
1772 	{
1773 	  fputs (" POSITION=", dumpfile);
1774 	  show_expr (open->position);
1775 	}
1776       if (open->action)
1777 	{
1778 	  fputs (" ACTION=", dumpfile);
1779 	  show_expr (open->action);
1780 	}
1781       if (open->delim)
1782 	{
1783 	  fputs (" DELIM=", dumpfile);
1784 	  show_expr (open->delim);
1785 	}
1786       if (open->pad)
1787 	{
1788 	  fputs (" PAD=", dumpfile);
1789 	  show_expr (open->pad);
1790 	}
1791       if (open->decimal)
1792 	{
1793 	  fputs (" DECIMAL=", dumpfile);
1794 	  show_expr (open->decimal);
1795 	}
1796       if (open->encoding)
1797 	{
1798 	  fputs (" ENCODING=", dumpfile);
1799 	  show_expr (open->encoding);
1800 	}
1801       if (open->round)
1802 	{
1803 	  fputs (" ROUND=", dumpfile);
1804 	  show_expr (open->round);
1805 	}
1806       if (open->sign)
1807 	{
1808 	  fputs (" SIGN=", dumpfile);
1809 	  show_expr (open->sign);
1810 	}
1811       if (open->convert)
1812 	{
1813 	  fputs (" CONVERT=", dumpfile);
1814 	  show_expr (open->convert);
1815 	}
1816       if (open->asynchronous)
1817 	{
1818 	  fputs (" ASYNCHRONOUS=", dumpfile);
1819 	  show_expr (open->asynchronous);
1820 	}
1821       if (open->err != NULL)
1822 	fprintf (dumpfile, " ERR=%d", open->err->value);
1823 
1824       break;
1825 
1826     case EXEC_CLOSE:
1827       fputs ("CLOSE", dumpfile);
1828       close = c->ext.close;
1829 
1830       if (close->unit)
1831 	{
1832 	  fputs (" UNIT=", dumpfile);
1833 	  show_expr (close->unit);
1834 	}
1835       if (close->iomsg)
1836 	{
1837 	  fputs (" IOMSG=", dumpfile);
1838 	  show_expr (close->iomsg);
1839 	}
1840       if (close->iostat)
1841 	{
1842 	  fputs (" IOSTAT=", dumpfile);
1843 	  show_expr (close->iostat);
1844 	}
1845       if (close->status)
1846 	{
1847 	  fputs (" STATUS=", dumpfile);
1848 	  show_expr (close->status);
1849 	}
1850       if (close->err != NULL)
1851 	fprintf (dumpfile, " ERR=%d", close->err->value);
1852       break;
1853 
1854     case EXEC_BACKSPACE:
1855       fputs ("BACKSPACE", dumpfile);
1856       goto show_filepos;
1857 
1858     case EXEC_ENDFILE:
1859       fputs ("ENDFILE", dumpfile);
1860       goto show_filepos;
1861 
1862     case EXEC_REWIND:
1863       fputs ("REWIND", dumpfile);
1864       goto show_filepos;
1865 
1866     case EXEC_FLUSH:
1867       fputs ("FLUSH", dumpfile);
1868 
1869     show_filepos:
1870       fp = c->ext.filepos;
1871 
1872       if (fp->unit)
1873 	{
1874 	  fputs (" UNIT=", dumpfile);
1875 	  show_expr (fp->unit);
1876 	}
1877       if (fp->iomsg)
1878 	{
1879 	  fputs (" IOMSG=", dumpfile);
1880 	  show_expr (fp->iomsg);
1881 	}
1882       if (fp->iostat)
1883 	{
1884 	  fputs (" IOSTAT=", dumpfile);
1885 	  show_expr (fp->iostat);
1886 	}
1887       if (fp->err != NULL)
1888 	fprintf (dumpfile, " ERR=%d", fp->err->value);
1889       break;
1890 
1891     case EXEC_INQUIRE:
1892       fputs ("INQUIRE", dumpfile);
1893       i = c->ext.inquire;
1894 
1895       if (i->unit)
1896 	{
1897 	  fputs (" UNIT=", dumpfile);
1898 	  show_expr (i->unit);
1899 	}
1900       if (i->file)
1901 	{
1902 	  fputs (" FILE=", dumpfile);
1903 	  show_expr (i->file);
1904 	}
1905 
1906       if (i->iomsg)
1907 	{
1908 	  fputs (" IOMSG=", dumpfile);
1909 	  show_expr (i->iomsg);
1910 	}
1911       if (i->iostat)
1912 	{
1913 	  fputs (" IOSTAT=", dumpfile);
1914 	  show_expr (i->iostat);
1915 	}
1916       if (i->exist)
1917 	{
1918 	  fputs (" EXIST=", dumpfile);
1919 	  show_expr (i->exist);
1920 	}
1921       if (i->opened)
1922 	{
1923 	  fputs (" OPENED=", dumpfile);
1924 	  show_expr (i->opened);
1925 	}
1926       if (i->number)
1927 	{
1928 	  fputs (" NUMBER=", dumpfile);
1929 	  show_expr (i->number);
1930 	}
1931       if (i->named)
1932 	{
1933 	  fputs (" NAMED=", dumpfile);
1934 	  show_expr (i->named);
1935 	}
1936       if (i->name)
1937 	{
1938 	  fputs (" NAME=", dumpfile);
1939 	  show_expr (i->name);
1940 	}
1941       if (i->access)
1942 	{
1943 	  fputs (" ACCESS=", dumpfile);
1944 	  show_expr (i->access);
1945 	}
1946       if (i->sequential)
1947 	{
1948 	  fputs (" SEQUENTIAL=", dumpfile);
1949 	  show_expr (i->sequential);
1950 	}
1951 
1952       if (i->direct)
1953 	{
1954 	  fputs (" DIRECT=", dumpfile);
1955 	  show_expr (i->direct);
1956 	}
1957       if (i->form)
1958 	{
1959 	  fputs (" FORM=", dumpfile);
1960 	  show_expr (i->form);
1961 	}
1962       if (i->formatted)
1963 	{
1964 	  fputs (" FORMATTED", dumpfile);
1965 	  show_expr (i->formatted);
1966 	}
1967       if (i->unformatted)
1968 	{
1969 	  fputs (" UNFORMATTED=", dumpfile);
1970 	  show_expr (i->unformatted);
1971 	}
1972       if (i->recl)
1973 	{
1974 	  fputs (" RECL=", dumpfile);
1975 	  show_expr (i->recl);
1976 	}
1977       if (i->nextrec)
1978 	{
1979 	  fputs (" NEXTREC=", dumpfile);
1980 	  show_expr (i->nextrec);
1981 	}
1982       if (i->blank)
1983 	{
1984 	  fputs (" BLANK=", dumpfile);
1985 	  show_expr (i->blank);
1986 	}
1987       if (i->position)
1988 	{
1989 	  fputs (" POSITION=", dumpfile);
1990 	  show_expr (i->position);
1991 	}
1992       if (i->action)
1993 	{
1994 	  fputs (" ACTION=", dumpfile);
1995 	  show_expr (i->action);
1996 	}
1997       if (i->read)
1998 	{
1999 	  fputs (" READ=", dumpfile);
2000 	  show_expr (i->read);
2001 	}
2002       if (i->write)
2003 	{
2004 	  fputs (" WRITE=", dumpfile);
2005 	  show_expr (i->write);
2006 	}
2007       if (i->readwrite)
2008 	{
2009 	  fputs (" READWRITE=", dumpfile);
2010 	  show_expr (i->readwrite);
2011 	}
2012       if (i->delim)
2013 	{
2014 	  fputs (" DELIM=", dumpfile);
2015 	  show_expr (i->delim);
2016 	}
2017       if (i->pad)
2018 	{
2019 	  fputs (" PAD=", dumpfile);
2020 	  show_expr (i->pad);
2021 	}
2022       if (i->convert)
2023 	{
2024 	  fputs (" CONVERT=", dumpfile);
2025 	  show_expr (i->convert);
2026 	}
2027       if (i->asynchronous)
2028 	{
2029 	  fputs (" ASYNCHRONOUS=", dumpfile);
2030 	  show_expr (i->asynchronous);
2031 	}
2032       if (i->decimal)
2033 	{
2034 	  fputs (" DECIMAL=", dumpfile);
2035 	  show_expr (i->decimal);
2036 	}
2037       if (i->encoding)
2038 	{
2039 	  fputs (" ENCODING=", dumpfile);
2040 	  show_expr (i->encoding);
2041 	}
2042       if (i->pending)
2043 	{
2044 	  fputs (" PENDING=", dumpfile);
2045 	  show_expr (i->pending);
2046 	}
2047       if (i->round)
2048 	{
2049 	  fputs (" ROUND=", dumpfile);
2050 	  show_expr (i->round);
2051 	}
2052       if (i->sign)
2053 	{
2054 	  fputs (" SIGN=", dumpfile);
2055 	  show_expr (i->sign);
2056 	}
2057       if (i->size)
2058 	{
2059 	  fputs (" SIZE=", dumpfile);
2060 	  show_expr (i->size);
2061 	}
2062       if (i->id)
2063 	{
2064 	  fputs (" ID=", dumpfile);
2065 	  show_expr (i->id);
2066 	}
2067 
2068       if (i->err != NULL)
2069 	fprintf (dumpfile, " ERR=%d", i->err->value);
2070       break;
2071 
2072     case EXEC_IOLENGTH:
2073       fputs ("IOLENGTH ", dumpfile);
2074       show_expr (c->expr1);
2075       goto show_dt_code;
2076       break;
2077 
2078     case EXEC_READ:
2079       fputs ("READ", dumpfile);
2080       goto show_dt;
2081 
2082     case EXEC_WRITE:
2083       fputs ("WRITE", dumpfile);
2084 
2085     show_dt:
2086       dt = c->ext.dt;
2087       if (dt->io_unit)
2088 	{
2089 	  fputs (" UNIT=", dumpfile);
2090 	  show_expr (dt->io_unit);
2091 	}
2092 
2093       if (dt->format_expr)
2094 	{
2095 	  fputs (" FMT=", dumpfile);
2096 	  show_expr (dt->format_expr);
2097 	}
2098 
2099       if (dt->format_label != NULL)
2100 	fprintf (dumpfile, " FMT=%d", dt->format_label->value);
2101       if (dt->namelist)
2102 	fprintf (dumpfile, " NML=%s", dt->namelist->name);
2103 
2104       if (dt->iomsg)
2105 	{
2106 	  fputs (" IOMSG=", dumpfile);
2107 	  show_expr (dt->iomsg);
2108 	}
2109       if (dt->iostat)
2110 	{
2111 	  fputs (" IOSTAT=", dumpfile);
2112 	  show_expr (dt->iostat);
2113 	}
2114       if (dt->size)
2115 	{
2116 	  fputs (" SIZE=", dumpfile);
2117 	  show_expr (dt->size);
2118 	}
2119       if (dt->rec)
2120 	{
2121 	  fputs (" REC=", dumpfile);
2122 	  show_expr (dt->rec);
2123 	}
2124       if (dt->advance)
2125 	{
2126 	  fputs (" ADVANCE=", dumpfile);
2127 	  show_expr (dt->advance);
2128 	}
2129       if (dt->id)
2130 	{
2131 	  fputs (" ID=", dumpfile);
2132 	  show_expr (dt->id);
2133 	}
2134       if (dt->pos)
2135 	{
2136 	  fputs (" POS=", dumpfile);
2137 	  show_expr (dt->pos);
2138 	}
2139       if (dt->asynchronous)
2140 	{
2141 	  fputs (" ASYNCHRONOUS=", dumpfile);
2142 	  show_expr (dt->asynchronous);
2143 	}
2144       if (dt->blank)
2145 	{
2146 	  fputs (" BLANK=", dumpfile);
2147 	  show_expr (dt->blank);
2148 	}
2149       if (dt->decimal)
2150 	{
2151 	  fputs (" DECIMAL=", dumpfile);
2152 	  show_expr (dt->decimal);
2153 	}
2154       if (dt->delim)
2155 	{
2156 	  fputs (" DELIM=", dumpfile);
2157 	  show_expr (dt->delim);
2158 	}
2159       if (dt->pad)
2160 	{
2161 	  fputs (" PAD=", dumpfile);
2162 	  show_expr (dt->pad);
2163 	}
2164       if (dt->round)
2165 	{
2166 	  fputs (" ROUND=", dumpfile);
2167 	  show_expr (dt->round);
2168 	}
2169       if (dt->sign)
2170 	{
2171 	  fputs (" SIGN=", dumpfile);
2172 	  show_expr (dt->sign);
2173 	}
2174 
2175     show_dt_code:
2176       for (c = c->block->next; c; c = c->next)
2177 	show_code_node (level + (c->next != NULL), c);
2178       return;
2179 
2180     case EXEC_TRANSFER:
2181       fputs ("TRANSFER ", dumpfile);
2182       show_expr (c->expr1);
2183       break;
2184 
2185     case EXEC_DT_END:
2186       fputs ("DT_END", dumpfile);
2187       dt = c->ext.dt;
2188 
2189       if (dt->err != NULL)
2190 	fprintf (dumpfile, " ERR=%d", dt->err->value);
2191       if (dt->end != NULL)
2192 	fprintf (dumpfile, " END=%d", dt->end->value);
2193       if (dt->eor != NULL)
2194 	fprintf (dumpfile, " EOR=%d", dt->eor->value);
2195       break;
2196 
2197     case EXEC_OMP_ATOMIC:
2198     case EXEC_OMP_BARRIER:
2199     case EXEC_OMP_CRITICAL:
2200     case EXEC_OMP_FLUSH:
2201     case EXEC_OMP_DO:
2202     case EXEC_OMP_MASTER:
2203     case EXEC_OMP_ORDERED:
2204     case EXEC_OMP_PARALLEL:
2205     case EXEC_OMP_PARALLEL_DO:
2206     case EXEC_OMP_PARALLEL_SECTIONS:
2207     case EXEC_OMP_PARALLEL_WORKSHARE:
2208     case EXEC_OMP_SECTIONS:
2209     case EXEC_OMP_SINGLE:
2210     case EXEC_OMP_TASK:
2211     case EXEC_OMP_TASKWAIT:
2212     case EXEC_OMP_TASKYIELD:
2213     case EXEC_OMP_WORKSHARE:
2214       show_omp_node (level, c);
2215       break;
2216 
2217     default:
2218       gfc_internal_error ("show_code_node(): Bad statement code");
2219     }
2220 }
2221 
2222 
2223 /* Show an equivalence chain.  */
2224 
2225 static void
show_equiv(gfc_equiv * eq)2226 show_equiv (gfc_equiv *eq)
2227 {
2228   show_indent ();
2229   fputs ("Equivalence: ", dumpfile);
2230   while (eq)
2231     {
2232       show_expr (eq->expr);
2233       eq = eq->eq;
2234       if (eq)
2235 	fputs (", ", dumpfile);
2236     }
2237 }
2238 
2239 
2240 /* Show a freakin' whole namespace.  */
2241 
2242 static void
show_namespace(gfc_namespace * ns)2243 show_namespace (gfc_namespace *ns)
2244 {
2245   gfc_interface *intr;
2246   gfc_namespace *save;
2247   int op;
2248   gfc_equiv *eq;
2249   int i;
2250 
2251   gcc_assert (ns);
2252   save = gfc_current_ns;
2253 
2254   show_indent ();
2255   fputs ("Namespace:", dumpfile);
2256 
2257   i = 0;
2258   do
2259     {
2260       int l = i;
2261       while (i < GFC_LETTERS - 1
2262 	     && gfc_compare_types (&ns->default_type[i+1],
2263 				   &ns->default_type[l]))
2264 	i++;
2265 
2266       if (i > l)
2267 	fprintf (dumpfile, " %c-%c: ", l+'A', i+'A');
2268       else
2269 	fprintf (dumpfile, " %c: ", l+'A');
2270 
2271       show_typespec(&ns->default_type[l]);
2272       i++;
2273     } while (i < GFC_LETTERS);
2274 
2275   if (ns->proc_name != NULL)
2276     {
2277       show_indent ();
2278       fprintf (dumpfile, "procedure name = %s", ns->proc_name->name);
2279     }
2280 
2281   ++show_level;
2282   gfc_current_ns = ns;
2283   gfc_traverse_symtree (ns->common_root, show_common);
2284 
2285   gfc_traverse_symtree (ns->sym_root, show_symtree);
2286 
2287   for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
2288     {
2289       /* User operator interfaces */
2290       intr = ns->op[op];
2291       if (intr == NULL)
2292 	continue;
2293 
2294       show_indent ();
2295       fprintf (dumpfile, "Operator interfaces for %s:",
2296 	       gfc_op2string ((gfc_intrinsic_op) op));
2297 
2298       for (; intr; intr = intr->next)
2299 	fprintf (dumpfile, " %s", intr->sym->name);
2300     }
2301 
2302   if (ns->uop_root != NULL)
2303     {
2304       show_indent ();
2305       fputs ("User operators:\n", dumpfile);
2306       gfc_traverse_user_op (ns, show_uop);
2307     }
2308 
2309   for (eq = ns->equiv; eq; eq = eq->next)
2310     show_equiv (eq);
2311 
2312   fputc ('\n', dumpfile);
2313   show_indent ();
2314   fputs ("code:", dumpfile);
2315   show_code (show_level, ns->code);
2316   --show_level;
2317 
2318   for (ns = ns->contained; ns; ns = ns->sibling)
2319     {
2320       fputs ("\nCONTAINS\n", dumpfile);
2321       ++show_level;
2322       show_namespace (ns);
2323       --show_level;
2324     }
2325 
2326   fputc ('\n', dumpfile);
2327   gfc_current_ns = save;
2328 }
2329 
2330 
2331 /* Main function for dumping a parse tree.  */
2332 
2333 void
gfc_dump_parse_tree(gfc_namespace * ns,FILE * file)2334 gfc_dump_parse_tree (gfc_namespace *ns, FILE *file)
2335 {
2336   dumpfile = file;
2337   show_namespace (ns);
2338 }
2339 
2340