ghc-8.10.6: The GHC API
Safe HaskellNone



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_r2wb_closure;
  hs_spt_insert(k0, &Main_r2wb_closure);

  static StgWord64 k1[2] = {12545634534567898ULL,5409674567544151ULL};
  extern StgPtr Main_r2wc_closure;
  hs_spt_insert(k1, &Main_r2wc_closure);


where the constants are fingerprints produced from the static forms.

The linker must find the definitions matching the extern StgPtr name declarations. For this to work, the identifiers of static pointers need to be exported. This is done in SetLevels.newLvlVar.

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

  static StgWord64 k1[2] = {12545634534567898ULL,5409674567544151ULL};



sptCreateStaticBinds :: HscEnv -> Module -> CoreProgram -> IO ([SptEntry], CoreProgram) Source #

Replaces all bindings of the form

b = /\ ... -> makeStatic location value


b = /\ ... ->
  StaticPtr key (StaticPtrInfo "pkg key" "module" location) value

where a distinct key is generated for each binding.

It also yields the C stub that inserts these bindings into the static pointer table.

sptModuleInitCode :: Module -> [SptEntry] -> SDoc Source #

sptModuleInitCode module fps is a C stub to insert the static entries of module into the static pointer table.

fps is a list associating each binding corresponding to a static entry with its fingerprint.