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