/* 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
