Files
mercury/runtime/mercury_types.h
Mark Brown d465fa53cb Update the COPYING.LIB file and references to it.
Discussion of these changes can be found on the Mercury developers
mailing list archives from June 2018.

COPYING.LIB:
    Add a special linking exception to the LGPL.

*:
    Update references to COPYING.LIB.

    Clean up some minor errors that have accumulated in copyright
    messages.
2018-06-09 17:43:12 +10:00

293 lines
12 KiB
C

// vim: ts=4 sw=4 expandtab ft=c
// Copyright (C) 1995-2011 The University of Melbourne.
// Copyright (C) 2016, 2018 The Mercury team.
// This file is distributed under the terms specified in COPYING.LIB.
// 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;
#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