Re-working of the breakpoint support
authorSimon Marlow <simonmar@microsoft.com>
Tue, 17 Apr 2007 14:24:58 +0000 (14:24 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Tue, 17 Apr 2007 14:24:58 +0000 (14:24 +0000)
commitcdce647711c0f46f5799b24de087622cb77e647f
treead89c87c0ac9afba4338346a01eb5492b47f3e20
parentdc8ffcb9797ade3e3a68e6ec0a89fe2e7444e0ef
Re-working of the breakpoint support

This is the result of Bernie Pope's internship work at MSR Cambridge,
with some subsequent improvements by me.  The main plan was to

 (a) Reduce the overhead for breakpoints, so we could enable
     the feature by default without incurrent a significant penalty
 (b) Scatter more breakpoint sites throughout the code

Currently we can set a breakpoint on almost any subexpression, and the
overhead is around 1.5x slower than normal GHCi.  I hope to be able to
get this down further and/or allow breakpoints to be turned off.

This patch also fixes up :print following the recent changes to
constructor info tables.  (most of the :print tests now pass)

We now support single-stepping, which just enables all breakpoints.

  :step <expr>     executes <expr> with single-stepping turned on
  :step            single-steps from the current breakpoint

The mechanism is quite different to the previous implementation.  We
share code with the HPC (haskell program coverage) implementation now.
The coverage pass annotates source code with "tick" locations which
are tracked by the coverage tool.  In GHCi, each "tick" becomes a
potential breakpoint location.

Previously breakpoints were compiled into code that magically invoked
a nested instance of GHCi.  Now, a breakpoint causes the current
thread to block and control is returned to GHCi.

See the wiki page for more details and the current ToDo list:

  http://hackage.haskell.org/trac/ghc/wiki/NewGhciDebugger
47 files changed:
compiler/Makefile
compiler/basicTypes/IdInfo.lhs
compiler/basicTypes/MkId.lhs
compiler/cmm/CmmParse.y
compiler/deSugar/Coverage.lhs
compiler/deSugar/Desugar.lhs
compiler/deSugar/DsBinds.lhs
compiler/deSugar/DsBreakpoint.lhs [deleted file]
compiler/deSugar/DsExpr.lhs
compiler/deSugar/DsGRHSs.lhs
compiler/deSugar/DsMonad.lhs
compiler/deSugar/DsUtils.lhs
compiler/ghci/ByteCodeAsm.lhs
compiler/ghci/ByteCodeGen.lhs
compiler/ghci/ByteCodeInstr.lhs
compiler/ghci/ByteCodeItbls.lhs
compiler/ghci/ByteCodeLink.lhs
compiler/ghci/Debugger.hs
compiler/ghci/Debugger.hs-boot [deleted file]
compiler/ghci/GhciMonad.hs
compiler/ghci/InteractiveUI.hs
compiler/ghci/Linker.lhs
compiler/ghci/RtClosureInspect.hs
compiler/ghci/TickTree.hs [new file with mode: 0644]
compiler/iface/TcIface.lhs
compiler/main/BreakArray.hs [new file with mode: 0644]
compiler/main/Breakpoints.hs [deleted file]
compiler/main/DynFlags.hs
compiler/main/GHC.hs
compiler/main/HscMain.lhs
compiler/main/HscTypes.lhs
compiler/main/TidyPgm.lhs
compiler/package.conf.in
compiler/prelude/primops.txt.pp
compiler/typecheck/TcRnDriver.lhs
compiler/typecheck/TcRnDriver.lhs-boot
compiler/typecheck/TcSplice.lhs
includes/Bytecodes.h
includes/Constants.h
includes/StgMiscClosures.h
mk/config.mk.in
rts/Disassembler.c
rts/Interpreter.c
rts/Linker.c
rts/PrimOps.cmm
rts/Printer.c
rts/Printer.h