[Git][ghc/ghc][wip/gbc-files] Add support for generating bytecode objects
                        
                        
by Matthew Pickering (@mpickering) 09 Oct '25
                    by Matthew Pickering (@mpickering) 09 Oct '25
09 Oct '25
                    
                        
Matthew Pickering pushed to branch wip/gbc-files at Glasgow Haskell Compiler / GHC
Commits:
c7f8f69f by Matthew Pickering at 2025-10-09T12:19:05+01:00
Add support for generating bytecode objects
This commit adds the `-fwrite-byte-code` option which makes GHC emit a
`.gbc` file which contains a serialised representation of bytecode.
The bytecode can be loaded by the compiler to avoid having to
reinterpret a module when using the bytecode interpreter (for example,
in GHCi).
There are also the new options:
* -gbcdir=<DIR>: Specify the directory to place the gbc files
* -gbcsuf=<suffix>: Specify the suffix for gbc files
The option `-fbyte-code-and-object-code` now implies
`-fwrite-byte-code`.
These performance tests fail due to https://github.com/haskell/directory/issues/204
-------------------------
Metric Increase:
    MultiComponentModules
    MultiLayerModules
    MultiComponentModulesRecomp
    MultiLayerModulesRecomp
    MultiLayerModulesTH_Make
    MultiLayerModulesTH_OneShot
    T13701
-------------------------
The bytecode serialisation part was implemented by Cheng Shao
Co-authored-by: Cheng Shao <terrorjack(a)type.dance>
- - - - -
66 changed files:
- compiler/GHC/Builtin/PrimOps.hs
- compiler/GHC/ByteCode/Breakpoints.hs
- + compiler/GHC/ByteCode/Serialize.hs
- compiler/GHC/ByteCode/Types.hs
- compiler/GHC/Data/FlatBag.hs
- compiler/GHC/Data/SmallArray.hs
- compiler/GHC/Driver/Backend.hs
- compiler/GHC/Driver/Backpack.hs
- + compiler/GHC/Driver/ByteCode.hs
- compiler/GHC/Driver/Config/Finder.hs
- compiler/GHC/Driver/Downsweep.hs
- compiler/GHC/Driver/DynFlags.hs
- compiler/GHC/Driver/Flags.hs
- compiler/GHC/Driver/Main.hs
- compiler/GHC/Driver/Messager.hs
- compiler/GHC/Driver/Pipeline/Execute.hs
- compiler/GHC/Driver/Session.hs
- compiler/GHC/HsToCore/Breakpoints.hs
- compiler/GHC/HsToCore/Usage.hs
- compiler/GHC/Linker/Deps.hs
- compiler/GHC/Linker/Loader.hs
- compiler/GHC/Linker/Types.hs
- compiler/GHC/Runtime/Eval.hs
- compiler/GHC/Types/SptEntry.hs
- compiler/GHC/Types/Tickish.hs
- compiler/GHC/Unit/Finder.hs
- compiler/GHC/Unit/Finder/Types.hs
- compiler/GHC/Unit/Module/Graph.hs
- compiler/GHC/Unit/Module/Location.hs
- compiler/GHC/Unit/Module/ModSummary.hs
- compiler/GHC/Unit/Module/WholeCoreBindings.hs
- compiler/GHC/Utils/Binary.hs
- compiler/ghc.cabal.in
- docs/users_guide/phases.rst
- docs/users_guide/separate_compilation.rst
- testsuite/tests/bytecode/T24634/T24634a.stdout
- testsuite/tests/bytecode/T24634/T24634b.stdout
- testsuite/tests/count-deps/CountDepsAst.stdout
- testsuite/tests/count-deps/CountDepsParser.stdout
- + testsuite/tests/driver/bytecode-object/A.hs
- + testsuite/tests/driver/bytecode-object/BytecodeForeign.c
- + testsuite/tests/driver/bytecode-object/BytecodeForeign.hs
- + testsuite/tests/driver/bytecode-object/BytecodeMain.hs
- + testsuite/tests/driver/bytecode-object/BytecodeTest.hs
- + testsuite/tests/driver/bytecode-object/Makefile
- + testsuite/tests/driver/bytecode-object/all.T
- + testsuite/tests/driver/bytecode-object/bytecode_object12.stderr
- + testsuite/tests/driver/bytecode-object/bytecode_object13.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object14.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object15.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object16.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object17.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object18.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object19.script
- + testsuite/tests/driver/bytecode-object/bytecode_object19.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object25.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object4.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object5.stdout
- + testsuite/tests/driver/bytecode-object/bytecode_object6.stdout
- testsuite/tests/driver/fat-iface/T22405/T22405.stdout
- testsuite/tests/driver/fat-iface/T22405/T22405b.stdout
- testsuite/tests/driver/fat-iface/fat011.stderr
- testsuite/tests/perf/compiler/Makefile
- + testsuite/tests/perf/compiler/MultiLayerModulesDefsGhciWithBytecodeFiles.script
- testsuite/tests/perf/compiler/all.T
- testsuite/tests/simplStg/should_compile/T22840.stderr
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c7f8f69f6f541308e148a9e9f045052…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/c7f8f69f6f541308e148a9e9f045052…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Git][ghc/ghc][wip/26264] compiler: Attempt to systematize Unique tags by introducing an ADT for each different tag
                        
                        
by Zubin (@wz1000) 09 Oct '25
                    by Zubin (@wz1000) 09 Oct '25
09 Oct '25
                    
                        
Zubin pushed to branch wip/26264 at Glasgow Haskell Compiler / GHC
Commits:
601a8eed by Zubin Duggal at 2025-10-09T16:33:15+05:30
compiler: Attempt to systematize Unique tags by introducing an ADT for each different tag
Fixes #26264
Metric Decrease:
    T9233
- - - - -
41 changed files:
- compiler/GHC/Builtin/Uniques.hs
- compiler/GHC/Cmm/Info.hs
- compiler/GHC/Cmm/Info/Build.hs
- compiler/GHC/Cmm/Pipeline.hs
- compiler/GHC/Cmm/UniqueRenamer.hs
- compiler/GHC/CmmToLlvm/Base.hs
- compiler/GHC/Core/Opt/Monad.hs
- compiler/GHC/Core/Opt/Pipeline.hs
- compiler/GHC/Core/Opt/Simplify/Monad.hs
- compiler/GHC/CoreToStg/Prep.hs
- compiler/GHC/Driver/CodeOutput.hs
- compiler/GHC/Driver/Main.hs
- compiler/GHC/HsToCore/Foreign/JavaScript.hs
- compiler/GHC/HsToCore/Monad.hs
- compiler/GHC/Iface/Binary.hs
- compiler/GHC/Iface/Rename.hs
- compiler/GHC/JS/JStg/Monad.hs
- compiler/GHC/Platform/Reg.hs
- compiler/GHC/Runtime/Eval.hs
- compiler/GHC/Stg/EnforceEpt.hs
- compiler/GHC/Stg/Pipeline.hs
- compiler/GHC/StgToCmm/ExtCode.hs
- compiler/GHC/StgToCmm/Monad.hs
- compiler/GHC/StgToJS/CodeGen.hs
- compiler/GHC/StgToJS/Ids.hs
- compiler/GHC/Tc/Types.hs
- compiler/GHC/Tc/Types/Origin.hs
- compiler/GHC/Tc/Utils/Monad.hs
- compiler/GHC/Types/Name/Cache.hs
- compiler/GHC/Types/Unique.hs
- compiler/GHC/Types/Unique/DSM.hs
- compiler/GHC/Types/Unique/Supply.hs
- + testsuite/tests/ghc-api/T26264.hs
- + testsuite/tests/ghc-api/T26264.stdout
- testsuite/tests/ghc-api/all.T
- testsuite/tests/overloadedrecflds/should_compile/BootFldReexport.stderr
- testsuite/tests/overloadedrecflds/should_fail/T16745.stderr
- testsuite/tests/overloadedrecflds/should_fail/T18999_NoDisambiguateRecordFields.stderr
- testsuite/tests/perf/should_run/UniqLoop.hs
- testsuite/tests/regalloc/regalloc_unit_tests.hs
- testsuite/tests/simplCore/should_compile/rule2.stderr
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/601a8eed8e2aaa28db0f4b68856ce76…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/601a8eed8e2aaa28db0f4b68856ce76…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Git][ghc/ghc][wip/T26166] 6 commits: RtsIfaceStub must be imported by all hsc2hs
                        
                        
by Rodrigo Mesquita (@alt-romes) 09 Oct '25
                    by Rodrigo Mesquita (@alt-romes) 09 Oct '25
09 Oct '25
                    
                        
Rodrigo Mesquita pushed to branch wip/T26166 at Glasgow Haskell Compiler / GHC
Commits:
0328e335 by Rodrigo Mesquita at 2025-10-09T11:13:50+01:00
RtsIfaceStub must be imported by all hsc2hs
Bump hsc2hs submodule
- - - - -
d7e5b3bf by Rodrigo Mesquita at 2025-10-09T11:14:21+01:00
Declare all undefined symbols of the RTS to link against
- - - - -
a1c87ac0 by Rodrigo Mesquita at 2025-10-09T11:15:27+01:00
Revert "Declare all undefined symbols of the RTS to link against"
This reverts commit d7e5b3bff81a8495ca8ecf8aa1278c3947003ea8.
This was not necessary after all because -undefined dynamic_lookup turns
out still works as long as the undefined symbols are not given with
-u...!!!!!
- - - - -
e460125b by Rodrigo Mesquita at 2025-10-09T11:16:14+01:00
Revert "It would still fail to compile .hsc files because of the ld-options... But you can just include the RTS stub in all of those too.... :("
This reverts commit 8155efe9a802a5414a9b6c407dc21bfa365e475b.
No longer necessary since the hsc2hs bump
- - - - -
15fa314d by Rodrigo Mesquita at 2025-10-09T11:16:42+01:00
Re-add pragma once
- - - - -
cff2ab64 by Rodrigo Mesquita at 2025-10-09T11:20:02+01:00
Keep -undefined dynamic_lookup when linking shared libs
bc as long as there are no -u flags, undefined dynamic lookup still works. See https://gitlab.haskell.org/ghc/ghc/-/issues/26166#note_641256
- - - - -
26 changed files:
- compiler/GHC/Linker/Dynamic.hs
- libraries/base/src/System/CPUTime.hsc
- libraries/ghc-internal/ghc-internal.cabal.in
- libraries/ghc-internal/include/RtsIfaceSymbols.h
- libraries/ghc-internal/src/GHC/Internal/Clock.hsc
- libraries/ghc-internal/src/GHC/Internal/ConsoleHandler.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/EPoll.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/KQueue.hsc
- libraries/ghc-internal/src/GHC/Internal/Event/Poll.hsc
- libraries/ghc-internal/src/GHC/Internal/ExecutionStack/Internal.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/Constants.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable/Types.hsc
- libraries/ghc-internal/src/GHC/Internal/Heap/InfoTableProf.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Flock.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/LinuxOFD.hsc
- libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Windows.hsc
- libraries/ghc-internal/src/GHC/Internal/InfoProv/Types.hsc
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags.hsc
- libraries/ghc-internal/src/GHC/Internal/RTS/Flags/Test.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/CCS.hsc
- libraries/ghc-internal/src/GHC/Internal/Stack/Constants.hsc
- libraries/ghc-internal/src/GHC/Internal/Stats.hsc
- libraries/ghc-internal/src/GHC/Internal/System/Environment/Blank.hsc
- libraries/ghc-internal/src/GHC/Internal/System/Environment/ExecutablePath.hsc
- utils/hsc2hs
Changes:
=====================================
compiler/GHC/Linker/Dynamic.hs
=====================================
@@ -144,6 +144,12 @@ linkDynLib logger tmpfs dflags0 unit_env o_files dep_packages
             -- About the options used for Darwin:
             -- -dynamiclib
             --   Apple's way of saying -shared
+            -- -undefined dynamic_lookup:
+            --   Without these options, we'd have to specify the correct
+            --   dependencies for each of the dylibs. Note that we could
+            --   (and should) do without this for all libraries except
+            --   the RTS; all we need to do is to pass the correct
+            --   HSfoo_dyn.dylib files to the link command.
             -- -single_module
             --   Build the dynamic library as a single "module", i.e. no
             --   dynamic binding nonsense when referring to symbols from
@@ -176,6 +182,9 @@ linkDynLib logger tmpfs dflags0 unit_env o_files dep_packages
                     , FileOption "" output_fn
                     ]
                  ++ map Option o_files
+                 ++ [ Option "-undefined",
+                      Option "dynamic_lookup"
+                    ]
                  ++ (if toolSettings_ldSupportsSingleModule (toolSettings dflags)
                         then [ Option "-single_module" ]
                         else [ ])
=====================================
libraries/base/src/System/CPUTime.hsc
=====================================
@@ -17,6 +17,7 @@
 
 #include "HsFFI.h"
 #include "HsBaseConfig.h"
+#include "RtsIfaceStub.h"
 
 -- For various _POSIX_* #defines
 #if defined(HAVE_UNISTD_H)
=====================================
libraries/ghc-internal/ghc-internal.cabal.in
=====================================
@@ -486,6 +486,7 @@ Library
         RtsIfaceStub.h
     install-includes:
         HsBase.h
+        RtsIfaceStub.h
         consUtils.h
 
     if flag(need-atomic)
=====================================
libraries/ghc-internal/include/RtsIfaceSymbols.h
=====================================
@@ -65,4 +65,3 @@ UNDEF_CLOSURE(GHCziInternalziWasmziPrimziImports, raiseJSException_closure)
 UNDEF_CLOSURE(GHCziInternalziWasmziPrim, JSVal_con_info)
 UNDEF_CLOSURE(GHCziInternalziWasmziPrim, threadDelay_closure)
 #endif
-
=====================================
libraries/ghc-internal/src/GHC/Internal/Clock.hsc
=====================================
@@ -15,8 +15,6 @@ import GHC.Internal.Float () -- for Num Double instance
 import GHC.Internal.Num
 #endif
 
-#include "RtsIfaceStub.h"
-
 -- | Return monotonic time in seconds, since some unspecified starting point
 --
 -- @since base-4.11.0.0
=====================================
libraries/ghc-internal/src/GHC/Internal/ConsoleHandler.hsc
=====================================
@@ -19,7 +19,6 @@
 -----------------------------------------------------------------------------
 
 module GHC.Internal.ConsoleHandler
-#include "RtsIfaceStub.h"
 #if !defined(mingw32_HOST_OS)
         where
 
=====================================
libraries/ghc-internal/src/GHC/Internal/Event/EPoll.hsc
=====================================
@@ -24,7 +24,6 @@ module GHC.Internal.Event.EPoll
 import qualified GHC.Internal.Event.Internal as E
 
 #include "EventConfig.h"
-#include "RtsIfaceStub.h"
 #if !defined(HAVE_EPOLL)
 import GHC.Internal.Base
 
=====================================
libraries/ghc-internal/src/GHC/Internal/Event/KQueue.hsc
=====================================
@@ -16,7 +16,6 @@ module GHC.Internal.Event.KQueue
 import qualified GHC.Internal.Event.Internal as E
 
 #include "EventConfig.h"
-#include "RtsIfaceStub.h"
 #if !defined(HAVE_KQUEUE)
 import GHC.Internal.Base
 
=====================================
libraries/ghc-internal/src/GHC/Internal/Event/Poll.hsc
=====================================
@@ -11,7 +11,6 @@ module GHC.Internal.Event.Poll
     ) where
 
 #include "EventConfig.h"
-#include "RtsIfaceStub.h"
 
 #if !defined(HAVE_POLL_H)
 import GHC.Internal.Base
=====================================
libraries/ghc-internal/src/GHC/Internal/ExecutionStack/Internal.hsc
=====================================
@@ -21,7 +21,6 @@
 #include "HsFFI.h"
 #include "HsBaseConfig.h"
 #include "rts/Libdw.h"
-#include "RtsIfaceStub.h"
 
 {-# LANGUAGE MultiWayIf #-}
 
=====================================
libraries/ghc-internal/src/GHC/Internal/Heap/Constants.hsc
=====================================
@@ -7,7 +7,6 @@ module GHC.Internal.Heap.Constants
     ) where
 
 #include "MachDeps.h"
-#include "RtsIfaceStub.h"
 
 import GHC.Internal.Data.Bits
 import GHC.Internal.Int
=====================================
libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable.hsc
=====================================
@@ -6,7 +6,6 @@ module GHC.Internal.Heap.InfoTable
     ) where
 
 #include "Rts.h"
-#include "RtsIfaceStub.h"
 
 import GHC.Internal.Base
 import GHC.Internal.Real
=====================================
libraries/ghc-internal/src/GHC/Internal/Heap/InfoTable/Types.hsc
=====================================
@@ -10,7 +10,6 @@ module GHC.Internal.Heap.InfoTable.Types
     ) where
 
 #include "Rts.h"
-#include "RtsIfaceStub.h"
 
 import GHC.Internal.Base
 import GHC.Internal.Generics
=====================================
libraries/ghc-internal/src/GHC/Internal/Heap/InfoTableProf.hsc
=====================================
@@ -10,7 +10,6 @@ module GHC.Internal.Heap.InfoTableProf
 -- representation of StgInfoTable_ when hsc2hs runs.
 #define PROFILING
 #include "Rts.h"
-#include "RtsIfaceStub.h"
 
 import GHC.Internal.Base
 import GHC.Internal.Real
=====================================
libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Flock.hsc
=====================================
@@ -8,7 +8,6 @@
 module GHC.Internal.IO.Handle.Lock.Flock where
 
 #include "HsBaseConfig.h"
-#include "RtsIfaceStub.h"
 
 #if !HAVE_FLOCK
 -- See W1 of Note [Tracking dependencies on primitives] in GHC.Internal.Base
=====================================
libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/LinuxOFD.hsc
=====================================
@@ -8,7 +8,6 @@
 module GHC.Internal.IO.Handle.Lock.LinuxOFD where
 
 #include "HsBaseConfig.h"
-#include "RtsIfaceStub.h"
 
 #if !HAVE_OFD_LOCKING
 -- See W1 of Note [Tracking dependencies on primitives] in GHC.Internal.Base
=====================================
libraries/ghc-internal/src/GHC/Internal/IO/Handle/Lock/Windows.hsc
=====================================
@@ -8,7 +8,6 @@
 module GHC.Internal.IO.Handle.Lock.Windows where
 
 #include "HsBaseConfig.h"
-#include "RtsIfaceStub.h"
 
 #if !defined(mingw32_HOST_OS)
 -- See W1 of Note [Tracking dependencies on primitives] in GHC.Internal.Base
=====================================
libraries/ghc-internal/src/GHC/Internal/InfoProv/Types.hsc
=====================================
@@ -5,7 +5,6 @@
 {-# LANGUAGE NoImplicitPrelude #-}
 
 #include "Rts.h"
-#include "RtsIfaceStub.h"
 
 module GHC.Internal.InfoProv.Types
     ( InfoProv(..)
=====================================
libraries/ghc-internal/src/GHC/Internal/RTS/Flags.hsc
=====================================
@@ -52,7 +52,6 @@ module GHC.Internal.RTS.Flags
   ) where
 
 #include "Rts.h"
-#include "RtsIfaceStub.h"
 #include "rts/Flags.h"
 
 import GHC.Internal.Data.Functor ((<$>))
=====================================
libraries/ghc-internal/src/GHC/Internal/RTS/Flags/Test.hsc
=====================================
@@ -7,8 +7,6 @@ module GHC.Internal.RTS.Flags.Test
   )
 where
 
-#include "RtsIfaceStub.h"
-
 import GHC.Internal.Base
 
 #if !defined(javascript_HOST_ARCH)
=====================================
libraries/ghc-internal/src/GHC/Internal/Stack/CCS.hsc
=====================================
@@ -47,7 +47,6 @@ import GHC.Internal.List ( concatMap, reverse )
 
 #define PROFILING
 #include "Rts.h"
-#include "RtsIfaceStub.h"
 
 -- | A cost-centre stack from GHC's cost-center profiler.
 data CostCentreStack
=====================================
libraries/ghc-internal/src/GHC/Internal/Stack/Constants.hsc
=====================================
@@ -14,7 +14,6 @@ import GHC.Internal.Real
 #undef MBLOCK_SIZE
 #undef BLOCKS_PER_MBLOCK
 #include "DerivedConstants.h"
-#include "RtsIfaceStub.h"
 
 newtype ByteOffset = ByteOffset { offsetInBytes :: Int }
   deriving newtype (Eq, Show, Integral, Real, Num, Enum, Ord)
=====================================
libraries/ghc-internal/src/GHC/Internal/Stats.hsc
=====================================
@@ -45,7 +45,6 @@ import GHC.Internal.Foreign.Storable
 import GHC.Internal.Foreign.Ptr
 
 #include "Rts.h"
-#include "RtsIfaceStub.h"
 
 foreign import ccall "getRTSStats" getRTSStats_ :: Ptr () -> IO ()
 
=====================================
libraries/ghc-internal/src/GHC/Internal/System/Environment/Blank.hsc
=====================================
@@ -74,7 +74,6 @@ import qualified GHC.Internal.System.Environment as Environment
 #endif
 
 #include "HsBaseConfig.h"
-#include "RtsIfaceStub.h"
 
 throwInvalidArgument :: String -> IO a
 throwInvalidArgument from =
=====================================
libraries/ghc-internal/src/GHC/Internal/System/Environment/ExecutablePath.hsc
=====================================
@@ -104,9 +104,6 @@ import GHC.Internal.Foreign.Storable
 import GHC.Internal.System.Posix.Internals
 #endif
 
-#include "RtsIfaceStub.h"
-
-
 -- The exported function is defined outside any if-guard to make sure
 -- every OS implements it with the same type.
 
=====================================
utils/hsc2hs
=====================================
@@ -1 +1 @@
-Subproject commit fe3990b9f35000427b016a79330d9f195587cad8
+Subproject commit 3863f81b72d1c5877505e840fd203193c50d2e0f
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a025452f36c3aa2e77f64c25888cc3…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/a025452f36c3aa2e77f64c25888cc3…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Git][ghc/ghc][wip/keepAlive-th-names-found-in-annotations] keepAlive TH.Names found in annotations
                        
                        
by Oleg Grenrus (@phadej) 08 Oct '25
                    by Oleg Grenrus (@phadej) 08 Oct '25
08 Oct '25
                    
                        
Oleg Grenrus pushed to branch wip/keepAlive-th-names-found-in-annotations at Glasgow Haskell Compiler / GHC
Commits:
105c4237 by Oleg Grenrus at 2025-10-09T03:23:28+03:00
keepAlive TH.Names found in annotations
- - - - -
4 changed files:
- compiler/GHC/Rename/Splice.hs
- compiler/GHC/Tc/Gen/Splice.hs
- compiler/GHC/Types/Meta.hs
- compiler/GHC/Utils/Outputable.hs
Changes:
=====================================
compiler/GHC/Rename/Splice.hs
=====================================
@@ -1072,6 +1072,32 @@ a bit hacky.
 For these chaps (which have Internal Names) we don't want to put
 them in the keep-alive set.
 
+Note [Keeping things alive referenced by TH.Name from annotations]
+
+Consider
+
+  {-# ANN module 'f #-}
+
+We stage-check annotations as splices, because we are going to run them,
+and thus similar stage restrictions apply.
+
+That however leads for 'f not being persisted. Consider briefly
+
+  expr = $(  [| f |] )
+
+Here, `f` isn't kept alive by the same mechanism as in
+Note [Keeping things alive for Template Haskell], as there isn't need for that.
+Once the splice is evaluated and spliced, compiler will see
+
+  expr = f
+
+in other words, there will be explicit use of `f`.
+
+Returning back to the ANN example: once the annotation is run,
+we previously had an opaque Serialised blob. There might be a TH Name inside,
+but GHC won't know about it. To work around that we not only serialise
+the annotation value, but also traverse it to extract all TH Names.
+
 Note [Quoting names]
 ~~~~~~~~~~~~~~~~~~~~
 A quoted name 'n is a bit like a quoted expression [| n |], except that we
=====================================
compiler/GHC/Tc/Gen/Splice.hs
=====================================
@@ -166,14 +166,16 @@ import qualified Data.ByteString.Lazy as LB
 import Data.Dynamic  ( fromDynamic, toDyn )
 import qualified Data.IntMap as IntMap
 import qualified Data.Map as Map
-import Data.Typeable ( typeOf, Typeable, TypeRep, typeRep )
-import Data.Data (Data)
+import Data.Typeable ( typeOf, Typeable, TypeRep, typeRep, cast )
+import Data.Data (Data, gmapQ)
 import Data.Proxy    ( Proxy (..) )
 import Data.IORef
 import GHC.Parser.HaddockLex (lexHsDoc)
 import GHC.Parser (parseIdentifier)
 import GHC.Rename.Doc (rnHsDoc)
 
+import Debug.Trace
+
 {-
 Note [Template Haskell state diagram]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -668,14 +670,12 @@ Example:
 -}
 
 -- None of these functions add constraints to the LIE
-
-tcTypedBracket    :: HsExpr GhcRn -> LHsExpr GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
-tcUntypedBracket  :: HsExpr GhcRn -> HsQuote GhcRn -> [PendingRnSplice] -> ExpRhoType
-                  -> TcM (HsExpr GhcTc)
-tcTypedSplice     :: HsTypedSpliceResult -> HsTypedSplice GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
-
-getUntypedSpliceBody :: HsUntypedSpliceResult (HsExpr GhcRn) -> TcM (HsExpr GhcRn)
-runAnnotation        :: CoreAnnTarget -> LHsExpr GhcRn -> TcM Annotation
+--
+-- * tcTypedBracket
+-- * tcUntypedBracket
+-- * tcTypedSplice
+-- * getUntypedSpliceBody
+-- * runAnnotation
 
 {-
 ************************************************************************
@@ -686,6 +686,7 @@ runAnnotation        :: CoreAnnTarget -> LHsExpr GhcRn -> TcM Annotation
 -}
 
 -- See Note [How brackets and nested splices are handled]
+tcTypedBracket :: HsExpr GhcRn -> LHsExpr GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
 tcTypedBracket rn_expr expr res_ty
   = addErrCtxt (TypedTHBracketCtxt expr) $
     do { cur_lvl <- getThLevel
@@ -728,6 +729,7 @@ tcTypedBracket rn_expr expr res_ty
                        meta_ty res_ty }
 
 -- See Note [Typechecking Overloaded Quotes]
+tcUntypedBracket :: HsExpr GhcRn -> HsQuote GhcRn -> [PendingRnSplice] -> ExpRhoType -> TcM (HsExpr GhcTc)
 tcUntypedBracket rn_expr brack ps res_ty
   = do { traceTc "tc_bracket untyped" (ppr brack $$ ppr ps)
 
@@ -929,6 +931,7 @@ tcCodeTy m_ty exp_ty
 -- getUntypedSpliceBody: the renamer has expanded the splice.
 -- Just run the finalizers that it produced, and return
 -- the renamed expression
+getUntypedSpliceBody :: HsUntypedSpliceResult (HsExpr GhcRn) -> TcM (HsExpr GhcRn)
 getUntypedSpliceBody (HsUntypedSpliceTop { utsplice_result_finalizers = mod_finalizers
                                          , utsplice_result = rn_expr })
   = do { addModFinalizersWithLclEnv mod_finalizers
@@ -936,6 +939,7 @@ getUntypedSpliceBody (HsUntypedSpliceTop { utsplice_result_finalizers = mod_fina
 getUntypedSpliceBody (HsUntypedSpliceNested {})
   = panic "tcTopUntypedSplice: invalid nested splice"
 
+tcTypedSplice :: HsTypedSpliceResult -> HsTypedSplice GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
 tcTypedSplice HsTypedSpliceTop ctxt@(HsTypedSpliceExpr _ expr) res_ty
   = addErrCtxt (TypedSpliceCtxt Nothing ctxt) $
     setSrcSpan (getLocA expr)    $
@@ -1082,6 +1086,7 @@ stubNestedSplice = warnPprTrace True "stubNestedSplice" empty $
 ************************************************************************
 -}
 
+runAnnotation :: CoreAnnTarget -> LHsExpr GhcRn -> TcM Annotation
 runAnnotation target expr = do
     -- Find the classes we want instances for in order to call toAnnotationWrapper
     loc <- getSrcSpanM
@@ -1106,17 +1111,32 @@ runAnnotation target expr = do
                                 specialised_to_annotation_wrapper_expr expr'))
                                 })
 
+    traceM $ "runAnnotation: " ++ showPprUnsafe zonked_wrapped_expr'
+
     -- Run the appropriately wrapped expression to get the value of
     -- the annotation and its dictionaries. The return value is of
     -- type AnnotationWrapper by construction, so this conversion is
     -- safe
-    serialized <- runMetaAW zonked_wrapped_expr'
+    (names, serialized) <- runMetaAW zonked_wrapped_expr'
+    -- See Note [Keeping things alive referenced by TH.Name from annotations]
+    traceM $ "runAnnotation names: " ++ showPprUnsafe names
+
+    forM_ names $ \th_name -> do
+        mb_name <- lookupThName_maybe th_name
+        traceM $ "runAnnotation found: " ++ showPprUnsafe mb_name
+        forM_ mb_name keepAlive -- TODO: do we need to do checks, like isExternalName here?
+
     return Annotation {
                ann_target = target,
                ann_value = serialized
            }
 
-convertAnnotationWrapper :: ForeignHValue -> TcM Serialized
+extractTHNames :: Data a => a -> [TH.Name]
+extractTHNames x = case cast x of
+    Just n -> [n]
+    Nothing -> concat (gmapQ extractTHNames x)
+
+convertAnnotationWrapper :: ForeignHValue -> TcM ([TH.Name], Serialized)
 convertAnnotationWrapper fhv = do
   interp <- tcGetInterp
   case interpInstance interp of
@@ -1133,8 +1153,7 @@ convertAnnotationWrapper fhv = do
                -- annotation are exposed at this point.  This is also why we are
                -- doing all this stuff inside the context of runMeta: it has the
                -- facilities to deal with user error in a meta-level expression
-               rnf serialized `seq` serialized
-
+               (extractTHNames value, rnf serialized `seq` serialized)
 #endif
 
 {-
@@ -1216,7 +1235,7 @@ defaultRunMeta (MetaAW r)
 
 ----------------
 runMetaAW :: LHsExpr GhcTc         -- Of type AnnotationWrapper
-          -> TcM Serialized
+          -> TcM ([TH.Name], Serialized)
 runMetaAW = runMeta metaRequestAW
 
 runMetaE :: LHsExpr GhcTc          -- Of type (Q Exp)
=====================================
compiler/GHC/Types/Meta.hs
=====================================
@@ -14,6 +14,7 @@ where
 import GHC.Prelude
 
 import GHC.Serialized   ( Serialized )
+import qualified GHC.Boot.TH.Syntax as TH
 
 import GHC.Hs
 import GHC.Utils.Outputable
@@ -26,7 +27,7 @@ data MetaRequest
   | MetaP  (LPat GhcPs      -> MetaResult)
   | MetaT  (LHsType GhcPs   -> MetaResult)
   | MetaD  ([LHsDecl GhcPs] -> MetaResult)
-  | MetaAW (Serialized     -> MetaResult)
+  | MetaAW (([TH.Name], Serialized) -> MetaResult)
 
 -- | data constructors not exported to ensure correct result type
 data MetaResult
@@ -34,7 +35,7 @@ data MetaResult
   | MetaResP  (LPat GhcPs)
   | MetaResT  (LHsType GhcPs)
   | MetaResD  [LHsDecl GhcPs]
-  | MetaResAW Serialized
+  | MetaResAW ([TH.Name], Serialized)
 
 instance Outputable MetaResult where
     ppr (MetaResE e)   = text "MetaResE"  <> braces (ppr e)
@@ -63,7 +64,7 @@ unMetaResD :: MetaResult -> [LHsDecl GhcPs]
 unMetaResD (MetaResD d) = d
 unMetaResD mr           = pprPanic "unMetaResD" (ppr mr)
 
-unMetaResAW :: MetaResult -> Serialized
+unMetaResAW :: MetaResult -> ([TH.Name], Serialized)
 unMetaResAW (MetaResAW aw) = aw
 unMetaResAW mr             = pprPanic "unMetaResAW" (ppr mr)
 
@@ -81,6 +82,6 @@ metaRequestT h = fmap unMetaResT . h (MetaT MetaResT)
 metaRequestD :: Functor f => MetaHook f -> LHsExpr GhcTc -> f [LHsDecl GhcPs]
 metaRequestD h = fmap unMetaResD . h (MetaD MetaResD)
 
-metaRequestAW :: Functor f => MetaHook f -> LHsExpr GhcTc -> f Serialized
+metaRequestAW :: Functor f => MetaHook f -> LHsExpr GhcTc -> f ([TH.Name], Serialized)
 metaRequestAW h = fmap unMetaResAW . h (MetaAW MetaResAW)
 
=====================================
compiler/GHC/Utils/Outputable.hs
=====================================
@@ -167,6 +167,8 @@ import GHC.Show         ( showMultiLineString )
 import GHC.Utils.Exception
 import GHC.Exts (oneShot)
 
+import qualified GHC.Boot.TH.Syntax as TH
+
 {-
 ************************************************************************
 *                                                                      *
@@ -1094,13 +1096,15 @@ instance Outputable a => Outputable (SCC a) where
 instance Outputable Serialized where
     ppr (Serialized the_type bytes) = int (length bytes) <+> text "of type" <+> text (show the_type)
 
+instance Outputable TH.Name where
+    ppr = text . TH.showName
+
 instance Outputable Extension where
     ppr = text . show
 
 instance Outputable ModuleName where
   ppr = pprModuleName
 
-
 pprModuleName :: IsLine doc => ModuleName -> doc
 pprModuleName (ModuleName nm) =
     docWithStyle (ztext (zEncodeFS nm)) (\_ -> ftext nm)
@@ -1250,6 +1254,7 @@ instance (OutputableP env a) => OutputableP env (Set a) where
 instance OutputableP env Void where
     pdoc _ = \ case
 
+
 {-
 ************************************************************************
 *                                                                      *
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/105c42373a7eeaace87c9efcdab4d3c…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/105c42373a7eeaace87c9efcdab4d3c…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Git][ghc/ghc][wip/keepAlive-th-names-found-in-annotations] keepAlive TH.Names found in annotations
                        
                        
by Oleg Grenrus (@phadej) 08 Oct '25
                    by Oleg Grenrus (@phadej) 08 Oct '25
08 Oct '25
                    
                        
Oleg Grenrus pushed to branch wip/keepAlive-th-names-found-in-annotations at Glasgow Haskell Compiler / GHC
Commits:
cf370101 by Oleg Grenrus at 2025-10-09T01:33:01+03:00
keepAlive TH.Names found in annotations
- - - - -
4 changed files:
- compiler/GHC/Rename/Splice.hs
- compiler/GHC/Tc/Gen/Splice.hs
- compiler/GHC/Types/Meta.hs
- compiler/GHC/Utils/Outputable.hs
Changes:
=====================================
compiler/GHC/Rename/Splice.hs
=====================================
@@ -187,6 +187,7 @@ rn_utbracket (VarBr _ flg rdr_name)
        ; let res_name = L (l2l (locA rdr_name)) (WithUserRdr (unLoc rdr_name) name)
        ; if flg then checkThLocalNameNoLift res_name else checkThLocalTyName name
        ; check_namespace flg name
+       ; keepAlive name
        ; return (VarBr noExtField flg (noLocA name), unitFV name) }
 
 rn_utbracket (ExpBr _ e) = do { (e', fvs) <- rnLExpr e
@@ -1072,6 +1073,32 @@ a bit hacky.
 For these chaps (which have Internal Names) we don't want to put
 them in the keep-alive set.
 
+Note [Keeping things alive referenced by TH.Name from annotations]
+
+Consider
+
+  {-# ANN module 'f #-}
+
+We stage-check annotations as splices, because we are going to run them,
+and thus similar stage restrictions apply.
+
+That however leads for 'f not being persisted. Consider briefly
+
+  expr = $(  [| f |] )
+
+Here, `f` isn't kept alive by the same mechanism as in
+Note [Keeping things alive for Template Haskell], as there isn't need for that.
+Once the splice is evaluated and spliced, compiler will see
+
+  expr = f
+
+in other words, there will be explicit use of `f`.
+
+Returning back to the ANN example: once the annotation is run,
+we previously had an opaque Serialised blob. There might be a TH Name inside,
+but GHC won't know about it. To work around that we not only serialise
+the annotation value, but also traverse it to extract all TH Names.
+
 Note [Quoting names]
 ~~~~~~~~~~~~~~~~~~~~
 A quoted name 'n is a bit like a quoted expression [| n |], except that we
=====================================
compiler/GHC/Tc/Gen/Splice.hs
=====================================
@@ -166,14 +166,16 @@ import qualified Data.ByteString.Lazy as LB
 import Data.Dynamic  ( fromDynamic, toDyn )
 import qualified Data.IntMap as IntMap
 import qualified Data.Map as Map
-import Data.Typeable ( typeOf, Typeable, TypeRep, typeRep )
-import Data.Data (Data)
+import Data.Typeable ( typeOf, Typeable, TypeRep, typeRep, cast )
+import Data.Data (Data, gmapQ)
 import Data.Proxy    ( Proxy (..) )
 import Data.IORef
 import GHC.Parser.HaddockLex (lexHsDoc)
 import GHC.Parser (parseIdentifier)
 import GHC.Rename.Doc (rnHsDoc)
 
+import Debug.Trace
+
 {-
 Note [Template Haskell state diagram]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -668,14 +670,12 @@ Example:
 -}
 
 -- None of these functions add constraints to the LIE
-
-tcTypedBracket    :: HsExpr GhcRn -> LHsExpr GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
-tcUntypedBracket  :: HsExpr GhcRn -> HsQuote GhcRn -> [PendingRnSplice] -> ExpRhoType
-                  -> TcM (HsExpr GhcTc)
-tcTypedSplice     :: HsTypedSpliceResult -> HsTypedSplice GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
-
-getUntypedSpliceBody :: HsUntypedSpliceResult (HsExpr GhcRn) -> TcM (HsExpr GhcRn)
-runAnnotation        :: CoreAnnTarget -> LHsExpr GhcRn -> TcM Annotation
+--
+-- * tcTypedBracket
+-- * tcUntypedBracket
+-- * tcTypedSplice
+-- * getUntypedSpliceBody
+-- * runAnnotation
 
 {-
 ************************************************************************
@@ -686,6 +686,7 @@ runAnnotation        :: CoreAnnTarget -> LHsExpr GhcRn -> TcM Annotation
 -}
 
 -- See Note [How brackets and nested splices are handled]
+tcTypedBracket :: HsExpr GhcRn -> LHsExpr GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
 tcTypedBracket rn_expr expr res_ty
   = addErrCtxt (TypedTHBracketCtxt expr) $
     do { cur_lvl <- getThLevel
@@ -728,6 +729,7 @@ tcTypedBracket rn_expr expr res_ty
                        meta_ty res_ty }
 
 -- See Note [Typechecking Overloaded Quotes]
+tcUntypedBracket :: HsExpr GhcRn -> HsQuote GhcRn -> [PendingRnSplice] -> ExpRhoType -> TcM (HsExpr GhcTc)
 tcUntypedBracket rn_expr brack ps res_ty
   = do { traceTc "tc_bracket untyped" (ppr brack $$ ppr ps)
 
@@ -929,6 +931,7 @@ tcCodeTy m_ty exp_ty
 -- getUntypedSpliceBody: the renamer has expanded the splice.
 -- Just run the finalizers that it produced, and return
 -- the renamed expression
+getUntypedSpliceBody :: HsUntypedSpliceResult (HsExpr GhcRn) -> TcM (HsExpr GhcRn)
 getUntypedSpliceBody (HsUntypedSpliceTop { utsplice_result_finalizers = mod_finalizers
                                          , utsplice_result = rn_expr })
   = do { addModFinalizersWithLclEnv mod_finalizers
@@ -936,6 +939,7 @@ getUntypedSpliceBody (HsUntypedSpliceTop { utsplice_result_finalizers = mod_fina
 getUntypedSpliceBody (HsUntypedSpliceNested {})
   = panic "tcTopUntypedSplice: invalid nested splice"
 
+tcTypedSplice :: HsTypedSpliceResult -> HsTypedSplice GhcRn -> ExpRhoType -> TcM (HsExpr GhcTc)
 tcTypedSplice HsTypedSpliceTop ctxt@(HsTypedSpliceExpr _ expr) res_ty
   = addErrCtxt (TypedSpliceCtxt Nothing ctxt) $
     setSrcSpan (getLocA expr)    $
@@ -1082,6 +1086,7 @@ stubNestedSplice = warnPprTrace True "stubNestedSplice" empty $
 ************************************************************************
 -}
 
+runAnnotation :: CoreAnnTarget -> LHsExpr GhcRn -> TcM Annotation
 runAnnotation target expr = do
     -- Find the classes we want instances for in order to call toAnnotationWrapper
     loc <- getSrcSpanM
@@ -1106,17 +1111,33 @@ runAnnotation target expr = do
                                 specialised_to_annotation_wrapper_expr expr'))
                                 })
 
+    traceM $ "runAnnotation: " ++ showPprUnsafe zonked_wrapped_expr'
+
     -- Run the appropriately wrapped expression to get the value of
     -- the annotation and its dictionaries. The return value is of
     -- type AnnotationWrapper by construction, so this conversion is
     -- safe
-    serialized <- runMetaAW zonked_wrapped_expr'
+    (names, serialized) <- runMetaAW zonked_wrapped_expr'
+    -- See Note [Keeping things alive referenced by TH.Name from annotations]
+    traceM $ "runAnnotation names: " ++ showPprUnsafe names
+{-
+    forM_ names $ \th_name -> do
+        mb_name <- lookupThName_maybe th_name
+        traceM $ "runAnnotation found: " ++ showPprUnsafe mb_name
+        forM_ mb_name keepAlive -- TODO: do we need to do checks, like isExternalName here?
+-}
+
     return Annotation {
                ann_target = target,
                ann_value = serialized
            }
 
-convertAnnotationWrapper :: ForeignHValue -> TcM Serialized
+extractTHNames :: Data a => a -> [TH.Name]
+extractTHNames x = case cast x of
+    Just n -> [n]
+    Nothing -> concat (gmapQ extractTHNames x)
+
+convertAnnotationWrapper :: ForeignHValue -> TcM ([TH.Name], Serialized)
 convertAnnotationWrapper fhv = do
   interp <- tcGetInterp
   case interpInstance interp of
@@ -1133,8 +1154,7 @@ convertAnnotationWrapper fhv = do
                -- annotation are exposed at this point.  This is also why we are
                -- doing all this stuff inside the context of runMeta: it has the
                -- facilities to deal with user error in a meta-level expression
-               rnf serialized `seq` serialized
-
+               (extractTHNames value, rnf serialized `seq` serialized)
 #endif
 
 {-
@@ -1216,7 +1236,7 @@ defaultRunMeta (MetaAW r)
 
 ----------------
 runMetaAW :: LHsExpr GhcTc         -- Of type AnnotationWrapper
-          -> TcM Serialized
+          -> TcM ([TH.Name], Serialized)
 runMetaAW = runMeta metaRequestAW
 
 runMetaE :: LHsExpr GhcTc          -- Of type (Q Exp)
=====================================
compiler/GHC/Types/Meta.hs
=====================================
@@ -14,6 +14,7 @@ where
 import GHC.Prelude
 
 import GHC.Serialized   ( Serialized )
+import qualified GHC.Boot.TH.Syntax as TH
 
 import GHC.Hs
 import GHC.Utils.Outputable
@@ -26,7 +27,7 @@ data MetaRequest
   | MetaP  (LPat GhcPs      -> MetaResult)
   | MetaT  (LHsType GhcPs   -> MetaResult)
   | MetaD  ([LHsDecl GhcPs] -> MetaResult)
-  | MetaAW (Serialized     -> MetaResult)
+  | MetaAW (([TH.Name], Serialized) -> MetaResult)
 
 -- | data constructors not exported to ensure correct result type
 data MetaResult
@@ -34,7 +35,7 @@ data MetaResult
   | MetaResP  (LPat GhcPs)
   | MetaResT  (LHsType GhcPs)
   | MetaResD  [LHsDecl GhcPs]
-  | MetaResAW Serialized
+  | MetaResAW ([TH.Name], Serialized)
 
 instance Outputable MetaResult where
     ppr (MetaResE e)   = text "MetaResE"  <> braces (ppr e)
@@ -63,7 +64,7 @@ unMetaResD :: MetaResult -> [LHsDecl GhcPs]
 unMetaResD (MetaResD d) = d
 unMetaResD mr           = pprPanic "unMetaResD" (ppr mr)
 
-unMetaResAW :: MetaResult -> Serialized
+unMetaResAW :: MetaResult -> ([TH.Name], Serialized)
 unMetaResAW (MetaResAW aw) = aw
 unMetaResAW mr             = pprPanic "unMetaResAW" (ppr mr)
 
@@ -81,6 +82,6 @@ metaRequestT h = fmap unMetaResT . h (MetaT MetaResT)
 metaRequestD :: Functor f => MetaHook f -> LHsExpr GhcTc -> f [LHsDecl GhcPs]
 metaRequestD h = fmap unMetaResD . h (MetaD MetaResD)
 
-metaRequestAW :: Functor f => MetaHook f -> LHsExpr GhcTc -> f Serialized
+metaRequestAW :: Functor f => MetaHook f -> LHsExpr GhcTc -> f ([TH.Name], Serialized)
 metaRequestAW h = fmap unMetaResAW . h (MetaAW MetaResAW)
 
=====================================
compiler/GHC/Utils/Outputable.hs
=====================================
@@ -167,6 +167,8 @@ import GHC.Show         ( showMultiLineString )
 import GHC.Utils.Exception
 import GHC.Exts (oneShot)
 
+import qualified GHC.Boot.TH.Syntax as TH
+
 {-
 ************************************************************************
 *                                                                      *
@@ -1094,13 +1096,15 @@ instance Outputable a => Outputable (SCC a) where
 instance Outputable Serialized where
     ppr (Serialized the_type bytes) = int (length bytes) <+> text "of type" <+> text (show the_type)
 
+instance Outputable TH.Name where
+    ppr = text . TH.showName
+
 instance Outputable Extension where
     ppr = text . show
 
 instance Outputable ModuleName where
   ppr = pprModuleName
 
-
 pprModuleName :: IsLine doc => ModuleName -> doc
 pprModuleName (ModuleName nm) =
     docWithStyle (ztext (zEncodeFS nm)) (\_ -> ftext nm)
@@ -1250,6 +1254,7 @@ instance (OutputableP env a) => OutputableP env (Set a) where
 instance OutputableP env Void where
     pdoc _ = \ case
 
+
 {-
 ************************************************************************
 *                                                                      *
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/cf37010100b816368bebd31e98e8785…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/cf37010100b816368bebd31e98e8785…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Git][ghc/ghc] Pushed new branch wip/keepAlive-th-names-found-in-annotations
                        
                        
by Oleg Grenrus (@phadej) 08 Oct '25
                    by Oleg Grenrus (@phadej) 08 Oct '25
08 Oct '25
                    
                        
Oleg Grenrus pushed new branch wip/keepAlive-th-names-found-in-annotations at Glasgow Haskell Compiler / GHC
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/tree/wip/keepAlive-th-names-found-in-a…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    08 Oct '25
                    
                        
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
f9790ca8 by Ben Gamari at 2025-10-08T18:24:19-04:00
gitlab-ci: Make RELEASE_JOB an input
Rather than an undocumented variable.
- - - - -
1 changed file:
- .gitlab-ci.yml
Changes:
=====================================
.gitlab-ci.yml
=====================================
@@ -1,3 +1,12 @@
+spec:
+  inputs:
+    release:
+      default: "no"
+      description: Release pipeline
+      options: [ "yes", "no" ]
+
+---
+
 variables:
   GIT_SSL_NO_VERIFY: "1"
 
@@ -28,6 +37,8 @@ variables:
   # Makes ci.sh isolate CABAL_DIR
   HERMETIC: "YES"
 
+  RELEASE_JOB: $[[ inputs.release ]]
+
   # Reduce XZ compression level for regular jobs (it is bumped to 9 for releases
   # and nightly jobs). In my experiments I've got the following bindist size in
   # the given time for each compression level (with the quick flavour):
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/f9790ca81deb8b14ff2eabf701aecbc…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/f9790ca81deb8b14ff2eabf701aecbc…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Git][ghc/ghc][master] 2 commits: Improvements to 'mayLookIdentical'
                        
                        
by Marge Bot (@marge-bot) 08 Oct '25
                    by Marge Bot (@marge-bot) 08 Oct '25
08 Oct '25
                    
                        
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
2b8baada by sheaf at 2025-10-08T18:23:37-04:00
Improvements to 'mayLookIdentical'
This commit makes significant improvements to the machinery that decides
when we should pretty-print the "invisible bits" of a type, such as:
  - kind applications, e.g. '@k' in 'Proxy @k ty'
  - RuntimeReps, e.g. 'TYPE r'
  - multiplicities and linear arrows 'a %1 -> b'
To do this, this commit refactors 'mayLookIdentical' to return **which**
of the invisible bits don't match up, e.g. in
  (a %1 -> b) ~ (a %Many -> b)
we find that the invisible bit that doesn't match up is a multiplicity,
so we should set 'sdocLinearTypes = True' when pretty-printing, and with
e.g.
  Proxy @k1 ~ Proxy @k2
we find that the invisible bit that doesn't match up is an invisible
TyCon argument, so we set 'sdocPrintExplicitKinds = True'.
We leverage these changes to remove the ad-hoc treatment of linearity
of data constructors with 'dataConDisplayType' and 'dataConNonLinearType'.
This is now handled by the machinery of 'pprWithInvisibleBits'.
Fixes #26335 #26340
- - - - -
129ce32d by sheaf at 2025-10-08T18:23:37-04:00
Store SDoc context in SourceError
This commits modifies the SourceError datatype which is used for
throwing and then reporting exceptions by storing all the info we need
to be able to print the SDoc, including whether we should print with
explicit kinds, explicit runtime-reps, etc.
This is done using the new datatype:
  data SourceErrorContext
    = SEC
        !DiagOpts
        !(DiagnosticOpts GhcMessage)
Now, when we come to report an error (by handling the exception), we
have access to the full context we need.
Fixes #26387
- - - - -
69 changed files:
- compiler/GHC.hs
- compiler/GHC/Core/Multiplicity.hs
- compiler/GHC/Core/TyCo/Compare.hs
- compiler/GHC/Core/TyCo/Ppr.hs
- compiler/GHC/Driver/Backpack.hs
- compiler/GHC/Driver/Downsweep.hs
- compiler/GHC/Driver/Env/Types.hs
- compiler/GHC/Driver/Errors.hs
- compiler/GHC/Driver/Main.hs
- compiler/GHC/Driver/Make.hs
- compiler/GHC/Driver/MakeFile.hs
- compiler/GHC/Driver/Monad.hs
- compiler/GHC/Driver/Pipeline/Execute.hs
- compiler/GHC/Hs/Decls.hs
- compiler/GHC/Hs/Type.hs
- compiler/GHC/Iface/Decl.hs
- compiler/GHC/Iface/Ext/Ast.hs
- compiler/GHC/Iface/Load.hs
- compiler/GHC/Iface/Make.hs
- compiler/GHC/Iface/Type.hs
- compiler/GHC/Parser/Header.hs
- compiler/GHC/Tc/Errors/Ppr.hs
- compiler/GHC/Tc/Errors/Types.hs
- compiler/GHC/Tc/Gen/HsType.hs
- compiler/GHC/Tc/Gen/Splice.hs
- compiler/GHC/Tc/Module.hs
- compiler/GHC/Tc/Solver/Equality.hs
- compiler/GHC/Tc/TyCl.hs
- compiler/GHC/Tc/Types/CtLoc.hs
- compiler/GHC/Tc/Types/Origin.hs
- compiler/GHC/Tc/Utils/TcMType.hs
- compiler/GHC/Tc/Utils/TcType.hs
- compiler/GHC/Tc/Utils/Unify.hs
- compiler/GHC/Tc/Utils/Unify.hs-boot
- compiler/GHC/Types/SourceError.hs
- compiler/GHC/Types/TyThing/Ppr.hs
- compiler/GHC/Utils/Error.hs
- compiler/GHC/Utils/Outputable.hs
- ghc/GHCi/UI.hs
- testsuite/tests/cpranal/should_compile/T18174.stderr
- testsuite/tests/driver/T11429c.stderr
- testsuite/tests/driver/T21682.stderr
- testsuite/tests/ghc-api/T10942.hs
- testsuite/tests/ghc-api/annotations-literals/literals.hs
- testsuite/tests/indexed-types/should_fail/T14887.stderr
- testsuite/tests/linear/should_fail/T19361.stderr
- testsuite/tests/roles/should_compile/Roles13.stderr
- testsuite/tests/simplCore/should_compile/OpaqueNoCastWW.stderr
- testsuite/tests/simplCore/should_compile/T17673.stderr
- testsuite/tests/simplCore/should_compile/T18078.stderr
- testsuite/tests/simplCore/should_compile/T18995.stderr
- testsuite/tests/simplCore/should_compile/T19890.stderr
- testsuite/tests/simplCore/should_compile/T21948.stderr
- testsuite/tests/simplCore/should_compile/T21960.stderr
- testsuite/tests/simplCore/should_compile/T24808.stderr
- − testsuite/tests/simplCore/should_compile/T25713.stderr
- testsuite/tests/simplCore/should_compile/T4201.stdout
- testsuite/tests/simplCore/should_compile/T8331.stderr
- testsuite/tests/typecheck/no_skolem_info/T20232.stderr
- testsuite/tests/typecheck/should_fail/T11672.stderr
- testsuite/tests/typecheck/should_fail/T12373.stderr
- testsuite/tests/typecheck/should_fail/T15807.stderr
- testsuite/tests/typecheck/should_fail/T16074.stderr
- testsuite/tests/typecheck/should_fail/T18357a.stderr
- testsuite/tests/typecheck/should_fail/T19627.stderr
- testsuite/tests/typecheck/should_fail/T21530a.stderr
- testsuite/tests/typecheck/should_fail/VisFlag1.stderr
- utils/check-exact/Parsers.hs
- utils/check-exact/Preprocess.hs
The diff was not included because it is too large.
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/c58f9a615f05e9d43629f6e846ae22…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/c58f9a615f05e9d43629f6e846ae22…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                        
                            
                                
                            
                            [Git][ghc/ghc][wip/T26166] 2 commits: Need to bump version to satisfy cabal [no-default-language] warning
                        
                        
by Rodrigo Mesquita (@alt-romes) 08 Oct '25
                    by Rodrigo Mesquita (@alt-romes) 08 Oct '25
08 Oct '25
                    
                        
Rodrigo Mesquita pushed to branch wip/T26166 at Glasgow Haskell Compiler / GHC
Commits:
d161d119 by Rodrigo Mesquita at 2025-10-08T16:04:30+01:00
Need to bump version to satisfy cabal [no-default-language] warning
- - - - -
a025452f by Rodrigo Mesquita at 2025-10-08T18:14:06+01:00
Multiple fixes towards #26166
Bump hsc2hs submodule to version with fix
- - - - -
10 changed files:
- libraries/base/src/System/CPUTime.hsc
- libraries/ghc-internal/ghc-internal.cabal.in
- rts/include/HsFFI.h
- rts/rts.cabal
- utils/ghc-toolchain/ghc-toolchain.cabal
- utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
- + utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link/RtsSymbols.hs
- utils/hsc2hs
- + utils/parse-rts-symbols/README.md
- + utils/parse-rts-symbols/main.py
Changes:
=====================================
libraries/base/src/System/CPUTime.hsc
=====================================
@@ -17,6 +17,7 @@
 
 #include "HsFFI.h"
 #include "HsBaseConfig.h"
+#include "RtsIfaceStub.h"
 
 -- For various _POSIX_* #defines
 #if defined(HAVE_UNISTD_H)
=====================================
libraries/ghc-internal/ghc-internal.cabal.in
=====================================
@@ -486,6 +486,7 @@ Library
         RtsIfaceStub.h
     install-includes:
         HsBase.h
+        RtsIfaceStub.h
         consUtils.h
 
     if flag(need-atomic)
=====================================
rts/include/HsFFI.h
=====================================
@@ -143,8 +143,6 @@ extern void hs_try_putmvar_with_value (int capability, HsStablePtr sp, StgClosur
 
 /* -------------------------------------------------------------------------- */
 
-
-
 #if defined(__cplusplus)
 }
 #endif
=====================================
rts/rts.cabal
=====================================
@@ -1,4 +1,4 @@
-cabal-version: 3.0
+cabal-version: 3.4
 name: rts
 version: 1.0.3
 synopsis: The GHC runtime system
=====================================
utils/ghc-toolchain/ghc-toolchain.cabal
=====================================
@@ -26,6 +26,7 @@ library
                       GHC.Toolchain.Tools.Cxx,
                       GHC.Toolchain.Tools.Cpp,
                       GHC.Toolchain.Tools.Link,
+                      GHC.Toolchain.Tools.Link.RtsSymbols,
                       GHC.Toolchain.Tools.Nm,
                       GHC.Toolchain.Tools.Ranlib,
                       GHC.Toolchain.Tools.Readelf,
=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link.hs
=====================================
@@ -17,6 +17,8 @@ import GHC.Toolchain.Program
 import GHC.Toolchain.Tools.Cc
 import GHC.Toolchain.Tools.Readelf
 
+import GHC.Toolchain.Tools.Link.RtsSymbols
+
 -- | Configuration on how the C compiler can be used to link
 data CcLink = CcLink { ccLinkProgram :: Program
                      , ccLinkSupportsNoPie :: Bool -- See Note [No PIE when linking] in GHC.Driver.Session
@@ -328,6 +330,10 @@ addPlatformDepLinkFlags archOs cc ccLink0 = do
       -- Since https://github.com/emscripten-core/emscripten/blob/main/ChangeLog.md#407---…
       -- the emcc linker does not export the HEAP8 memory view which is used by the js RTS by default anymore.
       return $ ccLink2 & _prgFlags %++ "-sEXPORTED_RUNTIME_METHODS=HEAP8,HEAPU8"
+    ArchOS _ OSDarwin ->
+      -- See Note [TODO]
+      return $ ccLink2 & _prgFlags %++
+        ("-Wl" ++ concatMap (",-U,_" ++ ) rtsPublicSymbols)
     _ ->
       return ccLink2
 
=====================================
utils/ghc-toolchain/src/GHC/Toolchain/Tools/Link/RtsSymbols.hs
=====================================
@@ -0,0 +1,2876 @@
+module GHC.Toolchain.Tools.Link.RtsSymbols where
+
+import Data.String (String)
+import Data.List ((++))
+
+-- My guess is that these should not be part of the rtsPublicSymbols and are a
+-- problem which comes from no longer having -undefined dynamic_lookup. For
+-- unix e.g. we probably should add -U<symbol> to the ld-options of unix?
+--
+-- For the other Symbols not as sure.
+sketchySymbols :: [String]
+sketchySymbols =
+  ["nocldstop"] -- from unix
+  ++
+  ["CCS_DONT_CARE", "user_era"] -- ??
+  ++
+  -- things which should probably be in the public api dir (rts/include/..) but are only in (rts/...)
+  ["arenaAlloc", "arenaFree", "cloneStack", "newArena", "rts_setMainThread", "sendCloneStackMessage"]
+  ++
+  -- FFI things...?
+  ["ffi_prep_cif", "ffi_type_double", "ffi_type_float", "ffi_type_pointer",
+  "ffi_type_sint16", "ffi_type_sint32", "ffi_type_sint64", "ffi_type_sint8",
+  "ffi_type_uint16", "ffi_type_uint32", "ffi_type_uint64", "ffi_type_uint8",
+  "ffi_type_void"]
+  ++
+  -- Profiling and more unexported from rts/include but which are public in the RTS
+  -- Perhaps we should just include ALL symbols from the RTS regardless of public/private.
+  -- Ideally we'd want the "visibility" attribute to be checked but that doesn't seem to be available.
+  [ "mkCostCentre", "rts_disableStopAfterReturn", "rts_disableStopNextBreakpoint", "rts_disableStopNextBreakpointAll", "rts_enableStopAfterReturn", "rts_enableStopNextBreakpoint", "rts_enableStopNextBreakpointAll"]
+  -- Stg things?
+  ++
+  [ "stg_interp_constr1_entry"
+  , "stg_interp_constr2_entry"
+  , "stg_interp_constr3_entry"
+  , "stg_interp_constr4_entry"
+  , "stg_interp_constr5_entry"
+  , "stg_interp_constr6_entry"
+  , "stg_interp_constr7_entry"
+  ]
+
+-- See Note [TODO]
+
+-- The `rtsPublicSymbols` list is kept up to date by hand but can be potentially regenerated from
+-- scratch using the script XXX...
+
+-- A list of all the symbols which are undefined when linking a Haskell library
+-- and are only resolved when linking a final executable against the RTS.
+--
+-- Essentially, all the public RTS symbols
+rtsPublicSymbols :: [String]
+rtsPublicSymbols =
+  sketchySymbols ++
+  [ "ALLOC_BH_adm"
+  , "ALLOC_BH_ctr"
+  , "ALLOC_BH_gds"
+  , "ALLOC_BH_slp"
+  , "ALLOC_CON_adm"
+  , "ALLOC_CON_ctr"
+  , "ALLOC_CON_gds"
+  , "ALLOC_CON_slp"
+  , "ALLOC_FUN_adm"
+  , "ALLOC_FUN_ctr"
+  , "ALLOC_FUN_gds"
+  , "ALLOC_FUN_slp"
+  , "ALLOC_HEAP_ctr"
+  , "ALLOC_HEAP_tot"
+  , "ALLOC_PAP_adm"
+  , "ALLOC_PAP_ctr"
+  , "ALLOC_PAP_gds"
+  , "ALLOC_PAP_slp"
+  , "ALLOC_PRIM_adm"
+  , "ALLOC_PRIM_ctr"
+  , "ALLOC_PRIM_gds"
+  , "ALLOC_PRIM_slp"
+  , "ALLOC_RTS_ctr"
+  , "ALLOC_RTS_tot"
+  , "ALLOC_SE_THK_ctr"
+  , "ALLOC_STACK_ctr"
+  , "ALLOC_STACK_tot"
+  , "ALLOC_THK_adm"
+  , "ALLOC_THK_gds"
+  , "ALLOC_THK_slp"
+  , "ALLOC_TSO_ctr"
+  , "ALLOC_TSO_tot"
+  , "ALLOC_TUP_adm"
+  , "ALLOC_TUP_ctr"
+  , "ALLOC_TUP_gds"
+  , "ALLOC_TUP_slp"
+  , "ALLOC_UP_THK_ctr"
+  , "ATTRIBUTE_ALIGNED"
+  , "AddDelayRequest"
+  , "AddIORequest"
+  , "AddProcRequest"
+  , "CATCHF_PUSHED_ctr"
+  , "CCS_OVERHEAD"
+  , "CCS_SYSTEM"
+  , "CLOSURE"
+  , "Capability"
+  , "EF_"
+  , "ENT_AP_STACK_ctr"
+  , "ENT_AP_ctr"
+  , "ENT_BH_ctr"
+  , "ENT_CONTINUATION_ctr"
+  , "ENT_DYN_CON_ctr"
+  , "ENT_DYN_FUN_DIRECT_ctr"
+  , "ENT_DYN_IND_ctr"
+  , "ENT_DYN_THK_MANY_ctr"
+  , "ENT_DYN_THK_SINGLE_ctr"
+  , "ENT_LNE_ctr"
+  , "ENT_PAP_ctr"
+  , "ENT_PERM_IND_ctr"
+  , "ENT_STATIC_CON_ctr"
+  , "ENT_STATIC_FUN_DIRECT_ctr"
+  , "ENT_STATIC_IND_ctr"
+  , "ENT_STATIC_THK_MANY_ctr"
+  , "ENT_STATIC_THK_SINGLE_ctr"
+  , "ENT_VIA_NODE_ctr"
+  , "EXTERN_INLINE"
+  , "FetchWork"
+  , "FileEventLogWriter"
+  , "FlagDefaultsHook"
+  , "FreeWorkQueue"
+  , "GC_FAILED_PROMOTION_ctr"
+  , "GC_SEL_ABANDONED_ctr"
+  , "GC_SEL_MAJOR_ctr"
+  , "GC_SEL_MINOR_ctr"
+  , "GHC_STATIC_ASSERT"
+  , "GarbageCollect"
+  , "GetWork"
+  , "GetWorkQueueHandle"
+  , "HEAP_CHK_ctr"
+  , "HashSet"
+  , "INFO_TABLE_RET"
+  , "KNOWN_CALL_EXTRA_ARGS_ctr"
+  , "KNOWN_CALL_TOO_FEW_ARGS_ctr"
+  , "KNOWN_CALL_ctr"
+  , "LongGCSync"
+  , "LongGCSyncEnd"
+  , "MULTI_CHUNK_SLOW_CALL_CHUNKS_ctr"
+  , "MULTI_CHUNK_SLOW_CALL_ctr"
+  , "MainCapability"
+  , "MallocFailHook"
+  , "N"
+  , "NewWorkQueue"
+  , "NullEventLogWriter"
+  , "OnExitHook"
+  , "OutOfHeapHook"
+  , "P_"
+  , "PrintTickyInfo"
+  , "RET_NEW_ctr"
+  , "RET_NEW_hst"
+  , "RET_OLD_ctr"
+  , "RET_OLD_hst"
+  , "RET_SEMI_loads_avoided"
+  , "RET_UNBOXED_TUP_ctr"
+  , "RET_UNBOXED_TUP_hst"
+  , "RtsFlags"
+  , "SET_INFO"
+  , "SET_INFO_RELAXED"
+  , "SET_INFO_RELEASE"
+  , "SLOW_CALL_FUN_CORRECT_ctr"
+  , "SLOW_CALL_FUN_TOO_FEW_ctr"
+  , "SLOW_CALL_FUN_TOO_MANY_ctr"
+  , "SLOW_CALL_PAP_CORRECT_ctr"
+  , "SLOW_CALL_PAP_TOO_FEW_ctr"
+  , "SLOW_CALL_PAP_TOO_MANY_ctr"
+  , "SLOW_CALL_UNEVALD_ctr"
+  , "SLOW_CALL_ctr"
+  , "SLOW_CALL_fast_d_ctr"
+  , "SLOW_CALL_fast_f_ctr"
+  , "SLOW_CALL_fast_l_ctr"
+  , "SLOW_CALL_fast_n_ctr"
+  , "SLOW_CALL_fast_p_ctr"
+  , "SLOW_CALL_fast_pp_ctr"
+  , "SLOW_CALL_fast_ppp_ctr"
+  , "SLOW_CALL_fast_pppp_ctr"
+  , "SLOW_CALL_fast_ppppp_ctr"
+  , "SLOW_CALL_fast_pppppp_ctr"
+  , "SLOW_CALL_fast_pppv_ctr"
+  , "SLOW_CALL_fast_ppv_ctr"
+  , "SLOW_CALL_fast_pv_ctr"
+  , "SLOW_CALL_fast_v16_ctr"
+  , "SLOW_CALL_fast_v_ctr"
+  , "SNT_size"
+  , "STK_CHK_ctr"
+  , "ShutdownIOManager"
+  , "StackOverflowHook"
+  , "StartIOManager"
+  , "StgClosure"
+  , "StgCompactNFData"
+  , "StgCompactNFDataBlock"
+  , "StgConInfoTable"
+  , "StgFun"
+  , "StgFunInfoTable"
+  , "StgHalfWord"
+  , "StgInfoTable"
+  , "StgInt"
+  , "StgOffset"
+  , "StgPtr"
+  , "StgRegTable"
+  , "StgRetInfoTable"
+  , "StgReturn"
+  , "StgTSO"
+  , "StgThunkInfoTable"
+  , "StgTimeout"
+  , "StgTimeoutQueue"
+  , "StgWord"
+  , "StgWord8"
+  , "StrHashTable"
+  , "SubmitWork"
+  , "TAG_TAGGED_miss"
+  , "TAG_TAGGED_pred"
+  , "TAG_UNTAGGED_miss"
+  , "TAG_UNTAGGED_pred"
+  , "TRACE_cap"
+  , "TRACE_gc"
+  , "TRACE_nonmoving_gc"
+  , "TRACE_sched"
+  , "TRACE_spark_full"
+  , "TRACE_spark_sampled"
+  , "Task"
+  , "TaskId"
+  , "Time"
+  , "UNKNOWN_CALL_ctr"
+  , "UPDF_OMITTED_ctr"
+  , "UPDF_PUSHED_ctr"
+  , "UPDF_RCC_OMITTED_ctr"
+  , "UPDF_RCC_PUSHED_ctr"
+  , "UPD_BH_UPDATABLE_ctr"
+  , "UPD_CAF_BH_SINGLE_ENTRY_ctr"
+  , "UPD_CAF_BH_UPDATABLE_ctr"
+  , "UPD_CON_IN_NEW_ctr"
+  , "UPD_CON_IN_PLACE_ctr"
+  , "UPD_NEW_IND_ctr"
+  , "UPD_NEW_PERM_IND_ctr"
+  , "UPD_OLD_IND_ctr"
+  , "UPD_OLD_PERM_IND_ctr"
+  , "UPD_PAP_IN_NEW_ctr"
+  , "UPD_PAP_IN_PLACE_ctr"
+  , "UPD_SQUEEZED_ctr"
+  , "VERY_SLOW_CALL_ctr"
+  , "WINAPI"
+  , "W_"
+  , "XXH128_canonicalFromHash"
+  , "XXH128_cmp"
+  , "XXH128_hashFromCanonical"
+  , "XXH128_isEqual"
+  , "XXH32"
+  , "XXH32_canonicalFromHash"
+  , "XXH32_copyState"
+  , "XXH32_createState"
+  , "XXH32_digest"
+  , "XXH32_freeState"
+  , "XXH32_hashFromCanonical"
+  , "XXH32_reset"
+  , "XXH32_update"
+  , "XXH3_128bits"
+  , "XXH3_128bits_digest"
+  , "XXH3_128bits_reset"
+  , "XXH3_128bits_reset_withSecret"
+  , "XXH3_128bits_reset_withSeed"
+  , "XXH3_128bits_update"
+  , "XXH3_128bits_withSecret"
+  , "XXH3_128bits_withSeed"
+  , "XXH3_64bits"
+  , "XXH3_64bits_digest"
+  , "XXH3_64bits_reset"
+  , "XXH3_64bits_reset_withSecret"
+  , "XXH3_64bits_reset_withSeed"
+  , "XXH3_64bits_update"
+  , "XXH3_64bits_withSecret"
+  , "XXH3_64bits_withSeed"
+  , "XXH3_copyState"
+  , "XXH3_createState"
+  , "XXH3_freeState"
+  , "XXH64"
+  , "XXH64_canonicalFromHash"
+  , "XXH64_copyState"
+  , "XXH64_createState"
+  , "XXH64_digest"
+  , "XXH64_freeState"
+  , "XXH64_hashFromCanonical"
+  , "XXH64_reset"
+  , "XXH64_update"
+  , "XXH_versionNumber"
+  , "ZCMain_main_closure"
+  , "_Exit"
+  , "__assert_rtn"
+  , "__cospi"
+  , "__cospif"
+  , "__decodeDouble_2Int"
+  , "__decodeDouble_Int64"
+  , "__decodeFloat_Int"
+  , "__exp10"
+  , "__exp10f"
+  , "__fpclassifyd"
+  , "__fpclassifyf"
+  , "__fpclassifyl"
+  , "__hs_fopen"
+  , "__hscore_get_saved_termios"
+  , "__hscore_set_saved_termios"
+  , "__inline_isfinited"
+  , "__inline_isfinitef"
+  , "__inline_isfinitel"
+  , "__inline_isinfd"
+  , "__inline_isinff"
+  , "__inline_isinfl"
+  , "__inline_isnand"
+  , "__inline_isnanf"
+  , "__inline_isnanl"
+  , "__inline_isnormald"
+  , "__inline_isnormalf"
+  , "__inline_isnormall"
+  , "__inline_signbitd"
+  , "__inline_signbitf"
+  , "__inline_signbitl"
+  , "__int_encodeDouble"
+  , "__int_encodeFloat"
+  , "__math_errhandling"
+  , "__mb_cur_max"
+  , "__register_hs_exception_handler"
+  , "__rts_fopen"
+  , "__sincos"
+  , "__sincos_stret"
+  , "__sincosf"
+  , "__sincosf_stret"
+  , "__sincospi"
+  , "__sincospi_stret"
+  , "__sincospif"
+  , "__sincospif_stret"
+  , "__sinpi"
+  , "__sinpif"
+  , "__snprintf_chk"
+  , "__sprintf_chk"
+  , "__sputc"
+  , "__srget"
+  , "__stderrp"
+  , "__stdinp"
+  , "__stdoutp"
+  , "__stg_EAGER_BLACKHOLE_entry"
+  , "__stg_EAGER_BLACKHOLE_info"
+  , "__stg_gc_enter_1"
+  , "__stg_gc_fun"
+  , "__svfscanf"
+  , "__swbuf"
+  , "__tanpi"
+  , "__tanpif"
+  , "__unregister_hs_exception_handler"
+  , "__vsnprintf_chk"
+  , "__vsprintf_chk"
+  , "__word_encodeDouble"
+  , "__word_encodeFloat"
+  , "_assertFail"
+  , "_warnFail"
+  , "a64l"
+  , "abandonRequestWait"
+  , "abandonWorkRequest"
+  , "abort"
+  , "abs"
+  , "accountAllocation"
+  , "acos"
+  , "acosf"
+  , "acosh"
+  , "acoshf"
+  , "acoshl"
+  , "acosl"
+  , "addDLL"
+  , "addDLL_PEi386"
+  , "addDelayRequest"
+  , "addDoProcRequest"
+  , "addIORequest"
+  , "addInitFini"
+  , "addLibrarySearchPath"
+  , "addLibrarySearchPath_PEi386"
+  , "addProddableBlock"
+  , "addSection"
+  , "aligned_alloc"
+  , "all_tasks"
+  , "allocAlignedGroupOnNode"
+  , "allocBlockOnNode_lock"
+  , "allocBlock_lock"
+  , "allocGroup"
+  , "allocGroupOnNode"
+  , "allocGroupOnNode_lock"
+  , "allocGroupOnNode_sync"
+  , "allocGroup_lock"
+  , "allocGroup_sync"
+  , "allocHashTable"
+  , "allocLargeChunk"
+  , "allocLargeChunkOnNode"
+  , "allocMBlockAlignedGroupOnNode"
+  , "alloc_adjustor"
+  , "alloc_todo_block"
+  , "alloca"
+  , "allocate"
+  , "allocateArrBytes"
+  , "allocateArrBytesPinned"
+  , "allocateExecPage"
+  , "allocateForCompact"
+  , "allocateMightFail"
+  , "allocateMutArrPtrs"
+  , "allocatePinned"
+  , "allocateSmallMutArrPtrs"
+  , "anyPendingTimeoutsOrIO"
+  , "anyUserHandlers"
+  , "appendToRunQueue"
+  , "arc4random"
+  , "arc4random_addrandom"
+  , "arc4random_buf"
+  , "arc4random_stir"
+  , "arc4random_uniform"
+  , "arenaAlloc"
+  , "arenaBlocks"
+  , "arenaFree"
+  , "asctime"
+  , "asctime_r"
+  , "asin"
+  , "asinf"
+  , "asinh"
+  , "asinhf"
+  , "asinhl"
+  , "asinl"
+  , "asprintf"
+  , "assert_in_nonmoving_heap"
+  , "atan"
+  , "atan2"
+  , "atan2f"
+  , "atan2l"
+  , "atanf"
+  , "atanh"
+  , "atanhf"
+  , "atanhl"
+  , "atanl"
+  , "atexit"
+  , "atexit_b"
+  , "atof"
+  , "atoi"
+  , "atol"
+  , "atoll"
+  , "awaitAsyncRequests"
+  , "awaitCompletedTimeoutsOrIO"
+  , "awaitCompletedTimeoutsOrIOSelect"
+  , "awaitCompletedTimeoutsOrIOWin32"
+  , "awaitRequests"
+  , "awakenBlockedExceptionQueue"
+  , "backtraceFree"
+  , "barf"
+  , "bcmp"
+  , "bcopy"
+  , "bdescr"
+  , "blackHoleOwner"
+  , "blockUserSignals"
+  , "bool"
+  , "broadcastCondition"
+  , "bsearch"
+  , "bsearch_b"
+  , "bzero"
+  , "calcNeeded"
+  , "calcTotalAllocated"
+  , "calcTotalCompactW"
+  , "calcTotalLargeObjectsW"
+  , "calloc"
+  , "capabilities"
+  , "capacityClosureTable"
+  , "captureContinuationAndAbort"
+  , "cas_ptr"
+  , "cbrt"
+  , "cbrtf"
+  , "cbrtl"
+  , "ceil"
+  , "ceilf"
+  , "ceill"
+  , "cgetcap"
+  , "cgetclose"
+  , "cgetent"
+  , "cgetfirst"
+  , "cgetmatch"
+  , "cgetnext"
+  , "cgetnum"
+  , "cgetset"
+  , "cgetstr"
+  , "cgetustr"
+  , "checkAndLoadImportLibrary"
+  , "checkBlockingQueues"
+  , "checkFPUStack"
+  , "checkProddableBlock"
+  , "checkUnload"
+  , "checkVectorSupport"
+  , "clearImportSymbol"
+  , "clearNursery"
+  , "clear_blocks"
+  , "clear_free_list"
+  , "clearerr"
+  , "clock"
+  , "clock_getres"
+  , "clock_gettime"
+  , "clock_gettime_nsec_np"
+  , "clock_settime"
+  , "cloneStack"
+  , "closeCondition"
+  , "closeMutex"
+  , "closure_flags"
+  , "closure_sizeW_"
+  , "closure_type_names"
+  , "cmp_thread"
+  , "collectFreshWeakPtrs"
+  , "collect_pointers"
+  , "commitMBlockFreeing"
+  , "compact"
+  , "compactAllocateBlock"
+  , "compactContains"
+  , "compactFixupPointers"
+  , "compactFree"
+  , "compactMarkKnown"
+  , "compactNew"
+  , "compactResize"
+  , "completeSynchronousRequest"
+  , "containsSpan"
+  , "contextSwitchAllCapabilities"
+  , "contextSwitchCapability"
+  , "copysign"
+  , "copysignf"
+  , "copysignl"
+  , "cos"
+  , "cosf"
+  , "cosh"
+  , "coshf"
+  , "coshl"
+  , "cosl"
+  , "countAllocdBlocks"
+  , "countBlocks"
+  , "countCompactBlocks"
+  , "countNurseryBlocks"
+  , "countOccupied"
+  , "createAdjustor"
+  , "createAttachedOSThread"
+  , "createGenThread"
+  , "createIOThread"
+  , "createOSThread"
+  , "createStrictIOThread"
+  , "createThread"
+  , "ctermid"
+  , "ctermid_r"
+  , "ctime"
+  , "ctime_r"
+  , "current_mark_queue"
+  , "daemon"
+  , "daylight"
+  , "dbl_link_insert_after"
+  , "dbl_link_onto"
+  , "dbl_link_remove"
+  , "dbl_link_replace"
+  , "dead_weak_ptr_list"
+  , "deadlock_detect_gc"
+  , "debugBelch"
+  , "debugMsgFn"
+  , "debug_caf_list"
+  , "defaultRtsConfig"
+  , "deferMBlockFreeing"
+  , "deleteMinTimeoutQueue"
+  , "deleteTimeoutQueue"
+  , "devname"
+  , "devname_r"
+  , "difftime"
+  , "dirty_MUT_VAR"
+  , "dirty_MVAR"
+  , "dirty_STACK"
+  , "dirty_TSO"
+  , "dirty_TVAR"
+  , "discardElements"
+  , "discardTasksExcept"
+  , "div"
+  , "doIdleGCWork"
+  , "doneWithMsgThrowTo"
+  , "dprintf"
+  , "drand48"
+  , "dropExtension"
+  , "dumpIPEToEventLog"
+  , "dyn_caf_list"
+  , "ecvt"
+  , "emitTickyCounterDefs"
+  , "emitTickyCounterSamples"
+  , "enabled_capabilities"
+  , "endEventLogging"
+  , "endHeapProfiling"
+  , "endProfiling"
+  , "endsWithPath"
+  , "enlargeClosureTable"
+  , "enterFunCCS"
+  , "entering_PAP"
+  , "eq_thread"
+  , "era"
+  , "erand48"
+  , "erf"
+  , "erfc"
+  , "erfcf"
+  , "erfcl"
+  , "erff"
+  , "erfl"
+  , "errorBelch"
+  , "errorMsgFn"
+  , "evacuate"
+  , "evacuate1"
+  , "evacuate_BLACKHOLE"
+  , "evacuate_BLACKHOLE1"
+  , "eventLogStatus"
+  , "exec_block"
+  , "exit"
+  , "exitFn"
+  , "exitGlobalStore"
+  , "exitHeapOverflow"
+  , "exitHpc"
+  , "exitIOManager"
+  , "exitIpe"
+  , "exitLinker"
+  , "exitLinker_PEi386"
+  , "exitMyTask"
+  , "exitScheduler"
+  , "exitStableNameTable"
+  , "exitStablePtrTable"
+  , "exitStaticPtrTable"
+  , "exitStorage"
+  , "exitTicker"
+  , "exitTimer"
+  , "exitTopHandler"
+  , "exitUnloadCheck"
+  , "exp"
+  , "exp2"
+  , "exp2f"
+  , "exp2l"
+  , "expf"
+  , "expl"
+  , "expm1"
+  , "expm1f"
+  , "expm1l"
+  , "fabs"
+  , "fabsf"
+  , "fabsl"
+  , "fatalInternalErrorFn"
+  , "fclose"
+  , "fcvt"
+  , "fdim"
+  , "fdimf"
+  , "fdiml"
+  , "fdopen"
+  , "feof"
+  , "ferror"
+  , "fflush"
+  , "ffs"
+  , "ffsl"
+  , "ffsll"
+  , "fgetc"
+  , "fgetln"
+  , "fgetpos"
+  , "fgets"
+  , "fileno"
+  , "findAtomicallyFrameHelper"
+  , "findRetryFrameHelper"
+  , "findSystemLibrary"
+  , "findSystemLibrary_PEi386"
+  , "finiUserSignals"
+  , "finishCapEventLogging"
+  , "finishedNurseryBlock"
+  , "flockfile"
+  , "floor"
+  , "floorf"
+  , "floorl"
+  , "fls"
+  , "flsl"
+  , "flsll"
+  , "flushEventLog"
+  , "flushExec"
+  , "flushLocalEventsBuf"
+  , "fma"
+  , "fmaf"
+  , "fmal"
+  , "fmax"
+  , "fmaxf"
+  , "fmaxl"
+  , "fmemopen"
+  , "fmin"
+  , "fminf"
+  , "fminl"
+  , "fmod"
+  , "fmodf"
+  , "fmodl"
+  , "fmtcheck"
+  , "fopen"
+  , "foreignExportStablePtr"
+  , "foreignExportsFinishedLoadingObject"
+  , "foreignExportsLoadingObject"
+  , "forkOS_createThread"
+  , "forkProcess"
+  , "formatClosureDescIpe"
+  , "fprintf"
+  , "fpurge"
+  , "fputc"
+  , "fputs"
+  , "fread"
+  , "free"
+  , "freeAllMBlocks"
+  , "freeCapabilities"
+  , "freeChain"
+  , "freeChain_lock"
+  , "freeChain_sync"
+  , "freeExecPage"
+  , "freeFileLocking"
+  , "freeFullProgArgv"
+  , "freeGcThreads"
+  , "freeGroup"
+  , "freeGroup_lock"
+  , "freeGroup_sync"
+  , "freeHashSet"
+  , "freeHashTable"
+  , "freeHaskellFunctionPtr"
+  , "freeHeapProfiling"
+  , "freeInitFiniList"
+  , "freeMBlocks"
+  , "freeMarkQueue"
+  , "freeMyTask"
+  , "freeNativeCode_POSIX"
+  , "freeObjectCode"
+  , "freePreloadObjectFile_PEi386"
+  , "freeProddableBlocks"
+  , "freeProfiling"
+  , "freeProgEnvv"
+  , "freeRtsArgs"
+  , "freeScheduler"
+  , "freeSegments"
+  , "freeSnEntry"
+  , "freeStablePtr"
+  , "freeStablePtrUnsafe"
+  , "freeStorage"
+  , "freeStrHashTable"
+  , "freeTaskManager"
+  , "freeThreadingResources"
+  , "freeWSDeque"
+  , "free_adjustor"
+  , "freezeExecPage"
+  , "freopen"
+  , "frexp"
+  , "frexpf"
+  , "frexpl"
+  , "fscanf"
+  , "fseek"
+  , "fseeko"
+  , "fsetpos"
+  , "ftell"
+  , "ftello"
+  , "ftrylockfile"
+  , "funlockfile"
+  , "funopen"
+  , "fwrite"
+  , "g0"
+  , "gcStableNameTable"
+  , "gcThreadLiveBlocks"
+  , "gcThreadLiveWords"
+  , "gcWorkerThread"
+  , "gc_threads"
+  , "gcvt"
+  , "genLiveBlocks"
+  , "genLiveCopiedBlocks"
+  , "genLiveCopiedWords"
+  , "genLiveUncopiedBlocks"
+  , "genLiveUncopiedWords"
+  , "genLiveWords"
+  , "gen_workspace"
+  , "generateDump"
+  , "generateStack"
+  , "generations"
+  , "genericRaise"
+  , "getAllocations"
+  , "getCurrentThreadCPUTime"
+  , "getDelayTarget"
+  , "getFirstMBlock"
+  , "getFullProgArgv"
+  , "getHeaderInfo"
+  , "getMBlock"
+  , "getMBlockOnNode"
+  , "getMBlocks"
+  , "getMBlocksOnNode"
+  , "getMonotonicNSec"
+  , "getMyTask"
+  , "getNewNursery"
+  , "getNextMBlock"
+  , "getNumCapabilities"
+  , "getNumberOfProcessors"
+  , "getObjectLoadStatus"
+  , "getObjectLoadStatus_"
+  , "getObjectType"
+  , "getOrSetGHCConcSignalSignalHandlerStore"
+  , "getOrSetGHCConcWindowsIOManagerThreadStore"
+  , "getOrSetGHCConcWindowsPendingDelaysStore"
+  , "getOrSetGHCConcWindowsProddingStore"
+  , "getOrSetLibHSghcFastStringTable"
+  , "getOrSetLibHSghcGlobalHasNoDebugOutput"
+  , "getOrSetLibHSghcGlobalHasNoStateHack"
+  , "getOrSetLibHSghcGlobalHasPprDebug"
+  , "getOrSetSystemEventThreadEventManagerStore"
+  , "getOrSetSystemEventThreadIOManagerThreadStore"
+  , "getOrSetSystemTimerThreadEventManagerStore"
+  , "getOrSetSystemTimerThreadIOManagerThreadStore"
+  , "getOverlappedEntries"
+  , "getPageFaults"
+  , "getPageSize"
+  , "getPhysicalMemorySize"
+  , "getProcessCPUTime"
+  , "getProcessElapsedTime"
+  , "getProcessTimes"
+  , "getProgArgv"
+  , "getProgEnvv"
+  , "getRTSStats"
+  , "getRTSStatsEnabled"
+  , "getRecentActivity"
+  , "getSchedState"
+  , "getSectionKind_MachO"
+  , "getStablePtr"
+  , "getSymNumberOfAuxSymbols"
+  , "getSymSectionNumber"
+  , "getSymShortName"
+  , "getSymStorageClass"
+  , "getSymType"
+  , "getSymValue"
+  , "getSymbolSize"
+  , "getTopHandlerThread"
+  , "getUnixEpochTime"
+  , "getUserEra"
+  , "get_name_string"
+  , "get_sym_name"
+  , "getbsize"
+  , "getc"
+  , "getc_unlocked"
+  , "getchar"
+  , "getchar_unlocked"
+  , "getdate"
+  , "getdate_err"
+  , "getdelim"
+  , "getenv"
+  , "getiopolicy_np"
+  , "getline"
+  , "getloadavg"
+  , "getpriority"
+  , "getprogname"
+  , "getrlimit"
+  , "getrusage"
+  , "gets"
+  , "getsubopt"
+  , "getw"
+  , "ghc___aarch64_cas1_acq"
+  , "ghc___aarch64_cas1_acq_rel"
+  , "ghc___aarch64_cas1_relax"
+  , "ghc___aarch64_cas1_sync"
+  , "ghc___aarch64_cas2_acq"
+  , "ghc___aarch64_cas2_acq_rel"
+  , "ghc___aarch64_cas2_relax"
+  , "ghc___aarch64_cas2_sync"
+  , "ghc___aarch64_cas4_acq"
+  , "ghc___aarch64_cas4_acq_rel"
+  , "ghc___aarch64_cas4_relax"
+  , "ghc___aarch64_cas4_sync"
+  , "ghc___aarch64_cas8_acq"
+  , "ghc___aarch64_cas8_acq_rel"
+  , "ghc___aarch64_cas8_relax"
+  , "ghc___aarch64_cas8_sync"
+  , "ghc___aarch64_ldadd1_acq"
+  , "ghc___aarch64_ldadd1_acq_rel"
+  , "ghc___aarch64_ldadd1_rel"
+  , "ghc___aarch64_ldadd1_relax"
+  , "ghc___aarch64_ldadd1_sync"
+  , "ghc___aarch64_ldadd2_acq"
+  , "ghc___aarch64_ldadd2_acq_rel"
+  , "ghc___aarch64_ldadd2_rel"
+  , "ghc___aarch64_ldadd2_relax"
+  , "ghc___aarch64_ldadd2_sync"
+  , "ghc___aarch64_ldadd4_acq"
+  , "ghc___aarch64_ldadd4_acq_rel"
+  , "ghc___aarch64_ldadd4_rel"
+  , "ghc___aarch64_ldadd4_relax"
+  , "ghc___aarch64_ldadd4_sync"
+  , "ghc___aarch64_ldadd8_acq"
+  , "ghc___aarch64_ldadd8_acq_rel"
+  , "ghc___aarch64_ldadd8_rel"
+  , "ghc___aarch64_ldadd8_relax"
+  , "ghc___aarch64_ldadd8_sync"
+  , "ghc___aarch64_ldclr1_acq"
+  , "ghc___aarch64_ldclr1_acq_rel"
+  , "ghc___aarch64_ldclr1_rel"
+  , "ghc___aarch64_ldclr1_relax"
+  , "ghc___aarch64_ldclr1_sync"
+  , "ghc___aarch64_ldclr2_acq"
+  , "ghc___aarch64_ldclr2_acq_rel"
+  , "ghc___aarch64_ldclr2_rel"
+  , "ghc___aarch64_ldclr2_relax"
+  , "ghc___aarch64_ldclr2_sync"
+  , "ghc___aarch64_ldclr4_acq"
+  , "ghc___aarch64_ldclr4_acq_rel"
+  , "ghc___aarch64_ldclr4_rel"
+  , "ghc___aarch64_ldclr4_relax"
+  , "ghc___aarch64_ldclr4_sync"
+  , "ghc___aarch64_ldclr8_acq"
+  , "ghc___aarch64_ldclr8_acq_rel"
+  , "ghc___aarch64_ldclr8_rel"
+  , "ghc___aarch64_ldclr8_relax"
+  , "ghc___aarch64_ldclr8_sync"
+  , "ghc___aarch64_ldeor1_acq"
+  , "ghc___aarch64_ldeor1_acq_rel"
+  , "ghc___aarch64_ldeor1_rel"
+  , "ghc___aarch64_ldeor1_relax"
+  , "ghc___aarch64_ldeor1_sync"
+  , "ghc___aarch64_ldeor2_acq"
+  , "ghc___aarch64_ldeor2_acq_rel"
+  , "ghc___aarch64_ldeor2_rel"
+  , "ghc___aarch64_ldeor2_relax"
+  , "ghc___aarch64_ldeor2_sync"
+  , "ghc___aarch64_ldeor4_acq"
+  , "ghc___aarch64_ldeor4_acq_rel"
+  , "ghc___aarch64_ldeor4_rel"
+  , "ghc___aarch64_ldeor4_relax"
+  , "ghc___aarch64_ldeor4_sync"
+  , "ghc___aarch64_ldeor8_acq"
+  , "ghc___aarch64_ldeor8_acq_rel"
+  , "ghc___aarch64_ldeor8_rel"
+  , "ghc___aarch64_ldeor8_relax"
+  , "ghc___aarch64_ldeor8_sync"
+  , "ghc___aarch64_ldset1_acq"
+  , "ghc___aarch64_ldset1_acq_rel"
+  , "ghc___aarch64_ldset1_rel"
+  , "ghc___aarch64_ldset1_relax"
+  , "ghc___aarch64_ldset1_sync"
+  , "ghc___aarch64_ldset2_acq"
+  , "ghc___aarch64_ldset2_acq_rel"
+  , "ghc___aarch64_ldset2_rel"
+  , "ghc___aarch64_ldset2_relax"
+  , "ghc___aarch64_ldset2_sync"
+  , "ghc___aarch64_ldset4_acq"
+  , "ghc___aarch64_ldset4_acq_rel"
+  , "ghc___aarch64_ldset4_rel"
+  , "ghc___aarch64_ldset4_relax"
+  , "ghc___aarch64_ldset4_sync"
+  , "ghc___aarch64_ldset8_acq"
+  , "ghc___aarch64_ldset8_acq_rel"
+  , "ghc___aarch64_ldset8_rel"
+  , "ghc___aarch64_ldset8_relax"
+  , "ghc___aarch64_ldset8_sync"
+  , "ghc___aarch64_swp1_acq"
+  , "ghc___aarch64_swp1_acq_rel"
+  , "ghc___aarch64_swp1_rel"
+  , "ghc___aarch64_swp1_relax"
+  , "ghc___aarch64_swp1_sync"
+  , "ghc___aarch64_swp2_acq"
+  , "ghc___aarch64_swp2_acq_rel"
+  , "ghc___aarch64_swp2_rel"
+  , "ghc___aarch64_swp2_relax"
+  , "ghc___aarch64_swp2_sync"
+  , "ghc___aarch64_swp4_acq"
+  , "ghc___aarch64_swp4_acq_rel"
+  , "ghc___aarch64_swp4_rel"
+  , "ghc___aarch64_swp4_relax"
+  , "ghc___aarch64_swp4_sync"
+  , "ghc___aarch64_swp8_acq"
+  , "ghc___aarch64_swp8_acq_rel"
+  , "ghc___aarch64_swp8_rel"
+  , "ghc___aarch64_swp8_relax"
+  , "ghc___aarch64_swp8_sync"
+  , "ghc_hs_iface"
+  , "ghc_rts_opts"
+  , "ghc_tsan_atomic16_compare_exchange"
+  , "ghc_tsan_atomic32_compare_exchange"
+  , "ghc_tsan_atomic64_compare_exchange"
+  , "ghc_tsan_atomic8_compare_exchange"
+  , "ghc_unique_counter64"
+  , "ghc_unique_inc"
+  , "ghciInsertSymbolTable"
+  , "ghciLookupSymbolInfo"
+  , "gmtime"
+  , "gmtime_r"
+  , "grabCapability"
+  , "grab_local_todo_block"
+  , "grantpt"
+  , "handleProfTick"
+  , "hashBuffer"
+  , "hashStr"
+  , "hashWord"
+  , "heapCensus"
+  , "heapInsertNewCounter"
+  , "heap_overflow"
+  , "heap_view_closurePtrs"
+  , "heap_view_closureSize"
+  , "heap_view_closure_ptrs_in_pap_payload"
+  , "heapsort"
+  , "heapsort_b"
+  , "hp_file"
+  , "hs_add64"
+  , "hs_and64"
+  , "hs_atomic_add16"
+  , "hs_atomic_add32"
+  , "hs_atomic_add64"
+  , "hs_atomic_add8"
+  , "hs_atomic_and16"
+  , "hs_atomic_and32"
+  , "hs_atomic_and64"
+  , "hs_atomic_and8"
+  , "hs_atomic_nand16"
+  , "hs_atomic_nand32"
+  , "hs_atomic_nand64"
+  , "hs_atomic_nand8"
+  , "hs_atomic_or16"
+  , "hs_atomic_or32"
+  , "hs_atomic_or64"
+  , "hs_atomic_or8"
+  , "hs_atomic_sub16"
+  , "hs_atomic_sub32"
+  , "hs_atomic_sub64"
+  , "hs_atomic_sub8"
+  , "hs_atomic_xor16"
+  , "hs_atomic_xor32"
+  , "hs_atomic_xor64"
+  , "hs_atomic_xor8"
+  , "hs_atomicread16"
+  , "hs_atomicread32"
+  , "hs_atomicread64"
+  , "hs_atomicread8"
+  , "hs_atomicwrite16"
+  , "hs_atomicwrite32"
+  , "hs_atomicwrite64"
+  , "hs_atomicwrite8"
+  , "hs_bitrev16"
+  , "hs_bitrev32"
+  , "hs_bitrev64"
+  , "hs_bitrev8"
+  , "hs_bswap16"
+  , "hs_bswap32"
+  , "hs_bswap64"
+  , "hs_clz16"
+  , "hs_clz32"
+  , "hs_clz64"
+  , "hs_clz8"
+  , "hs_cmpxchg16"
+  , "hs_cmpxchg32"
+  , "hs_cmpxchg64"
+  , "hs_cmpxchg8"
+  , "hs_ctz16"
+  , "hs_ctz32"
+  , "hs_ctz64"
+  , "hs_ctz8"
+  , "hs_eq64"
+  , "hs_exit"
+  , "hs_exit_nowait"
+  , "hs_free_fun_ptr"
+  , "hs_free_stable_ptr"
+  , "hs_free_stable_ptr_unsafe"
+  , "hs_geInt64"
+  , "hs_geWord64"
+  , "hs_gtInt64"
+  , "hs_gtWord64"
+  , "hs_hpc_module"
+  , "hs_hpc_rootModule"
+  , "hs_init"
+  , "hs_init_ghc"
+  , "hs_init_with_rtsopts"
+  , "hs_int64ToInt"
+  , "hs_intToInt64"
+  , "hs_leInt64"
+  , "hs_leWord64"
+  , "hs_lock_stable_ptr_table"
+  , "hs_lock_stable_tables"
+  , "hs_ltInt64"
+  , "hs_ltWord64"
+  , "hs_main"
+  , "hs_mul64"
+  , "hs_ne64"
+  , "hs_neg64"
+  , "hs_not64"
+  , "hs_or64"
+  , "hs_pdep16"
+  , "hs_pdep32"
+  , "hs_pdep64"
+  , "hs_pdep8"
+  , "hs_perform_gc"
+  , "hs_pext16"
+  , "hs_pext32"
+  , "hs_pext64"
+  , "hs_pext8"
+  , "hs_popcnt"
+  , "hs_popcnt16"
+  , "hs_popcnt32"
+  , "hs_popcnt64"
+  , "hs_popcnt8"
+  , "hs_quotInt64"
+  , "hs_quotWord64"
+  , "hs_remInt64"
+  , "hs_remWord64"
+  , "hs_restoreConsoleCP"
+  , "hs_set_argv"
+  , "hs_spt_insert"
+  , "hs_spt_insert_stableptr"
+  , "hs_spt_key_count"
+  , "hs_spt_keys"
+  , "hs_spt_lookup"
+  , "hs_spt_remove"
+  , "hs_sub64"
+  , "hs_thread_done"
+  , "hs_try_putmvar"
+  , "hs_try_putmvar_with_value"
+  , "hs_uncheckedIShiftRA64"
+  , "hs_uncheckedShiftL64"
+  , "hs_uncheckedShiftRL64"
+  , "hs_unlock_stable_ptr_table"
+  , "hs_unlock_stable_tables"
+  , "hs_word2float32"
+  , "hs_word2float64"
+  , "hs_word64ToWord"
+  , "hs_wordToWord64"
+  , "hs_xchg16"
+  , "hs_xchg32"
+  , "hs_xchg64"
+  , "hs_xchg8"
+  , "hs_xor64"
+  , "hw_alloc_blocks"
+  , "hypot"
+  , "hypotf"
+  , "hypotl"
+  , "ilogb"
+  , "ilogbf"
+  , "ilogbl"
+  , "imaxabs"
+  , "imaxdiv"
+  , "incrementUserEra"
+  , "index"
+  , "indexClosureTable"
+  , "info_hdr_type"
+  , "info_type"
+  , "info_type_by_ip"
+  , "info_update_frame"
+  , "initAdjustors"
+  , "initAllocator"
+  , "initBdescr"
+  , "initBlockAllocator"
+  , "initBuiltinClosures"
+  , "initCapabilities"
+  , "initCapabilityIOManager"
+  , "initClosureTable"
+  , "initCondition"
+  , "initElemTimeoutQueue"
+  , "initFileLocking"
+  , "initGcThreads"
+  , "initGeneration"
+  , "initGlobalStore"
+  , "initHeapProfiling"
+  , "initIOManager"
+  , "initIOManagerAfterFork"
+  , "initIpe"
+  , "initLDVCtr"
+  , "initLinker"
+  , "initLinkerMMap"
+  , "initLinker_"
+  , "initLinker_PEi386"
+  , "initMBlocks"
+  , "initMarkQueue"
+  , "initMutex"
+  , "initProddableBlockSet"
+  , "initProfTimer"
+  , "initProfiling"
+  , "initRtsFlagsDefaults"
+  , "initScheduler"
+  , "initSegment"
+  , "initSpinLock"
+  , "initStableNameTable"
+  , "initStablePtrTable"
+  , "initStats0"
+  , "initStats1"
+  , "initStorage"
+  , "initTaskManager"
+  , "initTicker"
+  , "initTimer"
+  , "initTopHandler"
+  , "initUnloadCheck"
+  , "initWeakForGC"
+  , "initializeTimer"
+  , "initstate"
+  , "insertClosureTable"
+  , "insertCompactHash"
+  , "insertHashSet"
+  , "insertHashTable"
+  , "insertHashTable_"
+  , "insertOCSectionIndices"
+  , "insertStrHashTable"
+  , "insertSymbol"
+  , "insertTimeoutQueue"
+  , "install_vtalrm_handler"
+  , "interp_shutdown"
+  , "interp_startup"
+  , "interruptAllCapabilities"
+  , "interruptCapability"
+  , "interruptIOManagerEvent"
+  , "interruptOSThread"
+  , "interruptStgRts"
+  , "interruptible"
+  , "ioManagerDie"
+  , "ioManagerFinished"
+  , "ioManagerStart"
+  , "ioManagerWakeup"
+  , "iomgr_type"
+  , "isAlive"
+  , "isAlreadyLoaded"
+  , "isArchive"
+  , "isSymbolImport"
+  , "isSymbolWeak"
+  , "isThreadBound"
+  , "is_io_mng_native_p"
+  , "iterHashTable"
+  , "j0"
+  , "j1"
+  , "jn"
+  , "joinOSThread"
+  , "jrand48"
+  , "keepCAFs"
+  , "kernelThreadId"
+  , "keyCountHashTable"
+  , "keysHashTable"
+  , "l64a"
+  , "labelThread"
+  , "labs"
+  , "large_alloc_lim"
+  , "lcong48"
+  , "ldexp"
+  , "ldexpf"
+  , "ldexpl"
+  , "ldiv"
+  , "lgamma"
+  , "lgammaf"
+  , "lgammal"
+  , "libdwGetBacktrace"
+  , "libdwLookupLocation"
+  , "libdwPoolClear"
+  , "libdwPoolInit"
+  , "libdwPoolRelease"
+  , "libdwPoolTake"
+  , "libdwPrintBacktrace"
+  , "listAllBlocks"
+  , "listThreads"
+  , "llabs"
+  , "lldiv"
+  , "llrint"
+  , "llrintf"
+  , "llrintl"
+  , "llround"
+  , "llroundf"
+  , "llroundl"
+  , "loadArchive"
+  , "loadArchive_"
+  , "loadNativeObj"
+  , "loadNativeObjFromLinkerScript_ELF"
+  , "loadNativeObj_POSIX"
+  , "loadObj"
+  , "loadOc"
+  , "loadSymbol"
+  , "loaded_objects"
+  , "localtime"
+  , "localtime_r"
+  , "lockFile"
+  , "log"
+  , "log10"
+  , "log10f"
+  , "log10l"
+  , "log1p"
+  , "log1pf"
+  , "log1pl"
+  , "log2"
+  , "log2_ceil"
+  , "log2f"
+  , "log2l"
+  , "logb"
+  , "logbf"
+  , "logbl"
+  , "logf"
+  , "logl"
+  , "lookupDependentSymbol"
+  , "lookupHashTable"
+  , "lookupHashTable_"
+  , "lookupIPE"
+  , "lookupIPEId"
+  , "lookupObjectByPath"
+  , "lookupStableName"
+  , "lookupStrHashTable"
+  , "lookupSymbol"
+  , "lookupSymbolInDLL_PEi386"
+  , "lookupSymbolInNativeObj"
+  , "lookupSymbol_PEi386"
+  , "lookupTlsgdSymbol"
+  , "lrand48"
+  , "lrint"
+  , "lrintf"
+  , "lrintl"
+  , "lround"
+  , "lroundf"
+  , "lroundl"
+  , "machoGetMisalignment"
+  , "major_gc"
+  , "malloc"
+  , "mapHashTable"
+  , "mapHashTableKeys"
+  , "mark"
+  , "markCAFs"
+  , "markCapabilities"
+  , "markCapability"
+  , "markCapabilityIOManager"
+  , "markClosureTable"
+  , "markObjectCode"
+  , "markQueueAddRoot"
+  , "markQueuePush"
+  , "markQueuePushArray"
+  , "markQueuePushClosure"
+  , "markQueuePushClosureGC"
+  , "markQueuePushClosure_"
+  , "markQueuePushFunSrt"
+  , "markQueuePushThunkSrt"
+  , "markStablePtrTable"
+  , "markWeakList"
+  , "markWeakPtrList"
+  , "mark_sp"
+  , "mark_stack_bd"
+  , "mark_stack_top_bd"
+  , "max_n_capabilities"
+  , "maybePerformBlockedException"
+  , "mblen"
+  , "mblocks_allocated"
+  , "mbstowcs"
+  , "mbtowc"
+  , "memccpy"
+  , "memchr"
+  , "memcmp"
+  , "memcpy"
+  , "memmem"
+  , "memmove"
+  , "memset"
+  , "memset_pattern16"
+  , "memset_pattern4"
+  , "memset_pattern8"
+  , "memset_s"
+  , "mergesort"
+  , "mergesort_b"
+  , "messageBlackHole"
+  , "migrateThread"
+  , "mkOc"
+  , "mkPath"
+  , "mkstemp"
+  , "mktemp"
+  , "mktime"
+  , "mmapAnon"
+  , "mmapAnonForLinker"
+  , "mmapForLinker"
+  , "mmap_32bit_base"
+  , "modf"
+  , "modff"
+  , "modfl"
+  , "moreCapabilities"
+  , "move_STACK"
+  , "mprotectForLinker"
+  , "mrand48"
+  , "munmapForLinker"
+  , "my_task"
+  , "myindex"
+  , "n_alloc_blocks"
+  , "n_capabilities"
+  , "n_gc_threads"
+  , "n_nonmoving_large_blocks"
+  , "n_numa_nodes"
+  , "n_nurseries"
+  , "n_unloaded_objects"
+  , "nan"
+  , "nanf"
+  , "nanl"
+  , "nanosleep"
+  , "nearbyint"
+  , "nearbyintf"
+  , "nearbyintl"
+  , "newArena"
+  , "newBoundTask"
+  , "newCAF"
+  , "newGCdCAF"
+  , "newNurseryBlock"
+  , "newRetainedCAF"
+  , "newSpark"
+  , "newWSDeque"
+  , "new_adjustor_pool"
+  , "new_adjustor_pool_from_template"
+  , "nextafter"
+  , "nextafterf"
+  , "nextafterl"
+  , "nexttoward"
+  , "nexttowardf"
+  , "nexttowardl"
+  , "nonmovingAddUpdRemSetBlocks"
+  , "nonmovingAllocate"
+  , "nonmovingAllocateGC"
+  , "nonmovingAllocatorCensus"
+  , "nonmovingAllocatorCensusWithWords"
+  , "nonmovingBlockConcurrentMark"
+  , "nonmovingBlockCount"
+  , "nonmovingClearSegment"
+  , "nonmovingClearSegmentFreeBlocks"
+  , "nonmovingCollect"
+  , "nonmovingConcurrentMarkIsRunning"
+  , "nonmovingExit"
+  , "nonmovingGetSegment"
+  , "nonmovingGetSegment_unchecked"
+  , "nonmovingHeap"
+  , "nonmovingInit"
+  , "nonmovingInitCapability"
+  , "nonmovingInitUpdRemSet"
+  , "nonmovingIsAlive"
+  , "nonmovingMark"
+  , "nonmovingMarkDeadWeak"
+  , "nonmovingMarkDeadWeaks"
+  , "nonmovingMarkEpoch"
+  , "nonmovingMarkInit"
+  , "nonmovingMarkLiveWeak"
+  , "nonmovingMarkQueueEntryType"
+  , "nonmovingMarkUnlimitedBudget"
+  , "nonmovingMarkWeakPtrList"
+  , "nonmovingPrintAllocatorCensus"
+  , "nonmovingPruneFreeSegmentList"
+  , "nonmovingPushActiveSegment"
+  , "nonmovingPushFilledSegment"
+  , "nonmovingPushFreeSegment"
+  , "nonmovingResurrectThreads"
+  , "nonmovingScavengeOne"
+  , "nonmovingSegmentAllocator"
+  , "nonmovingSegmentBlockCount"
+  , "nonmovingSegmentBlockSize"
+  , "nonmovingSegmentGetBlock"
+  , "nonmovingSegmentGetBlock_"
+  , "nonmovingSegmentInfo"
+  , "nonmovingSetClosureMark"
+  , "nonmovingSetMark"
+  , "nonmovingSweep"
+  , "nonmovingSweepCompactObjects"
+  , "nonmovingSweepLargeObjects"
+  , "nonmovingSweepMutLists"
+  , "nonmovingSweepStableNameTable"
+  , "nonmovingTidyThreads"
+  , "nonmovingTidyWeaks"
+  , "nonmovingTraceAllocatorCensus"
+  , "nonmovingUnblockConcurrentMark"
+  , "nonmoving_alloca_cnt"
+  , "nonmoving_alloca_dense_cnt"
+  , "nonmoving_block_idx"
+  , "nonmoving_eval_thunk_selector"
+  , "nonmoving_large_objects"
+  , "nonmoving_large_words"
+  , "nonmoving_old_threads"
+  , "nonmoving_old_weak_ptr_list"
+  , "nonmoving_segment_live_words"
+  , "nonmoving_threads"
+  , "nonmoving_weak_ptr_list"
+  , "nonmoving_write_barrier_enabled"
+  , "notifyIOManagerCapabilitiesChanged"
+  , "nrand48"
+  , "numa_map"
+  , "nurseries"
+  , "object_code_mark_bit"
+  , "objects"
+  , "ocAllocateExtras_ELF"
+  , "ocAllocateExtras_MachO"
+  , "ocBuildSegments_MachO"
+  , "ocDeinit_ELF"
+  , "ocDeinit_MachO"
+  , "ocFlushInstructionCache"
+  , "ocGetNames_ELF"
+  , "ocGetNames_MachO"
+  , "ocGetNames_PEi386"
+  , "ocInit_ELF"
+  , "ocInit_MachO"
+  , "ocResolve_ELF"
+  , "ocResolve_MachO"
+  , "ocResolve_PEi386"
+  , "ocRunFini_ELF"
+  , "ocRunFini_MachO"
+  , "ocRunFini_PEi386"
+  , "ocRunInit_ELF"
+  , "ocRunInit_MachO"
+  , "ocRunInit_PEi386"
+  , "ocVerifyImage_ELF"
+  , "ocVerifyImage_MachO"
+  , "ocVerifyImage_PEi386"
+  , "oldest_gen"
+  , "onComplete"
+  , "open_memstream"
+  , "osBindMBlocksToNode"
+  , "osBuiltWithNumaSupport"
+  , "osFreeAllMBlocks"
+  , "osFreeMBlocks"
+  , "osGetMBlocks"
+  , "osMemInit"
+  , "osNumaAvailable"
+  , "osNumaMask"
+  , "osNumaNodes"
+  , "osReleaseFreeMemory"
+  , "osThreadId"
+  , "osThreadIsAlive"
+  , "overwritingClosure"
+  , "overwritingClosureSize"
+  , "overwritingMutableClosureOfs"
+  , "parseIOManagerFlag"
+  , "pathdir"
+  , "pathdup"
+  , "pauseHeapProfTimer"
+  , "pauseTokenCapability"
+  , "pclose"
+  , "peakWorkerCount"
+  , "peak_mblocks_allocated"
+  , "pending_sync"
+  , "performBlockingMajorGC"
+  , "performGC"
+  , "performHeapProfile"
+  , "performMajorGC"
+  , "performTickySample"
+  , "performTryPutMVar"
+  , "perror"
+  , "pollCompletedTimeoutsOrIO"
+  , "poolFlush"
+  , "poolFree"
+  , "poolGetDesiredSize"
+  , "poolGetMaxSize"
+  , "poolInit"
+  , "poolRelease"
+  , "poolSetDesiredSize"
+  , "poolSetMaxSize"
+  , "poolTake"
+  , "poolTryTake"
+  , "popRunQueue"
+  , "popWSDeque"
+  , "popen"
+  , "posix2time"
+  , "posix_memalign"
+  , "posix_openpt"
+  , "postCapMsg"
+  , "postEvent"
+  , "postEventNoCap"
+  , "postInitEvent"
+  , "postMsg"
+  , "postSchedEvent"
+  , "postThreadLabel"
+  , "pow"
+  , "powf"
+  , "powl"
+  , "prepareUnloadCheck"
+  , "prev_static_flag"
+  , "printLoadedObjects"
+  , "printObj"
+  , "printPtr"
+  , "printRtsInfo"
+  , "printf"
+  , "processForeignExports"
+  , "processTimeoutCompletions"
+  , "prof_file"
+  , "prog_argc"
+  , "prog_argv"
+  , "prog_name"
+  , "promoteInRunQueue"
+  , "psort"
+  , "psort_b"
+  , "psort_r"
+  , "ptsname"
+  , "ptsname_r"
+  , "purgeObj"
+  , "pushCostCentre"
+  , "pushOnRunQueue"
+  , "pushWSDeque"
+  , "push_mark_stack"
+  , "push_scanned_block"
+  , "putc"
+  , "putc_unlocked"
+  , "putchar"
+  , "putchar_unlocked"
+  , "putenv"
+  , "puts"
+  , "putw"
+  , "qsort"
+  , "qsort_b"
+  , "qsort_r"
+  , "queueIOThread"
+  , "radixsort"
+  , "raiseAsync"
+  , "raiseExceptionHelper"
+  , "rand"
+  , "rand_r"
+  , "random"
+  , "realloc"
+  , "reallocf"
+  , "realpath"
+  , "recent_activity"
+  , "recordClosureMutated"
+  , "recordMutableCap"
+  , "recordMutableGen_GC"
+  , "refreshProfilingCCSs"
+  , "registerAlertableWait"
+  , "registerCcList"
+  , "registerCcsList"
+  , "registerForeignExports"
+  , "registerIOCPHandle"
+  , "registerInfoProvList"
+  , "releaseAndWakeupCapability"
+  , "releaseCapability"
+  , "releaseCapability_"
+  , "releaseFreeMemory"
+  , "releaseThreadNode"
+  , "remainder"
+  , "remainderf"
+  , "remainderl"
+  , "rememberOldStableNameAddresses"
+  , "remove"
+  , "removeClosureTable"
+  , "removeCompactClosureTable"
+  , "removeHashTable"
+  , "removeHashTable_"
+  , "removeLibrarySearchPath"
+  , "removeLibrarySearchPath_PEi386"
+  , "removeStrHashTable"
+  , "removeThreadFromDeQueue"
+  , "removeThreadFromQueue"
+  , "remquo"
+  , "remquof"
+  , "remquol"
+  , "rename"
+  , "renameat"
+  , "renameatx_np"
+  , "renamex_np"
+  , "reportHeapOverflow"
+  , "reportMemoryMap"
+  , "reportStackOverflow"
+  , "requestHeapCensus"
+  , "requestTickyCounterSamples"
+  , "resetAbandonRequestWait"
+  , "resetChildProcessStats"
+  , "resetNurseries"
+  , "resetTerminalSettings"
+  , "resizeGenerations"
+  , "resizeNurseries"
+  , "resizeNurseriesFixed"
+  , "resolveObjs"
+  , "resolveSymbolAddr"
+  , "resolveSymbolAddr_PEi386"
+  , "resumeHeapProfTimer"
+  , "resumeThread"
+  , "resurrectThreads"
+  , "resurrected_threads"
+  , "returnMemoryToOS"
+  , "revertCAFs"
+  , "revertible_caf_list"
+  , "rewind"
+  , "rindex"
+  , "rint"
+  , "rintf"
+  , "rintl"
+  , "round"
+  , "roundf"
+  , "roundl"
+  , "rpmatch"
+  , "rtsBadAlignmentBarf"
+  , "rtsConfig"
+  , "rtsDebugMsgFn"
+  , "rtsErrorMsgFn"
+  , "rtsExtraSyms"
+  , "rtsFatalInternalErrorFn"
+  , "rtsMemcpyRangeOverlap"
+  , "rtsOutOfBoundsAccess"
+  , "rtsSleep"
+  , "rtsSupportsBoundThreads"
+  , "rtsSyms"
+  , "rtsSysErrorMsgFn"
+  , "rtsTimerSignal"
+  , "rts_apply"
+  , "rts_argc"
+  , "rts_argv"
+  , "rts_breakpoint_io_action"
+  , "rts_checkSchedStatus"
+  , "rts_clearMemory"
+  , "rts_disableStopAfterReturn"
+  , "rts_disableStopNextBreakpoint"
+  , "rts_disableStopNextBreakpointAll"
+  , "rts_disableThreadAllocationLimit"
+  , "rts_done"
+  , "rts_enableStopAfterReturn"
+  , "rts_enableStopNextBreakpoint"
+  , "rts_enableStopNextBreakpointAll"
+  , "rts_enableThreadAllocationLimit"
+  , "rts_eval"
+  , "rts_evalIO"
+  , "rts_evalLazyIO"
+  , "rts_evalLazyIO_"
+  , "rts_evalStableIO"
+  , "rts_evalStableIOMain"
+  , "rts_eval_"
+  , "rts_getBool"
+  , "rts_getChar"
+  , "rts_getDouble"
+  , "rts_getFloat"
+  , "rts_getFunPtr"
+  , "rts_getInt"
+  , "rts_getInt16"
+  , "rts_getInt32"
+  , "rts_getInt64"
+  , "rts_getInt8"
+  , "rts_getPtr"
+  , "rts_getSchedStatus"
+  , "rts_getStablePtr"
+  , "rts_getThreadId"
+  , "rts_getWord"
+  , "rts_getWord16"
+  , "rts_getWord32"
+  , "rts_getWord64"
+  , "rts_getWord8"
+  , "rts_inCall"
+  , "rts_isDebugged"
+  , "rts_isDynamic"
+  , "rts_isPaused"
+  , "rts_isProfiled"
+  , "rts_isThreaded"
+  , "rts_isTracing"
+  , "rts_listMiscRoots"
+  , "rts_listThreads"
+  , "rts_lock"
+  , "rts_mkBool"
+  , "rts_mkChar"
+  , "rts_mkDouble"
+  , "rts_mkFloat"
+  , "rts_mkFunPtr"
+  , "rts_mkInt"
+  , "rts_mkInt16"
+  , "rts_mkInt32"
+  , "rts_mkInt64"
+  , "rts_mkInt8"
+  , "rts_mkPtr"
+  , "rts_mkStablePtr"
+  , "rts_mkString"
+  , "rts_mkWord"
+  , "rts_mkWord16"
+  , "rts_mkWord32"
+  , "rts_mkWord64"
+  , "rts_mkWord8"
+  , "rts_pause"
+  , "rts_pinThreadToNumaNode"
+  , "rts_resume"
+  , "rts_setInCallCapability"
+  , "rts_setMainThread"
+  , "rts_stop_next_breakpoint"
+  , "rts_stop_on_exception"
+  , "rts_unlock"
+  , "rts_unsafeGetMyCapability"
+  , "rts_waitConsoleHandlerCompletion"
+  , "runAllCFinalizers"
+  , "runCFinalizers"
+  , "runFini"
+  , "runInit"
+  , "runSomeFinalizers"
+  , "running_finalizers"
+  , "scalb"
+  , "scalbln"
+  , "scalblnf"
+  , "scalblnl"
+  , "scalbn"
+  , "scalbnf"
+  , "scalbnl"
+  , "scanf"
+  , "scavengeLiveWeak"
+  , "scavengeNonmovingSegment"
+  , "scavengeTSO"
+  , "scavengeTSOIOManager"
+  , "scavenge_AP"
+  , "scavenge_PAP"
+  , "scavenge_capability_mut_lists"
+  , "scavenge_compact"
+  , "scavenge_continuation"
+  , "scavenge_fun_srt"
+  , "scavenge_loop"
+  , "scavenge_mut_arr_ptrs"
+  , "scavenge_stack"
+  , "scavenge_thunk_srt"
+  , "sched_state"
+  , "scheduleFinalizers"
+  , "scheduleThread"
+  , "scheduleThreadNow"
+  , "scheduleThreadOn"
+  , "scheduleWaitThread"
+  , "scheduleWorker"
+  , "seed48"
+  , "selectIOManager"
+  , "sendCloneStackMessage"
+  , "setAllocLimitKill"
+  , "setFullProgArgv"
+  , "setHighMemDynamic"
+  , "setIOManagerControlFd"
+  , "setIOManagerWakeupFd"
+  , "setImportSymbol"
+  , "setKeepCAFs"
+  , "setMyTask"
+  , "setNumCapabilities"
+  , "setProgArgv"
+  , "setRecentActivity"
+  , "setSchedState"
+  , "setSymbolInfo"
+  , "setTSOLink"
+  , "setTSOPrev"
+  , "setThreadAffinity"
+  , "setThreadLabel"
+  , "setThreadNode"
+  , "setTimerManagerControlFd"
+  , "setUserEra"
+  , "setVectorSupport"
+  , "setWeakSymbol"
+  , "setbuf"
+  , "setbuffer"
+  , "setenv"
+  , "setiopolicy_np"
+  , "setkey"
+  , "setlinebuf"
+  , "setpriority"
+  , "setprogname"
+  , "setrlimit"
+  , "setstate"
+  , "setupRtsFlags"
+  , "setvbuf"
+  , "shouldCompact"
+  , "showIOManager"
+  , "showStgWord64"
+  , "shutdownAllocator"
+  , "shutdownAsyncIO"
+  , "shutdownAsyncWinIO"
+  , "shutdownCapabilities"
+  , "shutdownHaskell"
+  , "shutdownHaskellAndExit"
+  , "shutdownHaskellAndSignal"
+  , "shutdownThread"
+  , "signal"
+  , "signalCondition"
+  , "signal_handlers"
+  , "signgam"
+  , "sin"
+  , "sinf"
+  , "sinh"
+  , "sinhf"
+  , "sinhl"
+  , "sinl"
+  , "sizeClosureTable"
+  , "size_t"
+  , "snprintf"
+  , "sprintf"
+  , "sqrt"
+  , "sqrtf"
+  , "sqrtl"
+  , "sradixsort"
+  , "srand"
+  , "srand48"
+  , "sranddev"
+  , "srandom"
+  , "srandomdev"
+  , "sscanf"
+  , "stableNameLock"
+  , "stableNameUnlock"
+  , "stablePtrLock"
+  , "stablePtrUnlock"
+  , "stable_name_table"
+  , "stable_ptr_table"
+  , "startEventLogging"
+  , "startHeapProfTimer"
+  , "startProfTimer"
+  , "startSignalHandlers"
+  , "startTicker"
+  , "startTimer"
+  , "startupAsyncIO"
+  , "startupAsyncWinIO"
+  , "startupHaskell"
+  , "startupHpc"
+  , "statDescribeGens"
+  , "stat_endExit"
+  , "stat_endGC"
+  , "stat_endGCWorker"
+  , "stat_endInit"
+  , "stat_endNonmovingGc"
+  , "stat_endNonmovingGcSync"
+  , "stat_exit"
+  , "stat_exitReport"
+  , "stat_getElapsedGCTime"
+  , "stat_getElapsedTime"
+  , "stat_startExit"
+  , "stat_startGC"
+  , "stat_startGCSync"
+  , "stat_startGCWorker"
+  , "stat_startInit"
+  , "stat_startNonmovingGc"
+  , "stat_startNonmovingGcSync"
+  , "stat_workerStop"
+  , "stealWSDeque"
+  , "stealWSDeque_"
+  , "stgFree"
+  , "stgFreeAligned"
+  , "stgMallocAlignedBytes"
+  , "stgReallocBytes"
+  , "stg_AP_NOUPD_entry"
+  , "stg_AP_NOUPD_info"
+  , "stg_AP_STACK_NOUPD_entry"
+  , "stg_AP_STACK_NOUPD_info"
+  , "stg_AP_STACK_entry"
+  , "stg_AP_STACK_info"
+  , "stg_AP_entry"
+  , "stg_AP_info"
+  , "stg_ARR_WORDS_entry"
+  , "stg_ARR_WORDS_info"
+  , "stg_ASYNCIOOP_entry"
+  , "stg_ASYNCIOOP_info"
+  , "stg_ASYNCIO_LIVE0_closure"
+  , "stg_ASYNCIO_LIVE0_entry"
+  , "stg_ASYNCIO_LIVE0_info"
+  , "stg_BCO_entry"
+  , "stg_BCO_info"
+  , "stg_BLACKHOLE_entry"
+  , "stg_BLACKHOLE_info"
+  , "stg_BLOCKING_QUEUE_CLEAN_entry"
+  , "stg_BLOCKING_QUEUE_CLEAN_info"
+  , "stg_BLOCKING_QUEUE_DIRTY_entry"
+  , "stg_BLOCKING_QUEUE_DIRTY_info"
+  , "stg_CAF_BLACKHOLE_entry"
+  , "stg_CAF_BLACKHOLE_info"
+  , "stg_CHARLIKE_closure"
+  , "stg_CLOSURE_TABLE_NULL_closure"
+  , "stg_CLOSURE_TABLE_NULL_entry"
+  , "stg_CLOSURE_TABLE_NULL_info"
+  , "stg_COMPACT_NFDATA_CLEAN_entry"
+  , "stg_COMPACT_NFDATA_CLEAN_info"
+  , "stg_COMPACT_NFDATA_DIRTY_entry"
+  , "stg_COMPACT_NFDATA_DIRTY_info"
+  , "stg_CONTINUATION_apply"
+  , "stg_CONTINUATION_entry"
+  , "stg_CONTINUATION_info"
+  , "stg_C_FINALIZER_LIST_entry"
+  , "stg_C_FINALIZER_LIST_info"
+  , "stg_DEAD_WEAK_entry"
+  , "stg_DEAD_WEAK_info"
+  , "stg_END_STM_CHUNK_LIST_closure"
+  , "stg_END_STM_CHUNK_LIST_entry"
+  , "stg_END_STM_CHUNK_LIST_info"
+  , "stg_END_STM_WATCH_QUEUE_closure"
+  , "stg_END_STM_WATCH_QUEUE_entry"
+  , "stg_END_STM_WATCH_QUEUE_info"
+  , "stg_END_TSO_QUEUE_closure"
+  , "stg_END_TSO_QUEUE_entry"
+  , "stg_END_TSO_QUEUE_info"
+  , "stg_EVACUATED_entry"
+  , "stg_EVACUATED_info"
+  , "stg_GCD_CAF_entry"
+  , "stg_GCD_CAF_info"
+  , "stg_IND_STATIC_entry"
+  , "stg_IND_STATIC_info"
+  , "stg_IND_entry"
+  , "stg_IND_info"
+  , "stg_INTLIKE_closure"
+  , "stg_MSG_BLACKHOLE_entry"
+  , "stg_MSG_BLACKHOLE_info"
+  , "stg_MSG_CLONE_STACK_entry"
+  , "stg_MSG_CLONE_STACK_info"
+  , "stg_MSG_NULL_entry"
+  , "stg_MSG_NULL_info"
+  , "stg_MSG_THROWTO_entry"
+  , "stg_MSG_THROWTO_info"
+  , "stg_MSG_TRY_WAKEUP_entry"
+  , "stg_MSG_TRY_WAKEUP_info"
+  , "stg_MUT_ARR_PTRS_CLEAN_entry"
+  , "stg_MUT_ARR_PTRS_CLEAN_info"
+  , "stg_MUT_ARR_PTRS_DIRTY_entry"
+  , "stg_MUT_ARR_PTRS_DIRTY_info"
+  , "stg_MUT_ARR_PTRS_FROZEN_CLEAN_entry"
+  , "stg_MUT_ARR_PTRS_FROZEN_CLEAN_info"
+  , "stg_MUT_ARR_PTRS_FROZEN_DIRTY_entry"
+  , "stg_MUT_ARR_PTRS_FROZEN_DIRTY_info"
+  , "stg_MUT_ARR_WORDS_entry"
+  , "stg_MUT_ARR_WORDS_info"
+  , "stg_MUT_VAR_CLEAN_entry"
+  , "stg_MUT_VAR_CLEAN_info"
+  , "stg_MUT_VAR_DIRTY_entry"
+  , "stg_MUT_VAR_DIRTY_info"
+  , "stg_MVAR_CLEAN_entry"
+  , "stg_MVAR_CLEAN_info"
+  , "stg_MVAR_DIRTY_entry"
+  , "stg_MVAR_DIRTY_info"
+  , "stg_MVAR_TSO_QUEUE_entry"
+  , "stg_MVAR_TSO_QUEUE_info"
+  , "stg_NO_FINALIZER_closure"
+  , "stg_NO_FINALIZER_entry"
+  , "stg_NO_FINALIZER_info"
+  , "stg_NO_TREC_closure"
+  , "stg_NO_TREC_entry"
+  , "stg_NO_TREC_info"
+  , "stg_PAP_apply"
+  , "stg_PAP_entry"
+  , "stg_PAP_info"
+  , "stg_PROMPT_TAG_entry"
+  , "stg_PROMPT_TAG_info"
+  , "stg_RUBBISH_ENTRY_entry"
+  , "stg_RUBBISH_ENTRY_info"
+  , "stg_SMALL_MUT_ARR_PTRS_CLEAN_entry"
+  , "stg_SMALL_MUT_ARR_PTRS_CLEAN_info"
+  , "stg_SMALL_MUT_ARR_PTRS_DIRTY_entry"
+  , "stg_SMALL_MUT_ARR_PTRS_DIRTY_info"
+  , "stg_SMALL_MUT_ARR_PTRS_FROZEN_CLEAN_entry"
+  , "stg_SMALL_MUT_ARR_PTRS_FROZEN_CLEAN_info"
+  , "stg_SMALL_MUT_ARR_PTRS_FROZEN_DIRTY_entry"
+  , "stg_SMALL_MUT_ARR_PTRS_FROZEN_DIRTY_info"
+  , "stg_SRT_10_entry"
+  , "stg_SRT_10_info"
+  , "stg_SRT_11_entry"
+  , "stg_SRT_11_info"
+  , "stg_SRT_12_entry"
+  , "stg_SRT_12_info"
+  , "stg_SRT_13_entry"
+  , "stg_SRT_13_info"
+  , "stg_SRT_14_entry"
+  , "stg_SRT_14_info"
+  , "stg_SRT_15_entry"
+  , "stg_SRT_15_info"
+  , "stg_SRT_16_entry"
+  , "stg_SRT_16_info"
+  , "stg_SRT_1_entry"
+  , "stg_SRT_1_info"
+  , "stg_SRT_2_entry"
+  , "stg_SRT_2_info"
+  , "stg_SRT_3_entry"
+  , "stg_SRT_3_info"
+  , "stg_SRT_4_entry"
+  , "stg_SRT_4_info"
+  , "stg_SRT_5_entry"
+  , "stg_SRT_5_info"
+  , "stg_SRT_6_entry"
+  , "stg_SRT_6_info"
+  , "stg_SRT_7_entry"
+  , "stg_SRT_7_info"
+  , "stg_SRT_8_entry"
+  , "stg_SRT_8_info"
+  , "stg_SRT_9_entry"
+  , "stg_SRT_9_info"
+  , "stg_STABLE_NAME_entry"
+  , "stg_STABLE_NAME_info"
+  , "stg_STACK_entry"
+  , "stg_STACK_info"
+  , "stg_STM_AWOKEN_closure"
+  , "stg_STM_AWOKEN_entry"
+  , "stg_STM_AWOKEN_info"
+  , "stg_TIMEOUT_QUEUE_EMPTY_closure"
+  , "stg_TIMEOUT_QUEUE_EMPTY_entry"
+  , "stg_TIMEOUT_QUEUE_EMPTY_info"
+  , "stg_TIMEOUT_QUEUE_entry"
+  , "stg_TIMEOUT_QUEUE_info"
+  , "stg_TREC_CHUNK_entry"
+  , "stg_TREC_CHUNK_info"
+  , "stg_TREC_HEADER_entry"
+  , "stg_TREC_HEADER_info"
+  , "stg_TSO_entry"
+  , "stg_TSO_info"
+  , "stg_TVAR_CLEAN_entry"
+  , "stg_TVAR_CLEAN_info"
+  , "stg_TVAR_DIRTY_entry"
+  , "stg_TVAR_DIRTY_info"
+  , "stg_TVAR_WATCH_QUEUE_entry"
+  , "stg_TVAR_WATCH_QUEUE_info"
+  , "stg_WEAK_entry"
+  , "stg_WEAK_info"
+  , "stg_WHITEHOLE_entry"
+  , "stg_WHITEHOLE_info"
+  , "stg_absentErrorzh"
+  , "stg_addCFinalizzerToWeakzh"
+  , "stg_ann_frame_info"
+  , "stg_ann_frame_ret"
+  , "stg_annotateStackzh"
+  , "stg_ap_0_fast"
+  , "stg_ap_1_upd_entry"
+  , "stg_ap_1_upd_info"
+  , "stg_ap_2_upd_entry"
+  , "stg_ap_2_upd_info"
+  , "stg_ap_3_upd_entry"
+  , "stg_ap_3_upd_info"
+  , "stg_ap_4_upd_entry"
+  , "stg_ap_4_upd_info"
+  , "stg_ap_5_upd_entry"
+  , "stg_ap_5_upd_info"
+  , "stg_ap_6_upd_entry"
+  , "stg_ap_6_upd_info"
+  , "stg_ap_7_upd_entry"
+  , "stg_ap_7_upd_info"
+  , "stg_ap_d_fast"
+  , "stg_ap_d_info"
+  , "stg_ap_d_ret"
+  , "stg_ap_f_fast"
+  , "stg_ap_f_info"
+  , "stg_ap_f_ret"
+  , "stg_ap_l_fast"
+  , "stg_ap_l_info"
+  , "stg_ap_l_ret"
+  , "stg_ap_n_fast"
+  , "stg_ap_n_info"
+  , "stg_ap_n_ret"
+  , "stg_ap_p_fast"
+  , "stg_ap_p_info"
+  , "stg_ap_p_ret"
+  , "stg_ap_pp_fast"
+  , "stg_ap_pp_info"
+  , "stg_ap_pp_ret"
+  , "stg_ap_ppp_fast"
+  , "stg_ap_ppp_info"
+  , "stg_ap_ppp_ret"
+  , "stg_ap_pppp_fast"
+  , "stg_ap_pppp_info"
+  , "stg_ap_pppp_ret"
+  , "stg_ap_ppppp_fast"
+  , "stg_ap_ppppp_info"
+  , "stg_ap_ppppp_ret"
+  , "stg_ap_pppppp_fast"
+  , "stg_ap_pppppp_info"
+  , "stg_ap_pppppp_ret"
+  , "stg_ap_pppv_fast"
+  , "stg_ap_pppv_info"
+  , "stg_ap_pppv_ret"
+  , "stg_ap_ppv_fast"
+  , "stg_ap_ppv_info"
+  , "stg_ap_ppv_ret"
+  , "stg_ap_pv_fast"
+  , "stg_ap_pv_info"
+  , "stg_ap_pv_ret"
+  , "stg_ap_stack_entries"
+  , "stg_ap_stk_v16"
+  , "stg_ap_stk_v32"
+  , "stg_ap_stk_v64"
+  , "stg_ap_v16_fast"
+  , "stg_ap_v16_info"
+  , "stg_ap_v16_ret"
+  , "stg_ap_v32_fast"
+  , "stg_ap_v32_info"
+  , "stg_ap_v32_ret"
+  , "stg_ap_v64_fast"
+  , "stg_ap_v64_info"
+  , "stg_ap_v64_ret"
+  , "stg_ap_v_fast"
+  , "stg_ap_v_info"
+  , "stg_ap_v_ret"
+  , "stg_apply_interp_info"
+  , "stg_apply_interp_ret"
+  , "stg_arg_bitmaps"
+  , "stg_atomicModifyMutVar2zh"
+  , "stg_atomicModifyMutVarzuzh"
+  , "stg_atomically_entry"
+  , "stg_atomically_frame_info"
+  , "stg_atomically_frame_ret"
+  , "stg_atomically_info"
+  , "stg_atomically_waiting_frame_info"
+  , "stg_atomically_waiting_frame_ret"
+  , "stg_atomicallyzh"
+  , "stg_bh_upd_frame_info"
+  , "stg_bh_upd_frame_ret"
+  , "stg_block_blackhole"
+  , "stg_block_blackhole_finally"
+  , "stg_block_noregs"
+  , "stg_block_putmvar"
+  , "stg_block_putmvar_info"
+  , "stg_block_putmvar_ret"
+  , "stg_block_readmvar"
+  , "stg_block_readmvar_info"
+  , "stg_block_readmvar_ret"
+  , "stg_block_stmwait"
+  , "stg_block_takemvar"
+  , "stg_block_takemvar_info"
+  , "stg_block_takemvar_ret"
+  , "stg_block_throwto"
+  , "stg_block_throwto_info"
+  , "stg_block_throwto_ret"
+  , "stg_casArrayzh"
+  , "stg_casInt16Arrayzh"
+  , "stg_casInt32Arrayzh"
+  , "stg_casInt64Arrayzh"
+  , "stg_casInt8Arrayzh"
+  , "stg_casIntArrayzh"
+  , "stg_casMutVarzh"
+  , "stg_casSmallArrayzh"
+  , "stg_castDoubleToWord64zh"
+  , "stg_castFloatToWord32zh"
+  , "stg_castWord32ToFloatzh"
+  , "stg_castWord64ToDoublezh"
+  , "stg_catchRetryzh"
+  , "stg_catchSTMzh"
+  , "stg_catch_entry"
+  , "stg_catch_frame_info"
+  , "stg_catch_frame_ret"
+  , "stg_catch_info"
+  , "stg_catch_retry_frame_info"
+  , "stg_catch_retry_frame_ret"
+  , "stg_catch_stm_frame_info"
+  , "stg_catch_stm_frame_ret"
+  , "stg_catchzh"
+  , "stg_clearCCSzh"
+  , "stg_cloneArrayzh"
+  , "stg_cloneMutableArrayzh"
+  , "stg_cloneSmallArrayzh"
+  , "stg_cloneSmallMutableArrayzh"
+  , "stg_closureSizzezh"
+  , "stg_compactAddWithSharingzh"
+  , "stg_compactAddzh"
+  , "stg_compactAllocateBlockzh"
+  , "stg_compactAppendzh"
+  , "stg_compactContainsAnyzh"
+  , "stg_compactContainszh"
+  , "stg_compactFixupPointerszh"
+  , "stg_compactGetFirstBlockzh"
+  , "stg_compactGetNextBlockzh"
+  , "stg_compactGetRootzh"
+  , "stg_compactNewzh"
+  , "stg_compactResizzezh"
+  , "stg_compactSizzezh"
+  , "stg_control0zh"
+  , "stg_control0zh_ll"
+  , "stg_copyArray_barrier"
+  , "stg_copyArrayzh"
+  , "stg_copyMutableArrayzh"
+  , "stg_copySmallArrayzh"
+  , "stg_copySmallMutableArrayzh"
+  , "stg_ctoi_D1_info"
+  , "stg_ctoi_D1_ret"
+  , "stg_ctoi_F1_info"
+  , "stg_ctoi_F1_ret"
+  , "stg_ctoi_L1_info"
+  , "stg_ctoi_L1_ret"
+  , "stg_ctoi_R1n_info"
+  , "stg_ctoi_R1n_ret"
+  , "stg_ctoi_R1p_info"
+  , "stg_ctoi_R1p_ret"
+  , "stg_ctoi_V_info"
+  , "stg_ctoi_V_ret"
+  , "stg_ctoi_t"
+  , "stg_ctoi_t0_info"
+  , "stg_ctoi_t0_ret"
+  , "stg_ctoi_t10_info"
+  , "stg_ctoi_t10_ret"
+  , "stg_ctoi_t11_info"
+  , "stg_ctoi_t11_ret"
+  , "stg_ctoi_t12_info"
+  , "stg_ctoi_t12_ret"
+  , "stg_ctoi_t13_info"
+  , "stg_ctoi_t13_ret"
+  , "stg_ctoi_t14_info"
+  , "stg_ctoi_t14_ret"
+  , "stg_ctoi_t15_info"
+  , "stg_ctoi_t15_ret"
+  , "stg_ctoi_t16_info"
+  , "stg_ctoi_t16_ret"
+  , "stg_ctoi_t17_info"
+  , "stg_ctoi_t17_ret"
+  , "stg_ctoi_t18_info"
+  , "stg_ctoi_t18_ret"
+  , "stg_ctoi_t19_info"
+  , "stg_ctoi_t19_ret"
+  , "stg_ctoi_t1_info"
+  , "stg_ctoi_t1_ret"
+  , "stg_ctoi_t20_info"
+  , "stg_ctoi_t20_ret"
+  , "stg_ctoi_t21_info"
+  , "stg_ctoi_t21_ret"
+  , "stg_ctoi_t22_info"
+  , "stg_ctoi_t22_ret"
+  , "stg_ctoi_t23_info"
+  , "stg_ctoi_t23_ret"
+  , "stg_ctoi_t24_info"
+  , "stg_ctoi_t24_ret"
+  , "stg_ctoi_t25_info"
+  , "stg_ctoi_t25_ret"
+  , "stg_ctoi_t26_info"
+  , "stg_ctoi_t26_ret"
+  , "stg_ctoi_t27_info"
+  , "stg_ctoi_t27_ret"
+  , "stg_ctoi_t28_info"
+  , "stg_ctoi_t28_ret"
+  , "stg_ctoi_t29_info"
+  , "stg_ctoi_t29_ret"
+  , "stg_ctoi_t2_info"
+  , "stg_ctoi_t2_ret"
+  , "stg_ctoi_t30_info"
+  , "stg_ctoi_t30_ret"
+  , "stg_ctoi_t31_info"
+  , "stg_ctoi_t31_ret"
+  , "stg_ctoi_t32_info"
+  , "stg_ctoi_t32_ret"
+  , "stg_ctoi_t33_info"
+  , "stg_ctoi_t33_ret"
+  , "stg_ctoi_t34_info"
+  , "stg_ctoi_t34_ret"
+  , "stg_ctoi_t35_info"
+  , "stg_ctoi_t35_ret"
+  , "stg_ctoi_t36_info"
+  , "stg_ctoi_t36_ret"
+  , "stg_ctoi_t37_info"
+  , "stg_ctoi_t37_ret"
+  , "stg_ctoi_t38_info"
+  , "stg_ctoi_t38_ret"
+  , "stg_ctoi_t39_info"
+  , "stg_ctoi_t39_ret"
+  , "stg_ctoi_t3_info"
+  , "stg_ctoi_t3_ret"
+  , "stg_ctoi_t40_info"
+  , "stg_ctoi_t40_ret"
+  , "stg_ctoi_t41_info"
+  , "stg_ctoi_t41_ret"
+  , "stg_ctoi_t42_info"
+  , "stg_ctoi_t42_ret"
+  , "stg_ctoi_t43_info"
+  , "stg_ctoi_t43_ret"
+  , "stg_ctoi_t44_info"
+  , "stg_ctoi_t44_ret"
+  , "stg_ctoi_t45_info"
+  , "stg_ctoi_t45_ret"
+  , "stg_ctoi_t46_info"
+  , "stg_ctoi_t46_ret"
+  , "stg_ctoi_t47_info"
+  , "stg_ctoi_t47_ret"
+  , "stg_ctoi_t48_info"
+  , "stg_ctoi_t48_ret"
+  , "stg_ctoi_t49_info"
+  , "stg_ctoi_t49_ret"
+  , "stg_ctoi_t4_info"
+  , "stg_ctoi_t4_ret"
+  , "stg_ctoi_t50_info"
+  , "stg_ctoi_t50_ret"
+  , "stg_ctoi_t51_info"
+  , "stg_ctoi_t51_ret"
+  , "stg_ctoi_t52_info"
+  , "stg_ctoi_t52_ret"
+  , "stg_ctoi_t53_info"
+  , "stg_ctoi_t53_ret"
+  , "stg_ctoi_t54_info"
+  , "stg_ctoi_t54_ret"
+  , "stg_ctoi_t55_info"
+  , "stg_ctoi_t55_ret"
+  , "stg_ctoi_t56_info"
+  , "stg_ctoi_t56_ret"
+  , "stg_ctoi_t57_info"
+  , "stg_ctoi_t57_ret"
+  , "stg_ctoi_t58_info"
+  , "stg_ctoi_t58_ret"
+  , "stg_ctoi_t59_info"
+  , "stg_ctoi_t59_ret"
+  , "stg_ctoi_t5_info"
+  , "stg_ctoi_t5_ret"
+  , "stg_ctoi_t60_info"
+  , "stg_ctoi_t60_ret"
+  , "stg_ctoi_t61_info"
+  , "stg_ctoi_t61_ret"
+  , "stg_ctoi_t62_info"
+  , "stg_ctoi_t62_ret"
+  , "stg_ctoi_t6_info"
+  , "stg_ctoi_t6_ret"
+  , "stg_ctoi_t7_info"
+  , "stg_ctoi_t7_ret"
+  , "stg_ctoi_t8_info"
+  , "stg_ctoi_t8_ret"
+  , "stg_ctoi_t9_info"
+  , "stg_ctoi_t9_ret"
+  , "stg_deRefStablePtrzh"
+  , "stg_deRefWeakzh"
+  , "stg_dead_thread_info"
+  , "stg_dead_thread_ret"
+  , "stg_decodeDoublezu2Intzh"
+  , "stg_decodeDoublezuInt64zh"
+  , "stg_decodeFloatzuIntzh"
+  , "stg_delayzh"
+  , "stg_dummy_ret_closure"
+  , "stg_dummy_ret_entry"
+  , "stg_dummy_ret_info"
+  , "stg_enter_info"
+  , "stg_enter_ret"
+  , "stg_exit"
+  , "stg_finalizzeWeakzh"
+  , "stg_forceIO_closure"
+  , "stg_forceIO_info"
+  , "stg_forceIO_ret"
+  , "stg_forkOnzh"
+  , "stg_forkzh"
+  , "stg_freezzeArrayzh"
+  , "stg_freezzeSmallArrayzh"
+  , "stg_gc_d1"
+  , "stg_gc_f1"
+  , "stg_gc_fun_info"
+  , "stg_gc_fun_ret"
+  , "stg_gc_l1"
+  , "stg_gc_noregs"
+  , "stg_gc_pp"
+  , "stg_gc_ppp"
+  , "stg_gc_pppp"
+  , "stg_gc_prim"
+  , "stg_gc_prim_n"
+  , "stg_gc_prim_p"
+  , "stg_gc_prim_p_ll"
+  , "stg_gc_prim_p_ll_ret_info"
+  , "stg_gc_prim_p_ll_ret_ret"
+  , "stg_gc_prim_pp"
+  , "stg_gc_prim_pp_ll"
+  , "stg_gc_prim_pp_ll_ret_info"
+  , "stg_gc_prim_pp_ll_ret_ret"
+  , "stg_gc_unbx_r1"
+  , "stg_gc_unpt_r1"
+  , "stg_getApStackValzh"
+  , "stg_getMaskingStatezh"
+  , "stg_getOtherThreadAllocationCounterzh"
+  , "stg_getSparkzh"
+  , "stg_getThreadAllocationCounterzh"
+  , "stg_isByteArrayPinnedzh"
+  , "stg_isByteArrayWeaklyPinnedzh"
+  , "stg_isCurrentThreadBoundzh"
+  , "stg_isEmptyMVarzh"
+  , "stg_isMutableByteArrayPinnedzh"
+  , "stg_isMutableByteArrayWeaklyPinnedzh"
+  , "stg_keepAlive_frame_info"
+  , "stg_keepAlive_frame_ret"
+  , "stg_keepAlivezh"
+  , "stg_killMyself"
+  , "stg_killThreadzh"
+  , "stg_labelThreadzh"
+  , "stg_listThreadszh"
+  , "stg_makeStableNamezh"
+  , "stg_makeStablePtrzh"
+  , "stg_marked_upd_frame_info"
+  , "stg_marked_upd_frame_ret"
+  , "stg_maskAsyncExceptionszh"
+  , "stg_maskAsyncExceptionszh_ret_info"
+  , "stg_maskAsyncExceptionszh_ret_ret"
+  , "stg_maskUninterruptiblezh"
+  , "stg_maskUninterruptiblezh_ret_info"
+  , "stg_maskUninterruptiblezh_ret_ret"
+  , "stg_mkApUpd0zh"
+  , "stg_mkWeakForeignzh"
+  , "stg_mkWeakNoFinalizzerzh"
+  , "stg_mkWeakzh"
+  , "stg_myThreadIdzh"
+  , "stg_newAlignedPinnedByteArrayzh"
+  , "stg_newArrayzh"
+  , "stg_newBCOzh"
+  , "stg_newByteArrayzh"
+  , "stg_newMVarzh"
+  , "stg_newMutVarzh"
+  , "stg_newPinnedByteArrayzh"
+  , "stg_newPromptTagzh"
+  , "stg_newSmallArrayzh"
+  , "stg_newTVarzh"
+  , "stg_noDuplicate_entry"
+  , "stg_noDuplicate_info"
+  , "stg_noDuplicatezh"
+  , "stg_noforceIO_info"
+  , "stg_noforceIO_ret"
+  , "stg_noupd_frame_info"
+  , "stg_noupd_frame_ret"
+  , "stg_numSparkszh"
+  , "stg_orig_thunk_info_frame_info"
+  , "stg_orig_thunk_info_frame_ret"
+  , "stg_overwritingClosure"
+  , "stg_overwritingClosureSize"
+  , "stg_overwritingMutableClosureOfs"
+  , "stg_paniczh"
+  , "stg_pending_events"
+  , "stg_primcall_info"
+  , "stg_primcall_ret"
+  , "stg_prompt_frame_info"
+  , "stg_prompt_frame_ret"
+  , "stg_promptzh"
+  , "stg_putMVarzh"
+  , "stg_raiseDivZZerozh"
+  , "stg_raiseIOzh"
+  , "stg_raiseOverflowzh"
+  , "stg_raiseUnderflowzh"
+  , "stg_raise_entry"
+  , "stg_raise_info"
+  , "stg_raise_ret_entry"
+  , "stg_raise_ret_info"
+  , "stg_raisezh"
+  , "stg_readMVarzh"
+  , "stg_readTVarIOzh"
+  , "stg_readTVarzh"
+  , "stg_resizzeMutableByteArrayzh"
+  , "stg_restore_cccs_d_info"
+  , "stg_restore_cccs_d_ret"
+  , "stg_restore_cccs_eval_info"
+  , "stg_restore_cccs_eval_ret"
+  , "stg_restore_cccs_v16_info"
+  , "stg_restore_cccs_v16_ret"
+  , "stg_restore_cccs_v32_info"
+  , "stg_restore_cccs_v32_ret"
+  , "stg_restore_cccs_v64_info"
+  , "stg_restore_cccs_v64_ret"
+  , "stg_ret_d_info"
+  , "stg_ret_d_ret"
+  , "stg_ret_f_info"
+  , "stg_ret_f_ret"
+  , "stg_ret_l_info"
+  , "stg_ret_l_ret"
+  , "stg_ret_n_info"
+  , "stg_ret_n_ret"
+  , "stg_ret_p_info"
+  , "stg_ret_p_ret"
+  , "stg_ret_t_info"
+  , "stg_ret_t_ret"
+  , "stg_ret_v_info"
+  , "stg_ret_v_ret"
+  , "stg_retryzh"
+  , "stg_returnToSched"
+  , "stg_returnToSchedButFirst"
+  , "stg_returnToSchedNotPaused"
+  , "stg_returnToStackTop"
+  , "stg_runRWzh"
+  , "stg_sel_0_noupd_entry"
+  , "stg_sel_0_noupd_info"
+  , "stg_sel_0_upd_entry"
+  , "stg_sel_0_upd_info"
+  , "stg_sel_10_noupd_entry"
+  , "stg_sel_10_noupd_info"
+  , "stg_sel_10_upd_entry"
+  , "stg_sel_10_upd_info"
+  , "stg_sel_11_noupd_entry"
+  , "stg_sel_11_noupd_info"
+  , "stg_sel_11_upd_entry"
+  , "stg_sel_11_upd_info"
+  , "stg_sel_12_noupd_entry"
+  , "stg_sel_12_noupd_info"
+  , "stg_sel_12_upd_entry"
+  , "stg_sel_12_upd_info"
+  , "stg_sel_13_noupd_entry"
+  , "stg_sel_13_noupd_info"
+  , "stg_sel_13_upd_entry"
+  , "stg_sel_13_upd_info"
+  , "stg_sel_14_noupd_entry"
+  , "stg_sel_14_noupd_info"
+  , "stg_sel_14_upd_entry"
+  , "stg_sel_14_upd_info"
+  , "stg_sel_15_noupd_entry"
+  , "stg_sel_15_noupd_info"
+  , "stg_sel_15_upd_entry"
+  , "stg_sel_15_upd_info"
+  , "stg_sel_1_noupd_entry"
+  , "stg_sel_1_noupd_info"
+  , "stg_sel_1_upd_entry"
+  , "stg_sel_1_upd_info"
+  , "stg_sel_2_noupd_entry"
+  , "stg_sel_2_noupd_info"
+  , "stg_sel_2_upd_entry"
+  , "stg_sel_2_upd_info"
+  , "stg_sel_3_noupd_entry"
+  , "stg_sel_3_noupd_info"
+  , "stg_sel_3_upd_entry"
+  , "stg_sel_3_upd_info"
+  , "stg_sel_4_noupd_entry"
+  , "stg_sel_4_noupd_info"
+  , "stg_sel_4_upd_entry"
+  , "stg_sel_4_upd_info"
+  , "stg_sel_5_noupd_entry"
+  , "stg_sel_5_noupd_info"
+  , "stg_sel_5_upd_entry"
+  , "stg_sel_5_upd_info"
+  , "stg_sel_6_noupd_entry"
+  , "stg_sel_6_noupd_info"
+  , "stg_sel_6_upd_entry"
+  , "stg_sel_6_upd_info"
+  , "stg_sel_7_noupd_entry"
+  , "stg_sel_7_noupd_info"
+  , "stg_sel_7_upd_entry"
+  , "stg_sel_7_upd_info"
+  , "stg_sel_8_noupd_entry"
+  , "stg_sel_8_noupd_info"
+  , "stg_sel_8_upd_entry"
+  , "stg_sel_8_upd_info"
+  , "stg_sel_9_noupd_entry"
+  , "stg_sel_9_noupd_info"
+  , "stg_sel_9_upd_entry"
+  , "stg_sel_9_upd_info"
+  , "stg_setOtherThreadAllocationCounterzh"
+  , "stg_setThreadAllocationCounterzh"
+  , "stg_shrinkMutableByteArrayzh"
+  , "stg_shrinkSmallMutableArrayzh"
+  , "stg_sig_install"
+  , "stg_stack_save_entries"
+  , "stg_stack_underflow_frame_d_info"
+  , "stg_stack_underflow_frame_d_ret"
+  , "stg_stack_underflow_frame_v16_info"
+  , "stg_stack_underflow_frame_v16_ret"
+  , "stg_stack_underflow_frame_v32_info"
+  , "stg_stack_underflow_frame_v32_ret"
+  , "stg_stack_underflow_frame_v64_info"
+  , "stg_stack_underflow_frame_v64_ret"
+  , "stg_stk_save_v16"
+  , "stg_stk_save_v32"
+  , "stg_stk_save_v64"
+  , "stg_stop_thread_info"
+  , "stg_stop_thread_ret"
+  , "stg_takeMVarzh"
+  , "stg_thawArrayzh"
+  , "stg_thawSmallArrayzh"
+  , "stg_threadFinished"
+  , "stg_threadLabelzh"
+  , "stg_threadStatuszh"
+  , "stg_traceBinaryEventzh"
+  , "stg_traceEventzh"
+  , "stg_traceMarkerzh"
+  , "stg_tryPutMVarzh"
+  , "stg_tryReadMVarzh"
+  , "stg_tryTakeMVarzh"
+  , "stg_unmaskAsyncExceptionszh"
+  , "stg_unmaskAsyncExceptionszh_ret_info"
+  , "stg_unmaskAsyncExceptionszh_ret_ret"
+  , "stg_unpackClosurezh"
+  , "stg_unpack_cstring_entry"
+  , "stg_unpack_cstring_info"
+  , "stg_unpack_cstring_utf8_entry"
+  , "stg_unpack_cstring_utf8_info"
+  , "stg_unsafeThawArrayzh"
+  , "stg_unsafeThawSmallArrayzh"
+  , "stg_upd_frame_info"
+  , "stg_upd_frame_ret"
+  , "stg_waitReadzh"
+  , "stg_waitWritezh"
+  , "stg_whereFromzh"
+  , "stg_writeTVarzh"
+  , "stg_yield_noregs"
+  , "stg_yield_to_interpreter"
+  , "stg_yieldzh"
+  , "stmAbortTransaction"
+  , "stmCommitNestedTransaction"
+  , "stmCommitTransaction"
+  , "stmCondemnTransaction"
+  , "stmFreeAbortedTRec"
+  , "stmPreGCHook"
+  , "stmReWait"
+  , "stmReadTVar"
+  , "stmStartNestedTransaction"
+  , "stmStartTransaction"
+  , "stmValidateNestOfTransactions"
+  , "stmWait"
+  , "stmWaitUnlock"
+  , "stmWriteTVar"
+  , "stopCapability"
+  , "stopHeapProfTimer"
+  , "stopIOManager"
+  , "stopProfTimer"
+  , "stopTicker"
+  , "stopTimer"
+  , "storageAddCapabilities"
+  , "stpcpy"
+  , "stpncpy"
+  , "strMatchesSelector"
+  , "strcasecmp"
+  , "strcasestr"
+  , "strcat"
+  , "strchr"
+  , "strcmp"
+  , "strcoll"
+  , "strcpy"
+  , "strcspn"
+  , "strdup"
+  , "strerror"
+  , "strerror_r"
+  , "strftime"
+  , "strlcat"
+  , "strlcpy"
+  , "strlen"
+  , "strmode"
+  , "strncasecmp"
+  , "strncat"
+  , "strncmp"
+  , "strncpy"
+  , "strndup"
+  , "strnlen"
+  , "strnstr"
+  , "strpbrk"
+  , "strptime"
+  , "strrchr"
+  , "strsep"
+  , "strsignal"
+  , "strsignal_r"
+  , "strspn"
+  , "strstr"
+  , "strtod"
+  , "strtof"
+  , "strtoimax"
+  , "strtok"
+  , "strtok_r"
+  , "strtol"
+  , "strtold"
+  , "strtoll"
+  , "strtonum"
+  , "strtoq"
+  , "strtoul"
+  , "strtoull"
+  , "strtoumax"
+  , "strtouq"
+  , "strxfrm"
+  , "suboptarg"
+  , "suspendComputation"
+  , "suspendThread"
+  , "swab"
+  , "sweep"
+  , "symhash"
+  , "syncDelay"
+  , "syncDelayCancel"
+  , "syncDelayCancelTimeout"
+  , "syncDelayTimeout"
+  , "syncIOCancel"
+  , "syncIOWaitReady"
+  , "sysErrorBelch"
+  , "sys_errlist"
+  , "sys_nerr"
+  , "system"
+  , "tan"
+  , "tanf"
+  , "tanh"
+  , "tanhf"
+  , "tanhl"
+  , "tanl"
+  , "taskCount"
+  , "tempnam"
+  , "tgamma"
+  , "tgammaf"
+  , "tgammal"
+  , "the_gc_thread"
+  , "threadPaused"
+  , "threadStableNameTable"
+  , "threadStablePtrTable"
+  , "threadStackOverflow"
+  , "threadStackUnderflow"
+  , "throwTo"
+  , "throwToMsg"
+  , "throwToSelf"
+  , "throwToSingleThreaded"
+  , "throwToSingleThreaded_"
+  , "thunk_selector_depth"
+  , "ticky_entry_ctrs"
+  , "ticky_slow_call_unevald"
+  , "time"
+  , "time2posix"
+  , "time_str"
+  , "timedWaitCondition"
+  , "timegm"
+  , "timelocal"
+  , "timeoutInMilliseconds"
+  , "timespec_get"
+  , "timezone"
+  , "timingsafe_bcmp"
+  , "tmpfile"
+  , "tmpnam"
+  , "todo_block_full"
+  , "top_ct"
+  , "totalArgumentSize"
+  , "traceCapCreate"
+  , "traceCapDelete"
+  , "traceCapDisable"
+  , "traceCapEnable"
+  , "traceCapsetAssignCap"
+  , "traceCapsetCreate"
+  , "traceCapsetDelete"
+  , "traceCapsetRemoveCap"
+  , "traceEventBlocksSize"
+  , "traceEventCreateSparkThread"
+  , "traceEventCreateThread"
+  , "traceEventGcDone"
+  , "traceEventGcEnd"
+  , "traceEventGcEndAtT"
+  , "traceEventGcGlobalSync"
+  , "traceEventGcIdle"
+  , "traceEventGcStart"
+  , "traceEventGcStartAtT"
+  , "traceEventGcStats"
+  , "traceEventGcWork"
+  , "traceEventHeapAllocated"
+  , "traceEventHeapInfo"
+  , "traceEventHeapLive"
+  , "traceEventHeapSize"
+  , "traceEventMemReturn"
+  , "traceEventMigrateThread"
+  , "traceEventRequestParGc"
+  , "traceEventRequestSeqGc"
+  , "traceEventRunThread"
+  , "traceEventSparkCreate"
+  , "traceEventSparkDud"
+  , "traceEventSparkFizzle"
+  , "traceEventSparkGC"
+  , "traceEventSparkOverflow"
+  , "traceEventSparkRun"
+  , "traceEventSparkSteal"
+  , "traceEventStopThread"
+  , "traceEventThreadWakeup"
+  , "traceOSProcessInfo"
+  , "traceSparkCounters"
+  , "traceTaskCreate"
+  , "traceTaskDelete"
+  , "traceTaskMigrate"
+  , "traceThreadLabel"
+  , "traceWallClockTime"
+  , "traverseSparkQueues"
+  , "traverseWeakPtrList"
+  , "trunc"
+  , "truncateRunQueue"
+  , "truncf"
+  , "truncl"
+  , "tryWakeupThread"
+  , "tzname"
+  , "tzset"
+  , "tzsetwall"
+  , "uint16_t"
+  , "uint32_t"
+  , "uint8_t"
+  , "unblockOne"
+  , "unblockOne_"
+  , "unblockUserSignals"
+  , "ungetc"
+  , "unloadNativeObj"
+  , "unloadObj"
+  , "unload_mark_needed"
+  , "unlockClosure"
+  , "unlockFile"
+  , "unlockpt"
+  , "unsetenv"
+  , "upd_rem_set_block_list"
+  , "updateNurseriesStats"
+  , "updateRemembSetPushClosure"
+  , "updateRemembSetPushClosure_"
+  , "updateRemembSetPushMessageThrowTo"
+  , "updateRemembSetPushStack"
+  , "updateRemembSetPushTSO"
+  , "updateRemembSetPushThunk"
+  , "updateRemembSetPushThunkEager"
+  , "updateRemembSetPushThunk_"
+  , "updateStableNameTable"
+  , "updateThunk"
+  , "updateWithIndirection"
+  , "update_MVAR"
+  , "valloc"
+  , "vasprintf"
+  , "vbarf"
+  , "vdebugBelch"
+  , "vdprintf"
+  , "vectorSupportGlobalVar"
+  , "verifyCompact"
+  , "verrorBelch"
+  , "vfprintf"
+  , "vfscanf"
+  , "vprintf"
+  , "vscanf"
+  , "vsnprintf"
+  , "vsprintf"
+  , "vsscanf"
+  , "vsysErrorBelch"
+  , "wait"
+  , "wait3"
+  , "wait4"
+  , "waitCondition"
+  , "waitForCapability"
+  , "waitid"
+  , "waitpid"
+  , "wakeupIOManager"
+  , "walk_large_bitmap"
+  , "warnMissingKBLibraryPaths"
+  , "wcstoimax"
+  , "wcstombs"
+  , "wcstoumax"
+  , "wctomb"
+  , "work_stealing"
+  , "workerCount"
+  , "xchg_ptr"
+  , "y0"
+  , "y1"
+  , "yieldThread"
+  , "yn"
+  , "zeroSlop"
+  , "zopen"
+  ]
+
=====================================
utils/hsc2hs
=====================================
@@ -1 +1 @@
-Subproject commit fe3990b9f35000427b016a79330d9f195587cad8
+Subproject commit 3863f81b72d1c5877505e840fd203193c50d2e0f
=====================================
utils/parse-rts-symbols/README.md
=====================================
@@ -0,0 +1 @@
+# TODO
=====================================
utils/parse-rts-symbols/main.py
=====================================
@@ -0,0 +1,63 @@
+#!/usr/bin/env nix-shell
+#!nix-shell -i python3 -p python3Packages.libclang python3
+import os
+from clang.cindex import Index, CursorKind, LinkageKind, Config
+
+# RELATIVE TO ROOT!
+HEADER_DIR = "rts/"  # directory to scan
+
+# Recursively find all .h files
+def find_headers(root):
+    headers = []
+    for dirpath, _, filenames in os.walk(root):
+        for f in filenames:
+            if f.endswith(".h"):
+                headers.append(os.path.join(dirpath, f))
+    return headers
+
+# Parse a single header
+def parse_header(header_file, index):
+    try:
+        tu = index.parse(header_file, args=[f"-I{HEADER_DIR}"])
+    except Exception as e:
+        print(f"Failed to parse {header_file}: {e}", file=sys.stderr)
+        return []
+
+    symbols = []
+
+    def walk(node):
+        for c in node.get_children():
+            # Only external-linkage functions or global vars
+            if c.linkage == LinkageKind.EXTERNAL and \
+                c.kind in (CursorKind.FUNCTION_DECL, CursorKind.VAR_DECL): # and \
+               # c.visibility() != VisibilityKind.HIDDEN: # don't include #include "BeginPrivate.h" symbols
+                symbols.append(c.spelling)
+            walk(c)
+
+    walk(tu.cursor)
+    return symbols
+
+def main():
+    index = Index.create()
+    # If not in root directory, abort with error
+    if not os.path.isdir(HEADER_DIR):
+        print(f"Error: Directory {HEADER_DIR} does not exist. Are you running this script from the root directory as ./utils/parse-rts-symbols/main.py ?")
+        return
+    all_headers = find_headers(HEADER_DIR)
+    all_symbols = set()
+    for h in all_headers:
+        syms = parse_header(h, index)
+        all_symbols.update(syms)
+
+    print("# This list was automatically generated by utils/parse-rts-symbols/.")
+    print("# Please consult the README there for information about this file.")
+
+    for i, s in enumerate(sorted(all_symbols)):
+        if i == 0:
+            print("[ " + "\"" + s + "\"")
+        else:
+            print(", " + "\"" + s + "\"")
+    print("]")
+
+if __name__ == "__main__":
+    main()
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/2b16d5be235cbcdbbd50947a01edff…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/2b16d5be235cbcdbbd50947a01edff…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0
                            
                          
                          
                            
    
                          
                        
                    
                    
                        
Zubin pushed to branch wip/gitlab-inputs at Glasgow Haskell Compiler / GHC
Commits:
bf961a43 by Zubin Duggal at 2025-10-08T19:30:27+05:30
wip1
- - - - -
a32857e9 by Zubin Duggal at 2025-10-08T19:30:29+05:30
wip2
- - - - -
62f67c8c by Zubin Duggal at 2025-10-08T19:30:29+05:30
wip3
- - - - -
2505e622 by Zubin Duggal at 2025-10-08T19:30:29+05:30
wip4
- - - - -
42815dd1 by Zubin Duggal at 2025-10-08T19:30:29+05:30
wip5
- - - - -
010c8bee by Zubin Duggal at 2025-10-08T19:30:29+05:30
wip6
- - - - -
1 changed file:
- .gitlab-ci.yml
Changes:
=====================================
.gitlab-ci.yml
=====================================
@@ -202,6 +202,7 @@ workflow:
     - if: '$RELEASE_JOB == "yes"'
 
 .full-ci: &full-ci
+  - if: '"$[[ inputs.full_ci ]]" == "yes"'
   - if: '$CI_MERGE_REQUEST_LABELS =~ /.*full-ci.*/'
   - if: '$CI_MERGE_REQUEST_LABELS =~ /.*marge_bot_batch_merge_job.*/'
   - if: '$CI_COMMIT_BRANCH == "master"'
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/be471401270e06ea453ff8faa9f90a…
-- 
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/compare/be471401270e06ea453ff8faa9f90a…
You're receiving this email because of your account on gitlab.haskell.org.
                    
                  
                  
                          
                            
                            1
                            
                          
                          
                            
                            0