1/* Interface definitions for Fortran symbol manager
2   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
3   Contributed by James Craig Burley.
4
5This file is part of GNU Fortran.
6
7GNU Fortran is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU Fortran is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Fortran; see the file COPYING.  If not, write to
19the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
2002111-1307, USA.  */
21
22#ifndef _H_f_symbol
23#define _H_f_symbol
24
25/* The main symbol type.  */
26
27typedef struct _ffesymbol_ *ffesymbol;
28
29/* State of understanding about what the symbol represents.  */
30
31enum _ffesymbol_state_
32  {
33/* See ffesymbol_state_is_exec() macro below when making changes.  */
34    FFESYMBOL_stateNONE,	/* Never before seen. */
35    FFESYMBOL_stateSEEN,	/* Seen before exec transition and not yet
36				   understood (info not filled in, etc). */
37    FFESYMBOL_stateUNCERTAIN,	/* Almost understood (info partly filled in). */
38    FFESYMBOL_stateUNDERSTOOD,	/* Fully understood (info filled in). */
39    FFESYMBOL_state
40  };
41typedef enum _ffesymbol_state_ ffesymbolState;
42#define ffesymbolState_f ""
43
44/* Attributes.  Symbols acquire attributes while their state is SEEN.
45   These attributes are basically ignored once the symbol becomes
46   UNDERSTOOD.  */
47
48typedef long int ffesymbolAttrs;/* Holds set of attributes. */
49#define ffesymbolAttrs_f "l"
50
51enum _ffesymbol_attr_
52  {
53#define DEFATTR(ATTR,ATTRS,NAME) ATTR,
54#include "symbol.def"
55#undef DEFATTR
56    FFESYMBOL_attr
57  };				/* A given attribute. */
58typedef enum _ffesymbol_attr_ ffesymbolAttr;
59#define ffesymbolAttr_f ""
60
61#define FFESYMBOL_attrsetNONE 0
62#define FFESYMBOL_attrsetALL (((ffesymbolAttrs) 1 << FFESYMBOL_attr) - 1)
63
64/* This is just for avoiding complaining about, e.g., "I = IABS(3)", that
65   IABS doesn't meet the requirements for a user-defined symbol name as
66   a result of, say, --symbol-case-lower, if IABS turns out to indeed be
67   a reference to the intrinsic IABS (in which case it's a Fortran keyword
68   like CALL) and not a user-defined name.  */
69
70enum _ffesymbol_checkstate_
71  {
72    FFESYMBOL_checkstateNONE_,	/* Not checked/never necessary to check. */
73    FFESYMBOL_checkstateINHIBITED_,	/* Bad name, but inhibited. */
74    FFESYMBOL_checkstatePENDING_,	/* Bad name, might be intrinsic. */
75    FFESYMBOL_checkstateCHECKED_,	/* Ok name, intrinsic, or bad name
76					   reported. */
77    FFESYMBOL_checkstate_
78  };
79typedef enum _ffesymbol_checkstate_ ffesymbolCheckState_;
80#define ffesymbolCheckState_f_ ""
81
82#include "bld.h"
83#include "com.h"
84#include "equiv.h"
85#include "global.h"
86#include "info.h"
87#include "intrin.h"
88#include "lex.h"
89#include "malloc.h"
90#include "name.h"
91#include "storag.h"
92#include "target.h"
93#include "top.h"
94#include "where.h"
95
96struct _ffesymbol_
97  {
98    ffename name;
99    ffename other_space_name;	/* For dual-space objects. */
100    ffeglobal global;		/* In filewide name space. */
101    ffesymbolAttrs attrs;	/* What kind of symbol am I? */
102    ffesymbolState state;	/* What state am I in? */
103    ffeinfo info;		/* Info filled in when _stateUNDERSTOOD. */
104    ffebld dims;		/* Dimension list expression. */
105    ffebld extents;		/* Extents list expression. */
106    ffebld dim_syms;		/* List of SYMTERs of all symbols in dims. */
107    ffebld array_size;		/* Size as an expression involving some of
108				   dims. */
109    ffebld init;		/* Initialization expression or expr list or
110				   PARAMETER value. */
111    ffebld accretion;		/* Initializations seen so far for
112				   array/substr. */
113    ffetargetOffset accretes;	/* # inits needed to fill entire array. */
114    ffebld dummy_args;		/* For functions, subroutines, and entry
115				   points. */
116    ffebld namelist;		/* List of symbols in NML. */
117    ffebld common_list;		/* List of entities in BCB/NCB. */
118    ffebld sfunc_expr;		/* SFN's expression. */
119    ffebldListBottom list_bottom;	/* For BCB, NCB, NML. */
120    ffesymbol common;		/* Who is my containing COMMON area? */
121    ffeequiv equiv;		/* Who have I been equivalenced with? */
122    ffestorag storage;		/* Where am I in relation to my outside
123				   world? */
124#ifdef FFECOM_symbolHOOK
125    ffecomSymbol hook;		/* Whatever the compiler/backend wants! */
126#endif
127    ffesymbol sfa_dummy_parent;	/* "X" outside sfunc "CIRC(X) = 3.14 * X". */
128    ffesymbol func_result;	/* FUN sym's corresponding RES sym, & vice
129				   versa. */
130    ffetargetIntegerDefault value;	/* IMMEDIATE (DATA impdo) value. */
131    ffesymbolCheckState_ check_state;	/* Valid name? */
132    ffelexToken check_token;	/* checkstatePENDING_ only. */
133    int max_entry_num;		/* For detecting dummy arg listed twice/IMPDO
134				   iterator nesting violation; also for id of
135				   sfunc dummy arg. */
136    int num_entries;		/* Number of entry points in which this
137				   symbol appears as a dummy arg; helps
138				   determine whether arg might not be passed,
139				   for example.  */
140    ffeintrinGen generic;	/* Generic intrinsic id, if any. */
141    ffeintrinSpec specific;	/* Specific intrinsic id, if any. */
142    ffeintrinImp implementation;/* Implementation id, if any. */
143    bool is_save;		/* SAVE flag set for this symbol (see also
144				   ffe_is_saveall()). */
145    bool is_init;		/* INIT flag set for this symbol. */
146    bool do_iter;		/* Is currently a DO-loop iter (can't be
147				   changed in loop). */
148    bool reported;		/* (Debug) TRUE if the latest version has
149				   been reported. */
150    bool have_old;		/* TRUE if old copy of this symbol saved
151				   away. */
152    bool explicit_where;	/* TRUE if INTRINSIC/EXTERNAL explicit. */
153    bool namelisted;		/* TRUE if in NAMELIST (needs static alloc). */
154    bool assigned;		/* TRUE if ever ASSIGNed to.  */
155  };
156
157#define ffesymbol_accretes(s) ((s)->accretes)
158#define ffesymbol_accretion(s) ((s)->accretion)
159#define ffesymbol_arraysize(s) ((s)->array_size)
160#define ffesymbol_assigned(s) ((s)->assigned)
161#define ffesymbol_attr(s,a) ((s)->attrs & ((ffesymbolAttrs) 1 << (a)))
162#define ffesymbol_attrs(s) ((s)->attrs)
163const char *ffesymbol_attrs_string (ffesymbolAttrs attrs);
164#define ffesymbol_basictype(s) ffeinfo_basictype((s)->info)
165void ffesymbol_check (ffesymbol s, ffelexToken t, bool maybe_intrin);
166#define ffesymbol_common(s) ((s)->common)
167#define ffesymbol_commonlist(s) ((s)->common_list)
168ffesymbol ffesymbol_declare_blockdataunit (ffelexToken t, ffewhereLine wl,
169					   ffewhereColumn wc);
170ffesymbol ffesymbol_declare_cblock (ffelexToken t, ffewhereLine wl,
171				    ffewhereColumn wc);
172ffesymbol ffesymbol_declare_funcnotresunit (ffelexToken t);
173ffesymbol ffesymbol_declare_funcresult (ffelexToken t);
174ffesymbol ffesymbol_declare_funcunit (ffelexToken t);
175ffesymbol ffesymbol_declare_local (ffelexToken t, bool maybe_intrin);
176ffesymbol ffesymbol_declare_programunit (ffelexToken t, ffewhereLine wl,
177					 ffewhereColumn wc);
178ffesymbol ffesymbol_declare_sfdummy (ffelexToken t);
179ffesymbol ffesymbol_declare_subrunit (ffelexToken t);
180#define ffesymbol_dims(s) ((s)->dims)
181#define ffesymbol_dim_syms(s) ((s)->dim_syms)
182void ffesymbol_drive (ffesymbol (*fn) (ffesymbol));
183void ffesymbol_drive_sfnames (ffesymbol (*fn) (ffesymbol));
184#define ffesymbol_dummyargs(s) ((s)->dummy_args)
185#if FFECOM_targetCURRENT == FFECOM_targetFFE
186void ffesymbol_dump (ffesymbol s);
187#endif
188void ffesymbol_error (ffesymbol s, ffelexToken t);
189#define ffesymbol_equiv(s) ((s)->equiv)
190#define ffesymbol_explicitwhere(s) ((s)->explicit_where)
191#define ffesymbol_extents(s) ((s)->extents)
192#define ffesymbol_first_token(s) ((s)->name == NULL ? NULL  \
193      : ffename_first_token((s)->name))
194#define ffesymbol_funcresult(s) ((s)->func_result)
195#define ffesymbol_generic(s) ((s)->generic)
196#define ffesymbol_global(s) ((s)->global)
197#define ffesymbol_hook(s) ((s)->hook)
198#define ffesymbol_implementation(s) ((s)->implementation)
199#define ffesymbol_info(s) ((s)->info)
200#define ffesymbol_init(s) ((s)->init)
201void ffesymbol_init_0 (void);
202void ffesymbol_init_1 (void);
203void ffesymbol_init_2 (void);
204void ffesymbol_init_3 (void);
205void ffesymbol_init_4 (void);
206#define ffesymbol_is_doiter(s) ((s)->do_iter)
207#define ffesymbol_is_dualspace(s) ((s)->other_space_name != NULL)
208#define ffesymbol_is_f2c(s) (ffe_is_f2c())
209#define ffesymbol_is_init(s) ((s)->is_init)
210#define ffesymbol_is_reported(s) ((s)->reported)
211#define ffesymbol_is_save(s) ((s)->is_save)
212#define ffesymbol_is_specable(s) ffesymbol_state_is_specable(s->state)
213#define ffesymbol_kindtype(s) ffeinfo_kindtype((s)->info)
214#define ffesymbol_kind(s) ffeinfo_kind((s)->info)
215ffesymbol ffesymbol_lookup_local (ffelexToken t);
216#define ffesymbol_maxentrynum(s) ((s)->max_entry_num)
217#define ffesymbol_name(s) ((s)->name)
218#define ffesymbol_namelist(s) ((s)->namelist)
219#define ffesymbol_namelisted(s) ((s)->namelisted)
220#define ffesymbol_numentries(s) ((s)->num_entries)
221#define ffesymbol_ptr_to_commonlist(s) (&(s)->common_list)
222#define ffesymbol_ptr_to_listbottom(s) (&(s)->list_bottom)
223#define ffesymbol_ptr_to_namelist(s) (&(s)->namelist)
224#define ffesymbol_rank(s) ffeinfo_rank((s)->info)
225void ffesymbol_reference (ffesymbol s, ffelexToken t, bool explicit);
226#if FFECOM_targetCURRENT == FFECOM_targetFFE
227ffesymbol ffesymbol_report (ffesymbol s);
228void ffesymbol_report_all (void);
229#endif
230void ffesymbol_resolve_intrin (ffesymbol s);
231void ffesymbol_retract (bool retract);
232bool ffesymbol_retractable (void);
233#define ffesymbol_set_accretes(s,a) ((s)->accretes = (a))
234#define ffesymbol_set_accretion(s,a) ((s)->accretion = (a))
235#define ffesymbol_set_arraysize(s,a) ((s)->array_size = (a))
236#define ffesymbol_set_assigned(s,a) ((s)->assigned = (a))
237#define ffesymbol_set_attr(s,a) ((s)->attrs |= ((ffesymbolAttrs) 1 << (a)))
238#define ffesymbol_set_attrs(s,a) ((s)->attrs = (a))
239#define ffesymbol_set_common(s,c) ((s)->common = (c))
240#define ffesymbol_set_commonlist(s,c) ((s)->common_list = (c))
241#define ffesymbol_set_dims(s,d) ((s)->dims = (d))
242#define ffesymbol_set_dim_syms(s,d) ((s)->dim_syms = (d))
243#define ffesymbol_set_dummyargs(s,d) ((s)->dummy_args = (d))
244#define ffesymbol_set_equiv(s,e) ((s)->equiv = (e))
245#define ffesymbol_set_explicitwhere(s,e) ((s)->explicit_where = (e))
246#define ffesymbol_set_extents(s,e) ((s)->extents = (e))
247#define ffesymbol_set_funcresult(s,f) ((s)->func_result = (f))
248#define ffesymbol_set_generic(s,g) ((s)->generic = (g))
249#define ffesymbol_set_global(s,g) ((s)->global = (g))
250#define ffesymbol_set_hook(s,h) ((s)->hook = (h))
251#define ffesymbol_set_implementation(s,im) ((s)->implementation = (im))
252#define ffesymbol_set_init(s,i) ((s)->init = (i))
253#define ffesymbol_set_info(s,i) ((s)->info = (i))
254#define ffesymbol_set_is_doiter(s,f) ((s)->do_iter = (f))
255#define ffesymbol_set_is_init(s,in) ((s)->is_init = (in))
256#define ffesymbol_set_is_save(s,sa) ((s)->is_save = (sa))
257#define ffesymbol_set_maxentrynum(s,m) ((s)->max_entry_num = (m))
258#define ffesymbol_set_namelist(s,n) ((s)->namelist = (n))
259#define ffesymbol_set_namelisted(s,n) ((s)->namelisted = (n))
260#define ffesymbol_set_numentries(s,n) ((s)->num_entries = (n))
261void ffesymbol_set_retractable (mallocPool pool);
262#define ffesymbol_set_sfexpr(s,e) ((s)->sfunc_expr = (e))
263#define ffesymbol_set_specific(s,sp) ((s)->specific = (sp))
264#define ffesymbol_set_state(s,st) ((s)->state = (st))
265#define ffesymbol_set_storage(s,st) ((s)->storage = (st))
266#define ffesymbol_set_value(s,v) ((s)->value = (v))
267#define ffesymbol_sfdummyparent(s) ((s)->sfa_dummy_parent)
268#define ffesymbol_sfexpr(s) ((s)->sfunc_expr)
269void ffesymbol_signal_change (ffesymbol s);
270#define ffesymbol_signal_unreported(s) ((s)->reported = FALSE)
271#define ffesymbol_size(s) ffeinfo_size((s)->info)
272#define ffesymbol_specific(s) ((s)->specific)
273#define ffesymbol_state(s) ((s)->state)
274#define ffesymbol_state_is_specable(s) ((s) <= FFESYMBOL_stateSEEN)
275const char *ffesymbol_state_string (ffesymbolState state);
276#define ffesymbol_storage(s) ((s)->storage)
277void ffesymbol_terminate_0 (void);
278void ffesymbol_terminate_1 (void);
279void ffesymbol_terminate_2 (void);
280void ffesymbol_terminate_3 (void);
281void ffesymbol_terminate_4 (void);
282#define ffesymbol_text(s) (((s)->name == NULL) ? "<->" : ffename_text((s)->name))
283void ffesymbol_update_init (ffesymbol s);
284void ffesymbol_update_save (ffesymbol s);
285#define ffesymbol_value(s) ((s)->value)
286#define ffesymbol_where(s) ffeinfo_where((s)->info)
287#define ffesymbol_where_column(s) (((s)->name == NULL)	\
288      ? ffewhere_column_unknown() : ffename_where_column((s)->name))
289#define ffesymbol_where_filename(s) \
290      ffewhere_line_filename(ffesymbol_where_line(s))
291#define ffesymbol_where_filelinenum(s) \
292      ffewhere_line_filelinenum(ffesymbol_where_line(s))
293#define ffesymbol_where_line(s) (((s)->name == NULL) ? ffewhere_line_unknown() \
294      : ffename_where_line((s)->name))
295
296#endif
297