summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Tennie <sven.tennie@gmail.com>2023-04-15 15:07:44 +0000
committerSven Tennie <sven.tennie@gmail.com>2023-05-05 19:59:53 +0000
commit3557c62ff4c9fca91b46fb5ea020db8fbe228de4 (patch)
tree609d852b2ee8091d5fcac48aaac430c2778b254e
parent87c1f82f6cba4122b08a40188425ce0796d260e2 (diff)
downloadhaskell-3557c62ff4c9fca91b46fb5ea020db8fbe228de4.tar.gz
Formatting
-rw-r--r--libraries/ghc-heap/GHC/Exts/Stack/Decode.hs56
1 files changed, 34 insertions, 22 deletions
diff --git a/libraries/ghc-heap/GHC/Exts/Stack/Decode.hs b/libraries/ghc-heap/GHC/Exts/Stack/Decode.hs
index a7df08cc91..05380527d5 100644
--- a/libraries/ghc-heap/GHC/Exts/Stack/Decode.hs
+++ b/libraries/ghc-heap/GHC/Exts/Stack/Decode.hs
@@ -23,10 +23,16 @@ import Data.Bits
import Data.Maybe
import Foreign
import GHC.Exts
+import GHC.Exts.Heap (Box (..), getBoxedClosureData)
import GHC.Exts.Heap.ClosureTypes
-import GHC.Exts.Heap.Closures (RetFunType(..), Closure, GenClosure(UnknownTypeWordSizedPrimitive), StackFrame(..), StgStackClosure(..))
+import GHC.Exts.Heap.Closures
+ ( Closure,
+ GenClosure (UnknownTypeWordSizedPrimitive),
+ RetFunType (..),
+ StackFrame (..),
+ StgStackClosure (..),
+ )
import GHC.Exts.Heap.Constants (wORD_SIZE_IN_BITS)
-import GHC.Exts.Heap (Box(..), getBoxedClosureData)
import GHC.Exts.Heap.InfoTable
import GHC.Exts.Stack.Constants
import GHC.IO (IO (..))
@@ -205,7 +211,7 @@ advanceStackFrameIter :: StackSnapshot -> WordOffset -> Maybe (StackSnapshot, Wo
advanceStackFrameIter (StackSnapshot stackSnapshot#) index =
let !(# s', i', hasNext #) = advanceStackFrameIter# stackSnapshot# (wordOffsetToWord# index)
in if I# hasNext > 0
- then Just $ (StackSnapshot s', (primWordToWordOffset i'))
+ then Just (StackSnapshot s', primWordToWordOffset i')
else Nothing
where
primWordToWordOffset :: Word# -> WordOffset
@@ -223,42 +229,45 @@ getClosure stackSnapshot# index =
)
>>= getBoxedClosureData
+-- | Representation of @StgLargeBitmap@ (RTS)
data LargeBitmap = LargeBitmap
- { largeBitmapSize :: Word
- , largebitmapWords :: Ptr Word
- }
+ { largeBitmapSize :: Word,
+ largebitmapWords :: Ptr Word
+ }
-- | Is a bitmap entry a closure pointer or a primitive non-pointer?
data Pointerness = Pointer | NonPointer
- deriving Show
+ deriving (Show)
decodeLargeBitmap :: LargeBitmapGetter -> StackSnapshot# -> WordOffset -> WordOffset -> IO [Closure]
decodeLargeBitmap getterFun# stackSnapshot# index relativePayloadOffset = do
largeBitmap <- IO $ \s ->
case getterFun# stackSnapshot# (wordOffsetToWord# index) s of
(# s1, wordsAddr#, size# #) -> (# s1, LargeBitmap (W# size#) (Ptr wordsAddr#) #)
- bitmapWords <-largeBitmapToList largeBitmap
- decodeBitmaps stackSnapshot#
+ bitmapWords <- largeBitmapToList largeBitmap
+ decodeBitmaps
+ stackSnapshot#
(index + relativePayloadOffset)
(bitmapWordsPointerness (largeBitmapSize largeBitmap) bitmapWords)
where
largeBitmapToList :: LargeBitmap -> IO [Word]
- largeBitmapToList LargeBitmap {..} = cWordArrayToList largebitmapWords $
- (usedBitmapWords.fromIntegral) largeBitmapSize
+ largeBitmapToList LargeBitmap {..} =
+ cWordArrayToList largebitmapWords $
+ (usedBitmapWords . fromIntegral) largeBitmapSize
cWordArrayToList :: Ptr Word -> Int -> IO [Word]
- cWordArrayToList ptr size = mapM (peekElemOff ptr) [0..(size-1)]
+ cWordArrayToList ptr size = mapM (peekElemOff ptr) [0 .. (size - 1)]
usedBitmapWords :: Int -> Int
usedBitmapWords 0 = error "Invalid large bitmap size 0."
- usedBitmapWords size = (size `div` (fromIntegral wORD_SIZE_IN_BITS)) + 1
+ usedBitmapWords size = (size `div` fromIntegral wORD_SIZE_IN_BITS) + 1
bitmapWordsPointerness :: Word -> [Word] -> [Pointerness]
bitmapWordsPointerness size _ | size <= 0 = []
bitmapWordsPointerness _ [] = []
- bitmapWordsPointerness size (w:wds) =
- bitmapWordPointerness (min size (fromIntegral wORD_SIZE_IN_BITS)) w ++
- bitmapWordsPointerness (size - (fromIntegral wORD_SIZE_IN_BITS)) wds
+ bitmapWordsPointerness size (w : wds) =
+ bitmapWordPointerness (min size (fromIntegral wORD_SIZE_IN_BITS)) w
+ ++ bitmapWordsPointerness (size - fromIntegral wORD_SIZE_IN_BITS) wds
bitmapWordPointerness :: Word -> Word -> [Pointerness]
bitmapWordPointerness 0 _ = []
@@ -273,14 +282,14 @@ bitmapWordPointerness bSize bitmapWord =
decodeBitmaps :: StackSnapshot# -> WordOffset -> [Pointerness] -> IO [Closure]
decodeBitmaps stack# index ps =
- zipWithM toPayload ps [index..]
+ zipWithM toPayload ps [index ..]
where
toPayload :: Pointerness -> WordOffset -> IO Closure
toPayload p i = case p of
- NonPointer -> do
- w <- getWord stack# i
- pure $ UnknownTypeWordSizedPrimitive w
- Pointer -> getClosure stack# i
+ NonPointer -> do
+ w <- getWord stack# i
+ pure $ UnknownTypeWordSizedPrimitive w
+ Pointer -> getClosure stack# i
decodeSmallBitmap :: SmallBitmapGetter -> StackSnapshot# -> WordOffset -> WordOffset -> IO [Closure]
decodeSmallBitmap getterFun# stackSnapshot# index relativePayloadOffset =
@@ -288,7 +297,10 @@ decodeSmallBitmap getterFun# stackSnapshot# index relativePayloadOffset =
(bitmap, size) <- IO $ \s ->
case getterFun# stackSnapshot# (wordOffsetToWord# index) s of
(# s1, b#, s# #) -> (# s1, (W# b#, W# s#) #)
- decodeBitmaps stackSnapshot# (index + relativePayloadOffset) (bitmapWordPointerness size bitmap)
+ decodeBitmaps
+ stackSnapshot#
+ (index + relativePayloadOffset)
+ (bitmapWordPointerness size bitmap)
unpackStackFrame :: StackFrameLocation -> IO StackFrame
unpackStackFrame (StackSnapshot stackSnapshot#, index) = do