Hannes Siebenhandl pushed to branch wip/fendor/ann-frame at Glasgow Haskell Compiler / GHC

Commits:

4 changed files:

Changes:

  • libraries/ghc-experimental/ghc-experimental.cabal.in
    ... ... @@ -36,6 +36,7 @@ library
    36 36
           GHC.TypeLits.Experimental
    
    37 37
           GHC.TypeNats.Experimental
    
    38 38
           GHC.RTS.Flags.Experimental
    
    39
    +      GHC.Stack.Annotation.Experimental
    
    39 40
           GHC.Stats.Experimental
    
    40 41
           Prelude.Experimental
    
    41 42
         if arch(wasm32)
    

  • libraries/ghc-experimental/src/GHC/Stack/Annotation/Experimental.hs
    1
    +{-# LANGUAGE GADTs #-}
    
    2
    +{-# LANGUAGE ScopedTypeVariables #-}
    
    3
    +{-# LANGUAGE MagicHash #-}
    
    4
    +{-# LANGUAGE ImplicitParams #-}
    
    5
    +module GHC.Stack.Annotation.Experimental where
    
    6
    +
    
    7
    +import Data.Typeable
    
    8
    +import GHC.Exts
    
    9
    +import GHC.Internal.Stack.Types
    
    10
    +
    
    11
    +data StackAnnotation where
    
    12
    +  StackAnnotation :: forall a. (Typeable a, Show a) => a -> StackAnnotation
    
    13
    +
    
    14
    +class IsStackAnnotation a where
    
    15
    +  display :: a -> String
    
    16
    +
    
    17
    +newtype SrcLocAnno = MkSrcLocAnno SrcLoc
    
    18
    +
    
    19
    +instance Show SrcLocAnno where
    
    20
    +  show (MkSrcLocAnno l) =
    
    21
    +    concat
    
    22
    +      [ srcLocPackage l
    
    23
    +      , ":"
    
    24
    +      , srcLocModule l
    
    25
    +      , " "
    
    26
    +      , srcLocFile l
    
    27
    +      , ":"
    
    28
    +      , show $ srcLocStartLine l
    
    29
    +      , "-"
    
    30
    +      , show $ srcLocStartCol l
    
    31
    +      , ":"
    
    32
    +      , show $ srcLocEndLine l
    
    33
    +      , "-"
    
    34
    +      , show $ srcLocEndCol l
    
    35
    +      ]
    
    36
    +
    
    37
    +annotateStackWith :: forall a b. (Typeable a, Show a) => a -> b -> b
    
    38
    +annotateStackWith ann =
    
    39
    +  annotateStack# (StackAnnotation ann)
    
    40
    +
    
    41
    +annotateCallStack :: HasCallStack => a -> a
    
    42
    +annotateCallStack =
    
    43
    +  let
    
    44
    +    cs = getCallStack ?callStack
    
    45
    +  in case cs of
    
    46
    +    [] -> id
    
    47
    +    ((_, srcLoc):_) -> annotateStackWith (MkSrcLocAnno srcLoc)

  • libraries/ghc-heap/tests/ann_frame.hs
    ... ... @@ -20,17 +20,36 @@ annotateStack ann =
    20 20
       annotateStack# (StackAnnotation ann)
    
    21 21
     
    
    22 22
     hello :: Int -> Int -> Int
    
    23
    -hello x y = annotateStack (x,y) $ unsafePerformIO $ do
    
    23
    +hello x y = annotateStack (x,y) $
    
    24
    +  decodeAndPrintAnnotationFrames $
    
    25
    +    x + y + 42
    
    26
    +{-# OPAQUE hello #-}
    
    27
    +
    
    28
    +{-# NOINLINE decodeAndPrintAnnotationFrames #-}
    
    29
    +decodeAndPrintAnnotationFrames :: a -> a
    
    30
    +decodeAndPrintAnnotationFrames a = unsafePerformIO $ do
    
    24 31
       stack <- GHC.Stack.CloneStack.cloneMyStack
    
    25 32
       decoded <- GHC.Exts.Stack.Decode.decodeStack stack
    
    26
    -  print [ show x
    
    33
    +  print [ show a
    
    27 34
             | Closures.AnnFrame _ (Box ann) <- Closures.ssc_stack decoded
    
    28
    -        , StackAnnotation x <- pure $ unsafeCoerce ann
    
    35
    +        , StackAnnotation a <- pure $ unsafeCoerce ann
    
    29 36
             ]
    
    30
    -  return $ x + y + 42
    
    31
    -{-# OPAQUE hello #-}
    
    37
    +  pure a
    
    32 38
     
    
    33 39
     main :: IO ()
    
    34
    -main =
    
    40
    +main = do
    
    35 41
       print $ hello 2 3
    
    42
    +  print $ tailCallEx 4 5
    
    43
    +
    
    44
    +{-# INLINE tailCallEx #-}
    
    45
    +tailCallEx :: Int -> Int -> Int
    
    46
    +tailCallEx a b = annotateStack "tailCallEx" $ foo a b
    
    47
    +
    
    48
    +{-# INLINE foo #-}
    
    49
    +foo :: Int -> Int -> Int
    
    50
    +foo a b = annotateStack "foo" $ bar $ a * b
    
    51
    +
    
    52
    +bar c = annotateStack "bar" $
    
    53
    +  decodeAndPrintAnnotationFrames $
    
    54
    +    c + c
    
    36 55
     

  • libraries/ghc-heap/tests/ann_frame.stdout
    1
    +["(2,3)"]
    
    2
    +47