mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-12 12:26:29 +00:00
Branches: main, 11.07 runtime/mercury_string.h: runtime/mercury_types.h: Use MR_GNUC in place of __GNUC__ in some spots.
325 lines
12 KiB
C
325 lines
12 KiB
C
/*
|
|
** 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_ModuleCommonLayout_Struct MR_ModuleCommonLayout;
|
|
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 */
|