/*
** vim: ts=4 sw=4 expandtab
*/
/*
** Copyright (C) 1995-2011 The University of Melbourne.
** This file may only be copied under the terms of the GNU Library General
** Public License - see the file COPYING.LIB in the Mercury distribution.
*/

/*
** mercury_types.h - definitions of some basic types used by the
** code generated by the Mercury compiler and by the Mercury runtime.
*/

/*
** IMPORTANT NOTE:
** This file must not contain any #include statements,
** other than the #include of "mercury_conf.h",
** for reasons explained in mercury_imp.h.
*/

#ifndef MERCURY_TYPES_H
#define MERCURY_TYPES_H

#include "mercury_conf.h"

/*
** MR_VARIABLE_SIZED -- what to put between the []s when declaring
**          a variable length array at the end of a struct.
**
** The preferred values, if the compiler understands them, convey to the
** implementation that the array has a variable length. The default value
** is the maximum length of the variable-length arrays that we construct,
** since giving too small a value may lead the compiler to use inappropriate
** optimizations (e.g. using small offsets to index into the array).
** At the moment, we use variable length arrays that are indexed by
** closure argument numbers or by type parameter numbers. We therefore
** use a default MR_VARIABLE_SIZED value that is at least as big as
** both MR_MAX_VIRTUAL_R_REG and MR_PSEUDOTYPEINFO_MAX_VAR.
*/

#if __STDC_VERSION__ >= 199901  /* January 1999 */
  /* Use C9X-style variable-length arrays. */
  #define   MR_VARIABLE_SIZED   /* nothing */
#elif defined(MR_GNUC)
  /* Use GNU-style variable-length arrays */
  /* Note: clang does *not* support these. */
  #define   MR_VARIABLE_SIZED   0
#else
  /* Just fake it by pretending that the array has a fixed size */
  #define   MR_VARIABLE_SIZED   1024
#endif

/*
** This section defines types similar to C9X's <stdint.h> header.
** We do not use <stdint.h>, or the <inttypes.h> or <sys/types.h> files
** that substitute for it on some systems because (a) some such files
** do not define the types we need, and (b) some such files include
** inline function definitions. The latter is a problem because we want to
** reserve some real machine registers for Mercury abstract machine registers.
** To be effective, the definitions of these global register variables
** must precede all function definitions, and we want to put their
** definitions after mercury_types.h.
*/

typedef unsigned MR_WORD_TYPE           MR_uintptr_t;
typedef MR_WORD_TYPE                    MR_intptr_t;

#ifdef  MR_INT_LEAST64_TYPE
typedef unsigned MR_INT_LEAST64_TYPE    MR_uint_least64_t;
typedef MR_INT_LEAST64_TYPE             MR_int_least64_t;
#endif

typedef unsigned MR_INT_LEAST32_TYPE    MR_uint_least32_t;
typedef MR_INT_LEAST32_TYPE             MR_int_least32_t;
typedef unsigned MR_INT_LEAST16_TYPE    MR_uint_least16_t;
typedef MR_INT_LEAST16_TYPE             MR_int_least16_t;
typedef unsigned char                   MR_uint_least8_t;
typedef signed char                     MR_int_least8_t;

/*
** This section defines the basic types that we use.
** Note that we require
**      sizeof(MR_Word) == sizeof(MR_Integer) == sizeof(MR_CodePtr).
*/

typedef MR_uintptr_t            MR_Word;
typedef MR_intptr_t             MR_Integer;
typedef MR_uintptr_t            MR_Unsigned;

/*
** MR_Bool is the C representation for the Mercury type bool.bool/0.
** For ordinary booleans, use MR_bool in mercury_std.h.
*/
typedef MR_Word                 MR_Bool;

/*
** Convert a size in bytes to a size in words, rounding up if necessary.
*/

#define MR_bytes_to_words(x)    (((x) + sizeof(MR_Word) - 1) / sizeof(MR_Word))

/*
** `MR_CodePtr' is used as a generic pointer-to-label type that can point
** to any label defined using the MR_define_* macros in mercury_goto.h.
*/

typedef void                    MR_Code;
typedef MR_Code                 *MR_CodePtr;

/*
** MR_Float64 is required for the bytecode.
** XXX: We should also check for IEEE-754 compliance.
*/

#if     MR_FLOAT_IS_64_BIT
        typedef float                   MR_Float64;
#elif   MR_DOUBLE_IS_64_BIT
        typedef double                  MR_Float64;
#elif   MR_LONG_DOUBLE_IS_64_BIT
        typedef long double             MR_Float64;
#else
        #error  "For Mercury bytecode, we require 64-bit IEEE-754 floating point"
#endif

/*
** The following four typedefs logically belong in mercury_string.h.
** They are defined here to avoid problems with circular #includes.
** If you modify them, you will need to modify mercury_string.h as well.
*/

typedef int             MR_Char;
typedef unsigned int    MR_UnsignedChar;

typedef char            *MR_String;
typedef const char      *MR_ConstString;

/*
** Definitions for accessing the representation of the Mercury `array' type.
** Even though array is defined in the library, it is a built in type in the
** sense that mlds_to_c generates references to it. Since mercury.h doesn't
** include mercury_library_types.h, the definition needs to be here, otherwise
** references to arrays in e.g. library/bitmap.m would cause C compiler errors.
**
** Note that arrays should be allocated on the Mercury heap,
** using MR_incr_hp_msg().
*/

typedef struct {
    MR_Integer size;
    MR_Word elements[MR_VARIABLE_SIZED];
} MR_ArrayType;

typedef MR_ArrayType        *MR_ArrayPtr;
typedef const MR_ArrayType  *MR_ConstArrayPtr;

typedef struct {
    MR_Integer num_bits;
    MR_uint_least8_t elements[MR_VARIABLE_SIZED];
} MR_BitmapType;

typedef MR_BitmapType       *MR_BitmapPtr;
typedef const MR_BitmapType *MR_ConstBitmapPtr;

#ifndef MR_HIGHLEVEL_CODE
  /*
  ** Semidet predicates indicate success or failure by leaving nonzero or zero
  ** respectively in SUCCESS_INDICATOR, which the code generator (code_gen.m,
  ** call_gen.m, pragma_c_gen.m etc) knows to be MR_r1. (Note that
  ** pragma_c_gen.m temporarily redefines SUCCESS_INDICATOR.)
  ** (should this #define go in some other header file?)
  */
  #define SUCCESS_INDICATOR MR_r1
#endif

/*
** The MR_Box type is used for representing polymorphic types.
** Currently this is only used in the MLDS C backend.
**
** Since it is used in some C code fragments, we define it as MR_Word
** in the low-level backend.
*/

#ifdef MR_HIGHLEVEL_CODE
  typedef void      *MR_Box;
#else
  typedef MR_Word   MR_Box;
#endif

/*
** Tuples are always just arrays of polymorphic terms.
*/
#ifdef MR_HIGHLEVEL_CODE
  typedef MR_Box    *MR_Tuple;
#else
  typedef MR_Word   MR_Tuple;
#endif


/*
** These typedefs are forward declarations, used to avoid circular dependencies
** between header files.
*/

typedef struct MR_TypeCtorInfo_Struct                   MR_TypeCtorInfo_Struct;
typedef const struct MR_TypeCtorInfo_Struct             *MR_TypeCtorInfo;
typedef       struct MR_TypeInfo_Almost_Struct          *MR_TypeInfo;
typedef const struct MR_PseudoTypeInfo_Almost_Struct    *MR_PseudoTypeInfo;
typedef       struct MR_PseudoTypeInfo_Almost_Struct    *MR_NCPseudoTypeInfo;
typedef const void                                      *MR_ReservedAddr;

#ifdef  MR_HIGHLEVEL_CODE
  typedef MR_Box                                MR_BaseTypeclassInfo;
#else
  typedef MR_Code                               *MR_BaseTypeclassInfo;
#endif

typedef       struct MR_TypeClassDecl_Struct    MR_TypeClassDeclStruct;
typedef const struct MR_TypeClassDecl_Struct    *MR_TypeClassDecl;
typedef       struct MR_Instance_Struct         MR_InstanceStruct;
typedef const struct MR_Instance_Struct         *MR_Instance;
typedef       struct MR_DictId_Struct           MR_DictIdStruct;
typedef const struct MR_DictId_Struct           *MR_DictId;
typedef       struct MR_Dictionary_Struct       MR_DictionaryStruct;
typedef const struct MR_Dictionary_Struct       *MR_Dictionary;
typedef       struct MR_TypeClassId_Struct      MR_TypeClassId;
typedef       struct MR_TypeClassMethod_Struct  MR_TypeClassMethod;
typedef       struct MR_ClassDict_Struct        MR_ClassDict;

typedef struct MR_TrailEntry_Struct             MR_TrailEntry;
typedef struct MR_TrailEntry_Struct             *MR_TrailEntryPtr;

typedef struct MR_Closure_Struct                MR_Closure;
typedef const MR_Closure                        *MR_ClosurePtr;

typedef struct MR_ClosureId_Struct              MR_ClosureId;
typedef struct MR_UserClosureId_Struct          MR_UserClosureId;
typedef struct MR_UCIClosureId_Struct           MR_UCIClosureId;

typedef struct MR_TypeParamLocns_Struct         MR_TypeParamLocns;

typedef struct MR_UserProcId_Struct             MR_UserProcId;
typedef struct MR_UCIProcId_Struct              MR_UCIProcId;
typedef struct MR_NoProcId_Struct               MR_NoProcId;
typedef union  MR_ProcId_Union                  MR_ProcId;

typedef struct MR_CallSiteStatic_Struct         MR_CallSiteStatic;
typedef struct MR_CallSiteDynamic_Struct        MR_CallSiteDynamic;
typedef struct MR_User_ProcStatic_Struct        MR_User_ProcStatic;
typedef struct MR_UCI_ProcStatic_Struct         MR_UCI_ProcStatic;
typedef struct MR_ProcStatic_Struct             MR_ProcStatic;
typedef struct MR_ProcDynamic_Struct            MR_ProcDynamic;
typedef struct MR_ProfilingMetrics_Struct       MR_ProfilingMetrics;

typedef struct MR_CallSiteDynList_Struct        MR_CallSiteDynList;

typedef struct MR_ProcLayout_Struct             MR_ProcLayout;
typedef struct MR_ModuleLayout_Struct           MR_ModuleLayout;
typedef struct MR_LabelLayout_Struct            MR_LabelLayout;
typedef struct MR_SynthAttr_Struct              MR_SynthAttr;
typedef struct MR_UserEvent_Struct              MR_UserEvent;
typedef struct MR_UserEventSpec_Struct          MR_UserEventSpec;

typedef struct MR_AllocSiteInfo_Struct          MR_AllocSiteInfo;
typedef MR_AllocSiteInfo                        *MR_AllocSiteInfoPtr;

typedef union MR_TableNode_Union                MR_TableNode;
typedef MR_TableNode                            *MR_TrieNode;
typedef MR_TrieNode                             *MR_TrieNodePtr;

typedef struct MR_HashTable_Struct              MR_HashTable;
typedef struct MR_MemoNonRecord_Struct          MR_MemoNonRecord;
typedef struct MR_MemoNonRecord_Struct          *MR_MemoNonRecordPtr;
typedef struct MR_AnswerListNode_Struct         MR_AnswerListNode;
typedef struct MR_Subgoal_Struct                MR_Subgoal;
typedef struct MR_SubgoalListNode_Struct        MR_SubgoalListNode;
typedef struct MR_Consumer_Struct               MR_Consumer;
typedef struct MR_ConsumerListNode_Struct       MR_ConsumerListNode;
typedef struct MR_Generator_Struct              MR_Generator;

typedef MR_SubgoalListNode                      *MR_SubgoalList;
typedef MR_AnswerListNode                       *MR_AnswerList;
typedef MR_ConsumerListNode                     *MR_ConsumerList;

typedef struct MR_GenStackFrameStruct           MR_GenStackFrame;
typedef struct MR_CutStackFrameStruct           MR_CutStackFrame;
typedef struct MR_PNegStackFrameStruct          MR_PNegStackFrame;

typedef struct MR_PNegConsumerListNodeStruct    MR_PNegConsumerListNode;
typedef MR_PNegConsumerListNode                 *MR_PNegConsumerList;

typedef struct MR_ConsumerDebug_Struct          MR_ConsumerDebug;
typedef struct MR_SubgoalDebug_Struct           MR_SubgoalDebug;
typedef struct MR_ConsDebug_Struct              MR_ConsDebug;
typedef struct MR_GenDebug_Struct               MR_GenDebug;

typedef MR_Word                                 *MR_AnswerBlock;
typedef MR_Subgoal                              *MR_SubgoalPtr;
typedef MR_Consumer                             *MR_ConsumerPtr;
typedef MR_Generator                            *MR_GeneratorPtr;

typedef struct MR_TableStepStats_Struct         MR_TableStepStats;
typedef struct MR_TableStats_Struct             MR_TableStats;
typedef struct MR_TableStepDesc_Struct          MR_TableStepDesc;
typedef struct MR_ProcTableInfo_Struct          MR_ProcTableInfo;
typedef MR_ProcTableInfo                        *MR_ProcTableInfoPtr;

typedef struct MR_RegionHeader_Struct           MR_RegionHeader;
typedef struct MR_RegionPage_Struct             MR_RegionPage;
typedef struct MR_RegionSnapshot_Struct         MR_RegionSnapshot;
typedef struct MR_RegionIteFixedFrame_Struct    MR_RegionIteFixedFrame;
typedef struct MR_RegionDisjFixedFrame_Struct   MR_RegionDisjFixedFrame;
typedef struct MR_RegionCommitFixedFrame_Struct MR_RegionCommitFixedFrame;
typedef struct MR_RegionIteProtect_Struct       MR_RegionIteProtect;
typedef struct MR_RegionSemiDisjProtect_Struct  MR_RegionSemiDisjProtect;
typedef struct MR_RegionCommitSave_Struct       MR_RegionCommitSave;
typedef struct MR_RegionProfUnit_Struct         MR_RegionProfUnit;

typedef struct MR_Future_Struct                 MR_Future;

typedef MR_uint_least16_t   MR_EngineId;

#endif /* not MERCURY_TYPES_H */
