From ce2046fc61fffa9deb2b1240eee66f182572ed48 Mon Sep 17 00:00:00 2001 From: Sven Tennie Date: Thu, 13 May 2021 15:26:32 +0200 Subject: Optimize Info Table Provenance Entries (IPEs) Map creation and lookup 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 --- compiler/GHC/StgToCmm/Prof.hs | 2 +- rts/IPE.c | 197 ++++++++++--- rts/IPE.h | 20 +- rts/RtsStartup.c | 3 + rts/RtsSymbols.c | 1 - rts/Trace.c | 11 + rts/include/rts/IPE.h | 24 +- testsuite/config/ghc | 3 + testsuite/tests/rts/Makefile | 6 + testsuite/tests/rts/all.T | 46 +++ testsuite/tests/rts/ipeEventLog.c | 60 ++++ testsuite/tests/rts/ipeEventLog.stderr | 383 +++++++++++++++++++++++++ testsuite/tests/rts/ipeEventLog_fromMap.c | 35 +++ testsuite/tests/rts/ipeEventLog_fromMap.stderr | 2 + testsuite/tests/rts/ipeEventLog_lib.c | 42 +++ testsuite/tests/rts/ipeMap.c | 208 ++++++++++++++ 16 files changed, 985 insertions(+), 58 deletions(-) create mode 100644 testsuite/tests/rts/ipeEventLog.c create mode 100644 testsuite/tests/rts/ipeEventLog.stderr create mode 100644 testsuite/tests/rts/ipeEventLog_fromMap.c create mode 100644 testsuite/tests/rts/ipeEventLog_fromMap.stderr create mode 100644 testsuite/tests/rts/ipeEventLog_lib.c create mode 100644 testsuite/tests/rts/ipeMap.c 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 #include - #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 #include "Rts.h" +#include #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 +#include +#include + +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 +#include +#include + +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 + +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 + +#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); + } +} -- cgit v1.2.1