[Git][ghc/ghc][wip/T22077] 2 commits: Refactor IPE initialization

Ben Gamari (@bgamari) gitlab at gitlab.haskell.org
Sat Aug 20 03:21:03 UTC 2022



Ben Gamari pushed to branch wip/T22077 at Glasgow Haskell Compiler / GHC


Commits:
c0d18614 by Ben Gamari at 2022-08-19T23:19:29-04:00
Refactor IPE initialization

Here we refactor the representation of info table provenance information
in object code to significantly reduce its size and link-time impact.
Specifically, we deduplicate strings and represent them as 32-bit
offsets into a common string table.

In addition, we rework the registration logic to eliminate allocation
from the registration path, which is run from a static initializer where
things like allocation are technically undefined behavior (although it
did previously seem to work). For similar reasons we eliminate lock
usage from registration path, instead relying on atomic CAS.

Closes #22077.

- - - - -
ebc644c1 by Ben Gamari at 2022-08-19T23:19:29-04:00
Separate IPE source file from span

The source file name can very often be shared across many IPE entries
whereas the source coordinates are generally unique. Separate the two to
exploit sharing of the former.

- - - - -


23 changed files:

- compiler/GHC/Cmm/CLabel.hs
- compiler/GHC/Cmm/Parser.y
- compiler/GHC/Driver/CodeOutput.hs
- compiler/GHC/Driver/Main.hs
- + compiler/GHC/StgToCmm/InfoTableProv.hs
- compiler/GHC/StgToCmm/Prof.hs
- compiler/ghc.cabal.in
- libraries/base/GHC/InfoProv.hsc
- libraries/base/GHC/Stack/CloneStack.hs
- rts/IPE.c
- rts/IPE.h
- rts/RtsStartup.c
- rts/Trace.c
- rts/eventlog/EventLog.c
- rts/include/rts/IPE.h
- rts/include/stg/SMP.h
- testsuite/tests/rts/all.T
- testsuite/tests/rts/ipeEventLog.c
- testsuite/tests/rts/ipeEventLog.stderr
- testsuite/tests/rts/ipeEventLog_fromMap.c
- testsuite/tests/rts/ipeEventLog_fromMap.stderr
- testsuite/tests/rts/ipeEventLog_lib.c
- + testsuite/tests/rts/ipeEventLog_lib.h


Changes:

=====================================
compiler/GHC/Cmm/CLabel.hs
=====================================
@@ -299,6 +299,7 @@ data ModuleLabelKind
     | MLK_InitializerArray
     | MLK_Finalizer String
     | MLK_FinalizerArray
+    | MLK_IPEBuffer
     deriving (Eq, Ord)
 
 instance Outputable ModuleLabelKind where
@@ -306,6 +307,7 @@ instance Outputable ModuleLabelKind where
     ppr (MLK_Initializer s)  = text ("init__" ++ s)
     ppr MLK_FinalizerArray   = text "fini_arr"
     ppr (MLK_Finalizer s)    = text ("fini__" ++ s)
+    ppr MLK_IPEBuffer        = text "ipe_buf"
 
 isIdLabel :: CLabel -> Bool
 isIdLabel IdLabel{} = True
@@ -830,10 +832,10 @@ instance OutputableP Platform InfoProvEnt where
 -- Constructing Cost Center Labels
 mkCCLabel  :: CostCentre      -> CLabel
 mkCCSLabel :: CostCentreStack -> CLabel
-mkIPELabel :: InfoProvEnt -> CLabel
+mkIPELabel :: Module          -> CLabel
 mkCCLabel           cc          = CC_Label cc
 mkCCSLabel          ccs         = CCS_Label ccs
-mkIPELabel          ipe         = IPE_Label ipe
+mkIPELabel          mod         = ModuleLabel mod MLK_IPEBuffer
 
 mkRtsApFastLabel :: FastString -> CLabel
 mkRtsApFastLabel str = RtsLabel (RtsApFast (NonDetFastString str))
@@ -1011,6 +1013,7 @@ modLabelNeedsCDecl :: ModuleLabelKind -> Bool
 -- Code for finalizers and initializers are emitted in stub objects
 modLabelNeedsCDecl (MLK_Initializer _)  = True
 modLabelNeedsCDecl (MLK_Finalizer   _)  = True
+modLabelNeedsCDecl MLK_IPEBuffer        = True
 -- The finalizer and initializer arrays are emitted in the code of the module
 modLabelNeedsCDecl MLK_InitializerArray = False
 modLabelNeedsCDecl MLK_FinalizerArray   = False
@@ -1208,6 +1211,7 @@ moduleLabelKindType kind =
     MLK_InitializerArray -> DataLabel
     MLK_Finalizer _      -> CodeLabel
     MLK_FinalizerArray   -> DataLabel
+    MLK_IPEBuffer        -> DataLabel
 
 idInfoLabelType :: IdLabelInfo -> CLabelType
 idInfoLabelType info =


=====================================
compiler/GHC/Cmm/Parser.y
=====================================
@@ -224,6 +224,7 @@ import GHC.StgToCmm.Layout     hiding (ArgRep(..))
 import GHC.StgToCmm.Ticky
 import GHC.StgToCmm.Prof
 import GHC.StgToCmm.Bind  ( emitBlackHoleCode, emitUpdateFrame )
+import GHC.StgToCmm.InfoTableProv
 
 import GHC.Cmm.Opt
 import GHC.Cmm.Graph
@@ -1518,9 +1519,8 @@ parseCmmFile cmmpConfig this_mod home_unit filename = do
         let fcode = do
               ((), cmm) <- getCmm $ unEC code "global" (initEnv (pdProfile pdConfig)) [] >> return ()
               -- See Note [Mapping Info Tables to Source Positions] (IPE Maps)
-              let used_info = map (cmmInfoTableToInfoProvEnt this_mod)
-                                              (mapMaybe topInfoTable cmm)
-              ((), cmm2) <- getCmm $ mapM_ emitInfoTableProv used_info
+              let used_info = map (cmmInfoTableToInfoProvEnt this_mod) (mapMaybe topInfoTable cmm)
+              ((), cmm2) <- getCmm $ emitIpeBufferListNode this_mod used_info
               return (cmm ++ cmm2, used_info)
             (cmm, _) = runC (cmmpStgToCmmConfig cmmpConfig) fstate st fcode
             (warnings,errors) = getPsMessages pst


=====================================
compiler/GHC/Driver/CodeOutput.hs
=====================================
@@ -368,24 +368,17 @@ ipInitCode
   :: Bool            -- is Opt_InfoTableMap enabled or not
   -> Platform
   -> Module
-  -> [InfoProvEnt]
   -> CStub
-ipInitCode do_info_table platform this_mod ents
+ipInitCode do_info_table platform this_mod
   | not do_info_table = mempty
-  | otherwise = initializerCStub platform fn_nm decls body
+  | otherwise = initializerCStub platform fn_nm ipe_buffer_decl body
  where
    fn_nm = mkInitializerStubLabel this_mod "ip_init"
-   decls = vcat
-        $  map emit_ipe_decl ents
-        ++ [emit_ipe_list ents]
-   body = text "registerInfoProvList" <> parens local_ipe_list_label <> semi
-   emit_ipe_decl ipe =
-       text "extern InfoProvEnt" <+> ipe_lbl <> text "[];"
-     where ipe_lbl = pprCLabel platform CStyle (mkIPELabel ipe)
-   local_ipe_list_label = text "local_ipe_" <> ppr this_mod
-   emit_ipe_list ipes =
-      text "static InfoProvEnt *" <> local_ipe_list_label <> text "[] ="
-      <+> braces (vcat $ [ pprCLabel platform CStyle (mkIPELabel ipe) <> comma
-                         | ipe <- ipes
-                         ] ++ [text "NULL"])
-      <> semi
+
+   body = text "registerInfoProvList" <> parens (text "&" <> ipe_buffer_label) <> semi
+
+   ipe_buffer_label = pprCLabel platform CStyle (mkIPELabel this_mod)
+
+   ipe_buffer_decl =
+       text "extern IpeBufferListNode" <+> ipe_buffer_label <> text ";"
+


=====================================
compiler/GHC/Driver/Main.hs
=====================================
@@ -1830,7 +1830,7 @@ hscCompileCmmFile hsc_env original_filename filename output_filename = runHsc hs
         mod_name = mkModuleName $ "Cmm$" ++ original_filename
         cmm_mod = mkHomeModule home_unit mod_name
         cmmpConfig = initCmmParserConfig dflags
-    (cmm, ents) <- ioMsgMaybe
+    (cmm, _ents) <- ioMsgMaybe
                $ do
                   (warns,errs,cmm) <- withTiming logger (text "ParseCmm"<+>brackets (text filename)) (\_ -> ())
                                        $ parseCmmFile cmmpConfig cmm_mod home_unit filename
@@ -1857,7 +1857,7 @@ hscCompileCmmFile hsc_env original_filename filename output_filename = runHsc hs
           Just h  -> h           dflags Nothing (Stream.yield cmmgroup)
 
         let foreign_stubs _ =
-              let ip_init   = ipInitCode do_info_table platform cmm_mod ents
+              let ip_init = ipInitCode do_info_table platform cmm_mod
               in NoStubs `appendStubC` ip_init
 
         (_output_filename, (_stub_h_exists, stub_c_exists), _foreign_fps, _caf_infos)


=====================================
compiler/GHC/StgToCmm/InfoTableProv.hs
=====================================
@@ -0,0 +1,143 @@
+module GHC.StgToCmm.InfoTableProv (emitIpeBufferListNode) where
+
+import GHC.Prelude
+import GHC.Platform
+import GHC.Unit.Module
+import GHC.Utils.Outputable
+import GHC.Types.SrcLoc (pprUserRealSpan, srcSpanFile)
+import GHC.Data.FastString (unpackFS)
+
+import GHC.Cmm.CLabel
+import GHC.Cmm.Expr
+import GHC.Cmm.Utils
+import GHC.StgToCmm.Config
+import GHC.StgToCmm.Lit (newByteStringCLit)
+import GHC.StgToCmm.Monad
+import GHC.StgToCmm.Utils
+
+import GHC.Data.ShortText (ShortText)
+import qualified GHC.Data.ShortText as ST
+
+import qualified Data.Map.Strict as M
+import Control.Monad.Trans.State.Strict
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Builder as BSB
+import qualified Data.ByteString.Lazy as BSL
+
+emitIpeBufferListNode :: Module
+                      -> [InfoProvEnt]
+                      -> FCode ()
+emitIpeBufferListNode this_mod ents = do
+    cfg <- getStgToCmmConfig
+    let ctx      = stgToCmmContext  cfg
+        platform = stgToCmmPlatform cfg
+
+    let (cg_ipes, strtab) = flip runState emptyStringTable $ do
+            module_name <- lookupStringTable $ ST.pack $ renderWithContext ctx (ppr this_mod)
+            mapM (toCgIPE platform ctx module_name) ents
+
+    let -- Emit the fields of an IpeBufferEntry struct.
+        toIpeBufferEntry :: CgInfoProvEnt -> [CmmLit]
+        toIpeBufferEntry cg_ipe =
+            [ CmmLabel (ipeInfoTablePtr cg_ipe)
+            , strtab_offset (ipeTableName cg_ipe)
+            , strtab_offset (ipeClosureDesc cg_ipe)
+            , strtab_offset (ipeTypeDesc cg_ipe)
+            , strtab_offset (ipeLabel cg_ipe)
+            , strtab_offset (ipeModuleName cg_ipe)
+            , strtab_offset (ipeSrcFile cg_ipe)
+            , strtab_offset (ipeSrcSpan cg_ipe)
+            , int32 0
+            ]
+
+        int n = mkIntCLit platform n
+        int32 n = CmmInt n W32
+        strtab_offset (StrTabOffset n) = int32 (fromIntegral n)
+
+    strings <- newByteStringCLit (getStringTableStrings strtab)
+    let lits = [ zeroCLit platform     -- 'next' field
+               , strings               -- 'strings' field
+               , int $ length cg_ipes  -- 'count' field
+               ] ++ concatMap toIpeBufferEntry cg_ipes
+    emitDataLits (mkIPELabel this_mod) lits
+
+toCgIPE :: Platform -> SDocContext -> StrTabOffset -> InfoProvEnt -> State StringTable CgInfoProvEnt
+toCgIPE platform ctx module_name ipe = do
+    table_name <- lookupStringTable $ ST.pack $ renderWithContext ctx (pprCLabel platform CStyle (infoTablePtr ipe))
+    closure_desc <- lookupStringTable $ ST.pack $ show (infoProvEntClosureType ipe)
+    type_desc <- lookupStringTable $ ST.pack $ infoTableType ipe
+    let label_str = maybe "" snd (infoTableProv ipe)
+    let (src_loc_file, src_loc_span) =
+            case infoTableProv ipe of
+              Nothing -> ("", "")
+              Just (span, _) ->
+                  let file = unpackFS $ srcSpanFile span
+                      coords = renderWithContext ctx (pprUserRealSpan False span)
+                  in (file, coords)
+    label <- lookupStringTable $ ST.pack label_str
+    src_file <- lookupStringTable $ ST.pack src_loc_file
+    src_span <- lookupStringTable $ ST.pack src_loc_span
+    return $ CgInfoProvEnt { ipeInfoTablePtr = infoTablePtr ipe
+                           , ipeTableName = table_name
+                           , ipeClosureDesc = closure_desc
+                           , ipeTypeDesc = type_desc
+                           , ipeLabel = label
+                           , ipeModuleName = module_name
+                           , ipeSrcFile = src_file
+                           , ipeSrcSpan = src_span
+                           }
+
+data CgInfoProvEnt = CgInfoProvEnt
+                               { ipeInfoTablePtr :: !CLabel
+                               , ipeTableName :: !StrTabOffset
+                               , ipeClosureDesc :: !StrTabOffset
+                               , ipeTypeDesc :: !StrTabOffset
+                               , ipeLabel :: !StrTabOffset
+                               , ipeModuleName :: !StrTabOffset
+                               , ipeSrcFile :: !StrTabOffset
+                               , ipeSrcSpan :: !StrTabOffset
+                               }
+
+data StringTable = StringTable { stStrings :: DList ShortText
+                               , stLength :: !Int
+                               , stLookup :: !(M.Map ShortText StrTabOffset)
+                               }
+
+newtype StrTabOffset = StrTabOffset Int
+
+emptyStringTable :: StringTable
+emptyStringTable =
+    StringTable { stStrings = emptyDList
+                , stLength = 0
+                , stLookup = M.empty
+                }
+
+getStringTableStrings :: StringTable -> BS.ByteString
+getStringTableStrings st =
+    BSL.toStrict $ BSB.toLazyByteString
+    $ foldMap f $ dlistToList (stStrings st)
+  where
+    f x = BSB.shortByteString (ST.contents x) `mappend` BSB.word8 0
+
+lookupStringTable :: ShortText -> State StringTable StrTabOffset
+lookupStringTable str = state $ \st ->
+    case M.lookup str (stLookup st) of
+      Just off -> (off, st)
+      Nothing ->
+          let !st' = st { stStrings = stStrings st `snoc` str
+                        , stLength  = stLength st + ST.byteLength str + 1
+                        , stLookup  = M.insert str res (stLookup st)
+                        }
+              res = StrTabOffset (stLength st)
+          in (res, st')
+
+newtype DList a = DList ([a] -> [a])
+
+emptyDList :: DList a
+emptyDList = DList id
+
+snoc :: DList a -> a -> DList a
+snoc (DList f) x = DList (f . (x:))
+
+dlistToList :: DList a -> [a]
+dlistToList (DList f) = f []


=====================================
compiler/GHC/StgToCmm/Prof.hs
=====================================
@@ -11,7 +11,7 @@ module GHC.StgToCmm.Prof (
         mkCCostCentre, mkCCostCentreStack,
 
         -- infoTablePRov
-        initInfoTableProv, emitInfoTableProv,
+        initInfoTableProv,
 
         -- Cost-centre Profiling
         dynProfHdr, profDynAlloc, profAlloc, staticProfHdr, initUpdFrameProf,
@@ -32,6 +32,7 @@ import GHC.Platform
 import GHC.Platform.Profile
 import GHC.StgToCmm.Closure
 import GHC.StgToCmm.Config
+import GHC.StgToCmm.InfoTableProv
 import GHC.StgToCmm.Utils
 import GHC.StgToCmm.Monad
 import GHC.StgToCmm.Lit
@@ -55,7 +56,6 @@ import GHC.Utils.Encoding
 
 import Control.Monad
 import Data.Char       (ord)
-import Data.Bifunctor  (first)
 import GHC.Utils.Monad (whenM)
 
 -----------------------------------------------------------------------------
@@ -274,9 +274,8 @@ sizeof_ccs_words platform
   where
    (ws,ms) = pc_SIZEOF_CostCentreStack (platformConstants platform) `divMod` platformWordSizeInBytes platform
 
-
+-- | Emit info-table provenance declarations
 initInfoTableProv ::  [CmmInfoTable] -> InfoTableProvMap -> FCode CStub
--- Emit the declarations
 initInfoTableProv infos itmap
   = do
        cfg <- getStgToCmmConfig
@@ -284,42 +283,16 @@ initInfoTableProv infos itmap
            info_table = stgToCmmInfoTableMap cfg
            platform   = stgToCmmPlatform     cfg
            this_mod   = stgToCmmThisModule   cfg
-       -- Output the actual IPE data
-       mapM_ emitInfoTableProv ents
-       -- Create the C stub which initialises the IPE map
-       return (ipInitCode info_table platform this_mod ents)
-
---- Info Table Prov stuff
-emitInfoTableProv :: InfoProvEnt  -> FCode ()
-emitInfoTableProv ip = do
-  { cfg <- getStgToCmmConfig
-  ; let mod      = infoProvModule ip
-        ctx      = stgToCmmContext  cfg
-        platform = stgToCmmPlatform cfg
-  ; let (src, label) = maybe ("", "") (first (renderWithContext ctx . ppr)) (infoTableProv ip)
-        mk_string    = newByteStringCLit . utf8EncodeByteString
-  ; label <- mk_string label
-  ; modl  <- newByteStringCLit (bytesFS $ moduleNameFS
-                                        $ moduleName mod)
-
-  ; ty_string  <- mk_string (infoTableType ip)
-  ; loc        <- mk_string src
-  ; table_name <- mk_string (renderWithContext ctx
-                             (pprCLabel platform CStyle (infoTablePtr ip)))
-  ; closure_type <- mk_string (renderWithContext ctx
-                               (text $ show $ infoProvEntClosureType ip))
-  ; let
-     lits = [ CmmLabel (infoTablePtr ip), -- Info table pointer
-              table_name,     -- char *table_name
-              closure_type,   -- char *closure_desc -- Filled in from the InfoTable
-              ty_string,      -- char *ty_string
-              label,          -- char *label,
-              modl,           -- char *module,
-              loc,            -- char *srcloc,
-              zero platform   -- struct _InfoProvEnt *link
-            ]
-  ; emitDataLits (mkIPELabel ip) lits
-  }
+
+       case ents of
+         [] -> return mempty
+         _  -> do
+           -- Emit IPE buffer
+           emitIpeBufferListNode this_mod ents
+
+           -- Create the C stub which initialises the IPE map
+           return (ipInitCode info_table platform this_mod)
+
 -- ---------------------------------------------------------------------------
 -- Set the current cost centre stack
 


=====================================
compiler/ghc.cabal.in
=====================================
@@ -615,6 +615,7 @@ Library
         GHC.StgToCmm.Foreign
         GHC.StgToCmm.Heap
         GHC.StgToCmm.Hpc
+        GHC.StgToCmm.InfoTableProv
         GHC.StgToCmm.Layout
         GHC.StgToCmm.Lit
         GHC.StgToCmm.Monad


=====================================
libraries/base/GHC/InfoProv.hsc
=====================================
@@ -20,6 +20,7 @@
 
 module GHC.InfoProv
     ( InfoProv(..)
+    , ipLoc
     , ipeProv
     , whereFrom
       -- * Internals
@@ -42,10 +43,15 @@ data InfoProv = InfoProv {
   ipTyDesc :: String,
   ipLabel :: String,
   ipMod :: String,
-  ipLoc :: String
+  ipSrcFile :: String,
+  ipSrcSpan :: String
 } deriving (Eq, Show)
+
 data InfoProvEnt
 
+ipLoc :: InfoProv -> String
+ipLoc ipe = ipSrcFile ipe ++ ":" ++ ipSrcSpan ipe
+
 getIPE :: a -> IO (Ptr InfoProvEnt)
 getIPE obj = IO $ \s ->
    case whereFrom## obj s of
@@ -54,13 +60,14 @@ getIPE obj = IO $ \s ->
 ipeProv :: Ptr InfoProvEnt -> Ptr InfoProv
 ipeProv p = (#ptr InfoProvEnt, prov) p
 
-peekIpName, peekIpDesc, peekIpLabel, peekIpModule, peekIpSrcLoc, peekIpTyDesc :: Ptr InfoProv -> IO CString
-peekIpName p   =  (# peek InfoProv, table_name) p
-peekIpDesc p   =  (# peek InfoProv, closure_desc) p
-peekIpLabel p  =  (# peek InfoProv, label) p
-peekIpModule p =  (# peek InfoProv, module) p
-peekIpSrcLoc p =  (# peek InfoProv, srcloc) p
-peekIpTyDesc p =  (# peek InfoProv, ty_desc) p
+peekIpName, peekIpDesc, peekIpLabel, peekIpModule, peekIpSrcFile, peekIpSrcSpan, peekIpTyDesc :: Ptr InfoProv -> IO CString
+peekIpName p    =  (# peek InfoProv, table_name) p
+peekIpDesc p    =  (# peek InfoProv, closure_desc) p
+peekIpLabel p   =  (# peek InfoProv, label) p
+peekIpModule p  =  (# peek InfoProv, module) p
+peekIpSrcFile p =  (# peek InfoProv, src_file) p
+peekIpSrcSpan p =  (# peek InfoProv, src_span) p
+peekIpTyDesc p  =  (# peek InfoProv, ty_desc) p
 
 peekInfoProv :: Ptr InfoProv -> IO InfoProv
 peekInfoProv infop = do
@@ -69,14 +76,16 @@ peekInfoProv infop = do
   tyDesc <- peekCString utf8 =<< peekIpTyDesc infop
   label <- peekCString utf8 =<< peekIpLabel infop
   mod <- peekCString utf8 =<< peekIpModule infop
-  loc <- peekCString utf8 =<< peekIpSrcLoc infop
+  file <- peekCString utf8 =<< peekIpSrcFile infop
+  span <- peekCString utf8 =<< peekIpSrcSpan infop
   return InfoProv {
       ipName = name,
       ipDesc = desc,
       ipTyDesc = tyDesc,
       ipLabel = label,
       ipMod = mod,
-      ipLoc = loc
+      ipSrcFile = file,
+      ipSrcSpan = span
     }
 
 -- | Get information about where a value originated from.


=====================================
libraries/base/GHC/Stack/CloneStack.hs
=====================================
@@ -28,7 +28,7 @@ import Foreign
 import GHC.Conc.Sync
 import GHC.Exts (Int (I#), RealWorld, StackSnapshot#, ThreadId#, Array#, sizeofArray#, indexArray#, State#, StablePtr#)
 import GHC.IO (IO (..))
-import GHC.InfoProv (InfoProv (..), InfoProvEnt, ipeProv, peekInfoProv)
+import GHC.InfoProv (InfoProv (..), InfoProvEnt, ipLoc, ipeProv, peekInfoProv)
 import GHC.Stable
 
 -- | A frozen snapshot of the state of an execution stack.


=====================================
rts/IPE.c
=====================================
@@ -34,17 +34,22 @@ Unfortunately, inserting into the hash map is relatively expensive. To keep
 startup times low, there's a temporary data structure that is optimized for
 collecting IPE lists on registration.
 
-It's a singly linked list of IPE list buffers. Each buffer contains space for
-126 IPE lists. This number is a bit arbitrary, but leaves a few bytes so that
-the whole structure might fit into 1024 bytes.
-
-On registering a new IPE list, there are three cases:
-
-- It's the first entry at all: Allocate a new IpeBufferListNode and make it the
-  buffer's first entry.
-- The current IpeBufferListNode has space in it's buffer: Add it to the buffer.
-- The current IpeBufferListNode's buffer is full: Allocate a new one and link it
-to the previous one, making this one the new current.
+It's a singly linked list of IPE list buffers (IpeBufferListNode). These are
+emitted by the code generator, with generally one produced per module. Each
+contains an array of IPE entries and a link field (which is used to link
+buffers onto the pending list.
+
+For reasons of space efficiency, IPE entries are represented slightly
+differently in the object file than the InfoProvEnt which we ultimately expose
+to the user. Specifically, the IPEs in IpeBufferListNode are represented by
+IpeBufferEntrys, along with a corresponding string table. The string fields
+of InfoProvEnt are represented in IpeBufferEntry as 32-bit offsets into the
+string table. This allows us to halve the size of the buffer entries on
+64-bit machines while significantly reducing the number of needed
+relocations, reducing linking cost. Moreover, the code generator takes care
+to deduplicate strings when generating the string table. When we inserting a
+set of IpeBufferEntrys into the IPE hash-map we convert them to InfoProvEnts,
+which contain proper string pointers.
 
 Building the hash map is done lazily, i.e. on first lookup or traversal. For
 this all IPE lists of all IpeBufferListNode are traversed to insert all IPEs.
@@ -52,43 +57,56 @@ this all IPE lists of all IpeBufferListNode are traversed to insert all IPEs.
 After the content of a IpeBufferListNode has been inserted, it's freed.
 */
 
+static Mutex ipeMapLock;
 static HashTable *ipeMap = NULL;
 
+// Accessed atomically
 static IpeBufferListNode *ipeBufferList = NULL;
 
-static Mutex ipeMapLock;
-
-void initIpeMapLock(void) { initMutex(&ipeMapLock); }
-
-void closeIpeMapLock(void) { closeMutex(&ipeMapLock); }
+void initIpe(void) { initMutex(&ipeMapLock); }
+
+void exitIpe(void) { closeMutex(&ipeMapLock); }
+
+static InfoProvEnt ipeBufferEntryToIpe(const IpeBufferListNode *node, const IpeBufferEntry *ent)
+{
+    const char *strings = node->string_table;
+    return (InfoProvEnt) {
+            .info = ent->info,
+            .prov = {
+                .table_name = &strings[ent->table_name],
+                .closure_desc = &strings[ent->closure_desc],
+                .ty_desc = &strings[ent->ty_desc],
+                .label = &strings[ent->label],
+                .module = &strings[ent->module_name],
+                .src_file = &strings[ent->src_file],
+                .src_span = &strings[ent->src_span]
+            }
+    };
+}
 
 #if defined(TRACING)
-static void traceIPEFromHashTable(void *data STG_UNUSED,
-                                  StgWord key STG_UNUSED,
+static void traceIPEFromHashTable(void *data STG_UNUSED, StgWord key STG_UNUSED,
                                   const void *value) {
     InfoProvEnt *ipe = (InfoProvEnt *)value;
     traceIPE(ipe);
 }
 
 void dumpIPEToEventLog(void) {
-    ACQUIRE_LOCK(&ipeMapLock);
-
-    IpeBufferListNode *cursor = ipeBufferList;
+    // Dump pending entries
+    IpeBufferListNode *cursor = RELAXED_LOAD(&ipeBufferList);
     while (cursor != NULL) {
-        for (int i = 0; i < cursor->count; i++) {
-            for (InfoProvEnt **ipeList = cursor->buffer[i]; *ipeList != NULL; ipeList++) {
-                InfoProvEnt *ipe = *ipeList;
-                traceIPE(ipe);
-            }
+        for (uint32_t i = 0; i < cursor->count; i++) {
+            const InfoProvEnt ent = ipeBufferEntryToIpe(cursor, &cursor->entries[i]);
+            traceIPE(&ent);
         }
-
         cursor = cursor->next;
     }
 
+    // Dump entries already in hashmap
+    ACQUIRE_LOCK(&ipeMapLock);
     if (ipeMap != NULL) {
         mapHashTable(ipeMap, NULL, &traceIPEFromHashTable);
     }
-
     RELEASE_LOCK(&ipeMapLock);
 }
 
@@ -105,50 +123,20 @@ Note [The Info Table Provenance Entry (IPE) Map].
 
 Statically initialized IPE lists are registered at startup by a C constructor
 function generated by the compiler (CodeOutput.hs) in a *.c file for each
-module.
+module. Since this is called in a static initializer we cannot rely on
+ipeMapLock; we instead use atomic CAS operations to add to the list.
 
 A performance test for IPE registration and lookup can be found here:
 https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5724#note_370806
 */
-void registerInfoProvList(InfoProvEnt **ent_list) {
-    // The list must be dereferenceable.
-    ASSERT(ent_list[0] == NULL || ent_list[0] != NULL);
-
-    // Ignore empty lists
-    if (ent_list[0] == NULL) {
-        return;
-    }
-
-    ACQUIRE_LOCK(&ipeMapLock);
-
-    if (ipeBufferList == NULL) {
-        ASSERT(ipeBufferList == NULL);
-
-        ipeBufferList = stgMallocBytes(sizeof(IpeBufferListNode),
-                                       "registerInfoProvList-firstNode");
-        ipeBufferList->buffer[0] = ent_list;
-        ipeBufferList->count = 1;
-        ipeBufferList->next = NULL;
-    } else {
-        if (ipeBufferList->count < IPE_LIST_NODE_BUFFER_SIZE) {
-            ipeBufferList->buffer[ipeBufferList->count] = ent_list;
-            ipeBufferList->count = ipeBufferList->count + 1;
-
-            ASSERT(ipeBufferList->next == NULL ||
-                   ipeBufferList->next->count == IPE_LIST_NODE_BUFFER_SIZE);
-        } else {
-            IpeBufferListNode *newNode = stgMallocBytes(
-                sizeof(IpeBufferListNode), "registerInfoProvList-nextNode");
-            newNode->buffer[0] = ent_list;
-            newNode->count = 1;
-            newNode->next = ipeBufferList;
-            ipeBufferList = newNode;
-
-            ASSERT(ipeBufferList->next->count == IPE_LIST_NODE_BUFFER_SIZE);
+void registerInfoProvList(IpeBufferListNode *node) {
+    while (true) {
+        IpeBufferListNode *old = RELAXED_LOAD(&ipeBufferList);
+        node->next = old;
+        if (cas_ptr((volatile void **) &ipeBufferList, old, node) == (void *) old) {
+            return;
         }
     }
-
-    RELEASE_LOCK(&ipeMapLock);
 }
 
 InfoProvEnt *lookupIPE(const StgInfoTable *info) {
@@ -159,7 +147,8 @@ InfoProvEnt *lookupIPE(const StgInfoTable *info) {
 void updateIpeMap() {
     // Check if there's any work at all. If not so, we can circumvent locking,
     // which decreases performance.
-    if (ipeMap != NULL && ipeBufferList == NULL) {
+    IpeBufferListNode *pending = xchg_ptr((void **) &ipeBufferList, NULL);
+    if (ipeMap != NULL && pending == NULL) {
         return;
     }
 
@@ -169,23 +158,16 @@ void updateIpeMap() {
         ipeMap = allocHashTable();
     }
 
-    while (ipeBufferList != NULL) {
-        ASSERT(ipeBufferList->next == NULL ||
-               ipeBufferList->next->count == IPE_LIST_NODE_BUFFER_SIZE);
-        ASSERT(ipeBufferList->count > 0 &&
-               ipeBufferList->count <= IPE_LIST_NODE_BUFFER_SIZE);
-
-        IpeBufferListNode *currentNode = ipeBufferList;
-
-        for (int i = 0; i < currentNode->count; i++) {
-            for (InfoProvEnt **ipeList = currentNode->buffer[i];
-                 *ipeList != NULL; ipeList++) {
-                insertHashTable(ipeMap, (StgWord)(*ipeList)->info, *ipeList);
-            }
+    while (pending != NULL) {
+        IpeBufferListNode *currentNode = pending;
+        InfoProvEnt *ip_ents = stgMallocBytes(sizeof(InfoProvEnt) * currentNode->count, "updateIpeMap");
+        for (uint32_t i = 0; i < currentNode->count; i++) {
+            const IpeBufferEntry *ent = &currentNode->entries[i];
+            ip_ents[i] = ipeBufferEntryToIpe(currentNode, ent);
+            insertHashTable(ipeMap, (StgWord) ent->info, &ip_ents[i]);
         }
 
-        ipeBufferList = currentNode->next;
-        stgFree(currentNode);
+        pending = currentNode->next;
     }
 
     RELEASE_LOCK(&ipeMapLock);


=====================================
rts/IPE.h
=====================================
@@ -13,17 +13,9 @@
 
 #include "BeginPrivate.h"
 
-#define IPE_LIST_NODE_BUFFER_SIZE 126
-
-typedef struct IpeBufferListNode_ {
-    InfoProvEnt **buffer[IPE_LIST_NODE_BUFFER_SIZE];
-    StgWord8 count;
-    struct IpeBufferListNode_ *next;
-} IpeBufferListNode;
-
 void dumpIPEToEventLog(void);
 void updateIpeMap(void);
-void initIpeMapLock(void);
-void closeIpeMapLock(void);
+void initIpe(void);
+void exitIpe(void);
 
 #include "EndPrivate.h"


=====================================
rts/RtsStartup.c
=====================================
@@ -386,7 +386,7 @@ hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config)
 #if defined(PROFILING)
     initProfiling();
 #endif
-    initIpeMapLock();
+    initIpe();
     traceInitEvent(dumpIPEToEventLog);
     initHeapProfiling();
 
@@ -611,7 +611,7 @@ hs_exit_(bool wait_foreign)
     // Free threading resources
     freeThreadingResources();
 
-    closeIpeMapLock();
+    exitIpe();
 }
 
 // Flush stdout and stderr.  We do this during shutdown so that it


=====================================
rts/Trace.c
=====================================
@@ -682,9 +682,9 @@ void traceIPE(const InfoProvEnt *ipe)
         ACQUIRE_LOCK(&trace_utx);
 
         tracePreface();
-        debugBelch("IPE: table_name %s, closure_desc %s, ty_desc %s, label %s, module %s, srcloc %s\n",
+        debugBelch("IPE: table_name %s, closure_desc %s, ty_desc %s, label %s, module %s, srcloc %s:%s\n",
                    ipe->prov.table_name, ipe->prov.closure_desc, ipe->prov.ty_desc,
-                   ipe->prov.label, ipe->prov.module, ipe->prov.srcloc);
+                   ipe->prov.label, ipe->prov.module, ipe->prov.src_file, ipe->prov.src_span);
 
         RELEASE_LOCK(&trace_utx);
     } else


=====================================
rts/eventlog/EventLog.c
=====================================
@@ -166,7 +166,7 @@ static inline void postWord64(EventsBuf *eb, StgWord64 i)
     postWord32(eb, (StgWord32)i);
 }
 
-static inline void postBuf(EventsBuf *eb, StgWord8 *buf, uint32_t size)
+static inline void postBuf(EventsBuf *eb, const StgWord8 *buf, uint32_t size)
 {
     memcpy(eb->pos, buf, size);
     eb->pos += size;
@@ -1419,10 +1419,13 @@ void postIPE(const InfoProvEnt *ipe)
     StgWord ty_desc_len = strlen(ipe->prov.ty_desc);
     StgWord label_len = strlen(ipe->prov.label);
     StgWord module_len = strlen(ipe->prov.module);
-    StgWord srcloc_len = strlen(ipe->prov.srcloc);
+    StgWord src_file_len = strlen(ipe->prov.src_file);
+    StgWord src_span_len = strlen(ipe->prov.src_span);
+
     // 8 for the info word
-    // 6 for the number of strings in the payload as postString adds 1 to the length
-    StgWord len = 8+table_name_len+closure_desc_len+ty_desc_len+label_len+module_len+srcloc_len+6;
+    // 1 null after each string
+    // 1 colon between src_file and src_span
+    StgWord len = 8+table_name_len+1+closure_desc_len+1+ty_desc_len+1+label_len+1+module_len+1+src_file_len+1+src_span_len+1;
     ensureRoomForVariableEvent(&eventBuf, len);
     postEventHeader(&eventBuf, EVENT_IPE);
     postPayloadSize(&eventBuf, len);
@@ -1432,7 +1435,13 @@ void postIPE(const InfoProvEnt *ipe)
     postString(&eventBuf, ipe->prov.ty_desc);
     postString(&eventBuf, ipe->prov.label);
     postString(&eventBuf, ipe->prov.module);
-    postString(&eventBuf, ipe->prov.srcloc);
+
+    // Manually construct the location field: "<file>:<span>\0"
+    postBuf(&eventBuf, (const StgWord8*) ipe->prov.src_file, src_file_len);
+    StgWord8 colon = ':';
+    postBuf(&eventBuf, &colon, 1);
+    postString(&eventBuf, ipe->prov.src_span);
+
     RELEASE_LOCK(&eventBufMutex);
 }
 


=====================================
rts/include/rts/IPE.h
=====================================
@@ -14,18 +14,56 @@
 #pragma once
 
 typedef struct InfoProv_ {
-    char *table_name;
-    char *closure_desc;
-    char *ty_desc;
-    char *label;
-    char *module;
-    char *srcloc;
+    const char *table_name;
+    const char *closure_desc;
+    const char *ty_desc;
+    const char *label;
+    const char *module;
+    const char *src_file;
+    const char *src_span;
 } InfoProv;
 
 typedef struct InfoProvEnt_ {
-    StgInfoTable *info;
+    const StgInfoTable *info;
     InfoProv prov;
 } InfoProvEnt;
 
-void registerInfoProvList(InfoProvEnt **cc_list);
+
+/*
+ * On-disk representation
+ */
+
+/*
+ * A byte offset into the string table.
+ * We use offsets rather than pointers as:
+ *
+ *  a. they are smaller than pointers on 64-bit platforms
+ *  b. they are easier on the linker since they do not need
+ *     to be relocated
+ */
+typedef uint32_t StringIdx;
+
+// The size of this must be a multiple of the word size
+// to ensure correct packing.
+typedef struct {
+    const StgInfoTable *info;
+    StringIdx table_name;
+    StringIdx closure_desc;
+    StringIdx ty_desc;
+    StringIdx label;
+    StringIdx module_name;
+    StringIdx src_file;
+    StringIdx src_span;
+    uint32_t _padding;
+} IpeBufferEntry;
+
+typedef struct IpeBufferListNode_ {
+    struct IpeBufferListNode_ *next;
+    // Everything below is read-only and generated by the codegen
+    const char *string_table;
+    StgWord count;
+    IpeBufferEntry entries[];
+} IpeBufferListNode;
+
+void registerInfoProvList(IpeBufferListNode *node);
 InfoProvEnt *lookupIPE(const StgInfoTable *info);


=====================================
rts/include/stg/SMP.h
=====================================
@@ -568,3 +568,20 @@ atomic_dec(StgVolatilePtr p)
 #define VOLATILE_LOAD(p) ((StgWord)*((StgWord*)(p)))
 
 #endif /* !THREADED_RTS */
+
+/* Helpers implemented in terms of the above */
+#if !IN_STG_CODE || IN_STGCRUN
+
+INLINE_HEADER void *
+xchg_ptr(void **p, void *w)
+{
+    return (void *) xchg((StgPtr) p, (StgWord) w);
+}
+
+INLINE_HEADER void *
+cas_ptr(volatile void **p, void *o, void *n)
+{
+    return (void *) cas((StgVolatilePtr) p, (StgWord) o, (StgWord) n);
+}
+
+#endif


=====================================
testsuite/tests/rts/all.T
=====================================
@@ -199,9 +199,9 @@ def noCapabilityOutputFilter(s):
 # Manually create IPE entries and dump them to event log (stderr).
 test('ipeEventLog',
      [ c_src,
-       extra_files(['ipeEventLog_lib.c']),
+       extra_files(['ipeEventLog_lib.c', 'ipeEventLog_lib.h']),
        extra_run_opts('+RTS -va -RTS'),
-       grep_errmsg('IPE:'),
+       grep_errmsg('table_name_'),
        only_ways(debug_ways),
        normalise_errmsg_fun(noCapabilityOutputFilter),
        ignore_stdout,
@@ -215,9 +215,9 @@ test('ipeEventLog',
 # and dump them to event log (stderr).
 test('ipeEventLog_fromMap',
      [ c_src,
-       extra_files(['ipeEventLog_lib.c']),
+       extra_files(['ipeEventLog_lib.c', 'ipeEventLog_lib.h']),
        extra_run_opts('+RTS -va -RTS'),
-       grep_errmsg('IPE:'),
+       grep_errmsg('table_name_'),
        only_ways(debug_ways),
        normalise_errmsg_fun(noCapabilityOutputFilter),
        ignore_stdout,


=====================================
testsuite/tests/rts/ipeEventLog.c
=====================================
@@ -4,53 +4,17 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
-extern void dumpIPEToEventLog(void);
-InfoProvEnt *makeAnyProvEntry(Capability *cap, int i);
+#include "ipeEventLog_lib.h"
 
 int main(int argc, char *argv[]) {
     hs_init(&argc, &argv);
     Capability *cap = rts_lock();
 
-    // Force the creation of 4 IpeBufferListNodes (381 IPEs)
-    for (int i = 0; i < 381; i++) {
-
-        InfoProvEnt **ipeList_1 = malloc(sizeof(InfoProvEnt *) * 2);
-        ipeList_1[0] = makeAnyProvEntry(cap, i);
-        ipeList_1[1] = NULL;
-
-        registerInfoProvList(ipeList_1);
-    }
-
-    // Register an IPE list with two elements
-    HaskellObj one = rts_mkInt(cap, 1);
-
-    InfoProvEnt *provEntA = malloc(sizeof(InfoProvEnt));
-    provEntA->info = (StgInfoTable *)one->header.info;
-    provEntA->prov.table_name = "table_name_a";
-    provEntA->prov.closure_desc = "closure_desc_a";
-    provEntA->prov.ty_desc = "ty_desc_a";
-    provEntA->prov.label = "label_a";
-    provEntA->prov.module = "module_a";
-    provEntA->prov.srcloc = "srcloc_a";
-
-    HaskellObj two = rts_mkInt(cap, 2);
-
-    InfoProvEnt *provEntB = malloc(sizeof(InfoProvEnt));
-    provEntB->info = (StgInfoTable *)two->header.info;
-    provEntB->prov.table_name = "table_name_b";
-    provEntB->prov.closure_desc = "closure_desc_b";
-    provEntB->prov.ty_desc = "ty_desc_b";
-    provEntB->prov.label = "label_b";
-    provEntB->prov.module = "module_b";
-    provEntB->prov.srcloc = "srcloc_b";
-
-    InfoProvEnt **ipeList_2 = malloc(sizeof(InfoProvEnt *) * 3);
-    ipeList_2[0] = provEntA;
-    ipeList_2[1] = provEntB;
-    ipeList_2[2] = NULL;
+    IpeBufferListNode *list1 = makeAnyProvEntries(cap, 10);
+    IpeBufferListNode *list2 = makeAnyProvEntries(cap, 10);
 
-    registerInfoProvList(ipeList_2);
+    registerInfoProvList(list1);
+    registerInfoProvList(list2);
 
     // Trace all IPE events. Expected count (see Makefile): 381 + 2 = 383
     dumpIPEToEventLog();


=====================================
testsuite/tests/rts/ipeEventLog.stderr
=====================================
@@ -1,383 +1,20 @@
-IPE: table_name table_name_378, closure_desc closure_desc_378, ty_desc ty_desc_378, label label_378, module module_378, srcloc srcloc_378
-IPE: table_name table_name_379, closure_desc closure_desc_379, ty_desc ty_desc_379, label label_379, module module_379, srcloc srcloc_379
-IPE: table_name table_name_380, closure_desc closure_desc_380, ty_desc ty_desc_380, label label_380, module module_380, srcloc srcloc_380
-IPE: table_name table_name_a, closure_desc closure_desc_a, ty_desc ty_desc_a, label label_a, module module_a, srcloc srcloc_a
-IPE: table_name table_name_b, closure_desc closure_desc_b, ty_desc ty_desc_b, label label_b, module module_b, srcloc srcloc_b
-IPE: table_name table_name_252, closure_desc closure_desc_252, ty_desc ty_desc_252, label label_252, module module_252, srcloc srcloc_252
-IPE: table_name table_name_253, closure_desc closure_desc_253, ty_desc ty_desc_253, label label_253, module module_253, srcloc srcloc_253
-IPE: table_name table_name_254, closure_desc closure_desc_254, ty_desc ty_desc_254, label label_254, module module_254, srcloc srcloc_254
-IPE: table_name table_name_255, closure_desc closure_desc_255, ty_desc ty_desc_255, label label_255, module module_255, srcloc srcloc_255
-IPE: table_name table_name_256, closure_desc closure_desc_256, ty_desc ty_desc_256, label label_256, module module_256, srcloc srcloc_256
-IPE: table_name table_name_257, closure_desc closure_desc_257, ty_desc ty_desc_257, label label_257, module module_257, srcloc srcloc_257
-IPE: table_name table_name_258, closure_desc closure_desc_258, ty_desc ty_desc_258, label label_258, module module_258, srcloc srcloc_258
-IPE: table_name table_name_259, closure_desc closure_desc_259, ty_desc ty_desc_259, label label_259, module module_259, srcloc srcloc_259
-IPE: table_name table_name_260, closure_desc closure_desc_260, ty_desc ty_desc_260, label label_260, module module_260, srcloc srcloc_260
-IPE: table_name table_name_261, closure_desc closure_desc_261, ty_desc ty_desc_261, label label_261, module module_261, srcloc srcloc_261
-IPE: table_name table_name_262, closure_desc closure_desc_262, ty_desc ty_desc_262, label label_262, module module_262, srcloc srcloc_262
-IPE: table_name table_name_263, closure_desc closure_desc_263, ty_desc ty_desc_263, label label_263, module module_263, srcloc srcloc_263
-IPE: table_name table_name_264, closure_desc closure_desc_264, ty_desc ty_desc_264, label label_264, module module_264, srcloc srcloc_264
-IPE: table_name table_name_265, closure_desc closure_desc_265, ty_desc ty_desc_265, label label_265, module module_265, srcloc srcloc_265
-IPE: table_name table_name_266, closure_desc closure_desc_266, ty_desc ty_desc_266, label label_266, module module_266, srcloc srcloc_266
-IPE: table_name table_name_267, closure_desc closure_desc_267, ty_desc ty_desc_267, label label_267, module module_267, srcloc srcloc_267
-IPE: table_name table_name_268, closure_desc closure_desc_268, ty_desc ty_desc_268, label label_268, module module_268, srcloc srcloc_268
-IPE: table_name table_name_269, closure_desc closure_desc_269, ty_desc ty_desc_269, label label_269, module module_269, srcloc srcloc_269
-IPE: table_name table_name_270, closure_desc closure_desc_270, ty_desc ty_desc_270, label label_270, module module_270, srcloc srcloc_270
-IPE: table_name table_name_271, closure_desc closure_desc_271, ty_desc ty_desc_271, label label_271, module module_271, srcloc srcloc_271
-IPE: table_name table_name_272, closure_desc closure_desc_272, ty_desc ty_desc_272, label label_272, module module_272, srcloc srcloc_272
-IPE: table_name table_name_273, closure_desc closure_desc_273, ty_desc ty_desc_273, label label_273, module module_273, srcloc srcloc_273
-IPE: table_name table_name_274, closure_desc closure_desc_274, ty_desc ty_desc_274, label label_274, module module_274, srcloc srcloc_274
-IPE: table_name table_name_275, closure_desc closure_desc_275, ty_desc ty_desc_275, label label_275, module module_275, srcloc srcloc_275
-IPE: table_name table_name_276, closure_desc closure_desc_276, ty_desc ty_desc_276, label label_276, module module_276, srcloc srcloc_276
-IPE: table_name table_name_277, closure_desc closure_desc_277, ty_desc ty_desc_277, label label_277, module module_277, srcloc srcloc_277
-IPE: table_name table_name_278, closure_desc closure_desc_278, ty_desc ty_desc_278, label label_278, module module_278, srcloc srcloc_278
-IPE: table_name table_name_279, closure_desc closure_desc_279, ty_desc ty_desc_279, label label_279, module module_279, srcloc srcloc_279
-IPE: table_name table_name_280, closure_desc closure_desc_280, ty_desc ty_desc_280, label label_280, module module_280, srcloc srcloc_280
-IPE: table_name table_name_281, closure_desc closure_desc_281, ty_desc ty_desc_281, label label_281, module module_281, srcloc srcloc_281
-IPE: table_name table_name_282, closure_desc closure_desc_282, ty_desc ty_desc_282, label label_282, module module_282, srcloc srcloc_282
-IPE: table_name table_name_283, closure_desc closure_desc_283, ty_desc ty_desc_283, label label_283, module module_283, srcloc srcloc_283
-IPE: table_name table_name_284, closure_desc closure_desc_284, ty_desc ty_desc_284, label label_284, module module_284, srcloc srcloc_284
-IPE: table_name table_name_285, closure_desc closure_desc_285, ty_desc ty_desc_285, label label_285, module module_285, srcloc srcloc_285
-IPE: table_name table_name_286, closure_desc closure_desc_286, ty_desc ty_desc_286, label label_286, module module_286, srcloc srcloc_286
-IPE: table_name table_name_287, closure_desc closure_desc_287, ty_desc ty_desc_287, label label_287, module module_287, srcloc srcloc_287
-IPE: table_name table_name_288, closure_desc closure_desc_288, ty_desc ty_desc_288, label label_288, module module_288, srcloc srcloc_288
-IPE: table_name table_name_289, closure_desc closure_desc_289, ty_desc ty_desc_289, label label_289, module module_289, srcloc srcloc_289
-IPE: table_name table_name_290, closure_desc closure_desc_290, ty_desc ty_desc_290, label label_290, module module_290, srcloc srcloc_290
-IPE: table_name table_name_291, closure_desc closure_desc_291, ty_desc ty_desc_291, label label_291, module module_291, srcloc srcloc_291
-IPE: table_name table_name_292, closure_desc closure_desc_292, ty_desc ty_desc_292, label label_292, module module_292, srcloc srcloc_292
-IPE: table_name table_name_293, closure_desc closure_desc_293, ty_desc ty_desc_293, label label_293, module module_293, srcloc srcloc_293
-IPE: table_name table_name_294, closure_desc closure_desc_294, ty_desc ty_desc_294, label label_294, module module_294, srcloc srcloc_294
-IPE: table_name table_name_295, closure_desc closure_desc_295, ty_desc ty_desc_295, label label_295, module module_295, srcloc srcloc_295
-IPE: table_name table_name_296, closure_desc closure_desc_296, ty_desc ty_desc_296, label label_296, module module_296, srcloc srcloc_296
-IPE: table_name table_name_297, closure_desc closure_desc_297, ty_desc ty_desc_297, label label_297, module module_297, srcloc srcloc_297
-IPE: table_name table_name_298, closure_desc closure_desc_298, ty_desc ty_desc_298, label label_298, module module_298, srcloc srcloc_298
-IPE: table_name table_name_299, closure_desc closure_desc_299, ty_desc ty_desc_299, label label_299, module module_299, srcloc srcloc_299
-IPE: table_name table_name_300, closure_desc closure_desc_300, ty_desc ty_desc_300, label label_300, module module_300, srcloc srcloc_300
-IPE: table_name table_name_301, closure_desc closure_desc_301, ty_desc ty_desc_301, label label_301, module module_301, srcloc srcloc_301
-IPE: table_name table_name_302, closure_desc closure_desc_302, ty_desc ty_desc_302, label label_302, module module_302, srcloc srcloc_302
-IPE: table_name table_name_303, closure_desc closure_desc_303, ty_desc ty_desc_303, label label_303, module module_303, srcloc srcloc_303
-IPE: table_name table_name_304, closure_desc closure_desc_304, ty_desc ty_desc_304, label label_304, module module_304, srcloc srcloc_304
-IPE: table_name table_name_305, closure_desc closure_desc_305, ty_desc ty_desc_305, label label_305, module module_305, srcloc srcloc_305
-IPE: table_name table_name_306, closure_desc closure_desc_306, ty_desc ty_desc_306, label label_306, module module_306, srcloc srcloc_306
-IPE: table_name table_name_307, closure_desc closure_desc_307, ty_desc ty_desc_307, label label_307, module module_307, srcloc srcloc_307
-IPE: table_name table_name_308, closure_desc closure_desc_308, ty_desc ty_desc_308, label label_308, module module_308, srcloc srcloc_308
-IPE: table_name table_name_309, closure_desc closure_desc_309, ty_desc ty_desc_309, label label_309, module module_309, srcloc srcloc_309
-IPE: table_name table_name_310, closure_desc closure_desc_310, ty_desc ty_desc_310, label label_310, module module_310, srcloc srcloc_310
-IPE: table_name table_name_311, closure_desc closure_desc_311, ty_desc ty_desc_311, label label_311, module module_311, srcloc srcloc_311
-IPE: table_name table_name_312, closure_desc closure_desc_312, ty_desc ty_desc_312, label label_312, module module_312, srcloc srcloc_312
-IPE: table_name table_name_313, closure_desc closure_desc_313, ty_desc ty_desc_313, label label_313, module module_313, srcloc srcloc_313
-IPE: table_name table_name_314, closure_desc closure_desc_314, ty_desc ty_desc_314, label label_314, module module_314, srcloc srcloc_314
-IPE: table_name table_name_315, closure_desc closure_desc_315, ty_desc ty_desc_315, label label_315, module module_315, srcloc srcloc_315
-IPE: table_name table_name_316, closure_desc closure_desc_316, ty_desc ty_desc_316, label label_316, module module_316, srcloc srcloc_316
-IPE: table_name table_name_317, closure_desc closure_desc_317, ty_desc ty_desc_317, label label_317, module module_317, srcloc srcloc_317
-IPE: table_name table_name_318, closure_desc closure_desc_318, ty_desc ty_desc_318, label label_318, module module_318, srcloc srcloc_318
-IPE: table_name table_name_319, closure_desc closure_desc_319, ty_desc ty_desc_319, label label_319, module module_319, srcloc srcloc_319
-IPE: table_name table_name_320, closure_desc closure_desc_320, ty_desc ty_desc_320, label label_320, module module_320, srcloc srcloc_320
-IPE: table_name table_name_321, closure_desc closure_desc_321, ty_desc ty_desc_321, label label_321, module module_321, srcloc srcloc_321
-IPE: table_name table_name_322, closure_desc closure_desc_322, ty_desc ty_desc_322, label label_322, module module_322, srcloc srcloc_322
-IPE: table_name table_name_323, closure_desc closure_desc_323, ty_desc ty_desc_323, label label_323, module module_323, srcloc srcloc_323
-IPE: table_name table_name_324, closure_desc closure_desc_324, ty_desc ty_desc_324, label label_324, module module_324, srcloc srcloc_324
-IPE: table_name table_name_325, closure_desc closure_desc_325, ty_desc ty_desc_325, label label_325, module module_325, srcloc srcloc_325
-IPE: table_name table_name_326, closure_desc closure_desc_326, ty_desc ty_desc_326, label label_326, module module_326, srcloc srcloc_326
-IPE: table_name table_name_327, closure_desc closure_desc_327, ty_desc ty_desc_327, label label_327, module module_327, srcloc srcloc_327
-IPE: table_name table_name_328, closure_desc closure_desc_328, ty_desc ty_desc_328, label label_328, module module_328, srcloc srcloc_328
-IPE: table_name table_name_329, closure_desc closure_desc_329, ty_desc ty_desc_329, label label_329, module module_329, srcloc srcloc_329
-IPE: table_name table_name_330, closure_desc closure_desc_330, ty_desc ty_desc_330, label label_330, module module_330, srcloc srcloc_330
-IPE: table_name table_name_331, closure_desc closure_desc_331, ty_desc ty_desc_331, label label_331, module module_331, srcloc srcloc_331
-IPE: table_name table_name_332, closure_desc closure_desc_332, ty_desc ty_desc_332, label label_332, module module_332, srcloc srcloc_332
-IPE: table_name table_name_333, closure_desc closure_desc_333, ty_desc ty_desc_333, label label_333, module module_333, srcloc srcloc_333
-IPE: table_name table_name_334, closure_desc closure_desc_334, ty_desc ty_desc_334, label label_334, module module_334, srcloc srcloc_334
-IPE: table_name table_name_335, closure_desc closure_desc_335, ty_desc ty_desc_335, label label_335, module module_335, srcloc srcloc_335
-IPE: table_name table_name_336, closure_desc closure_desc_336, ty_desc ty_desc_336, label label_336, module module_336, srcloc srcloc_336
-IPE: table_name table_name_337, closure_desc closure_desc_337, ty_desc ty_desc_337, label label_337, module module_337, srcloc srcloc_337
-IPE: table_name table_name_338, closure_desc closure_desc_338, ty_desc ty_desc_338, label label_338, module module_338, srcloc srcloc_338
-IPE: table_name table_name_339, closure_desc closure_desc_339, ty_desc ty_desc_339, label label_339, module module_339, srcloc srcloc_339
-IPE: table_name table_name_340, closure_desc closure_desc_340, ty_desc ty_desc_340, label label_340, module module_340, srcloc srcloc_340
-IPE: table_name table_name_341, closure_desc closure_desc_341, ty_desc ty_desc_341, label label_341, module module_341, srcloc srcloc_341
-IPE: table_name table_name_342, closure_desc closure_desc_342, ty_desc ty_desc_342, label label_342, module module_342, srcloc srcloc_342
-IPE: table_name table_name_343, closure_desc closure_desc_343, ty_desc ty_desc_343, label label_343, module module_343, srcloc srcloc_343
-IPE: table_name table_name_344, closure_desc closure_desc_344, ty_desc ty_desc_344, label label_344, module module_344, srcloc srcloc_344
-IPE: table_name table_name_345, closure_desc closure_desc_345, ty_desc ty_desc_345, label label_345, module module_345, srcloc srcloc_345
-IPE: table_name table_name_346, closure_desc closure_desc_346, ty_desc ty_desc_346, label label_346, module module_346, srcloc srcloc_346
-IPE: table_name table_name_347, closure_desc closure_desc_347, ty_desc ty_desc_347, label label_347, module module_347, srcloc srcloc_347
-IPE: table_name table_name_348, closure_desc closure_desc_348, ty_desc ty_desc_348, label label_348, module module_348, srcloc srcloc_348
-IPE: table_name table_name_349, closure_desc closure_desc_349, ty_desc ty_desc_349, label label_349, module module_349, srcloc srcloc_349
-IPE: table_name table_name_350, closure_desc closure_desc_350, ty_desc ty_desc_350, label label_350, module module_350, srcloc srcloc_350
-IPE: table_name table_name_351, closure_desc closure_desc_351, ty_desc ty_desc_351, label label_351, module module_351, srcloc srcloc_351
-IPE: table_name table_name_352, closure_desc closure_desc_352, ty_desc ty_desc_352, label label_352, module module_352, srcloc srcloc_352
-IPE: table_name table_name_353, closure_desc closure_desc_353, ty_desc ty_desc_353, label label_353, module module_353, srcloc srcloc_353
-IPE: table_name table_name_354, closure_desc closure_desc_354, ty_desc ty_desc_354, label label_354, module module_354, srcloc srcloc_354
-IPE: table_name table_name_355, closure_desc closure_desc_355, ty_desc ty_desc_355, label label_355, module module_355, srcloc srcloc_355
-IPE: table_name table_name_356, closure_desc closure_desc_356, ty_desc ty_desc_356, label label_356, module module_356, srcloc srcloc_356
-IPE: table_name table_name_357, closure_desc closure_desc_357, ty_desc ty_desc_357, label label_357, module module_357, srcloc srcloc_357
-IPE: table_name table_name_358, closure_desc closure_desc_358, ty_desc ty_desc_358, label label_358, module module_358, srcloc srcloc_358
-IPE: table_name table_name_359, closure_desc closure_desc_359, ty_desc ty_desc_359, label label_359, module module_359, srcloc srcloc_359
-IPE: table_name table_name_360, closure_desc closure_desc_360, ty_desc ty_desc_360, label label_360, module module_360, srcloc srcloc_360
-IPE: table_name table_name_361, closure_desc closure_desc_361, ty_desc ty_desc_361, label label_361, module module_361, srcloc srcloc_361
-IPE: table_name table_name_362, closure_desc closure_desc_362, ty_desc ty_desc_362, label label_362, module module_362, srcloc srcloc_362
-IPE: table_name table_name_363, closure_desc closure_desc_363, ty_desc ty_desc_363, label label_363, module module_363, srcloc srcloc_363
-IPE: table_name table_name_364, closure_desc closure_desc_364, ty_desc ty_desc_364, label label_364, module module_364, srcloc srcloc_364
-IPE: table_name table_name_365, closure_desc closure_desc_365, ty_desc ty_desc_365, label label_365, module module_365, srcloc srcloc_365
-IPE: table_name table_name_366, closure_desc closure_desc_366, ty_desc ty_desc_366, label label_366, module module_366, srcloc srcloc_366
-IPE: table_name table_name_367, closure_desc closure_desc_367, ty_desc ty_desc_367, label label_367, module module_367, srcloc srcloc_367
-IPE: table_name table_name_368, closure_desc closure_desc_368, ty_desc ty_desc_368, label label_368, module module_368, srcloc srcloc_368
-IPE: table_name table_name_369, closure_desc closure_desc_369, ty_desc ty_desc_369, label label_369, module module_369, srcloc srcloc_369
-IPE: table_name table_name_370, closure_desc closure_desc_370, ty_desc ty_desc_370, label label_370, module module_370, srcloc srcloc_370
-IPE: table_name table_name_371, closure_desc closure_desc_371, ty_desc ty_desc_371, label label_371, module module_371, srcloc srcloc_371
-IPE: table_name table_name_372, closure_desc closure_desc_372, ty_desc ty_desc_372, label label_372, module module_372, srcloc srcloc_372
-IPE: table_name table_name_373, closure_desc closure_desc_373, ty_desc ty_desc_373, label label_373, module module_373, srcloc srcloc_373
-IPE: table_name table_name_374, closure_desc closure_desc_374, ty_desc ty_desc_374, label label_374, module module_374, srcloc srcloc_374
-IPE: table_name table_name_375, closure_desc closure_desc_375, ty_desc ty_desc_375, label label_375, module module_375, srcloc srcloc_375
-IPE: table_name table_name_376, closure_desc closure_desc_376, ty_desc ty_desc_376, label label_376, module module_376, srcloc srcloc_376
-IPE: table_name table_name_377, closure_desc closure_desc_377, ty_desc ty_desc_377, label label_377, module module_377, srcloc srcloc_377
-IPE: table_name table_name_126, closure_desc closure_desc_126, ty_desc ty_desc_126, label label_126, module module_126, srcloc srcloc_126
-IPE: table_name table_name_127, closure_desc closure_desc_127, ty_desc ty_desc_127, label label_127, module module_127, srcloc srcloc_127
-IPE: table_name table_name_128, closure_desc closure_desc_128, ty_desc ty_desc_128, label label_128, module module_128, srcloc srcloc_128
-IPE: table_name table_name_129, closure_desc closure_desc_129, ty_desc ty_desc_129, label label_129, module module_129, srcloc srcloc_129
-IPE: table_name table_name_130, closure_desc closure_desc_130, ty_desc ty_desc_130, label label_130, module module_130, srcloc srcloc_130
-IPE: table_name table_name_131, closure_desc closure_desc_131, ty_desc ty_desc_131, label label_131, module module_131, srcloc srcloc_131
-IPE: table_name table_name_132, closure_desc closure_desc_132, ty_desc ty_desc_132, label label_132, module module_132, srcloc srcloc_132
-IPE: table_name table_name_133, closure_desc closure_desc_133, ty_desc ty_desc_133, label label_133, module module_133, srcloc srcloc_133
-IPE: table_name table_name_134, closure_desc closure_desc_134, ty_desc ty_desc_134, label label_134, module module_134, srcloc srcloc_134
-IPE: table_name table_name_135, closure_desc closure_desc_135, ty_desc ty_desc_135, label label_135, module module_135, srcloc srcloc_135
-IPE: table_name table_name_136, closure_desc closure_desc_136, ty_desc ty_desc_136, label label_136, module module_136, srcloc srcloc_136
-IPE: table_name table_name_137, closure_desc closure_desc_137, ty_desc ty_desc_137, label label_137, module module_137, srcloc srcloc_137
-IPE: table_name table_name_138, closure_desc closure_desc_138, ty_desc ty_desc_138, label label_138, module module_138, srcloc srcloc_138
-IPE: table_name table_name_139, closure_desc closure_desc_139, ty_desc ty_desc_139, label label_139, module module_139, srcloc srcloc_139
-IPE: table_name table_name_140, closure_desc closure_desc_140, ty_desc ty_desc_140, label label_140, module module_140, srcloc srcloc_140
-IPE: table_name table_name_141, closure_desc closure_desc_141, ty_desc ty_desc_141, label label_141, module module_141, srcloc srcloc_141
-IPE: table_name table_name_142, closure_desc closure_desc_142, ty_desc ty_desc_142, label label_142, module module_142, srcloc srcloc_142
-IPE: table_name table_name_143, closure_desc closure_desc_143, ty_desc ty_desc_143, label label_143, module module_143, srcloc srcloc_143
-IPE: table_name table_name_144, closure_desc closure_desc_144, ty_desc ty_desc_144, label label_144, module module_144, srcloc srcloc_144
-IPE: table_name table_name_145, closure_desc closure_desc_145, ty_desc ty_desc_145, label label_145, module module_145, srcloc srcloc_145
-IPE: table_name table_name_146, closure_desc closure_desc_146, ty_desc ty_desc_146, label label_146, module module_146, srcloc srcloc_146
-IPE: table_name table_name_147, closure_desc closure_desc_147, ty_desc ty_desc_147, label label_147, module module_147, srcloc srcloc_147
-IPE: table_name table_name_148, closure_desc closure_desc_148, ty_desc ty_desc_148, label label_148, module module_148, srcloc srcloc_148
-IPE: table_name table_name_149, closure_desc closure_desc_149, ty_desc ty_desc_149, label label_149, module module_149, srcloc srcloc_149
-IPE: table_name table_name_150, closure_desc closure_desc_150, ty_desc ty_desc_150, label label_150, module module_150, srcloc srcloc_150
-IPE: table_name table_name_151, closure_desc closure_desc_151, ty_desc ty_desc_151, label label_151, module module_151, srcloc srcloc_151
-IPE: table_name table_name_152, closure_desc closure_desc_152, ty_desc ty_desc_152, label label_152, module module_152, srcloc srcloc_152
-IPE: table_name table_name_153, closure_desc closure_desc_153, ty_desc ty_desc_153, label label_153, module module_153, srcloc srcloc_153
-IPE: table_name table_name_154, closure_desc closure_desc_154, ty_desc ty_desc_154, label label_154, module module_154, srcloc srcloc_154
-IPE: table_name table_name_155, closure_desc closure_desc_155, ty_desc ty_desc_155, label label_155, module module_155, srcloc srcloc_155
-IPE: table_name table_name_156, closure_desc closure_desc_156, ty_desc ty_desc_156, label label_156, module module_156, srcloc srcloc_156
-IPE: table_name table_name_157, closure_desc closure_desc_157, ty_desc ty_desc_157, label label_157, module module_157, srcloc srcloc_157
-IPE: table_name table_name_158, closure_desc closure_desc_158, ty_desc ty_desc_158, label label_158, module module_158, srcloc srcloc_158
-IPE: table_name table_name_159, closure_desc closure_desc_159, ty_desc ty_desc_159, label label_159, module module_159, srcloc srcloc_159
-IPE: table_name table_name_160, closure_desc closure_desc_160, ty_desc ty_desc_160, label label_160, module module_160, srcloc srcloc_160
-IPE: table_name table_name_161, closure_desc closure_desc_161, ty_desc ty_desc_161, label label_161, module module_161, srcloc srcloc_161
-IPE: table_name table_name_162, closure_desc closure_desc_162, ty_desc ty_desc_162, label label_162, module module_162, srcloc srcloc_162
-IPE: table_name table_name_163, closure_desc closure_desc_163, ty_desc ty_desc_163, label label_163, module module_163, srcloc srcloc_163
-IPE: table_name table_name_164, closure_desc closure_desc_164, ty_desc ty_desc_164, label label_164, module module_164, srcloc srcloc_164
-IPE: table_name table_name_165, closure_desc closure_desc_165, ty_desc ty_desc_165, label label_165, module module_165, srcloc srcloc_165
-IPE: table_name table_name_166, closure_desc closure_desc_166, ty_desc ty_desc_166, label label_166, module module_166, srcloc srcloc_166
-IPE: table_name table_name_167, closure_desc closure_desc_167, ty_desc ty_desc_167, label label_167, module module_167, srcloc srcloc_167
-IPE: table_name table_name_168, closure_desc closure_desc_168, ty_desc ty_desc_168, label label_168, module module_168, srcloc srcloc_168
-IPE: table_name table_name_169, closure_desc closure_desc_169, ty_desc ty_desc_169, label label_169, module module_169, srcloc srcloc_169
-IPE: table_name table_name_170, closure_desc closure_desc_170, ty_desc ty_desc_170, label label_170, module module_170, srcloc srcloc_170
-IPE: table_name table_name_171, closure_desc closure_desc_171, ty_desc ty_desc_171, label label_171, module module_171, srcloc srcloc_171
-IPE: table_name table_name_172, closure_desc closure_desc_172, ty_desc ty_desc_172, label label_172, module module_172, srcloc srcloc_172
-IPE: table_name table_name_173, closure_desc closure_desc_173, ty_desc ty_desc_173, label label_173, module module_173, srcloc srcloc_173
-IPE: table_name table_name_174, closure_desc closure_desc_174, ty_desc ty_desc_174, label label_174, module module_174, srcloc srcloc_174
-IPE: table_name table_name_175, closure_desc closure_desc_175, ty_desc ty_desc_175, label label_175, module module_175, srcloc srcloc_175
-IPE: table_name table_name_176, closure_desc closure_desc_176, ty_desc ty_desc_176, label label_176, module module_176, srcloc srcloc_176
-IPE: table_name table_name_177, closure_desc closure_desc_177, ty_desc ty_desc_177, label label_177, module module_177, srcloc srcloc_177
-IPE: table_name table_name_178, closure_desc closure_desc_178, ty_desc ty_desc_178, label label_178, module module_178, srcloc srcloc_178
-IPE: table_name table_name_179, closure_desc closure_desc_179, ty_desc ty_desc_179, label label_179, module module_179, srcloc srcloc_179
-IPE: table_name table_name_180, closure_desc closure_desc_180, ty_desc ty_desc_180, label label_180, module module_180, srcloc srcloc_180
-IPE: table_name table_name_181, closure_desc closure_desc_181, ty_desc ty_desc_181, label label_181, module module_181, srcloc srcloc_181
-IPE: table_name table_name_182, closure_desc closure_desc_182, ty_desc ty_desc_182, label label_182, module module_182, srcloc srcloc_182
-IPE: table_name table_name_183, closure_desc closure_desc_183, ty_desc ty_desc_183, label label_183, module module_183, srcloc srcloc_183
-IPE: table_name table_name_184, closure_desc closure_desc_184, ty_desc ty_desc_184, label label_184, module module_184, srcloc srcloc_184
-IPE: table_name table_name_185, closure_desc closure_desc_185, ty_desc ty_desc_185, label label_185, module module_185, srcloc srcloc_185
-IPE: table_name table_name_186, closure_desc closure_desc_186, ty_desc ty_desc_186, label label_186, module module_186, srcloc srcloc_186
-IPE: table_name table_name_187, closure_desc closure_desc_187, ty_desc ty_desc_187, label label_187, module module_187, srcloc srcloc_187
-IPE: table_name table_name_188, closure_desc closure_desc_188, ty_desc ty_desc_188, label label_188, module module_188, srcloc srcloc_188
-IPE: table_name table_name_189, closure_desc closure_desc_189, ty_desc ty_desc_189, label label_189, module module_189, srcloc srcloc_189
-IPE: table_name table_name_190, closure_desc closure_desc_190, ty_desc ty_desc_190, label label_190, module module_190, srcloc srcloc_190
-IPE: table_name table_name_191, closure_desc closure_desc_191, ty_desc ty_desc_191, label label_191, module module_191, srcloc srcloc_191
-IPE: table_name table_name_192, closure_desc closure_desc_192, ty_desc ty_desc_192, label label_192, module module_192, srcloc srcloc_192
-IPE: table_name table_name_193, closure_desc closure_desc_193, ty_desc ty_desc_193, label label_193, module module_193, srcloc srcloc_193
-IPE: table_name table_name_194, closure_desc closure_desc_194, ty_desc ty_desc_194, label label_194, module module_194, srcloc srcloc_194
-IPE: table_name table_name_195, closure_desc closure_desc_195, ty_desc ty_desc_195, label label_195, module module_195, srcloc srcloc_195
-IPE: table_name table_name_196, closure_desc closure_desc_196, ty_desc ty_desc_196, label label_196, module module_196, srcloc srcloc_196
-IPE: table_name table_name_197, closure_desc closure_desc_197, ty_desc ty_desc_197, label label_197, module module_197, srcloc srcloc_197
-IPE: table_name table_name_198, closure_desc closure_desc_198, ty_desc ty_desc_198, label label_198, module module_198, srcloc srcloc_198
-IPE: table_name table_name_199, closure_desc closure_desc_199, ty_desc ty_desc_199, label label_199, module module_199, srcloc srcloc_199
-IPE: table_name table_name_200, closure_desc closure_desc_200, ty_desc ty_desc_200, label label_200, module module_200, srcloc srcloc_200
-IPE: table_name table_name_201, closure_desc closure_desc_201, ty_desc ty_desc_201, label label_201, module module_201, srcloc srcloc_201
-IPE: table_name table_name_202, closure_desc closure_desc_202, ty_desc ty_desc_202, label label_202, module module_202, srcloc srcloc_202
-IPE: table_name table_name_203, closure_desc closure_desc_203, ty_desc ty_desc_203, label label_203, module module_203, srcloc srcloc_203
-IPE: table_name table_name_204, closure_desc closure_desc_204, ty_desc ty_desc_204, label label_204, module module_204, srcloc srcloc_204
-IPE: table_name table_name_205, closure_desc closure_desc_205, ty_desc ty_desc_205, label label_205, module module_205, srcloc srcloc_205
-IPE: table_name table_name_206, closure_desc closure_desc_206, ty_desc ty_desc_206, label label_206, module module_206, srcloc srcloc_206
-IPE: table_name table_name_207, closure_desc closure_desc_207, ty_desc ty_desc_207, label label_207, module module_207, srcloc srcloc_207
-IPE: table_name table_name_208, closure_desc closure_desc_208, ty_desc ty_desc_208, label label_208, module module_208, srcloc srcloc_208
-IPE: table_name table_name_209, closure_desc closure_desc_209, ty_desc ty_desc_209, label label_209, module module_209, srcloc srcloc_209
-IPE: table_name table_name_210, closure_desc closure_desc_210, ty_desc ty_desc_210, label label_210, module module_210, srcloc srcloc_210
-IPE: table_name table_name_211, closure_desc closure_desc_211, ty_desc ty_desc_211, label label_211, module module_211, srcloc srcloc_211
-IPE: table_name table_name_212, closure_desc closure_desc_212, ty_desc ty_desc_212, label label_212, module module_212, srcloc srcloc_212
-IPE: table_name table_name_213, closure_desc closure_desc_213, ty_desc ty_desc_213, label label_213, module module_213, srcloc srcloc_213
-IPE: table_name table_name_214, closure_desc closure_desc_214, ty_desc ty_desc_214, label label_214, module module_214, srcloc srcloc_214
-IPE: table_name table_name_215, closure_desc closure_desc_215, ty_desc ty_desc_215, label label_215, module module_215, srcloc srcloc_215
-IPE: table_name table_name_216, closure_desc closure_desc_216, ty_desc ty_desc_216, label label_216, module module_216, srcloc srcloc_216
-IPE: table_name table_name_217, closure_desc closure_desc_217, ty_desc ty_desc_217, label label_217, module module_217, srcloc srcloc_217
-IPE: table_name table_name_218, closure_desc closure_desc_218, ty_desc ty_desc_218, label label_218, module module_218, srcloc srcloc_218
-IPE: table_name table_name_219, closure_desc closure_desc_219, ty_desc ty_desc_219, label label_219, module module_219, srcloc srcloc_219
-IPE: table_name table_name_220, closure_desc closure_desc_220, ty_desc ty_desc_220, label label_220, module module_220, srcloc srcloc_220
-IPE: table_name table_name_221, closure_desc closure_desc_221, ty_desc ty_desc_221, label label_221, module module_221, srcloc srcloc_221
-IPE: table_name table_name_222, closure_desc closure_desc_222, ty_desc ty_desc_222, label label_222, module module_222, srcloc srcloc_222
-IPE: table_name table_name_223, closure_desc closure_desc_223, ty_desc ty_desc_223, label label_223, module module_223, srcloc srcloc_223
-IPE: table_name table_name_224, closure_desc closure_desc_224, ty_desc ty_desc_224, label label_224, module module_224, srcloc srcloc_224
-IPE: table_name table_name_225, closure_desc closure_desc_225, ty_desc ty_desc_225, label label_225, module module_225, srcloc srcloc_225
-IPE: table_name table_name_226, closure_desc closure_desc_226, ty_desc ty_desc_226, label label_226, module module_226, srcloc srcloc_226
-IPE: table_name table_name_227, closure_desc closure_desc_227, ty_desc ty_desc_227, label label_227, module module_227, srcloc srcloc_227
-IPE: table_name table_name_228, closure_desc closure_desc_228, ty_desc ty_desc_228, label label_228, module module_228, srcloc srcloc_228
-IPE: table_name table_name_229, closure_desc closure_desc_229, ty_desc ty_desc_229, label label_229, module module_229, srcloc srcloc_229
-IPE: table_name table_name_230, closure_desc closure_desc_230, ty_desc ty_desc_230, label label_230, module module_230, srcloc srcloc_230
-IPE: table_name table_name_231, closure_desc closure_desc_231, ty_desc ty_desc_231, label label_231, module module_231, srcloc srcloc_231
-IPE: table_name table_name_232, closure_desc closure_desc_232, ty_desc ty_desc_232, label label_232, module module_232, srcloc srcloc_232
-IPE: table_name table_name_233, closure_desc closure_desc_233, ty_desc ty_desc_233, label label_233, module module_233, srcloc srcloc_233
-IPE: table_name table_name_234, closure_desc closure_desc_234, ty_desc ty_desc_234, label label_234, module module_234, srcloc srcloc_234
-IPE: table_name table_name_235, closure_desc closure_desc_235, ty_desc ty_desc_235, label label_235, module module_235, srcloc srcloc_235
-IPE: table_name table_name_236, closure_desc closure_desc_236, ty_desc ty_desc_236, label label_236, module module_236, srcloc srcloc_236
-IPE: table_name table_name_237, closure_desc closure_desc_237, ty_desc ty_desc_237, label label_237, module module_237, srcloc srcloc_237
-IPE: table_name table_name_238, closure_desc closure_desc_238, ty_desc ty_desc_238, label label_238, module module_238, srcloc srcloc_238
-IPE: table_name table_name_239, closure_desc closure_desc_239, ty_desc ty_desc_239, label label_239, module module_239, srcloc srcloc_239
-IPE: table_name table_name_240, closure_desc closure_desc_240, ty_desc ty_desc_240, label label_240, module module_240, srcloc srcloc_240
-IPE: table_name table_name_241, closure_desc closure_desc_241, ty_desc ty_desc_241, label label_241, module module_241, srcloc srcloc_241
-IPE: table_name table_name_242, closure_desc closure_desc_242, ty_desc ty_desc_242, label label_242, module module_242, srcloc srcloc_242
-IPE: table_name table_name_243, closure_desc closure_desc_243, ty_desc ty_desc_243, label label_243, module module_243, srcloc srcloc_243
-IPE: table_name table_name_244, closure_desc closure_desc_244, ty_desc ty_desc_244, label label_244, module module_244, srcloc srcloc_244
-IPE: table_name table_name_245, closure_desc closure_desc_245, ty_desc ty_desc_245, label label_245, module module_245, srcloc srcloc_245
-IPE: table_name table_name_246, closure_desc closure_desc_246, ty_desc ty_desc_246, label label_246, module module_246, srcloc srcloc_246
-IPE: table_name table_name_247, closure_desc closure_desc_247, ty_desc ty_desc_247, label label_247, module module_247, srcloc srcloc_247
-IPE: table_name table_name_248, closure_desc closure_desc_248, ty_desc ty_desc_248, label label_248, module module_248, srcloc srcloc_248
-IPE: table_name table_name_249, closure_desc closure_desc_249, ty_desc ty_desc_249, label label_249, module module_249, srcloc srcloc_249
-IPE: table_name table_name_250, closure_desc closure_desc_250, ty_desc ty_desc_250, label label_250, module module_250, srcloc srcloc_250
-IPE: table_name table_name_251, closure_desc closure_desc_251, ty_desc ty_desc_251, label label_251, module module_251, srcloc srcloc_251
-IPE: table_name table_name_000, closure_desc closure_desc_000, ty_desc ty_desc_000, label label_000, module module_000, srcloc srcloc_000
-IPE: table_name table_name_001, closure_desc closure_desc_001, ty_desc ty_desc_001, label label_001, module module_001, srcloc srcloc_001
-IPE: table_name table_name_002, closure_desc closure_desc_002, ty_desc ty_desc_002, label label_002, module module_002, srcloc srcloc_002
-IPE: table_name table_name_003, closure_desc closure_desc_003, ty_desc ty_desc_003, label label_003, module module_003, srcloc srcloc_003
-IPE: table_name table_name_004, closure_desc closure_desc_004, ty_desc ty_desc_004, label label_004, module module_004, srcloc srcloc_004
-IPE: table_name table_name_005, closure_desc closure_desc_005, ty_desc ty_desc_005, label label_005, module module_005, srcloc srcloc_005
-IPE: table_name table_name_006, closure_desc closure_desc_006, ty_desc ty_desc_006, label label_006, module module_006, srcloc srcloc_006
-IPE: table_name table_name_007, closure_desc closure_desc_007, ty_desc ty_desc_007, label label_007, module module_007, srcloc srcloc_007
-IPE: table_name table_name_008, closure_desc closure_desc_008, ty_desc ty_desc_008, label label_008, module module_008, srcloc srcloc_008
-IPE: table_name table_name_009, closure_desc closure_desc_009, ty_desc ty_desc_009, label label_009, module module_009, srcloc srcloc_009
-IPE: table_name table_name_010, closure_desc closure_desc_010, ty_desc ty_desc_010, label label_010, module module_010, srcloc srcloc_010
-IPE: table_name table_name_011, closure_desc closure_desc_011, ty_desc ty_desc_011, label label_011, module module_011, srcloc srcloc_011
-IPE: table_name table_name_012, closure_desc closure_desc_012, ty_desc ty_desc_012, label label_012, module module_012, srcloc srcloc_012
-IPE: table_name table_name_013, closure_desc closure_desc_013, ty_desc ty_desc_013, label label_013, module module_013, srcloc srcloc_013
-IPE: table_name table_name_014, closure_desc closure_desc_014, ty_desc ty_desc_014, label label_014, module module_014, srcloc srcloc_014
-IPE: table_name table_name_015, closure_desc closure_desc_015, ty_desc ty_desc_015, label label_015, module module_015, srcloc srcloc_015
-IPE: table_name table_name_016, closure_desc closure_desc_016, ty_desc ty_desc_016, label label_016, module module_016, srcloc srcloc_016
-IPE: table_name table_name_017, closure_desc closure_desc_017, ty_desc ty_desc_017, label label_017, module module_017, srcloc srcloc_017
-IPE: table_name table_name_018, closure_desc closure_desc_018, ty_desc ty_desc_018, label label_018, module module_018, srcloc srcloc_018
-IPE: table_name table_name_019, closure_desc closure_desc_019, ty_desc ty_desc_019, label label_019, module module_019, srcloc srcloc_019
-IPE: table_name table_name_020, closure_desc closure_desc_020, ty_desc ty_desc_020, label label_020, module module_020, srcloc srcloc_020
-IPE: table_name table_name_021, closure_desc closure_desc_021, ty_desc ty_desc_021, label label_021, module module_021, srcloc srcloc_021
-IPE: table_name table_name_022, closure_desc closure_desc_022, ty_desc ty_desc_022, label label_022, module module_022, srcloc srcloc_022
-IPE: table_name table_name_023, closure_desc closure_desc_023, ty_desc ty_desc_023, label label_023, module module_023, srcloc srcloc_023
-IPE: table_name table_name_024, closure_desc closure_desc_024, ty_desc ty_desc_024, label label_024, module module_024, srcloc srcloc_024
-IPE: table_name table_name_025, closure_desc closure_desc_025, ty_desc ty_desc_025, label label_025, module module_025, srcloc srcloc_025
-IPE: table_name table_name_026, closure_desc closure_desc_026, ty_desc ty_desc_026, label label_026, module module_026, srcloc srcloc_026
-IPE: table_name table_name_027, closure_desc closure_desc_027, ty_desc ty_desc_027, label label_027, module module_027, srcloc srcloc_027
-IPE: table_name table_name_028, closure_desc closure_desc_028, ty_desc ty_desc_028, label label_028, module module_028, srcloc srcloc_028
-IPE: table_name table_name_029, closure_desc closure_desc_029, ty_desc ty_desc_029, label label_029, module module_029, srcloc srcloc_029
-IPE: table_name table_name_030, closure_desc closure_desc_030, ty_desc ty_desc_030, label label_030, module module_030, srcloc srcloc_030
-IPE: table_name table_name_031, closure_desc closure_desc_031, ty_desc ty_desc_031, label label_031, module module_031, srcloc srcloc_031
-IPE: table_name table_name_032, closure_desc closure_desc_032, ty_desc ty_desc_032, label label_032, module module_032, srcloc srcloc_032
-IPE: table_name table_name_033, closure_desc closure_desc_033, ty_desc ty_desc_033, label label_033, module module_033, srcloc srcloc_033
-IPE: table_name table_name_034, closure_desc closure_desc_034, ty_desc ty_desc_034, label label_034, module module_034, srcloc srcloc_034
-IPE: table_name table_name_035, closure_desc closure_desc_035, ty_desc ty_desc_035, label label_035, module module_035, srcloc srcloc_035
-IPE: table_name table_name_036, closure_desc closure_desc_036, ty_desc ty_desc_036, label label_036, module module_036, srcloc srcloc_036
-IPE: table_name table_name_037, closure_desc closure_desc_037, ty_desc ty_desc_037, label label_037, module module_037, srcloc srcloc_037
-IPE: table_name table_name_038, closure_desc closure_desc_038, ty_desc ty_desc_038, label label_038, module module_038, srcloc srcloc_038
-IPE: table_name table_name_039, closure_desc closure_desc_039, ty_desc ty_desc_039, label label_039, module module_039, srcloc srcloc_039
-IPE: table_name table_name_040, closure_desc closure_desc_040, ty_desc ty_desc_040, label label_040, module module_040, srcloc srcloc_040
-IPE: table_name table_name_041, closure_desc closure_desc_041, ty_desc ty_desc_041, label label_041, module module_041, srcloc srcloc_041
-IPE: table_name table_name_042, closure_desc closure_desc_042, ty_desc ty_desc_042, label label_042, module module_042, srcloc srcloc_042
-IPE: table_name table_name_043, closure_desc closure_desc_043, ty_desc ty_desc_043, label label_043, module module_043, srcloc srcloc_043
-IPE: table_name table_name_044, closure_desc closure_desc_044, ty_desc ty_desc_044, label label_044, module module_044, srcloc srcloc_044
-IPE: table_name table_name_045, closure_desc closure_desc_045, ty_desc ty_desc_045, label label_045, module module_045, srcloc srcloc_045
-IPE: table_name table_name_046, closure_desc closure_desc_046, ty_desc ty_desc_046, label label_046, module module_046, srcloc srcloc_046
-IPE: table_name table_name_047, closure_desc closure_desc_047, ty_desc ty_desc_047, label label_047, module module_047, srcloc srcloc_047
-IPE: table_name table_name_048, closure_desc closure_desc_048, ty_desc ty_desc_048, label label_048, module module_048, srcloc srcloc_048
-IPE: table_name table_name_049, closure_desc closure_desc_049, ty_desc ty_desc_049, label label_049, module module_049, srcloc srcloc_049
-IPE: table_name table_name_050, closure_desc closure_desc_050, ty_desc ty_desc_050, label label_050, module module_050, srcloc srcloc_050
-IPE: table_name table_name_051, closure_desc closure_desc_051, ty_desc ty_desc_051, label label_051, module module_051, srcloc srcloc_051
-IPE: table_name table_name_052, closure_desc closure_desc_052, ty_desc ty_desc_052, label label_052, module module_052, srcloc srcloc_052
-IPE: table_name table_name_053, closure_desc closure_desc_053, ty_desc ty_desc_053, label label_053, module module_053, srcloc srcloc_053
-IPE: table_name table_name_054, closure_desc closure_desc_054, ty_desc ty_desc_054, label label_054, module module_054, srcloc srcloc_054
-IPE: table_name table_name_055, closure_desc closure_desc_055, ty_desc ty_desc_055, label label_055, module module_055, srcloc srcloc_055
-IPE: table_name table_name_056, closure_desc closure_desc_056, ty_desc ty_desc_056, label label_056, module module_056, srcloc srcloc_056
-IPE: table_name table_name_057, closure_desc closure_desc_057, ty_desc ty_desc_057, label label_057, module module_057, srcloc srcloc_057
-IPE: table_name table_name_058, closure_desc closure_desc_058, ty_desc ty_desc_058, label label_058, module module_058, srcloc srcloc_058
-IPE: table_name table_name_059, closure_desc closure_desc_059, ty_desc ty_desc_059, label label_059, module module_059, srcloc srcloc_059
-IPE: table_name table_name_060, closure_desc closure_desc_060, ty_desc ty_desc_060, label label_060, module module_060, srcloc srcloc_060
-IPE: table_name table_name_061, closure_desc closure_desc_061, ty_desc ty_desc_061, label label_061, module module_061, srcloc srcloc_061
-IPE: table_name table_name_062, closure_desc closure_desc_062, ty_desc ty_desc_062, label label_062, module module_062, srcloc srcloc_062
-IPE: table_name table_name_063, closure_desc closure_desc_063, ty_desc ty_desc_063, label label_063, module module_063, srcloc srcloc_063
-IPE: table_name table_name_064, closure_desc closure_desc_064, ty_desc ty_desc_064, label label_064, module module_064, srcloc srcloc_064
-IPE: table_name table_name_065, closure_desc closure_desc_065, ty_desc ty_desc_065, label label_065, module module_065, srcloc srcloc_065
-IPE: table_name table_name_066, closure_desc closure_desc_066, ty_desc ty_desc_066, label label_066, module module_066, srcloc srcloc_066
-IPE: table_name table_name_067, closure_desc closure_desc_067, ty_desc ty_desc_067, label label_067, module module_067, srcloc srcloc_067
-IPE: table_name table_name_068, closure_desc closure_desc_068, ty_desc ty_desc_068, label label_068, module module_068, srcloc srcloc_068
-IPE: table_name table_name_069, closure_desc closure_desc_069, ty_desc ty_desc_069, label label_069, module module_069, srcloc srcloc_069
-IPE: table_name table_name_070, closure_desc closure_desc_070, ty_desc ty_desc_070, label label_070, module module_070, srcloc srcloc_070
-IPE: table_name table_name_071, closure_desc closure_desc_071, ty_desc ty_desc_071, label label_071, module module_071, srcloc srcloc_071
-IPE: table_name table_name_072, closure_desc closure_desc_072, ty_desc ty_desc_072, label label_072, module module_072, srcloc srcloc_072
-IPE: table_name table_name_073, closure_desc closure_desc_073, ty_desc ty_desc_073, label label_073, module module_073, srcloc srcloc_073
-IPE: table_name table_name_074, closure_desc closure_desc_074, ty_desc ty_desc_074, label label_074, module module_074, srcloc srcloc_074
-IPE: table_name table_name_075, closure_desc closure_desc_075, ty_desc ty_desc_075, label label_075, module module_075, srcloc srcloc_075
-IPE: table_name table_name_076, closure_desc closure_desc_076, ty_desc ty_desc_076, label label_076, module module_076, srcloc srcloc_076
-IPE: table_name table_name_077, closure_desc closure_desc_077, ty_desc ty_desc_077, label label_077, module module_077, srcloc srcloc_077
-IPE: table_name table_name_078, closure_desc closure_desc_078, ty_desc ty_desc_078, label label_078, module module_078, srcloc srcloc_078
-IPE: table_name table_name_079, closure_desc closure_desc_079, ty_desc ty_desc_079, label label_079, module module_079, srcloc srcloc_079
-IPE: table_name table_name_080, closure_desc closure_desc_080, ty_desc ty_desc_080, label label_080, module module_080, srcloc srcloc_080
-IPE: table_name table_name_081, closure_desc closure_desc_081, ty_desc ty_desc_081, label label_081, module module_081, srcloc srcloc_081
-IPE: table_name table_name_082, closure_desc closure_desc_082, ty_desc ty_desc_082, label label_082, module module_082, srcloc srcloc_082
-IPE: table_name table_name_083, closure_desc closure_desc_083, ty_desc ty_desc_083, label label_083, module module_083, srcloc srcloc_083
-IPE: table_name table_name_084, closure_desc closure_desc_084, ty_desc ty_desc_084, label label_084, module module_084, srcloc srcloc_084
-IPE: table_name table_name_085, closure_desc closure_desc_085, ty_desc ty_desc_085, label label_085, module module_085, srcloc srcloc_085
-IPE: table_name table_name_086, closure_desc closure_desc_086, ty_desc ty_desc_086, label label_086, module module_086, srcloc srcloc_086
-IPE: table_name table_name_087, closure_desc closure_desc_087, ty_desc ty_desc_087, label label_087, module module_087, srcloc srcloc_087
-IPE: table_name table_name_088, closure_desc closure_desc_088, ty_desc ty_desc_088, label label_088, module module_088, srcloc srcloc_088
-IPE: table_name table_name_089, closure_desc closure_desc_089, ty_desc ty_desc_089, label label_089, module module_089, srcloc srcloc_089
-IPE: table_name table_name_090, closure_desc closure_desc_090, ty_desc ty_desc_090, label label_090, module module_090, srcloc srcloc_090
-IPE: table_name table_name_091, closure_desc closure_desc_091, ty_desc ty_desc_091, label label_091, module module_091, srcloc srcloc_091
-IPE: table_name table_name_092, closure_desc closure_desc_092, ty_desc ty_desc_092, label label_092, module module_092, srcloc srcloc_092
-IPE: table_name table_name_093, closure_desc closure_desc_093, ty_desc ty_desc_093, label label_093, module module_093, srcloc srcloc_093
-IPE: table_name table_name_094, closure_desc closure_desc_094, ty_desc ty_desc_094, label label_094, module module_094, srcloc srcloc_094
-IPE: table_name table_name_095, closure_desc closure_desc_095, ty_desc ty_desc_095, label label_095, module module_095, srcloc srcloc_095
-IPE: table_name table_name_096, closure_desc closure_desc_096, ty_desc ty_desc_096, label label_096, module module_096, srcloc srcloc_096
-IPE: table_name table_name_097, closure_desc closure_desc_097, ty_desc ty_desc_097, label label_097, module module_097, srcloc srcloc_097
-IPE: table_name table_name_098, closure_desc closure_desc_098, ty_desc ty_desc_098, label label_098, module module_098, srcloc srcloc_098
-IPE: table_name table_name_099, closure_desc closure_desc_099, ty_desc ty_desc_099, label label_099, module module_099, srcloc srcloc_099
-IPE: table_name table_name_100, closure_desc closure_desc_100, ty_desc ty_desc_100, label label_100, module module_100, srcloc srcloc_100
-IPE: table_name table_name_101, closure_desc closure_desc_101, ty_desc ty_desc_101, label label_101, module module_101, srcloc srcloc_101
-IPE: table_name table_name_102, closure_desc closure_desc_102, ty_desc ty_desc_102, label label_102, module module_102, srcloc srcloc_102
-IPE: table_name table_name_103, closure_desc closure_desc_103, ty_desc ty_desc_103, label label_103, module module_103, srcloc srcloc_103
-IPE: table_name table_name_104, closure_desc closure_desc_104, ty_desc ty_desc_104, label label_104, module module_104, srcloc srcloc_104
-IPE: table_name table_name_105, closure_desc closure_desc_105, ty_desc ty_desc_105, label label_105, module module_105, srcloc srcloc_105
-IPE: table_name table_name_106, closure_desc closure_desc_106, ty_desc ty_desc_106, label label_106, module module_106, srcloc srcloc_106
-IPE: table_name table_name_107, closure_desc closure_desc_107, ty_desc ty_desc_107, label label_107, module module_107, srcloc srcloc_107
-IPE: table_name table_name_108, closure_desc closure_desc_108, ty_desc ty_desc_108, label label_108, module module_108, srcloc srcloc_108
-IPE: table_name table_name_109, closure_desc closure_desc_109, ty_desc ty_desc_109, label label_109, module module_109, srcloc srcloc_109
-IPE: table_name table_name_110, closure_desc closure_desc_110, ty_desc ty_desc_110, label label_110, module module_110, srcloc srcloc_110
-IPE: table_name table_name_111, closure_desc closure_desc_111, ty_desc ty_desc_111, label label_111, module module_111, srcloc srcloc_111
-IPE: table_name table_name_112, closure_desc closure_desc_112, ty_desc ty_desc_112, label label_112, module module_112, srcloc srcloc_112
-IPE: table_name table_name_113, closure_desc closure_desc_113, ty_desc ty_desc_113, label label_113, module module_113, srcloc srcloc_113
-IPE: table_name table_name_114, closure_desc closure_desc_114, ty_desc ty_desc_114, label label_114, module module_114, srcloc srcloc_114
-IPE: table_name table_name_115, closure_desc closure_desc_115, ty_desc ty_desc_115, label label_115, module module_115, srcloc srcloc_115
-IPE: table_name table_name_116, closure_desc closure_desc_116, ty_desc ty_desc_116, label label_116, module module_116, srcloc srcloc_116
-IPE: table_name table_name_117, closure_desc closure_desc_117, ty_desc ty_desc_117, label label_117, module module_117, srcloc srcloc_117
-IPE: table_name table_name_118, closure_desc closure_desc_118, ty_desc ty_desc_118, label label_118, module module_118, srcloc srcloc_118
-IPE: table_name table_name_119, closure_desc closure_desc_119, ty_desc ty_desc_119, label label_119, module module_119, srcloc srcloc_119
-IPE: table_name table_name_120, closure_desc closure_desc_120, ty_desc ty_desc_120, label label_120, module module_120, srcloc srcloc_120
-IPE: table_name table_name_121, closure_desc closure_desc_121, ty_desc ty_desc_121, label label_121, module module_121, srcloc srcloc_121
-IPE: table_name table_name_122, closure_desc closure_desc_122, ty_desc ty_desc_122, label label_122, module module_122, srcloc srcloc_122
-IPE: table_name table_name_123, closure_desc closure_desc_123, ty_desc ty_desc_123, label label_123, module module_123, srcloc srcloc_123
-IPE: table_name table_name_124, closure_desc closure_desc_124, ty_desc ty_desc_124, label label_124, module module_124, srcloc srcloc_124
-IPE: table_name table_name_125, closure_desc closure_desc_125, ty_desc ty_desc_125, label label_125, module module_125, srcloc srcloc_125
+7f5278bc0740: IPE: table_name table_name_000, closure_desc closure_desc_000, ty_desc ty_desc_000, label label_000, module module_000, srcloc src_file_000:src_span_000
+7f5278bc0740: IPE: table_name table_name_001, closure_desc closure_desc_001, ty_desc ty_desc_001, label label_001, module module_001, srcloc src_file_001:src_span_001
+7f5278bc0740: IPE: table_name table_name_002, closure_desc closure_desc_002, ty_desc ty_desc_002, label label_002, module module_002, srcloc src_file_002:src_span_002
+7f5278bc0740: IPE: table_name table_name_003, closure_desc closure_desc_003, ty_desc ty_desc_003, label label_003, module module_003, srcloc src_file_003:src_span_003
+7f5278bc0740: IPE: table_name table_name_004, closure_desc closure_desc_004, ty_desc ty_desc_004, label label_004, module module_004, srcloc src_file_004:src_span_004
+7f5278bc0740: IPE: table_name table_name_005, closure_desc closure_desc_005, ty_desc ty_desc_005, label label_005, module module_005, srcloc src_file_005:src_span_005
+7f5278bc0740: IPE: table_name table_name_006, closure_desc closure_desc_006, ty_desc ty_desc_006, label label_006, module module_006, srcloc src_file_006:src_span_006
+7f5278bc0740: IPE: table_name table_name_007, closure_desc closure_desc_007, ty_desc ty_desc_007, label label_007, module module_007, srcloc src_file_007:src_span_007
+7f5278bc0740: IPE: table_name table_name_008, closure_desc closure_desc_008, ty_desc ty_desc_008, label label_008, module module_008, srcloc src_file_008:src_span_008
+7f5278bc0740: IPE: table_name table_name_009, closure_desc closure_desc_009, ty_desc ty_desc_009, label label_009, module module_009, srcloc src_file_009:src_span_009
+7f5278bc0740: IPE: table_name table_name_000, closure_desc closure_desc_000, ty_desc ty_desc_000, label label_000, module module_000, srcloc src_file_000:src_span_000
+7f5278bc0740: IPE: table_name table_name_001, closure_desc closure_desc_001, ty_desc ty_desc_001, label label_001, module module_001, srcloc src_file_001:src_span_001
+7f5278bc0740: IPE: table_name table_name_002, closure_desc closure_desc_002, ty_desc ty_desc_002, label label_002, module module_002, srcloc src_file_002:src_span_002
+7f5278bc0740: IPE: table_name table_name_003, closure_desc closure_desc_003, ty_desc ty_desc_003, label label_003, module module_003, srcloc src_file_003:src_span_003
+7f5278bc0740: IPE: table_name table_name_004, closure_desc closure_desc_004, ty_desc ty_desc_004, label label_004, module module_004, srcloc src_file_004:src_span_004
+7f5278bc0740: IPE: table_name table_name_005, closure_desc closure_desc_005, ty_desc ty_desc_005, label label_005, module module_005, srcloc src_file_005:src_span_005
+7f5278bc0740: IPE: table_name table_name_006, closure_desc closure_desc_006, ty_desc ty_desc_006, label label_006, module module_006, srcloc src_file_006:src_span_006
+7f5278bc0740: IPE: table_name table_name_007, closure_desc closure_desc_007, ty_desc ty_desc_007, label label_007, module module_007, srcloc src_file_007:src_span_007
+7f5278bc0740: IPE: table_name table_name_008, closure_desc closure_desc_008, ty_desc ty_desc_008, label label_008, module module_008, srcloc src_file_008:src_span_008
+7f5278bc0740: IPE: table_name table_name_009, closure_desc closure_desc_009, ty_desc ty_desc_009, label label_009, module module_009, srcloc src_file_009:src_span_009


=====================================
testsuite/tests/rts/ipeEventLog_fromMap.c
=====================================
@@ -4,9 +4,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
-extern void dumpIPEToEventLog(void);
-InfoProvEnt *makeAnyProvEntry(Capability *cap, int i);
+#include "ipeEventLog_lib.h"
 
 int main(int argc, char *argv[]) {
     hs_init(&argc, &argv);
@@ -14,18 +12,14 @@ int main(int argc, char *argv[]) {
 
     HaskellObj one = rts_mkInt(cap, 1);
 
-    InfoProvEnt *provEnt_0 = makeAnyProvEntry(cap, 0);
-    InfoProvEnt *provEnt_1 = makeAnyProvEntry(cap, 1);
-
-    InfoProvEnt **ipeList_1 = malloc(sizeof(InfoProvEnt *) * 3);
-    ipeList_1[0] = provEnt_0;
-    ipeList_1[1] = provEnt_1;
-    ipeList_1[2] = NULL;
+    IpeBufferListNode *list1 = makeAnyProvEntries(cap, 10);
+    IpeBufferListNode *list2 = makeAnyProvEntries(cap, 10);
 
-    registerInfoProvList(ipeList_1);
+    registerInfoProvList(list1);
+    registerInfoProvList(list2);
 
     // Query an IPE to initialize the underlying hash map.
-    lookupIPE(ipeList_1[0]->info);
+    lookupIPE(list1->entries[0].info);
 
     // Trace all IPE events.
     dumpIPEToEventLog();


=====================================
testsuite/tests/rts/ipeEventLog_fromMap.stderr
=====================================
@@ -1,2 +1,20 @@
-IPE: table_name table_name_001, closure_desc closure_desc_001, ty_desc ty_desc_001, label label_001, module module_001, srcloc srcloc_001
-IPE: table_name table_name_000, closure_desc closure_desc_000, ty_desc ty_desc_000, label label_000, module module_000, srcloc srcloc_000
+7f3f06934740: IPE: table_name table_name_000, closure_desc closure_desc_000, ty_desc ty_desc_000, label label_000, module module_000, srcloc src_file_000:src_span_000
+7f3f06934740: IPE: table_name table_name_001, closure_desc closure_desc_001, ty_desc ty_desc_001, label label_001, module module_001, srcloc src_file_001:src_span_001
+7f3f06934740: IPE: table_name table_name_002, closure_desc closure_desc_002, ty_desc ty_desc_002, label label_002, module module_002, srcloc src_file_002:src_span_002
+7f3f06934740: IPE: table_name table_name_003, closure_desc closure_desc_003, ty_desc ty_desc_003, label label_003, module module_003, srcloc src_file_003:src_span_003
+7f3f06934740: IPE: table_name table_name_004, closure_desc closure_desc_004, ty_desc ty_desc_004, label label_004, module module_004, srcloc src_file_004:src_span_004
+7f3f06934740: IPE: table_name table_name_005, closure_desc closure_desc_005, ty_desc ty_desc_005, label label_005, module module_005, srcloc src_file_005:src_span_005
+7f3f06934740: IPE: table_name table_name_006, closure_desc closure_desc_006, ty_desc ty_desc_006, label label_006, module module_006, srcloc src_file_006:src_span_006
+7f3f06934740: IPE: table_name table_name_007, closure_desc closure_desc_007, ty_desc ty_desc_007, label label_007, module module_007, srcloc src_file_007:src_span_007
+7f3f06934740: IPE: table_name table_name_008, closure_desc closure_desc_008, ty_desc ty_desc_008, label label_008, module module_008, srcloc src_file_008:src_span_008
+7f3f06934740: IPE: table_name table_name_009, closure_desc closure_desc_009, ty_desc ty_desc_009, label label_009, module module_009, srcloc src_file_009:src_span_009
+7f3f06934740: IPE: table_name table_name_000, closure_desc closure_desc_000, ty_desc ty_desc_000, label label_000, module module_000, srcloc src_file_000:src_span_000
+7f3f06934740: IPE: table_name table_name_001, closure_desc closure_desc_001, ty_desc ty_desc_001, label label_001, module module_001, srcloc src_file_001:src_span_001
+7f3f06934740: IPE: table_name table_name_002, closure_desc closure_desc_002, ty_desc ty_desc_002, label label_002, module module_002, srcloc src_file_002:src_span_002
+7f3f06934740: IPE: table_name table_name_003, closure_desc closure_desc_003, ty_desc ty_desc_003, label label_003, module module_003, srcloc src_file_003:src_span_003
+7f3f06934740: IPE: table_name table_name_004, closure_desc closure_desc_004, ty_desc ty_desc_004, label label_004, module module_004, srcloc src_file_004:src_span_004
+7f3f06934740: IPE: table_name table_name_005, closure_desc closure_desc_005, ty_desc ty_desc_005, label label_005, module module_005, srcloc src_file_005:src_span_005
+7f3f06934740: IPE: table_name table_name_006, closure_desc closure_desc_006, ty_desc ty_desc_006, label label_006, module module_006, srcloc src_file_006:src_span_006
+7f3f06934740: IPE: table_name table_name_007, closure_desc closure_desc_007, ty_desc ty_desc_007, label label_007, module module_007, srcloc src_file_007:src_span_007
+7f3f06934740: IPE: table_name table_name_008, closure_desc closure_desc_008, ty_desc ty_desc_008, label label_008, module module_008, srcloc src_file_008:src_span_008
+7f3f06934740: IPE: table_name table_name_009, closure_desc closure_desc_009, ty_desc ty_desc_009, label label_009, module module_009, srcloc src_file_009:src_span_009


=====================================
testsuite/tests/rts/ipeEventLog_lib.c
=====================================
@@ -1,42 +1,83 @@
 #include "Rts.h"
 #include "rts/IPE.h"
 #include <string.h>
+#include "ipeEventLog_lib.h"
 
-InfoProvEnt *makeAnyProvEntry(Capability *cap, int i) {
+void init_string_table(StringTable *st) {
+    st->size = 128;
+    st->n = 0;
+    st->buffer = malloc(st->size);
+}
+
+uint32_t add_string(StringTable *st, const char *s) {
+    const size_t len = strlen(s);
+    const uint32_t n = st->n;
+    if (st->n + len + 1 > st->size) {
+        const size_t new_size = 2*st->size + len;
+        st->buffer = realloc(st->buffer, new_size);
+        st->size = new_size;
+    }
+
+    memcpy(&st->buffer[st->n], s, len);
+    st->n += len;
+    st->buffer[st->n] = '\0';
+    st->n += 1;
+    return n;
+}
+
+IpeBufferEntry makeAnyProvEntry(Capability *cap, StringTable *st, int i) {
     HaskellObj fourtyTwo = rts_mkInt(cap, 42);
 
-    InfoProvEnt *provEnt = malloc(sizeof(InfoProvEnt));
-    provEnt->info = (StgInfoTable *)fourtyTwo->header.info;
+    IpeBufferEntry provEnt;
+    provEnt.info = (StgInfoTable *)fourtyTwo->header.info;
 
     unsigned int tableNameLength = strlen("table_name_") + 3 /* digits */ + 1 /* null character */;
     char *tableName = malloc(sizeof(char) * tableNameLength);
     snprintf(tableName, tableNameLength, "table_name_%03i", i);
-    provEnt->prov.table_name = tableName;
+    provEnt.table_name = add_string(st, tableName);
 
     unsigned int closureDescLength = strlen("closure_desc_") + 3 /* digits */ + 1 /* null character */;
     char *closureDesc = malloc(sizeof(char) * closureDescLength);
     snprintf(closureDesc, closureDescLength, "closure_desc_%03i", i);
-    provEnt->prov.closure_desc = closureDesc;
+    provEnt.closure_desc = add_string(st, closureDesc);
 
     unsigned int tyDescLength = strlen("ty_desc_") + 3 /* digits */ + 1 /* null character */;
     char *tyDesc = malloc(sizeof(char) * tyDescLength);
     snprintf(tyDesc, tyDescLength, "ty_desc_%03i", i);
-    provEnt->prov.ty_desc = tyDesc;
+    provEnt.ty_desc = add_string(st, tyDesc);
 
     unsigned int labelLength = strlen("label_") + 3 /* digits */ + 1 /* null character */;
     char *label = malloc(sizeof(char) * labelLength);
     snprintf(label, labelLength, "label_%03i", i);
-    provEnt->prov.label = label;
+    provEnt.label = add_string(st, label);
 
     unsigned int moduleLength = strlen("module_") + 3 /* digits */ + 1 /* null character */;
     char *module = malloc(sizeof(char) * labelLength);
     snprintf(module, moduleLength, "module_%03i", i);
-    provEnt->prov.module = module;
+    provEnt.module_name = add_string(st, module);
+
+    unsigned int srcFileLength = strlen("src_file_") + 3 /* digits */ + 1 /* null character */;
+    char *srcFile = malloc(sizeof(char) * srcFileLength);
+    snprintf(srcFile, srcFileLength, "src_file_%03i", i);
+    provEnt.src_file = add_string(st, srcFile);
 
-    unsigned int srcLocLength = strlen("srcloc_") + 3 /* digits */ + 1 /* null character */;
-    char *srcLoc = malloc(sizeof(char) * srcLocLength);
-    snprintf(srcLoc, srcLocLength, "srcloc_%03i", i);
-    provEnt->prov.srcloc = srcLoc;
+    unsigned int srcSpanLength = strlen("src_span_") + 3 /* digits */ + 1 /* null character */;
+    char *srcSpan = malloc(sizeof(char) * srcSpanLength);
+    snprintf(srcSpan, srcSpanLength, "src_span_%03i", i);
+    provEnt.src_span = add_string(st, srcSpan);
 
     return provEnt;
 }
+
+IpeBufferListNode *makeAnyProvEntries(Capability *cap, int n) {
+    IpeBufferListNode *node = malloc(sizeof(IpeBufferListNode) + n * sizeof(IpeBufferEntry));
+    StringTable st;
+    init_string_table(&st);
+    for (int i=0; i < n; i++) {
+        node->entries[i] = makeAnyProvEntry(cap, &st, i);
+    }
+    node->next = NULL;
+    node->count = n;
+    node->string_table = st.buffer;
+    return node;
+}


=====================================
testsuite/tests/rts/ipeEventLog_lib.h
=====================================
@@ -0,0 +1,17 @@
+#pragma once
+
+#include "Rts.h"
+
+typedef struct {
+    char *buffer;
+    size_t n;
+    size_t size;
+} StringTable;
+
+void init_string_table(StringTable *st);
+uint32_t add_string(StringTable *st, const char *s);
+
+IpeBufferListNode *makeAnyProvEntries(Capability *cap, int n);
+IpeBufferEntry makeAnyProvEntry(Capability *cap, StringTable *st, int i);
+void dumpIPEToEventLog(void);
+



View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/dafb357befbd39f54b2d16cff89e32845fc187ff...ebc644c1721a309279a996f7ab2917cc8b8044a1

-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/dafb357befbd39f54b2d16cff89e32845fc187ff...ebc644c1721a309279a996f7ab2917cc8b8044a1
You're receiving this email because of your account on gitlab.haskell.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20220819/5570d6c8/attachment-0001.html>


More information about the ghc-commits mailing list