mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-08 18:34:00 +00:00
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.
293 lines
12 KiB
C
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
|