summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/HsVersions.h16
-rw-r--r--compiler/ghci/Linker.hs44
-rw-r--r--compiler/main/DynFlags.hs15
-rw-r--r--compiler/main/StaticFlags.hs20
-rw-r--r--compiler/simplCore/CoreMonad.hs75
-rw-r--r--compiler/utils/FastString.hs7
-rw-r--r--compiler/utils/Util.hs34
-rw-r--r--docs/users_guide/extending_ghc.rst13
-rw-r--r--includes/rts/Globals.h27
-rw-r--r--libraries/base/GHC/Conc/Sync.hs2
-rw-r--r--rts/Globals.c79
-rw-r--r--testsuite/tests/plugins/LinkerTicklingPlugin.hs4
-rw-r--r--testsuite/tests/plugins/annotation-plugin/SayAnnNames.hs1
-rw-r--r--testsuite/tests/simplCore/should_compile/T7702plugin/T7702Plugin.hs1
14 files changed, 182 insertions, 156 deletions
diff --git a/compiler/HsVersions.h b/compiler/HsVersions.h
index 4a0b04ad70..83cbcf15cb 100644
--- a/compiler/HsVersions.h
+++ b/compiler/HsVersions.h
@@ -32,22 +32,6 @@ name = Util.global (value);
name :: IORef (ty); \
name = Util.globalM (value);
-
-#define SHARED_GLOBAL_VAR(name,accessor,saccessor,value,ty) \
-{-# NOINLINE name #-}; \
-name :: IORef (ty); \
-name = Util.sharedGlobal (value) (accessor); \
-foreign import ccall unsafe saccessor \
- accessor :: Ptr (IORef a) -> IO (Ptr (IORef a));
-
-#define SHARED_GLOBAL_VAR_M(name,accessor,saccessor,value,ty) \
-{-# NOINLINE name #-}; \
-name :: IORef (ty); \
-name = Util.sharedGlobalM (value) (accessor); \
-foreign import ccall unsafe saccessor \
- accessor :: Ptr (IORef a) -> IO (Ptr (IORef a));
-
-
#define ASSERT(e) if debugIsOn && not (e) then (assertPanic __FILE__ __LINE__) else
#define ASSERT2(e,msg) if debugIsOn && not (e) then (assertPprPanic __FILE__ __LINE__ (msg)) else
#define WARN( e, msg ) (warnPprTrace (e) __FILE__ __LINE__ (msg)) $
diff --git a/compiler/ghci/Linker.hs b/compiler/ghci/Linker.hs
index 7379c46772..4a0b62f904 100644
--- a/compiler/ghci/Linker.hs
+++ b/compiler/ghci/Linker.hs
@@ -1,10 +1,11 @@
{-# LANGUAGE CPP, NondecreasingIndentation, TupleSections, RecordWildCards #-}
{-# OPTIONS_GHC -fno-cse #-}
--- -fno-cse is needed for GLOBAL_VAR's to behave properly
-
--
-- (c) The University of Glasgow 2002-2006
--
+
+-- -fno-cse is needed for GLOBAL_VAR's to behave properly
+
-- | The dynamic linker for GHCi.
--
-- This module deals with the top-level issues of dynamic linking,
@@ -15,7 +16,10 @@ module Linker ( getHValue, showLinkerState,
extendLinkEnv, deleteFromLinkEnv,
extendLoadedPkgs,
linkPackages,initDynLinker,linkModule,
- linkCmdLineLibs
+ linkCmdLineLibs,
+
+ -- Saving/restoring globals
+ PersistentLinkerState, saveLinkerGlobals, restoreLinkerGlobals
) where
#include "HsVersions.h"
@@ -62,11 +66,6 @@ import System.Directory
import Exception
-#if __GLASGOW_HASKELL__ >= 709
-import Foreign
-#else
-import Foreign.Safe
-#endif
{- **********************************************************************
@@ -85,22 +84,9 @@ library to side-effect the PLS and for those changes to be reflected here.
The PersistentLinkerState maps Names to actual closures (for
interpreted code only), for use during linking.
-}
-#if STAGE < 2
+
GLOBAL_VAR_M(v_PersistentLinkerState, newMVar (panic "Dynamic linker not initialised"), MVar PersistentLinkerState)
GLOBAL_VAR(v_InitLinkerDone, False, Bool) -- Set True when dynamic linker is initialised
-#else
-SHARED_GLOBAL_VAR_M( v_PersistentLinkerState
- , getOrSetLibHSghcPersistentLinkerState
- , "getOrSetLibHSghcPersistentLinkerState"
- , newMVar (panic "Dynamic linker not initialised")
- , MVar PersistentLinkerState)
--- Set True when dynamic linker is initialised
-SHARED_GLOBAL_VAR( v_InitLinkerDone
- , getOrSetLibHSghcInitLinkerDone
- , "getOrSetLibHSghcInitLinkerDone"
- , False
- , Bool)
-#endif
modifyPLS_ :: (PersistentLinkerState -> IO PersistentLinkerState) -> IO ()
modifyPLS_ f = readIORef v_PersistentLinkerState >>= flip modifyMVar_ f
@@ -1442,3 +1428,17 @@ maybePutStr dflags s
maybePutStrLn :: DynFlags -> String -> IO ()
maybePutStrLn dflags s = maybePutStr dflags (s ++ "\n")
+
+{- **********************************************************************
+
+ Tunneling global variables into new instance of GHC library
+
+ ********************************************************************* -}
+
+saveLinkerGlobals :: IO (MVar PersistentLinkerState, Bool)
+saveLinkerGlobals = liftM2 (,) (readIORef v_PersistentLinkerState) (readIORef v_InitLinkerDone)
+
+restoreLinkerGlobals :: (MVar PersistentLinkerState, Bool) -> IO ()
+restoreLinkerGlobals (pls, ild) = do
+ writeIORef v_PersistentLinkerState pls
+ writeIORef v_InitLinkerDone ild
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index c35834f935..f56ec63ead 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -232,13 +232,6 @@ import qualified Data.IntSet as IntSet
import GHC.Foreign (withCString, peekCString)
import qualified GHC.LanguageExtensions as LangExt
-#if __GLASGOW_HASKELL__ >= 709
-import Foreign
-#else
-import Foreign.Safe
-#endif
-
-
-- Note [Updating flag description in the User's Guide]
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
--
@@ -5144,15 +5137,7 @@ defaultGlobalDynFlags =
where
settings = panic "v_unsafeGlobalDynFlags: not initialised"
-#if STAGE < 2
GLOBAL_VAR(v_unsafeGlobalDynFlags, defaultGlobalDynFlags, DynFlags)
-#else
-SHARED_GLOBAL_VAR( v_unsafeGlobalDynFlags
- , getOrSetLibHSghcGlobalDynFlags
- , "getOrSetLibHSghcGlobalDynFlags"
- , defaultGlobalDynFlags
- , DynFlags )
-#endif
unsafeGlobalDynFlags :: DynFlags
unsafeGlobalDynFlags = unsafePerformIO $ readIORef v_unsafeGlobalDynFlags
diff --git a/compiler/main/StaticFlags.hs b/compiler/main/StaticFlags.hs
index af8f4e64d4..a89f3c54ab 100644
--- a/compiler/main/StaticFlags.hs
+++ b/compiler/main/StaticFlags.hs
@@ -48,12 +48,6 @@ import Control.Monad
import Data.IORef
import System.IO.Unsafe ( unsafePerformIO )
-#if __GLASGOW_HASKELL__ >= 709
-import Foreign
-#else
-import Foreign.Safe
-#endif
-
-----------------------------------------------------------------------------
-- Static flags
@@ -97,21 +91,9 @@ parseStaticFlagsFull flagsAvailable args = do
-- holds the static opts while they're being collected, before
-- being unsafely read by unpacked_static_opts below.
-#if STAGE < 2
GLOBAL_VAR(v_opt_C, [], [String])
GLOBAL_VAR(v_opt_C_ready, False, Bool)
-#else
-SHARED_GLOBAL_VAR( v_opt_C
- , getOrSetLibHSghcStaticOptions
- , "getOrSetLibHSghcStaticOptions"
- , []
- , [String])
-SHARED_GLOBAL_VAR( v_opt_C_ready
- , getOrSetLibHSghcStaticOptionsReady
- , "getOrSetLibHSghcStaticOptionsReady"
- , False
- , Bool)
-#endif
+
staticFlags :: [String]
staticFlags = unsafePerformIO $ do
diff --git a/compiler/simplCore/CoreMonad.hs b/compiler/simplCore/CoreMonad.hs
index 0667675d7e..314d0945d5 100644
--- a/compiler/simplCore/CoreMonad.hs
+++ b/compiler/simplCore/CoreMonad.hs
@@ -95,8 +95,16 @@ import Control.Applicative ( Alternative(..) )
import Prelude hiding ( read )
#ifdef GHCI
+import Control.Concurrent.MVar (MVar)
+import Linker ( PersistentLinkerState, saveLinkerGlobals, restoreLinkerGlobals )
import {-# SOURCE #-} TcSplice ( lookupThName_maybe )
import qualified Language.Haskell.TH as TH
+#else
+saveLinkerGlobals :: IO ()
+saveLinkerGlobals = return ()
+
+restoreLinkerGlobals :: () -> IO ()
+restoreLinkerGlobals () = return ()
#endif
{-
@@ -501,7 +509,12 @@ data CoreReader = CoreReader {
cr_print_unqual :: PrintUnqualified,
cr_loc :: SrcSpan, -- Use this for log/error messages so they
-- are at least tagged with the right source file
- cr_visible_orphan_mods :: !ModuleSet
+ cr_visible_orphan_mods :: !ModuleSet,
+#ifdef GHCI
+ cr_globals :: (MVar PersistentLinkerState, Bool)
+#else
+ cr_globals :: ()
+#endif
}
-- Note: CoreWriter used to be defined with data, rather than newtype. If it
@@ -573,13 +586,15 @@ runCoreM :: HscEnv
-> CoreM a
-> IO (a, SimplCount)
runCoreM hsc_env rule_base us mod orph_imps print_unqual loc m
- = liftM extract $ runIOEnv reader $ unCoreM m state
+ = do { glbls <- saveLinkerGlobals
+ ; liftM extract $ runIOEnv (reader glbls) $ unCoreM m state }
where
- reader = CoreReader {
+ reader glbls = CoreReader {
cr_hsc_env = hsc_env,
cr_rule_base = rule_base,
cr_module = mod,
cr_visible_orphan_mods = orph_imps,
+ cr_globals = glbls,
cr_print_unqual = print_unqual,
cr_loc = loc
}
@@ -675,9 +690,59 @@ getPackageFamInstEnv = do
eps <- liftIO $ hscEPS hsc_env
return $ eps_fam_inst_env eps
-{-# DEPRECATED reinitializeGlobals "reinitializing globals is now a no-op." #-}
+{-
+************************************************************************
+* *
+ Initializing globals
+* *
+************************************************************************
+
+This is a rather annoying function. When a plugin is loaded, it currently
+gets linked against a *newly loaded* copy of the GHC package. This would
+not be a problem, except that the new copy has its own mutable state
+that is not shared with that state that has already been initialized by
+the original GHC package.
+
+(NB This mechanism is sufficient for granting plugins read-only access to
+globals that are guaranteed to be initialized before the plugin is loaded. If
+any further synchronization is necessary, I would suggest using the more
+sophisticated mechanism involving GHC.Conc.Sync.sharedCAF and rts/Globals.c to
+share a single instance of the global variable among the compiler and the
+plugins. Perhaps we should migrate all global variables to use that mechanism,
+for robustness... -- NSF July 2013)
+
+This leads to loaded plugins calling GHC code which pokes the static flags,
+and then dying with a panic because the static flags *it* sees are uninitialized.
+
+There are two possible solutions:
+ 1. Export the symbols from the GHC executable from the GHC library and link
+ against this existing copy rather than a new copy of the GHC library
+ 2. Carefully ensure that the global state in the two copies of the GHC
+ library matches
+
+I tried 1. and it *almost* works (and speeds up plugin load times!) except
+on Windows. On Windows the GHC library tends to export more than 65536 symbols
+(see #5292) which overflows the limit of what we can export from the EXE and
+causes breakage.
+
+(Note that if the GHC executable was dynamically linked this wouldn't be a
+problem, because we could share the GHC library it links to.)
+
+We are going to try 2. instead. Unfortunately, this means that every plugin
+will have to say `reinitializeGlobals` before it does anything, but never mind.
+
+I've threaded the cr_globals through CoreM rather than giving them as an
+argument to the plugin function so that we can turn this function into
+(return ()) without breaking any plugins when we eventually get 1. working.
+-}
+
reinitializeGlobals :: CoreM ()
-reinitializeGlobals = return ()
+reinitializeGlobals = do
+ linker_globals <- read cr_globals
+ hsc_env <- getHscEnv
+ let dflags = hsc_dflags hsc_env
+ liftIO $ restoreLinkerGlobals linker_globals
+ liftIO $ setUnsafeGlobalDynFlags dflags
{-
************************************************************************
diff --git a/compiler/utils/FastString.hs b/compiler/utils/FastString.hs
index 8f76584875..1496a8686e 100644
--- a/compiler/utils/FastString.hs
+++ b/compiler/utils/FastString.hs
@@ -285,6 +285,13 @@ originally assigned to those FastStrings. Thus the lookup fails since the
domain of the GlobalRdrEnv is affected by the RdrName's OccName's FastString's
unique.
+The old `reinitializeGlobals` mechanism is enough to provide the plugin with
+read-access to the table, but it insufficient in the general case where the
+plugin may allocate FastStrings. This mutates the supply for the FastStrings'
+unique, and that needs to be propagated back to the compiler's instance of the
+global variable. Such propagation is beyond the `reinitializeGlobals`
+mechanism.
+
Maintaining synchronization of the two instances of this global is rather
difficult because of the uses of `unsafePerformIO` in this module. Not
synchronizing them risks breaking the rather major invariant that two
diff --git a/compiler/utils/Util.hs b/compiler/utils/Util.hs
index 88b5090f0a..3104c747a1 100644
--- a/compiler/utils/Util.hs
+++ b/compiler/utils/Util.hs
@@ -104,7 +104,6 @@ module Util (
hSetTranslit,
global, consIORef, globalM,
- sharedGlobal, sharedGlobalM,
-- * Filenames and paths
Suffix,
@@ -145,7 +144,6 @@ import qualified GHC.Stack
import Control.Applicative ( liftA2 )
import Control.Monad ( liftM )
import GHC.IO.Encoding (mkTextEncoding, textEncodingName)
-import GHC.Conc.Sync ( sharedCAF )
import System.IO (Handle, hGetEncoding, hSetEncoding)
import System.IO.Error as IO ( isDoesNotExistError )
import System.Directory ( doesDirectoryExist, getModificationTime )
@@ -932,28 +930,6 @@ seqList :: [a] -> b -> b
seqList [] b = b
seqList (x:xs) b = x `seq` seqList xs b
-
-{-
-************************************************************************
-* *
- Globals and the RTS
-* *
-************************************************************************
-
-When a plugin is loaded, it currently gets linked against a *newly
-loaded* copy of the GHC package. This would not be a problem, except
-that the new copy has its own mutable state that is not shared with
-that state that has already been initialized by the original GHC
-package.
-
-(Note that if the GHC executable was dynamically linked this
-wouldn't be a problem, because we could share the GHC library it
-links to; this is only a problem if DYNAMIC_GHC_PROGRAMS=NO.)
-
-The solution is to make use of @sharedCAF@ through @sharedGlobal@
-for globals that are shared between multiple copies of ghc packages.
--}
-
-- Global variables:
global :: a -> IORef a
@@ -966,16 +942,6 @@ consIORef var x = do
globalM :: IO a -> IORef a
globalM ma = unsafePerformIO (ma >>= newIORef)
--- Shared global variables:
-
-sharedGlobal :: a -> (Ptr (IORef a) -> IO (Ptr (IORef a))) -> IORef a
-sharedGlobal a get_or_set = unsafePerformIO $
- newIORef a >>= flip sharedCAF get_or_set
-
-sharedGlobalM :: IO a -> (Ptr (IORef a) -> IO (Ptr (IORef a))) -> IORef a
-sharedGlobalM ma get_or_set = unsafePerformIO $
- ma >>= newIORef >>= flip sharedCAF get_or_set
-
-- Module names:
looksLikeModuleName :: String -> Bool
diff --git a/docs/users_guide/extending_ghc.rst b/docs/users_guide/extending_ghc.rst
index c02c93fac1..17d061ec3e 100644
--- a/docs/users_guide/extending_ghc.rst
+++ b/docs/users_guide/extending_ghc.rst
@@ -305,6 +305,7 @@ just returns the original compilation pipeline, unmodified, and says
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install _ todo = do
+ reinitializeGlobals
putMsgS "Hello!"
return todo
@@ -313,6 +314,16 @@ cabal for instance,) you can then use it by just specifying
``-fplugin=DoNothing.Plugin`` on the command line, and during the
compilation you should see GHC say 'Hello'.
+Note carefully the ``reinitializeGlobals`` call at the beginning of the
+installation function. Due to bugs in the windows linker dealing with
+``libghc``, this call is necessary to properly ensure compiler plugins
+have the same global state as GHC at the time of invocation. Without
+``reinitializeGlobals``, compiler plugins can crash at runtime because
+they may require state that hasn't otherwise been initialized.
+
+In the future, when the linking bugs are fixed, ``reinitializeGlobals``
+will be deprecated with a warning, and changed to do nothing.
+
.. _core-plugins-in-more-detail:
Core plugins in more detail
@@ -385,6 +396,7 @@ in a module it compiles:
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install _ todo = do
+ reinitializeGlobals
return (CoreDoPluginPass "Say name" pass : todo)
pass :: ModGuts -> CoreM ModGuts
@@ -434,6 +446,7 @@ will print out the name of any top-level non-recursive binding with the
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install _ todo = do
+ reinitializeGlobals
return (CoreDoPluginPass "Say name" pass : todo)
pass :: ModGuts -> CoreM ModGuts
diff --git a/includes/rts/Globals.h b/includes/rts/Globals.h
index e3ff643556..00553610f5 100644
--- a/includes/rts/Globals.h
+++ b/includes/rts/Globals.h
@@ -17,23 +17,14 @@
#ifndef RTS_GLOBALS_H
#define RTS_GLOBALS_H
-#define mkStoreAccessorPrototype(name) \
- StgStablePtr \
- getOrSet##name(StgStablePtr ptr);
-
-mkStoreAccessorPrototype(GHCConcSignalSignalHandlerStore)
-mkStoreAccessorPrototype(GHCConcWindowsPendingDelaysStore)
-mkStoreAccessorPrototype(GHCConcWindowsIOManagerThreadStore)
-mkStoreAccessorPrototype(GHCConcWindowsProddingStore)
-mkStoreAccessorPrototype(SystemEventThreadEventManagerStore)
-mkStoreAccessorPrototype(SystemEventThreadIOManagerThreadStore)
-mkStoreAccessorPrototype(SystemTimerThreadEventManagerStore)
-mkStoreAccessorPrototype(SystemTimerThreadIOManagerThreadStore)
-mkStoreAccessorPrototype(LibHSghcFastStringTable)
-mkStoreAccessorPrototype(LibHSghcPersistentLinkerState)
-mkStoreAccessorPrototype(LibHSghcInitLinkerDone)
-mkStoreAccessorPrototype(LibHSghcGlobalDynFlags)
-mkStoreAccessorPrototype(LibHSghcStaticOptions)
-mkStoreAccessorPrototype(LibHSghcStaticOptionsReady)
+StgStablePtr getOrSetGHCConcSignalSignalHandlerStore(StgStablePtr value);
+StgStablePtr getOrSetGHCConcWindowsPendingDelaysStore(StgStablePtr ptr);
+StgStablePtr getOrSetGHCConcWindowsIOManagerThreadStore(StgStablePtr ptr);
+StgStablePtr getOrSetGHCConcWindowsProddingStore(StgStablePtr ptr);
+StgStablePtr getOrSetSystemEventThreadEventManagerStore(StgStablePtr ptr);
+StgStablePtr getOrSetSystemEventThreadIOManagerThreadStore(StgStablePtr ptr);
+StgStablePtr getOrSetSystemTimerThreadEventManagerStore(StgStablePtr ptr);
+StgStablePtr getOrSetSystemTimerThreadIOManagerThreadStore(StgStablePtr ptr);
+StgStablePtr getOrSetLibHSghcFastStringTable(StgStablePtr ptr);
#endif /* RTS_GLOBALS_H */
diff --git a/libraries/base/GHC/Conc/Sync.hs b/libraries/base/GHC/Conc/Sync.hs
index 200cdfec74..5986379cb3 100644
--- a/libraries/base/GHC/Conc/Sync.hs
+++ b/libraries/base/GHC/Conc/Sync.hs
@@ -856,7 +856,7 @@ modifyMVar_ m io =
-- Thread waiting
-----------------------------------------------------------------------------
--- Machinery needed to ensure that we only have one copy of certain
+-- Machinery needed to ensureb that we only have one copy of certain
-- CAFs in this module even when the base package is present twice, as
-- it is when base is dynamically loaded into GHCi. The RTS keeps
-- track of the single true value of the CAF, so even when the CAFs in
diff --git a/rts/Globals.c b/rts/Globals.c
index b5da6d9295..e3445c8d7b 100644
--- a/rts/Globals.c
+++ b/rts/Globals.c
@@ -13,7 +13,7 @@
* dynamically loads
*
* libHSghc - a statically-linked ghc has its own copy and so will Core
- * plugins it dynamically loads.
+ * plugins it dynamically loads (cf CoreMonad.reinitializeGlobals)
*
* ---------------------------------------------------------------------------*/
@@ -33,11 +33,6 @@ typedef enum {
SystemTimerThreadEventManagerStore,
SystemTimerThreadIOManagerThreadStore,
LibHSghcFastStringTable,
- LibHSghcPersistentLinkerState,
- LibHSghcInitLinkerDone,
- LibHSghcGlobalDynFlags,
- LibHSghcStaticOptions,
- LibHSghcStaticOptionsReady,
MaxStoreKey
} StoreKey;
@@ -92,22 +87,56 @@ static StgStablePtr getOrSetKey(StoreKey key, StgStablePtr ptr)
return ret;
}
-#define mkStoreAccessor(name) \
- StgStablePtr \
- getOrSet##name(StgStablePtr ptr) \
- { return getOrSetKey(name, ptr); }
-
-mkStoreAccessor(GHCConcSignalSignalHandlerStore)
-mkStoreAccessor(GHCConcWindowsPendingDelaysStore)
-mkStoreAccessor(GHCConcWindowsIOManagerThreadStore)
-mkStoreAccessor(GHCConcWindowsProddingStore)
-mkStoreAccessor(SystemEventThreadEventManagerStore)
-mkStoreAccessor(SystemEventThreadIOManagerThreadStore)
-mkStoreAccessor(SystemTimerThreadEventManagerStore)
-mkStoreAccessor(SystemTimerThreadIOManagerThreadStore)
-mkStoreAccessor(LibHSghcFastStringTable)
-mkStoreAccessor(LibHSghcPersistentLinkerState)
-mkStoreAccessor(LibHSghcInitLinkerDone)
-mkStoreAccessor(LibHSghcGlobalDynFlags)
-mkStoreAccessor(LibHSghcStaticOptions)
-mkStoreAccessor(LibHSghcStaticOptionsReady)
+StgStablePtr
+getOrSetGHCConcSignalSignalHandlerStore(StgStablePtr ptr)
+{
+ return getOrSetKey(GHCConcSignalSignalHandlerStore,ptr);
+}
+
+StgStablePtr
+getOrSetGHCConcWindowsPendingDelaysStore(StgStablePtr ptr)
+{
+ return getOrSetKey(GHCConcWindowsPendingDelaysStore,ptr);
+}
+
+StgStablePtr
+getOrSetGHCConcWindowsIOManagerThreadStore(StgStablePtr ptr)
+{
+ return getOrSetKey(GHCConcWindowsIOManagerThreadStore,ptr);
+}
+
+StgStablePtr
+getOrSetGHCConcWindowsProddingStore(StgStablePtr ptr)
+{
+ return getOrSetKey(GHCConcWindowsProddingStore,ptr);
+}
+
+StgStablePtr
+getOrSetSystemEventThreadEventManagerStore(StgStablePtr ptr)
+{
+ return getOrSetKey(SystemEventThreadEventManagerStore,ptr);
+}
+
+StgStablePtr
+getOrSetSystemEventThreadIOManagerThreadStore(StgStablePtr ptr)
+{
+ return getOrSetKey(SystemEventThreadIOManagerThreadStore,ptr);
+}
+
+StgStablePtr
+getOrSetSystemTimerThreadEventManagerStore(StgStablePtr ptr)
+{
+ return getOrSetKey(SystemTimerThreadEventManagerStore,ptr);
+}
+
+StgStablePtr
+getOrSetSystemTimerThreadIOManagerThreadStore(StgStablePtr ptr)
+{
+ return getOrSetKey(SystemTimerThreadIOManagerThreadStore,ptr);
+}
+
+StgStablePtr
+getOrSetLibHSghcFastStringTable(StgStablePtr ptr)
+{
+ return getOrSetKey(LibHSghcFastStringTable,ptr);
+}
diff --git a/testsuite/tests/plugins/LinkerTicklingPlugin.hs b/testsuite/tests/plugins/LinkerTicklingPlugin.hs
index 52d5e177bb..7ee63cd7a0 100644
--- a/testsuite/tests/plugins/LinkerTicklingPlugin.hs
+++ b/testsuite/tests/plugins/LinkerTicklingPlugin.hs
@@ -12,4 +12,6 @@ plugin = defaultPlugin {
-- or a new instance of it. If it is a new instance the staticFlags
-- won't have been initialised, so we'll get a GHC panic here:
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
-install _options todos = length staticFlags `seq` return todos
+install _options todos = reinitializeGlobals >> (length staticFlags `seq` return todos)
+ --- XXX: remove reinitializeGlobals when we have fixed the linker
+ -- problem (see comment with reinitializeGlobals in CoreMonad.hs)
diff --git a/testsuite/tests/plugins/annotation-plugin/SayAnnNames.hs b/testsuite/tests/plugins/annotation-plugin/SayAnnNames.hs
index 55e32e5b69..883ba3ada6 100644
--- a/testsuite/tests/plugins/annotation-plugin/SayAnnNames.hs
+++ b/testsuite/tests/plugins/annotation-plugin/SayAnnNames.hs
@@ -13,6 +13,7 @@ plugin = defaultPlugin {
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install _ todo = do
+ reinitializeGlobals
return (CoreDoPluginPass "Say name" pass : todo)
pass :: ModGuts -> CoreM ModGuts
diff --git a/testsuite/tests/simplCore/should_compile/T7702plugin/T7702Plugin.hs b/testsuite/tests/simplCore/should_compile/T7702plugin/T7702Plugin.hs
index e411d04e67..cb6a03d394 100644
--- a/testsuite/tests/simplCore/should_compile/T7702plugin/T7702Plugin.hs
+++ b/testsuite/tests/simplCore/should_compile/T7702plugin/T7702Plugin.hs
@@ -8,6 +8,7 @@ plugin = defaultPlugin { installCoreToDos = install }
where
install :: [CommandLineOption] -> [CoreToDo] -> CoreM [CoreToDo]
install _ todos = do
+ reinitializeGlobals
putMsgS "T7702Plugin"