Change the way module initialisation is done (#3252, #4417)
authorSimon Marlow <marlowsd@gmail.com>
Tue, 12 Apr 2011 12:49:09 +0000 (13:49 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 12 Apr 2011 14:48:28 +0000 (15:48 +0100)
commita52ff7619e8b7d74a9d933d922eeea49f580bca8
treee748ba2054b76fe41c600c7cac2b015de3c57248
parent5463b55b7dadc1e9918edb2d8666bf3ed195bc61
Change the way module initialisation is done (#3252, #4417)

Previously the code generator generated small code fragments labelled
with __stginit_M for each module M, and these performed whatever
initialisation was necessary for that module and recursively invoked
the initialisation functions for imported modules.  This appraoch had
drawbacks:

 - FFI users had to call hs_add_root() to ensure the correct
   initialisation routines were called.  This is a non-standard,
   and ugly, API.

 - unless we were using -split-objs, the __stginit dependencies would
   entail linking the whole transitive closure of modules imported,
   whether they were actually used or not.  In an extreme case (#4387,
   #4417), a module from GHC might be imported for use in Template
   Haskell or an annotation, and that would force the whole of GHC to
   be needlessly linked into the final executable.

So now instead we do our initialisation with C functions marked with
__attribute__((constructor)), which are automatically invoked at
program startup time (or DSO load-time).  The C initialisers are
emitted into the stub.c file.  This means that every time we compile
with -prof or -hpc, we now get a stub file, but thanks to #3687 that
is now invisible to the user.

There are some refactorings in the RTS (particularly for HPC) to
handle the fact that initialisers now get run earlier than they did
before.

The __stginit symbols are still generated, and the hs_add_root()
function still exists (but does nothing), for backwards compatibility.
33 files changed:
aclocal.m4
compiler/cmm/CLabel.hs
compiler/cmm/PprC.hs
compiler/codeGen/CgHpc.hs
compiler/codeGen/CgProf.hs
compiler/codeGen/CodeGen.lhs
compiler/codeGen/StgCmm.hs
compiler/codeGen/StgCmmHpc.hs
compiler/codeGen/StgCmmProf.hs
compiler/deSugar/Coverage.lhs
compiler/deSugar/Desugar.lhs
compiler/ghc.cabal.in
compiler/ghc.mk
compiler/main/DriverPipeline.hs
compiler/main/GHC.hs
compiler/main/HscMain.lhs
compiler/main/HscTypes.lhs
compiler/main/TidyPgm.lhs
compiler/profiling/ProfInit.hs [new file with mode: 0644]
configure.ac
docs/users_guide/ffi-chap.xml
docs/users_guide/packages.xml
docs/users_guide/win32-dlls.xml
includes/rts/Hpc.h
mk/config.mk.in
rts/Hpc.c
rts/Main.c
rts/ProfHeap.c
rts/Profiling.c
rts/Profiling.h
rts/RtsMain.c
rts/RtsMain.h
rts/RtsStartup.c