liquidhaskell-0.8.0.2: Liquid Types for Haskell

Safe HaskellNone
LanguageHaskell98

Language.Haskell.Liquid.Desugar.StaticPtrTable

Description

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);

}

Synopsis

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.