summaryrefslogtreecommitdiff
path: root/libraries/ghci/GHCi/ResolvedBCO.hs
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2016-01-07 11:36:41 +0000
committerSimon Marlow <marlowsd@gmail.com>2016-01-08 08:49:26 +0000
commit6be09e884730f19da6c24fc565980f515300e53c (patch)
treeb7e0e13c4b4acd138d4da91013562cd5637db865 /libraries/ghci/GHCi/ResolvedBCO.hs
parentc78fedde7055490ca6f6210ada797190f3c35d87 (diff)
downloadhaskell-6be09e884730f19da6c24fc565980f515300e53c.tar.gz
Enable stack traces with ghci -fexternal-interpreter -prof
Summary: The main goal here is enable stack traces in GHCi. After this change, if you start GHCi like this: ghci -fexternal-interpreter -prof (which requires packages to be built for profiling, but not GHC itself) then the interpreter manages cost-centre stacks during execution and can produce a stack trace on request. Call locations are available for all interpreted code, and any compiled code that was built with the `-fprof-auto` familiy of flags. There are a couple of ways to get a stack trace: * `error`/`undefined` automatically get one attached * `Debug.Trace.traceStack` can be used anywhere, and prints the current stack Because the interpreter is running in a separate process, only the interpreted code is running in profiled mode and the compiler itself isn't slowed down by profiling. The GHCi debugger still doesn't work with -fexternal-interpreter, although this patch gets it a step closer. Most of the functionality of breakpoints is implemented, but the runtime value introspection is still not supported. Along the way I also did some refactoring and added type arguments to the various remote pointer types in `GHCi.RemotePtr`, so there's better type safety and documentation in the bridge code between GHC and ghc-iserv. Test Plan: validate Reviewers: bgamari, ezyang, austin, hvr, goldfire, erikd Subscribers: thomie Differential Revision: https://phabricator.haskell.org/D1747 GHC Trac Issues: #11047, #11100
Diffstat (limited to 'libraries/ghci/GHCi/ResolvedBCO.hs')
-rw-r--r--libraries/ghci/GHCi/ResolvedBCO.hs28
1 files changed, 6 insertions, 22 deletions
diff --git a/libraries/ghci/GHCi/ResolvedBCO.hs b/libraries/ghci/GHCi/ResolvedBCO.hs
index 9234210418..a349dedaba 100644
--- a/libraries/ghci/GHCi/ResolvedBCO.hs
+++ b/libraries/ghci/GHCi/ResolvedBCO.hs
@@ -6,6 +6,7 @@ module GHCi.ResolvedBCO
import SizedSeq
import GHCi.RemoteTypes
+import GHCi.BreakArray
import Data.Array.Unboxed
import Data.Binary
@@ -32,31 +33,14 @@ instance Binary ResolvedBCO
data ResolvedBCOPtr
= ResolvedBCORef Int
-- ^ reference to the Nth BCO in the current set
- | ResolvedBCOPtr HValueRef
+ | ResolvedBCOPtr (RemoteRef HValue)
-- ^ reference to a previously created BCO
- | ResolvedBCOStaticPtr RemotePtr
+ | ResolvedBCOStaticPtr (RemotePtr ())
-- ^ reference to a static ptr
| ResolvedBCOPtrBCO ResolvedBCO
-- ^ a nested BCO
- | ResolvedBCOPtrLocal HValue
- -- ^ something local, cannot be serialized
+ | ResolvedBCOPtrBreakArray (RemoteRef BreakArray)
+ -- ^ Resolves to the MutableArray# inside the BreakArray
deriving (Generic, Show)
--- Manual Binary instance is needed because we cannot serialize
--- ResolvedBCOPtrLocal. This will go away once we have support for
--- remote breakpoints.
-instance Binary ResolvedBCOPtr where
- put (ResolvedBCORef a) = putWord8 0 >> put a
- put (ResolvedBCOPtr a) = putWord8 1 >> put a
- put (ResolvedBCOStaticPtr a) = putWord8 2 >> put a
- put (ResolvedBCOPtrBCO a) = putWord8 3 >> put a
- put (ResolvedBCOPtrLocal _) =
- error "Cannot serialize a local pointer. Use -fno-external-interpreter?"
-
- get = do
- w <- getWord8
- case w of
- 0 -> ResolvedBCORef <$> get
- 1 -> ResolvedBCOPtr <$> get
- 2 -> ResolvedBCOStaticPtr <$> get
- _ -> ResolvedBCOPtrBCO <$> get
+instance Binary ResolvedBCOPtr