| /* global.h -- Public #include File (module.h template V1.0) |
| Copyright (C) 1995, 1997 Free Software Foundation, Inc. |
| Contributed by James Craig Burley (burley@gnu.org). |
| |
| This file is part of GNU Fortran. |
| |
| GNU Fortran is free software; you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation; either version 2, or (at your option) |
| any later version. |
| |
| GNU Fortran is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with GNU Fortran; see the file COPYING. If not, write to |
| the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA |
| 02111-1307, USA. |
| |
| Owning Modules: |
| global.c |
| |
| Modifications: |
| */ |
| |
| /* Allow multiple inclusion to work. */ |
| |
| #ifndef _H_f_global |
| #define _H_f_global |
| |
| /* Simple definitions and enumerations. */ |
| |
| typedef enum |
| { |
| FFEGLOBAL_typeNONE, |
| FFEGLOBAL_typeMAIN, |
| FFEGLOBAL_typeEXT, /* EXTERNAL is all we know. */ |
| FFEGLOBAL_typeSUBR, |
| FFEGLOBAL_typeFUNC, |
| FFEGLOBAL_typeBDATA, |
| FFEGLOBAL_typeCOMMON, |
| FFEGLOBAL_typeANY, /* Confusion reigns, so just ignore. */ |
| FFEGLOBAL_type |
| } ffeglobalType; |
| |
| typedef enum |
| { |
| FFEGLOBAL_argsummaryNONE, /* No arg present. */ |
| FFEGLOBAL_argsummaryVAL, /* Pass-by-value. */ |
| FFEGLOBAL_argsummaryREF, /* Pass-by-reference. */ |
| FFEGLOBAL_argsummaryDESCR, /* Pass-by-descriptor. */ |
| FFEGLOBAL_argsummaryPROC, /* Procedure (intrinsic, external). */ |
| FFEGLOBAL_argsummarySUBR, /* Subroutine (intrinsic, external). */ |
| FFEGLOBAL_argsummaryFUNC, /* Function (intrinsic, external). */ |
| FFEGLOBAL_argsummaryALTRTN, /* Alternate-return (label). */ |
| FFEGLOBAL_argsummaryANY, |
| FFEGLOBAL_argsummary |
| } ffeglobalArgSummary; |
| |
| /* Typedefs. */ |
| |
| typedef struct _ffeglobal_arginfo_ *ffeglobalArgInfo_; |
| typedef struct _ffeglobal_ *ffeglobal; |
| |
| /* Include files needed by this one. */ |
| |
| #include "info.h" |
| #include "lex.h" |
| #include "name.h" |
| #include "symbol.h" |
| #include "target.h" |
| #include "top.h" |
| |
| /* Structure definitions. */ |
| |
| struct _ffeglobal_arginfo_ |
| { |
| ffelexToken t; /* Different from master token when difference is important. */ |
| char *name; /* Name of dummy arg, or NULL if not yet known. */ |
| ffeglobalArgSummary as; |
| ffeinfoBasictype bt; |
| ffeinfoKindtype kt; |
| bool array; |
| }; |
| |
| struct _ffeglobal_ |
| { |
| ffelexToken t; |
| ffename n; |
| #ifdef FFECOM_globalHOOK |
| ffecomGlobal hook; |
| #endif |
| ffeCounter tick; /* Recent transition in this progunit. */ |
| ffeglobalType type; |
| bool intrinsic; /* Known as intrinsic? */ |
| bool explicit_intrinsic; /* Explicit intrinsic? */ |
| union { |
| struct { |
| ffelexToken initt; /* First initial value. */ |
| bool have_pad; /* Padding info avail for COMMON? */ |
| ffetargetAlign pad; /* Initial padding for COMMON. */ |
| ffewhereLine pad_where_line; |
| ffewhereColumn pad_where_col; |
| bool have_save; /* Save info avail for COMMON? */ |
| bool save; /* Save info for COMMON. */ |
| ffewhereLine save_where_line; |
| ffewhereColumn save_where_col; |
| bool have_size; /* Size info avail for COMMON? */ |
| ffetargetOffset size; /* Size info for COMMON. */ |
| bool blank; /* TRUE if blank COMMON. */ |
| } common; |
| struct { |
| bool defined; /* Seen actual code yet? */ |
| ffeinfoBasictype bt; /* NONE for non-function. */ |
| ffeinfoKindtype kt; /* NONE for non-function. */ |
| ffetargetCharacterSize sz; |
| int n_args; /* 0 for main/blockdata. */ |
| ffelexToken other_t; /* Location of reference. */ |
| ffeglobalArgInfo_ arg_info; /* Info on each argument. */ |
| } proc; |
| } u; |
| }; |
| |
| /* Global objects accessed by users of this module. */ |
| |
| |
| /* Declare functions with prototypes. */ |
| |
| void ffeglobal_drive (ffeglobal (*fn) ()); |
| void ffeglobal_init_1 (void); |
| void ffeglobal_init_common (ffesymbol s, ffelexToken t); |
| void ffeglobal_new_progunit_ (ffesymbol s, ffelexToken t, ffeglobalType type); |
| void ffeglobal_new_common (ffesymbol s, ffelexToken t, bool blank); |
| void ffeglobal_pad_common (ffesymbol s, ffetargetAlign pad, ffewhereLine wl, |
| ffewhereColumn wc); |
| void ffeglobal_proc_def_arg (ffesymbol s, int argno, char *name, ffeglobalArgSummary as, |
| ffeinfoBasictype bt, ffeinfoKindtype kt, |
| bool array); |
| void ffeglobal_proc_def_nargs (ffesymbol s, int n_args); |
| bool ffeglobal_proc_ref_arg (ffesymbol s, int argno, ffeglobalArgSummary as, |
| ffeinfoBasictype bt, ffeinfoKindtype kt, |
| bool array, ffelexToken t); |
| bool ffeglobal_proc_ref_nargs (ffesymbol s, int n_args, ffelexToken t); |
| ffeglobal ffeglobal_promoted (ffesymbol s); |
| void ffeglobal_ref_intrinsic (ffesymbol s, ffelexToken t, bool explicit); |
| bool ffeglobal_ref_progunit_ (ffesymbol s, ffelexToken t, ffeglobalType type); |
| void ffeglobal_save_common (ffesymbol s, bool save, ffewhereLine wl, |
| ffewhereColumn wc); |
| bool ffeglobal_size_common (ffesymbol s, ffetargetOffset size); |
| void ffeglobal_terminate_1 (void); |
| |
| /* Define macros. */ |
| |
| #if FFECOM_targetCURRENT == FFECOM_targetFFE |
| #define FFEGLOBAL_ENABLED 0 |
| #elif FFECOM_targetCURRENT == FFECOM_targetGCC |
| #define FFEGLOBAL_ENABLED 1 |
| #else |
| #error |
| #endif |
| |
| #define ffeglobal_common_init(g) ((g)->tick != 0) |
| #define ffeglobal_common_have_pad(g) ((g)->u.common.have_pad) |
| #define ffeglobal_common_have_size(g) ((g)->u.common.have_size) |
| #define ffeglobal_common_pad(g) ((g)->u.common.pad) |
| #define ffeglobal_common_size(g) ((g)->u.common.size) |
| #define ffeglobal_hook(g) ((g)->hook) |
| #define ffeglobal_init_0() |
| #define ffeglobal_init_2() |
| #define ffeglobal_init_3() |
| #define ffeglobal_init_4() |
| #define ffeglobal_new_blockdata(s,t) \ |
| ffeglobal_new_progunit_(s,t,FFEGLOBAL_typeBDATA) |
| #define ffeglobal_new_function(s,t) \ |
| ffeglobal_new_progunit_(s,t,FFEGLOBAL_typeFUNC) |
| #define ffeglobal_new_program(s,t) \ |
| ffeglobal_new_progunit_(s,t,FFEGLOBAL_typeMAIN) |
| #define ffeglobal_new_subroutine(s,t) \ |
| ffeglobal_new_progunit_(s,t,FFEGLOBAL_typeSUBR) |
| #define ffeglobal_ref_blockdata(s,t) \ |
| ffeglobal_ref_progunit_(s,t,FFEGLOBAL_typeBDATA) |
| #define ffeglobal_ref_external(s,t) \ |
| ffeglobal_ref_progunit_(s,t,FFEGLOBAL_typeEXT) |
| #define ffeglobal_ref_function(s,t) \ |
| ffeglobal_ref_progunit_(s,t,FFEGLOBAL_typeFUNC) |
| #define ffeglobal_ref_subroutine(s,t) \ |
| ffeglobal_ref_progunit_(s,t,FFEGLOBAL_typeSUBR) |
| #define ffeglobal_set_hook(g,h) ((g)->hook = (h)) |
| #define ffeglobal_terminate_0() |
| #define ffeglobal_terminate_2() |
| #define ffeglobal_terminate_3() |
| #define ffeglobal_terminate_4() |
| #define ffeglobal_text(g) ffename_text((g)->n) |
| #define ffeglobal_type(g) ((g)->type) |
| |
| /* End of #include file. */ |
| |
| #endif |