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