Rts.h 6.9 KB
Newer Older
1
/* -----------------------------------------------------------------------------
2
 *
Simon Marlow's avatar
Simon Marlow committed
3
 * (c) The GHC Team, 1998-2009
4
 *
Simon Marlow's avatar
Simon Marlow committed
5 6
 * RTS external APIs.  This file declares everything that the GHC RTS
 * exposes externally.
7
 *
8 9 10
 * To understand the structure of the RTS headers, see the wiki:
 *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes
 *
11 12 13 14 15
 * ---------------------------------------------------------------------------*/

#ifndef RTS_H
#define RTS_H

16 17 18 19
#ifdef __cplusplus
extern "C" {
#endif

20
#ifndef IN_STG_CODE
21
#define IN_STG_CODE 0
22 23 24
#endif
#include "Stg.h"

Simon Marlow's avatar
Simon Marlow committed
25 26
#include "HsFFI.h"
#include "RtsAPI.h"
27

28 29 30 31 32 33
// Turn off inlining when debugging - it obfuscates things
#ifdef DEBUG
# undef  STATIC_INLINE
# define STATIC_INLINE static
#endif

Simon Marlow's avatar
Simon Marlow committed
34
#include "rts/Types.h"
35 36 37 38 39 40 41 42 43 44

#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

45 46 47 48 49 50
#if __GNUC__ >= 3
#define ATTRIBUTE_ALIGNED(n) __attribute__((aligned(n)))
#else
#define ATTRIBUTE_ALIGNED(n) /*nothing*/
#endif

51
/* Fix for mingw stat problem (done here so it's early enough) */
52
#ifdef mingw32_HOST_OS
53 54 55
#define __MSVCRT__ 1
#endif

56 57
/* Needed to get the macro version of errno on some OSs, and also to
   get prototypes for the _r versions of C library functions. */
58
#ifndef _REENTRANT
59
#define _REENTRANT 1
60
#endif
61

62 63 64 65
/*
 * We often want to know the size of something in units of an
 * StgWord... (rounded up, of course!)
 */
66 67 68
#define ROUNDUP_BYTES_TO_WDS(n) (((n) + sizeof(W_) - 1) / sizeof(W_))

#define sizeofW(t) ROUNDUP_BYTES_TO_WDS(sizeof(t))
69 70 71 72

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

73 74 75
   CHECK(p)   evaluates p and terminates with an error if p is false
   ASSERT(p)  like CHECK(p) if DEBUG is on, otherwise a no-op
   -------------------------------------------------------------------------- */
76

Simon Marlow's avatar
Simon Marlow committed
77 78
void _assertFail(const char *filename, unsigned int linenum)
   GNUC3_ATTRIBUTE(__noreturn__);
79

80
#define CHECK(predicate)			\
81 82 83
	if (predicate)				\
	    /*null*/;				\
	else					\
84
	    _assertFail(__FILE__, __LINE__)
85 86 87 88 89

#ifndef DEBUG
#define ASSERT(predicate) /* nothing */
#else
#define ASSERT(predicate) CHECK(predicate)
90 91 92 93 94 95 96 97 98 99
#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)

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
#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

Simon Marlow's avatar
Simon Marlow committed
116 117 118 119 120 121 122 123 124 125 126
/*
 * Getting printf formats right for platform-dependent typedefs
 */
#if SIZEOF_LONG == 8
#define FMT_Word64 "lu"
#define FMT_Int64  "ld"
#else
#define FMT_Word64 "llu"
#define FMT_Int64  "lld"
#endif

127 128 129 130 131 132 133 134 135 136 137
/* -----------------------------------------------------------------------------
   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>

Simon Marlow's avatar
Simon Marlow committed
138 139
#include "rts/Config.h"

140
/* Global constaints */
Simon Marlow's avatar
Simon Marlow committed
141
#include "rts/Constants.h"
142 143

/* Profiling information */
Simon Marlow's avatar
Simon Marlow committed
144 145
#include "rts/prof/CCS.h"
#include "rts/prof/LDV.h"
146 147

/* Parallel information */
Simon Marlow's avatar
Simon Marlow committed
148 149
#include "rts/OSThreads.h"
#include "rts/SpinLock.h"
150

Simon Marlow's avatar
Simon Marlow committed
151
#include "rts/Messages.h"
152

Simon Marlow's avatar
Simon Marlow committed
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
/* Storage format definitions */
#include "rts/storage/FunTypes.h"
#include "rts/storage/InfoTables.h"
#include "rts/storage/Closures.h"
#include "rts/storage/Liveness.h"
#include "rts/storage/ClosureTypes.h"
#include "rts/storage/TSO.h"
#include "stg/MiscClosures.h" /* InfoTables, closures etc. defined in the RTS */
#include "rts/storage/SMPClosureOps.h"
#include "rts/storage/Block.h"
#include "rts/storage/ClosureMacros.h"
#include "rts/storage/MBlock.h"
#include "rts/storage/GC.h"

/* Other RTS external APIs */
#include "rts/Parallel.h"
#include "rts/Hooks.h"
#include "rts/Signals.h"
#include "rts/Hpc.h"
#include "rts/Flags.h"
#include "rts/Adjustor.h"
#include "rts/FileLock.h"
#include "rts/Globals.h"
#include "rts/IOManager.h"
#include "rts/Linker.h"
#include "rts/Threads.h"
179
#include "rts/Ticky.h"
Simon Marlow's avatar
Simon Marlow committed
180 181
#include "rts/Timer.h"
#include "rts/Stable.h"
182
#include "rts/TTY.h"
183 184 185 186 187 188

/* 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;

Simon Marlow's avatar
Simon Marlow committed
189
void stackOverflow(void);
190

Simon Marlow's avatar
Simon Marlow committed
191
void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
192

Simon Marlow's avatar
Simon Marlow committed
193 194 195
#ifndef mingw32_HOST_OS
int stg_sig_install (int, int, void *);
#endif
196

197
/* -----------------------------------------------------------------------------
198
   RTS Exit codes
199 200
   -------------------------------------------------------------------------- */

201 202 203 204 205 206 207 208 209 210 211
/* 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
   -------------------------------------------------------------------------- */

212 213 214
/* declarations for runtime flags/values */
#define MAX_RTS_ARGS 32

Simon Marlow's avatar
Simon Marlow committed
215 216 217 218 219 220 221 222 223 224 225 226
#ifdef DEBUG
#define TICK_VAR(arity) \
  extern StgInt SLOW_CALLS_##arity; \
  extern StgInt RIGHT_ARITY_##arity; \
  extern StgInt TAGGED_PTR_##arity;

extern StgInt TOTAL_CALLS;

TICK_VAR(1)
TICK_VAR(2)
#endif

227
/* -----------------------------------------------------------------------------
228
   Assertions and Debuggery
229 230
   -------------------------------------------------------------------------- */

231
#define IF_RTSFLAGS(c,s)  if (RtsFlags.c) { s; }
232

233
#ifdef DEBUG
234 235 236
#if IN_STG_CODE
#define IF_DEBUG(c,s)  if (RtsFlags[0].DebugFlags.c) { s; }
#else
237
#define IF_DEBUG(c,s)  if (RtsFlags.DebugFlags.c) { s; }
238
#endif
239
#else
240
#define IF_DEBUG(c,s)  doNothing()
241 242
#endif

243 244 245 246 247 248
#ifdef DEBUG
#define DEBUG_ONLY(s) s
#else
#define DEBUG_ONLY(s) doNothing()
#endif

249
/* -----------------------------------------------------------------------------
250
   Useful macros and inline functions
251 252
   -------------------------------------------------------------------------- */

sof's avatar
sof committed
253 254 255 256 257
#if defined(__GNUC__)
#define SUPPORTS_TYPEOF
#endif

#if defined(SUPPORTS_TYPEOF)
258 259
#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
260 261 262 263
#else
#define stg_min(a,b) ((a) <= (b) ? (a) : (b))
#define stg_max(a,b) ((a) <= (b) ? (b) : (a))
#endif
264

265 266 267 268 269 270
/* -------------------------------------------------------------------------- */

#ifdef __cplusplus
}
#endif

271
#endif /* RTS_H */