xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/fortran/dump-parse-tree.c (revision 4c3eb207d36f67d31994830c0a694161fc1ca39b)
1627f7eb2Smrg /* Parse tree dumper
2*4c3eb207Smrg    Copyright (C) 2003-2020 Free Software Foundation, Inc.
3627f7eb2Smrg    Contributed by Steven Bosscher
4627f7eb2Smrg 
5627f7eb2Smrg This file is part of GCC.
6627f7eb2Smrg 
7627f7eb2Smrg GCC is free software; you can redistribute it and/or modify it under
8627f7eb2Smrg the terms of the GNU General Public License as published by the Free
9627f7eb2Smrg Software Foundation; either version 3, or (at your option) any later
10627f7eb2Smrg version.
11627f7eb2Smrg 
12627f7eb2Smrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13627f7eb2Smrg WARRANTY; without even the implied warranty of MERCHANTABILITY or
14627f7eb2Smrg FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15627f7eb2Smrg for more details.
16627f7eb2Smrg 
17627f7eb2Smrg You should have received a copy of the GNU General Public License
18627f7eb2Smrg along with GCC; see the file COPYING3.  If not see
19627f7eb2Smrg <http://www.gnu.org/licenses/>.  */
20627f7eb2Smrg 
21627f7eb2Smrg 
22627f7eb2Smrg /* Actually this is just a collection of routines that used to be
23627f7eb2Smrg    scattered around the sources.  Now that they are all in a single
24627f7eb2Smrg    file, almost all of them can be static, and the other files don't
25627f7eb2Smrg    have this mess in them.
26627f7eb2Smrg 
27627f7eb2Smrg    As a nice side-effect, this file can act as documentation of the
28627f7eb2Smrg    gfc_code and gfc_expr structures and all their friends and
29627f7eb2Smrg    relatives.
30627f7eb2Smrg 
31627f7eb2Smrg    TODO: Dump DATA.  */
32627f7eb2Smrg 
33627f7eb2Smrg #include "config.h"
34627f7eb2Smrg #include "system.h"
35627f7eb2Smrg #include "coretypes.h"
36627f7eb2Smrg #include "gfortran.h"
37627f7eb2Smrg #include "constructor.h"
38627f7eb2Smrg #include "version.h"
39627f7eb2Smrg 
40627f7eb2Smrg /* Keep track of indentation for symbol tree dumps.  */
41627f7eb2Smrg static int show_level = 0;
42627f7eb2Smrg 
43627f7eb2Smrg /* The file handle we're dumping to is kept in a static variable.  This
44627f7eb2Smrg    is not too cool, but it avoids a lot of passing it around.  */
45627f7eb2Smrg static FILE *dumpfile;
46627f7eb2Smrg 
47627f7eb2Smrg /* Forward declaration of some of the functions.  */
48627f7eb2Smrg static void show_expr (gfc_expr *p);
49627f7eb2Smrg static void show_code_node (int, gfc_code *);
50627f7eb2Smrg static void show_namespace (gfc_namespace *ns);
51627f7eb2Smrg static void show_code (int, gfc_code *);
52627f7eb2Smrg static void show_symbol (gfc_symbol *);
53627f7eb2Smrg static void show_typespec (gfc_typespec *);
54627f7eb2Smrg static void show_ref (gfc_ref *);
55627f7eb2Smrg static void show_attr (symbol_attribute *, const char *);
56627f7eb2Smrg 
57627f7eb2Smrg /* Allow dumping of an expression in the debugger.  */
58627f7eb2Smrg void gfc_debug_expr (gfc_expr *);
59627f7eb2Smrg 
debug(symbol_attribute * attr)60627f7eb2Smrg void debug (symbol_attribute *attr)
61627f7eb2Smrg {
62627f7eb2Smrg   FILE *tmp = dumpfile;
63627f7eb2Smrg   dumpfile = stderr;
64627f7eb2Smrg   show_attr (attr, NULL);
65627f7eb2Smrg   fputc ('\n', dumpfile);
66627f7eb2Smrg   dumpfile = tmp;
67627f7eb2Smrg }
68627f7eb2Smrg 
debug(gfc_formal_arglist * formal)69*4c3eb207Smrg void debug (gfc_formal_arglist *formal)
70*4c3eb207Smrg {
71*4c3eb207Smrg   FILE *tmp = dumpfile;
72*4c3eb207Smrg   dumpfile = stderr;
73*4c3eb207Smrg   for (; formal; formal = formal->next)
74*4c3eb207Smrg     {
75*4c3eb207Smrg       fputc ('\n', dumpfile);
76*4c3eb207Smrg       show_symbol (formal->sym);
77*4c3eb207Smrg     }
78*4c3eb207Smrg   fputc ('\n', dumpfile);
79*4c3eb207Smrg   dumpfile = tmp;
80*4c3eb207Smrg }
81*4c3eb207Smrg 
debug(symbol_attribute attr)82627f7eb2Smrg void debug (symbol_attribute attr)
83627f7eb2Smrg {
84627f7eb2Smrg   debug (&attr);
85627f7eb2Smrg }
86627f7eb2Smrg 
debug(gfc_expr * e)87627f7eb2Smrg void debug (gfc_expr *e)
88627f7eb2Smrg {
89627f7eb2Smrg   FILE *tmp = dumpfile;
90627f7eb2Smrg   dumpfile = stderr;
91*4c3eb207Smrg   if (e != NULL)
92*4c3eb207Smrg     {
93627f7eb2Smrg       show_expr (e);
94627f7eb2Smrg       fputc (' ', dumpfile);
95627f7eb2Smrg       show_typespec (&e->ts);
96*4c3eb207Smrg     }
97*4c3eb207Smrg   else
98*4c3eb207Smrg     fputs ("() ", dumpfile);
99*4c3eb207Smrg 
100627f7eb2Smrg   fputc ('\n', dumpfile);
101627f7eb2Smrg   dumpfile = tmp;
102627f7eb2Smrg }
103627f7eb2Smrg 
debug(gfc_typespec * ts)104627f7eb2Smrg void debug (gfc_typespec *ts)
105627f7eb2Smrg {
106627f7eb2Smrg   FILE *tmp = dumpfile;
107627f7eb2Smrg   dumpfile = stderr;
108627f7eb2Smrg   show_typespec (ts);
109627f7eb2Smrg   fputc ('\n', dumpfile);
110627f7eb2Smrg   dumpfile = tmp;
111627f7eb2Smrg }
112627f7eb2Smrg 
debug(gfc_typespec ts)113627f7eb2Smrg void debug (gfc_typespec ts)
114627f7eb2Smrg {
115627f7eb2Smrg   debug (&ts);
116627f7eb2Smrg }
117627f7eb2Smrg 
debug(gfc_ref * p)118627f7eb2Smrg void debug (gfc_ref *p)
119627f7eb2Smrg {
120627f7eb2Smrg   FILE *tmp = dumpfile;
121627f7eb2Smrg   dumpfile = stderr;
122627f7eb2Smrg   show_ref (p);
123627f7eb2Smrg   fputc ('\n', dumpfile);
124627f7eb2Smrg   dumpfile = tmp;
125627f7eb2Smrg }
126627f7eb2Smrg 
127627f7eb2Smrg void
gfc_debug_expr(gfc_expr * e)128627f7eb2Smrg gfc_debug_expr (gfc_expr *e)
129627f7eb2Smrg {
130627f7eb2Smrg   FILE *tmp = dumpfile;
131627f7eb2Smrg   dumpfile = stderr;
132627f7eb2Smrg   show_expr (e);
133627f7eb2Smrg   fputc ('\n', dumpfile);
134627f7eb2Smrg   dumpfile = tmp;
135627f7eb2Smrg }
136627f7eb2Smrg 
137627f7eb2Smrg /* Allow for dumping of a piece of code in the debugger.  */
138627f7eb2Smrg void gfc_debug_code (gfc_code *c);
139627f7eb2Smrg 
140627f7eb2Smrg void
gfc_debug_code(gfc_code * c)141627f7eb2Smrg gfc_debug_code (gfc_code *c)
142627f7eb2Smrg {
143627f7eb2Smrg   FILE *tmp = dumpfile;
144627f7eb2Smrg   dumpfile = stderr;
145627f7eb2Smrg   show_code (1, c);
146627f7eb2Smrg   fputc ('\n', dumpfile);
147627f7eb2Smrg   dumpfile = tmp;
148627f7eb2Smrg }
149627f7eb2Smrg 
debug(gfc_symbol * sym)150627f7eb2Smrg void debug (gfc_symbol *sym)
151627f7eb2Smrg {
152627f7eb2Smrg   FILE *tmp = dumpfile;
153627f7eb2Smrg   dumpfile = stderr;
154627f7eb2Smrg   show_symbol (sym);
155627f7eb2Smrg   fputc ('\n', dumpfile);
156627f7eb2Smrg   dumpfile = tmp;
157627f7eb2Smrg }
158627f7eb2Smrg 
159627f7eb2Smrg /* Do indentation for a specific level.  */
160627f7eb2Smrg 
161627f7eb2Smrg static inline void
code_indent(int level,gfc_st_label * label)162627f7eb2Smrg code_indent (int level, gfc_st_label *label)
163627f7eb2Smrg {
164627f7eb2Smrg   int i;
165627f7eb2Smrg 
166627f7eb2Smrg   if (label != NULL)
167627f7eb2Smrg     fprintf (dumpfile, "%-5d ", label->value);
168627f7eb2Smrg 
169627f7eb2Smrg   for (i = 0; i < (2 * level - (label ? 6 : 0)); i++)
170627f7eb2Smrg     fputc (' ', dumpfile);
171627f7eb2Smrg }
172627f7eb2Smrg 
173627f7eb2Smrg 
174627f7eb2Smrg /* Simple indentation at the current level.  This one
175627f7eb2Smrg    is used to show symbols.  */
176627f7eb2Smrg 
177627f7eb2Smrg static inline void
show_indent(void)178627f7eb2Smrg show_indent (void)
179627f7eb2Smrg {
180627f7eb2Smrg   fputc ('\n', dumpfile);
181627f7eb2Smrg   code_indent (show_level, NULL);
182627f7eb2Smrg }
183627f7eb2Smrg 
184627f7eb2Smrg 
185627f7eb2Smrg /* Show type-specific information.  */
186627f7eb2Smrg 
187627f7eb2Smrg static void
show_typespec(gfc_typespec * ts)188627f7eb2Smrg show_typespec (gfc_typespec *ts)
189627f7eb2Smrg {
190627f7eb2Smrg   if (ts->type == BT_ASSUMED)
191627f7eb2Smrg     {
192627f7eb2Smrg       fputs ("(TYPE(*))", dumpfile);
193627f7eb2Smrg       return;
194627f7eb2Smrg     }
195627f7eb2Smrg 
196627f7eb2Smrg   fprintf (dumpfile, "(%s ", gfc_basic_typename (ts->type));
197627f7eb2Smrg 
198627f7eb2Smrg   switch (ts->type)
199627f7eb2Smrg     {
200627f7eb2Smrg     case BT_DERIVED:
201627f7eb2Smrg     case BT_CLASS:
202627f7eb2Smrg     case BT_UNION:
203627f7eb2Smrg       fprintf (dumpfile, "%s", ts->u.derived->name);
204627f7eb2Smrg       break;
205627f7eb2Smrg 
206627f7eb2Smrg     case BT_CHARACTER:
207627f7eb2Smrg       if (ts->u.cl)
208627f7eb2Smrg 	show_expr (ts->u.cl->length);
209627f7eb2Smrg       fprintf(dumpfile, " %d", ts->kind);
210627f7eb2Smrg       break;
211627f7eb2Smrg 
212627f7eb2Smrg     default:
213627f7eb2Smrg       fprintf (dumpfile, "%d", ts->kind);
214627f7eb2Smrg       break;
215627f7eb2Smrg     }
216627f7eb2Smrg   if (ts->is_c_interop)
217627f7eb2Smrg     fputs (" C_INTEROP", dumpfile);
218627f7eb2Smrg 
219627f7eb2Smrg   if (ts->is_iso_c)
220627f7eb2Smrg     fputs (" ISO_C", dumpfile);
221627f7eb2Smrg 
222627f7eb2Smrg   if (ts->deferred)
223627f7eb2Smrg     fputs (" DEFERRED", dumpfile);
224627f7eb2Smrg 
225627f7eb2Smrg   fputc (')', dumpfile);
226627f7eb2Smrg }
227627f7eb2Smrg 
228627f7eb2Smrg 
229627f7eb2Smrg /* Show an actual argument list.  */
230627f7eb2Smrg 
231627f7eb2Smrg static void
show_actual_arglist(gfc_actual_arglist * a)232627f7eb2Smrg show_actual_arglist (gfc_actual_arglist *a)
233627f7eb2Smrg {
234627f7eb2Smrg   fputc ('(', dumpfile);
235627f7eb2Smrg 
236627f7eb2Smrg   for (; a; a = a->next)
237627f7eb2Smrg     {
238627f7eb2Smrg       fputc ('(', dumpfile);
239627f7eb2Smrg       if (a->name != NULL)
240627f7eb2Smrg 	fprintf (dumpfile, "%s = ", a->name);
241627f7eb2Smrg       if (a->expr != NULL)
242627f7eb2Smrg 	show_expr (a->expr);
243627f7eb2Smrg       else
244627f7eb2Smrg 	fputs ("(arg not-present)", dumpfile);
245627f7eb2Smrg 
246627f7eb2Smrg       fputc (')', dumpfile);
247627f7eb2Smrg       if (a->next != NULL)
248627f7eb2Smrg 	fputc (' ', dumpfile);
249627f7eb2Smrg     }
250627f7eb2Smrg 
251627f7eb2Smrg   fputc (')', dumpfile);
252627f7eb2Smrg }
253627f7eb2Smrg 
254627f7eb2Smrg 
255627f7eb2Smrg /* Show a gfc_array_spec array specification structure.  */
256627f7eb2Smrg 
257627f7eb2Smrg static void
show_array_spec(gfc_array_spec * as)258627f7eb2Smrg show_array_spec (gfc_array_spec *as)
259627f7eb2Smrg {
260627f7eb2Smrg   const char *c;
261627f7eb2Smrg   int i;
262627f7eb2Smrg 
263627f7eb2Smrg   if (as == NULL)
264627f7eb2Smrg     {
265627f7eb2Smrg       fputs ("()", dumpfile);
266627f7eb2Smrg       return;
267627f7eb2Smrg     }
268627f7eb2Smrg 
269627f7eb2Smrg   fprintf (dumpfile, "(%d [%d]", as->rank, as->corank);
270627f7eb2Smrg 
271627f7eb2Smrg   if (as->rank + as->corank > 0 || as->rank == -1)
272627f7eb2Smrg     {
273627f7eb2Smrg       switch (as->type)
274627f7eb2Smrg       {
275627f7eb2Smrg 	case AS_EXPLICIT:      c = "AS_EXPLICIT";      break;
276627f7eb2Smrg 	case AS_DEFERRED:      c = "AS_DEFERRED";      break;
277627f7eb2Smrg 	case AS_ASSUMED_SIZE:  c = "AS_ASSUMED_SIZE";  break;
278627f7eb2Smrg 	case AS_ASSUMED_SHAPE: c = "AS_ASSUMED_SHAPE"; break;
279627f7eb2Smrg 	case AS_ASSUMED_RANK:  c = "AS_ASSUMED_RANK";  break;
280627f7eb2Smrg 	default:
281627f7eb2Smrg 	  gfc_internal_error ("show_array_spec(): Unhandled array shape "
282627f7eb2Smrg 			      "type.");
283627f7eb2Smrg       }
284627f7eb2Smrg       fprintf (dumpfile, " %s ", c);
285627f7eb2Smrg 
286627f7eb2Smrg       for (i = 0; i < as->rank + as->corank; i++)
287627f7eb2Smrg 	{
288627f7eb2Smrg 	  show_expr (as->lower[i]);
289627f7eb2Smrg 	  fputc (' ', dumpfile);
290627f7eb2Smrg 	  show_expr (as->upper[i]);
291627f7eb2Smrg 	  fputc (' ', dumpfile);
292627f7eb2Smrg 	}
293627f7eb2Smrg     }
294627f7eb2Smrg 
295627f7eb2Smrg   fputc (')', dumpfile);
296627f7eb2Smrg }
297627f7eb2Smrg 
298627f7eb2Smrg 
299627f7eb2Smrg /* Show a gfc_array_ref array reference structure.  */
300627f7eb2Smrg 
301627f7eb2Smrg static void
show_array_ref(gfc_array_ref * ar)302627f7eb2Smrg show_array_ref (gfc_array_ref * ar)
303627f7eb2Smrg {
304627f7eb2Smrg   int i;
305627f7eb2Smrg 
306627f7eb2Smrg   fputc ('(', dumpfile);
307627f7eb2Smrg 
308627f7eb2Smrg   switch (ar->type)
309627f7eb2Smrg     {
310627f7eb2Smrg     case AR_FULL:
311627f7eb2Smrg       fputs ("FULL", dumpfile);
312627f7eb2Smrg       break;
313627f7eb2Smrg 
314627f7eb2Smrg     case AR_SECTION:
315627f7eb2Smrg       for (i = 0; i < ar->dimen; i++)
316627f7eb2Smrg 	{
317627f7eb2Smrg 	  /* There are two types of array sections: either the
318627f7eb2Smrg 	     elements are identified by an integer array ('vector'),
319627f7eb2Smrg 	     or by an index range. In the former case we only have to
320627f7eb2Smrg 	     print the start expression which contains the vector, in
321627f7eb2Smrg 	     the latter case we have to print any of lower and upper
322627f7eb2Smrg 	     bound and the stride, if they're present.  */
323627f7eb2Smrg 
324627f7eb2Smrg 	  if (ar->start[i] != NULL)
325627f7eb2Smrg 	    show_expr (ar->start[i]);
326627f7eb2Smrg 
327627f7eb2Smrg 	  if (ar->dimen_type[i] == DIMEN_RANGE)
328627f7eb2Smrg 	    {
329627f7eb2Smrg 	      fputc (':', dumpfile);
330627f7eb2Smrg 
331627f7eb2Smrg 	      if (ar->end[i] != NULL)
332627f7eb2Smrg 		show_expr (ar->end[i]);
333627f7eb2Smrg 
334627f7eb2Smrg 	      if (ar->stride[i] != NULL)
335627f7eb2Smrg 		{
336627f7eb2Smrg 		  fputc (':', dumpfile);
337627f7eb2Smrg 		  show_expr (ar->stride[i]);
338627f7eb2Smrg 		}
339627f7eb2Smrg 	    }
340627f7eb2Smrg 
341627f7eb2Smrg 	  if (i != ar->dimen - 1)
342627f7eb2Smrg 	    fputs (" , ", dumpfile);
343627f7eb2Smrg 	}
344627f7eb2Smrg       break;
345627f7eb2Smrg 
346627f7eb2Smrg     case AR_ELEMENT:
347627f7eb2Smrg       for (i = 0; i < ar->dimen; i++)
348627f7eb2Smrg 	{
349627f7eb2Smrg 	  show_expr (ar->start[i]);
350627f7eb2Smrg 	  if (i != ar->dimen - 1)
351627f7eb2Smrg 	    fputs (" , ", dumpfile);
352627f7eb2Smrg 	}
353627f7eb2Smrg       break;
354627f7eb2Smrg 
355627f7eb2Smrg     case AR_UNKNOWN:
356627f7eb2Smrg       fputs ("UNKNOWN", dumpfile);
357627f7eb2Smrg       break;
358627f7eb2Smrg 
359627f7eb2Smrg     default:
360627f7eb2Smrg       gfc_internal_error ("show_array_ref(): Unknown array reference");
361627f7eb2Smrg     }
362627f7eb2Smrg 
363627f7eb2Smrg   fputc (')', dumpfile);
364627f7eb2Smrg }
365627f7eb2Smrg 
366627f7eb2Smrg 
367627f7eb2Smrg /* Show a list of gfc_ref structures.  */
368627f7eb2Smrg 
369627f7eb2Smrg static void
show_ref(gfc_ref * p)370627f7eb2Smrg show_ref (gfc_ref *p)
371627f7eb2Smrg {
372627f7eb2Smrg   for (; p; p = p->next)
373627f7eb2Smrg     switch (p->type)
374627f7eb2Smrg       {
375627f7eb2Smrg       case REF_ARRAY:
376627f7eb2Smrg 	show_array_ref (&p->u.ar);
377627f7eb2Smrg 	break;
378627f7eb2Smrg 
379627f7eb2Smrg       case REF_COMPONENT:
380627f7eb2Smrg 	fprintf (dumpfile, " %% %s", p->u.c.component->name);
381627f7eb2Smrg 	break;
382627f7eb2Smrg 
383627f7eb2Smrg       case REF_SUBSTRING:
384627f7eb2Smrg 	fputc ('(', dumpfile);
385627f7eb2Smrg 	show_expr (p->u.ss.start);
386627f7eb2Smrg 	fputc (':', dumpfile);
387627f7eb2Smrg 	show_expr (p->u.ss.end);
388627f7eb2Smrg 	fputc (')', dumpfile);
389627f7eb2Smrg 	break;
390627f7eb2Smrg 
391627f7eb2Smrg       case REF_INQUIRY:
392627f7eb2Smrg 	switch (p->u.i)
393627f7eb2Smrg 	{
394627f7eb2Smrg 	  case INQUIRY_KIND:
395627f7eb2Smrg 	    fprintf (dumpfile, " INQUIRY_KIND ");
396627f7eb2Smrg 	    break;
397627f7eb2Smrg 	  case INQUIRY_LEN:
398627f7eb2Smrg 	    fprintf (dumpfile, " INQUIRY_LEN ");
399627f7eb2Smrg 	    break;
400627f7eb2Smrg 	  case INQUIRY_RE:
401627f7eb2Smrg 	    fprintf (dumpfile, " INQUIRY_RE ");
402627f7eb2Smrg 	    break;
403627f7eb2Smrg 	  case INQUIRY_IM:
404627f7eb2Smrg 	    fprintf (dumpfile, " INQUIRY_IM ");
405627f7eb2Smrg 	}
406627f7eb2Smrg 	break;
407627f7eb2Smrg 
408627f7eb2Smrg       default:
409627f7eb2Smrg 	gfc_internal_error ("show_ref(): Bad component code");
410627f7eb2Smrg       }
411627f7eb2Smrg }
412627f7eb2Smrg 
413627f7eb2Smrg 
414627f7eb2Smrg /* Display a constructor.  Works recursively for array constructors.  */
415627f7eb2Smrg 
416627f7eb2Smrg static void
show_constructor(gfc_constructor_base base)417627f7eb2Smrg show_constructor (gfc_constructor_base base)
418627f7eb2Smrg {
419627f7eb2Smrg   gfc_constructor *c;
420627f7eb2Smrg   for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
421627f7eb2Smrg     {
422627f7eb2Smrg       if (c->iterator == NULL)
423627f7eb2Smrg 	show_expr (c->expr);
424627f7eb2Smrg       else
425627f7eb2Smrg 	{
426627f7eb2Smrg 	  fputc ('(', dumpfile);
427627f7eb2Smrg 	  show_expr (c->expr);
428627f7eb2Smrg 
429627f7eb2Smrg 	  fputc (' ', dumpfile);
430627f7eb2Smrg 	  show_expr (c->iterator->var);
431627f7eb2Smrg 	  fputc ('=', dumpfile);
432627f7eb2Smrg 	  show_expr (c->iterator->start);
433627f7eb2Smrg 	  fputc (',', dumpfile);
434627f7eb2Smrg 	  show_expr (c->iterator->end);
435627f7eb2Smrg 	  fputc (',', dumpfile);
436627f7eb2Smrg 	  show_expr (c->iterator->step);
437627f7eb2Smrg 
438627f7eb2Smrg 	  fputc (')', dumpfile);
439627f7eb2Smrg 	}
440627f7eb2Smrg 
441627f7eb2Smrg       if (gfc_constructor_next (c) != NULL)
442627f7eb2Smrg 	fputs (" , ", dumpfile);
443627f7eb2Smrg     }
444627f7eb2Smrg }
445627f7eb2Smrg 
446627f7eb2Smrg 
447627f7eb2Smrg static void
show_char_const(const gfc_char_t * c,gfc_charlen_t length)448627f7eb2Smrg show_char_const (const gfc_char_t *c, gfc_charlen_t length)
449627f7eb2Smrg {
450627f7eb2Smrg   fputc ('\'', dumpfile);
451627f7eb2Smrg   for (size_t i = 0; i < (size_t) length; i++)
452627f7eb2Smrg     {
453627f7eb2Smrg       if (c[i] == '\'')
454627f7eb2Smrg 	fputs ("''", dumpfile);
455627f7eb2Smrg       else
456627f7eb2Smrg 	fputs (gfc_print_wide_char (c[i]), dumpfile);
457627f7eb2Smrg     }
458627f7eb2Smrg   fputc ('\'', dumpfile);
459627f7eb2Smrg }
460627f7eb2Smrg 
461627f7eb2Smrg 
462627f7eb2Smrg /* Show a component-call expression.  */
463627f7eb2Smrg 
464627f7eb2Smrg static void
show_compcall(gfc_expr * p)465627f7eb2Smrg show_compcall (gfc_expr* p)
466627f7eb2Smrg {
467627f7eb2Smrg   gcc_assert (p->expr_type == EXPR_COMPCALL);
468627f7eb2Smrg 
469627f7eb2Smrg   fprintf (dumpfile, "%s", p->symtree->n.sym->name);
470627f7eb2Smrg   show_ref (p->ref);
471627f7eb2Smrg   fprintf (dumpfile, "%s", p->value.compcall.name);
472627f7eb2Smrg 
473627f7eb2Smrg   show_actual_arglist (p->value.compcall.actual);
474627f7eb2Smrg }
475627f7eb2Smrg 
476627f7eb2Smrg 
477627f7eb2Smrg /* Show an expression.  */
478627f7eb2Smrg 
479627f7eb2Smrg static void
show_expr(gfc_expr * p)480627f7eb2Smrg show_expr (gfc_expr *p)
481627f7eb2Smrg {
482627f7eb2Smrg   const char *c;
483627f7eb2Smrg   int i;
484627f7eb2Smrg 
485627f7eb2Smrg   if (p == NULL)
486627f7eb2Smrg     {
487627f7eb2Smrg       fputs ("()", dumpfile);
488627f7eb2Smrg       return;
489627f7eb2Smrg     }
490627f7eb2Smrg 
491627f7eb2Smrg   switch (p->expr_type)
492627f7eb2Smrg     {
493627f7eb2Smrg     case EXPR_SUBSTRING:
494627f7eb2Smrg       show_char_const (p->value.character.string, p->value.character.length);
495627f7eb2Smrg       show_ref (p->ref);
496627f7eb2Smrg       break;
497627f7eb2Smrg 
498627f7eb2Smrg     case EXPR_STRUCTURE:
499627f7eb2Smrg       fprintf (dumpfile, "%s(", p->ts.u.derived->name);
500627f7eb2Smrg       show_constructor (p->value.constructor);
501627f7eb2Smrg       fputc (')', dumpfile);
502627f7eb2Smrg       break;
503627f7eb2Smrg 
504627f7eb2Smrg     case EXPR_ARRAY:
505627f7eb2Smrg       fputs ("(/ ", dumpfile);
506627f7eb2Smrg       show_constructor (p->value.constructor);
507627f7eb2Smrg       fputs (" /)", dumpfile);
508627f7eb2Smrg 
509627f7eb2Smrg       show_ref (p->ref);
510627f7eb2Smrg       break;
511627f7eb2Smrg 
512627f7eb2Smrg     case EXPR_NULL:
513627f7eb2Smrg       fputs ("NULL()", dumpfile);
514627f7eb2Smrg       break;
515627f7eb2Smrg 
516627f7eb2Smrg     case EXPR_CONSTANT:
517627f7eb2Smrg       switch (p->ts.type)
518627f7eb2Smrg 	{
519627f7eb2Smrg 	case BT_INTEGER:
520627f7eb2Smrg 	  mpz_out_str (dumpfile, 10, p->value.integer);
521627f7eb2Smrg 
522627f7eb2Smrg 	  if (p->ts.kind != gfc_default_integer_kind)
523627f7eb2Smrg 	    fprintf (dumpfile, "_%d", p->ts.kind);
524627f7eb2Smrg 	  break;
525627f7eb2Smrg 
526627f7eb2Smrg 	case BT_LOGICAL:
527627f7eb2Smrg 	  if (p->value.logical)
528627f7eb2Smrg 	    fputs (".true.", dumpfile);
529627f7eb2Smrg 	  else
530627f7eb2Smrg 	    fputs (".false.", dumpfile);
531627f7eb2Smrg 	  break;
532627f7eb2Smrg 
533627f7eb2Smrg 	case BT_REAL:
534627f7eb2Smrg 	  mpfr_out_str (dumpfile, 10, 0, p->value.real, GFC_RND_MODE);
535627f7eb2Smrg 	  if (p->ts.kind != gfc_default_real_kind)
536627f7eb2Smrg 	    fprintf (dumpfile, "_%d", p->ts.kind);
537627f7eb2Smrg 	  break;
538627f7eb2Smrg 
539627f7eb2Smrg 	case BT_CHARACTER:
540627f7eb2Smrg 	  show_char_const (p->value.character.string,
541627f7eb2Smrg 			   p->value.character.length);
542627f7eb2Smrg 	  break;
543627f7eb2Smrg 
544627f7eb2Smrg 	case BT_COMPLEX:
545627f7eb2Smrg 	  fputs ("(complex ", dumpfile);
546627f7eb2Smrg 
547627f7eb2Smrg 	  mpfr_out_str (dumpfile, 10, 0, mpc_realref (p->value.complex),
548627f7eb2Smrg 			GFC_RND_MODE);
549627f7eb2Smrg 	  if (p->ts.kind != gfc_default_complex_kind)
550627f7eb2Smrg 	    fprintf (dumpfile, "_%d", p->ts.kind);
551627f7eb2Smrg 
552627f7eb2Smrg 	  fputc (' ', dumpfile);
553627f7eb2Smrg 
554627f7eb2Smrg 	  mpfr_out_str (dumpfile, 10, 0, mpc_imagref (p->value.complex),
555627f7eb2Smrg 			GFC_RND_MODE);
556627f7eb2Smrg 	  if (p->ts.kind != gfc_default_complex_kind)
557627f7eb2Smrg 	    fprintf (dumpfile, "_%d", p->ts.kind);
558627f7eb2Smrg 
559627f7eb2Smrg 	  fputc (')', dumpfile);
560627f7eb2Smrg 	  break;
561627f7eb2Smrg 
562*4c3eb207Smrg 	case BT_BOZ:
563*4c3eb207Smrg 	  if (p->boz.rdx == 2)
564*4c3eb207Smrg 	    fputs ("b'", dumpfile);
565*4c3eb207Smrg 	  else if (p->boz.rdx == 8)
566*4c3eb207Smrg 	    fputs ("o'", dumpfile);
567*4c3eb207Smrg 	  else
568*4c3eb207Smrg 	    fputs ("z'", dumpfile);
569*4c3eb207Smrg 	  fprintf (dumpfile, "%s'", p->boz.str);
570*4c3eb207Smrg 	  break;
571*4c3eb207Smrg 
572627f7eb2Smrg 	case BT_HOLLERITH:
573627f7eb2Smrg 	  fprintf (dumpfile, HOST_WIDE_INT_PRINT_DEC "H",
574627f7eb2Smrg 		   p->representation.length);
575627f7eb2Smrg 	  c = p->representation.string;
576627f7eb2Smrg 	  for (i = 0; i < p->representation.length; i++, c++)
577627f7eb2Smrg 	    {
578627f7eb2Smrg 	      fputc (*c, dumpfile);
579627f7eb2Smrg 	    }
580627f7eb2Smrg 	  break;
581627f7eb2Smrg 
582627f7eb2Smrg 	default:
583627f7eb2Smrg 	  fputs ("???", dumpfile);
584627f7eb2Smrg 	  break;
585627f7eb2Smrg 	}
586627f7eb2Smrg 
587627f7eb2Smrg       if (p->representation.string)
588627f7eb2Smrg 	{
589627f7eb2Smrg 	  fputs (" {", dumpfile);
590627f7eb2Smrg 	  c = p->representation.string;
591627f7eb2Smrg 	  for (i = 0; i < p->representation.length; i++, c++)
592627f7eb2Smrg 	    {
593627f7eb2Smrg 	      fprintf (dumpfile, "%.2x", (unsigned int) *c);
594627f7eb2Smrg 	      if (i < p->representation.length - 1)
595627f7eb2Smrg 		fputc (',', dumpfile);
596627f7eb2Smrg 	    }
597627f7eb2Smrg 	  fputc ('}', dumpfile);
598627f7eb2Smrg 	}
599627f7eb2Smrg 
600627f7eb2Smrg       break;
601627f7eb2Smrg 
602627f7eb2Smrg     case EXPR_VARIABLE:
603627f7eb2Smrg       if (p->symtree->n.sym->ns && p->symtree->n.sym->ns->proc_name)
604627f7eb2Smrg 	fprintf (dumpfile, "%s:", p->symtree->n.sym->ns->proc_name->name);
605627f7eb2Smrg       fprintf (dumpfile, "%s", p->symtree->n.sym->name);
606627f7eb2Smrg       show_ref (p->ref);
607627f7eb2Smrg       break;
608627f7eb2Smrg 
609627f7eb2Smrg     case EXPR_OP:
610627f7eb2Smrg       fputc ('(', dumpfile);
611627f7eb2Smrg       switch (p->value.op.op)
612627f7eb2Smrg 	{
613627f7eb2Smrg 	case INTRINSIC_UPLUS:
614627f7eb2Smrg 	  fputs ("U+ ", dumpfile);
615627f7eb2Smrg 	  break;
616627f7eb2Smrg 	case INTRINSIC_UMINUS:
617627f7eb2Smrg 	  fputs ("U- ", dumpfile);
618627f7eb2Smrg 	  break;
619627f7eb2Smrg 	case INTRINSIC_PLUS:
620627f7eb2Smrg 	  fputs ("+ ", dumpfile);
621627f7eb2Smrg 	  break;
622627f7eb2Smrg 	case INTRINSIC_MINUS:
623627f7eb2Smrg 	  fputs ("- ", dumpfile);
624627f7eb2Smrg 	  break;
625627f7eb2Smrg 	case INTRINSIC_TIMES:
626627f7eb2Smrg 	  fputs ("* ", dumpfile);
627627f7eb2Smrg 	  break;
628627f7eb2Smrg 	case INTRINSIC_DIVIDE:
629627f7eb2Smrg 	  fputs ("/ ", dumpfile);
630627f7eb2Smrg 	  break;
631627f7eb2Smrg 	case INTRINSIC_POWER:
632627f7eb2Smrg 	  fputs ("** ", dumpfile);
633627f7eb2Smrg 	  break;
634627f7eb2Smrg 	case INTRINSIC_CONCAT:
635627f7eb2Smrg 	  fputs ("// ", dumpfile);
636627f7eb2Smrg 	  break;
637627f7eb2Smrg 	case INTRINSIC_AND:
638627f7eb2Smrg 	  fputs ("AND ", dumpfile);
639627f7eb2Smrg 	  break;
640627f7eb2Smrg 	case INTRINSIC_OR:
641627f7eb2Smrg 	  fputs ("OR ", dumpfile);
642627f7eb2Smrg 	  break;
643627f7eb2Smrg 	case INTRINSIC_EQV:
644627f7eb2Smrg 	  fputs ("EQV ", dumpfile);
645627f7eb2Smrg 	  break;
646627f7eb2Smrg 	case INTRINSIC_NEQV:
647627f7eb2Smrg 	  fputs ("NEQV ", dumpfile);
648627f7eb2Smrg 	  break;
649627f7eb2Smrg 	case INTRINSIC_EQ:
650627f7eb2Smrg 	case INTRINSIC_EQ_OS:
651627f7eb2Smrg 	  fputs ("= ", dumpfile);
652627f7eb2Smrg 	  break;
653627f7eb2Smrg 	case INTRINSIC_NE:
654627f7eb2Smrg 	case INTRINSIC_NE_OS:
655627f7eb2Smrg 	  fputs ("/= ", dumpfile);
656627f7eb2Smrg 	  break;
657627f7eb2Smrg 	case INTRINSIC_GT:
658627f7eb2Smrg 	case INTRINSIC_GT_OS:
659627f7eb2Smrg 	  fputs ("> ", dumpfile);
660627f7eb2Smrg 	  break;
661627f7eb2Smrg 	case INTRINSIC_GE:
662627f7eb2Smrg 	case INTRINSIC_GE_OS:
663627f7eb2Smrg 	  fputs (">= ", dumpfile);
664627f7eb2Smrg 	  break;
665627f7eb2Smrg 	case INTRINSIC_LT:
666627f7eb2Smrg 	case INTRINSIC_LT_OS:
667627f7eb2Smrg 	  fputs ("< ", dumpfile);
668627f7eb2Smrg 	  break;
669627f7eb2Smrg 	case INTRINSIC_LE:
670627f7eb2Smrg 	case INTRINSIC_LE_OS:
671627f7eb2Smrg 	  fputs ("<= ", dumpfile);
672627f7eb2Smrg 	  break;
673627f7eb2Smrg 	case INTRINSIC_NOT:
674627f7eb2Smrg 	  fputs ("NOT ", dumpfile);
675627f7eb2Smrg 	  break;
676627f7eb2Smrg 	case INTRINSIC_PARENTHESES:
677627f7eb2Smrg 	  fputs ("parens ", dumpfile);
678627f7eb2Smrg 	  break;
679627f7eb2Smrg 
680627f7eb2Smrg 	default:
681627f7eb2Smrg 	  gfc_internal_error
682627f7eb2Smrg 	    ("show_expr(): Bad intrinsic in expression");
683627f7eb2Smrg 	}
684627f7eb2Smrg 
685627f7eb2Smrg       show_expr (p->value.op.op1);
686627f7eb2Smrg 
687627f7eb2Smrg       if (p->value.op.op2)
688627f7eb2Smrg 	{
689627f7eb2Smrg 	  fputc (' ', dumpfile);
690627f7eb2Smrg 	  show_expr (p->value.op.op2);
691627f7eb2Smrg 	}
692627f7eb2Smrg 
693627f7eb2Smrg       fputc (')', dumpfile);
694627f7eb2Smrg       break;
695627f7eb2Smrg 
696627f7eb2Smrg     case EXPR_FUNCTION:
697627f7eb2Smrg       if (p->value.function.name == NULL)
698627f7eb2Smrg 	{
699627f7eb2Smrg 	  fprintf (dumpfile, "%s", p->symtree->n.sym->name);
700627f7eb2Smrg 	  if (gfc_is_proc_ptr_comp (p))
701627f7eb2Smrg 	    show_ref (p->ref);
702627f7eb2Smrg 	  fputc ('[', dumpfile);
703627f7eb2Smrg 	  show_actual_arglist (p->value.function.actual);
704627f7eb2Smrg 	  fputc (']', dumpfile);
705627f7eb2Smrg 	}
706627f7eb2Smrg       else
707627f7eb2Smrg 	{
708627f7eb2Smrg 	  fprintf (dumpfile, "%s", p->value.function.name);
709627f7eb2Smrg 	  if (gfc_is_proc_ptr_comp (p))
710627f7eb2Smrg 	    show_ref (p->ref);
711627f7eb2Smrg 	  fputc ('[', dumpfile);
712627f7eb2Smrg 	  fputc ('[', dumpfile);
713627f7eb2Smrg 	  show_actual_arglist (p->value.function.actual);
714627f7eb2Smrg 	  fputc (']', dumpfile);
715627f7eb2Smrg 	  fputc (']', dumpfile);
716627f7eb2Smrg 	}
717627f7eb2Smrg 
718627f7eb2Smrg       break;
719627f7eb2Smrg 
720627f7eb2Smrg     case EXPR_COMPCALL:
721627f7eb2Smrg       show_compcall (p);
722627f7eb2Smrg       break;
723627f7eb2Smrg 
724627f7eb2Smrg     default:
725627f7eb2Smrg       gfc_internal_error ("show_expr(): Don't know how to show expr");
726627f7eb2Smrg     }
727627f7eb2Smrg }
728627f7eb2Smrg 
729627f7eb2Smrg /* Show symbol attributes.  The flavor and intent are followed by
730627f7eb2Smrg    whatever single bit attributes are present.  */
731627f7eb2Smrg 
732627f7eb2Smrg static void
show_attr(symbol_attribute * attr,const char * module)733627f7eb2Smrg show_attr (symbol_attribute *attr, const char * module)
734627f7eb2Smrg {
735627f7eb2Smrg   if (attr->flavor != FL_UNKNOWN)
736627f7eb2Smrg     {
737627f7eb2Smrg       if (attr->flavor == FL_DERIVED && attr->pdt_template)
738*4c3eb207Smrg 	fputs (" (PDT-TEMPLATE", dumpfile);
739627f7eb2Smrg       else
740627f7eb2Smrg     fprintf (dumpfile, "(%s ", gfc_code2string (flavors, attr->flavor));
741627f7eb2Smrg     }
742627f7eb2Smrg   if (attr->access != ACCESS_UNKNOWN)
743627f7eb2Smrg     fprintf (dumpfile, "%s ", gfc_code2string (access_types, attr->access));
744627f7eb2Smrg   if (attr->proc != PROC_UNKNOWN)
745627f7eb2Smrg     fprintf (dumpfile, "%s ", gfc_code2string (procedures, attr->proc));
746627f7eb2Smrg   if (attr->save != SAVE_NONE)
747627f7eb2Smrg     fprintf (dumpfile, "%s", gfc_code2string (save_status, attr->save));
748627f7eb2Smrg 
749627f7eb2Smrg   if (attr->artificial)
750627f7eb2Smrg     fputs (" ARTIFICIAL", dumpfile);
751627f7eb2Smrg   if (attr->allocatable)
752627f7eb2Smrg     fputs (" ALLOCATABLE", dumpfile);
753627f7eb2Smrg   if (attr->asynchronous)
754627f7eb2Smrg     fputs (" ASYNCHRONOUS", dumpfile);
755627f7eb2Smrg   if (attr->codimension)
756627f7eb2Smrg     fputs (" CODIMENSION", dumpfile);
757627f7eb2Smrg   if (attr->dimension)
758627f7eb2Smrg     fputs (" DIMENSION", dumpfile);
759627f7eb2Smrg   if (attr->contiguous)
760627f7eb2Smrg     fputs (" CONTIGUOUS", dumpfile);
761627f7eb2Smrg   if (attr->external)
762627f7eb2Smrg     fputs (" EXTERNAL", dumpfile);
763627f7eb2Smrg   if (attr->intrinsic)
764627f7eb2Smrg     fputs (" INTRINSIC", dumpfile);
765627f7eb2Smrg   if (attr->optional)
766627f7eb2Smrg     fputs (" OPTIONAL", dumpfile);
767627f7eb2Smrg   if (attr->pdt_kind)
768627f7eb2Smrg     fputs (" KIND", dumpfile);
769627f7eb2Smrg   if (attr->pdt_len)
770627f7eb2Smrg     fputs (" LEN", dumpfile);
771627f7eb2Smrg   if (attr->pointer)
772627f7eb2Smrg     fputs (" POINTER", dumpfile);
773*4c3eb207Smrg   if (attr->subref_array_pointer)
774*4c3eb207Smrg     fputs (" SUBREF-ARRAY-POINTER", dumpfile);
775*4c3eb207Smrg   if (attr->cray_pointer)
776*4c3eb207Smrg     fputs (" CRAY-POINTER", dumpfile);
777*4c3eb207Smrg   if (attr->cray_pointee)
778*4c3eb207Smrg     fputs (" CRAY-POINTEE", dumpfile);
779627f7eb2Smrg   if (attr->is_protected)
780627f7eb2Smrg     fputs (" PROTECTED", dumpfile);
781627f7eb2Smrg   if (attr->value)
782627f7eb2Smrg     fputs (" VALUE", dumpfile);
783627f7eb2Smrg   if (attr->volatile_)
784627f7eb2Smrg     fputs (" VOLATILE", dumpfile);
785627f7eb2Smrg   if (attr->threadprivate)
786627f7eb2Smrg     fputs (" THREADPRIVATE", dumpfile);
787627f7eb2Smrg   if (attr->target)
788627f7eb2Smrg     fputs (" TARGET", dumpfile);
789627f7eb2Smrg   if (attr->dummy)
790627f7eb2Smrg     {
791627f7eb2Smrg       fputs (" DUMMY", dumpfile);
792627f7eb2Smrg       if (attr->intent != INTENT_UNKNOWN)
793627f7eb2Smrg 	fprintf (dumpfile, "(%s)", gfc_intent_string (attr->intent));
794627f7eb2Smrg     }
795627f7eb2Smrg 
796627f7eb2Smrg   if (attr->result)
797627f7eb2Smrg     fputs (" RESULT", dumpfile);
798627f7eb2Smrg   if (attr->entry)
799627f7eb2Smrg     fputs (" ENTRY", dumpfile);
800*4c3eb207Smrg   if (attr->entry_master)
801*4c3eb207Smrg     fputs (" ENTRY-MASTER", dumpfile);
802*4c3eb207Smrg   if (attr->mixed_entry_master)
803*4c3eb207Smrg     fputs (" MIXED-ENTRY-MASTER", dumpfile);
804627f7eb2Smrg   if (attr->is_bind_c)
805627f7eb2Smrg     fputs (" BIND(C)", dumpfile);
806627f7eb2Smrg 
807627f7eb2Smrg   if (attr->data)
808627f7eb2Smrg     fputs (" DATA", dumpfile);
809627f7eb2Smrg   if (attr->use_assoc)
810627f7eb2Smrg     {
811627f7eb2Smrg       fputs (" USE-ASSOC", dumpfile);
812627f7eb2Smrg       if (module != NULL)
813627f7eb2Smrg 	fprintf (dumpfile, "(%s)", module);
814627f7eb2Smrg     }
815627f7eb2Smrg 
816627f7eb2Smrg   if (attr->in_namelist)
817627f7eb2Smrg     fputs (" IN-NAMELIST", dumpfile);
818627f7eb2Smrg   if (attr->in_common)
819627f7eb2Smrg     fputs (" IN-COMMON", dumpfile);
820627f7eb2Smrg 
821627f7eb2Smrg   if (attr->abstract)
822627f7eb2Smrg     fputs (" ABSTRACT", dumpfile);
823627f7eb2Smrg   if (attr->function)
824627f7eb2Smrg     fputs (" FUNCTION", dumpfile);
825627f7eb2Smrg   if (attr->subroutine)
826627f7eb2Smrg     fputs (" SUBROUTINE", dumpfile);
827627f7eb2Smrg   if (attr->implicit_type)
828627f7eb2Smrg     fputs (" IMPLICIT-TYPE", dumpfile);
829627f7eb2Smrg 
830627f7eb2Smrg   if (attr->sequence)
831627f7eb2Smrg     fputs (" SEQUENCE", dumpfile);
832*4c3eb207Smrg   if (attr->alloc_comp)
833*4c3eb207Smrg     fputs (" ALLOC-COMP", dumpfile);
834*4c3eb207Smrg   if (attr->pointer_comp)
835*4c3eb207Smrg     fputs (" POINTER-COMP", dumpfile);
836*4c3eb207Smrg   if (attr->proc_pointer_comp)
837*4c3eb207Smrg     fputs (" PROC-POINTER-COMP", dumpfile);
838*4c3eb207Smrg   if (attr->private_comp)
839*4c3eb207Smrg     fputs (" PRIVATE-COMP", dumpfile);
840*4c3eb207Smrg   if (attr->zero_comp)
841*4c3eb207Smrg     fputs (" ZERO-COMP", dumpfile);
842*4c3eb207Smrg   if (attr->coarray_comp)
843*4c3eb207Smrg     fputs (" COARRAY-COMP", dumpfile);
844*4c3eb207Smrg   if (attr->lock_comp)
845*4c3eb207Smrg     fputs (" LOCK-COMP", dumpfile);
846*4c3eb207Smrg   if (attr->event_comp)
847*4c3eb207Smrg     fputs (" EVENT-COMP", dumpfile);
848*4c3eb207Smrg   if (attr->defined_assign_comp)
849*4c3eb207Smrg     fputs (" DEFINED-ASSIGNED-COMP", dumpfile);
850*4c3eb207Smrg   if (attr->unlimited_polymorphic)
851*4c3eb207Smrg     fputs (" UNLIMITED-POLYMORPHIC", dumpfile);
852*4c3eb207Smrg   if (attr->has_dtio_procs)
853*4c3eb207Smrg     fputs (" HAS-DTIO-PROCS", dumpfile);
854*4c3eb207Smrg   if (attr->caf_token)
855*4c3eb207Smrg     fputs (" CAF-TOKEN", dumpfile);
856*4c3eb207Smrg   if (attr->select_type_temporary)
857*4c3eb207Smrg     fputs (" SELECT-TYPE-TEMPORARY", dumpfile);
858*4c3eb207Smrg   if (attr->associate_var)
859*4c3eb207Smrg     fputs (" ASSOCIATE-VAR", dumpfile);
860*4c3eb207Smrg   if (attr->pdt_kind)
861*4c3eb207Smrg     fputs (" PDT-KIND", dumpfile);
862*4c3eb207Smrg   if (attr->pdt_len)
863*4c3eb207Smrg     fputs (" PDT-LEN", dumpfile);
864*4c3eb207Smrg   if (attr->pdt_type)
865*4c3eb207Smrg     fputs (" PDT-TYPE", dumpfile);
866*4c3eb207Smrg   if (attr->pdt_array)
867*4c3eb207Smrg     fputs (" PDT-ARRAY", dumpfile);
868*4c3eb207Smrg   if (attr->pdt_string)
869*4c3eb207Smrg     fputs (" PDT-STRING", dumpfile);
870*4c3eb207Smrg   if (attr->omp_udr_artificial_var)
871*4c3eb207Smrg     fputs (" OMP-UDT-ARTIFICIAL-VAR", dumpfile);
872*4c3eb207Smrg   if (attr->omp_declare_target)
873*4c3eb207Smrg     fputs (" OMP-DECLARE-TARGET", dumpfile);
874*4c3eb207Smrg   if (attr->omp_declare_target_link)
875*4c3eb207Smrg     fputs (" OMP-DECLARE-TARGET-LINK", dumpfile);
876627f7eb2Smrg   if (attr->elemental)
877627f7eb2Smrg     fputs (" ELEMENTAL", dumpfile);
878627f7eb2Smrg   if (attr->pure)
879627f7eb2Smrg     fputs (" PURE", dumpfile);
880627f7eb2Smrg   if (attr->implicit_pure)
881*4c3eb207Smrg     fputs (" IMPLICIT-PURE", dumpfile);
882627f7eb2Smrg   if (attr->recursive)
883627f7eb2Smrg     fputs (" RECURSIVE", dumpfile);
884*4c3eb207Smrg   if (attr->unmaskable)
885*4c3eb207Smrg     fputs (" UNMASKABKE", dumpfile);
886*4c3eb207Smrg   if (attr->masked)
887*4c3eb207Smrg     fputs (" MASKED", dumpfile);
888*4c3eb207Smrg   if (attr->contained)
889*4c3eb207Smrg     fputs (" CONTAINED", dumpfile);
890*4c3eb207Smrg   if (attr->mod_proc)
891*4c3eb207Smrg     fputs (" MOD-PROC", dumpfile);
892*4c3eb207Smrg   if (attr->module_procedure)
893*4c3eb207Smrg     fputs (" MODULE-PROCEDURE", dumpfile);
894*4c3eb207Smrg   if (attr->public_used)
895*4c3eb207Smrg     fputs (" PUBLIC_USED", dumpfile);
896*4c3eb207Smrg   if (attr->array_outer_dependency)
897*4c3eb207Smrg     fputs (" ARRAY-OUTER-DEPENDENCY", dumpfile);
898*4c3eb207Smrg   if (attr->noreturn)
899*4c3eb207Smrg     fputs (" NORETURN", dumpfile);
900*4c3eb207Smrg   if (attr->always_explicit)
901*4c3eb207Smrg     fputs (" ALWAYS-EXPLICIT", dumpfile);
902*4c3eb207Smrg   if (attr->is_main_program)
903*4c3eb207Smrg     fputs (" IS-MAIN-PROGRAM", dumpfile);
904627f7eb2Smrg 
905*4c3eb207Smrg   /* FIXME: Still missing are oacc_routine_lop and ext_attr.  */
906627f7eb2Smrg   fputc (')', dumpfile);
907627f7eb2Smrg }
908627f7eb2Smrg 
909627f7eb2Smrg 
910627f7eb2Smrg /* Show components of a derived type.  */
911627f7eb2Smrg 
912627f7eb2Smrg static void
show_components(gfc_symbol * sym)913627f7eb2Smrg show_components (gfc_symbol *sym)
914627f7eb2Smrg {
915627f7eb2Smrg   gfc_component *c;
916627f7eb2Smrg 
917627f7eb2Smrg   for (c = sym->components; c; c = c->next)
918627f7eb2Smrg     {
919627f7eb2Smrg       show_indent ();
920627f7eb2Smrg       fprintf (dumpfile, "(%s ", c->name);
921627f7eb2Smrg       show_typespec (&c->ts);
922627f7eb2Smrg       if (c->kind_expr)
923627f7eb2Smrg 	{
924627f7eb2Smrg 	  fputs (" kind_expr: ", dumpfile);
925627f7eb2Smrg 	  show_expr (c->kind_expr);
926627f7eb2Smrg 	}
927627f7eb2Smrg       if (c->param_list)
928627f7eb2Smrg 	{
929627f7eb2Smrg 	  fputs ("PDT parameters", dumpfile);
930627f7eb2Smrg 	  show_actual_arglist (c->param_list);
931627f7eb2Smrg 	}
932627f7eb2Smrg 
933627f7eb2Smrg       if (c->attr.allocatable)
934627f7eb2Smrg 	fputs (" ALLOCATABLE", dumpfile);
935627f7eb2Smrg       if (c->attr.pdt_kind)
936627f7eb2Smrg 	fputs (" KIND", dumpfile);
937627f7eb2Smrg       if (c->attr.pdt_len)
938627f7eb2Smrg 	fputs (" LEN", dumpfile);
939627f7eb2Smrg       if (c->attr.pointer)
940627f7eb2Smrg 	fputs (" POINTER", dumpfile);
941627f7eb2Smrg       if (c->attr.proc_pointer)
942627f7eb2Smrg 	fputs (" PPC", dumpfile);
943627f7eb2Smrg       if (c->attr.dimension)
944627f7eb2Smrg 	fputs (" DIMENSION", dumpfile);
945627f7eb2Smrg       fputc (' ', dumpfile);
946627f7eb2Smrg       show_array_spec (c->as);
947627f7eb2Smrg       if (c->attr.access)
948627f7eb2Smrg 	fprintf (dumpfile, " %s", gfc_code2string (access_types, c->attr.access));
949627f7eb2Smrg       fputc (')', dumpfile);
950627f7eb2Smrg       if (c->next != NULL)
951627f7eb2Smrg 	fputc (' ', dumpfile);
952627f7eb2Smrg     }
953627f7eb2Smrg }
954627f7eb2Smrg 
955627f7eb2Smrg 
956627f7eb2Smrg /* Show the f2k_derived namespace with procedure bindings.  */
957627f7eb2Smrg 
958627f7eb2Smrg static void
show_typebound_proc(gfc_typebound_proc * tb,const char * name)959627f7eb2Smrg show_typebound_proc (gfc_typebound_proc* tb, const char* name)
960627f7eb2Smrg {
961627f7eb2Smrg   show_indent ();
962627f7eb2Smrg 
963627f7eb2Smrg   if (tb->is_generic)
964627f7eb2Smrg     fputs ("GENERIC", dumpfile);
965627f7eb2Smrg   else
966627f7eb2Smrg     {
967627f7eb2Smrg       fputs ("PROCEDURE, ", dumpfile);
968627f7eb2Smrg       if (tb->nopass)
969627f7eb2Smrg 	fputs ("NOPASS", dumpfile);
970627f7eb2Smrg       else
971627f7eb2Smrg 	{
972627f7eb2Smrg 	  if (tb->pass_arg)
973627f7eb2Smrg 	    fprintf (dumpfile, "PASS(%s)", tb->pass_arg);
974627f7eb2Smrg 	  else
975627f7eb2Smrg 	    fputs ("PASS", dumpfile);
976627f7eb2Smrg 	}
977627f7eb2Smrg       if (tb->non_overridable)
978627f7eb2Smrg 	fputs (", NON_OVERRIDABLE", dumpfile);
979627f7eb2Smrg     }
980627f7eb2Smrg 
981627f7eb2Smrg   if (tb->access == ACCESS_PUBLIC)
982627f7eb2Smrg     fputs (", PUBLIC", dumpfile);
983627f7eb2Smrg   else
984627f7eb2Smrg     fputs (", PRIVATE", dumpfile);
985627f7eb2Smrg 
986627f7eb2Smrg   fprintf (dumpfile, " :: %s => ", name);
987627f7eb2Smrg 
988627f7eb2Smrg   if (tb->is_generic)
989627f7eb2Smrg     {
990627f7eb2Smrg       gfc_tbp_generic* g;
991627f7eb2Smrg       for (g = tb->u.generic; g; g = g->next)
992627f7eb2Smrg 	{
993627f7eb2Smrg 	  fputs (g->specific_st->name, dumpfile);
994627f7eb2Smrg 	  if (g->next)
995627f7eb2Smrg 	    fputs (", ", dumpfile);
996627f7eb2Smrg 	}
997627f7eb2Smrg     }
998627f7eb2Smrg   else
999627f7eb2Smrg     fputs (tb->u.specific->n.sym->name, dumpfile);
1000627f7eb2Smrg }
1001627f7eb2Smrg 
1002627f7eb2Smrg static void
show_typebound_symtree(gfc_symtree * st)1003627f7eb2Smrg show_typebound_symtree (gfc_symtree* st)
1004627f7eb2Smrg {
1005627f7eb2Smrg   gcc_assert (st->n.tb);
1006627f7eb2Smrg   show_typebound_proc (st->n.tb, st->name);
1007627f7eb2Smrg }
1008627f7eb2Smrg 
1009627f7eb2Smrg static void
show_f2k_derived(gfc_namespace * f2k)1010627f7eb2Smrg show_f2k_derived (gfc_namespace* f2k)
1011627f7eb2Smrg {
1012627f7eb2Smrg   gfc_finalizer* f;
1013627f7eb2Smrg   int op;
1014627f7eb2Smrg 
1015627f7eb2Smrg   show_indent ();
1016627f7eb2Smrg   fputs ("Procedure bindings:", dumpfile);
1017627f7eb2Smrg   ++show_level;
1018627f7eb2Smrg 
1019627f7eb2Smrg   /* Finalizer bindings.  */
1020627f7eb2Smrg   for (f = f2k->finalizers; f; f = f->next)
1021627f7eb2Smrg     {
1022627f7eb2Smrg       show_indent ();
1023627f7eb2Smrg       fprintf (dumpfile, "FINAL %s", f->proc_tree->n.sym->name);
1024627f7eb2Smrg     }
1025627f7eb2Smrg 
1026627f7eb2Smrg   /* Type-bound procedures.  */
1027627f7eb2Smrg   gfc_traverse_symtree (f2k->tb_sym_root, &show_typebound_symtree);
1028627f7eb2Smrg 
1029627f7eb2Smrg   --show_level;
1030627f7eb2Smrg 
1031627f7eb2Smrg   show_indent ();
1032627f7eb2Smrg   fputs ("Operator bindings:", dumpfile);
1033627f7eb2Smrg   ++show_level;
1034627f7eb2Smrg 
1035627f7eb2Smrg   /* User-defined operators.  */
1036627f7eb2Smrg   gfc_traverse_symtree (f2k->tb_uop_root, &show_typebound_symtree);
1037627f7eb2Smrg 
1038627f7eb2Smrg   /* Intrinsic operators.  */
1039627f7eb2Smrg   for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; ++op)
1040627f7eb2Smrg     if (f2k->tb_op[op])
1041627f7eb2Smrg       show_typebound_proc (f2k->tb_op[op],
1042627f7eb2Smrg 			   gfc_op2string ((gfc_intrinsic_op) op));
1043627f7eb2Smrg 
1044627f7eb2Smrg   --show_level;
1045627f7eb2Smrg }
1046627f7eb2Smrg 
1047627f7eb2Smrg 
1048627f7eb2Smrg /* Show a symbol.  If a symbol is an ENTRY, SUBROUTINE or FUNCTION, we
1049627f7eb2Smrg    show the interface.  Information needed to reconstruct the list of
1050627f7eb2Smrg    specific interfaces associated with a generic symbol is done within
1051627f7eb2Smrg    that symbol.  */
1052627f7eb2Smrg 
1053627f7eb2Smrg static void
show_symbol(gfc_symbol * sym)1054627f7eb2Smrg show_symbol (gfc_symbol *sym)
1055627f7eb2Smrg {
1056627f7eb2Smrg   gfc_formal_arglist *formal;
1057627f7eb2Smrg   gfc_interface *intr;
1058627f7eb2Smrg   int i,len;
1059627f7eb2Smrg 
1060627f7eb2Smrg   if (sym == NULL)
1061627f7eb2Smrg     return;
1062627f7eb2Smrg 
1063627f7eb2Smrg   fprintf (dumpfile, "|| symbol: '%s' ", sym->name);
1064627f7eb2Smrg   len = strlen (sym->name);
1065627f7eb2Smrg   for (i=len; i<12; i++)
1066627f7eb2Smrg     fputc(' ', dumpfile);
1067627f7eb2Smrg 
1068627f7eb2Smrg   if (sym->binding_label)
1069627f7eb2Smrg       fprintf (dumpfile,"|| binding_label: '%s' ", sym->binding_label);
1070627f7eb2Smrg 
1071627f7eb2Smrg   ++show_level;
1072627f7eb2Smrg 
1073627f7eb2Smrg   show_indent ();
1074627f7eb2Smrg   fputs ("type spec : ", dumpfile);
1075627f7eb2Smrg   show_typespec (&sym->ts);
1076627f7eb2Smrg 
1077627f7eb2Smrg   show_indent ();
1078627f7eb2Smrg   fputs ("attributes: ", dumpfile);
1079627f7eb2Smrg   show_attr (&sym->attr, sym->module);
1080627f7eb2Smrg 
1081627f7eb2Smrg   if (sym->value)
1082627f7eb2Smrg     {
1083627f7eb2Smrg       show_indent ();
1084627f7eb2Smrg       fputs ("value: ", dumpfile);
1085627f7eb2Smrg       show_expr (sym->value);
1086627f7eb2Smrg     }
1087627f7eb2Smrg 
1088*4c3eb207Smrg   if (sym->ts.type != BT_CLASS && sym->as)
1089627f7eb2Smrg     {
1090627f7eb2Smrg       show_indent ();
1091627f7eb2Smrg       fputs ("Array spec:", dumpfile);
1092627f7eb2Smrg       show_array_spec (sym->as);
1093627f7eb2Smrg     }
1094*4c3eb207Smrg   else if (sym->ts.type == BT_CLASS && CLASS_DATA (sym)->as)
1095*4c3eb207Smrg     {
1096*4c3eb207Smrg       show_indent ();
1097*4c3eb207Smrg       fputs ("Array spec:", dumpfile);
1098*4c3eb207Smrg       show_array_spec (CLASS_DATA (sym)->as);
1099*4c3eb207Smrg     }
1100627f7eb2Smrg 
1101627f7eb2Smrg   if (sym->generic)
1102627f7eb2Smrg     {
1103627f7eb2Smrg       show_indent ();
1104627f7eb2Smrg       fputs ("Generic interfaces:", dumpfile);
1105627f7eb2Smrg       for (intr = sym->generic; intr; intr = intr->next)
1106627f7eb2Smrg 	fprintf (dumpfile, " %s", intr->sym->name);
1107627f7eb2Smrg     }
1108627f7eb2Smrg 
1109627f7eb2Smrg   if (sym->result)
1110627f7eb2Smrg     {
1111627f7eb2Smrg       show_indent ();
1112627f7eb2Smrg       fprintf (dumpfile, "result: %s", sym->result->name);
1113627f7eb2Smrg     }
1114627f7eb2Smrg 
1115627f7eb2Smrg   if (sym->components)
1116627f7eb2Smrg     {
1117627f7eb2Smrg       show_indent ();
1118627f7eb2Smrg       fputs ("components: ", dumpfile);
1119627f7eb2Smrg       show_components (sym);
1120627f7eb2Smrg     }
1121627f7eb2Smrg 
1122627f7eb2Smrg   if (sym->f2k_derived)
1123627f7eb2Smrg     {
1124627f7eb2Smrg       show_indent ();
1125627f7eb2Smrg       if (sym->hash_value)
1126627f7eb2Smrg 	fprintf (dumpfile, "hash: %d", sym->hash_value);
1127627f7eb2Smrg       show_f2k_derived (sym->f2k_derived);
1128627f7eb2Smrg     }
1129627f7eb2Smrg 
1130627f7eb2Smrg   if (sym->formal)
1131627f7eb2Smrg     {
1132627f7eb2Smrg       show_indent ();
1133627f7eb2Smrg       fputs ("Formal arglist:", dumpfile);
1134627f7eb2Smrg 
1135627f7eb2Smrg       for (formal = sym->formal; formal; formal = formal->next)
1136627f7eb2Smrg 	{
1137627f7eb2Smrg 	  if (formal->sym != NULL)
1138627f7eb2Smrg 	    fprintf (dumpfile, " %s", formal->sym->name);
1139627f7eb2Smrg 	  else
1140627f7eb2Smrg 	    fputs (" [Alt Return]", dumpfile);
1141627f7eb2Smrg 	}
1142627f7eb2Smrg     }
1143627f7eb2Smrg 
1144627f7eb2Smrg   if (sym->formal_ns && (sym->formal_ns->proc_name != sym)
1145627f7eb2Smrg       && sym->attr.proc != PROC_ST_FUNCTION
1146627f7eb2Smrg       && !sym->attr.entry)
1147627f7eb2Smrg     {
1148627f7eb2Smrg       show_indent ();
1149627f7eb2Smrg       fputs ("Formal namespace", dumpfile);
1150627f7eb2Smrg       show_namespace (sym->formal_ns);
1151627f7eb2Smrg     }
1152627f7eb2Smrg 
1153627f7eb2Smrg   if (sym->attr.flavor == FL_VARIABLE
1154627f7eb2Smrg       && sym->param_list)
1155627f7eb2Smrg     {
1156627f7eb2Smrg       show_indent ();
1157627f7eb2Smrg       fputs ("PDT parameters", dumpfile);
1158627f7eb2Smrg       show_actual_arglist (sym->param_list);
1159627f7eb2Smrg     }
1160627f7eb2Smrg 
1161627f7eb2Smrg   if (sym->attr.flavor == FL_NAMELIST)
1162627f7eb2Smrg     {
1163627f7eb2Smrg       gfc_namelist *nl;
1164627f7eb2Smrg       show_indent ();
1165627f7eb2Smrg       fputs ("variables : ", dumpfile);
1166627f7eb2Smrg       for (nl = sym->namelist; nl; nl = nl->next)
1167627f7eb2Smrg 	fprintf (dumpfile, " %s",nl->sym->name);
1168627f7eb2Smrg     }
1169627f7eb2Smrg 
1170627f7eb2Smrg   --show_level;
1171627f7eb2Smrg }
1172627f7eb2Smrg 
1173627f7eb2Smrg 
1174627f7eb2Smrg /* Show a user-defined operator.  Just prints an operator
1175627f7eb2Smrg    and the name of the associated subroutine, really.  */
1176627f7eb2Smrg 
1177627f7eb2Smrg static void
show_uop(gfc_user_op * uop)1178627f7eb2Smrg show_uop (gfc_user_op *uop)
1179627f7eb2Smrg {
1180627f7eb2Smrg   gfc_interface *intr;
1181627f7eb2Smrg 
1182627f7eb2Smrg   show_indent ();
1183627f7eb2Smrg   fprintf (dumpfile, "%s:", uop->name);
1184627f7eb2Smrg 
1185627f7eb2Smrg   for (intr = uop->op; intr; intr = intr->next)
1186627f7eb2Smrg     fprintf (dumpfile, " %s", intr->sym->name);
1187627f7eb2Smrg }
1188627f7eb2Smrg 
1189627f7eb2Smrg 
1190627f7eb2Smrg /* Workhorse function for traversing the user operator symtree.  */
1191627f7eb2Smrg 
1192627f7eb2Smrg static void
traverse_uop(gfc_symtree * st,void (* func)(gfc_user_op *))1193627f7eb2Smrg traverse_uop (gfc_symtree *st, void (*func) (gfc_user_op *))
1194627f7eb2Smrg {
1195627f7eb2Smrg   if (st == NULL)
1196627f7eb2Smrg     return;
1197627f7eb2Smrg 
1198627f7eb2Smrg   (*func) (st->n.uop);
1199627f7eb2Smrg 
1200627f7eb2Smrg   traverse_uop (st->left, func);
1201627f7eb2Smrg   traverse_uop (st->right, func);
1202627f7eb2Smrg }
1203627f7eb2Smrg 
1204627f7eb2Smrg 
1205627f7eb2Smrg /* Traverse the tree of user operator nodes.  */
1206627f7eb2Smrg 
1207627f7eb2Smrg void
gfc_traverse_user_op(gfc_namespace * ns,void (* func)(gfc_user_op *))1208627f7eb2Smrg gfc_traverse_user_op (gfc_namespace *ns, void (*func) (gfc_user_op *))
1209627f7eb2Smrg {
1210627f7eb2Smrg   traverse_uop (ns->uop_root, func);
1211627f7eb2Smrg }
1212627f7eb2Smrg 
1213627f7eb2Smrg 
1214627f7eb2Smrg /* Function to display a common block.  */
1215627f7eb2Smrg 
1216627f7eb2Smrg static void
show_common(gfc_symtree * st)1217627f7eb2Smrg show_common (gfc_symtree *st)
1218627f7eb2Smrg {
1219627f7eb2Smrg   gfc_symbol *s;
1220627f7eb2Smrg 
1221627f7eb2Smrg   show_indent ();
1222627f7eb2Smrg   fprintf (dumpfile, "common: /%s/ ", st->name);
1223627f7eb2Smrg 
1224627f7eb2Smrg   s = st->n.common->head;
1225627f7eb2Smrg   while (s)
1226627f7eb2Smrg     {
1227627f7eb2Smrg       fprintf (dumpfile, "%s", s->name);
1228627f7eb2Smrg       s = s->common_next;
1229627f7eb2Smrg       if (s)
1230627f7eb2Smrg 	fputs (", ", dumpfile);
1231627f7eb2Smrg     }
1232627f7eb2Smrg   fputc ('\n', dumpfile);
1233627f7eb2Smrg }
1234627f7eb2Smrg 
1235627f7eb2Smrg 
1236627f7eb2Smrg /* Worker function to display the symbol tree.  */
1237627f7eb2Smrg 
1238627f7eb2Smrg static void
show_symtree(gfc_symtree * st)1239627f7eb2Smrg show_symtree (gfc_symtree *st)
1240627f7eb2Smrg {
1241627f7eb2Smrg   int len, i;
1242627f7eb2Smrg 
1243627f7eb2Smrg   show_indent ();
1244627f7eb2Smrg 
1245627f7eb2Smrg   len = strlen(st->name);
1246627f7eb2Smrg   fprintf (dumpfile, "symtree: '%s'", st->name);
1247627f7eb2Smrg 
1248627f7eb2Smrg   for (i=len; i<12; i++)
1249627f7eb2Smrg     fputc(' ', dumpfile);
1250627f7eb2Smrg 
1251627f7eb2Smrg   if (st->ambiguous)
1252627f7eb2Smrg     fputs( " Ambiguous", dumpfile);
1253627f7eb2Smrg 
1254627f7eb2Smrg   if (st->n.sym->ns != gfc_current_ns)
1255627f7eb2Smrg     fprintf (dumpfile, "|| symbol: '%s' from namespace '%s'", st->n.sym->name,
1256627f7eb2Smrg 	     st->n.sym->ns->proc_name->name);
1257627f7eb2Smrg   else
1258627f7eb2Smrg     show_symbol (st->n.sym);
1259627f7eb2Smrg }
1260627f7eb2Smrg 
1261627f7eb2Smrg 
1262627f7eb2Smrg /******************* Show gfc_code structures **************/
1263627f7eb2Smrg 
1264627f7eb2Smrg 
1265627f7eb2Smrg /* Show a list of code structures.  Mutually recursive with
1266627f7eb2Smrg    show_code_node().  */
1267627f7eb2Smrg 
1268627f7eb2Smrg static void
show_code(int level,gfc_code * c)1269627f7eb2Smrg show_code (int level, gfc_code *c)
1270627f7eb2Smrg {
1271627f7eb2Smrg   for (; c; c = c->next)
1272627f7eb2Smrg     show_code_node (level, c);
1273627f7eb2Smrg }
1274627f7eb2Smrg 
1275627f7eb2Smrg static void
show_omp_namelist(int list_type,gfc_omp_namelist * n)1276627f7eb2Smrg show_omp_namelist (int list_type, gfc_omp_namelist *n)
1277627f7eb2Smrg {
1278627f7eb2Smrg   for (; n; n = n->next)
1279627f7eb2Smrg     {
1280627f7eb2Smrg       if (list_type == OMP_LIST_REDUCTION)
1281627f7eb2Smrg 	switch (n->u.reduction_op)
1282627f7eb2Smrg 	  {
1283627f7eb2Smrg 	  case OMP_REDUCTION_PLUS:
1284627f7eb2Smrg 	  case OMP_REDUCTION_TIMES:
1285627f7eb2Smrg 	  case OMP_REDUCTION_MINUS:
1286627f7eb2Smrg 	  case OMP_REDUCTION_AND:
1287627f7eb2Smrg 	  case OMP_REDUCTION_OR:
1288627f7eb2Smrg 	  case OMP_REDUCTION_EQV:
1289627f7eb2Smrg 	  case OMP_REDUCTION_NEQV:
1290627f7eb2Smrg 	    fprintf (dumpfile, "%s:",
1291627f7eb2Smrg 		     gfc_op2string ((gfc_intrinsic_op) n->u.reduction_op));
1292627f7eb2Smrg 	    break;
1293627f7eb2Smrg 	  case OMP_REDUCTION_MAX: fputs ("max:", dumpfile); break;
1294627f7eb2Smrg 	  case OMP_REDUCTION_MIN: fputs ("min:", dumpfile); break;
1295627f7eb2Smrg 	  case OMP_REDUCTION_IAND: fputs ("iand:", dumpfile); break;
1296627f7eb2Smrg 	  case OMP_REDUCTION_IOR: fputs ("ior:", dumpfile); break;
1297627f7eb2Smrg 	  case OMP_REDUCTION_IEOR: fputs ("ieor:", dumpfile); break;
1298627f7eb2Smrg 	  case OMP_REDUCTION_USER:
1299627f7eb2Smrg 	    if (n->udr)
1300627f7eb2Smrg 	      fprintf (dumpfile, "%s:", n->udr->udr->name);
1301627f7eb2Smrg 	    break;
1302627f7eb2Smrg 	  default: break;
1303627f7eb2Smrg 	  }
1304627f7eb2Smrg       else if (list_type == OMP_LIST_DEPEND)
1305627f7eb2Smrg 	switch (n->u.depend_op)
1306627f7eb2Smrg 	  {
1307627f7eb2Smrg 	  case OMP_DEPEND_IN: fputs ("in:", dumpfile); break;
1308627f7eb2Smrg 	  case OMP_DEPEND_OUT: fputs ("out:", dumpfile); break;
1309627f7eb2Smrg 	  case OMP_DEPEND_INOUT: fputs ("inout:", dumpfile); break;
1310627f7eb2Smrg 	  case OMP_DEPEND_SINK_FIRST:
1311627f7eb2Smrg 	    fputs ("sink:", dumpfile);
1312627f7eb2Smrg 	    while (1)
1313627f7eb2Smrg 	      {
1314627f7eb2Smrg 		fprintf (dumpfile, "%s", n->sym->name);
1315627f7eb2Smrg 		if (n->expr)
1316627f7eb2Smrg 		  {
1317627f7eb2Smrg 		    fputc ('+', dumpfile);
1318627f7eb2Smrg 		    show_expr (n->expr);
1319627f7eb2Smrg 		  }
1320627f7eb2Smrg 		if (n->next == NULL)
1321627f7eb2Smrg 		  break;
1322627f7eb2Smrg 		else if (n->next->u.depend_op != OMP_DEPEND_SINK)
1323627f7eb2Smrg 		  {
1324627f7eb2Smrg 		    fputs (") DEPEND(", dumpfile);
1325627f7eb2Smrg 		    break;
1326627f7eb2Smrg 		  }
1327627f7eb2Smrg 		fputc (',', dumpfile);
1328627f7eb2Smrg 		n = n->next;
1329627f7eb2Smrg 	      }
1330627f7eb2Smrg 	    continue;
1331627f7eb2Smrg 	  default: break;
1332627f7eb2Smrg 	  }
1333627f7eb2Smrg       else if (list_type == OMP_LIST_MAP)
1334627f7eb2Smrg 	switch (n->u.map_op)
1335627f7eb2Smrg 	  {
1336627f7eb2Smrg 	  case OMP_MAP_ALLOC: fputs ("alloc:", dumpfile); break;
1337627f7eb2Smrg 	  case OMP_MAP_TO: fputs ("to:", dumpfile); break;
1338627f7eb2Smrg 	  case OMP_MAP_FROM: fputs ("from:", dumpfile); break;
1339627f7eb2Smrg 	  case OMP_MAP_TOFROM: fputs ("tofrom:", dumpfile); break;
1340627f7eb2Smrg 	  default: break;
1341627f7eb2Smrg 	  }
1342627f7eb2Smrg       else if (list_type == OMP_LIST_LINEAR)
1343627f7eb2Smrg 	switch (n->u.linear_op)
1344627f7eb2Smrg 	  {
1345627f7eb2Smrg 	  case OMP_LINEAR_REF: fputs ("ref(", dumpfile); break;
1346627f7eb2Smrg 	  case OMP_LINEAR_VAL: fputs ("val(", dumpfile); break;
1347627f7eb2Smrg 	  case OMP_LINEAR_UVAL: fputs ("uval(", dumpfile); break;
1348627f7eb2Smrg 	  default: break;
1349627f7eb2Smrg 	  }
1350627f7eb2Smrg       fprintf (dumpfile, "%s", n->sym->name);
1351627f7eb2Smrg       if (list_type == OMP_LIST_LINEAR && n->u.linear_op != OMP_LINEAR_DEFAULT)
1352627f7eb2Smrg 	fputc (')', dumpfile);
1353627f7eb2Smrg       if (n->expr)
1354627f7eb2Smrg 	{
1355627f7eb2Smrg 	  fputc (':', dumpfile);
1356627f7eb2Smrg 	  show_expr (n->expr);
1357627f7eb2Smrg 	}
1358627f7eb2Smrg       if (n->next)
1359627f7eb2Smrg 	fputc (',', dumpfile);
1360627f7eb2Smrg     }
1361627f7eb2Smrg }
1362627f7eb2Smrg 
1363627f7eb2Smrg 
1364627f7eb2Smrg /* Show OpenMP or OpenACC clauses.  */
1365627f7eb2Smrg 
1366627f7eb2Smrg static void
show_omp_clauses(gfc_omp_clauses * omp_clauses)1367627f7eb2Smrg show_omp_clauses (gfc_omp_clauses *omp_clauses)
1368627f7eb2Smrg {
1369627f7eb2Smrg   int list_type, i;
1370627f7eb2Smrg 
1371627f7eb2Smrg   switch (omp_clauses->cancel)
1372627f7eb2Smrg     {
1373627f7eb2Smrg     case OMP_CANCEL_UNKNOWN:
1374627f7eb2Smrg       break;
1375627f7eb2Smrg     case OMP_CANCEL_PARALLEL:
1376627f7eb2Smrg       fputs (" PARALLEL", dumpfile);
1377627f7eb2Smrg       break;
1378627f7eb2Smrg     case OMP_CANCEL_SECTIONS:
1379627f7eb2Smrg       fputs (" SECTIONS", dumpfile);
1380627f7eb2Smrg       break;
1381627f7eb2Smrg     case OMP_CANCEL_DO:
1382627f7eb2Smrg       fputs (" DO", dumpfile);
1383627f7eb2Smrg       break;
1384627f7eb2Smrg     case OMP_CANCEL_TASKGROUP:
1385627f7eb2Smrg       fputs (" TASKGROUP", dumpfile);
1386627f7eb2Smrg       break;
1387627f7eb2Smrg     }
1388627f7eb2Smrg   if (omp_clauses->if_expr)
1389627f7eb2Smrg     {
1390627f7eb2Smrg       fputs (" IF(", dumpfile);
1391627f7eb2Smrg       show_expr (omp_clauses->if_expr);
1392627f7eb2Smrg       fputc (')', dumpfile);
1393627f7eb2Smrg     }
1394627f7eb2Smrg   if (omp_clauses->final_expr)
1395627f7eb2Smrg     {
1396627f7eb2Smrg       fputs (" FINAL(", dumpfile);
1397627f7eb2Smrg       show_expr (omp_clauses->final_expr);
1398627f7eb2Smrg       fputc (')', dumpfile);
1399627f7eb2Smrg     }
1400627f7eb2Smrg   if (omp_clauses->num_threads)
1401627f7eb2Smrg     {
1402627f7eb2Smrg       fputs (" NUM_THREADS(", dumpfile);
1403627f7eb2Smrg       show_expr (omp_clauses->num_threads);
1404627f7eb2Smrg       fputc (')', dumpfile);
1405627f7eb2Smrg     }
1406627f7eb2Smrg   if (omp_clauses->async)
1407627f7eb2Smrg     {
1408627f7eb2Smrg       fputs (" ASYNC", dumpfile);
1409627f7eb2Smrg       if (omp_clauses->async_expr)
1410627f7eb2Smrg 	{
1411627f7eb2Smrg 	  fputc ('(', dumpfile);
1412627f7eb2Smrg 	  show_expr (omp_clauses->async_expr);
1413627f7eb2Smrg 	  fputc (')', dumpfile);
1414627f7eb2Smrg 	}
1415627f7eb2Smrg     }
1416627f7eb2Smrg   if (omp_clauses->num_gangs_expr)
1417627f7eb2Smrg     {
1418627f7eb2Smrg       fputs (" NUM_GANGS(", dumpfile);
1419627f7eb2Smrg       show_expr (omp_clauses->num_gangs_expr);
1420627f7eb2Smrg       fputc (')', dumpfile);
1421627f7eb2Smrg     }
1422627f7eb2Smrg   if (omp_clauses->num_workers_expr)
1423627f7eb2Smrg     {
1424627f7eb2Smrg       fputs (" NUM_WORKERS(", dumpfile);
1425627f7eb2Smrg       show_expr (omp_clauses->num_workers_expr);
1426627f7eb2Smrg       fputc (')', dumpfile);
1427627f7eb2Smrg     }
1428627f7eb2Smrg   if (omp_clauses->vector_length_expr)
1429627f7eb2Smrg     {
1430627f7eb2Smrg       fputs (" VECTOR_LENGTH(", dumpfile);
1431627f7eb2Smrg       show_expr (omp_clauses->vector_length_expr);
1432627f7eb2Smrg       fputc (')', dumpfile);
1433627f7eb2Smrg     }
1434627f7eb2Smrg   if (omp_clauses->gang)
1435627f7eb2Smrg     {
1436627f7eb2Smrg       fputs (" GANG", dumpfile);
1437627f7eb2Smrg       if (omp_clauses->gang_num_expr || omp_clauses->gang_static_expr)
1438627f7eb2Smrg 	{
1439627f7eb2Smrg 	  fputc ('(', dumpfile);
1440627f7eb2Smrg 	  if (omp_clauses->gang_num_expr)
1441627f7eb2Smrg 	    {
1442627f7eb2Smrg 	      fprintf (dumpfile, "num:");
1443627f7eb2Smrg 	      show_expr (omp_clauses->gang_num_expr);
1444627f7eb2Smrg 	    }
1445627f7eb2Smrg 	  if (omp_clauses->gang_num_expr && omp_clauses->gang_static)
1446627f7eb2Smrg 	    fputc (',', dumpfile);
1447627f7eb2Smrg 	  if (omp_clauses->gang_static)
1448627f7eb2Smrg 	    {
1449627f7eb2Smrg 	      fprintf (dumpfile, "static:");
1450627f7eb2Smrg 	      if (omp_clauses->gang_static_expr)
1451627f7eb2Smrg 		show_expr (omp_clauses->gang_static_expr);
1452627f7eb2Smrg 	      else
1453627f7eb2Smrg 		fputc ('*', dumpfile);
1454627f7eb2Smrg 	    }
1455627f7eb2Smrg 	  fputc (')', dumpfile);
1456627f7eb2Smrg 	}
1457627f7eb2Smrg     }
1458627f7eb2Smrg   if (omp_clauses->worker)
1459627f7eb2Smrg     {
1460627f7eb2Smrg       fputs (" WORKER", dumpfile);
1461627f7eb2Smrg       if (omp_clauses->worker_expr)
1462627f7eb2Smrg 	{
1463627f7eb2Smrg 	  fputc ('(', dumpfile);
1464627f7eb2Smrg 	  show_expr (omp_clauses->worker_expr);
1465627f7eb2Smrg 	  fputc (')', dumpfile);
1466627f7eb2Smrg 	}
1467627f7eb2Smrg     }
1468627f7eb2Smrg   if (omp_clauses->vector)
1469627f7eb2Smrg     {
1470627f7eb2Smrg       fputs (" VECTOR", dumpfile);
1471627f7eb2Smrg       if (omp_clauses->vector_expr)
1472627f7eb2Smrg 	{
1473627f7eb2Smrg 	  fputc ('(', dumpfile);
1474627f7eb2Smrg 	  show_expr (omp_clauses->vector_expr);
1475627f7eb2Smrg 	  fputc (')', dumpfile);
1476627f7eb2Smrg 	}
1477627f7eb2Smrg     }
1478627f7eb2Smrg   if (omp_clauses->sched_kind != OMP_SCHED_NONE)
1479627f7eb2Smrg     {
1480627f7eb2Smrg       const char *type;
1481627f7eb2Smrg       switch (omp_clauses->sched_kind)
1482627f7eb2Smrg 	{
1483627f7eb2Smrg 	case OMP_SCHED_STATIC: type = "STATIC"; break;
1484627f7eb2Smrg 	case OMP_SCHED_DYNAMIC: type = "DYNAMIC"; break;
1485627f7eb2Smrg 	case OMP_SCHED_GUIDED: type = "GUIDED"; break;
1486627f7eb2Smrg 	case OMP_SCHED_RUNTIME: type = "RUNTIME"; break;
1487627f7eb2Smrg 	case OMP_SCHED_AUTO: type = "AUTO"; break;
1488627f7eb2Smrg 	default:
1489627f7eb2Smrg 	  gcc_unreachable ();
1490627f7eb2Smrg 	}
1491627f7eb2Smrg       fputs (" SCHEDULE (", dumpfile);
1492627f7eb2Smrg       if (omp_clauses->sched_simd)
1493627f7eb2Smrg 	{
1494627f7eb2Smrg 	  if (omp_clauses->sched_monotonic
1495627f7eb2Smrg 	      || omp_clauses->sched_nonmonotonic)
1496627f7eb2Smrg 	    fputs ("SIMD, ", dumpfile);
1497627f7eb2Smrg 	  else
1498627f7eb2Smrg 	    fputs ("SIMD: ", dumpfile);
1499627f7eb2Smrg 	}
1500627f7eb2Smrg       if (omp_clauses->sched_monotonic)
1501627f7eb2Smrg 	fputs ("MONOTONIC: ", dumpfile);
1502627f7eb2Smrg       else if (omp_clauses->sched_nonmonotonic)
1503627f7eb2Smrg 	fputs ("NONMONOTONIC: ", dumpfile);
1504627f7eb2Smrg       fputs (type, dumpfile);
1505627f7eb2Smrg       if (omp_clauses->chunk_size)
1506627f7eb2Smrg 	{
1507627f7eb2Smrg 	  fputc (',', dumpfile);
1508627f7eb2Smrg 	  show_expr (omp_clauses->chunk_size);
1509627f7eb2Smrg 	}
1510627f7eb2Smrg       fputc (')', dumpfile);
1511627f7eb2Smrg     }
1512627f7eb2Smrg   if (omp_clauses->default_sharing != OMP_DEFAULT_UNKNOWN)
1513627f7eb2Smrg     {
1514627f7eb2Smrg       const char *type;
1515627f7eb2Smrg       switch (omp_clauses->default_sharing)
1516627f7eb2Smrg 	{
1517627f7eb2Smrg 	case OMP_DEFAULT_NONE: type = "NONE"; break;
1518627f7eb2Smrg 	case OMP_DEFAULT_PRIVATE: type = "PRIVATE"; break;
1519627f7eb2Smrg 	case OMP_DEFAULT_SHARED: type = "SHARED"; break;
1520627f7eb2Smrg 	case OMP_DEFAULT_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1521627f7eb2Smrg 	case OMP_DEFAULT_PRESENT: type = "PRESENT"; break;
1522627f7eb2Smrg 	default:
1523627f7eb2Smrg 	  gcc_unreachable ();
1524627f7eb2Smrg 	}
1525627f7eb2Smrg       fprintf (dumpfile, " DEFAULT(%s)", type);
1526627f7eb2Smrg     }
1527627f7eb2Smrg   if (omp_clauses->tile_list)
1528627f7eb2Smrg     {
1529627f7eb2Smrg       gfc_expr_list *list;
1530627f7eb2Smrg       fputs (" TILE(", dumpfile);
1531627f7eb2Smrg       for (list = omp_clauses->tile_list; list; list = list->next)
1532627f7eb2Smrg 	{
1533627f7eb2Smrg 	  show_expr (list->expr);
1534627f7eb2Smrg 	  if (list->next)
1535627f7eb2Smrg 	    fputs (", ", dumpfile);
1536627f7eb2Smrg 	}
1537627f7eb2Smrg       fputc (')', dumpfile);
1538627f7eb2Smrg     }
1539627f7eb2Smrg   if (omp_clauses->wait_list)
1540627f7eb2Smrg     {
1541627f7eb2Smrg       gfc_expr_list *list;
1542627f7eb2Smrg       fputs (" WAIT(", dumpfile);
1543627f7eb2Smrg       for (list = omp_clauses->wait_list; list; list = list->next)
1544627f7eb2Smrg 	{
1545627f7eb2Smrg 	  show_expr (list->expr);
1546627f7eb2Smrg 	  if (list->next)
1547627f7eb2Smrg 	    fputs (", ", dumpfile);
1548627f7eb2Smrg 	}
1549627f7eb2Smrg       fputc (')', dumpfile);
1550627f7eb2Smrg     }
1551627f7eb2Smrg   if (omp_clauses->seq)
1552627f7eb2Smrg     fputs (" SEQ", dumpfile);
1553627f7eb2Smrg   if (omp_clauses->independent)
1554627f7eb2Smrg     fputs (" INDEPENDENT", dumpfile);
1555627f7eb2Smrg   if (omp_clauses->ordered)
1556627f7eb2Smrg     {
1557627f7eb2Smrg       if (omp_clauses->orderedc)
1558627f7eb2Smrg 	fprintf (dumpfile, " ORDERED(%d)", omp_clauses->orderedc);
1559627f7eb2Smrg       else
1560627f7eb2Smrg 	fputs (" ORDERED", dumpfile);
1561627f7eb2Smrg     }
1562627f7eb2Smrg   if (omp_clauses->untied)
1563627f7eb2Smrg     fputs (" UNTIED", dumpfile);
1564627f7eb2Smrg   if (omp_clauses->mergeable)
1565627f7eb2Smrg     fputs (" MERGEABLE", dumpfile);
1566627f7eb2Smrg   if (omp_clauses->collapse)
1567627f7eb2Smrg     fprintf (dumpfile, " COLLAPSE(%d)", omp_clauses->collapse);
1568627f7eb2Smrg   for (list_type = 0; list_type < OMP_LIST_NUM; list_type++)
1569627f7eb2Smrg     if (omp_clauses->lists[list_type] != NULL
1570627f7eb2Smrg 	&& list_type != OMP_LIST_COPYPRIVATE)
1571627f7eb2Smrg       {
1572627f7eb2Smrg 	const char *type = NULL;
1573627f7eb2Smrg 	switch (list_type)
1574627f7eb2Smrg 	  {
1575627f7eb2Smrg 	  case OMP_LIST_PRIVATE: type = "PRIVATE"; break;
1576627f7eb2Smrg 	  case OMP_LIST_FIRSTPRIVATE: type = "FIRSTPRIVATE"; break;
1577627f7eb2Smrg 	  case OMP_LIST_LASTPRIVATE: type = "LASTPRIVATE"; break;
1578627f7eb2Smrg 	  case OMP_LIST_COPYPRIVATE: type = "COPYPRIVATE"; break;
1579627f7eb2Smrg 	  case OMP_LIST_SHARED: type = "SHARED"; break;
1580627f7eb2Smrg 	  case OMP_LIST_COPYIN: type = "COPYIN"; break;
1581627f7eb2Smrg 	  case OMP_LIST_UNIFORM: type = "UNIFORM"; break;
1582627f7eb2Smrg 	  case OMP_LIST_ALIGNED: type = "ALIGNED"; break;
1583627f7eb2Smrg 	  case OMP_LIST_LINEAR: type = "LINEAR"; break;
1584627f7eb2Smrg 	  case OMP_LIST_DEPEND: type = "DEPEND"; break;
1585627f7eb2Smrg 	  case OMP_LIST_MAP: type = "MAP"; break;
1586627f7eb2Smrg 	  case OMP_LIST_TO: type = "TO"; break;
1587627f7eb2Smrg 	  case OMP_LIST_FROM: type = "FROM"; break;
1588627f7eb2Smrg 	  case OMP_LIST_REDUCTION: type = "REDUCTION"; break;
1589627f7eb2Smrg 	  case OMP_LIST_DEVICE_RESIDENT: type = "DEVICE_RESIDENT"; break;
1590627f7eb2Smrg 	  case OMP_LIST_LINK: type = "LINK"; break;
1591627f7eb2Smrg 	  case OMP_LIST_USE_DEVICE: type = "USE_DEVICE"; break;
1592627f7eb2Smrg 	  case OMP_LIST_CACHE: type = "CACHE"; break;
1593627f7eb2Smrg 	  case OMP_LIST_IS_DEVICE_PTR: type = "IS_DEVICE_PTR"; break;
1594627f7eb2Smrg 	  case OMP_LIST_USE_DEVICE_PTR: type = "USE_DEVICE_PTR"; break;
1595*4c3eb207Smrg 	  case OMP_LIST_USE_DEVICE_ADDR: type = "USE_DEVICE_ADDR"; break;
1596627f7eb2Smrg 	  default:
1597627f7eb2Smrg 	    gcc_unreachable ();
1598627f7eb2Smrg 	  }
1599627f7eb2Smrg 	fprintf (dumpfile, " %s(", type);
1600627f7eb2Smrg 	show_omp_namelist (list_type, omp_clauses->lists[list_type]);
1601627f7eb2Smrg 	fputc (')', dumpfile);
1602627f7eb2Smrg       }
1603627f7eb2Smrg   if (omp_clauses->safelen_expr)
1604627f7eb2Smrg     {
1605627f7eb2Smrg       fputs (" SAFELEN(", dumpfile);
1606627f7eb2Smrg       show_expr (omp_clauses->safelen_expr);
1607627f7eb2Smrg       fputc (')', dumpfile);
1608627f7eb2Smrg     }
1609627f7eb2Smrg   if (omp_clauses->simdlen_expr)
1610627f7eb2Smrg     {
1611627f7eb2Smrg       fputs (" SIMDLEN(", dumpfile);
1612627f7eb2Smrg       show_expr (omp_clauses->simdlen_expr);
1613627f7eb2Smrg       fputc (')', dumpfile);
1614627f7eb2Smrg     }
1615627f7eb2Smrg   if (omp_clauses->inbranch)
1616627f7eb2Smrg     fputs (" INBRANCH", dumpfile);
1617627f7eb2Smrg   if (omp_clauses->notinbranch)
1618627f7eb2Smrg     fputs (" NOTINBRANCH", dumpfile);
1619627f7eb2Smrg   if (omp_clauses->proc_bind != OMP_PROC_BIND_UNKNOWN)
1620627f7eb2Smrg     {
1621627f7eb2Smrg       const char *type;
1622627f7eb2Smrg       switch (omp_clauses->proc_bind)
1623627f7eb2Smrg 	{
1624627f7eb2Smrg 	case OMP_PROC_BIND_MASTER: type = "MASTER"; break;
1625627f7eb2Smrg 	case OMP_PROC_BIND_SPREAD: type = "SPREAD"; break;
1626627f7eb2Smrg 	case OMP_PROC_BIND_CLOSE: type = "CLOSE"; break;
1627627f7eb2Smrg 	default:
1628627f7eb2Smrg 	  gcc_unreachable ();
1629627f7eb2Smrg 	}
1630627f7eb2Smrg       fprintf (dumpfile, " PROC_BIND(%s)", type);
1631627f7eb2Smrg     }
1632627f7eb2Smrg   if (omp_clauses->num_teams)
1633627f7eb2Smrg     {
1634627f7eb2Smrg       fputs (" NUM_TEAMS(", dumpfile);
1635627f7eb2Smrg       show_expr (omp_clauses->num_teams);
1636627f7eb2Smrg       fputc (')', dumpfile);
1637627f7eb2Smrg     }
1638627f7eb2Smrg   if (omp_clauses->device)
1639627f7eb2Smrg     {
1640627f7eb2Smrg       fputs (" DEVICE(", dumpfile);
1641627f7eb2Smrg       show_expr (omp_clauses->device);
1642627f7eb2Smrg       fputc (')', dumpfile);
1643627f7eb2Smrg     }
1644627f7eb2Smrg   if (omp_clauses->thread_limit)
1645627f7eb2Smrg     {
1646627f7eb2Smrg       fputs (" THREAD_LIMIT(", dumpfile);
1647627f7eb2Smrg       show_expr (omp_clauses->thread_limit);
1648627f7eb2Smrg       fputc (')', dumpfile);
1649627f7eb2Smrg     }
1650627f7eb2Smrg   if (omp_clauses->dist_sched_kind != OMP_SCHED_NONE)
1651627f7eb2Smrg     {
1652627f7eb2Smrg       fprintf (dumpfile, " DIST_SCHEDULE (STATIC");
1653627f7eb2Smrg       if (omp_clauses->dist_chunk_size)
1654627f7eb2Smrg 	{
1655627f7eb2Smrg 	  fputc (',', dumpfile);
1656627f7eb2Smrg 	  show_expr (omp_clauses->dist_chunk_size);
1657627f7eb2Smrg 	}
1658627f7eb2Smrg       fputc (')', dumpfile);
1659627f7eb2Smrg     }
1660627f7eb2Smrg   if (omp_clauses->defaultmap)
1661627f7eb2Smrg     fputs (" DEFALTMAP (TOFROM: SCALAR)", dumpfile);
1662627f7eb2Smrg   if (omp_clauses->nogroup)
1663627f7eb2Smrg     fputs (" NOGROUP", dumpfile);
1664627f7eb2Smrg   if (omp_clauses->simd)
1665627f7eb2Smrg     fputs (" SIMD", dumpfile);
1666627f7eb2Smrg   if (omp_clauses->threads)
1667627f7eb2Smrg     fputs (" THREADS", dumpfile);
1668627f7eb2Smrg   if (omp_clauses->grainsize)
1669627f7eb2Smrg     {
1670627f7eb2Smrg       fputs (" GRAINSIZE(", dumpfile);
1671627f7eb2Smrg       show_expr (omp_clauses->grainsize);
1672627f7eb2Smrg       fputc (')', dumpfile);
1673627f7eb2Smrg     }
1674627f7eb2Smrg   if (omp_clauses->hint)
1675627f7eb2Smrg     {
1676627f7eb2Smrg       fputs (" HINT(", dumpfile);
1677627f7eb2Smrg       show_expr (omp_clauses->hint);
1678627f7eb2Smrg       fputc (')', dumpfile);
1679627f7eb2Smrg     }
1680627f7eb2Smrg   if (omp_clauses->num_tasks)
1681627f7eb2Smrg     {
1682627f7eb2Smrg       fputs (" NUM_TASKS(", dumpfile);
1683627f7eb2Smrg       show_expr (omp_clauses->num_tasks);
1684627f7eb2Smrg       fputc (')', dumpfile);
1685627f7eb2Smrg     }
1686627f7eb2Smrg   if (omp_clauses->priority)
1687627f7eb2Smrg     {
1688627f7eb2Smrg       fputs (" PRIORITY(", dumpfile);
1689627f7eb2Smrg       show_expr (omp_clauses->priority);
1690627f7eb2Smrg       fputc (')', dumpfile);
1691627f7eb2Smrg     }
1692627f7eb2Smrg   for (i = 0; i < OMP_IF_LAST; i++)
1693627f7eb2Smrg     if (omp_clauses->if_exprs[i])
1694627f7eb2Smrg       {
1695627f7eb2Smrg 	static const char *ifs[] = {
1696627f7eb2Smrg 	  "PARALLEL",
1697627f7eb2Smrg 	  "TASK",
1698627f7eb2Smrg 	  "TASKLOOP",
1699627f7eb2Smrg 	  "TARGET",
1700627f7eb2Smrg 	  "TARGET DATA",
1701627f7eb2Smrg 	  "TARGET UPDATE",
1702627f7eb2Smrg 	  "TARGET ENTER DATA",
1703627f7eb2Smrg 	  "TARGET EXIT DATA"
1704627f7eb2Smrg 	};
1705627f7eb2Smrg       fputs (" IF(", dumpfile);
1706627f7eb2Smrg       fputs (ifs[i], dumpfile);
1707627f7eb2Smrg       fputs (": ", dumpfile);
1708627f7eb2Smrg       show_expr (omp_clauses->if_exprs[i]);
1709627f7eb2Smrg       fputc (')', dumpfile);
1710627f7eb2Smrg     }
1711627f7eb2Smrg   if (omp_clauses->depend_source)
1712627f7eb2Smrg     fputs (" DEPEND(source)", dumpfile);
1713627f7eb2Smrg }
1714627f7eb2Smrg 
1715627f7eb2Smrg /* Show a single OpenMP or OpenACC directive node and everything underneath it
1716627f7eb2Smrg    if necessary.  */
1717627f7eb2Smrg 
1718627f7eb2Smrg static void
show_omp_node(int level,gfc_code * c)1719627f7eb2Smrg show_omp_node (int level, gfc_code *c)
1720627f7eb2Smrg {
1721627f7eb2Smrg   gfc_omp_clauses *omp_clauses = NULL;
1722627f7eb2Smrg   const char *name = NULL;
1723627f7eb2Smrg   bool is_oacc = false;
1724627f7eb2Smrg 
1725627f7eb2Smrg   switch (c->op)
1726627f7eb2Smrg     {
1727627f7eb2Smrg     case EXEC_OACC_PARALLEL_LOOP:
1728627f7eb2Smrg       name = "PARALLEL LOOP"; is_oacc = true; break;
1729627f7eb2Smrg     case EXEC_OACC_PARALLEL: name = "PARALLEL"; is_oacc = true; break;
1730627f7eb2Smrg     case EXEC_OACC_KERNELS_LOOP: name = "KERNELS LOOP"; is_oacc = true; break;
1731627f7eb2Smrg     case EXEC_OACC_KERNELS: name = "KERNELS"; is_oacc = true; break;
1732*4c3eb207Smrg     case EXEC_OACC_SERIAL_LOOP: name = "SERIAL LOOP"; is_oacc = true; break;
1733*4c3eb207Smrg     case EXEC_OACC_SERIAL: name = "SERIAL"; is_oacc = true; break;
1734627f7eb2Smrg     case EXEC_OACC_DATA: name = "DATA"; is_oacc = true; break;
1735627f7eb2Smrg     case EXEC_OACC_HOST_DATA: name = "HOST_DATA"; is_oacc = true; break;
1736627f7eb2Smrg     case EXEC_OACC_LOOP: name = "LOOP"; is_oacc = true; break;
1737627f7eb2Smrg     case EXEC_OACC_UPDATE: name = "UPDATE"; is_oacc = true; break;
1738627f7eb2Smrg     case EXEC_OACC_WAIT: name = "WAIT"; is_oacc = true; break;
1739627f7eb2Smrg     case EXEC_OACC_CACHE: name = "CACHE"; is_oacc = true; break;
1740627f7eb2Smrg     case EXEC_OACC_ENTER_DATA: name = "ENTER DATA"; is_oacc = true; break;
1741627f7eb2Smrg     case EXEC_OACC_EXIT_DATA: name = "EXIT DATA"; is_oacc = true; break;
1742627f7eb2Smrg     case EXEC_OMP_ATOMIC: name = "ATOMIC"; break;
1743627f7eb2Smrg     case EXEC_OMP_BARRIER: name = "BARRIER"; break;
1744627f7eb2Smrg     case EXEC_OMP_CANCEL: name = "CANCEL"; break;
1745627f7eb2Smrg     case EXEC_OMP_CANCELLATION_POINT: name = "CANCELLATION POINT"; break;
1746627f7eb2Smrg     case EXEC_OMP_CRITICAL: name = "CRITICAL"; break;
1747627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE: name = "DISTRIBUTE"; break;
1748627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
1749627f7eb2Smrg       name = "DISTRIBUTE PARALLEL DO"; break;
1750627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
1751627f7eb2Smrg       name = "DISTRIBUTE PARALLEL DO SIMD"; break;
1752627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_SIMD: name = "DISTRIBUTE SIMD"; break;
1753627f7eb2Smrg     case EXEC_OMP_DO: name = "DO"; break;
1754627f7eb2Smrg     case EXEC_OMP_DO_SIMD: name = "DO SIMD"; break;
1755627f7eb2Smrg     case EXEC_OMP_FLUSH: name = "FLUSH"; break;
1756627f7eb2Smrg     case EXEC_OMP_MASTER: name = "MASTER"; break;
1757627f7eb2Smrg     case EXEC_OMP_ORDERED: name = "ORDERED"; break;
1758627f7eb2Smrg     case EXEC_OMP_PARALLEL: name = "PARALLEL"; break;
1759627f7eb2Smrg     case EXEC_OMP_PARALLEL_DO: name = "PARALLEL DO"; break;
1760627f7eb2Smrg     case EXEC_OMP_PARALLEL_DO_SIMD: name = "PARALLEL DO SIMD"; break;
1761627f7eb2Smrg     case EXEC_OMP_PARALLEL_SECTIONS: name = "PARALLEL SECTIONS"; break;
1762627f7eb2Smrg     case EXEC_OMP_PARALLEL_WORKSHARE: name = "PARALLEL WORKSHARE"; break;
1763627f7eb2Smrg     case EXEC_OMP_SECTIONS: name = "SECTIONS"; break;
1764627f7eb2Smrg     case EXEC_OMP_SIMD: name = "SIMD"; break;
1765627f7eb2Smrg     case EXEC_OMP_SINGLE: name = "SINGLE"; break;
1766627f7eb2Smrg     case EXEC_OMP_TARGET: name = "TARGET"; break;
1767627f7eb2Smrg     case EXEC_OMP_TARGET_DATA: name = "TARGET DATA"; break;
1768627f7eb2Smrg     case EXEC_OMP_TARGET_ENTER_DATA: name = "TARGET ENTER DATA"; break;
1769627f7eb2Smrg     case EXEC_OMP_TARGET_EXIT_DATA: name = "TARGET EXIT DATA"; break;
1770627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL: name = "TARGET PARALLEL"; break;
1771627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL_DO: name = "TARGET PARALLEL DO"; break;
1772627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
1773627f7eb2Smrg       name = "TARGET_PARALLEL_DO_SIMD"; break;
1774627f7eb2Smrg     case EXEC_OMP_TARGET_SIMD: name = "TARGET SIMD"; break;
1775627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS: name = "TARGET TEAMS"; break;
1776627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
1777627f7eb2Smrg       name = "TARGET TEAMS DISTRIBUTE"; break;
1778627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
1779627f7eb2Smrg       name = "TARGET TEAMS DISTRIBUTE PARALLEL DO"; break;
1780627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
1781627f7eb2Smrg       name = "TARGET TEAMS DISTRIBUTE PARALLEL DO SIMD"; break;
1782627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
1783627f7eb2Smrg       name = "TARGET TEAMS DISTRIBUTE SIMD"; break;
1784627f7eb2Smrg     case EXEC_OMP_TARGET_UPDATE: name = "TARGET UPDATE"; break;
1785627f7eb2Smrg     case EXEC_OMP_TASK: name = "TASK"; break;
1786627f7eb2Smrg     case EXEC_OMP_TASKGROUP: name = "TASKGROUP"; break;
1787627f7eb2Smrg     case EXEC_OMP_TASKLOOP: name = "TASKLOOP"; break;
1788627f7eb2Smrg     case EXEC_OMP_TASKLOOP_SIMD: name = "TASKLOOP SIMD"; break;
1789627f7eb2Smrg     case EXEC_OMP_TASKWAIT: name = "TASKWAIT"; break;
1790627f7eb2Smrg     case EXEC_OMP_TASKYIELD: name = "TASKYIELD"; break;
1791627f7eb2Smrg     case EXEC_OMP_TEAMS: name = "TEAMS"; break;
1792627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE: name = "TEAMS DISTRIBUTE"; break;
1793627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
1794627f7eb2Smrg       name = "TEAMS DISTRIBUTE PARALLEL DO"; break;
1795627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
1796627f7eb2Smrg       name = "TEAMS DISTRIBUTE PARALLEL DO SIMD"; break;
1797627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD: name = "TEAMS DISTRIBUTE SIMD"; break;
1798627f7eb2Smrg     case EXEC_OMP_WORKSHARE: name = "WORKSHARE"; break;
1799627f7eb2Smrg     default:
1800627f7eb2Smrg       gcc_unreachable ();
1801627f7eb2Smrg     }
1802627f7eb2Smrg   fprintf (dumpfile, "!$%s %s", is_oacc ? "ACC" : "OMP", name);
1803627f7eb2Smrg   switch (c->op)
1804627f7eb2Smrg     {
1805627f7eb2Smrg     case EXEC_OACC_PARALLEL_LOOP:
1806627f7eb2Smrg     case EXEC_OACC_PARALLEL:
1807627f7eb2Smrg     case EXEC_OACC_KERNELS_LOOP:
1808627f7eb2Smrg     case EXEC_OACC_KERNELS:
1809*4c3eb207Smrg     case EXEC_OACC_SERIAL_LOOP:
1810*4c3eb207Smrg     case EXEC_OACC_SERIAL:
1811627f7eb2Smrg     case EXEC_OACC_DATA:
1812627f7eb2Smrg     case EXEC_OACC_HOST_DATA:
1813627f7eb2Smrg     case EXEC_OACC_LOOP:
1814627f7eb2Smrg     case EXEC_OACC_UPDATE:
1815627f7eb2Smrg     case EXEC_OACC_WAIT:
1816627f7eb2Smrg     case EXEC_OACC_CACHE:
1817627f7eb2Smrg     case EXEC_OACC_ENTER_DATA:
1818627f7eb2Smrg     case EXEC_OACC_EXIT_DATA:
1819627f7eb2Smrg     case EXEC_OMP_CANCEL:
1820627f7eb2Smrg     case EXEC_OMP_CANCELLATION_POINT:
1821627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE:
1822627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
1823627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
1824627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_SIMD:
1825627f7eb2Smrg     case EXEC_OMP_DO:
1826627f7eb2Smrg     case EXEC_OMP_DO_SIMD:
1827627f7eb2Smrg     case EXEC_OMP_ORDERED:
1828627f7eb2Smrg     case EXEC_OMP_PARALLEL:
1829627f7eb2Smrg     case EXEC_OMP_PARALLEL_DO:
1830627f7eb2Smrg     case EXEC_OMP_PARALLEL_DO_SIMD:
1831627f7eb2Smrg     case EXEC_OMP_PARALLEL_SECTIONS:
1832627f7eb2Smrg     case EXEC_OMP_PARALLEL_WORKSHARE:
1833627f7eb2Smrg     case EXEC_OMP_SECTIONS:
1834627f7eb2Smrg     case EXEC_OMP_SIMD:
1835627f7eb2Smrg     case EXEC_OMP_SINGLE:
1836627f7eb2Smrg     case EXEC_OMP_TARGET:
1837627f7eb2Smrg     case EXEC_OMP_TARGET_DATA:
1838627f7eb2Smrg     case EXEC_OMP_TARGET_ENTER_DATA:
1839627f7eb2Smrg     case EXEC_OMP_TARGET_EXIT_DATA:
1840627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL:
1841627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL_DO:
1842627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
1843627f7eb2Smrg     case EXEC_OMP_TARGET_SIMD:
1844627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS:
1845627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
1846627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
1847627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
1848627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
1849627f7eb2Smrg     case EXEC_OMP_TARGET_UPDATE:
1850627f7eb2Smrg     case EXEC_OMP_TASK:
1851627f7eb2Smrg     case EXEC_OMP_TASKLOOP:
1852627f7eb2Smrg     case EXEC_OMP_TASKLOOP_SIMD:
1853627f7eb2Smrg     case EXEC_OMP_TEAMS:
1854627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE:
1855627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
1856627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
1857627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
1858627f7eb2Smrg     case EXEC_OMP_WORKSHARE:
1859627f7eb2Smrg       omp_clauses = c->ext.omp_clauses;
1860627f7eb2Smrg       break;
1861627f7eb2Smrg     case EXEC_OMP_CRITICAL:
1862627f7eb2Smrg       omp_clauses = c->ext.omp_clauses;
1863627f7eb2Smrg       if (omp_clauses)
1864627f7eb2Smrg 	fprintf (dumpfile, " (%s)", c->ext.omp_clauses->critical_name);
1865627f7eb2Smrg       break;
1866627f7eb2Smrg     case EXEC_OMP_FLUSH:
1867627f7eb2Smrg       if (c->ext.omp_namelist)
1868627f7eb2Smrg 	{
1869627f7eb2Smrg 	  fputs (" (", dumpfile);
1870627f7eb2Smrg 	  show_omp_namelist (OMP_LIST_NUM, c->ext.omp_namelist);
1871627f7eb2Smrg 	  fputc (')', dumpfile);
1872627f7eb2Smrg 	}
1873627f7eb2Smrg       return;
1874627f7eb2Smrg     case EXEC_OMP_BARRIER:
1875627f7eb2Smrg     case EXEC_OMP_TASKWAIT:
1876627f7eb2Smrg     case EXEC_OMP_TASKYIELD:
1877627f7eb2Smrg       return;
1878627f7eb2Smrg     default:
1879627f7eb2Smrg       break;
1880627f7eb2Smrg     }
1881627f7eb2Smrg   if (omp_clauses)
1882627f7eb2Smrg     show_omp_clauses (omp_clauses);
1883627f7eb2Smrg   fputc ('\n', dumpfile);
1884627f7eb2Smrg 
1885627f7eb2Smrg   /* OpenMP and OpenACC executable directives don't have associated blocks.  */
1886627f7eb2Smrg   if (c->op == EXEC_OACC_CACHE || c->op == EXEC_OACC_UPDATE
1887627f7eb2Smrg       || c->op == EXEC_OACC_ENTER_DATA || c->op == EXEC_OACC_EXIT_DATA
1888627f7eb2Smrg       || c->op == EXEC_OMP_TARGET_UPDATE || c->op == EXEC_OMP_TARGET_ENTER_DATA
1889627f7eb2Smrg       || c->op == EXEC_OMP_TARGET_EXIT_DATA
1890627f7eb2Smrg       || (c->op == EXEC_OMP_ORDERED && c->block == NULL))
1891627f7eb2Smrg     return;
1892627f7eb2Smrg   if (c->op == EXEC_OMP_SECTIONS || c->op == EXEC_OMP_PARALLEL_SECTIONS)
1893627f7eb2Smrg     {
1894627f7eb2Smrg       gfc_code *d = c->block;
1895627f7eb2Smrg       while (d != NULL)
1896627f7eb2Smrg 	{
1897627f7eb2Smrg 	  show_code (level + 1, d->next);
1898627f7eb2Smrg 	  if (d->block == NULL)
1899627f7eb2Smrg 	    break;
1900627f7eb2Smrg 	  code_indent (level, 0);
1901627f7eb2Smrg 	  fputs ("!$OMP SECTION\n", dumpfile);
1902627f7eb2Smrg 	  d = d->block;
1903627f7eb2Smrg 	}
1904627f7eb2Smrg     }
1905627f7eb2Smrg   else
1906627f7eb2Smrg     show_code (level + 1, c->block->next);
1907627f7eb2Smrg   if (c->op == EXEC_OMP_ATOMIC)
1908627f7eb2Smrg     return;
1909627f7eb2Smrg   fputc ('\n', dumpfile);
1910627f7eb2Smrg   code_indent (level, 0);
1911627f7eb2Smrg   fprintf (dumpfile, "!$%s END %s", is_oacc ? "ACC" : "OMP", name);
1912627f7eb2Smrg   if (omp_clauses != NULL)
1913627f7eb2Smrg     {
1914627f7eb2Smrg       if (omp_clauses->lists[OMP_LIST_COPYPRIVATE])
1915627f7eb2Smrg 	{
1916627f7eb2Smrg 	  fputs (" COPYPRIVATE(", dumpfile);
1917627f7eb2Smrg 	  show_omp_namelist (OMP_LIST_COPYPRIVATE,
1918627f7eb2Smrg 			     omp_clauses->lists[OMP_LIST_COPYPRIVATE]);
1919627f7eb2Smrg 	  fputc (')', dumpfile);
1920627f7eb2Smrg 	}
1921627f7eb2Smrg       else if (omp_clauses->nowait)
1922627f7eb2Smrg 	fputs (" NOWAIT", dumpfile);
1923627f7eb2Smrg     }
1924627f7eb2Smrg   else if (c->op == EXEC_OMP_CRITICAL && c->ext.omp_clauses)
1925627f7eb2Smrg     fprintf (dumpfile, " (%s)", c->ext.omp_clauses->critical_name);
1926627f7eb2Smrg }
1927627f7eb2Smrg 
1928627f7eb2Smrg 
1929627f7eb2Smrg /* Show a single code node and everything underneath it if necessary.  */
1930627f7eb2Smrg 
1931627f7eb2Smrg static void
show_code_node(int level,gfc_code * c)1932627f7eb2Smrg show_code_node (int level, gfc_code *c)
1933627f7eb2Smrg {
1934627f7eb2Smrg   gfc_forall_iterator *fa;
1935627f7eb2Smrg   gfc_open *open;
1936627f7eb2Smrg   gfc_case *cp;
1937627f7eb2Smrg   gfc_alloc *a;
1938627f7eb2Smrg   gfc_code *d;
1939627f7eb2Smrg   gfc_close *close;
1940627f7eb2Smrg   gfc_filepos *fp;
1941627f7eb2Smrg   gfc_inquire *i;
1942627f7eb2Smrg   gfc_dt *dt;
1943627f7eb2Smrg   gfc_namespace *ns;
1944627f7eb2Smrg 
1945627f7eb2Smrg   if (c->here)
1946627f7eb2Smrg     {
1947627f7eb2Smrg       fputc ('\n', dumpfile);
1948627f7eb2Smrg       code_indent (level, c->here);
1949627f7eb2Smrg     }
1950627f7eb2Smrg   else
1951627f7eb2Smrg     show_indent ();
1952627f7eb2Smrg 
1953627f7eb2Smrg   switch (c->op)
1954627f7eb2Smrg     {
1955627f7eb2Smrg     case EXEC_END_PROCEDURE:
1956627f7eb2Smrg       break;
1957627f7eb2Smrg 
1958627f7eb2Smrg     case EXEC_NOP:
1959627f7eb2Smrg       fputs ("NOP", dumpfile);
1960627f7eb2Smrg       break;
1961627f7eb2Smrg 
1962627f7eb2Smrg     case EXEC_CONTINUE:
1963627f7eb2Smrg       fputs ("CONTINUE", dumpfile);
1964627f7eb2Smrg       break;
1965627f7eb2Smrg 
1966627f7eb2Smrg     case EXEC_ENTRY:
1967627f7eb2Smrg       fprintf (dumpfile, "ENTRY %s", c->ext.entry->sym->name);
1968627f7eb2Smrg       break;
1969627f7eb2Smrg 
1970627f7eb2Smrg     case EXEC_INIT_ASSIGN:
1971627f7eb2Smrg     case EXEC_ASSIGN:
1972627f7eb2Smrg       fputs ("ASSIGN ", dumpfile);
1973627f7eb2Smrg       show_expr (c->expr1);
1974627f7eb2Smrg       fputc (' ', dumpfile);
1975627f7eb2Smrg       show_expr (c->expr2);
1976627f7eb2Smrg       break;
1977627f7eb2Smrg 
1978627f7eb2Smrg     case EXEC_LABEL_ASSIGN:
1979627f7eb2Smrg       fputs ("LABEL ASSIGN ", dumpfile);
1980627f7eb2Smrg       show_expr (c->expr1);
1981627f7eb2Smrg       fprintf (dumpfile, " %d", c->label1->value);
1982627f7eb2Smrg       break;
1983627f7eb2Smrg 
1984627f7eb2Smrg     case EXEC_POINTER_ASSIGN:
1985627f7eb2Smrg       fputs ("POINTER ASSIGN ", dumpfile);
1986627f7eb2Smrg       show_expr (c->expr1);
1987627f7eb2Smrg       fputc (' ', dumpfile);
1988627f7eb2Smrg       show_expr (c->expr2);
1989627f7eb2Smrg       break;
1990627f7eb2Smrg 
1991627f7eb2Smrg     case EXEC_GOTO:
1992627f7eb2Smrg       fputs ("GOTO ", dumpfile);
1993627f7eb2Smrg       if (c->label1)
1994627f7eb2Smrg 	fprintf (dumpfile, "%d", c->label1->value);
1995627f7eb2Smrg       else
1996627f7eb2Smrg 	{
1997627f7eb2Smrg 	  show_expr (c->expr1);
1998627f7eb2Smrg 	  d = c->block;
1999627f7eb2Smrg 	  if (d != NULL)
2000627f7eb2Smrg 	    {
2001627f7eb2Smrg 	      fputs (", (", dumpfile);
2002627f7eb2Smrg 	      for (; d; d = d ->block)
2003627f7eb2Smrg 		{
2004627f7eb2Smrg 		  code_indent (level, d->label1);
2005627f7eb2Smrg 		  if (d->block != NULL)
2006627f7eb2Smrg 		    fputc (',', dumpfile);
2007627f7eb2Smrg 		  else
2008627f7eb2Smrg 		    fputc (')', dumpfile);
2009627f7eb2Smrg 		}
2010627f7eb2Smrg 	    }
2011627f7eb2Smrg 	}
2012627f7eb2Smrg       break;
2013627f7eb2Smrg 
2014627f7eb2Smrg     case EXEC_CALL:
2015627f7eb2Smrg     case EXEC_ASSIGN_CALL:
2016627f7eb2Smrg       if (c->resolved_sym)
2017627f7eb2Smrg 	fprintf (dumpfile, "CALL %s ", c->resolved_sym->name);
2018627f7eb2Smrg       else if (c->symtree)
2019627f7eb2Smrg 	fprintf (dumpfile, "CALL %s ", c->symtree->name);
2020627f7eb2Smrg       else
2021627f7eb2Smrg 	fputs ("CALL ?? ", dumpfile);
2022627f7eb2Smrg 
2023627f7eb2Smrg       show_actual_arglist (c->ext.actual);
2024627f7eb2Smrg       break;
2025627f7eb2Smrg 
2026627f7eb2Smrg     case EXEC_COMPCALL:
2027627f7eb2Smrg       fputs ("CALL ", dumpfile);
2028627f7eb2Smrg       show_compcall (c->expr1);
2029627f7eb2Smrg       break;
2030627f7eb2Smrg 
2031627f7eb2Smrg     case EXEC_CALL_PPC:
2032627f7eb2Smrg       fputs ("CALL ", dumpfile);
2033627f7eb2Smrg       show_expr (c->expr1);
2034627f7eb2Smrg       show_actual_arglist (c->ext.actual);
2035627f7eb2Smrg       break;
2036627f7eb2Smrg 
2037627f7eb2Smrg     case EXEC_RETURN:
2038627f7eb2Smrg       fputs ("RETURN ", dumpfile);
2039627f7eb2Smrg       if (c->expr1)
2040627f7eb2Smrg 	show_expr (c->expr1);
2041627f7eb2Smrg       break;
2042627f7eb2Smrg 
2043627f7eb2Smrg     case EXEC_PAUSE:
2044627f7eb2Smrg       fputs ("PAUSE ", dumpfile);
2045627f7eb2Smrg 
2046627f7eb2Smrg       if (c->expr1 != NULL)
2047627f7eb2Smrg 	show_expr (c->expr1);
2048627f7eb2Smrg       else
2049627f7eb2Smrg 	fprintf (dumpfile, "%d", c->ext.stop_code);
2050627f7eb2Smrg 
2051627f7eb2Smrg       break;
2052627f7eb2Smrg 
2053627f7eb2Smrg     case EXEC_ERROR_STOP:
2054627f7eb2Smrg       fputs ("ERROR ", dumpfile);
2055627f7eb2Smrg       /* Fall through.  */
2056627f7eb2Smrg 
2057627f7eb2Smrg     case EXEC_STOP:
2058627f7eb2Smrg       fputs ("STOP ", dumpfile);
2059627f7eb2Smrg 
2060627f7eb2Smrg       if (c->expr1 != NULL)
2061627f7eb2Smrg 	show_expr (c->expr1);
2062627f7eb2Smrg       else
2063627f7eb2Smrg 	fprintf (dumpfile, "%d", c->ext.stop_code);
2064627f7eb2Smrg 
2065627f7eb2Smrg       break;
2066627f7eb2Smrg 
2067627f7eb2Smrg     case EXEC_FAIL_IMAGE:
2068627f7eb2Smrg       fputs ("FAIL IMAGE ", dumpfile);
2069627f7eb2Smrg       break;
2070627f7eb2Smrg 
2071627f7eb2Smrg     case EXEC_CHANGE_TEAM:
2072627f7eb2Smrg       fputs ("CHANGE TEAM", dumpfile);
2073627f7eb2Smrg       break;
2074627f7eb2Smrg 
2075627f7eb2Smrg     case EXEC_END_TEAM:
2076627f7eb2Smrg       fputs ("END TEAM", dumpfile);
2077627f7eb2Smrg       break;
2078627f7eb2Smrg 
2079627f7eb2Smrg     case EXEC_FORM_TEAM:
2080627f7eb2Smrg       fputs ("FORM TEAM", dumpfile);
2081627f7eb2Smrg       break;
2082627f7eb2Smrg 
2083627f7eb2Smrg     case EXEC_SYNC_TEAM:
2084627f7eb2Smrg       fputs ("SYNC TEAM", dumpfile);
2085627f7eb2Smrg       break;
2086627f7eb2Smrg 
2087627f7eb2Smrg     case EXEC_SYNC_ALL:
2088627f7eb2Smrg       fputs ("SYNC ALL ", dumpfile);
2089627f7eb2Smrg       if (c->expr2 != NULL)
2090627f7eb2Smrg 	{
2091627f7eb2Smrg 	  fputs (" stat=", dumpfile);
2092627f7eb2Smrg 	  show_expr (c->expr2);
2093627f7eb2Smrg 	}
2094627f7eb2Smrg       if (c->expr3 != NULL)
2095627f7eb2Smrg 	{
2096627f7eb2Smrg 	  fputs (" errmsg=", dumpfile);
2097627f7eb2Smrg 	  show_expr (c->expr3);
2098627f7eb2Smrg 	}
2099627f7eb2Smrg       break;
2100627f7eb2Smrg 
2101627f7eb2Smrg     case EXEC_SYNC_MEMORY:
2102627f7eb2Smrg       fputs ("SYNC MEMORY ", dumpfile);
2103627f7eb2Smrg       if (c->expr2 != NULL)
2104627f7eb2Smrg  	{
2105627f7eb2Smrg 	  fputs (" stat=", dumpfile);
2106627f7eb2Smrg 	  show_expr (c->expr2);
2107627f7eb2Smrg 	}
2108627f7eb2Smrg       if (c->expr3 != NULL)
2109627f7eb2Smrg 	{
2110627f7eb2Smrg 	  fputs (" errmsg=", dumpfile);
2111627f7eb2Smrg 	  show_expr (c->expr3);
2112627f7eb2Smrg 	}
2113627f7eb2Smrg       break;
2114627f7eb2Smrg 
2115627f7eb2Smrg     case EXEC_SYNC_IMAGES:
2116627f7eb2Smrg       fputs ("SYNC IMAGES  image-set=", dumpfile);
2117627f7eb2Smrg       if (c->expr1 != NULL)
2118627f7eb2Smrg 	show_expr (c->expr1);
2119627f7eb2Smrg       else
2120627f7eb2Smrg 	fputs ("* ", dumpfile);
2121627f7eb2Smrg       if (c->expr2 != NULL)
2122627f7eb2Smrg 	{
2123627f7eb2Smrg 	  fputs (" stat=", dumpfile);
2124627f7eb2Smrg 	  show_expr (c->expr2);
2125627f7eb2Smrg 	}
2126627f7eb2Smrg       if (c->expr3 != NULL)
2127627f7eb2Smrg 	{
2128627f7eb2Smrg 	  fputs (" errmsg=", dumpfile);
2129627f7eb2Smrg 	  show_expr (c->expr3);
2130627f7eb2Smrg 	}
2131627f7eb2Smrg       break;
2132627f7eb2Smrg 
2133627f7eb2Smrg     case EXEC_EVENT_POST:
2134627f7eb2Smrg     case EXEC_EVENT_WAIT:
2135627f7eb2Smrg       if (c->op == EXEC_EVENT_POST)
2136627f7eb2Smrg 	fputs ("EVENT POST ", dumpfile);
2137627f7eb2Smrg       else
2138627f7eb2Smrg 	fputs ("EVENT WAIT ", dumpfile);
2139627f7eb2Smrg 
2140627f7eb2Smrg       fputs ("event-variable=", dumpfile);
2141627f7eb2Smrg       if (c->expr1 != NULL)
2142627f7eb2Smrg 	show_expr (c->expr1);
2143627f7eb2Smrg       if (c->expr4 != NULL)
2144627f7eb2Smrg 	{
2145627f7eb2Smrg 	  fputs (" until_count=", dumpfile);
2146627f7eb2Smrg 	  show_expr (c->expr4);
2147627f7eb2Smrg 	}
2148627f7eb2Smrg       if (c->expr2 != NULL)
2149627f7eb2Smrg 	{
2150627f7eb2Smrg 	  fputs (" stat=", dumpfile);
2151627f7eb2Smrg 	  show_expr (c->expr2);
2152627f7eb2Smrg 	}
2153627f7eb2Smrg       if (c->expr3 != NULL)
2154627f7eb2Smrg 	{
2155627f7eb2Smrg 	  fputs (" errmsg=", dumpfile);
2156627f7eb2Smrg 	  show_expr (c->expr3);
2157627f7eb2Smrg 	}
2158627f7eb2Smrg       break;
2159627f7eb2Smrg 
2160627f7eb2Smrg     case EXEC_LOCK:
2161627f7eb2Smrg     case EXEC_UNLOCK:
2162627f7eb2Smrg       if (c->op == EXEC_LOCK)
2163627f7eb2Smrg 	fputs ("LOCK ", dumpfile);
2164627f7eb2Smrg       else
2165627f7eb2Smrg 	fputs ("UNLOCK ", dumpfile);
2166627f7eb2Smrg 
2167627f7eb2Smrg       fputs ("lock-variable=", dumpfile);
2168627f7eb2Smrg       if (c->expr1 != NULL)
2169627f7eb2Smrg 	show_expr (c->expr1);
2170627f7eb2Smrg       if (c->expr4 != NULL)
2171627f7eb2Smrg 	{
2172627f7eb2Smrg 	  fputs (" acquired_lock=", dumpfile);
2173627f7eb2Smrg 	  show_expr (c->expr4);
2174627f7eb2Smrg 	}
2175627f7eb2Smrg       if (c->expr2 != NULL)
2176627f7eb2Smrg 	{
2177627f7eb2Smrg 	  fputs (" stat=", dumpfile);
2178627f7eb2Smrg 	  show_expr (c->expr2);
2179627f7eb2Smrg 	}
2180627f7eb2Smrg       if (c->expr3 != NULL)
2181627f7eb2Smrg 	{
2182627f7eb2Smrg 	  fputs (" errmsg=", dumpfile);
2183627f7eb2Smrg 	  show_expr (c->expr3);
2184627f7eb2Smrg 	}
2185627f7eb2Smrg       break;
2186627f7eb2Smrg 
2187627f7eb2Smrg     case EXEC_ARITHMETIC_IF:
2188627f7eb2Smrg       fputs ("IF ", dumpfile);
2189627f7eb2Smrg       show_expr (c->expr1);
2190627f7eb2Smrg       fprintf (dumpfile, " %d, %d, %d",
2191627f7eb2Smrg 		  c->label1->value, c->label2->value, c->label3->value);
2192627f7eb2Smrg       break;
2193627f7eb2Smrg 
2194627f7eb2Smrg     case EXEC_IF:
2195627f7eb2Smrg       d = c->block;
2196627f7eb2Smrg       fputs ("IF ", dumpfile);
2197627f7eb2Smrg       show_expr (d->expr1);
2198627f7eb2Smrg 
2199627f7eb2Smrg       ++show_level;
2200627f7eb2Smrg       show_code (level + 1, d->next);
2201627f7eb2Smrg       --show_level;
2202627f7eb2Smrg 
2203627f7eb2Smrg       d = d->block;
2204627f7eb2Smrg       for (; d; d = d->block)
2205627f7eb2Smrg 	{
2206627f7eb2Smrg 	  fputs("\n", dumpfile);
2207627f7eb2Smrg 	  code_indent (level, 0);
2208627f7eb2Smrg 	  if (d->expr1 == NULL)
2209627f7eb2Smrg 	    fputs ("ELSE", dumpfile);
2210627f7eb2Smrg 	  else
2211627f7eb2Smrg 	    {
2212627f7eb2Smrg 	      fputs ("ELSE IF ", dumpfile);
2213627f7eb2Smrg 	      show_expr (d->expr1);
2214627f7eb2Smrg 	    }
2215627f7eb2Smrg 
2216627f7eb2Smrg 	  ++show_level;
2217627f7eb2Smrg 	  show_code (level + 1, d->next);
2218627f7eb2Smrg 	  --show_level;
2219627f7eb2Smrg 	}
2220627f7eb2Smrg 
2221627f7eb2Smrg       if (c->label1)
2222627f7eb2Smrg 	code_indent (level, c->label1);
2223627f7eb2Smrg       else
2224627f7eb2Smrg 	show_indent ();
2225627f7eb2Smrg 
2226627f7eb2Smrg       fputs ("ENDIF", dumpfile);
2227627f7eb2Smrg       break;
2228627f7eb2Smrg 
2229627f7eb2Smrg     case EXEC_BLOCK:
2230627f7eb2Smrg       {
2231627f7eb2Smrg 	const char* blocktype;
2232627f7eb2Smrg 	gfc_namespace *saved_ns;
2233627f7eb2Smrg 	gfc_association_list *alist;
2234627f7eb2Smrg 
2235627f7eb2Smrg 	if (c->ext.block.assoc)
2236627f7eb2Smrg 	  blocktype = "ASSOCIATE";
2237627f7eb2Smrg 	else
2238627f7eb2Smrg 	  blocktype = "BLOCK";
2239627f7eb2Smrg 	show_indent ();
2240627f7eb2Smrg 	fprintf (dumpfile, "%s ", blocktype);
2241627f7eb2Smrg 	for (alist = c->ext.block.assoc; alist; alist = alist->next)
2242627f7eb2Smrg 	  {
2243627f7eb2Smrg 	    fprintf (dumpfile, " %s = ", alist->name);
2244627f7eb2Smrg 	    show_expr (alist->target);
2245627f7eb2Smrg 	  }
2246627f7eb2Smrg 
2247627f7eb2Smrg 	++show_level;
2248627f7eb2Smrg 	ns = c->ext.block.ns;
2249627f7eb2Smrg 	saved_ns = gfc_current_ns;
2250627f7eb2Smrg 	gfc_current_ns = ns;
2251627f7eb2Smrg 	gfc_traverse_symtree (ns->sym_root, show_symtree);
2252627f7eb2Smrg 	gfc_current_ns = saved_ns;
2253627f7eb2Smrg 	show_code (show_level, ns->code);
2254627f7eb2Smrg 	--show_level;
2255627f7eb2Smrg 	show_indent ();
2256627f7eb2Smrg 	fprintf (dumpfile, "END %s ", blocktype);
2257627f7eb2Smrg 	break;
2258627f7eb2Smrg       }
2259627f7eb2Smrg 
2260627f7eb2Smrg     case EXEC_END_BLOCK:
2261627f7eb2Smrg       /* Only come here when there is a label on an
2262627f7eb2Smrg 	 END ASSOCIATE construct.  */
2263627f7eb2Smrg       break;
2264627f7eb2Smrg 
2265627f7eb2Smrg     case EXEC_SELECT:
2266627f7eb2Smrg     case EXEC_SELECT_TYPE:
2267*4c3eb207Smrg     case EXEC_SELECT_RANK:
2268627f7eb2Smrg       d = c->block;
2269*4c3eb207Smrg       fputc ('\n', dumpfile);
2270*4c3eb207Smrg       code_indent (level, 0);
2271*4c3eb207Smrg       if (c->op == EXEC_SELECT_RANK)
2272*4c3eb207Smrg 	fputs ("SELECT RANK ", dumpfile);
2273*4c3eb207Smrg       else if (c->op == EXEC_SELECT_TYPE)
2274627f7eb2Smrg 	fputs ("SELECT TYPE ", dumpfile);
2275627f7eb2Smrg       else
2276627f7eb2Smrg 	fputs ("SELECT CASE ", dumpfile);
2277627f7eb2Smrg       show_expr (c->expr1);
2278627f7eb2Smrg 
2279627f7eb2Smrg       for (; d; d = d->block)
2280627f7eb2Smrg 	{
2281*4c3eb207Smrg 	  fputc ('\n', dumpfile);
2282627f7eb2Smrg 	  code_indent (level, 0);
2283627f7eb2Smrg 	  fputs ("CASE ", dumpfile);
2284627f7eb2Smrg 	  for (cp = d->ext.block.case_list; cp; cp = cp->next)
2285627f7eb2Smrg 	    {
2286627f7eb2Smrg 	      fputc ('(', dumpfile);
2287627f7eb2Smrg 	      show_expr (cp->low);
2288627f7eb2Smrg 	      fputc (' ', dumpfile);
2289627f7eb2Smrg 	      show_expr (cp->high);
2290627f7eb2Smrg 	      fputc (')', dumpfile);
2291627f7eb2Smrg 	      fputc (' ', dumpfile);
2292627f7eb2Smrg 	    }
2293627f7eb2Smrg 
2294627f7eb2Smrg 	  show_code (level + 1, d->next);
2295*4c3eb207Smrg 	  fputc ('\n', dumpfile);
2296627f7eb2Smrg 	}
2297627f7eb2Smrg 
2298627f7eb2Smrg       code_indent (level, c->label1);
2299627f7eb2Smrg       fputs ("END SELECT", dumpfile);
2300627f7eb2Smrg       break;
2301627f7eb2Smrg 
2302627f7eb2Smrg     case EXEC_WHERE:
2303627f7eb2Smrg       fputs ("WHERE ", dumpfile);
2304627f7eb2Smrg 
2305627f7eb2Smrg       d = c->block;
2306627f7eb2Smrg       show_expr (d->expr1);
2307627f7eb2Smrg       fputc ('\n', dumpfile);
2308627f7eb2Smrg 
2309627f7eb2Smrg       show_code (level + 1, d->next);
2310627f7eb2Smrg 
2311627f7eb2Smrg       for (d = d->block; d; d = d->block)
2312627f7eb2Smrg 	{
2313627f7eb2Smrg 	  code_indent (level, 0);
2314627f7eb2Smrg 	  fputs ("ELSE WHERE ", dumpfile);
2315627f7eb2Smrg 	  show_expr (d->expr1);
2316627f7eb2Smrg 	  fputc ('\n', dumpfile);
2317627f7eb2Smrg 	  show_code (level + 1, d->next);
2318627f7eb2Smrg 	}
2319627f7eb2Smrg 
2320627f7eb2Smrg       code_indent (level, 0);
2321627f7eb2Smrg       fputs ("END WHERE", dumpfile);
2322627f7eb2Smrg       break;
2323627f7eb2Smrg 
2324627f7eb2Smrg 
2325627f7eb2Smrg     case EXEC_FORALL:
2326627f7eb2Smrg       fputs ("FORALL ", dumpfile);
2327627f7eb2Smrg       for (fa = c->ext.forall_iterator; fa; fa = fa->next)
2328627f7eb2Smrg 	{
2329627f7eb2Smrg 	  show_expr (fa->var);
2330627f7eb2Smrg 	  fputc (' ', dumpfile);
2331627f7eb2Smrg 	  show_expr (fa->start);
2332627f7eb2Smrg 	  fputc (':', dumpfile);
2333627f7eb2Smrg 	  show_expr (fa->end);
2334627f7eb2Smrg 	  fputc (':', dumpfile);
2335627f7eb2Smrg 	  show_expr (fa->stride);
2336627f7eb2Smrg 
2337627f7eb2Smrg 	  if (fa->next != NULL)
2338627f7eb2Smrg 	    fputc (',', dumpfile);
2339627f7eb2Smrg 	}
2340627f7eb2Smrg 
2341627f7eb2Smrg       if (c->expr1 != NULL)
2342627f7eb2Smrg 	{
2343627f7eb2Smrg 	  fputc (',', dumpfile);
2344627f7eb2Smrg 	  show_expr (c->expr1);
2345627f7eb2Smrg 	}
2346627f7eb2Smrg       fputc ('\n', dumpfile);
2347627f7eb2Smrg 
2348627f7eb2Smrg       show_code (level + 1, c->block->next);
2349627f7eb2Smrg 
2350627f7eb2Smrg       code_indent (level, 0);
2351627f7eb2Smrg       fputs ("END FORALL", dumpfile);
2352627f7eb2Smrg       break;
2353627f7eb2Smrg 
2354627f7eb2Smrg     case EXEC_CRITICAL:
2355627f7eb2Smrg       fputs ("CRITICAL\n", dumpfile);
2356627f7eb2Smrg       show_code (level + 1, c->block->next);
2357627f7eb2Smrg       code_indent (level, 0);
2358627f7eb2Smrg       fputs ("END CRITICAL", dumpfile);
2359627f7eb2Smrg       break;
2360627f7eb2Smrg 
2361627f7eb2Smrg     case EXEC_DO:
2362627f7eb2Smrg       fputs ("DO ", dumpfile);
2363627f7eb2Smrg       if (c->label1)
2364627f7eb2Smrg 	fprintf (dumpfile, " %-5d ", c->label1->value);
2365627f7eb2Smrg 
2366627f7eb2Smrg       show_expr (c->ext.iterator->var);
2367627f7eb2Smrg       fputc ('=', dumpfile);
2368627f7eb2Smrg       show_expr (c->ext.iterator->start);
2369627f7eb2Smrg       fputc (' ', dumpfile);
2370627f7eb2Smrg       show_expr (c->ext.iterator->end);
2371627f7eb2Smrg       fputc (' ', dumpfile);
2372627f7eb2Smrg       show_expr (c->ext.iterator->step);
2373627f7eb2Smrg 
2374627f7eb2Smrg       ++show_level;
2375627f7eb2Smrg       show_code (level + 1, c->block->next);
2376627f7eb2Smrg       --show_level;
2377627f7eb2Smrg 
2378627f7eb2Smrg       if (c->label1)
2379627f7eb2Smrg 	break;
2380627f7eb2Smrg 
2381627f7eb2Smrg       show_indent ();
2382627f7eb2Smrg       fputs ("END DO", dumpfile);
2383627f7eb2Smrg       break;
2384627f7eb2Smrg 
2385627f7eb2Smrg     case EXEC_DO_CONCURRENT:
2386627f7eb2Smrg       fputs ("DO CONCURRENT ", dumpfile);
2387627f7eb2Smrg       for (fa = c->ext.forall_iterator; fa; fa = fa->next)
2388627f7eb2Smrg         {
2389627f7eb2Smrg           show_expr (fa->var);
2390627f7eb2Smrg           fputc (' ', dumpfile);
2391627f7eb2Smrg           show_expr (fa->start);
2392627f7eb2Smrg           fputc (':', dumpfile);
2393627f7eb2Smrg           show_expr (fa->end);
2394627f7eb2Smrg           fputc (':', dumpfile);
2395627f7eb2Smrg           show_expr (fa->stride);
2396627f7eb2Smrg 
2397627f7eb2Smrg           if (fa->next != NULL)
2398627f7eb2Smrg             fputc (',', dumpfile);
2399627f7eb2Smrg         }
2400627f7eb2Smrg       show_expr (c->expr1);
2401627f7eb2Smrg       ++show_level;
2402627f7eb2Smrg 
2403627f7eb2Smrg       show_code (level + 1, c->block->next);
2404627f7eb2Smrg       --show_level;
2405627f7eb2Smrg       code_indent (level, c->label1);
2406627f7eb2Smrg       show_indent ();
2407627f7eb2Smrg       fputs ("END DO", dumpfile);
2408627f7eb2Smrg       break;
2409627f7eb2Smrg 
2410627f7eb2Smrg     case EXEC_DO_WHILE:
2411627f7eb2Smrg       fputs ("DO WHILE ", dumpfile);
2412627f7eb2Smrg       show_expr (c->expr1);
2413627f7eb2Smrg       fputc ('\n', dumpfile);
2414627f7eb2Smrg 
2415627f7eb2Smrg       show_code (level + 1, c->block->next);
2416627f7eb2Smrg 
2417627f7eb2Smrg       code_indent (level, c->label1);
2418627f7eb2Smrg       fputs ("END DO", dumpfile);
2419627f7eb2Smrg       break;
2420627f7eb2Smrg 
2421627f7eb2Smrg     case EXEC_CYCLE:
2422627f7eb2Smrg       fputs ("CYCLE", dumpfile);
2423627f7eb2Smrg       if (c->symtree)
2424627f7eb2Smrg 	fprintf (dumpfile, " %s", c->symtree->n.sym->name);
2425627f7eb2Smrg       break;
2426627f7eb2Smrg 
2427627f7eb2Smrg     case EXEC_EXIT:
2428627f7eb2Smrg       fputs ("EXIT", dumpfile);
2429627f7eb2Smrg       if (c->symtree)
2430627f7eb2Smrg 	fprintf (dumpfile, " %s", c->symtree->n.sym->name);
2431627f7eb2Smrg       break;
2432627f7eb2Smrg 
2433627f7eb2Smrg     case EXEC_ALLOCATE:
2434627f7eb2Smrg       fputs ("ALLOCATE ", dumpfile);
2435627f7eb2Smrg       if (c->expr1)
2436627f7eb2Smrg 	{
2437627f7eb2Smrg 	  fputs (" STAT=", dumpfile);
2438627f7eb2Smrg 	  show_expr (c->expr1);
2439627f7eb2Smrg 	}
2440627f7eb2Smrg 
2441627f7eb2Smrg       if (c->expr2)
2442627f7eb2Smrg 	{
2443627f7eb2Smrg 	  fputs (" ERRMSG=", dumpfile);
2444627f7eb2Smrg 	  show_expr (c->expr2);
2445627f7eb2Smrg 	}
2446627f7eb2Smrg 
2447627f7eb2Smrg       if (c->expr3)
2448627f7eb2Smrg 	{
2449627f7eb2Smrg 	  if (c->expr3->mold)
2450627f7eb2Smrg 	    fputs (" MOLD=", dumpfile);
2451627f7eb2Smrg 	  else
2452627f7eb2Smrg 	    fputs (" SOURCE=", dumpfile);
2453627f7eb2Smrg 	  show_expr (c->expr3);
2454627f7eb2Smrg 	}
2455627f7eb2Smrg 
2456627f7eb2Smrg       for (a = c->ext.alloc.list; a; a = a->next)
2457627f7eb2Smrg 	{
2458627f7eb2Smrg 	  fputc (' ', dumpfile);
2459627f7eb2Smrg 	  show_expr (a->expr);
2460627f7eb2Smrg 	}
2461627f7eb2Smrg 
2462627f7eb2Smrg       break;
2463627f7eb2Smrg 
2464627f7eb2Smrg     case EXEC_DEALLOCATE:
2465627f7eb2Smrg       fputs ("DEALLOCATE ", dumpfile);
2466627f7eb2Smrg       if (c->expr1)
2467627f7eb2Smrg 	{
2468627f7eb2Smrg 	  fputs (" STAT=", dumpfile);
2469627f7eb2Smrg 	  show_expr (c->expr1);
2470627f7eb2Smrg 	}
2471627f7eb2Smrg 
2472627f7eb2Smrg       if (c->expr2)
2473627f7eb2Smrg 	{
2474627f7eb2Smrg 	  fputs (" ERRMSG=", dumpfile);
2475627f7eb2Smrg 	  show_expr (c->expr2);
2476627f7eb2Smrg 	}
2477627f7eb2Smrg 
2478627f7eb2Smrg       for (a = c->ext.alloc.list; a; a = a->next)
2479627f7eb2Smrg 	{
2480627f7eb2Smrg 	  fputc (' ', dumpfile);
2481627f7eb2Smrg 	  show_expr (a->expr);
2482627f7eb2Smrg 	}
2483627f7eb2Smrg 
2484627f7eb2Smrg       break;
2485627f7eb2Smrg 
2486627f7eb2Smrg     case EXEC_OPEN:
2487627f7eb2Smrg       fputs ("OPEN", dumpfile);
2488627f7eb2Smrg       open = c->ext.open;
2489627f7eb2Smrg 
2490627f7eb2Smrg       if (open->unit)
2491627f7eb2Smrg 	{
2492627f7eb2Smrg 	  fputs (" UNIT=", dumpfile);
2493627f7eb2Smrg 	  show_expr (open->unit);
2494627f7eb2Smrg 	}
2495627f7eb2Smrg       if (open->iomsg)
2496627f7eb2Smrg 	{
2497627f7eb2Smrg 	  fputs (" IOMSG=", dumpfile);
2498627f7eb2Smrg 	  show_expr (open->iomsg);
2499627f7eb2Smrg 	}
2500627f7eb2Smrg       if (open->iostat)
2501627f7eb2Smrg 	{
2502627f7eb2Smrg 	  fputs (" IOSTAT=", dumpfile);
2503627f7eb2Smrg 	  show_expr (open->iostat);
2504627f7eb2Smrg 	}
2505627f7eb2Smrg       if (open->file)
2506627f7eb2Smrg 	{
2507627f7eb2Smrg 	  fputs (" FILE=", dumpfile);
2508627f7eb2Smrg 	  show_expr (open->file);
2509627f7eb2Smrg 	}
2510627f7eb2Smrg       if (open->status)
2511627f7eb2Smrg 	{
2512627f7eb2Smrg 	  fputs (" STATUS=", dumpfile);
2513627f7eb2Smrg 	  show_expr (open->status);
2514627f7eb2Smrg 	}
2515627f7eb2Smrg       if (open->access)
2516627f7eb2Smrg 	{
2517627f7eb2Smrg 	  fputs (" ACCESS=", dumpfile);
2518627f7eb2Smrg 	  show_expr (open->access);
2519627f7eb2Smrg 	}
2520627f7eb2Smrg       if (open->form)
2521627f7eb2Smrg 	{
2522627f7eb2Smrg 	  fputs (" FORM=", dumpfile);
2523627f7eb2Smrg 	  show_expr (open->form);
2524627f7eb2Smrg 	}
2525627f7eb2Smrg       if (open->recl)
2526627f7eb2Smrg 	{
2527627f7eb2Smrg 	  fputs (" RECL=", dumpfile);
2528627f7eb2Smrg 	  show_expr (open->recl);
2529627f7eb2Smrg 	}
2530627f7eb2Smrg       if (open->blank)
2531627f7eb2Smrg 	{
2532627f7eb2Smrg 	  fputs (" BLANK=", dumpfile);
2533627f7eb2Smrg 	  show_expr (open->blank);
2534627f7eb2Smrg 	}
2535627f7eb2Smrg       if (open->position)
2536627f7eb2Smrg 	{
2537627f7eb2Smrg 	  fputs (" POSITION=", dumpfile);
2538627f7eb2Smrg 	  show_expr (open->position);
2539627f7eb2Smrg 	}
2540627f7eb2Smrg       if (open->action)
2541627f7eb2Smrg 	{
2542627f7eb2Smrg 	  fputs (" ACTION=", dumpfile);
2543627f7eb2Smrg 	  show_expr (open->action);
2544627f7eb2Smrg 	}
2545627f7eb2Smrg       if (open->delim)
2546627f7eb2Smrg 	{
2547627f7eb2Smrg 	  fputs (" DELIM=", dumpfile);
2548627f7eb2Smrg 	  show_expr (open->delim);
2549627f7eb2Smrg 	}
2550627f7eb2Smrg       if (open->pad)
2551627f7eb2Smrg 	{
2552627f7eb2Smrg 	  fputs (" PAD=", dumpfile);
2553627f7eb2Smrg 	  show_expr (open->pad);
2554627f7eb2Smrg 	}
2555627f7eb2Smrg       if (open->decimal)
2556627f7eb2Smrg 	{
2557627f7eb2Smrg 	  fputs (" DECIMAL=", dumpfile);
2558627f7eb2Smrg 	  show_expr (open->decimal);
2559627f7eb2Smrg 	}
2560627f7eb2Smrg       if (open->encoding)
2561627f7eb2Smrg 	{
2562627f7eb2Smrg 	  fputs (" ENCODING=", dumpfile);
2563627f7eb2Smrg 	  show_expr (open->encoding);
2564627f7eb2Smrg 	}
2565627f7eb2Smrg       if (open->round)
2566627f7eb2Smrg 	{
2567627f7eb2Smrg 	  fputs (" ROUND=", dumpfile);
2568627f7eb2Smrg 	  show_expr (open->round);
2569627f7eb2Smrg 	}
2570627f7eb2Smrg       if (open->sign)
2571627f7eb2Smrg 	{
2572627f7eb2Smrg 	  fputs (" SIGN=", dumpfile);
2573627f7eb2Smrg 	  show_expr (open->sign);
2574627f7eb2Smrg 	}
2575627f7eb2Smrg       if (open->convert)
2576627f7eb2Smrg 	{
2577627f7eb2Smrg 	  fputs (" CONVERT=", dumpfile);
2578627f7eb2Smrg 	  show_expr (open->convert);
2579627f7eb2Smrg 	}
2580627f7eb2Smrg       if (open->asynchronous)
2581627f7eb2Smrg 	{
2582627f7eb2Smrg 	  fputs (" ASYNCHRONOUS=", dumpfile);
2583627f7eb2Smrg 	  show_expr (open->asynchronous);
2584627f7eb2Smrg 	}
2585627f7eb2Smrg       if (open->err != NULL)
2586627f7eb2Smrg 	fprintf (dumpfile, " ERR=%d", open->err->value);
2587627f7eb2Smrg 
2588627f7eb2Smrg       break;
2589627f7eb2Smrg 
2590627f7eb2Smrg     case EXEC_CLOSE:
2591627f7eb2Smrg       fputs ("CLOSE", dumpfile);
2592627f7eb2Smrg       close = c->ext.close;
2593627f7eb2Smrg 
2594627f7eb2Smrg       if (close->unit)
2595627f7eb2Smrg 	{
2596627f7eb2Smrg 	  fputs (" UNIT=", dumpfile);
2597627f7eb2Smrg 	  show_expr (close->unit);
2598627f7eb2Smrg 	}
2599627f7eb2Smrg       if (close->iomsg)
2600627f7eb2Smrg 	{
2601627f7eb2Smrg 	  fputs (" IOMSG=", dumpfile);
2602627f7eb2Smrg 	  show_expr (close->iomsg);
2603627f7eb2Smrg 	}
2604627f7eb2Smrg       if (close->iostat)
2605627f7eb2Smrg 	{
2606627f7eb2Smrg 	  fputs (" IOSTAT=", dumpfile);
2607627f7eb2Smrg 	  show_expr (close->iostat);
2608627f7eb2Smrg 	}
2609627f7eb2Smrg       if (close->status)
2610627f7eb2Smrg 	{
2611627f7eb2Smrg 	  fputs (" STATUS=", dumpfile);
2612627f7eb2Smrg 	  show_expr (close->status);
2613627f7eb2Smrg 	}
2614627f7eb2Smrg       if (close->err != NULL)
2615627f7eb2Smrg 	fprintf (dumpfile, " ERR=%d", close->err->value);
2616627f7eb2Smrg       break;
2617627f7eb2Smrg 
2618627f7eb2Smrg     case EXEC_BACKSPACE:
2619627f7eb2Smrg       fputs ("BACKSPACE", dumpfile);
2620627f7eb2Smrg       goto show_filepos;
2621627f7eb2Smrg 
2622627f7eb2Smrg     case EXEC_ENDFILE:
2623627f7eb2Smrg       fputs ("ENDFILE", dumpfile);
2624627f7eb2Smrg       goto show_filepos;
2625627f7eb2Smrg 
2626627f7eb2Smrg     case EXEC_REWIND:
2627627f7eb2Smrg       fputs ("REWIND", dumpfile);
2628627f7eb2Smrg       goto show_filepos;
2629627f7eb2Smrg 
2630627f7eb2Smrg     case EXEC_FLUSH:
2631627f7eb2Smrg       fputs ("FLUSH", dumpfile);
2632627f7eb2Smrg 
2633627f7eb2Smrg     show_filepos:
2634627f7eb2Smrg       fp = c->ext.filepos;
2635627f7eb2Smrg 
2636627f7eb2Smrg       if (fp->unit)
2637627f7eb2Smrg 	{
2638627f7eb2Smrg 	  fputs (" UNIT=", dumpfile);
2639627f7eb2Smrg 	  show_expr (fp->unit);
2640627f7eb2Smrg 	}
2641627f7eb2Smrg       if (fp->iomsg)
2642627f7eb2Smrg 	{
2643627f7eb2Smrg 	  fputs (" IOMSG=", dumpfile);
2644627f7eb2Smrg 	  show_expr (fp->iomsg);
2645627f7eb2Smrg 	}
2646627f7eb2Smrg       if (fp->iostat)
2647627f7eb2Smrg 	{
2648627f7eb2Smrg 	  fputs (" IOSTAT=", dumpfile);
2649627f7eb2Smrg 	  show_expr (fp->iostat);
2650627f7eb2Smrg 	}
2651627f7eb2Smrg       if (fp->err != NULL)
2652627f7eb2Smrg 	fprintf (dumpfile, " ERR=%d", fp->err->value);
2653627f7eb2Smrg       break;
2654627f7eb2Smrg 
2655627f7eb2Smrg     case EXEC_INQUIRE:
2656627f7eb2Smrg       fputs ("INQUIRE", dumpfile);
2657627f7eb2Smrg       i = c->ext.inquire;
2658627f7eb2Smrg 
2659627f7eb2Smrg       if (i->unit)
2660627f7eb2Smrg 	{
2661627f7eb2Smrg 	  fputs (" UNIT=", dumpfile);
2662627f7eb2Smrg 	  show_expr (i->unit);
2663627f7eb2Smrg 	}
2664627f7eb2Smrg       if (i->file)
2665627f7eb2Smrg 	{
2666627f7eb2Smrg 	  fputs (" FILE=", dumpfile);
2667627f7eb2Smrg 	  show_expr (i->file);
2668627f7eb2Smrg 	}
2669627f7eb2Smrg 
2670627f7eb2Smrg       if (i->iomsg)
2671627f7eb2Smrg 	{
2672627f7eb2Smrg 	  fputs (" IOMSG=", dumpfile);
2673627f7eb2Smrg 	  show_expr (i->iomsg);
2674627f7eb2Smrg 	}
2675627f7eb2Smrg       if (i->iostat)
2676627f7eb2Smrg 	{
2677627f7eb2Smrg 	  fputs (" IOSTAT=", dumpfile);
2678627f7eb2Smrg 	  show_expr (i->iostat);
2679627f7eb2Smrg 	}
2680627f7eb2Smrg       if (i->exist)
2681627f7eb2Smrg 	{
2682627f7eb2Smrg 	  fputs (" EXIST=", dumpfile);
2683627f7eb2Smrg 	  show_expr (i->exist);
2684627f7eb2Smrg 	}
2685627f7eb2Smrg       if (i->opened)
2686627f7eb2Smrg 	{
2687627f7eb2Smrg 	  fputs (" OPENED=", dumpfile);
2688627f7eb2Smrg 	  show_expr (i->opened);
2689627f7eb2Smrg 	}
2690627f7eb2Smrg       if (i->number)
2691627f7eb2Smrg 	{
2692627f7eb2Smrg 	  fputs (" NUMBER=", dumpfile);
2693627f7eb2Smrg 	  show_expr (i->number);
2694627f7eb2Smrg 	}
2695627f7eb2Smrg       if (i->named)
2696627f7eb2Smrg 	{
2697627f7eb2Smrg 	  fputs (" NAMED=", dumpfile);
2698627f7eb2Smrg 	  show_expr (i->named);
2699627f7eb2Smrg 	}
2700627f7eb2Smrg       if (i->name)
2701627f7eb2Smrg 	{
2702627f7eb2Smrg 	  fputs (" NAME=", dumpfile);
2703627f7eb2Smrg 	  show_expr (i->name);
2704627f7eb2Smrg 	}
2705627f7eb2Smrg       if (i->access)
2706627f7eb2Smrg 	{
2707627f7eb2Smrg 	  fputs (" ACCESS=", dumpfile);
2708627f7eb2Smrg 	  show_expr (i->access);
2709627f7eb2Smrg 	}
2710627f7eb2Smrg       if (i->sequential)
2711627f7eb2Smrg 	{
2712627f7eb2Smrg 	  fputs (" SEQUENTIAL=", dumpfile);
2713627f7eb2Smrg 	  show_expr (i->sequential);
2714627f7eb2Smrg 	}
2715627f7eb2Smrg 
2716627f7eb2Smrg       if (i->direct)
2717627f7eb2Smrg 	{
2718627f7eb2Smrg 	  fputs (" DIRECT=", dumpfile);
2719627f7eb2Smrg 	  show_expr (i->direct);
2720627f7eb2Smrg 	}
2721627f7eb2Smrg       if (i->form)
2722627f7eb2Smrg 	{
2723627f7eb2Smrg 	  fputs (" FORM=", dumpfile);
2724627f7eb2Smrg 	  show_expr (i->form);
2725627f7eb2Smrg 	}
2726627f7eb2Smrg       if (i->formatted)
2727627f7eb2Smrg 	{
2728627f7eb2Smrg 	  fputs (" FORMATTED", dumpfile);
2729627f7eb2Smrg 	  show_expr (i->formatted);
2730627f7eb2Smrg 	}
2731627f7eb2Smrg       if (i->unformatted)
2732627f7eb2Smrg 	{
2733627f7eb2Smrg 	  fputs (" UNFORMATTED=", dumpfile);
2734627f7eb2Smrg 	  show_expr (i->unformatted);
2735627f7eb2Smrg 	}
2736627f7eb2Smrg       if (i->recl)
2737627f7eb2Smrg 	{
2738627f7eb2Smrg 	  fputs (" RECL=", dumpfile);
2739627f7eb2Smrg 	  show_expr (i->recl);
2740627f7eb2Smrg 	}
2741627f7eb2Smrg       if (i->nextrec)
2742627f7eb2Smrg 	{
2743627f7eb2Smrg 	  fputs (" NEXTREC=", dumpfile);
2744627f7eb2Smrg 	  show_expr (i->nextrec);
2745627f7eb2Smrg 	}
2746627f7eb2Smrg       if (i->blank)
2747627f7eb2Smrg 	{
2748627f7eb2Smrg 	  fputs (" BLANK=", dumpfile);
2749627f7eb2Smrg 	  show_expr (i->blank);
2750627f7eb2Smrg 	}
2751627f7eb2Smrg       if (i->position)
2752627f7eb2Smrg 	{
2753627f7eb2Smrg 	  fputs (" POSITION=", dumpfile);
2754627f7eb2Smrg 	  show_expr (i->position);
2755627f7eb2Smrg 	}
2756627f7eb2Smrg       if (i->action)
2757627f7eb2Smrg 	{
2758627f7eb2Smrg 	  fputs (" ACTION=", dumpfile);
2759627f7eb2Smrg 	  show_expr (i->action);
2760627f7eb2Smrg 	}
2761627f7eb2Smrg       if (i->read)
2762627f7eb2Smrg 	{
2763627f7eb2Smrg 	  fputs (" READ=", dumpfile);
2764627f7eb2Smrg 	  show_expr (i->read);
2765627f7eb2Smrg 	}
2766627f7eb2Smrg       if (i->write)
2767627f7eb2Smrg 	{
2768627f7eb2Smrg 	  fputs (" WRITE=", dumpfile);
2769627f7eb2Smrg 	  show_expr (i->write);
2770627f7eb2Smrg 	}
2771627f7eb2Smrg       if (i->readwrite)
2772627f7eb2Smrg 	{
2773627f7eb2Smrg 	  fputs (" READWRITE=", dumpfile);
2774627f7eb2Smrg 	  show_expr (i->readwrite);
2775627f7eb2Smrg 	}
2776627f7eb2Smrg       if (i->delim)
2777627f7eb2Smrg 	{
2778627f7eb2Smrg 	  fputs (" DELIM=", dumpfile);
2779627f7eb2Smrg 	  show_expr (i->delim);
2780627f7eb2Smrg 	}
2781627f7eb2Smrg       if (i->pad)
2782627f7eb2Smrg 	{
2783627f7eb2Smrg 	  fputs (" PAD=", dumpfile);
2784627f7eb2Smrg 	  show_expr (i->pad);
2785627f7eb2Smrg 	}
2786627f7eb2Smrg       if (i->convert)
2787627f7eb2Smrg 	{
2788627f7eb2Smrg 	  fputs (" CONVERT=", dumpfile);
2789627f7eb2Smrg 	  show_expr (i->convert);
2790627f7eb2Smrg 	}
2791627f7eb2Smrg       if (i->asynchronous)
2792627f7eb2Smrg 	{
2793627f7eb2Smrg 	  fputs (" ASYNCHRONOUS=", dumpfile);
2794627f7eb2Smrg 	  show_expr (i->asynchronous);
2795627f7eb2Smrg 	}
2796627f7eb2Smrg       if (i->decimal)
2797627f7eb2Smrg 	{
2798627f7eb2Smrg 	  fputs (" DECIMAL=", dumpfile);
2799627f7eb2Smrg 	  show_expr (i->decimal);
2800627f7eb2Smrg 	}
2801627f7eb2Smrg       if (i->encoding)
2802627f7eb2Smrg 	{
2803627f7eb2Smrg 	  fputs (" ENCODING=", dumpfile);
2804627f7eb2Smrg 	  show_expr (i->encoding);
2805627f7eb2Smrg 	}
2806627f7eb2Smrg       if (i->pending)
2807627f7eb2Smrg 	{
2808627f7eb2Smrg 	  fputs (" PENDING=", dumpfile);
2809627f7eb2Smrg 	  show_expr (i->pending);
2810627f7eb2Smrg 	}
2811627f7eb2Smrg       if (i->round)
2812627f7eb2Smrg 	{
2813627f7eb2Smrg 	  fputs (" ROUND=", dumpfile);
2814627f7eb2Smrg 	  show_expr (i->round);
2815627f7eb2Smrg 	}
2816627f7eb2Smrg       if (i->sign)
2817627f7eb2Smrg 	{
2818627f7eb2Smrg 	  fputs (" SIGN=", dumpfile);
2819627f7eb2Smrg 	  show_expr (i->sign);
2820627f7eb2Smrg 	}
2821627f7eb2Smrg       if (i->size)
2822627f7eb2Smrg 	{
2823627f7eb2Smrg 	  fputs (" SIZE=", dumpfile);
2824627f7eb2Smrg 	  show_expr (i->size);
2825627f7eb2Smrg 	}
2826627f7eb2Smrg       if (i->id)
2827627f7eb2Smrg 	{
2828627f7eb2Smrg 	  fputs (" ID=", dumpfile);
2829627f7eb2Smrg 	  show_expr (i->id);
2830627f7eb2Smrg 	}
2831627f7eb2Smrg 
2832627f7eb2Smrg       if (i->err != NULL)
2833627f7eb2Smrg 	fprintf (dumpfile, " ERR=%d", i->err->value);
2834627f7eb2Smrg       break;
2835627f7eb2Smrg 
2836627f7eb2Smrg     case EXEC_IOLENGTH:
2837627f7eb2Smrg       fputs ("IOLENGTH ", dumpfile);
2838627f7eb2Smrg       show_expr (c->expr1);
2839627f7eb2Smrg       goto show_dt_code;
2840627f7eb2Smrg       break;
2841627f7eb2Smrg 
2842627f7eb2Smrg     case EXEC_READ:
2843627f7eb2Smrg       fputs ("READ", dumpfile);
2844627f7eb2Smrg       goto show_dt;
2845627f7eb2Smrg 
2846627f7eb2Smrg     case EXEC_WRITE:
2847627f7eb2Smrg       fputs ("WRITE", dumpfile);
2848627f7eb2Smrg 
2849627f7eb2Smrg     show_dt:
2850627f7eb2Smrg       dt = c->ext.dt;
2851627f7eb2Smrg       if (dt->io_unit)
2852627f7eb2Smrg 	{
2853627f7eb2Smrg 	  fputs (" UNIT=", dumpfile);
2854627f7eb2Smrg 	  show_expr (dt->io_unit);
2855627f7eb2Smrg 	}
2856627f7eb2Smrg 
2857627f7eb2Smrg       if (dt->format_expr)
2858627f7eb2Smrg 	{
2859627f7eb2Smrg 	  fputs (" FMT=", dumpfile);
2860627f7eb2Smrg 	  show_expr (dt->format_expr);
2861627f7eb2Smrg 	}
2862627f7eb2Smrg 
2863627f7eb2Smrg       if (dt->format_label != NULL)
2864627f7eb2Smrg 	fprintf (dumpfile, " FMT=%d", dt->format_label->value);
2865627f7eb2Smrg       if (dt->namelist)
2866627f7eb2Smrg 	fprintf (dumpfile, " NML=%s", dt->namelist->name);
2867627f7eb2Smrg 
2868627f7eb2Smrg       if (dt->iomsg)
2869627f7eb2Smrg 	{
2870627f7eb2Smrg 	  fputs (" IOMSG=", dumpfile);
2871627f7eb2Smrg 	  show_expr (dt->iomsg);
2872627f7eb2Smrg 	}
2873627f7eb2Smrg       if (dt->iostat)
2874627f7eb2Smrg 	{
2875627f7eb2Smrg 	  fputs (" IOSTAT=", dumpfile);
2876627f7eb2Smrg 	  show_expr (dt->iostat);
2877627f7eb2Smrg 	}
2878627f7eb2Smrg       if (dt->size)
2879627f7eb2Smrg 	{
2880627f7eb2Smrg 	  fputs (" SIZE=", dumpfile);
2881627f7eb2Smrg 	  show_expr (dt->size);
2882627f7eb2Smrg 	}
2883627f7eb2Smrg       if (dt->rec)
2884627f7eb2Smrg 	{
2885627f7eb2Smrg 	  fputs (" REC=", dumpfile);
2886627f7eb2Smrg 	  show_expr (dt->rec);
2887627f7eb2Smrg 	}
2888627f7eb2Smrg       if (dt->advance)
2889627f7eb2Smrg 	{
2890627f7eb2Smrg 	  fputs (" ADVANCE=", dumpfile);
2891627f7eb2Smrg 	  show_expr (dt->advance);
2892627f7eb2Smrg 	}
2893627f7eb2Smrg       if (dt->id)
2894627f7eb2Smrg 	{
2895627f7eb2Smrg 	  fputs (" ID=", dumpfile);
2896627f7eb2Smrg 	  show_expr (dt->id);
2897627f7eb2Smrg 	}
2898627f7eb2Smrg       if (dt->pos)
2899627f7eb2Smrg 	{
2900627f7eb2Smrg 	  fputs (" POS=", dumpfile);
2901627f7eb2Smrg 	  show_expr (dt->pos);
2902627f7eb2Smrg 	}
2903627f7eb2Smrg       if (dt->asynchronous)
2904627f7eb2Smrg 	{
2905627f7eb2Smrg 	  fputs (" ASYNCHRONOUS=", dumpfile);
2906627f7eb2Smrg 	  show_expr (dt->asynchronous);
2907627f7eb2Smrg 	}
2908627f7eb2Smrg       if (dt->blank)
2909627f7eb2Smrg 	{
2910627f7eb2Smrg 	  fputs (" BLANK=", dumpfile);
2911627f7eb2Smrg 	  show_expr (dt->blank);
2912627f7eb2Smrg 	}
2913627f7eb2Smrg       if (dt->decimal)
2914627f7eb2Smrg 	{
2915627f7eb2Smrg 	  fputs (" DECIMAL=", dumpfile);
2916627f7eb2Smrg 	  show_expr (dt->decimal);
2917627f7eb2Smrg 	}
2918627f7eb2Smrg       if (dt->delim)
2919627f7eb2Smrg 	{
2920627f7eb2Smrg 	  fputs (" DELIM=", dumpfile);
2921627f7eb2Smrg 	  show_expr (dt->delim);
2922627f7eb2Smrg 	}
2923627f7eb2Smrg       if (dt->pad)
2924627f7eb2Smrg 	{
2925627f7eb2Smrg 	  fputs (" PAD=", dumpfile);
2926627f7eb2Smrg 	  show_expr (dt->pad);
2927627f7eb2Smrg 	}
2928627f7eb2Smrg       if (dt->round)
2929627f7eb2Smrg 	{
2930627f7eb2Smrg 	  fputs (" ROUND=", dumpfile);
2931627f7eb2Smrg 	  show_expr (dt->round);
2932627f7eb2Smrg 	}
2933627f7eb2Smrg       if (dt->sign)
2934627f7eb2Smrg 	{
2935627f7eb2Smrg 	  fputs (" SIGN=", dumpfile);
2936627f7eb2Smrg 	  show_expr (dt->sign);
2937627f7eb2Smrg 	}
2938627f7eb2Smrg 
2939627f7eb2Smrg     show_dt_code:
2940627f7eb2Smrg       for (c = c->block->next; c; c = c->next)
2941627f7eb2Smrg 	show_code_node (level + (c->next != NULL), c);
2942627f7eb2Smrg       return;
2943627f7eb2Smrg 
2944627f7eb2Smrg     case EXEC_TRANSFER:
2945627f7eb2Smrg       fputs ("TRANSFER ", dumpfile);
2946627f7eb2Smrg       show_expr (c->expr1);
2947627f7eb2Smrg       break;
2948627f7eb2Smrg 
2949627f7eb2Smrg     case EXEC_DT_END:
2950627f7eb2Smrg       fputs ("DT_END", dumpfile);
2951627f7eb2Smrg       dt = c->ext.dt;
2952627f7eb2Smrg 
2953627f7eb2Smrg       if (dt->err != NULL)
2954627f7eb2Smrg 	fprintf (dumpfile, " ERR=%d", dt->err->value);
2955627f7eb2Smrg       if (dt->end != NULL)
2956627f7eb2Smrg 	fprintf (dumpfile, " END=%d", dt->end->value);
2957627f7eb2Smrg       if (dt->eor != NULL)
2958627f7eb2Smrg 	fprintf (dumpfile, " EOR=%d", dt->eor->value);
2959627f7eb2Smrg       break;
2960627f7eb2Smrg 
2961627f7eb2Smrg     case EXEC_WAIT:
2962627f7eb2Smrg       fputs ("WAIT", dumpfile);
2963627f7eb2Smrg 
2964627f7eb2Smrg       if (c->ext.wait != NULL)
2965627f7eb2Smrg 	{
2966627f7eb2Smrg 	  gfc_wait *wait = c->ext.wait;
2967627f7eb2Smrg 	  if (wait->unit)
2968627f7eb2Smrg 	    {
2969627f7eb2Smrg 	      fputs (" UNIT=", dumpfile);
2970627f7eb2Smrg 	      show_expr (wait->unit);
2971627f7eb2Smrg 	    }
2972627f7eb2Smrg 	  if (wait->iostat)
2973627f7eb2Smrg 	    {
2974627f7eb2Smrg 	      fputs (" IOSTAT=", dumpfile);
2975627f7eb2Smrg 	      show_expr (wait->iostat);
2976627f7eb2Smrg 	    }
2977627f7eb2Smrg 	  if (wait->iomsg)
2978627f7eb2Smrg 	    {
2979627f7eb2Smrg 	      fputs (" IOMSG=", dumpfile);
2980627f7eb2Smrg 	      show_expr (wait->iomsg);
2981627f7eb2Smrg 	    }
2982627f7eb2Smrg 	  if (wait->id)
2983627f7eb2Smrg 	    {
2984627f7eb2Smrg 	      fputs (" ID=", dumpfile);
2985627f7eb2Smrg 	      show_expr (wait->id);
2986627f7eb2Smrg 	    }
2987627f7eb2Smrg 	  if (wait->err)
2988627f7eb2Smrg 	    fprintf (dumpfile, " ERR=%d", wait->err->value);
2989627f7eb2Smrg 	  if (wait->end)
2990627f7eb2Smrg 	    fprintf (dumpfile, " END=%d", wait->end->value);
2991627f7eb2Smrg 	  if (wait->eor)
2992627f7eb2Smrg 	    fprintf (dumpfile, " EOR=%d", wait->eor->value);
2993627f7eb2Smrg 	}
2994627f7eb2Smrg       break;
2995627f7eb2Smrg 
2996627f7eb2Smrg     case EXEC_OACC_PARALLEL_LOOP:
2997627f7eb2Smrg     case EXEC_OACC_PARALLEL:
2998627f7eb2Smrg     case EXEC_OACC_KERNELS_LOOP:
2999627f7eb2Smrg     case EXEC_OACC_KERNELS:
3000*4c3eb207Smrg     case EXEC_OACC_SERIAL_LOOP:
3001*4c3eb207Smrg     case EXEC_OACC_SERIAL:
3002627f7eb2Smrg     case EXEC_OACC_DATA:
3003627f7eb2Smrg     case EXEC_OACC_HOST_DATA:
3004627f7eb2Smrg     case EXEC_OACC_LOOP:
3005627f7eb2Smrg     case EXEC_OACC_UPDATE:
3006627f7eb2Smrg     case EXEC_OACC_WAIT:
3007627f7eb2Smrg     case EXEC_OACC_CACHE:
3008627f7eb2Smrg     case EXEC_OACC_ENTER_DATA:
3009627f7eb2Smrg     case EXEC_OACC_EXIT_DATA:
3010627f7eb2Smrg     case EXEC_OMP_ATOMIC:
3011627f7eb2Smrg     case EXEC_OMP_CANCEL:
3012627f7eb2Smrg     case EXEC_OMP_CANCELLATION_POINT:
3013627f7eb2Smrg     case EXEC_OMP_BARRIER:
3014627f7eb2Smrg     case EXEC_OMP_CRITICAL:
3015627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE:
3016627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO:
3017627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_PARALLEL_DO_SIMD:
3018627f7eb2Smrg     case EXEC_OMP_DISTRIBUTE_SIMD:
3019627f7eb2Smrg     case EXEC_OMP_DO:
3020627f7eb2Smrg     case EXEC_OMP_DO_SIMD:
3021627f7eb2Smrg     case EXEC_OMP_FLUSH:
3022627f7eb2Smrg     case EXEC_OMP_MASTER:
3023627f7eb2Smrg     case EXEC_OMP_ORDERED:
3024627f7eb2Smrg     case EXEC_OMP_PARALLEL:
3025627f7eb2Smrg     case EXEC_OMP_PARALLEL_DO:
3026627f7eb2Smrg     case EXEC_OMP_PARALLEL_DO_SIMD:
3027627f7eb2Smrg     case EXEC_OMP_PARALLEL_SECTIONS:
3028627f7eb2Smrg     case EXEC_OMP_PARALLEL_WORKSHARE:
3029627f7eb2Smrg     case EXEC_OMP_SECTIONS:
3030627f7eb2Smrg     case EXEC_OMP_SIMD:
3031627f7eb2Smrg     case EXEC_OMP_SINGLE:
3032627f7eb2Smrg     case EXEC_OMP_TARGET:
3033627f7eb2Smrg     case EXEC_OMP_TARGET_DATA:
3034627f7eb2Smrg     case EXEC_OMP_TARGET_ENTER_DATA:
3035627f7eb2Smrg     case EXEC_OMP_TARGET_EXIT_DATA:
3036627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL:
3037627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL_DO:
3038627f7eb2Smrg     case EXEC_OMP_TARGET_PARALLEL_DO_SIMD:
3039627f7eb2Smrg     case EXEC_OMP_TARGET_SIMD:
3040627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS:
3041627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE:
3042627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO:
3043627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
3044627f7eb2Smrg     case EXEC_OMP_TARGET_TEAMS_DISTRIBUTE_SIMD:
3045627f7eb2Smrg     case EXEC_OMP_TARGET_UPDATE:
3046627f7eb2Smrg     case EXEC_OMP_TASK:
3047627f7eb2Smrg     case EXEC_OMP_TASKGROUP:
3048627f7eb2Smrg     case EXEC_OMP_TASKLOOP:
3049627f7eb2Smrg     case EXEC_OMP_TASKLOOP_SIMD:
3050627f7eb2Smrg     case EXEC_OMP_TASKWAIT:
3051627f7eb2Smrg     case EXEC_OMP_TASKYIELD:
3052627f7eb2Smrg     case EXEC_OMP_TEAMS:
3053627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE:
3054627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO:
3055627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_PARALLEL_DO_SIMD:
3056627f7eb2Smrg     case EXEC_OMP_TEAMS_DISTRIBUTE_SIMD:
3057627f7eb2Smrg     case EXEC_OMP_WORKSHARE:
3058627f7eb2Smrg       show_omp_node (level, c);
3059627f7eb2Smrg       break;
3060627f7eb2Smrg 
3061627f7eb2Smrg     default:
3062627f7eb2Smrg       gfc_internal_error ("show_code_node(): Bad statement code");
3063627f7eb2Smrg     }
3064627f7eb2Smrg }
3065627f7eb2Smrg 
3066627f7eb2Smrg 
3067627f7eb2Smrg /* Show an equivalence chain.  */
3068627f7eb2Smrg 
3069627f7eb2Smrg static void
show_equiv(gfc_equiv * eq)3070627f7eb2Smrg show_equiv (gfc_equiv *eq)
3071627f7eb2Smrg {
3072627f7eb2Smrg   show_indent ();
3073627f7eb2Smrg   fputs ("Equivalence: ", dumpfile);
3074627f7eb2Smrg   while (eq)
3075627f7eb2Smrg     {
3076627f7eb2Smrg       show_expr (eq->expr);
3077627f7eb2Smrg       eq = eq->eq;
3078627f7eb2Smrg       if (eq)
3079627f7eb2Smrg 	fputs (", ", dumpfile);
3080627f7eb2Smrg     }
3081627f7eb2Smrg }
3082627f7eb2Smrg 
3083627f7eb2Smrg 
3084627f7eb2Smrg /* Show a freakin' whole namespace.  */
3085627f7eb2Smrg 
3086627f7eb2Smrg static void
show_namespace(gfc_namespace * ns)3087627f7eb2Smrg show_namespace (gfc_namespace *ns)
3088627f7eb2Smrg {
3089627f7eb2Smrg   gfc_interface *intr;
3090627f7eb2Smrg   gfc_namespace *save;
3091627f7eb2Smrg   int op;
3092627f7eb2Smrg   gfc_equiv *eq;
3093627f7eb2Smrg   int i;
3094627f7eb2Smrg 
3095627f7eb2Smrg   gcc_assert (ns);
3096627f7eb2Smrg   save = gfc_current_ns;
3097627f7eb2Smrg 
3098627f7eb2Smrg   show_indent ();
3099627f7eb2Smrg   fputs ("Namespace:", dumpfile);
3100627f7eb2Smrg 
3101627f7eb2Smrg   i = 0;
3102627f7eb2Smrg   do
3103627f7eb2Smrg     {
3104627f7eb2Smrg       int l = i;
3105627f7eb2Smrg       while (i < GFC_LETTERS - 1
3106627f7eb2Smrg 	     && gfc_compare_types (&ns->default_type[i+1],
3107627f7eb2Smrg 				   &ns->default_type[l]))
3108627f7eb2Smrg 	i++;
3109627f7eb2Smrg 
3110627f7eb2Smrg       if (i > l)
3111627f7eb2Smrg 	fprintf (dumpfile, " %c-%c: ", l+'A', i+'A');
3112627f7eb2Smrg       else
3113627f7eb2Smrg 	fprintf (dumpfile, " %c: ", l+'A');
3114627f7eb2Smrg 
3115627f7eb2Smrg       show_typespec(&ns->default_type[l]);
3116627f7eb2Smrg       i++;
3117627f7eb2Smrg     } while (i < GFC_LETTERS);
3118627f7eb2Smrg 
3119627f7eb2Smrg   if (ns->proc_name != NULL)
3120627f7eb2Smrg     {
3121627f7eb2Smrg       show_indent ();
3122627f7eb2Smrg       fprintf (dumpfile, "procedure name = %s", ns->proc_name->name);
3123627f7eb2Smrg     }
3124627f7eb2Smrg 
3125627f7eb2Smrg   ++show_level;
3126627f7eb2Smrg   gfc_current_ns = ns;
3127627f7eb2Smrg   gfc_traverse_symtree (ns->common_root, show_common);
3128627f7eb2Smrg 
3129627f7eb2Smrg   gfc_traverse_symtree (ns->sym_root, show_symtree);
3130627f7eb2Smrg 
3131627f7eb2Smrg   for (op = GFC_INTRINSIC_BEGIN; op != GFC_INTRINSIC_END; op++)
3132627f7eb2Smrg     {
3133627f7eb2Smrg       /* User operator interfaces */
3134627f7eb2Smrg       intr = ns->op[op];
3135627f7eb2Smrg       if (intr == NULL)
3136627f7eb2Smrg 	continue;
3137627f7eb2Smrg 
3138627f7eb2Smrg       show_indent ();
3139627f7eb2Smrg       fprintf (dumpfile, "Operator interfaces for %s:",
3140627f7eb2Smrg 	       gfc_op2string ((gfc_intrinsic_op) op));
3141627f7eb2Smrg 
3142627f7eb2Smrg       for (; intr; intr = intr->next)
3143627f7eb2Smrg 	fprintf (dumpfile, " %s", intr->sym->name);
3144627f7eb2Smrg     }
3145627f7eb2Smrg 
3146627f7eb2Smrg   if (ns->uop_root != NULL)
3147627f7eb2Smrg     {
3148627f7eb2Smrg       show_indent ();
3149627f7eb2Smrg       fputs ("User operators:\n", dumpfile);
3150627f7eb2Smrg       gfc_traverse_user_op (ns, show_uop);
3151627f7eb2Smrg     }
3152627f7eb2Smrg 
3153627f7eb2Smrg   for (eq = ns->equiv; eq; eq = eq->next)
3154627f7eb2Smrg     show_equiv (eq);
3155627f7eb2Smrg 
3156627f7eb2Smrg   if (ns->oacc_declare)
3157627f7eb2Smrg     {
3158627f7eb2Smrg       struct gfc_oacc_declare *decl;
3159627f7eb2Smrg       /* Dump !$ACC DECLARE clauses.  */
3160627f7eb2Smrg       for (decl = ns->oacc_declare; decl; decl = decl->next)
3161627f7eb2Smrg 	{
3162627f7eb2Smrg 	  show_indent ();
3163627f7eb2Smrg 	  fprintf (dumpfile, "!$ACC DECLARE");
3164627f7eb2Smrg 	  show_omp_clauses (decl->clauses);
3165627f7eb2Smrg 	}
3166627f7eb2Smrg     }
3167627f7eb2Smrg 
3168627f7eb2Smrg   fputc ('\n', dumpfile);
3169627f7eb2Smrg   show_indent ();
3170627f7eb2Smrg   fputs ("code:", dumpfile);
3171627f7eb2Smrg   show_code (show_level, ns->code);
3172627f7eb2Smrg   --show_level;
3173627f7eb2Smrg 
3174627f7eb2Smrg   for (ns = ns->contained; ns; ns = ns->sibling)
3175627f7eb2Smrg     {
3176627f7eb2Smrg       fputs ("\nCONTAINS\n", dumpfile);
3177627f7eb2Smrg       ++show_level;
3178627f7eb2Smrg       show_namespace (ns);
3179627f7eb2Smrg       --show_level;
3180627f7eb2Smrg     }
3181627f7eb2Smrg 
3182627f7eb2Smrg   fputc ('\n', dumpfile);
3183627f7eb2Smrg   gfc_current_ns = save;
3184627f7eb2Smrg }
3185627f7eb2Smrg 
3186627f7eb2Smrg 
3187627f7eb2Smrg /* Main function for dumping a parse tree.  */
3188627f7eb2Smrg 
3189627f7eb2Smrg void
gfc_dump_parse_tree(gfc_namespace * ns,FILE * file)3190627f7eb2Smrg gfc_dump_parse_tree (gfc_namespace *ns, FILE *file)
3191627f7eb2Smrg {
3192627f7eb2Smrg   dumpfile = file;
3193627f7eb2Smrg   show_namespace (ns);
3194627f7eb2Smrg }
3195627f7eb2Smrg 
3196627f7eb2Smrg /* This part writes BIND(C) definition for use in external C programs.  */
3197627f7eb2Smrg 
3198627f7eb2Smrg static void write_interop_decl (gfc_symbol *);
3199627f7eb2Smrg static void write_proc (gfc_symbol *, bool);
3200627f7eb2Smrg 
3201627f7eb2Smrg void
gfc_dump_c_prototypes(gfc_namespace * ns,FILE * file)3202627f7eb2Smrg gfc_dump_c_prototypes (gfc_namespace *ns, FILE *file)
3203627f7eb2Smrg {
3204627f7eb2Smrg   int error_count;
3205627f7eb2Smrg   gfc_get_errors (NULL, &error_count);
3206627f7eb2Smrg   if (error_count != 0)
3207627f7eb2Smrg     return;
3208627f7eb2Smrg   dumpfile = file;
3209627f7eb2Smrg   gfc_traverse_ns (ns, write_interop_decl);
3210627f7eb2Smrg }
3211627f7eb2Smrg 
3212627f7eb2Smrg /* Loop over all global symbols, writing out their declrations.  */
3213627f7eb2Smrg 
3214627f7eb2Smrg void
gfc_dump_external_c_prototypes(FILE * file)3215627f7eb2Smrg gfc_dump_external_c_prototypes (FILE * file)
3216627f7eb2Smrg {
3217627f7eb2Smrg   dumpfile = file;
3218627f7eb2Smrg   fprintf (dumpfile,
3219627f7eb2Smrg 	   _("/* Prototypes for external procedures generated from %s\n"
3220627f7eb2Smrg 	     "   by GNU Fortran %s%s.\n\n"
3221627f7eb2Smrg 	     "   Use of this interface is discouraged, consider using the\n"
3222627f7eb2Smrg 	     "   BIND(C) feature of standard Fortran instead.  */\n\n"),
3223627f7eb2Smrg 	   gfc_source_file, pkgversion_string, version_string);
3224627f7eb2Smrg 
3225627f7eb2Smrg   for (gfc_current_ns = gfc_global_ns_list; gfc_current_ns;
3226627f7eb2Smrg        gfc_current_ns = gfc_current_ns->sibling)
3227627f7eb2Smrg     {
3228627f7eb2Smrg       gfc_symbol *sym = gfc_current_ns->proc_name;
3229627f7eb2Smrg 
3230627f7eb2Smrg       if (sym == NULL || sym->attr.flavor != FL_PROCEDURE
3231627f7eb2Smrg 	  || sym->attr.is_bind_c)
3232627f7eb2Smrg 	continue;
3233627f7eb2Smrg 
3234627f7eb2Smrg       write_proc (sym, false);
3235627f7eb2Smrg     }
3236627f7eb2Smrg   return;
3237627f7eb2Smrg }
3238627f7eb2Smrg 
3239627f7eb2Smrg enum type_return { T_OK=0, T_WARN, T_ERROR };
3240627f7eb2Smrg 
3241627f7eb2Smrg /* Return the name of the type for later output.  Both function pointers and
3242627f7eb2Smrg    void pointers will be mapped to void *.  */
3243627f7eb2Smrg 
3244627f7eb2Smrg static enum type_return
get_c_type_name(gfc_typespec * ts,gfc_array_spec * as,const char ** pre,const char ** type_name,bool * asterisk,const char ** post,bool func_ret)3245627f7eb2Smrg get_c_type_name (gfc_typespec *ts, gfc_array_spec *as, const char **pre,
3246627f7eb2Smrg 		 const char **type_name, bool *asterisk, const char **post,
3247627f7eb2Smrg 		 bool func_ret)
3248627f7eb2Smrg {
3249627f7eb2Smrg   static char post_buffer[40];
3250627f7eb2Smrg   enum type_return ret;
3251627f7eb2Smrg   ret = T_ERROR;
3252627f7eb2Smrg 
3253627f7eb2Smrg   *pre = " ";
3254627f7eb2Smrg   *asterisk = false;
3255627f7eb2Smrg   *post = "";
3256627f7eb2Smrg   *type_name = "<error>";
3257627f7eb2Smrg   if (ts->type == BT_REAL || ts->type == BT_INTEGER || ts->type == BT_COMPLEX)
3258627f7eb2Smrg     {
3259627f7eb2Smrg       if (ts->is_c_interop && ts->interop_kind)
3260627f7eb2Smrg 	ret = T_OK;
3261627f7eb2Smrg       else
3262*4c3eb207Smrg 	ret = T_WARN;
3263*4c3eb207Smrg 
3264627f7eb2Smrg       for (int i = 0; i < ISOCBINDING_NUMBER; i++)
3265627f7eb2Smrg 	{
3266627f7eb2Smrg 	  if (c_interop_kinds_table[i].f90_type == ts->type
3267627f7eb2Smrg 	      && c_interop_kinds_table[i].value == ts->kind)
3268627f7eb2Smrg 	    {
3269627f7eb2Smrg 	      *type_name = c_interop_kinds_table[i].name + 2;
3270627f7eb2Smrg 	      if (strcmp (*type_name, "signed_char") == 0)
3271627f7eb2Smrg 		*type_name = "signed char";
3272627f7eb2Smrg 	      else if (strcmp (*type_name, "size_t") == 0)
3273627f7eb2Smrg 		*type_name = "ssize_t";
3274627f7eb2Smrg 	      else if (strcmp (*type_name, "float_complex") == 0)
3275627f7eb2Smrg 		*type_name = "__GFORTRAN_FLOAT_COMPLEX";
3276627f7eb2Smrg 	      else if (strcmp (*type_name, "double_complex") == 0)
3277627f7eb2Smrg 		*type_name = "__GFORTRAN_DOUBLE_COMPLEX";
3278627f7eb2Smrg 	      else if (strcmp (*type_name, "long_double_complex") == 0)
3279627f7eb2Smrg 		*type_name = "__GFORTRAN_LONG_DOUBLE_COMPLEX";
3280627f7eb2Smrg 
3281627f7eb2Smrg 	      break;
3282627f7eb2Smrg 	    }
3283627f7eb2Smrg 	}
3284627f7eb2Smrg     }
3285627f7eb2Smrg   else if (ts->type == BT_LOGICAL)
3286627f7eb2Smrg     {
3287627f7eb2Smrg       if (ts->is_c_interop && ts->interop_kind)
3288627f7eb2Smrg 	{
3289627f7eb2Smrg 	  *type_name = "_Bool";
3290627f7eb2Smrg 	  ret = T_OK;
3291627f7eb2Smrg 	}
3292627f7eb2Smrg       else
3293627f7eb2Smrg 	{
3294627f7eb2Smrg 	  /* Let's select an appropriate int, with a warning. */
3295627f7eb2Smrg 	  for (int i = 0; i < ISOCBINDING_NUMBER; i++)
3296627f7eb2Smrg 	    {
3297627f7eb2Smrg 	      if (c_interop_kinds_table[i].f90_type == BT_INTEGER
3298627f7eb2Smrg 		  && c_interop_kinds_table[i].value == ts->kind)
3299627f7eb2Smrg 		{
3300627f7eb2Smrg 		  *type_name = c_interop_kinds_table[i].name + 2;
3301627f7eb2Smrg 		  ret = T_WARN;
3302627f7eb2Smrg 		}
3303627f7eb2Smrg 	    }
3304627f7eb2Smrg 	}
3305627f7eb2Smrg     }
3306627f7eb2Smrg   else if (ts->type == BT_CHARACTER)
3307627f7eb2Smrg     {
3308627f7eb2Smrg       if (ts->is_c_interop)
3309627f7eb2Smrg 	{
3310627f7eb2Smrg 	  *type_name = "char";
3311627f7eb2Smrg 	  ret = T_OK;
3312627f7eb2Smrg 	}
3313627f7eb2Smrg       else
3314627f7eb2Smrg 	{
3315627f7eb2Smrg 	  if (ts->kind == gfc_default_character_kind)
3316627f7eb2Smrg 	    *type_name = "char";
3317627f7eb2Smrg 	  else
3318627f7eb2Smrg 	    /* Let's select an appropriate int. */
3319627f7eb2Smrg 	    for (int i = 0; i < ISOCBINDING_NUMBER; i++)
3320627f7eb2Smrg 	      {
3321627f7eb2Smrg 		if (c_interop_kinds_table[i].f90_type == BT_INTEGER
3322627f7eb2Smrg 		    && c_interop_kinds_table[i].value == ts->kind)
3323627f7eb2Smrg 		  {
3324627f7eb2Smrg 		    *type_name = c_interop_kinds_table[i].name + 2;
3325627f7eb2Smrg 		    break;
3326627f7eb2Smrg 		  }
3327627f7eb2Smrg 	    }
3328627f7eb2Smrg 	  ret = T_WARN;
3329627f7eb2Smrg 
3330627f7eb2Smrg 	}
3331627f7eb2Smrg     }
3332627f7eb2Smrg   else if (ts->type == BT_DERIVED)
3333627f7eb2Smrg     {
3334627f7eb2Smrg       if (ts->u.derived->from_intmod == INTMOD_ISO_C_BINDING)
3335627f7eb2Smrg 	{
3336627f7eb2Smrg 	  if (strcmp (ts->u.derived->name, "c_ptr") == 0)
3337627f7eb2Smrg 	    *type_name = "void";
3338627f7eb2Smrg 	  else if (strcmp (ts->u.derived->name, "c_funptr") == 0)
3339627f7eb2Smrg 	    {
3340627f7eb2Smrg 	      *type_name = "int ";
3341627f7eb2Smrg 	      if (func_ret)
3342627f7eb2Smrg 		{
3343627f7eb2Smrg 		  *pre = "(";
3344627f7eb2Smrg 		  *post = "())";
3345627f7eb2Smrg 		}
3346627f7eb2Smrg 	      else
3347627f7eb2Smrg 		{
3348627f7eb2Smrg 		  *pre = "(";
3349627f7eb2Smrg 		  *post = ")()";
3350627f7eb2Smrg 		}
3351627f7eb2Smrg 	    }
3352627f7eb2Smrg 	  *asterisk = true;
3353627f7eb2Smrg 	  ret = T_OK;
3354627f7eb2Smrg 	}
3355627f7eb2Smrg       else
3356627f7eb2Smrg 	*type_name = ts->u.derived->name;
3357627f7eb2Smrg 
3358627f7eb2Smrg       ret = T_OK;
3359627f7eb2Smrg     }
3360627f7eb2Smrg 
3361627f7eb2Smrg   if (ret != T_ERROR && as)
3362627f7eb2Smrg     {
3363627f7eb2Smrg       mpz_t sz;
3364627f7eb2Smrg       bool size_ok;
3365627f7eb2Smrg       size_ok = spec_size (as, &sz);
3366627f7eb2Smrg       gcc_assert (size_ok == true);
3367627f7eb2Smrg       gmp_snprintf (post_buffer, sizeof(post_buffer), "[%Zd]", sz);
3368627f7eb2Smrg       *post = post_buffer;
3369627f7eb2Smrg       mpz_clear (sz);
3370627f7eb2Smrg     }
3371627f7eb2Smrg   return ret;
3372627f7eb2Smrg }
3373627f7eb2Smrg 
3374627f7eb2Smrg /* Write out a declaration.  */
3375627f7eb2Smrg static void
write_decl(gfc_typespec * ts,gfc_array_spec * as,const char * sym_name,bool func_ret,locus * where,bool bind_c)3376627f7eb2Smrg write_decl (gfc_typespec *ts, gfc_array_spec *as, const char *sym_name,
3377627f7eb2Smrg 	    bool func_ret, locus *where, bool bind_c)
3378627f7eb2Smrg {
3379627f7eb2Smrg   const char *pre, *type_name, *post;
3380627f7eb2Smrg   bool asterisk;
3381627f7eb2Smrg   enum type_return rok;
3382627f7eb2Smrg 
3383627f7eb2Smrg   rok = get_c_type_name (ts, as, &pre, &type_name, &asterisk, &post, func_ret);
3384627f7eb2Smrg   if (rok == T_ERROR)
3385627f7eb2Smrg     {
3386627f7eb2Smrg       gfc_error_now ("Cannot convert %qs to interoperable type at %L",
3387627f7eb2Smrg 		     gfc_typename (ts), where);
3388627f7eb2Smrg       fprintf (dumpfile, "/* Cannot convert '%s' to interoperable type */",
3389627f7eb2Smrg 	       gfc_typename (ts));
3390627f7eb2Smrg       return;
3391627f7eb2Smrg     }
3392627f7eb2Smrg   fputs (type_name, dumpfile);
3393627f7eb2Smrg   fputs (pre, dumpfile);
3394627f7eb2Smrg   if (asterisk)
3395627f7eb2Smrg     fputs ("*", dumpfile);
3396627f7eb2Smrg 
3397627f7eb2Smrg   fputs (sym_name, dumpfile);
3398627f7eb2Smrg   fputs (post, dumpfile);
3399627f7eb2Smrg 
3400627f7eb2Smrg   if (rok == T_WARN && bind_c)
3401627f7eb2Smrg     fprintf (dumpfile," /* WARNING: Converting '%s' to interoperable type */",
3402627f7eb2Smrg 	     gfc_typename (ts));
3403627f7eb2Smrg }
3404627f7eb2Smrg 
3405627f7eb2Smrg /* Write out an interoperable type.  It will be written as a typedef
3406627f7eb2Smrg    for a struct.  */
3407627f7eb2Smrg 
3408627f7eb2Smrg static void
write_type(gfc_symbol * sym)3409627f7eb2Smrg write_type (gfc_symbol *sym)
3410627f7eb2Smrg {
3411627f7eb2Smrg   gfc_component *c;
3412627f7eb2Smrg 
3413627f7eb2Smrg   fprintf (dumpfile, "typedef struct %s {\n", sym->name);
3414627f7eb2Smrg   for (c = sym->components; c; c = c->next)
3415627f7eb2Smrg     {
3416627f7eb2Smrg       fputs ("    ", dumpfile);
3417627f7eb2Smrg       write_decl (&(c->ts), c->as, c->name, false, &sym->declared_at, true);
3418627f7eb2Smrg       fputs (";\n", dumpfile);
3419627f7eb2Smrg     }
3420627f7eb2Smrg 
3421627f7eb2Smrg   fprintf (dumpfile, "} %s;\n", sym->name);
3422627f7eb2Smrg }
3423627f7eb2Smrg 
3424627f7eb2Smrg /* Write out a variable.  */
3425627f7eb2Smrg 
3426627f7eb2Smrg static void
write_variable(gfc_symbol * sym)3427627f7eb2Smrg write_variable (gfc_symbol *sym)
3428627f7eb2Smrg {
3429627f7eb2Smrg   const char *sym_name;
3430627f7eb2Smrg 
3431627f7eb2Smrg   gcc_assert (sym->attr.flavor == FL_VARIABLE);
3432627f7eb2Smrg 
3433627f7eb2Smrg   if (sym->binding_label)
3434627f7eb2Smrg     sym_name = sym->binding_label;
3435627f7eb2Smrg   else
3436627f7eb2Smrg     sym_name = sym->name;
3437627f7eb2Smrg 
3438627f7eb2Smrg   fputs ("extern ", dumpfile);
3439627f7eb2Smrg   write_decl (&(sym->ts), sym->as, sym_name, false, &sym->declared_at, true);
3440627f7eb2Smrg   fputs (";\n", dumpfile);
3441627f7eb2Smrg }
3442627f7eb2Smrg 
3443627f7eb2Smrg 
3444627f7eb2Smrg /* Write out a procedure, including its arguments.  */
3445627f7eb2Smrg static void
write_proc(gfc_symbol * sym,bool bind_c)3446627f7eb2Smrg write_proc (gfc_symbol *sym, bool bind_c)
3447627f7eb2Smrg {
3448627f7eb2Smrg   const char *pre, *type_name, *post;
3449627f7eb2Smrg   bool asterisk;
3450627f7eb2Smrg   enum type_return rok;
3451627f7eb2Smrg   gfc_formal_arglist *f;
3452627f7eb2Smrg   const char *sym_name;
3453627f7eb2Smrg   const char *intent_in;
3454627f7eb2Smrg   bool external_character;
3455627f7eb2Smrg 
3456627f7eb2Smrg   external_character =  sym->ts.type == BT_CHARACTER && !bind_c;
3457627f7eb2Smrg 
3458627f7eb2Smrg   if (sym->binding_label)
3459627f7eb2Smrg     sym_name = sym->binding_label;
3460627f7eb2Smrg   else
3461627f7eb2Smrg     sym_name = sym->name;
3462627f7eb2Smrg 
3463627f7eb2Smrg   if (sym->ts.type == BT_UNKNOWN || external_character)
3464627f7eb2Smrg     {
3465627f7eb2Smrg       fprintf (dumpfile, "void ");
3466627f7eb2Smrg       fputs (sym_name, dumpfile);
3467627f7eb2Smrg     }
3468627f7eb2Smrg   else
3469627f7eb2Smrg     write_decl (&(sym->ts), sym->as, sym_name, true, &sym->declared_at, bind_c);
3470627f7eb2Smrg 
3471627f7eb2Smrg   if (!bind_c)
3472627f7eb2Smrg     fputs ("_", dumpfile);
3473627f7eb2Smrg 
3474627f7eb2Smrg   fputs (" (", dumpfile);
3475627f7eb2Smrg   if (external_character)
3476627f7eb2Smrg     {
3477627f7eb2Smrg       fprintf (dumpfile, "char *result_%s, size_t result_%s_len",
3478627f7eb2Smrg 	       sym_name, sym_name);
3479627f7eb2Smrg       if (sym->formal)
3480627f7eb2Smrg 	fputs (", ", dumpfile);
3481627f7eb2Smrg     }
3482627f7eb2Smrg 
3483627f7eb2Smrg   for (f = sym->formal; f; f = f->next)
3484627f7eb2Smrg     {
3485627f7eb2Smrg       gfc_symbol *s;
3486627f7eb2Smrg       s = f->sym;
3487627f7eb2Smrg       rok = get_c_type_name (&(s->ts), NULL, &pre, &type_name, &asterisk,
3488627f7eb2Smrg 			     &post, false);
3489627f7eb2Smrg       if (rok == T_ERROR)
3490627f7eb2Smrg 	{
3491627f7eb2Smrg 	  gfc_error_now ("Cannot convert %qs to interoperable type at %L",
3492627f7eb2Smrg 			 gfc_typename (&s->ts), &s->declared_at);
3493627f7eb2Smrg 	  fprintf (dumpfile, "/* Cannot convert '%s' to interoperable type */",
3494627f7eb2Smrg 		   gfc_typename (&s->ts));
3495627f7eb2Smrg 	  return;
3496627f7eb2Smrg 	}
3497627f7eb2Smrg 
3498627f7eb2Smrg       if (!s->attr.value)
3499627f7eb2Smrg 	asterisk = true;
3500627f7eb2Smrg 
3501627f7eb2Smrg       if (s->attr.intent == INTENT_IN && !s->attr.value)
3502627f7eb2Smrg 	intent_in = "const ";
3503627f7eb2Smrg       else
3504627f7eb2Smrg 	intent_in = "";
3505627f7eb2Smrg 
3506627f7eb2Smrg       fputs (intent_in, dumpfile);
3507627f7eb2Smrg       fputs (type_name, dumpfile);
3508627f7eb2Smrg       fputs (pre, dumpfile);
3509627f7eb2Smrg       if (asterisk)
3510627f7eb2Smrg 	fputs ("*", dumpfile);
3511627f7eb2Smrg 
3512627f7eb2Smrg       fputs (s->name, dumpfile);
3513627f7eb2Smrg       fputs (post, dumpfile);
3514627f7eb2Smrg       if (bind_c && rok == T_WARN)
3515627f7eb2Smrg 	fputs(" /* WARNING: non-interoperable KIND */ ", dumpfile);
3516627f7eb2Smrg 
3517627f7eb2Smrg       if (f->next)
3518627f7eb2Smrg 	fputs(", ", dumpfile);
3519627f7eb2Smrg     }
3520627f7eb2Smrg   if (!bind_c)
3521627f7eb2Smrg     for (f = sym->formal; f; f = f->next)
3522627f7eb2Smrg       if (f->sym->ts.type == BT_CHARACTER)
3523627f7eb2Smrg 	fprintf (dumpfile, ", size_t %s_len", f->sym->name);
3524627f7eb2Smrg 
3525627f7eb2Smrg   fputs (");\n", dumpfile);
3526627f7eb2Smrg }
3527627f7eb2Smrg 
3528627f7eb2Smrg 
3529627f7eb2Smrg /* Write a C-interoperable declaration as a C prototype or extern
3530627f7eb2Smrg    declaration.  */
3531627f7eb2Smrg 
3532627f7eb2Smrg static void
write_interop_decl(gfc_symbol * sym)3533627f7eb2Smrg write_interop_decl (gfc_symbol *sym)
3534627f7eb2Smrg {
3535627f7eb2Smrg   /* Only dump bind(c) entities.  */
3536627f7eb2Smrg   if (!sym->attr.is_bind_c)
3537627f7eb2Smrg     return;
3538627f7eb2Smrg 
3539627f7eb2Smrg   /* Don't dump our iso c module.  */
3540627f7eb2Smrg   if (sym->from_intmod == INTMOD_ISO_C_BINDING)
3541627f7eb2Smrg     return;
3542627f7eb2Smrg 
3543627f7eb2Smrg   if (sym->attr.flavor == FL_VARIABLE)
3544627f7eb2Smrg     write_variable (sym);
3545627f7eb2Smrg   else if (sym->attr.flavor == FL_DERIVED)
3546627f7eb2Smrg     write_type (sym);
3547627f7eb2Smrg   else if (sym->attr.flavor == FL_PROCEDURE)
3548627f7eb2Smrg     write_proc (sym, true);
3549627f7eb2Smrg }
3550627f7eb2Smrg 
3551627f7eb2Smrg /* This section deals with dumping the global symbol tree.  */
3552627f7eb2Smrg 
3553627f7eb2Smrg /* Callback function for printing out the contents of the tree.  */
3554627f7eb2Smrg 
3555627f7eb2Smrg static void
show_global_symbol(gfc_gsymbol * gsym,void * f_data)3556627f7eb2Smrg show_global_symbol (gfc_gsymbol *gsym, void *f_data)
3557627f7eb2Smrg {
3558627f7eb2Smrg   FILE *out;
3559627f7eb2Smrg   out = (FILE *) f_data;
3560627f7eb2Smrg 
3561627f7eb2Smrg   if (gsym->name)
3562627f7eb2Smrg     fprintf (out, "name=%s", gsym->name);
3563627f7eb2Smrg 
3564627f7eb2Smrg   if (gsym->sym_name)
3565627f7eb2Smrg     fprintf (out, ", sym_name=%s", gsym->sym_name);
3566627f7eb2Smrg 
3567627f7eb2Smrg   if (gsym->mod_name)
3568627f7eb2Smrg     fprintf (out, ", mod_name=%s", gsym->mod_name);
3569627f7eb2Smrg 
3570627f7eb2Smrg   if (gsym->binding_label)
3571627f7eb2Smrg     fprintf (out, ", binding_label=%s", gsym->binding_label);
3572627f7eb2Smrg 
3573627f7eb2Smrg   fputc ('\n', out);
3574627f7eb2Smrg }
3575627f7eb2Smrg 
3576627f7eb2Smrg /* Show all global symbols.  */
3577627f7eb2Smrg 
3578627f7eb2Smrg void
gfc_dump_global_symbols(FILE * f)3579627f7eb2Smrg gfc_dump_global_symbols (FILE *f)
3580627f7eb2Smrg {
3581627f7eb2Smrg   gfc_traverse_gsymbol (gfc_gsym_root, show_global_symbol, (void *) f);
3582627f7eb2Smrg }
3583