[commit: ghc] master: Force re-linking if the options have changed (#4451) (814edf4)

Simon Marlow marlowsd at gmail.com
Fri Apr 8 17:48:55 CEST 2011


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

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/814edf44433801e37318ce79082ac6991dbc87dd

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

commit 814edf44433801e37318ce79082ac6991dbc87dd
Author: Simon Marlow <marlowsd at gmail.com>
Date:   Fri Apr 8 15:54:50 2011 +0100

    Force re-linking if the options have changed (#4451)
    
    A common sequence of commands (at least for me) is this:
    
    $ ghc hello
    1 of 1] Compiling Main             ( hello.hs, hello.o )
    Linking hello ...
    $ ./hello +RTS -s
    hello: Most RTS options are disabled. Link with -rtsopts to enable them.
    $ ghc hello -rtsopts
    $
    
    grr, nothing happened.  I could use -fforce-recomp, but if this was a
    large program I probably don't want to recompile it all again, so:
    
    $ rm hello
    removed `hello'
    $ ghc hello -rtsopts
    Linking hello ...
    $ ./hello +RTS -s
    ./hello +RTS -s
    Hello World!
              51,264 bytes allocated in the heap
               2,904 bytes copied during GC
              43,808 bytes maximum residency (1 sample(s))
              17,632 bytes maximum slop
    etc.
    
    With this patch, GHC notices when the options have changed and forces
    a relink, so you don't need to rm the binary or use -fforce-recomp.
    This is done by adding the pertinent stuff to the binary in a special
    section called ".debug-ghc-link-info":
    
    $ readelf -p .debug-ghc-link-info ./hello
    String dump of section 'ghc-linker-opts':
      [     0]  (["-lHSbase-4.3.1.0","-lHSinteger-gmp-0.2.0.2","-lgmp","-lHSghc-prim-0.2.0.0","-lHSrts","-lm","-lrt","-ldl","-u","ghczmprim_GHCziTypes_Izh_static_info","-u","ghczmprim_GHCziTypes_Czh_static_info","-u","ghczmprim_GHCziTypes_Fzh_static_info","-u","ghczmprim_GHCziTypes_Dzh_static_info","-u","base_GHCziPtr_Ptr_static_info","-u","base_GHCziWord_Wzh_static_info","-u","base_GHCziInt_I8zh_static_info","-u","base_GHCziInt_I16zh_static_info","-u","base_GHCziInt_I32zh_static_info","-u","base_GHCziInt_I64zh_static_info","-u","base_GHCziWord_W8zh_static_info","-u","base_GHCziWord_W16zh_static_info","-u","base_GHCziWord_W32zh_static_info","-u","base_GHCziWord_W64zh_static_info","-u","base_GHCziStable_StablePtr_static_info","-u","ghczmprim_GHCziTypes_Izh_con_info","-u","ghczmprim_GHCziTypes_Czh_con_info","-u","ghczmprim_GHCziTypes_Fzh_con_info","-u","ghczmprim_GHCziTypes_Dzh_con_info","-u","base_GHCziPtr_Ptr_con_info","-u","base_GHCziPtr_FunPtr_con_info","-u","base_GHCziSta!
 ble_StablePtr_con_info","-u","ghczmprim_GHCziTypes_False_closure","-u","ghczmprim_GHCziTypes_True_closure","-u","base_GHCziPack_unpackCString_closure","-u","base_GHCziIOziException_stackOverflow_closure","-u","base_GHCziIOziException_heapOverflow_closure","-u","base_ControlziExceptionziBase_nonTermination_closure","-u","base_GHCziIOziException_blockedIndefinitelyOnMVar_closure","-u","base_GHCziIOziException_blockedIndefinitelyOnSTM_closure","-u","base_ControlziExceptionziBase_nestedAtomically_closure","-u","base_GHCziWeak_runFinalizzerBatch_closure","-u","base_GHCziTopHandler_runIO_closure","-u","base_GHCziTopHandler_runNonIO_closure","-u","base_GHCziConcziIO_ensureIOManagerIsRunning_closure","-u","base_GHCziConcziSync_runSparks_closure","-u","base_GHCziConcziSignal_runHandlers_closure","-lHSffi"],Nothing,RtsOptsAll,False,[],[])
    
    And GHC itself uses the readelf command to extract it when deciding
    whether to relink.  The reason for the name ".debug-ghc-link-info" is
    that sections beginning with ".debug" are removed automatically by
    strip.
    
    This currently only works on Linux; Windows and OS X still have the
    old behaviour.

 compiler/cmm/PprC.hs            |   13 +----
 compiler/main/DriverPipeline.hs |  125 +++++++++++++++++++++++++++++----------
 compiler/main/DynFlags.hs       |    1 +
 compiler/main/SysTools.lhs      |   25 ++++++++
 compiler/utils/Util.lhs         |   26 ++++++++-
 5 files changed, 145 insertions(+), 45 deletions(-)


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

    git show 814edf44433801e37318ce79082ac6991dbc87dd



More information about the Cvs-ghc mailing list