Safe Haskell | None |
---|---|
Language | Haskell98 |
Code generation for the Static Pointer Table
(c) 2014 I/O Tweag
Each module that uses static
keyword declares an initialization function of
the form hs_spt_init_module() which is emitted into the _stub.c file and
annotated with attribute((constructor)) so that it gets executed at
startup time.
The function's purpose is to call hs_spt_insert to insert the static pointers of this module in the hashtable of the RTS, and it looks something like this:
static void hs_hpc_init_Main(void) __attribute__((constructor)); static void hs_hpc_init_Main(void) { static StgWord64 k0[2] = {16252233372134256ULL,7370534374096082ULL}; extern StgPtr Main_sptEntryZC0_closure; hs_spt_insert(k0, &Main_sptEntryZC0_closure); static StgWord64 k1[2] = {12545634534567898ULL,5409674567544151ULL}; extern StgPtr Main_sptEntryZC1_closure; hs_spt_insert(k1, &Main_sptEntryZC1_closure); }
where the constants are fingerprints produced from the static forms.
There is also a finalization function for the time when the module is unloaded.
static void hs_hpc_fini_Main(void) __attribute__((destructor)); static void hs_hpc_fini_Main(void) { static StgWord64 k0[2] = {16252233372134256ULL,7370534374096082ULL}; hs_spt_remove(k0); static StgWord64 k1[2] = {12545634534567898ULL,5409674567544151ULL}; hs_spt_remove(k1); }
- sptInitCode :: Module -> [(Fingerprint, (Id, CoreExpr))] -> SDoc
Documentation
sptInitCode :: Module -> [(Fingerprint, (Id, CoreExpr))] -> SDoc Source #
sptInitCode module statics
is a C stub to insert the static entries
statics
of module
into the static pointer table.
Each entry contains the fingerprint used to locate the entry and the top-level binding for the entry.