content: {-# LANGUAGE Trustworthy #-}
  {-# LANGUAGE UnboxedTuples #-}
  {-# LANGUAGE MagicHash #-}
  {-# LANGUAGE NoImplicitPrelude #-}
  {-# LANGUAGE TypeApplications #-}
  
  -----------------------------------------------------------------------------
  -- |
  -- Module      :  GHC.Internal.InfoProv
  -- Copyright   :  (c) The University of Glasgow 2011
  -- License     :  see libraries/base/LICENSE
  --
  -- Maintainer  :  ghc-devs@haskell.org
  -- Stability   :  internal
  -- Portability :  non-portable (GHC Extensions)
  --
  -- Access to GHC's info-table provenance metadata.
  --
  -- /The API of this module is unstable and not meant to be consumed by the general public./
  -- If you absolutely must depend on it, make sure to use a tight upper
  -- bound, e.g., @base < 4.X@ rather than @base < 5@, because the interface can
  -- change rapidly without much warning.
  --
  -- @since base-4.18.0.0
  -----------------------------------------------------------------------------
  
  module GHC.Internal.InfoProv
      ( InfoProv(..)
      , ipLoc
      , whereFrom
        -- * Internals
      , InfoProvEnt
      , ipeProv
      , peekInfoProv
      ) where
  
  import GHC.Internal.Base
  import GHC.Internal.InfoProv.Types
  
  -- | Get information about where a value originated from.
  -- This information is stored statically in a binary when @-finfo-table-map@ is
  -- enabled.  The source positions will be greatly improved by also enabled debug
  -- information with @-g3@. Finally you can enable @-fdistinct-constructor-tables@ to
  -- get more precise information about data constructor allocations.
  --
  -- The information is collect by looking at the info table address of a specific closure and
  -- then consulting a specially generated map (by @-finfo-table-map@) to find out where we think
  -- the best source position to describe that info table arose from.
  --
  -- @since base-4.16.0.0
  whereFrom :: a -> IO (Maybe InfoProv)
  whereFrom obj = getIPE obj Nothing $ \p ->
      Just `fmap` peekInfoProv (ipeProv p)
  