home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / g77-0.5.15-src.tgz / tar.out / fsf / g77 / f / symbol.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  12KB  |  284 lines

  1. /* Interface definitions for Fortran symbol manager
  2.    Copyright (C) 1995 Free Software Foundation, Inc.
  3.    Contributed by James Craig Burley (burley@gnu.ai.mit.edu).
  4.  
  5. This file is part of GNU Fortran.
  6.  
  7. GNU Fortran is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2, or (at your option)
  10. any later version.
  11.  
  12. GNU Fortran is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with GNU Fortran; see the file COPYING.  If not, write to
  19. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. #ifndef _H_f_symbol
  22. #define _H_f_symbol
  23.  
  24. /* The main symbol type.  */
  25.  
  26. typedef struct _ffesymbol_ *ffesymbol;
  27.  
  28. /* State of understanding about what the symbol represents.  */
  29.  
  30. enum _ffesymbol_state_
  31.   {
  32. /* See ffesymbol_state_is_exec() macro below when making changes.  */
  33.     FFESYMBOL_stateNONE,    /* Never before seen. */
  34.     FFESYMBOL_stateSEEN,    /* Seen before exec transition and not yet
  35.                    understood (info not filled in, etc). */
  36.     FFESYMBOL_stateUNCERTAIN,    /* Almost understood (info partly filled in). */
  37.     FFESYMBOL_stateUNDERSTOOD,    /* Fully understood (info filled in). */
  38.     FFESYMBOL_state
  39.   };
  40. typedef enum _ffesymbol_state_ ffesymbolState;
  41. #define ffesymbolState_f ""
  42.  
  43. /* Attributes.  Symbols acquire attributes while their state is SEEN.
  44.    These attributes are basically ignored once the symbol becomes
  45.    UNDERSTOOD.  */
  46.  
  47. typedef long int ffesymbolAttrs;/* Holds set of attributes. */
  48. #define ffesymbolAttrs_f "l"
  49.  
  50. enum _ffesymbol_attr_
  51.   {
  52. #define DEFATTR(ATTR,ATTRS,NAME) ATTR,
  53. #include "symbol.def"
  54. #undef DEFATTR
  55.     FFESYMBOL_attr
  56.   };                /* A given attribute. */
  57. typedef enum _ffesymbol_attr_ ffesymbolAttr;
  58. #define ffesymbolAttr_f ""
  59.  
  60. #define FFESYMBOL_attrsetNONE 0
  61. #define FFESYMBOL_attrsetALL (((ffesymbolAttrs) 1 << FFESYMBOL_attr) - 1)
  62.  
  63. /* This is just for avoiding complaining about, e.g., "I = IABS(3)", that
  64.    IABS doesn't meet the requirements for a user-defined symbol name as
  65.    a result of, say, --symbol-case-lower, if IABS turns out to indeed be
  66.    a reference to the intrinsic IABS (in which case it's a Fortran keyword
  67.    like CALL) and not a user-defined name.  */
  68.  
  69. enum _ffesymbol_checkstate_
  70.   {
  71.     FFESYMBOL_checkstateNONE_,    /* Not checked/never necessary to check. */
  72.     FFESYMBOL_checkstateINHIBITED_,    /* Bad name, but inhibited. */
  73.     FFESYMBOL_checkstatePENDING_,    /* Bad name, might be intrinsic. */
  74.     FFESYMBOL_checkstateCHECKED_,    /* Ok name, intrinsic, or bad name
  75.                        reported. */
  76.     FFESYMBOL_checkstate_
  77.   };
  78. typedef enum _ffesymbol_checkstate_ ffesymbolCheckState_;
  79. #define ffesymbolCheckState_f_ ""
  80.  
  81. #include "bad.h"
  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.  
  96. struct _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 save;            /* SAVE flag set for this symbol (see also
  144.                    ffe_is_saveall()). */
  145.     bool do_iter;        /* Is currently a DO-loop iter (can't be
  146.                    changed in loop). */
  147.     bool reported;        /* (Debug) TRUE if the latest version has
  148.                    been reported. */
  149.     bool have_old;        /* TRUE if old copy of this symbol saved
  150.                    away. */
  151.     bool explicit_where;    /* TRUE if INTRINSIC/EXTERNAL explicit. */
  152.     bool namelisted;        /* TRUE if in NAMELIST (needs static alloc). */
  153.   };
  154.  
  155. #define ffesymbol_accretes(s) ((s)->accretes)
  156. #define ffesymbol_accretion(s) ((s)->accretion)
  157. #define ffesymbol_arraysize(s) ((s)->array_size)
  158. #define ffesymbol_attr(s,a) ((s)->attrs & ((ffesymbolAttrs) 1 << (a)))
  159. #define ffesymbol_attrs(s) ((s)->attrs)
  160. char *ffesymbol_attrs_string (ffesymbolAttrs attrs);
  161. #define ffesymbol_basictype(s) ffeinfo_basictype((s)->info)
  162. void ffesymbol_check (ffesymbol s, ffelexToken t, bool maybe_intrin);
  163. #define ffesymbol_common(s) ((s)->common)
  164. #define ffesymbol_commonlist(s) ((s)->common_list)
  165. ffesymbol ffesymbol_declare_blockdataunit (ffelexToken t, ffewhereLine wl,
  166.                        ffewhereColumn wc);
  167. ffesymbol ffesymbol_declare_cblock (ffelexToken t, ffewhereLine wl,
  168.                     ffewhereColumn wc);
  169. ffesymbol ffesymbol_declare_funcnotresunit (ffelexToken t);
  170. ffesymbol ffesymbol_declare_funcresult (ffelexToken t);
  171. ffesymbol ffesymbol_declare_funcunit (ffelexToken t);
  172. ffesymbol ffesymbol_declare_local (ffelexToken t, bool maybe_intrin);
  173. ffesymbol ffesymbol_declare_programunit (ffelexToken t, ffewhereLine wl,
  174.                      ffewhereColumn wc);
  175. ffesymbol ffesymbol_declare_sfdummy (ffelexToken t);
  176. ffesymbol ffesymbol_declare_subrunit (ffelexToken t);
  177. #define ffesymbol_dims(s) ((s)->dims)
  178. #define ffesymbol_dim_syms(s) ((s)->dim_syms)
  179. void ffesymbol_drive (ffesymbol (*fn) ());
  180. void ffesymbol_drive_sfnames (ffesymbol (*fn) ());
  181. #define ffesymbol_dummyargs(s) ((s)->dummy_args)
  182. void ffesymbol_dump (ffesymbol s);
  183. void ffesymbol_error (ffesymbol s, ffelexToken t);
  184. #define ffesymbol_equiv(s) ((s)->equiv)
  185. #define ffesymbol_explicitwhere(s) ((s)->explicit_where)
  186. #define ffesymbol_extents(s) ((s)->extents)
  187. #define ffesymbol_first_token(s) ((s)->name == NULL ? NULL  \
  188.       : ffename_first_token((s)->name))
  189. #define ffesymbol_funcresult(s) ((s)->func_result)
  190. #define ffesymbol_generic(s) ((s)->generic)
  191. #define ffesymbol_global(s) ((s)->global)
  192. #define ffesymbol_hook(s) ((s)->hook)
  193. #define ffesymbol_implementation(s) ((s)->implementation)
  194. #define ffesymbol_info(s) ((s)->info)
  195. #define ffesymbol_init(s) ((s)->init)
  196. void ffesymbol_init_0 (void);
  197. void ffesymbol_init_1 (void);
  198. void ffesymbol_init_2 (void);
  199. void ffesymbol_init_3 (void);
  200. void ffesymbol_init_4 (void);
  201. #define ffesymbol_is_doiter(s) ((s)->do_iter)
  202. #define ffesymbol_is_dualspace(s) ((s)->other_space_name != NULL)
  203. #define ffesymbol_is_f2c(s) (ffe_is_f2c())
  204. #define ffesymbol_is_specable(s) ffesymbol_state_is_specable(s->state)
  205. #define ffesymbol_is_reported(s) ((s)->reported)
  206. #define ffesymbol_kindtype(s) ffeinfo_kindtype((s)->info)
  207. #define ffesymbol_kind(s) ffeinfo_kind((s)->info)
  208. ffesymbol ffesymbol_lookup_local (ffelexToken t);
  209. #define ffesymbol_maxentrynum(s) ((s)->max_entry_num)
  210. #define ffesymbol_namelist(s) ((s)->namelist)
  211. #define ffesymbol_namelisted(s) ((s)->namelisted)
  212. #define ffesymbol_numentries(s) ((s)->num_entries)
  213. #define ffesymbol_ptr_to_commonlist(s) (&(s)->common_list)
  214. #define ffesymbol_ptr_to_listbottom(s) (&(s)->list_bottom)
  215. #define ffesymbol_ptr_to_namelist(s) (&(s)->namelist)
  216. #define ffesymbol_rank(s) ffeinfo_rank((s)->info)
  217. ffesymbol ffesymbol_report (ffesymbol s);
  218. void ffesymbol_report_all (void);
  219. void ffesymbol_resolve_intrin (ffesymbol s);
  220. void ffesymbol_retract (bool retract);
  221. bool ffesymbol_retractable (void);
  222. #define ffesymbol_save(s) ((s)->save)
  223. #define ffesymbol_set_accretes(s,a) ((s)->accretes = (a))
  224. #define ffesymbol_set_accretion(s,a) ((s)->accretion = (a))
  225. #define ffesymbol_set_arraysize(s,a) ((s)->array_size = (a))
  226. #define ffesymbol_set_attr(s,a) ((s)->attrs |= ((ffesymbolAttrs) 1 << (a)))
  227. #define ffesymbol_set_attrs(s,a) ((s)->attrs = (a))
  228. #define ffesymbol_set_common(s,c) ((s)->common = (c))
  229. #define ffesymbol_set_commonlist(s,c) ((s)->common_list = (c))
  230. #define ffesymbol_set_dims(s,d) ((s)->dims = (d))
  231. #define ffesymbol_set_dim_syms(s,d) ((s)->dim_syms = (d))
  232. #define ffesymbol_set_dummyargs(s,d) ((s)->dummy_args = (d))
  233. #define ffesymbol_set_equiv(s,e) ((s)->equiv = (e))
  234. #define ffesymbol_set_explicitwhere(s,e) ((s)->explicit_where = (e))
  235. #define ffesymbol_set_extents(s,e) ((s)->extents = (e))
  236. #define ffesymbol_set_funcresult(s,f) ((s)->func_result = (f))
  237. #define ffesymbol_set_generic(s,g) ((s)->generic = (g))
  238. #define ffesymbol_set_global(s,g) ((s)->global = (g))
  239. #define ffesymbol_set_hook(s,h) ((s)->hook = (h))
  240. #define ffesymbol_set_implementation(s,im) ((s)->implementation = (im))
  241. #define ffesymbol_set_init(s,i) ((s)->init = (i))
  242. #define ffesymbol_set_info(s,i) ((s)->info = (i))
  243. #define ffesymbol_set_is_doiter(s,f) ((s)->do_iter = (f))
  244. #define ffesymbol_set_maxentrynum(s,m) ((s)->max_entry_num = (m))
  245. #define ffesymbol_set_namelist(s,n) ((s)->namelist = (n))
  246. #define ffesymbol_set_namelisted(s,n) ((s)->namelisted = (n))
  247. #define ffesymbol_set_numentries(s,n) ((s)->num_entries = (n))
  248. void ffesymbol_set_retractable (mallocPool pool);
  249. #define ffesymbol_set_save(s,sa) ((s)->save = (sa))
  250. #define ffesymbol_set_sfexpr(s,e) ((s)->sfunc_expr = (e))
  251. #define ffesymbol_set_specific(s,sp) ((s)->specific = (sp))
  252. #define ffesymbol_set_state(s,st) ((s)->state = (st))
  253. #define ffesymbol_set_storage(s,st) ((s)->storage = (st))
  254. #define ffesymbol_set_value(s,v) ((s)->value = (v))
  255. #define ffesymbol_sfdummyparent(s) ((s)->sfa_dummy_parent)
  256. #define ffesymbol_sfexpr(s) ((s)->sfunc_expr)
  257. void ffesymbol_signal_change (ffesymbol s);
  258. #define ffesymbol_signal_unreported(s) ((s)->reported = FALSE)
  259. #define ffesymbol_size(s) ffeinfo_size((s)->info)
  260. #define ffesymbol_specific(s) ((s)->specific)
  261. #define ffesymbol_state(s) ((s)->state)
  262. #define ffesymbol_state_is_specable(s) ((s) <= FFESYMBOL_stateSEEN)
  263. char *ffesymbol_state_string (ffesymbolState state);
  264. #define ffesymbol_storage(s) ((s)->storage)
  265. void ffesymbol_terminate_0 (void);
  266. void ffesymbol_terminate_1 (void);
  267. void ffesymbol_terminate_2 (void);
  268. void ffesymbol_terminate_3 (void);
  269. void ffesymbol_terminate_4 (void);
  270. #define ffesymbol_text(s) (((s)->name == NULL) ? "<->" : ffename_text((s)->name))
  271. void ffesymbol_update_save (ffesymbol s);
  272. #define ffesymbol_value(s) ((s)->value)
  273. #define ffesymbol_where(s) ffeinfo_where((s)->info)
  274. #define ffesymbol_where_column(s) (((s)->name == NULL)    \
  275.       ? ffewhere_column_unknown() : ffename_where_column((s)->name))
  276. #define ffesymbol_where_filename(s) \
  277.       ffewhere_line_filename(ffesymbol_where_line(s))
  278. #define ffesymbol_where_filelinenum(s) \
  279.       ffewhere_line_filelinenum(ffesymbol_where_line(s))
  280. #define ffesymbol_where_line(s) (((s)->name == NULL) ? ffewhere_line_unknown() \
  281.       : ffename_where_line((s)->name))
  282.  
  283. #endif
  284.