David Eichmann pushed to branch wip/davide/windows-dlls_sysm-test_master at Glasgow Haskell Compiler / GHC Commits: a25c8151 by David Eichmann at 2026-10-28T16:40:37+00:00 rts: Expose RtsSymbol types - - - - - cb75f8d0 by David Eichmann at 2026-10-28T16:40:38+00:00 rts: Expose getRtsSymbols function - - - - - a9ffd1c8 by David Eichmann at 2026-10-28T16:40:38+00:00 hadrian: when running tests, properly set have_gdb and have_readelf - - - - - 03165b94 by David Eichmann at 2026-10-28T16:40:38+00:00 testsuite: add have_ldd() test modifier - - - - - 245f1084 by David Eichmann at 2026-10-28T16:40:38+00:00 Add golden test for rts/RtsSymbols.c This test compares declared symbols against symbols observed in the rts DSO (.so file). - - - - - e6cbcb99 by David Eichmann at 2026-10-28T16:40:38+00:00 RtsSymbols stores redirect labels Redirect labels are used by the rts-check-symbols test - - - - - 15844942 by David Eichmann at 2026-10-28T16:40:38+00:00 getRtsSymbols returns owned array rather than poitner to cached array Callers must now free the returned array. - - - - - d142c539 by David Eichmann at 2026-10-28T16:40:38+00:00 RtsSymbols now tag external symbols - - - - - e2e18180 by David Eichmann at 2026-10-28T16:40:38+00:00 testsuite: rts-check-symbols: replace simbol ignore file with top level list - - - - - e20ca1f6 by David Eichmann at 2026-10-29T09:43:04+00:00 testsuite: rts-check-symbols: move more code into .sh file - - - - - 3e5798d9 by David Eichmann at 2026-10-29T09:43:04+00:00 testsuite: rts-check-symbols: remove unneeded #includes - - - - - 65291afe by David Eichmann at 2026-10-29T15:28:41+00:00 Run rts-check-symbols test over debug and threaded RTS - - - - - 19 changed files: - hadrian/src/Settings/Builders/RunTest.hs - rts/Linker.c - rts/LinkerInternals.h - rts/RtsSymbols.c - rts/RtsSymbols.h - rts/include/Rts.h - + rts/include/rts/RtsSymbols.h - rts/rts.cabal - testsuite/driver/runtests.py - testsuite/driver/testglobals.py - testsuite/driver/testlib.py - testsuite/mk/test.mk - testsuite/tests/ghci/linking/T25155_iserv_main.c - + testsuite/tests/rts/symbols/Main.hs - + testsuite/tests/rts/symbols/Makefile - + testsuite/tests/rts/symbols/all.T - + testsuite/tests/rts/symbols/dumpDeclaredSymbols.c - + testsuite/tests/rts/symbols/rts-check-symbols.sh - + testsuite/tests/rts/symbols/rts-check-symbols.stdout Changes: ===================================== hadrian/src/Settings/Builders/RunTest.hs ===================================== @@ -254,6 +254,10 @@ runTestBuilderArgs = builder Testsuite ? do let asBool :: String -> Bool -> String asBool s b = s ++ show b + have_gdb <- expr $ liftIO (isJust <$> findExecutable "gdb") + have_ldd <- expr $ liftIO (isJust <$> findExecutable "ldd") + have_readelf <- expr $ liftIO (isJust <$> findExecutable "readelf") + -- TODO: set CABAL_MINIMAL_BUILD/CABAL_PLUGIN_BUILD mconcat [ arg "-Wdefault" -- see #22727 , arg $ "testsuite/driver/runtests.py" @@ -274,6 +278,9 @@ runTestBuilderArgs = builder Testsuite ? do , arg "-e", arg $ asBool "ghc_with_native_codegen=" withNativeCodeGen , arg "-e", arg $ asBool "config.have_ncg=" withNativeCodeGen , arg "-e", arg $ asBool "config.have_llvm=" have_llvm + , arg "-e", arg $ asBool "config.have_gdb=" have_gdb + , arg "-e", arg $ asBool "config.have_ldd=" have_ldd + , arg "-e", arg $ asBool "config.have_readelf=" have_readelf , arg "-e", arg $ asBool "config.compiler_profiled=" profiled ===================================== rts/Linker.c ===================================== @@ -478,7 +478,18 @@ initLinker_ (int retain_cafs) symhash = allocStrHashTable(); /* populate the symbol table with stuff from the RTS */ - initLinkerRtsSyms(symhash); + const RtsSymbolVal * rtsSyms = getRtsSymbols(); + IF_DEBUG(linker, debugBelch("populating linker symbol table with built-in RTS symbols\n")); + for (const RtsSymbolVal *sym = rtsSyms; sym->lbl != NULL; sym++) { + IF_DEBUG(linker, debugBelch("initLinker: inserting rts symbol %s, %p\n", sym->lbl, sym->addr)); + if (! ghciInsertSymbolTable(WSTR("(GHCi built-in symbols)"), + symhash, sym->lbl, sym->addr, + sym->strength, sym->type, 0, NULL)) { + barf("ghciInsertSymbolTable failed"); + } + } + stgFree((void*)rtsSyms); + IF_DEBUG(linker, debugBelch("done with built-in RTS symbols\n")); /* Add extra symbols. rtsExtraSyms() is a weakly defined symbol in the rts, * that can be overrided by linking in an object with a corresponding ===================================== rts/LinkerInternals.h ===================================== @@ -9,7 +9,6 @@ #pragma once #include "Rts.h" -#include "RtsSymbols.h" #include "Hash.h" #include "linker/M32Alloc.h" #include "linker/ProddableBlocks.h" ===================================== rts/RtsSymbols.c ===================================== @@ -8,7 +8,9 @@ #include "ghcplatform.h" #include "Rts.h" +#include "RtsUtils.h" #include "RtsSymbols.h" +#include "RtsUtils.h" #include "LinkerInternals.h" #include "PathUtils.h" @@ -480,6 +482,7 @@ extern char **environ; RTS_TICKY_SYMBOLS \ RTS_PROF_SYMBOLS \ RTS_LIBDW_SYMBOLS \ + SymI_HasProto(getRtsSymbols) \ SymI_HasProto(StgReturn) \ SymI_HasDataProto(ghc_hs_iface) \ SymI_HasDataProto(stg_gc_noregs) \ @@ -1217,13 +1220,13 @@ RTS_SYMBOLS_PRIM /* See Note [Naming Scheme for Symbol Macros] */ #define SymI_HasProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ - (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_CODE }, + (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_CODE, NULL }, #define SymI_HasDataProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ - (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_DATA }, + (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_DATA, NULL }, #define SymE_HasProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ - (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_CODE }, + (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_CODE | SYM_TYPE_EXTERNAL, NULL }, #define SymE_HasDataProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ - (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_DATA }, + (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_DATA | SYM_TYPE_EXTERNAL, NULL }, #define SymI_NeedsProto(vvv) SymI_HasProto(vvv) #define SymI_NeedsDataProto(vvv) SymI_HasDataProto(vvv) @@ -1234,44 +1237,42 @@ RTS_SYMBOLS_PRIM // another symbol. See newCAF/newRetainedCAF/newGCdCAF for an example. #define SymI_HasProto_redirect(vvv,xxx,strength,ty) \ { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ - (void*)(&(xxx)), strength, ty }, + (void*)(&(xxx)), strength, ty, MAYBE_LEADING_UNDERSCORE_STR(#xxx) }, +// Allocate and return an array of rts symbols. +// The final element marks the end of the array and has `.lbl=NULL`. +// The caller must free the array. +RtsSymbolVal const * getRtsSymbols(void) { + /* The address of data symbols with the dllimport attribute are not + * compile-time constants and so cannot be used in constant initialisers. + * For this reason, rtsSyms is a local variable within this function + * rather than a global constant (as it was historically). + */ + const RtsSymbolVal _rtsSyms[] = { + RTS_SYMBOLS + RTS_RET_SYMBOLS + RTS_POSIX_ONLY_SYMBOLS + RTS_MINGW_ONLY_SYMBOLS + RTS_DARWIN_ONLY_SYMBOLS + RTS_OPENBSD_ONLY_SYMBOLS + RTS_LIBGCC_SYMBOLS + RTS_ARCH_LIBGCC_SYMBOLS + RTS_FINI_ARRAY_SYMBOLS + RTS_LIBFFI_SYMBOLS + RTS_ARM_OUTLINE_ATOMIC_SYMBOLS + RTS_SYMBOLS_PRIM + SymI_HasDataProto(nonmoving_write_barrier_enabled) + { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE, NULL } /* sentinel */ + }; + RtsSymbolVal * rtsSyms = stgMallocBytes(sizeof(_rtsSyms), "getRtsSymbols"); + uint32_t i = 0; + do { + rtsSyms[i] = _rtsSyms[i]; + i++; + } while (_rtsSyms[i-1].lbl != NULL); -/* Initialize (if not already initialized) and return an array of symbols with stuff from the RTS. */ -void initLinkerRtsSyms (StrHashTable *symhash) { - /* The address of data symbols with the dllimport attribute are not - * compile-time constants and so cannot be used in constant initialisers. - * For this reason, rtsSyms is a local variable within this function - * rather than a global constant (as it was historically). - */ - const RtsSymbolVal rtsSyms[] = { - RTS_SYMBOLS - RTS_RET_SYMBOLS - RTS_POSIX_ONLY_SYMBOLS - RTS_MINGW_ONLY_SYMBOLS - RTS_DARWIN_ONLY_SYMBOLS - RTS_OPENBSD_ONLY_SYMBOLS - RTS_LIBGCC_SYMBOLS - RTS_ARCH_LIBGCC_SYMBOLS - RTS_FINI_ARRAY_SYMBOLS - RTS_LIBFFI_SYMBOLS - RTS_ARM_OUTLINE_ATOMIC_SYMBOLS - RTS_SYMBOLS_PRIM - SymI_HasDataProto(nonmoving_write_barrier_enabled) - { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE } /* sentinel */ - }; - - IF_DEBUG(linker, debugBelch("populating linker symbol table with built-in RTS symbols\n")); - for (const RtsSymbolVal *sym = rtsSyms; sym->lbl != NULL; sym++) { - IF_DEBUG(linker, debugBelch("initLinker: inserting rts symbol %s, %p\n", sym->lbl, sym->addr)); - if (! ghciInsertSymbolTable(WSTR("(GHCi built-in symbols)"), - symhash, sym->lbl, sym->addr, - sym->strength, sym->type, 0, NULL)) { - barf("ghciInsertSymbolTable failed"); - } - } - IF_DEBUG(linker, debugBelch("done with built-in RTS symbols\n")); + return rtsSyms; } @@ -1355,7 +1356,7 @@ void initLinkerRtsSyms (StrHashTable *symhash) { // CODE_SYM(getauxval) // CODE_SYM(posix_spawn_file_actions_init) // ... -// { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE } /* sentinel */ +// { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE, NULL } /* sentinel */ // }; // // RtsSymbolVal* rtsExtraSyms() { @@ -1368,7 +1369,7 @@ void initLinkerRtsSyms (StrHashTable *symhash) { // static RtsSymbolVal default_extra_syms[] = { - { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE } /* sentinel */ + { 0, 0, STRENGTH_NORMAL, SYM_TYPE_CODE, NULL } /* sentinel */ }; /* Default empty extra RTS symbols. See Note[Extra RTS symbols] */ ===================================== rts/RtsSymbols.h ===================================== @@ -9,6 +9,7 @@ #pragma once #include "ghcautoconf.h" +#include "rts/RtsSymbols.h" #if defined(LEADING_UNDERSCORE) #define MAYBE_LEADING_UNDERSCORE_STR(s) ("_" s) @@ -16,36 +17,6 @@ #define MAYBE_LEADING_UNDERSCORE_STR(s) (s) #endif -typedef void SymbolAddr; -typedef char SymbolName; - -/* What kind of thing a symbol identifies. We need to know this to determine how - * to process overflowing relocations. See Note [Processing overflowed relocations]. - * This is bitfield however only the option SYM_TYPE_DUP_DISCARD can be combined - * with the other values. */ -typedef enum _SymType { - SYM_TYPE_CODE = 1 << 0, /* the symbol is a function and can be relocated via a jump island */ - SYM_TYPE_DATA = 1 << 1, /* the symbol is data */ - SYM_TYPE_INDIRECT_DATA = 1 << 2, /* see Note [_iob_func symbol] */ - SYM_TYPE_DUP_DISCARD = 1 << 3, /* the symbol is a symbol in a BFD import library - however if a duplicate is found with a mismatching - SymType then discard this one. */ - SYM_TYPE_HIDDEN = 1 << 4, /* the symbol is hidden and should not be exported */ -} SymType; - -typedef enum _SymStrength { - STRENGTH_NORMAL, - STRENGTH_WEAK, - STRENGTH_STRONG, -} SymStrength; - -typedef struct _RtsSymbolVal { - const SymbolName* lbl; - SymbolAddr* addr; - SymStrength strength; - SymType type; -} RtsSymbolVal; - extern RtsSymbolVal* __attribute__((weak)) rtsExtraSyms(void); /* See Note [_iob_func symbol]. */ ===================================== rts/include/Rts.h ===================================== @@ -271,6 +271,7 @@ void _warnFail(const char *filename, unsigned int linenum); #include "rts/StaticPtrTable.h" #include "rts/Libdw.h" #include "rts/LibdwPool.h" +#include "rts/RtsSymbols.h" /* Misc stuff without a home */ extern char **prog_argv; /* so we can get at these from Haskell */ ===================================== rts/include/rts/RtsSymbols.h ===================================== @@ -0,0 +1,47 @@ +/* ----------------------------------------------------------------------------- + * + * (c) The GHC Team, 2000-2015 + * + * RTS Symbols + * + * ---------------------------------------------------------------------------*/ + +#pragma once + +#include <stdbool.h> +typedef void SymbolAddr; +typedef char SymbolName; + +/* What kind of thing a symbol identifies. We need to know this to determine how + * to process overflowing relocations. See Note [Processing overflowed relocations]. + * This is bitfield however only the option SYM_TYPE_DUP_DISCARD can be combined + * with the other values. */ +typedef enum _SymType { + SYM_TYPE_CODE = 1 << 0, /* the symbol is a function and can be relocated via a jump island */ + SYM_TYPE_DATA = 1 << 1, /* the symbol is data */ + SYM_TYPE_INDIRECT_DATA = 1 << 2, /* see Note [_iob_func symbol] */ + SYM_TYPE_DUP_DISCARD = 1 << 3, /* the symbol is a symbol in a BFD import library + however if a duplicate is found with a mismatching + SymType then discard this one. */ + SYM_TYPE_HIDDEN = 1 << 4, /* the symbol is hidden and should not be exported */ + SYM_TYPE_EXTERNAL = 1 << 5, /* the symbol is defined externally to the RTS library. It might be linked + dynamically. This corresponds to SymE_* in RtsSymbols.c */ +} SymType; + +typedef enum _SymStrength { + STRENGTH_NORMAL, + STRENGTH_WEAK, + STRENGTH_STRONG, +} SymStrength; + +typedef struct _RtsSymbolVal { + const SymbolName* lbl; + SymbolAddr* addr; + SymStrength strength; + SymType type; + // If this is a redirection, then this is the lable of the + // target symbol. Otherwise NULL. + const SymbolName* lbl_redirect_target; +} RtsSymbolVal; + +RtsSymbolVal const * getRtsSymbols(void); ===================================== rts/rts.cabal ===================================== @@ -306,6 +306,7 @@ library rts/Profiling.h rts/IPE.h rts/PosixSource.h + rts/RtsSymbols.h rts/Signals.h rts/SpinLock.h rts/StableName.h ===================================== testsuite/driver/runtests.py ===================================== @@ -284,32 +284,36 @@ def format_path(path): # On Windows we need to set $PATH to include the paths to all the DLLs # in order for the dynamic library tests to work. if windows: + # Add mingw to PATH + topdir = config.libdir + mingw = os.path.abspath(os.path.join(topdir, '../mingw/bin')) + mingw = format_path(mingw) + ghc_env['PATH'] = os.pathsep.join([ghc_env.get("PATH", ""), mingw]) + + # Add ghc packages to PATH try: - pkginfo = getStdout([config.ghc_pkg, 'dump']) + pkgs = getStdout([config.ghc_pkg, '--simple-output', 'list']) except FileNotFoundError as err: # This can happen when we are only running tests which don't depend on ghc (ie linters) # In that case we probably haven't built ghc-pkg yet so this query will fail. print (err) print ("Failed to call ghc-pkg for windows path modification... some tests might fail") - pkginfo = "" - topdir = config.libdir - mingw = os.path.abspath(os.path.join(topdir, '../mingw/bin')) - mingw = format_path(mingw) - ghc_env['PATH'] = os.pathsep.join([ghc_env.get("PATH", ""), mingw]) - for line in pkginfo.split('\n'): - if line.startswith('library-dirs:'): - path = line.rstrip() - path = str_removeprefix(path, 'library-dirs: ') - # Use string.replace instead of re.sub, because re.sub - # interprets backslashes in the replacement string as - # escape sequences. - path = path.replace('$topdir', topdir) + pkgs = "" + + newPaths = set() + pkgs = pkgs.split(' ') + for pkg in pkgs: + for field in ['library-dirs', 'dynamic-library-dirs']: + path = getStdout([config.ghc_pkg, '--simple-output', 'field', pkg, field]) + path = path.strip() if path.startswith('"'): path = re.sub('^"(.*)"$', '\\1', path) path = re.sub('\\\\(.)', '\\1', path) + path = format_path(path) + newPaths.add(path) - path = format_path(path) - ghc_env['PATH'] = os.pathsep.join([path, ghc_env.get("PATH", "")]) + for path in newPaths: + ghc_env['PATH'] = os.pathsep.join([path, ghc_env.get("PATH", "")]) testopts_ctx_var.set(TestOptions()) ===================================== testsuite/driver/testglobals.py ===================================== @@ -182,6 +182,9 @@ class TestConfig: # Is gdb available? self.have_gdb = False + # Is ldd available? + self.have_ldd = False + # Is readelf available? self.have_readelf = False ===================================== testsuite/driver/testlib.py ===================================== @@ -1091,6 +1091,9 @@ def debug_rts( ) -> bool: def have_gdb( ) -> bool: return config.have_gdb +def have_ldd( ) -> bool: + return config.have_ldd + def have_readelf( ) -> bool: return config.have_readelf @@ -1931,7 +1934,9 @@ async def makefile_test( name, way, target=None ): if target is None: target = name - cmd = '$MAKE -s --no-print-directory {target}'.format(target=target) + way_flags = '"' + ' '.join(config.way_flags[way]).replace('"', '\\"') + '"' + + cmd = '$MAKE -s --no-print-directory WAY_FLAGS={way_flags} {target}'.format(target=target, way_flags=way_flags) return await run_command(name, way, cmd) # ----------------------------------------------------------------------------- ===================================== testsuite/mk/test.mk ===================================== @@ -107,6 +107,7 @@ RUNTEST_OPTS += -e "config.tables_next_to_code=False" endif HAVE_GDB := $(shell if gdb --version > /dev/null 2> /dev/null; then echo YES; else echo NO; fi) +HAVE_LDD := $(shell if ldd --version > /dev/null 2> /dev/null; then echo YES; else echo NO; fi) HAVE_READELF := $(shell if readelf --version > /dev/null 2> /dev/null; then echo YES; else echo NO; fi) # Detect whether the fast (GMP) bignum backend is in use. The GMP backend module @@ -154,6 +155,12 @@ else RUNTEST_OPTS += -e config.have_gdb=False endif +ifeq "$(HAVE_LDD)" "YES" +RUNTEST_OPTS += -e config.have_ldd=True +else +RUNTEST_OPTS += -e config.have_ldd=False +endif + ifeq "$(HAVE_READELF)" "YES" RUNTEST_OPTS += -e config.have_readelf=True else ===================================== testsuite/tests/ghci/linking/T25155_iserv_main.c ===================================== @@ -23,7 +23,7 @@ int main (int argc, char *argv[]) // can use the FFI call to foobar in a TH splice. #define SymI_HasProto(vvv) { MAYBE_LEADING_UNDERSCORE_STR(#vvv), \ - (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_CODE }, + (void*)(&(vvv)), STRENGTH_NORMAL, SYM_TYPE_CODE, NULL }, void foobar(int x) { ===================================== testsuite/tests/rts/symbols/Main.hs ===================================== @@ -0,0 +1,235 @@ +import qualified Data.Map.Lazy as M +import qualified Data.Set as S +import Data.List (isSuffixOf, stripPrefix) +import Data.Maybe (mapMaybe) +import System.Environment (getArgs) + +-- Symbols to be ignored. These are symbols that are gated on CPP ant not correctly +-- specified in RtsSymbols.c. This means the symbol will sometimes appear in the +-- test output and sometimes not (depending on CPP defines). That means we can't +-- simply put those symbols into the expected test output. It's already the +-- job of RtsSymbols.c to declare symbols correctly in accordance with CPP. We +-- want to avoid copying that logic again in the test. So we just ignore some +-- symbols so that CI can pass and in the future we aim to fix RtsSymbols.c and +-- reduce the size of ignoreSymbols. +ignoreSymbols :: S.Set String +ignoreSymbols = S.fromList [ + -- These are defined in libgcc. RtsSymbols.c declare them with some + -- surrounding CPP but there seems to be differences between CI jobs. + -- See: + -- https://gitlab.haskell.org/ghc/ghc/-/jobs/2679828 + -- https://gitlab.haskell.org/ghc/ghc/-/jobs/2679827 + "__ashldi3", + "__ashrdi3", + "__divdi3", + "__fixunsdfdi", + "__lshrdi3", + "__moddi3", + "__muldi3", + "__udivdi3", + "__udivti3", + "__umoddi3", + "__umodti3", + + -- These may be a CPP mismatch between rts/prim/vectorQuotRem.c and RtsSymbols.c + "hs_quotInt16X8", + "hs_quotInt32X4", + "hs_quotInt64X2", + "hs_quotInt8X16", + "hs_quotWord16X8", + "hs_quotWord32X4", + "hs_quotWord64X2", + "hs_quotWord8X16", + "hs_remInt16X8", + "hs_remInt32X4", + "hs_remInt64X2", + "hs_remInt8X16", + "hs_remWord16X8", + "hs_remWord32X4", + "hs_remWord64X2", + "hs_remWord8X16", + + -- Appears in threaded RTS but not vanilla RTS (-Declared) + "atomic_dec", + + -- Appears in threaded RTS but not vanilla RTS (+Observed) + "acquire_spin_lock_slow_path", + "busy_wait_nop", + "cas_seq_cst_relaxed", + "concurrent_coll_finished_cond", + "concurrent_coll_lock", + "concurrent_mark_roots", + "concurrent_worker_state", + "concurrent_worker_thread", + "gc_alloc_block_sync", + "globalStoreLock", + "linker_mutex", + "rts_pausing_task", + "start_concurrent_mark_cond", + "stats_mutex", + "stop_concurrent_worker", + "xchg", + + -- Appears in debug RTS but not vanilla RTS (+Observed) + "RIGHT_ARITY_1", + "RIGHT_ARITY_2", + "SLOW_CALLS_1", + "SLOW_CALLS_2", + "TAGGED_PTR_1", + "TAGGED_PTR_2", + "TOTAL_CALLS", + "_bdescr", + "checkPtrInArena", + "findPtr", + "findSlop", + "ghci_enquire", + "insert_down_count", + "isHeapAlloced", + "leftify_up_shortcut_count", + "leftify_up_to_count", + "merge_down_count", + "nonmovingGcCafs", + "printAllTasks", + "printIPE", + "searched", + "whitehole_executeMessage_spin", + "whitehole_lockClosure_spin", + "whitehole_lockClosure_yield", + "whitehole_threadPaused_spin", + + -- Uncategorized symbols + "_fini", + "_init", + "complex_ccall_adjustor_template", + "decodeAddendAarch64", + "encodeAddendAarch64", + "findStub", + "flushInstructionCache", + "flushInstructionCacheAarch64", + "freeStubs", + "instSizeAarch64", + "isAddSub", + "isAdrp", + "isBranch", + "isBranchLink", + "isLoadStore", + "isVectorOp", + "makeStub", + "makeStubAarch64", + "mblock_address_space", + "mblock_map", + "needStubForRelaAarch64", + "needStubForRelAarch64", + "numberOfStubsForSection", + "relocateObjectCode", + "relocateObjectCodeAarch64", + "simple_ccall_adjustor_template", + "StgReturn", + "stubSizeAarch64" + ] + +main :: IO () +main = do + args <- getArgs + case args of + ["dump"] -> dumpDeclaredSymbols + ["diff", declaredSymbolsFile, observedSymbolsFile] -> do + + let symbolFilter :: String -> CodeOrData -> Bool + symbolFilter name cd = + -- Not in ingore list + not (S.member name ignoreSymbols) + -- Doesn't look like a entry/return code symbol + -- (These can appear in unregisterd builds wihere tables next to code is disabled) + && not ("_entry" `isSuffixOf` name && cd == Code) + && not ("_ret" `isSuffixOf` name && cd == Code) + + declaredSymbolsStr <- readFile declaredSymbolsFile + observedSymbolsStr <- readFile observedSymbolsFile + + let declaredSymbols = M.filterWithKey symbolFilter $ readCodeOrData <$> linePairs declaredSymbolsStr + let observedSymbols = M.filterWithKey symbolFilter $ parseReadelf observedSymbolsStr + + let diffStr = diff declaredSymbols observedSymbols + -- writeFile "<ghc root>/testsuite/tests/rts/symbols/rts-check-symbols.stdout" + putStrLn diffStr + + _ -> fail ("Unexpected arguments: " ++ show args) + +foreign import ccall "dumpDeclaredSymbols" + dumpDeclaredSymbols :: IO () + +data CodeOrData = Code | Data + deriving (Show, Eq) + +-- Compare observedSymbols (symbols observed in the DSO) to declaredSymbols +-- (symbols declared in RtsSymbols.c) +diff :: M.Map String CodeOrData -> M.Map String CodeOrData -> String +diff declaredSymbols observedSymbols = unlines $ + [ "Symbols declared in RtsSymbols.c but not observed in the DSO:" ] + ++ [ "Declared> " ++ k ++ " " ++ show v | (k, v) <- M.toList diffInDeclaredSymbols ] + ++ [ "" ] + ++ [ "Symbols observed in the DSO but not declared in RtsSymbols.c:" ] + ++ [ "Observed> " ++ k ++ " " ++ show v | (k, v) <- M.toList diffInObservedSymbols ] + ++ [ "" ] + ++ [ "Symbols observed in the DSO and declared in RtsSymbols.c but with conflicting type:" ] + ++ [ "WrongType> " ++ k ++ " (declared, observed): (" ++ show declared ++ ", " ++ show observed ++ ")" + | (k, (declared, observed)) <- M.toList diffOnType ] + where + -- Undeclared observed symbols + diffInObservedSymbols :: M.Map String CodeOrData + diffInObservedSymbols = observedSymbols M.\\ declaredSymbols + + -- Declared unobserved symbols + diffInDeclaredSymbols :: M.Map String CodeOrData + diffInDeclaredSymbols = declaredSymbols M.\\ observedSymbols + + -- Declared observed symbols with conflicting type + diffOnType :: M.Map String (CodeOrData, CodeOrData) + diffOnType = M.filter (\(a, b) -> a /= b) $ M.intersectionWith (,) declaredSymbols observedSymbols + +linePairs :: String -> M.Map String String +linePairs = M.fromList . map (\str -> let [a,b] = words str in (a,b)) . filter (/= "") . lines + +readCodeOrData :: String -> CodeOrData +readCodeOrData s = case s of + "code" -> Code + "data" -> Data + _ -> error ("Unknown symbol type: " ++ show s) + +-- | Parse the output of @readelf -W --dyn-syms@ of an ELF shared object. +-- +-- Symbol lines look like: +-- +-- > Num: Value Size Type Bind Vis Ndx Name +-- > 2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND tcsetattr@GLIBC_2.2.5 (2) +-- > 1149: 000000000006d020 190 OBJECT GLOBAL DEFAULT 12 stg_AP_info +-- +-- Note that Vis may be followed by extra annotations on some platforms (e.g. +-- @[<localentry>: 8]@ on ppc64le), so Ndx and Name are taken from the end of +-- the line. +parseReadelf :: String -> M.Map String CodeOrData +parseReadelf = M.fromList . mapMaybe parseLine . lines + where + parseLine l = case words l of + (num : _value : _size : ty : bind : rest) + | ":" `isSuffixOf` num + , name : ndx : _ <- reverse (dropVersionIndex rest) + , bind == "GLOBAL" + , ndx /= "UND" -- Imports + -> (,) name <$> typeToCodeOrData ty + _ -> Nothing + + -- Drop the trailing version index e.g. "(2)" + dropVersionIndex ws = case reverse ws of + ('(' : _) : ws' -> reverse ws' + _ -> ws + + -- Returns Nothing if the symbol should be ignored + typeToCodeOrData :: String -> Maybe CodeOrData + typeToCodeOrData ty = case ty of + "FILE" -> Nothing + "NOTYPE" -> Nothing + "FUNC" -> Just Code + "OBJECT" -> Just Data + _ -> error ("Unknown symbol type: " ++ show ty) \ No newline at end of file ===================================== testsuite/tests/rts/symbols/Makefile ===================================== @@ -0,0 +1,12 @@ +TOP=../../.. +include $(TOP)/mk/boilerplate.mk +include $(TOP)/mk/test.mk + +# This makefile rule only exists because TEST_HC is set in boilerplate.mk +# and otherwise the TEST_HC variable wouldn't be set in the context of the bash script +rts-check-symbols: + TOP="$(TOP)" \ + TEST_HC_OPTS="$(TEST_HC_OPTS)" \ + TEST_HC="$(TEST_HC)" \ + WAY_FLAGS="$(WAY_FLAGS)" \ + ./rts-check-symbols.sh ===================================== testsuite/tests/rts/symbols/all.T ===================================== @@ -0,0 +1,17 @@ +test('rts-check-symbols', [ + unless(opsys('linux') and have_dynamic() and have_readelf() and have_ldd(), skip), + windows_skip, + # extra ways are important to test over different RTS DSOs + extra_ways([ + 'threaded1', # threaded + debug + 'threaded2', # threaded + 'sanity' # debug + ]), + extra_files([ + 'dumpDeclaredSymbols.c', + 'Main.hs', + 'rts-check-symbols.sh' + ])], + makefile_test, + [] +) ===================================== testsuite/tests/rts/symbols/dumpDeclaredSymbols.c ===================================== @@ -0,0 +1,37 @@ + +#include "Rts.h" + +#include <stdio.h> + +void dumpDeclaredSymbols(void); + +void dumpDeclaredSymbols(void) { + const RtsSymbolVal * declaredSyms = getRtsSymbols(); + for (const RtsSymbolVal * sym = &declaredSyms[0]; sym->lbl; sym++) { + // Ignore hidden + if (sym->type & SYM_TYPE_HIDDEN) continue; + + // Ignore external symbols + if (sym->type & SYM_TYPE_EXTERNAL) continue; + + char * type = NULL; + if (sym->type & SYM_TYPE_CODE) { + type = "code"; + } else if (sym->type & (SYM_TYPE_DATA | SYM_TYPE_INDIRECT_DATA)) { + type = "data"; + } + + const char * lbl = NULL; + if (sym->lbl_redirect_target) { + // In the case of redirects, the true symbol name is lbl_redirect_target + lbl = sym->lbl_redirect_target; + } else { + lbl = sym->lbl; + } + + if (type) { + printf("%s %s\n", lbl, type); + } + } + free((void*)declaredSyms); +} ===================================== testsuite/tests/rts/symbols/rts-check-symbols.sh ===================================== @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +$TEST_HC $TEST_HC_OPTS \ + -package containers \ + -dynamic \ + dumpDeclaredSymbols.c \ + -I$TOP/../rts \ + -I$TOP/../rts/include \ + $WAY_FLAGS \ + Main.hs \ + -o Main \ + > /dev/null +# +# Check the diff between symbols exported from the RTS and those listed in RtsSymbols.c +# + +DECLARED_SYMBOLS=declared_symbols.txt +OBSERVED_SYMBOLS=observed_symbols.txt + +# Get rts Symbols listed in RtsSymbols.c +./Main dump | sort > $DECLARED_SYMBOLS + +# Find the path of the RTS shared object that ./Main is linked against +# Match e.g.: +# libHSrts-1.0.3-ghc9.15.20260710.so => /home/alice/s p a c e/myApp/lib/libHSrts-1.0.3-ghc9.15.20260710.so (0x7ffebc9a0000) +RTS_DYLIB_PATH=$(ldd ./Main | awk '/^[[:space:]]*libHSrts-.* => .+$/ { + sub(/^[[:space:]]*libHSrts-.* => /, "") + sub(/ \([^(]*\)$/, "") + print +}') + +# Dump the exported symbols. Main.hs is responsible for parsing the output. +# The dynamic symbol table of the shared object. We use readelf rather +# than nm as nm classifies symbols by section rather than by symbol +# type, and with tables next to code info tables (objects) live in the +# .text section. +readelf -W --dyn-syms "$RTS_DYLIB_PATH" > $OBSERVED_SYMBOLS + +./Main diff $DECLARED_SYMBOLS $OBSERVED_SYMBOLS ===================================== testsuite/tests/rts/symbols/rts-check-symbols.stdout ===================================== @@ -0,0 +1,747 @@ +Symbols declared in RtsSymbols.c but not observed in the DSO: +Declared> dirty_TVAR Code +Declared> signal_handlers Code +Declared> updateRemembSetPushThunk Code + +Symbols observed in the DSO but not declared in RtsSymbols.c: +Observed> AP_STACK_sizeW Code +Observed> AP_sizeW Code +Observed> BLACKHOLE_sizeW Code +Observed> Bdescr Code +Observed> CHARLIKE_CLOSURE Code +Observed> CONSTR_sizeW Code +Observed> CONTINUATION_sizeW Code +Observed> CON_INFO_PTR_TO_STRUCT Code +Observed> FUN_INFO_PTR_TO_STRUCT Code +Observed> FileEventLogWriter Data +Observed> GET_CLOSURE_TAG Code +Observed> GET_INFO Code +Observed> GET_TAG Code +Observed> INFO_PTR_TO_STRUCT Code +Observed> INTLIKE_CLOSURE Code +Observed> LOOKS_LIKE_CLOSURE_PTR Code +Observed> LOOKS_LIKE_INFO_PTR Code +Observed> LOOKS_LIKE_INFO_PTR_NOT_NULL Code +Observed> LOOKS_LIKE_PTR Code +Observed> NullEventLogWriter Data +Observed> OS_TRY_ACQUIRE_LOCK Code +Observed> PAP_sizeW Code +Observed> RET_INFO_PTR_TO_STRUCT Code +Observed> SET_INFO Code +Observed> SET_INFO_RELAXED Code +Observed> SET_INFO_RELEASE Code +Observed> STATIC_LINK Code +Observed> TAG_CLOSURE Code +Observed> THUNK_INFO_PTR_TO_STRUCT Code +Observed> THUNK_SELECTOR_sizeW Code +Observed> UNTAG_CLOSURE Code +Observed> UNTAG_CONST_CLOSURE Code +Observed> UPD_BH_UPDATABLE_ctr Data +Observed> __rts_fopen Code +Observed> _warnFail Code +Observed> addInitFini Code +Observed> addProddableBlock Code +Observed> allocAlignedGroupOnNode Code +Observed> allocBlock Code +Observed> allocBlockOnNode Code +Observed> allocBlockOnNode_lock Code +Observed> allocBlock_lock Code +Observed> allocGroup Code +Observed> allocGroupOnNode Code +Observed> allocGroupOnNode_lock Code +Observed> allocGroup_lock Code +Observed> allocLimitKill Data +Observed> allocLimitRunHook Data +Observed> allocMBlockAlignedGroupOnNode Code +Observed> allocateMightFail Code +Observed> allocatePinned Code +Observed> allocated_bytes_at_heapoverflow Data +Observed> ap_sizeW Code +Observed> ap_stack_sizeW Code +Observed> arr_words_sizeW Code +Observed> arr_words_words Code +Observed> backtraceFree Code +Observed> bco_sizeW Code +Observed> broadcastCondition Code +Observed> cas_word8 Code +Observed> checkProddableBlock Code +Observed> checkVectorSupport Code +Observed> clearImportSymbol Code +Observed> closeCondition Code +Observed> closeMutex Code +Observed> closure_sizeW Code +Observed> collect_pointers Code +Observed> compact_nfdata_full_sizeW Code +Observed> containsSpan Code +Observed> continuation_sizeW Code +Observed> createAttachedOSThread Code +Observed> createGenThread Code +Observed> createIOThread Code +Observed> createOSThread Code +Observed> createStrictIOThread Code +Observed> createThread Code +Observed> currentWorkerCount Data +Observed> debugMsgFn Data +Observed> dequeElements Code +Observed> dirty_STACK Code +Observed> dirty_TSO Code +Observed> discardElements Code +Observed> era Data +Observed> errorMsgFn Data +Observed> eventLogStatus Code +Observed> eventTypes Data +Observed> exitFn Data +Observed> exitHeapOverflow Code +Observed> exitHpc Code +Observed> fatalInternalErrorFn Data +Observed> fillGot Code +Observed> findSymbol Code +Observed> findSymbolTable Code +Observed> flushExec Code +Observed> formatClosureDescIpe Code +Observed> freeAllMBlocks Code +Observed> freeChain Code +Observed> freeChain_lock Code +Observed> freeGot Code +Observed> freeGroup Code +Observed> freeGroup_lock Code +Observed> freeInitFiniList Code +Observed> freeMBlocks Code +Observed> freeProddableBlocks Code +Observed> freeThreadingResources Code +Observed> freeWSDeque Code +Observed> full_prog_argc Data +Observed> full_prog_argv Data +Observed> generations Data +Observed> getFirstMBlock Code +Observed> getMBlock Code +Observed> getMBlockOnNode Code +Observed> getMBlocks Code +Observed> getMBlocksOnNode Code +Observed> getNextMBlock Code +Observed> getObjectLoadStatus Code +Observed> get_con_itbl Code +Observed> get_fun_itbl Code +Observed> get_itbl Code +Observed> get_itbl_acquire Code +Observed> get_ret_itbl Code +Observed> get_thunk_itbl Code +Observed> heap_view_closurePtrs Code +Observed> heap_view_closureSize Code +Observed> heap_view_closure_ptrs_in_pap_payload Code +Observed> highMemDynamic Data +Observed> hs_main Code +Observed> initAdjustors Code +Observed> initBlockAllocator Code +Observed> initCondition Code +Observed> initGenerationStats Code +Observed> initMBlocks Code +Observed> initMutex Code +Observed> initProddableBlockSet Code +Observed> interp_shutdown Code +Observed> interp_startup Code +Observed> interruptOSThread Code +Observed> isSymbolImport Code +Observed> isSymbolWeak Code +Observed> itbl_to_con_itbl Code +Observed> itbl_to_fun_itbl Code +Observed> itbl_to_ret_itbl Code +Observed> itbl_to_thunk_itbl Code +Observed> joinOSThread Code +Observed> kernelThreadId Code +Observed> libdwGetBacktrace Code +Observed> libdwLookupLocation Code +Observed> libdwPoolClear Code +Observed> libdwPoolRelease Code +Observed> libdwPoolTake Code +Observed> listAllBlocks Code +Observed> listThreads Code +Observed> looksEmptyWSDeque Code +Observed> lookupIPEId Code +Observed> m32_free_page_pool Data +Observed> m32_free_page_pool_size Data +Observed> makeGot Code +Observed> mblocks_allocated Data +Observed> modules Data +Observed> mpc_misses Data +Observed> mutArrPtrsCard Code +Observed> mutArrPtrsCardTableSize Code +Observed> mutArrPtrsCards Code +Observed> mut_arr_ptrs_sizeW Code +Observed> n_alloc_blocks_by_node Data +Observed> needGotSlot Code +Observed> newCAF Code +Observed> newGCdCAF Code +Observed> newRetainedCAF Code +Observed> newWSDeque Code +Observed> next_nursery Data +Observed> no_break_on_exception Data +Observed> nonmovingAllocatorCensus Code +Observed> nonmovingAllocatorCensusWithWords Code +Observed> nonmovingPrintAllocatorCensus Code +Observed> nonmovingSweep Code +Observed> nonmovingSweepCompactObjects Code +Observed> nonmovingSweepLargeObjects Code +Observed> nonmovingSweepMutLists Code +Observed> nonmovingSweepStableNameTable Code +Observed> nonmovingTraceAllocatorCensus Code +Observed> oldest_gen Data +Observed> osThreadId Code +Observed> osThreadIsAlive Code +Observed> pap_sizeW Code +Observed> pauseTokenCapability Code +Observed> pbarf Code +Observed> peak_mblocks_allocated Data +Observed> poolFlush Code +Observed> poolFree Code +Observed> poolGetDesiredSize Code +Observed> poolGetMaxSize Code +Observed> poolInit Code +Observed> poolRelease Code +Observed> poolSetDesiredSize Code +Observed> poolSetMaxSize Code +Observed> poolTake Code +Observed> poolTryTake Code +Observed> popWSDeque Code +Observed> printLoadedObjects Code +Observed> prog_name Data +Observed> pushWSDeque Code +Observed> re_invalid Data +Observed> re_realso Data +Observed> releaseFreeMemory Code +Observed> releaseThreadNode Code +Observed> reportMemoryMap Code +Observed> rtsDebugMsgFn Code +Observed> rtsErrorMsgFn Code +Observed> rtsFatalInternalErrorFn Code +Observed> rtsSysErrorMsgFn Code +Observed> rts_argc Data +Observed> rts_argv Data +Observed> rts_argv_size Data +Observed> rts_done Code +Observed> rts_evalLazyIO_ Code +Observed> rts_getSchedStatus Code +Observed> rts_isPaused Code +Observed> rts_listMiscRoots Code +Observed> rts_listThreads Code +Observed> rts_pause Code +Observed> rts_pinThreadToNumaNode Code +Observed> rts_resume Code +Observed> runFini Code +Observed> runInit Code +Observed> sbarf Code +Observed> scheduleWaitThread Code +Observed> setHighMemDynamic Code +Observed> setImportSymbol Code +Observed> setSymbolInfo Code +Observed> setTSOLink Code +Observed> setTSOPrev Code +Observed> setThreadAffinity Code +Observed> setThreadNode Code +Observed> setVectorSupport Code +Observed> setWeakSymbol Code +Observed> shndx_table_uninit_label Data +Observed> shouldCompact Code +Observed> shutdownThread Code +Observed> signalCondition Code +Observed> sizeW_fromITBL Code +Observed> small_mut_arr_ptrs_sizeW Code +Observed> ssbarf Code +Observed> stack_frame_sizeW Code +Observed> stack_sizeW Code +Observed> state_change_mutex Data +Observed> stealWSDeque Code +Observed> stealWSDeque_ Code +Observed> stg_AP_NOUPD_info Data +Observed> stg_AP_STACK_NOUPD_info Data +Observed> stg_AP_STACK_info Data +Observed> stg_AP_info Data +Observed> stg_ASYNCIOOP_info Data +Observed> stg_ASYNCIO_LIVE0_closure Data +Observed> stg_ASYNCIO_LIVE0_info Data +Observed> stg_BCO_info Data +Observed> stg_CLOSURE_TABLE_NULL_closure Data +Observed> stg_CLOSURE_TABLE_NULL_info Data +Observed> stg_COMPACT_NFDATA_CLEAN_info Data +Observed> stg_COMPACT_NFDATA_DIRTY_info Data +Observed> stg_CONTINUATION_apply Code +Observed> stg_CONTINUATION_info Data +Observed> stg_C_FINALIZER_LIST_info Data +Observed> stg_DEAD_SLOT_closure Data +Observed> stg_DEAD_SLOT_info Data +Observed> stg_DEAD_WEAK_info Data +Observed> stg_END_STM_CHUNK_LIST_closure Data +Observed> stg_END_STM_CHUNK_LIST_info Data +Observed> stg_END_STM_WATCH_QUEUE_closure Data +Observed> stg_END_STM_WATCH_QUEUE_info Data +Observed> stg_END_TSO_QUEUE_closure Data +Observed> stg_END_TSO_QUEUE_info Data +Observed> stg_GCD_CAF_info Data +Observed> stg_IND_info Data +Observed> stg_MSG_BLACKHOLE_info Data +Observed> stg_MSG_CLONE_STACK_info Data +Observed> stg_MSG_NULL_info Data +Observed> stg_MSG_THROWTO_info Data +Observed> stg_MSG_TRY_WAKEUP_info Data +Observed> stg_MSG_UPD_TSO_FLAG_info Data +Observed> stg_MUT_ARR_PTRS_CLEAN_info Data +Observed> stg_MVAR_TSO_QUEUE_info Data +Observed> stg_NO_FINALIZER_closure Data +Observed> stg_NO_FINALIZER_info Data +Observed> stg_NO_TREC_closure Data +Observed> stg_NO_TREC_info Data +Observed> stg_PAP_apply Code +Observed> stg_PAP_info Data +Observed> stg_PROMPT_TAG_info Data +Observed> stg_SMALL_MUT_ARR_PTRS_CLEAN_info Data +Observed> stg_STABLE_NAME_info Data +Observed> stg_STACK_info Data +Observed> stg_TIMEOUT_QUEUE_EMPTY_closure Data +Observed> stg_TIMEOUT_QUEUE_EMPTY_info Data +Observed> stg_TIMEOUT_QUEUE_info Data +Observed> stg_TREC_CHUNK_info Data +Observed> stg_TREC_HEADER_info Data +Observed> stg_TSO_info Data +Observed> stg_TVAR_WATCH_QUEUE_info Data +Observed> stg_WHITEHOLE_info Data +Observed> stg_abort Code +Observed> stg_ann_frame_info Data +Observed> stg_ap_0_ret_str Data +Observed> stg_ap_stack_entries Data +Observed> stg_ap_stk_ Code +Observed> stg_ap_stk_d Code +Observed> stg_ap_stk_f Code +Observed> stg_ap_stk_l Code +Observed> stg_ap_stk_n Code +Observed> stg_ap_stk_nn Code +Observed> stg_ap_stk_nnn Code +Observed> stg_ap_stk_nnp Code +Observed> stg_ap_stk_np Code +Observed> stg_ap_stk_npn Code +Observed> stg_ap_stk_npp Code +Observed> stg_ap_stk_p Code +Observed> stg_ap_stk_pn Code +Observed> stg_ap_stk_pnn Code +Observed> stg_ap_stk_pnp Code +Observed> stg_ap_stk_pp Code +Observed> stg_ap_stk_ppn Code +Observed> stg_ap_stk_ppp Code +Observed> stg_ap_stk_pppp Code +Observed> stg_ap_stk_ppppp Code +Observed> stg_ap_stk_pppppp Code +Observed> stg_ap_stk_ppppppp Code +Observed> stg_ap_stk_pppppppp Code +Observed> stg_ap_stk_v16 Code +Observed> stg_ap_stk_v32 Code +Observed> stg_ap_stk_v64 Code +Observed> stg_apply_interp_info Data +Observed> stg_atomically_frame_info Data +Observed> stg_atomically_info Data +Observed> stg_atomically_waiting_frame_info Data +Observed> stg_block_blackhole Code +Observed> stg_block_io_int Code +Observed> stg_block_io_int_info Data +Observed> stg_block_io_unit Code +Observed> stg_block_io_unit_info Data +Observed> stg_block_putmvar_finally Code +Observed> stg_block_putmvar_info Data +Observed> stg_block_readmvar_finally Code +Observed> stg_block_readmvar_info Data +Observed> stg_block_stmwait Code +Observed> stg_block_takemvar_finally Code +Observed> stg_block_takemvar_info Data +Observed> stg_block_throwto Code +Observed> stg_block_throwto_finally Code +Observed> stg_block_throwto_info Data +Observed> stg_catch_frame_info Data +Observed> stg_catch_retry_frame_info Data +Observed> stg_catch_stm_frame_info Data +Observed> stg_compactAddWorkerzh Code +Observed> stg_control0zh_ll Code +Observed> stg_ctoi_D1_info Data +Observed> stg_ctoi_F1_info Data +Observed> stg_ctoi_L1_info Data +Observed> stg_ctoi_R1n_info Data +Observed> stg_ctoi_R1p_info Data +Observed> stg_ctoi_V_info Data +Observed> stg_dead_thread_info Data +Observed> stg_do_unpack_cstring Code +Observed> stg_do_unpack_cstring_utf8 Code +Observed> stg_dummy_ret_closure Data +Observed> stg_dummy_ret_info Data +Observed> stg_forceIO_info Data +Observed> stg_gc_prim Code +Observed> stg_gc_prim_p_ll Code +Observed> stg_gc_prim_p_ll_info Data +Observed> stg_gc_prim_pp_ll Code +Observed> stg_gc_prim_pp_ll_info Data +Observed> stg_handleIOSubmitResult Code +Observed> stg_keepAlive_frame_info Data +Observed> stg_killMyself Code +Observed> stg_marked_upd_frame_info Data +Observed> stg_maskAsyncExceptionszh_ret_info Data +Observed> stg_maskUninterruptiblezh_ret_info Data +Observed> stg_noDuplicate_info Data +Observed> stg_overwritingClosure Code +Observed> stg_overwritingClosureSize Code +Observed> stg_prompt_frame_info Data +Observed> stg_raise_info Data +Observed> stg_raise_ret_info Data +Observed> stg_restore_cccs_d_info Data +Observed> stg_restore_cccs_eval_info Data +Observed> stg_restore_cccs_v16_info Data +Observed> stg_restore_cccs_v32_info Data +Observed> stg_restore_cccs_v64_info Data +Observed> stg_returnToSched Code +Observed> stg_returnToSchedButFirst Code +Observed> stg_returnToSchedNotPaused Code +Observed> stg_returnToStackTop Code +Observed> stg_stack_save_entries Data +Observed> stg_stack_underflow_frame_d_info Data +Observed> stg_stack_underflow_frame_v16_info Data +Observed> stg_stack_underflow_frame_v32_info Data +Observed> stg_stack_underflow_frame_v64_info Data +Observed> stg_stk_save_ Code +Observed> stg_stk_save_d Code +Observed> stg_stk_save_f Code +Observed> stg_stk_save_l Code +Observed> stg_stk_save_n Code +Observed> stg_stk_save_nn Code +Observed> stg_stk_save_nnn Code +Observed> stg_stk_save_nnp Code +Observed> stg_stk_save_np Code +Observed> stg_stk_save_npn Code +Observed> stg_stk_save_npp Code +Observed> stg_stk_save_p Code +Observed> stg_stk_save_pn Code +Observed> stg_stk_save_pnn Code +Observed> stg_stk_save_pnp Code +Observed> stg_stk_save_pp Code +Observed> stg_stk_save_ppn Code +Observed> stg_stk_save_ppp Code +Observed> stg_stk_save_pppp Code +Observed> stg_stk_save_ppppp Code +Observed> stg_stk_save_pppppp Code +Observed> stg_stk_save_ppppppp Code +Observed> stg_stk_save_pppppppp Code +Observed> stg_stk_save_v16 Code +Observed> stg_stk_save_v32 Code +Observed> stg_stk_save_v64 Code +Observed> stg_stop_thread_info Data +Observed> stg_threadFinished Code +Observed> stg_unmaskAsyncExceptionszh_ret_info Data +Observed> stg_writeSlopMarker Code +Observed> sync_phase_marking_budget Data +Observed> sysErrorMsgFn Data +Observed> tagConstr Code +Observed> thunk_sizeW_fromITBL Code +Observed> timedWaitCondition Code +Observed> totalArgumentSize Code +Observed> total_ticks Data +Observed> unloadNativeObj Code +Observed> user_era Data +Observed> validate_trec_optimistic Code +Observed> vbarf Code +Observed> vdebugBelch Code +Observed> vectorSupportGlobalVar Data +Observed> verifyGot Code +Observed> verrorBelch Code +Observed> vsysErrorBelch Code +Observed> waitCondition Code +Observed> warnMissingKBLibraryPaths Code +Observed> yieldThread Code + +Symbols observed in the DSO and declared in RtsSymbols.c but with conflicting type: +WrongType> ALLOC_BH_adm (declared, observed): (Code, Data) +WrongType> ALLOC_BH_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_BH_gds (declared, observed): (Code, Data) +WrongType> ALLOC_BH_slp (declared, observed): (Code, Data) +WrongType> ALLOC_CON_adm (declared, observed): (Code, Data) +WrongType> ALLOC_CON_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_CON_gds (declared, observed): (Code, Data) +WrongType> ALLOC_CON_slp (declared, observed): (Code, Data) +WrongType> ALLOC_FUN_adm (declared, observed): (Code, Data) +WrongType> ALLOC_FUN_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_FUN_gds (declared, observed): (Code, Data) +WrongType> ALLOC_FUN_slp (declared, observed): (Code, Data) +WrongType> ALLOC_HEAP_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_HEAP_tot (declared, observed): (Code, Data) +WrongType> ALLOC_PAP_adm (declared, observed): (Code, Data) +WrongType> ALLOC_PAP_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_PAP_gds (declared, observed): (Code, Data) +WrongType> ALLOC_PAP_slp (declared, observed): (Code, Data) +WrongType> ALLOC_PRIM_adm (declared, observed): (Code, Data) +WrongType> ALLOC_PRIM_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_PRIM_gds (declared, observed): (Code, Data) +WrongType> ALLOC_PRIM_slp (declared, observed): (Code, Data) +WrongType> ALLOC_RTS_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_RTS_tot (declared, observed): (Code, Data) +WrongType> ALLOC_SE_THK_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_STACK_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_STACK_tot (declared, observed): (Code, Data) +WrongType> ALLOC_THK_adm (declared, observed): (Code, Data) +WrongType> ALLOC_THK_gds (declared, observed): (Code, Data) +WrongType> ALLOC_THK_slp (declared, observed): (Code, Data) +WrongType> ALLOC_TSO_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_TSO_tot (declared, observed): (Code, Data) +WrongType> ALLOC_TUP_adm (declared, observed): (Code, Data) +WrongType> ALLOC_TUP_ctr (declared, observed): (Code, Data) +WrongType> ALLOC_TUP_gds (declared, observed): (Code, Data) +WrongType> ALLOC_TUP_slp (declared, observed): (Code, Data) +WrongType> ALLOC_UP_THK_ctr (declared, observed): (Code, Data) +WrongType> CATCHF_PUSHED_ctr (declared, observed): (Code, Data) +WrongType> ENT_AP_STACK_ctr (declared, observed): (Code, Data) +WrongType> ENT_AP_ctr (declared, observed): (Code, Data) +WrongType> ENT_BH_ctr (declared, observed): (Code, Data) +WrongType> ENT_CONTINUATION_ctr (declared, observed): (Code, Data) +WrongType> ENT_DYN_CON_ctr (declared, observed): (Code, Data) +WrongType> ENT_DYN_FUN_DIRECT_ctr (declared, observed): (Code, Data) +WrongType> ENT_DYN_IND_ctr (declared, observed): (Code, Data) +WrongType> ENT_DYN_THK_MANY_ctr (declared, observed): (Code, Data) +WrongType> ENT_DYN_THK_SINGLE_ctr (declared, observed): (Code, Data) +WrongType> ENT_LNE_ctr (declared, observed): (Code, Data) +WrongType> ENT_PAP_ctr (declared, observed): (Code, Data) +WrongType> ENT_PERM_IND_ctr (declared, observed): (Code, Data) +WrongType> ENT_STATIC_CON_ctr (declared, observed): (Code, Data) +WrongType> ENT_STATIC_FUN_DIRECT_ctr (declared, observed): (Code, Data) +WrongType> ENT_STATIC_IND_ctr (declared, observed): (Code, Data) +WrongType> ENT_STATIC_THK_MANY_ctr (declared, observed): (Code, Data) +WrongType> ENT_STATIC_THK_SINGLE_ctr (declared, observed): (Code, Data) +WrongType> ENT_VIA_NODE_ctr (declared, observed): (Code, Data) +WrongType> GC_FAILED_PROMOTION_ctr (declared, observed): (Code, Data) +WrongType> GC_SEL_ABANDONED_ctr (declared, observed): (Code, Data) +WrongType> GC_SEL_MAJOR_ctr (declared, observed): (Code, Data) +WrongType> GC_SEL_MINOR_ctr (declared, observed): (Code, Data) +WrongType> HEAP_CHK_ctr (declared, observed): (Code, Data) +WrongType> KNOWN_CALL_EXTRA_ARGS_ctr (declared, observed): (Code, Data) +WrongType> KNOWN_CALL_TOO_FEW_ARGS_ctr (declared, observed): (Code, Data) +WrongType> KNOWN_CALL_ctr (declared, observed): (Code, Data) +WrongType> MULTI_CHUNK_SLOW_CALL_CHUNKS_ctr (declared, observed): (Code, Data) +WrongType> MULTI_CHUNK_SLOW_CALL_ctr (declared, observed): (Code, Data) +WrongType> MainCapability (declared, observed): (Code, Data) +WrongType> RET_NEW_ctr (declared, observed): (Code, Data) +WrongType> RET_NEW_hst (declared, observed): (Code, Data) +WrongType> RET_OLD_ctr (declared, observed): (Code, Data) +WrongType> RET_OLD_hst (declared, observed): (Code, Data) +WrongType> RET_SEMI_loads_avoided (declared, observed): (Code, Data) +WrongType> RET_UNBOXED_TUP_ctr (declared, observed): (Code, Data) +WrongType> RET_UNBOXED_TUP_hst (declared, observed): (Code, Data) +WrongType> SLOW_CALL_FUN_CORRECT_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_FUN_TOO_FEW_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_FUN_TOO_MANY_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_PAP_CORRECT_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_PAP_TOO_FEW_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_PAP_TOO_MANY_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_UNEVALD_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_d_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_f_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_l_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_n_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_p_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_pp_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_ppp_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_pppp_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_ppppp_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_pppppp_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_pppv_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_ppv_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_pv_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_v16_ctr (declared, observed): (Code, Data) +WrongType> SLOW_CALL_fast_v_ctr (declared, observed): (Code, Data) +WrongType> STK_CHK_ctr (declared, observed): (Code, Data) +WrongType> TAG_TAGGED_miss (declared, observed): (Code, Data) +WrongType> TAG_TAGGED_pred (declared, observed): (Code, Data) +WrongType> TAG_UNTAGGED_miss (declared, observed): (Code, Data) +WrongType> TAG_UNTAGGED_pred (declared, observed): (Code, Data) +WrongType> UNKNOWN_CALL_ctr (declared, observed): (Code, Data) +WrongType> UPDF_OMITTED_ctr (declared, observed): (Code, Data) +WrongType> UPDF_PUSHED_ctr (declared, observed): (Code, Data) +WrongType> UPDF_RCC_OMITTED_ctr (declared, observed): (Code, Data) +WrongType> UPDF_RCC_PUSHED_ctr (declared, observed): (Code, Data) +WrongType> UPD_CAF_BH_SINGLE_ENTRY_ctr (declared, observed): (Code, Data) +WrongType> UPD_CAF_BH_UPDATABLE_ctr (declared, observed): (Code, Data) +WrongType> UPD_CON_IN_NEW_ctr (declared, observed): (Code, Data) +WrongType> UPD_CON_IN_PLACE_ctr (declared, observed): (Code, Data) +WrongType> UPD_NEW_IND_ctr (declared, observed): (Code, Data) +WrongType> UPD_NEW_PERM_IND_ctr (declared, observed): (Code, Data) +WrongType> UPD_OLD_IND_ctr (declared, observed): (Code, Data) +WrongType> UPD_OLD_PERM_IND_ctr (declared, observed): (Code, Data) +WrongType> UPD_PAP_IN_NEW_ctr (declared, observed): (Code, Data) +WrongType> UPD_PAP_IN_PLACE_ctr (declared, observed): (Code, Data) +WrongType> UPD_SQUEEZED_ctr (declared, observed): (Code, Data) +WrongType> VERY_SLOW_CALL_ctr (declared, observed): (Code, Data) +WrongType> __stg_gc_enter_1 (declared, observed): (Data, Code) +WrongType> __stg_gc_fun (declared, observed): (Data, Code) +WrongType> closure_flags (declared, observed): (Code, Data) +WrongType> defaultRtsConfig (declared, observed): (Code, Data) +WrongType> g0 (declared, observed): (Code, Data) +WrongType> ghc_unique_counter64 (declared, observed): (Code, Data) +WrongType> ghc_unique_inc (declared, observed): (Code, Data) +WrongType> keepCAFs (declared, observed): (Code, Data) +WrongType> large_alloc_lim (declared, observed): (Code, Data) +WrongType> prog_argc (declared, observed): (Code, Data) +WrongType> prog_argv (declared, observed): (Code, Data) +WrongType> stable_name_table (declared, observed): (Code, Data) +WrongType> stable_ptr_table (declared, observed): (Code, Data) +WrongType> stg_CHARLIKE_closure (declared, observed): (Code, Data) +WrongType> stg_INTLIKE_closure (declared, observed): (Code, Data) +WrongType> stg_absentErrorzh (declared, observed): (Data, Code) +WrongType> stg_annotateStackzh (declared, observed): (Data, Code) +WrongType> stg_ap_0_fast (declared, observed): (Data, Code) +WrongType> stg_ap_d_fast (declared, observed): (Data, Code) +WrongType> stg_ap_f_fast (declared, observed): (Data, Code) +WrongType> stg_ap_l_fast (declared, observed): (Data, Code) +WrongType> stg_ap_n_fast (declared, observed): (Data, Code) +WrongType> stg_ap_p_fast (declared, observed): (Data, Code) +WrongType> stg_ap_pp_fast (declared, observed): (Data, Code) +WrongType> stg_ap_ppp_fast (declared, observed): (Data, Code) +WrongType> stg_ap_pppp_fast (declared, observed): (Data, Code) +WrongType> stg_ap_ppppp_fast (declared, observed): (Data, Code) +WrongType> stg_ap_pppppp_fast (declared, observed): (Data, Code) +WrongType> stg_ap_pppv_fast (declared, observed): (Data, Code) +WrongType> stg_ap_ppv_fast (declared, observed): (Data, Code) +WrongType> stg_ap_pv_fast (declared, observed): (Data, Code) +WrongType> stg_ap_v16_fast (declared, observed): (Data, Code) +WrongType> stg_ap_v32_fast (declared, observed): (Data, Code) +WrongType> stg_ap_v64_fast (declared, observed): (Data, Code) +WrongType> stg_ap_v_fast (declared, observed): (Data, Code) +WrongType> stg_atomicModifyMutVar2zh (declared, observed): (Data, Code) +WrongType> stg_atomicModifyMutVarzuzh (declared, observed): (Data, Code) +WrongType> stg_atomicallyzh (declared, observed): (Data, Code) +WrongType> stg_block_noregs (declared, observed): (Data, Code) +WrongType> stg_block_putmvar (declared, observed): (Data, Code) +WrongType> stg_block_readmvar (declared, observed): (Data, Code) +WrongType> stg_block_takemvar (declared, observed): (Data, Code) +WrongType> stg_casArrayzh (declared, observed): (Data, Code) +WrongType> stg_casInt16Arrayzh (declared, observed): (Data, Code) +WrongType> stg_casInt32Arrayzh (declared, observed): (Data, Code) +WrongType> stg_casInt64Arrayzh (declared, observed): (Data, Code) +WrongType> stg_casInt8Arrayzh (declared, observed): (Data, Code) +WrongType> stg_casIntArrayzh (declared, observed): (Data, Code) +WrongType> stg_casMutVarzh (declared, observed): (Data, Code) +WrongType> stg_casSmallArrayzh (declared, observed): (Data, Code) +WrongType> stg_castDoubleToWord64zh (declared, observed): (Data, Code) +WrongType> stg_castFloatToWord32zh (declared, observed): (Data, Code) +WrongType> stg_castWord32ToFloatzh (declared, observed): (Data, Code) +WrongType> stg_castWord64ToDoublezh (declared, observed): (Data, Code) +WrongType> stg_catchRetryzh (declared, observed): (Data, Code) +WrongType> stg_catchSTMzh (declared, observed): (Data, Code) +WrongType> stg_catchzh (declared, observed): (Data, Code) +WrongType> stg_clearCCSzh (declared, observed): (Data, Code) +WrongType> stg_cloneArrayzh (declared, observed): (Data, Code) +WrongType> stg_cloneMutableArrayzh (declared, observed): (Data, Code) +WrongType> stg_cloneSmallArrayzh (declared, observed): (Data, Code) +WrongType> stg_cloneSmallMutableArrayzh (declared, observed): (Data, Code) +WrongType> stg_closureSizzezh (declared, observed): (Data, Code) +WrongType> stg_compactAddWithSharingzh (declared, observed): (Data, Code) +WrongType> stg_compactAddzh (declared, observed): (Data, Code) +WrongType> stg_compactAllocateBlockzh (declared, observed): (Data, Code) +WrongType> stg_compactContainsAnyzh (declared, observed): (Data, Code) +WrongType> stg_compactContainszh (declared, observed): (Data, Code) +WrongType> stg_compactFixupPointerszh (declared, observed): (Data, Code) +WrongType> stg_compactGetFirstBlockzh (declared, observed): (Data, Code) +WrongType> stg_compactGetNextBlockzh (declared, observed): (Data, Code) +WrongType> stg_compactNewzh (declared, observed): (Data, Code) +WrongType> stg_compactResizzezh (declared, observed): (Data, Code) +WrongType> stg_compactSizzezh (declared, observed): (Data, Code) +WrongType> stg_copyArray_barrier (declared, observed): (Data, Code) +WrongType> stg_copyArrayzh (declared, observed): (Data, Code) +WrongType> stg_copyMutableArrayzh (declared, observed): (Data, Code) +WrongType> stg_copySmallArrayzh (declared, observed): (Data, Code) +WrongType> stg_copySmallMutableArrayzh (declared, observed): (Data, Code) +WrongType> stg_deRefStablePtrzh (declared, observed): (Data, Code) +WrongType> stg_deRefWeakzh (declared, observed): (Data, Code) +WrongType> stg_decodeDoublezu2Intzh (declared, observed): (Data, Code) +WrongType> stg_decodeDoublezuInt64zh (declared, observed): (Data, Code) +WrongType> stg_decodeFloatzuIntzh (declared, observed): (Data, Code) +WrongType> stg_delayzh (declared, observed): (Data, Code) +WrongType> stg_exit (declared, observed): (Data, Code) +WrongType> stg_freezzeArrayzh (declared, observed): (Data, Code) +WrongType> stg_freezzeSmallArrayzh (declared, observed): (Data, Code) +WrongType> stg_gc_bpp (declared, observed): (Data, Code) +WrongType> stg_gc_d1 (declared, observed): (Data, Code) +WrongType> stg_gc_f1 (declared, observed): (Data, Code) +WrongType> stg_gc_ii (declared, observed): (Data, Code) +WrongType> stg_gc_ip (declared, observed): (Data, Code) +WrongType> stg_gc_l1 (declared, observed): (Data, Code) +WrongType> stg_gc_noregs (declared, observed): (Data, Code) +WrongType> stg_gc_pi (declared, observed): (Data, Code) +WrongType> stg_gc_pp (declared, observed): (Data, Code) +WrongType> stg_gc_ppp (declared, observed): (Data, Code) +WrongType> stg_gc_pppp (declared, observed): (Data, Code) +WrongType> stg_gc_ppppp (declared, observed): (Data, Code) +WrongType> stg_gc_prim_n (declared, observed): (Data, Code) +WrongType> stg_gc_prim_p (declared, observed): (Data, Code) +WrongType> stg_gc_prim_pp (declared, observed): (Data, Code) +WrongType> stg_gc_unbx_r1 (declared, observed): (Data, Code) +WrongType> stg_gc_unpt_r1 (declared, observed): (Data, Code) +WrongType> stg_getApStackValzh (declared, observed): (Data, Code) +WrongType> stg_getMaskingStatezh (declared, observed): (Data, Code) +WrongType> stg_getOtherThreadAllocationCounterzh (declared, observed): (Data, Code) +WrongType> stg_getSparkzh (declared, observed): (Data, Code) +WrongType> stg_getThreadAllocationCounterzh (declared, observed): (Data, Code) +WrongType> stg_isByteArrayPinnedzh (declared, observed): (Data, Code) +WrongType> stg_isByteArrayWeaklyPinnedzh (declared, observed): (Data, Code) +WrongType> stg_isCurrentThreadBoundzh (declared, observed): (Data, Code) +WrongType> stg_isEmptyMVarzh (declared, observed): (Data, Code) +WrongType> stg_isMutableByteArrayPinnedzh (declared, observed): (Data, Code) +WrongType> stg_isMutableByteArrayWeaklyPinnedzh (declared, observed): (Data, Code) +WrongType> stg_keepAlivezh (declared, observed): (Data, Code) +WrongType> stg_killThreadzh (declared, observed): (Data, Code) +WrongType> stg_labelThreadzh (declared, observed): (Data, Code) +WrongType> stg_listThreadszh (declared, observed): (Data, Code) +WrongType> stg_makeStablePtrzh (declared, observed): (Data, Code) +WrongType> stg_maskAsyncExceptionszh (declared, observed): (Data, Code) +WrongType> stg_maskUninterruptiblezh (declared, observed): (Data, Code) +WrongType> stg_mkApUpd0zh (declared, observed): (Data, Code) +WrongType> stg_newAlignedPinnedByteArrayzh (declared, observed): (Data, Code) +WrongType> stg_newArrayzh (declared, observed): (Data, Code) +WrongType> stg_newBCOzh (declared, observed): (Data, Code) +WrongType> stg_newByteArrayzh (declared, observed): (Data, Code) +WrongType> stg_newConAppObjzh (declared, observed): (Data, Code) +WrongType> stg_newMVarzh (declared, observed): (Data, Code) +WrongType> stg_newMutVarzh (declared, observed): (Data, Code) +WrongType> stg_newPinnedByteArrayzh (declared, observed): (Data, Code) +WrongType> stg_newSmallArrayzh (declared, observed): (Data, Code) +WrongType> stg_newTVarzh (declared, observed): (Data, Code) +WrongType> stg_noDuplicatezh (declared, observed): (Data, Code) +WrongType> stg_numSparkszh (declared, observed): (Data, Code) +WrongType> stg_paniczh (declared, observed): (Data, Code) +WrongType> stg_putMVarzh (declared, observed): (Data, Code) +WrongType> stg_raiseDivZZerozh (declared, observed): (Data, Code) +WrongType> stg_raiseIOzh (declared, observed): (Data, Code) +WrongType> stg_raiseOverflowzh (declared, observed): (Data, Code) +WrongType> stg_raiseUnderflowzh (declared, observed): (Data, Code) +WrongType> stg_raisezh (declared, observed): (Data, Code) +WrongType> stg_readMVarzh (declared, observed): (Data, Code) +WrongType> stg_readTVarIOzh (declared, observed): (Data, Code) +WrongType> stg_readTVarzh (declared, observed): (Data, Code) +WrongType> stg_resizzeMutableByteArrayzh (declared, observed): (Data, Code) +WrongType> stg_retryzh (declared, observed): (Data, Code) +WrongType> stg_setOtherThreadAllocationCounterzh (declared, observed): (Data, Code) +WrongType> stg_setThreadAllocationCounterzh (declared, observed): (Data, Code) +WrongType> stg_shrinkMutableByteArrayzh (declared, observed): (Data, Code) +WrongType> stg_shrinkSmallMutableArrayzh (declared, observed): (Data, Code) +WrongType> stg_takeMVarzh (declared, observed): (Data, Code) +WrongType> stg_thawArrayzh (declared, observed): (Data, Code) +WrongType> stg_thawSmallArrayzh (declared, observed): (Data, Code) +WrongType> stg_threadLabelzh (declared, observed): (Data, Code) +WrongType> stg_threadStatuszh (declared, observed): (Data, Code) +WrongType> stg_traceBinaryEventzh (declared, observed): (Data, Code) +WrongType> stg_traceEventzh (declared, observed): (Data, Code) +WrongType> stg_traceMarkerzh (declared, observed): (Data, Code) +WrongType> stg_tryReadMVarzh (declared, observed): (Data, Code) +WrongType> stg_tryTakeMVarzh (declared, observed): (Data, Code) +WrongType> stg_unmaskAsyncExceptionszh (declared, observed): (Data, Code) +WrongType> stg_unpackClosurezh (declared, observed): (Data, Code) +WrongType> stg_unsafeThawArrayzh (declared, observed): (Data, Code) +WrongType> stg_unsafeThawSmallArrayzh (declared, observed): (Data, Code) +WrongType> stg_waitReadzh (declared, observed): (Data, Code) +WrongType> stg_waitWritezh (declared, observed): (Data, Code) +WrongType> stg_whereFromzh (declared, observed): (Data, Code) +WrongType> stg_writeTVarzh (declared, observed): (Data, Code) +WrongType> stg_yield_noregs (declared, observed): (Data, Code) +WrongType> stg_yield_to_interpreter (declared, observed): (Data, Code) +WrongType> stg_yieldzh (declared, observed): (Data, Code) +WrongType> ticky_slow_call_unevald (declared, observed): (Code, Data) View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/0fd45be14042e9915b8e51ce873f995... -- View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/0fd45be14042e9915b8e51ce873f995... You're receiving this email because of your account on gitlab.haskell.org. Manage all notifications: https://gitlab.haskell.org/-/profile/notifications | Help: https://gitlab.haskell.org/help
participants (1)
-
David Eichmann (@DavidEichmann)