{-# LINE 1 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
module GHC.Internal.Heap.InfoTable
    ( module GHC.Internal.Heap.InfoTable.Types
    , itblSize
    , peekItbl
    , pokeItbl
    ) where



import GHC.Internal.Base
import GHC.Internal.Real
import GHC.Internal.Enum

import GHC.Internal.Heap.InfoTable.Types

{-# LINE 16 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
import GHC.Internal.Heap.Constants
import GHC.Internal.Data.Functor ((<$>))
import GHC.Internal.Data.Maybe
import GHC.Internal.Num (negate)

{-# LINE 24 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
import GHC.Internal.Foreign.Ptr
import GHC.Internal.Foreign.Storable

-------------------------------------------------------------------------
-- Profiling specific code
--
-- The functions that follow all rely on PROFILING. They are duplicated in
-- ghc-heap/GHC/Exts/Heap/InfoTableProf.hsc where PROFILING is defined. This
-- allows hsc2hs to generate values for both profiling and non-profiling builds.

-- | Read an InfoTable from the heap into a haskell type.
-- WARNING: This code assumes it is passed a pointer to a "standard" info
-- table. If tables_next_to_code is disabled, it will look 1 word before the
-- start for the entry field.
peekItbl :: Ptr StgInfoTable -> IO StgInfoTable
peekItbl :: Ptr StgInfoTable -> IO StgInfoTable
peekItbl Ptr StgInfoTable
a0 = do

{-# LINE 41 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  let ptr = a0 `plusPtr` (negate wORD_SIZE)
  entry' <- Just <$> ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 43 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}

{-# LINE 47 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  ptrs'   <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 48 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  nptrs'  <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) ptr
{-# LINE 49 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  tipe'   <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 50 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  srtlen' <- ((\hsc_ptr -> peekByteOff hsc_ptr 20)) a0
{-# LINE 51 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  return StgInfoTable
    { entry  = entry'
    , ptrs   = ptrs'
    , nptrs  = nptrs'
    , tipe   = toEnum (fromIntegral (tipe' :: HalfWord))
    , srtlen = srtlen'
    , code   = Nothing
    }

pokeItbl :: Ptr StgInfoTable -> StgInfoTable -> IO ()
pokeItbl :: Ptr StgInfoTable -> StgInfoTable -> IO ()
pokeItbl Ptr StgInfoTable
a0 StgInfoTable
itbl = do

{-# LINE 63 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) a0 (fromJust (entry itbl))
{-# LINE 64 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}

{-# LINE 65 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) a0 (ptrs itbl)
{-# LINE 66 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  ((\hsc_ptr -> pokeByteOff hsc_ptr 12)) a0 (nptrs itbl)
{-# LINE 67 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) a0 (toHalfWord (fromEnum (tipe itbl)))
{-# LINE 68 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  ((\hsc_ptr -> pokeByteOff hsc_ptr 20)) a0 (srtlen itbl)
{-# LINE 69 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}

{-# LINE 76 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}
  where
    toHalfWord :: Int -> HalfWord
    toHalfWord :: Int -> HalfWord
toHalfWord Int
i = Int -> HalfWord
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i

-- | Size in bytes of a standard InfoTable
itblSize :: Int
itblSize :: Int
itblSize = ((Int
24))
{-# LINE 83 "libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc" #-}