summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Tennie <sven.tennie@gmail.com>2021-05-13 15:26:32 +0200
committerSven Tennie <sven.tennie@gmail.com>2021-08-11 10:54:39 +0200
commitce2046fc61fffa9deb2b1240eee66f182572ed48 (patch)
treec9ac086d67f087dd35854707fd6252438445eb05
parent8b9acc4d58f51dcbae73c8226ef876218809fd79 (diff)
downloadhaskell-ce2046fc61fffa9deb2b1240eee66f182572ed48.tar.gz
Optimize Info Table Provenance Entries (IPEs) Map creation and lookupwip/IPE_hashmap
Using a hash map reduces the complexity of lookupIPE(), making it non linear. On registration each IPE list is added to a temporary IPE lists buffer, reducing registration time. The hash map is built lazily on first lookup. IPE event output to stderr is added with tests. For details, please see Note [The Info Table Provenance Entry (IPE) Map]. A performance test for IPE registration and lookup can be found here: https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5724#note_370806
-rw-r--r--compiler/GHC/StgToCmm/Prof.hs2
-rw-r--r--rts/IPE.c197
-rw-r--r--rts/IPE.h20
-rw-r--r--rts/RtsStartup.c3
-rw-r--r--rts/RtsSymbols.c1
-rw-r--r--rts/Trace.c11
-rw-r--r--rts/include/rts/IPE.h24
-rw-r--r--testsuite/config/ghc3
-rw-r--r--testsuite/tests/rts/Makefile6
-rw-r--r--testsuite/tests/rts/all.T46
-rw-r--r--testsuite/tests/rts/ipeEventLog.c60
-rw-r--r--testsuite/tests/rts/ipeEventLog.stderr383
-rw-r--r--testsuite/tests/rts/ipeEventLog_fromMap.c35
-rw-r--r--testsuite/tests/rts/ipeEventLog_fromMap.stderr2
-rw-r--r--testsuite/tests/rts/ipeEventLog_lib.c42
-rw-r--r--testsuite/tests/rts/ipeMap.c208
16 files changed, 985 insertions, 58 deletions
diff --git a/compiler/GHC/StgToCmm/Prof.hs b/compiler/GHC/StgToCmm/Prof.hs
index 08a06f3242..58fdfeafd9 100644
--- a/compiler/GHC/StgToCmm/Prof.hs
+++ b/compiler/GHC/StgToCmm/Prof.hs
@@ -288,7 +288,7 @@ initInfoTableProv infos itmap this_mod
--pprTraceM "initInfoTable" (ppr (length ents))
-- Output the actual IPE data
mapM_ emitInfoTableProv ents
- -- Create the C stub which initialises the IPE_LIST
+ -- Create the C stub which initialises the IPE map
return (ipInitCode dflags this_mod ents)
--- Info Table Prov stuff
diff --git a/rts/IPE.c b/rts/IPE.c
index 122331e066..19db89a063 100644
--- a/rts/IPE.c
+++ b/rts/IPE.c
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1998-2000
+ * (c) The GHC Team, 1998-2021
*
* Support for mapping info table pointers to source locations
*
@@ -10,72 +10,189 @@
#include "rts/PosixSource.h"
#include "Rts.h"
-#include "RtsUtils.h"
-#include "Profiling.h"
#include "Arena.h"
+#include "Capability.h"
+#include "Hash.h"
#include "IPE.h"
#include "Printer.h"
-#include "Capability.h"
+#include "Profiling.h"
+#include "RtsUtils.h"
#include <fs_rts.h>
#include <string.h>
-
#if defined(TRACING)
#include "Trace.h"
#endif
-InfoProvEnt *IPE_LIST = NULL;
+/*
+Note [The Info Table Provenance Entry (IPE) Map]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+IPEs are stored in a hash map from info table address (pointer) to IPE. This
+ensures cheap lookup and traversal.
+
+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:
-void dumpIPEToEventLog(void)
-{
+- 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.
+
+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.
+
+After the content of a IpeBufferListNode has been inserted, it's freed.
+*/
+
+static HashTable *ipeMap = NULL;
+
+static IpeBufferListNode *ipeBufferList = NULL;
+
+static Mutex ipeMapLock;
+
+void initIpeMapLock(void) { initMutex(&ipeMapLock); }
+
+void closeIpeMapLock(void) { closeMutex(&ipeMapLock); }
+
+void dumpIPEToEventLog(void) {
#if defined(TRACING)
- InfoProvEnt *ip, *next;
- for (ip = IPE_LIST; ip != NULL; ip = next) {
- next = ip->link;
- traceIPE(ip->info, ip->prov.table_name, ip->prov.closure_desc, ip->prov.ty_desc
- , ip->prov.label, ip->prov.module, ip->prov.srcloc);
+ ACQUIRE_LOCK(&ipeMapLock);
+
+ IpeBufferListNode *cursor = 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->info, ipe->prov.table_name,
+ ipe->prov.closure_desc, ipe->prov.ty_desc,
+ ipe->prov.label, ipe->prov.module, ipe->prov.srcloc);
+ }
+ }
+
+ cursor = cursor->next;
+ }
+
+ if (ipeMap != NULL) {
+ mapHashTable(ipeMap, NULL, &traceIPEFromHashTable);
}
+
+ RELEASE_LOCK(&ipeMapLock);
#endif
return;
}
+#if defined(TRACING)
+void traceIPEFromHashTable(void *data STG_UNUSED, StgWord key STG_UNUSED,
+ const void *value) {
+ InfoProvEnt *ipe = (InfoProvEnt *)value;
-/* -----------------------------------------------------------------------------
- Registering IPEs
+ traceIPE(ipe->info, ipe->prov.table_name, ipe->prov.closure_desc,
+ ipe->prov.ty_desc, ipe->prov.label, ipe->prov.module,
+ ipe->prov.srcloc);
+}
+#endif
- Registering a IPE consists of linking it onto the list of registered IPEs
+/* Registering IPEs
- IPEs are registered at startup by a C constructor function
- generated by the compiler (ProfInit.hs) in the _stub.c file for each module.
- -------------------------------------------------------------------------- */
+Adds the ent_list to the temporary buffer structure described in
+Note [The Info Table Provenance Entry (IPE) Map].
-static void
-registerInfoProvEnt(InfoProvEnt *ipe)
-{
- ASSERT(ipe->link == NULL);
- ipe->link = IPE_LIST;
- IPE_LIST = ipe;
-}
+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.
+
+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);
-void registerInfoProvList(InfoProvEnt **ent_list)
-{
- for (InfoProvEnt **i = ent_list; *i != NULL; i++) {
- registerInfoProvEnt(*i);
+ // 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);
+ }
}
+
+ RELEASE_LOCK(&ipeMapLock);
+}
+
+InfoProvEnt *lookupIPE(StgInfoTable *info) {
+ updateIpeMap();
+ return lookupHashTable(ipeMap, (StgWord)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) {
+ return;
+ }
+
+ ACQUIRE_LOCK(&ipeMapLock);
-// MP: TODO: This should not be a linear search, need to improve
-// the IPE_LIST structure
-InfoProvEnt * lookupIPE(StgInfoTable *info)
-{
- InfoProvEnt *ip, *next;
- for (ip = IPE_LIST; ip != NULL; ip = next) {
- if (ip->info == info) {
- return ip;
+ if (ipeMap == NULL) {
+ 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);
+ }
}
- next = ip->link;
+
+ ipeBufferList = currentNode->next;
+ stgFree(currentNode);
}
- return NULL;
+
+ RELEASE_LOCK(&ipeMapLock);
}
diff --git a/rts/IPE.h b/rts/IPE.h
index 48b4c62f00..064ff9d7ad 100644
--- a/rts/IPE.h
+++ b/rts/IPE.h
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 1998-2005
+ * (c) The GHC Team, 1998-2021
*
* Support for IPE
*
@@ -8,11 +8,27 @@
#pragma once
-#include <stdio.h>
#include "Rts.h"
+#include <stdio.h>
#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);
+
+#if defined(TRACING)
+void traceIPEFromHashTable(void *data STG_UNUSED, StgWord key STG_UNUSED,
+ const void *value);
+#endif
#include "EndPrivate.h"
diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c
index 371c96d08c..86d5b2f2d9 100644
--- a/rts/RtsStartup.c
+++ b/rts/RtsStartup.c
@@ -370,6 +370,7 @@ hs_init_ghc(int *argc, char **argv[], RtsConfig rts_config)
#if defined(PROFILING)
initProfiling();
#endif
+ initIpeMapLock();
traceInitEvent(dumpIPEToEventLog);
initHeapProfiling();
@@ -593,6 +594,8 @@ hs_exit_(bool wait_foreign)
// Free threading resources
freeThreadingResources();
+
+ closeIpeMapLock();
}
// Flush stdout and stderr. We do this during shutdown so that it
diff --git a/rts/RtsSymbols.c b/rts/RtsSymbols.c
index 0632dfa6df..b17d017c31 100644
--- a/rts/RtsSymbols.c
+++ b/rts/RtsSymbols.c
@@ -536,7 +536,6 @@
#define RTS_PROF_SYMBOLS \
SymI_HasProto(CCS_DONT_CARE) \
SymI_HasProto(CC_LIST) \
- SymI_HasProto(IPE_LIST) \
SymI_HasProto(stg_restore_cccs_info) \
SymI_HasProto(enterFunCCS) \
SymI_HasProto(pushCostCentre) \
diff --git a/rts/Trace.c b/rts/Trace.c
index d08b19a69d..8f2877a536 100644
--- a/rts/Trace.c
+++ b/rts/Trace.c
@@ -668,6 +668,17 @@ void traceIPE(StgInfoTable * info,
const char *module,
const char *srcloc )
{
+#if defined(DEBUG)
+ if (RtsFlags.TraceFlags.tracing == TRACE_STDERR) {
+ ACQUIRE_LOCK(&trace_utx);
+
+ tracePreface();
+ debugBelch("IPE: table_name %s, closure_desc %s, ty_desc %s, label %s, module %s, srcloc %s\n",
+ table_name, closure_desc, ty_desc, label, module, srcloc);
+
+ RELEASE_LOCK(&trace_utx);
+ } else
+#endif
if (eventlog_enabled) {
postIPE((W_) INFO_PTR_TO_STRUCT(info), table_name, closure_desc, ty_desc, label, module, srcloc);
}
diff --git a/rts/include/rts/IPE.h b/rts/include/rts/IPE.h
index 81a6d553d0..07026979d8 100644
--- a/rts/include/rts/IPE.h
+++ b/rts/include/rts/IPE.h
@@ -1,6 +1,6 @@
/* -----------------------------------------------------------------------------
*
- * (c) The GHC Team, 2017-2018
+ * (c) The GHC Team, 2017-2021
*
* IPE API
*
@@ -13,23 +13,19 @@
#pragma once
-
-typedef struct InfoProv_{
- char * table_name;
- char * closure_desc;
- char * ty_desc;
- char * label;
- char * module;
- char * srcloc;
+typedef struct InfoProv_ {
+ char *table_name;
+ char *closure_desc;
+ char *ty_desc;
+ char *label;
+ char *module;
+ char *srcloc;
} InfoProv;
typedef struct InfoProvEnt_ {
- StgInfoTable * info;
+ StgInfoTable *info;
InfoProv prov;
- struct InfoProvEnt_ *link;
} InfoProvEnt;
-extern InfoProvEnt * RTS_VAR(IPE_LIST); // registered IP list
-
void registerInfoProvList(InfoProvEnt **cc_list);
-InfoProvEnt * lookupIPE(StgInfoTable *info);
+InfoProvEnt *lookupIPE(StgInfoTable *info);
diff --git a/testsuite/config/ghc b/testsuite/config/ghc
index 4ecdc5bcb0..6d90e83397 100644
--- a/testsuite/config/ghc
+++ b/testsuite/config/ghc
@@ -163,6 +163,9 @@ config.way_rts_flags = {
prof_ways = [x[0] for x in config.way_flags.items()
if '-prof' in x[1]]
+debug_ways = [x[0] for x in config.way_flags.items()
+ if '-debug' in x[1]]
+
threaded_ways = [x[0] for x in config.way_flags.items()
if '-threaded' in x[1] or 'ghci' == x[0]]
diff --git a/testsuite/tests/rts/Makefile b/testsuite/tests/rts/Makefile
index 9350caf9ec..0048b4fe41 100644
--- a/testsuite/tests/rts/Makefile
+++ b/testsuite/tests/rts/Makefile
@@ -135,3 +135,9 @@ EventlogOutput2:
T20199:
"$(TEST_HC)" -no-hs-main -v0 T20199.cpp -o T20199
./T20199
+
+.PHONY: EventlogOutput_IPE
+EventlogOutput_IPE:
+ "$(TEST_HC)" -debug -finfo-table-map -v0 EventlogOutput.hs
+ ./EventlogOutput +RTS -va 2> EventlogOutput_IPE.stderr.log
+ grep "IPE:" EventlogOutput_IPE.stderr.log
diff --git a/testsuite/tests/rts/all.T b/testsuite/tests/rts/all.T
index aeab6b4b2e..d2146a3f48 100644
--- a/testsuite/tests/rts/all.T
+++ b/testsuite/tests/rts/all.T
@@ -171,6 +171,50 @@ test('EventlogOutput2',
omit_ways(['dyn', 'ghci'] + prof_ways) ],
makefile_test, ['EventlogOutput2'])
+# Test that Info Table Provenance (IPE) events are emitted.
+test('EventlogOutput_IPE',
+ [ extra_files(["EventlogOutput.hs"]),
+ only_ways(debug_ways),
+ ignore_stdout,
+ ignore_stderr
+ ],
+ makefile_test, ['EventlogOutput_IPE'])
+
+# Remove the capability prefix from IPE event log lines.
+def noCapabilityOutputFilter(s):
+ return re.sub(r'[a-f0-9]+: IPE:', 'IPE:', s)
+
+# Manually create IPE entries and dump them to event log (stderr).
+test('ipeEventLog',
+ [ c_src,
+ extra_files(['ipeEventLog_lib.c']),
+ extra_run_opts('+RTS -va -RTS'),
+ grep_errmsg('IPE:'),
+ only_ways(debug_ways),
+ normalise_errmsg_fun(noCapabilityOutputFilter),
+ ignore_stdout,
+ # Due to issues on Darwin CI runners that couldn't be tracked down.
+ # In general this test should work on Darwin - Just not on our CI.
+ when(opsys('darwin'), fragile(0))
+ ],
+ compile_and_run, ['ipeEventLog_lib.c -eventlog'])
+
+# Manually create IPE entries, force the initialization of the underlying hash map
+# and dump them to event log (stderr).
+test('ipeEventLog_fromMap',
+ [ c_src,
+ extra_files(['ipeEventLog_lib.c']),
+ extra_run_opts('+RTS -va -RTS'),
+ grep_errmsg('IPE:'),
+ only_ways(debug_ways),
+ normalise_errmsg_fun(noCapabilityOutputFilter),
+ ignore_stdout,
+ # Due to issues on Darwin CI runners that couldn't be tracked down.
+ # In general this test should work on Darwin - Just not on our CI.
+ when(opsys('darwin'), fragile(0))
+ ],
+ compile_and_run, ['ipeEventLog_lib.c -eventlog'])
+
test('T4059', [], makefile_test, ['T4059'])
# Test for #4274
@@ -440,3 +484,5 @@ test('T15427', normal, compile_and_run, [''])
test('T19481', extra_run_opts('+RTS -T -RTS'), compile_and_run, [''])
test('T19381', extra_run_opts('+RTS -T -RTS'), compile_and_run, [''])
test('T20199', normal, makefile_test, [])
+
+test('ipeMap', [c_src], compile_and_run, [''])
diff --git a/testsuite/tests/rts/ipeEventLog.c b/testsuite/tests/rts/ipeEventLog.c
new file mode 100644
index 0000000000..9260269f5a
--- /dev/null
+++ b/testsuite/tests/rts/ipeEventLog.c
@@ -0,0 +1,60 @@
+#include "Rts.h"
+#include "RtsAPI.h"
+#include "rts/IPE.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern void dumpIPEToEventLog(void);
+InfoProvEnt *makeAnyProvEntry(Capability *cap, int i);
+
+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;
+
+ registerInfoProvList(ipeList_2);
+
+ // Trace all IPE events. Expected count (see Makefile): 381 + 2 = 383
+ dumpIPEToEventLog();
+
+ rts_unlock(cap);
+ hs_exit();
+}
diff --git a/testsuite/tests/rts/ipeEventLog.stderr b/testsuite/tests/rts/ipeEventLog.stderr
new file mode 100644
index 0000000000..95e012c710
--- /dev/null
+++ b/testsuite/tests/rts/ipeEventLog.stderr
@@ -0,0 +1,383 @@
+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
diff --git a/testsuite/tests/rts/ipeEventLog_fromMap.c b/testsuite/tests/rts/ipeEventLog_fromMap.c
new file mode 100644
index 0000000000..5bd9e4d034
--- /dev/null
+++ b/testsuite/tests/rts/ipeEventLog_fromMap.c
@@ -0,0 +1,35 @@
+#include "Rts.h"
+#include "RtsAPI.h"
+#include "rts/IPE.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+extern void dumpIPEToEventLog(void);
+InfoProvEnt *makeAnyProvEntry(Capability *cap, int i);
+
+int main(int argc, char *argv[]) {
+ hs_init(&argc, &argv);
+ Capability *cap = rts_lock();
+
+ 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;
+
+ registerInfoProvList(ipeList_1);
+
+ // Query an IPE to initialize the underlying hash map.
+ lookupIPE(ipeList_1[0]->info);
+
+ // Trace all IPE events.
+ dumpIPEToEventLog();
+
+ rts_unlock(cap);
+ hs_exit();
+}
diff --git a/testsuite/tests/rts/ipeEventLog_fromMap.stderr b/testsuite/tests/rts/ipeEventLog_fromMap.stderr
new file mode 100644
index 0000000000..7ad1fb998a
--- /dev/null
+++ b/testsuite/tests/rts/ipeEventLog_fromMap.stderr
@@ -0,0 +1,2 @@
+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
diff --git a/testsuite/tests/rts/ipeEventLog_lib.c b/testsuite/tests/rts/ipeEventLog_lib.c
new file mode 100644
index 0000000000..df54231fa7
--- /dev/null
+++ b/testsuite/tests/rts/ipeEventLog_lib.c
@@ -0,0 +1,42 @@
+#include "Rts.h"
+#include "rts/IPE.h"
+#include <string.h>
+
+InfoProvEnt *makeAnyProvEntry(Capability *cap, int i) {
+ HaskellObj fourtyTwo = rts_mkInt(cap, 42);
+
+ InfoProvEnt *provEnt = malloc(sizeof(InfoProvEnt));
+ 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;
+
+ 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;
+
+ 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;
+
+ 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;
+
+ 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;
+
+ 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;
+
+ return provEnt;
+}
diff --git a/testsuite/tests/rts/ipeMap.c b/testsuite/tests/rts/ipeMap.c
new file mode 100644
index 0000000000..809be60534
--- /dev/null
+++ b/testsuite/tests/rts/ipeMap.c
@@ -0,0 +1,208 @@
+#include <stdlib.h>
+
+#include "Rts.h"
+
+void assertStringsEqual(char *s1, char *s2);
+void shouldFindNothingInAnEmptyIPEMap(Capability *cap);
+HaskellObj shouldFindOneIfItHasBeenRegistered(Capability *cap);
+void shouldFindTwoIfTwoHaveBeenRegistered(Capability *cap, HaskellObj fortyTwo);
+void shouldFindTwoFromTheSameList(Capability *cap);
+void shouldFindTheLastEntryOfManyLists(Capability *cap);
+void shouldDealWithAnEmptyList(Capability *cap, HaskellObj);
+
+// This is a unit test for IPE.c, the IPE map.
+// Due to the nature of IPE having static state, the test cases are not
+// independent of each other!
+int main(int argc, char *argv[]) {
+ hs_init(&argc, &argv);
+ Capability *cap = rts_lock();
+
+ shouldFindNothingInAnEmptyIPEMap(cap);
+ HaskellObj fortyTwo = shouldFindOneIfItHasBeenRegistered(cap);
+ shouldFindTwoIfTwoHaveBeenRegistered(cap, fortyTwo);
+ shouldFindTwoFromTheSameList(cap);
+ shouldFindTheLastEntryOfManyLists(cap);
+ shouldDealWithAnEmptyList(cap, fortyTwo);
+
+ rts_unlock(cap);
+ hs_exit();
+}
+
+void shouldFindNothingInAnEmptyIPEMap(Capability *cap) {
+ HaskellObj fortyTwo = rts_mkInt(cap, 42);
+
+ InfoProvEnt *result = lookupIPE((StgInfoTable *)fortyTwo->header.info);
+
+ if (result != NULL) {
+ errorBelch("Found entry in an empty IPE map!");
+ exit(1);
+ }
+}
+
+HaskellObj shouldFindOneIfItHasBeenRegistered(Capability *cap) {
+ HaskellObj fortyTwo = rts_mkInt(cap, 42);
+
+ InfoProvEnt *provEnt = malloc(sizeof(InfoProvEnt));
+ provEnt->info = (StgInfoTable *)fortyTwo->header.info;
+ provEnt->prov.table_name = "table_name_42";
+ provEnt->prov.closure_desc = "closure_desc_42";
+ provEnt->prov.ty_desc = "ty_desc_42";
+ provEnt->prov.label = "label_42";
+ provEnt->prov.module = "module_42";
+ provEnt->prov.srcloc = "srcloc_42";
+
+ InfoProvEnt *ipeList[] = {provEnt, NULL};
+
+ registerInfoProvList(ipeList);
+ InfoProvEnt *result = lookupIPE((StgInfoTable *)fortyTwo->header.info);
+
+ if (result == NULL) {
+ errorBelch("Found no entry in IPE map!");
+ exit(1);
+ }
+
+ assertStringsEqual(result->prov.table_name, "table_name_42");
+ assertStringsEqual(result->prov.closure_desc, "closure_desc_42");
+ assertStringsEqual(result->prov.ty_desc, "ty_desc_42");
+ assertStringsEqual(result->prov.label, "label_42");
+ assertStringsEqual(result->prov.module, "module_42");
+ assertStringsEqual(result->prov.srcloc, "srcloc_42");
+
+ return fortyTwo;
+}
+
+void shouldFindTwoIfTwoHaveBeenRegistered(Capability *cap,
+ HaskellObj fortyTwo) {
+ HaskellObj twentyThree = rts_mkInt(cap, 23);
+
+ InfoProvEnt *provEnt = malloc(sizeof(InfoProvEnt));
+ provEnt->info = (StgInfoTable *)twentyThree->header.info;
+ provEnt->prov.table_name = "table_name_23";
+ provEnt->prov.closure_desc = "closure_desc_23";
+ provEnt->prov.ty_desc = "ty_desc_23";
+ provEnt->prov.label = "label_23";
+ provEnt->prov.module = "module_23";
+ provEnt->prov.srcloc = "srcloc_23";
+
+ InfoProvEnt *ipeList[] = {provEnt, NULL};
+
+ registerInfoProvList(ipeList);
+
+ InfoProvEnt *resultFortyTwo =
+ lookupIPE((StgInfoTable *)fortyTwo->header.info);
+ InfoProvEnt *resultTwentyThree =
+ lookupIPE((StgInfoTable *)twentyThree->header.info);
+
+ if (resultFortyTwo == NULL || resultTwentyThree == NULL) {
+ errorBelch("Found no entry in IPE map!");
+ exit(1);
+ }
+
+ assertStringsEqual(resultFortyTwo->prov.table_name, "table_name_42");
+ assertStringsEqual(resultTwentyThree->prov.table_name, "table_name_23");
+}
+
+void shouldFindTwoFromTheSameList(Capability *cap) {
+ HaskellObj one = rts_mkInt(cap, 1);
+
+ InfoProvEnt *provEntOne = malloc(sizeof(InfoProvEnt));
+ provEntOne->info = (StgInfoTable *)one->header.info;
+ provEntOne->prov.table_name = "table_name_1";
+ provEntOne->prov.closure_desc = "closure_desc_1";
+ provEntOne->prov.ty_desc = "ty_desc_1";
+ provEntOne->prov.label = "label_1";
+ provEntOne->prov.module = "module_1";
+ provEntOne->prov.srcloc = "srcloc_1";
+
+ HaskellObj two = rts_mkInt(cap, 2);
+
+ InfoProvEnt *provEntTwo = malloc(sizeof(InfoProvEnt));
+ provEntTwo->info = (StgInfoTable *)two->header.info;
+ provEntTwo->prov.table_name = "table_name_2";
+ provEntTwo->prov.closure_desc = "closure_desc_2";
+ provEntTwo->prov.ty_desc = "ty_desc_2";
+ provEntTwo->prov.label = "label_2";
+ provEntTwo->prov.module = "module_2";
+ provEntTwo->prov.srcloc = "srcloc_2";
+
+ InfoProvEnt *ipeList[] = {provEntOne, provEntTwo, NULL};
+
+ registerInfoProvList(ipeList);
+
+ InfoProvEnt *resultOne = lookupIPE((StgInfoTable *)one->header.info);
+ InfoProvEnt *resultTwo = lookupIPE((StgInfoTable *)two->header.info);
+
+ if (resultOne == NULL || resultOne == NULL) {
+ errorBelch("Found no entry in IPE map!");
+ exit(1);
+ }
+
+ assertStringsEqual(resultOne->prov.table_name, "table_name_1");
+ assertStringsEqual(resultTwo->prov.table_name, "table_name_2");
+}
+
+void shouldFindTheLastEntryOfManyLists(Capability *cap) {
+ HaskellObj three = rts_mkInt(cap, 3);
+
+ InfoProvEnt *provEntThree = malloc(sizeof(InfoProvEnt));
+ provEntThree->info = (StgInfoTable *)three->header.info;
+ provEntThree->prov.table_name = "table_name_3";
+ provEntThree->prov.closure_desc = "closure_desc_3";
+ provEntThree->prov.ty_desc = "ty_desc_3";
+ provEntThree->prov.label = "label_3";
+ provEntThree->prov.module = "module_3";
+ provEntThree->prov.srcloc = "srcloc_3";
+
+ HaskellObj four = rts_mkInt(cap, 4);
+
+ InfoProvEnt *provEntFour = malloc(sizeof(InfoProvEnt));
+ provEntFour->info = (StgInfoTable *)four->header.info;
+ provEntFour->prov.table_name = "table_name_4";
+ provEntFour->prov.closure_desc = "closure_desc_4";
+ provEntFour->prov.ty_desc = "ty_desc_4";
+ provEntFour->prov.label = "label_4";
+ provEntFour->prov.module = "module_4";
+ provEntFour->prov.srcloc = "srcloc_4";
+
+ InfoProvEnt *ipeListThree[] = {provEntThree, NULL};
+ InfoProvEnt *ipeListFour[] = {provEntFour, NULL};
+
+ // Force the creation of 4 IpeBufferListNodes
+ for (int i = 0; i <= 126 * 3 + 1; i++) {
+ registerInfoProvList(ipeListThree);
+ }
+
+ registerInfoProvList(ipeListFour);
+
+ InfoProvEnt *resultFour = lookupIPE((StgInfoTable *)four->header.info);
+
+ if (resultFour == NULL) {
+ errorBelch("Found no entry in IPE map!");
+ exit(1);
+ }
+
+ assertStringsEqual(resultFour->prov.table_name, "table_name_4");
+}
+
+void shouldDealWithAnEmptyList(Capability *cap, HaskellObj fortyTwo) {
+ InfoProvEnt *emptyIpeList[] = {NULL};
+
+ registerInfoProvList(emptyIpeList);
+
+ InfoProvEnt *resultFortyTwo =
+ lookupIPE((StgInfoTable *)fortyTwo->header.info);
+
+ if (resultFortyTwo == NULL) {
+ errorBelch("Found no entry in IPE map!");
+ exit(1);
+ }
+
+ assertStringsEqual(resultFortyTwo->prov.table_name, "table_name_42");
+}
+
+void assertStringsEqual(char *s1, char *s2) {
+ if (strcmp(s1, s2) != 0) {
+ errorBelch("%s != %s", s1, s2);
+ exit(1);
+ }
+}