Rts.h 6.12 KB
Newer Older
1
/* -----------------------------------------------------------------------------
2
 *
3
 * (c) The GHC Team, 1998-2004
4 5 6 7 8 9 10 11
 *
 * Top-level include file for the RTS itself
 *
 * ---------------------------------------------------------------------------*/

#ifndef RTS_H
#define RTS_H

12 13 14 15
#ifdef __cplusplus
extern "C" {
#endif

16
#ifndef IN_STG_CODE
17
#define IN_STG_CODE 0
18 19 20
#endif
#include "Stg.h"

21 22 23 24 25 26 27 28 29 30 31 32
#include "RtsTypes.h"

#if __GNUC__ >= 3
/* Assume that a flexible array member at the end of a struct
 * can be defined thus: T arr[]; */
#define FLEXIBLE_ARRAY
#else
/* Assume that it must be defined thus: T arr[0]; */
#define FLEXIBLE_ARRAY 0
#endif

/* Fix for mingw stat problem (done here so it's early enough) */
33
#ifdef mingw32_HOST_OS
34 35 36
#define __MSVCRT__ 1
#endif

37 38 39 40
/* Needed to get the macro version of errno on some OSs, and also to
   get prototypes for the _r versions of C library functions. */
#define _REENTRANT 1

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
/*
 * We often want to know the size of something in units of an
 * StgWord... (rounded up, of course!)
 */
#define sizeofW(t) ((sizeof(t)+sizeof(W_)-1)/sizeof(W_))

/* 
 * It's nice to be able to grep for casts
 */
#define stgCast(ty,e) ((ty)(e))

/* -----------------------------------------------------------------------------
   Assertions and Debuggery
   -------------------------------------------------------------------------- */

#ifndef DEBUG
#define ASSERT(predicate) /* nothing */
#else

60
extern void _assertFail (const char *, unsigned int);
61 62 63 64 65

#define ASSERT(predicate)			\
	if (predicate)				\
	    /*null*/;				\
	else					\
66
	    _assertFail(__FILE__, __LINE__)
67 68 69 70 71 72 73 74 75 76
#endif /* DEBUG */

/* 
 * Use this on the RHS of macros which expand to nothing
 * to make sure that the macro can be used in a context which
 * demands a non-empty statement.
 */

#define doNothing() do { } while (0)

77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
#ifdef DEBUG
#define USED_IF_DEBUG
#define USED_IF_NOT_DEBUG STG_UNUSED
#else
#define USED_IF_DEBUG STG_UNUSED
#define USED_IF_NOT_DEBUG
#endif

#ifdef THREADED_RTS
#define USED_IF_THREADS
#define USED_IF_NOT_THREADS STG_UNUSED
#else
#define USED_IF_THREADS STG_UNUSED
#define USED_IF_NOT_THREADS
#endif

93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
/* -----------------------------------------------------------------------------
   Include everything STG-ish
   -------------------------------------------------------------------------- */

/* System headers: stdlib.h is eeded so that we can use NULL.  It must
 * come after MachRegs.h, because stdlib.h might define some inline
 * functions which may only be defined after register variables have
 * been declared.
 */
#include <stdlib.h>

/* Global constaints */
#include "Constants.h"

/* Profiling information */
#include "StgProf.h"
#include "StgLdvProf.h"

/* Storage format definitions */
#include "StgFun.h"
#include "Closures.h"
#include "Liveness.h"
#include "ClosureTypes.h"
#include "InfoTables.h"
#include "TSO.h"

/* Info tables, closures & code fragments defined in the RTS */
#include "StgMiscClosures.h"

/* Simulated-parallel information */
#include "GranSim.h"

/* Parallel information */
#include "Parallel.h"
127 128
#include "OSThreads.h"
#include "SMP.h"
129 130 131 132 133 134 135 136 137 138 139 140 141 142

/* STG/Optimised-C related stuff */
#include "Block.h"

/* GNU mp library */
#include "gmp.h"

/* Macros for STG/C code */
#include "ClosureMacros.h"
#include "StgTicky.h"
#include "Stable.h"

/* Runtime-system hooks */
#include "Hooks.h"
143
#include "RtsMessages.h"
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

#include "ieee-flpt.h"

#include "Signals.h"

/* Misc stuff without a home */
DLL_IMPORT_RTS extern char **prog_argv;	/* so we can get at these from Haskell */
DLL_IMPORT_RTS extern int    prog_argc;
DLL_IMPORT_RTS extern char  *prog_name;

extern void stackOverflow(void);

extern void      __decodeDouble (MP_INT *man, I_ *_exp, StgDouble dbl);
extern void      __decodeFloat  (MP_INT *man, I_ *_exp, StgFloat flt);

#if defined(WANT_DOTNET_SUPPORT)
#include "DNInvoke.h"
#endif

163
/* Initialising the whole adjustor thunk machinery. */
164
extern void initAdjustor(void);
165 166 167

extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);

168
/* -----------------------------------------------------------------------------
169
   RTS Exit codes
170 171
   -------------------------------------------------------------------------- */

172 173 174 175 176 177 178 179 180 181 182
/* 255 is allegedly used by dynamic linkers to report linking failure */
#define EXIT_INTERNAL_ERROR 254
#define EXIT_DEADLOCK       253
#define EXIT_INTERRUPTED    252
#define EXIT_HEAPOVERFLOW   251
#define EXIT_KILLED         250

/* -----------------------------------------------------------------------------
   Miscellaneous garbage
   -------------------------------------------------------------------------- */

183 184 185 186
/* declarations for runtime flags/values */
#define MAX_RTS_ARGS 32

/* -----------------------------------------------------------------------------
187
   Assertions and Debuggery
188 189
   -------------------------------------------------------------------------- */

190
#define IF_RTSFLAGS(c,s)  if (RtsFlags.c) { s; }
191 192 193 194 195

/* -----------------------------------------------------------------------------
   Assertions and Debuggery
   -------------------------------------------------------------------------- */

196 197 198
#ifdef DEBUG
#define IF_DEBUG(c,s)  if (RtsFlags.DebugFlags.c) { s; }
#else
199
#define IF_DEBUG(c,s)  doNothing()
200 201
#endif

202 203 204 205 206 207
#ifdef DEBUG
#define DEBUG_ONLY(s) s
#else
#define DEBUG_ONLY(s) doNothing()
#endif

208 209
#if defined(GRAN) && defined(DEBUG)
#define IF_GRAN_DEBUG(c,s)  if (RtsFlags.GranFlags.Debug.c) { s; }
210
#else
211 212 213 214 215 216 217
#define IF_GRAN_DEBUG(c,s)  doNothing()
#endif

#if defined(PAR) && defined(DEBUG)
#define IF_PAR_DEBUG(c,s)  if (RtsFlags.ParFlags.Debug.c) { s; }
#else
#define IF_PAR_DEBUG(c,s)  doNothing()
218 219 220
#endif

/* -----------------------------------------------------------------------------
221
   Useful macros and inline functions
222 223
   -------------------------------------------------------------------------- */

sof's avatar
sof committed
224 225 226 227 228
#if defined(__GNUC__)
#define SUPPORTS_TYPEOF
#endif

#if defined(SUPPORTS_TYPEOF)
229 230
#define stg_min(a,b) ({typeof(a) _a = (a), _b = (b); _a <= _b ? _a : _b; })
#define stg_max(a,b) ({typeof(a) _a = (a), _b = (b); _a <= _b ? _b : _a; })
sof's avatar
sof committed
231 232 233 234
#else
#define stg_min(a,b) ((a) <= (b) ? (a) : (b))
#define stg_max(a,b) ((a) <= (b) ? (b) : (a))
#endif
235

236 237 238 239 240 241
/* -------------------------------------------------------------------------- */

#ifdef __cplusplus
}
#endif

242
#endif /* RTS_H */