[commit: ghc] master: Change the way module initialisation is done (#3252, #4417) (a52ff76)

Simon Marlow marlowsd at gmail.com
Tue Apr 12 17:24:27 CEST 2011


Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/a52ff7619e8b7d74a9d933d922eeea49f580bca8

>---------------------------------------------------------------

commit a52ff7619e8b7d74a9d933d922eeea49f580bca8
Author: Simon Marlow <marlowsd at gmail.com>
Date:   Tue Apr 12 13:49:09 2011 +0100

    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.

 aclocal.m4                      |   25 +++++
 compiler/cmm/CLabel.hs          |   71 +------------
 compiler/cmm/PprC.hs            |   13 ++-
 compiler/codeGen/CgHpc.hs       |   49 +---------
 compiler/codeGen/CgProf.hs      |   53 +----------
 compiler/codeGen/CodeGen.lhs    |  166 ++++---------------------------
 compiler/codeGen/StgCmm.hs      |  115 ++++-----------------
 compiler/codeGen/StgCmmHpc.hs   |   41 +-------
 compiler/codeGen/StgCmmProf.hs  |   58 +----------
 compiler/deSugar/Coverage.lhs   |   57 ++++++++++-
 compiler/deSugar/Desugar.lhs    |    6 +-
 compiler/ghc.cabal.in           |    1 +
 compiler/ghc.mk                 |    2 +
 compiler/main/DriverPipeline.hs |   38 ++++++-
 compiler/main/GHC.hs            |    8 +-
 compiler/main/HscMain.lhs       |   19 ++--
 compiler/main/HscTypes.lhs      |   12 +-
 compiler/main/TidyPgm.lhs       |   14 +--
 compiler/profiling/ProfInit.hs  |   45 ++++++++
 configure.ac                    |    1 +
 docs/users_guide/ffi-chap.xml   |   35 +------
 docs/users_guide/packages.xml   |    1 -
 docs/users_guide/win32-dlls.xml |    5 -
 includes/rts/Hpc.h              |   12 +-
 mk/config.mk.in                 |    4 +
 rts/Hpc.c                       |  212 +++++++++++++++++++++++----------------
 rts/Main.c                      |    8 +--
 rts/ProfHeap.c                  |    2 +-
 rts/Profiling.c                 |   68 +++++--------
 rts/Profiling.h                 |    2 +-
 rts/RtsMain.c                   |   16 +--
 rts/RtsMain.h                   |    2 +-
 rts/RtsStartup.c                |   85 +++-------------
 33 files changed, 448 insertions(+), 798 deletions(-)


Diff suppressed because of size. To see it, use:

    git show a52ff7619e8b7d74a9d933d922eeea49f580bca8



More information about the Cvs-ghc mailing list