X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=includes%2FRts.h;h=3a6c6f20b99988bffd460d86bd1717c77f9bc56e;hp=59edc09e83ab5b8df996b45621f5db0f8090bc23;hb=febf1ced754a3996ac1a5877dcded87828560d1c;hpb=5ddee764beb312933256096d03df7c3ec47ac452 diff --git a/includes/Rts.h b/includes/Rts.h index 59edc09..3a6c6f2 100644 --- a/includes/Rts.h +++ b/includes/Rts.h @@ -1,8 +1,12 @@ /* ----------------------------------------------------------------------------- * - * (c) The GHC Team, 1998-2004 + * (c) The GHC Team, 1998-2009 * - * Top-level include file for the RTS itself + * RTS external APIs. This file declares everything that the GHC RTS + * exposes externally. + * + * To understand the structure of the RTS headers, see the wiki: + * http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes * * ---------------------------------------------------------------------------*/ @@ -18,13 +22,16 @@ extern "C" { #endif #include "Stg.h" +#include "HsFFI.h" +#include "RtsAPI.h" + // Turn off inlining when debugging - it obfuscates things #ifdef DEBUG # undef STATIC_INLINE # define STATIC_INLINE static #endif -#include "RtsTypes.h" +#include "rts/Types.h" #if __GNUC__ >= 3 /* Assume that a flexible array member at the end of a struct @@ -35,6 +42,27 @@ extern "C" { #define FLEXIBLE_ARRAY 0 #endif +#if __GNUC__ >= 3 +#define ATTRIBUTE_ALIGNED(n) __attribute__((aligned(n))) +#else +#define ATTRIBUTE_ALIGNED(n) /*nothing*/ +#endif + +// Symbols that are extern, but private to the RTS, are declared +// with visibility "hidden" to hide them outside the RTS shared +// library. +#if defined(HAS_VISIBILITY_HIDDEN) +#define RTS_PRIVATE GNUC3_ATTRIBUTE(visibility("hidden")) +#else +#define RTS_PRIVATE /* disabled: RTS_PRIVATE */ +#endif + +#if __GNUC__ >= 4 +#define RTS_UNLIKELY(p) __builtin_expect((p),0) +#else +#define RTS_UNLIKELY(p) p +#endif + /* Fix for mingw stat problem (done here so it's early enough) */ #ifdef mingw32_HOST_OS #define __MSVCRT__ 1 @@ -42,34 +70,46 @@ extern "C" { /* Needed to get the macro version of errno on some OSs, and also to get prototypes for the _r versions of C library functions. */ +#ifndef _REENTRANT #define _REENTRANT 1 +#endif /* * 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_)) +#define ROUNDUP_BYTES_TO_WDS(n) (((n) + sizeof(W_) - 1) / sizeof(W_)) -/* - * It's nice to be able to grep for casts - */ -#define stgCast(ty,e) ((ty)(e)) +#define sizeofW(t) ROUNDUP_BYTES_TO_WDS(sizeof(t)) /* ----------------------------------------------------------------------------- Assertions and Debuggery - -------------------------------------------------------------------------- */ -#ifndef DEBUG -#define ASSERT(predicate) /* nothing */ -#else + 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 + -------------------------------------------------------------------------- */ -extern void _assertFail (const char *, unsigned int); +void _assertFail(const char *filename, unsigned int linenum) + GNUC3_ATTRIBUTE(__noreturn__); -#define ASSERT(predicate) \ +#define CHECK(predicate) \ if (predicate) \ /*null*/; \ else \ _assertFail(__FILE__, __LINE__) + +#define CHECKM(predicate, msg, ...) \ + if (predicate) \ + /*null*/; \ + else \ + barf(msg, ##__VA_ARGS__) + +#ifndef DEBUG +#define ASSERT(predicate) /* nothing */ +#define ASSERTM(predicate,msg,...) /* nothing */ +#else +#define ASSERT(predicate) CHECK(predicate) +#define ASSERTM(predicate,msg,...) CHECKM(predicate,msg,##__VA_ARGS__) #endif /* DEBUG */ /* @@ -103,9 +143,16 @@ extern void _assertFail (const char *, unsigned int); #define FMT_Word64 "lu" #define FMT_Int64 "ld" #else +#if defined(mingw32_HOST_OS) +/* mingw doesn't understand %llu/%lld - it treats them as 32-bit + rather than 64-bit */ +#define FMT_Word64 "I64u" +#define FMT_Int64 "I64d" +#else #define FMT_Word64 "llu" #define FMT_Int64 "lld" #endif +#endif /* ----------------------------------------------------------------------------- Include everything STG-ish @@ -118,72 +165,73 @@ extern void _assertFail (const char *, unsigned int); */ #include +#include "rts/Config.h" + /* Global constaints */ -#include "Constants.h" +#include "rts/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" +#include "rts/prof/CCS.h" +#include "rts/prof/LDV.h" /* Parallel information */ -#include "Parallel.h" -#include "OSThreads.h" -#include "SMP.h" +#include "rts/OSThreads.h" +#include "rts/SpinLock.h" -/* GNU mp library */ -#include "gmp.h" +#include "rts/Messages.h" -/* Macros for STG/C code */ -#include "Block.h" -#include "ClosureMacros.h" - - /* Ticky-ticky counters */ -#include "TickyCounters.h" - -/* Runtime-system hooks */ -#include "Hooks.h" -#include "RtsMessages.h" - -/* for StablePtr/getStablePtr/deRefStablePtr */ -#include "Storage.h" -#include "Stable.h" - -#include "ieee-flpt.h" - -#include "Signals.h" +/* 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/BlockSignals.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" +#include "rts/Ticky.h" +#include "rts/Timer.h" +#include "rts/Stable.h" +#include "rts/TTY.h" +#include "rts/Utils.h" +#include "rts/PrimFloat.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" +#ifdef mingw32_HOST_OS +// We need these two from Haskell too +void getWin32ProgArgv(int *argc, wchar_t **argv[]); +void setWin32ProgArgv(int argc, wchar_t *argv[]); #endif -/* Initialising the whole adjustor thunk machinery. */ -extern void initAdjustor(void); +void stackOverflow(void); -extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); +void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); + +#ifndef mingw32_HOST_OS +int stg_sig_install (int, int, void *); +#endif /* ----------------------------------------------------------------------------- RTS Exit codes @@ -203,18 +251,30 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); /* declarations for runtime flags/values */ #define MAX_RTS_ARGS 32 -/* ----------------------------------------------------------------------------- - Assertions and Debuggery - -------------------------------------------------------------------------- */ +#ifdef DEBUG +#define TICK_VAR(arity) \ + extern StgInt SLOW_CALLS_##arity; \ + extern StgInt RIGHT_ARITY_##arity; \ + extern StgInt TAGGED_PTR_##arity; -#define IF_RTSFLAGS(c,s) if (RtsFlags.c) { s; } +extern StgInt TOTAL_CALLS; + +TICK_VAR(1) +TICK_VAR(2) +#endif /* ----------------------------------------------------------------------------- Assertions and Debuggery -------------------------------------------------------------------------- */ +#define IF_RTSFLAGS(c,s) if (RtsFlags.c) { s; } + #ifdef DEBUG +#if IN_STG_CODE +#define IF_DEBUG(c,s) if (RtsFlags[0].DebugFlags.c) { s; } +#else #define IF_DEBUG(c,s) if (RtsFlags.DebugFlags.c) { s; } +#endif #else #define IF_DEBUG(c,s) doNothing() #endif @@ -225,18 +285,6 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); #define DEBUG_ONLY(s) doNothing() #endif -#if defined(GRAN) && defined(DEBUG) -#define IF_GRAN_DEBUG(c,s) if (RtsFlags.GranFlags.Debug.c) { s; } -#else -#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() -#endif - /* ----------------------------------------------------------------------------- Useful macros and inline functions -------------------------------------------------------------------------- */ @@ -259,29 +307,4 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__); } #endif - -/* krc: I put this here because I don't think - it needs to be visible externally. - It used to be in StgTicky.h, but I got rid - of that. */ - -/* ----------------------------------------------------------------------------- - The StgEntCounter type - needed regardless of TICKY_TICKY - -------------------------------------------------------------------------- */ - -typedef struct _StgEntCounter { - /* krc: StgWord32, not StgWord16, in order to match the code - generator, which doesn't generate anything of that type. */ - StgWord32 registeredp; /* 0 == no, 1 == yes */ - StgWord32 arity; /* arity (static info) */ - StgWord32 stk_args; /* # of args off stack */ - /* (rest of args are in registers) */ - char *str; /* name of the thing */ - char *arg_kinds; /* info about the args types */ - StgInt entry_count; /* Trips to fast entry code */ - StgInt allocs; /* number of allocations by this fun */ - struct _StgEntCounter *link;/* link to chain them all together */ -} StgEntCounter; - - #endif /* RTS_H */