Sophie

Sophie

distrib > Fedora > 14 > i386 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1677

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>simplCore/CoreMonad.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The AQUA Project, Glasgow University, 1993-1998
%
\section[CoreMonad]{The core pipeline monad}

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>{-# LANGUAGE UndecidableInstances #-}</span>
<a name="line-2"></a>
<a name="line-3"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>CoreMonad</span> <span class='hs-layout'>(</span>
<a name="line-4"></a>    <span class='hs-comment'>-- * The monad</span>
<a name="line-5"></a>    <span class='hs-conid'>CoreM</span><span class='hs-layout'>,</span> <span class='hs-varid'>runCoreM</span><span class='hs-layout'>,</span>
<a name="line-6"></a>    
<a name="line-7"></a>    <span class='hs-comment'>-- ** Reading from the monad</span>
<a name="line-8"></a>    <span class='hs-varid'>getHscEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>getAnnEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>getRuleBase</span><span class='hs-layout'>,</span> <span class='hs-varid'>getModule</span><span class='hs-layout'>,</span>
<a name="line-9"></a>    <span class='hs-varid'>getDynFlags</span><span class='hs-layout'>,</span> <span class='hs-varid'>getOrigNameCache</span><span class='hs-layout'>,</span>
<a name="line-10"></a>    
<a name="line-11"></a>    <span class='hs-comment'>-- ** Writing to the monad</span>
<a name="line-12"></a>    <span class='hs-varid'>addSimplCount</span><span class='hs-layout'>,</span>
<a name="line-13"></a>    
<a name="line-14"></a>    <span class='hs-comment'>-- ** Lifting into the monad</span>
<a name="line-15"></a>    <span class='hs-varid'>liftIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftIOWithCount</span><span class='hs-layout'>,</span>
<a name="line-16"></a>    <span class='hs-varid'>liftIO1</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftIO2</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftIO3</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftIO4</span><span class='hs-layout'>,</span>
<a name="line-17"></a>    
<a name="line-18"></a>    <span class='hs-comment'>-- ** Dealing with annotations</span>
<a name="line-19"></a>    <span class='hs-varid'>findAnnotations</span><span class='hs-layout'>,</span> <span class='hs-varid'>addAnnotation</span><span class='hs-layout'>,</span>
<a name="line-20"></a>    
<a name="line-21"></a>    <span class='hs-comment'>-- ** Screen output</span>
<a name="line-22"></a>    <span class='hs-varid'>putMsg</span><span class='hs-layout'>,</span> <span class='hs-varid'>putMsgS</span><span class='hs-layout'>,</span> <span class='hs-varid'>errorMsg</span><span class='hs-layout'>,</span> <span class='hs-varid'>errorMsgS</span><span class='hs-layout'>,</span> 
<a name="line-23"></a>    <span class='hs-varid'>fatalErrorMsg</span><span class='hs-layout'>,</span> <span class='hs-varid'>fatalErrorMsgS</span><span class='hs-layout'>,</span> 
<a name="line-24"></a>    <span class='hs-varid'>debugTraceMsg</span><span class='hs-layout'>,</span> <span class='hs-varid'>debugTraceMsgS</span><span class='hs-layout'>,</span>
<a name="line-25"></a>    <span class='hs-varid'>dumpIfSet_dyn</span><span class='hs-layout'>,</span>
<a name="line-26"></a>
<a name="line-27"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-28"></a>    <span class='hs-comment'>-- * Getting 'Name's</span>
<a name="line-29"></a>    <span class='hs-varid'>thNameToGhcName</span>
<a name="line-30"></a><span class='hs-cpp'>#endif</span>
<a name="line-31"></a>  <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-32"></a>
<a name="line-33"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-34"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span><span class='hs-layout'>(</span> <span class='hs-conid'>Name</span> <span class='hs-layout'>)</span>
<a name="line-35"></a><span class='hs-cpp'>#endif</span>
<a name="line-36"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>        <span class='hs-layout'>(</span> <span class='hs-varid'>iNTERACTIVE</span> <span class='hs-layout'>)</span>
<a name="line-37"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HscTypes</span>
<a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span>           <span class='hs-layout'>(</span> <span class='hs-conid'>Module</span> <span class='hs-layout'>)</span>
<a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DynFlags</span>         <span class='hs-layout'>(</span> <span class='hs-conid'>DynFlags</span><span class='hs-layout'>,</span> <span class='hs-conid'>DynFlag</span> <span class='hs-layout'>)</span>
<a name="line-40"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SimplMonad</span>       <span class='hs-layout'>(</span> <span class='hs-conid'>SimplCount</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusSimplCount</span><span class='hs-layout'>,</span> <span class='hs-varid'>zeroSimplCount</span> <span class='hs-layout'>)</span>
<a name="line-41"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Rules</span>            <span class='hs-layout'>(</span> <span class='hs-conid'>RuleBase</span> <span class='hs-layout'>)</span>
<a name="line-42"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Annotations</span>
<a name="line-43"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Serialized</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IOEnv</span> <span class='hs-varid'>hiding</span>     <span class='hs-layout'>(</span> <span class='hs-varid'>liftIO</span><span class='hs-layout'>,</span> <span class='hs-varid'>failM</span><span class='hs-layout'>,</span> <span class='hs-varid'>failWithM</span> <span class='hs-layout'>)</span>
<a name="line-46"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>IOEnv</span>  <span class='hs-layout'>(</span> <span class='hs-varid'>liftIO</span> <span class='hs-layout'>)</span>
<a name="line-47"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcEnv</span>            <span class='hs-layout'>(</span> <span class='hs-varid'>tcLookupGlobal</span> <span class='hs-layout'>)</span>
<a name="line-48"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TcRnMonad</span>        <span class='hs-layout'>(</span> <span class='hs-conid'>TcM</span><span class='hs-layout'>,</span> <span class='hs-varid'>initTc</span> <span class='hs-layout'>)</span>
<a name="line-49"></a>
<a name="line-50"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-51"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>ErrUtils</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Err</span>
<a name="line-52"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Maybes</span>
<a name="line-53"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSupply</span>
<a name="line-54"></a>
<a name="line-55"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Dynamic</span>
<a name="line-56"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>IORef</span>
<a name="line-57"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Word</span>
<a name="line-58"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Prelude</span> <span class='hs-varid'>hiding</span>   <span class='hs-layout'>(</span> <span class='hs-varid'>read</span> <span class='hs-layout'>)</span>
<a name="line-61"></a>
<a name="line-62"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-63"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span> <span class='hs-conid'>TcSplice</span> <span class='hs-layout'>(</span> <span class='hs-varid'>lookupThName_maybe</span> <span class='hs-layout'>)</span>
<a name="line-64"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Language</span><span class='hs-varop'>.</span><span class='hs-conid'>Haskell</span><span class='hs-varop'>.</span><span class='hs-conid'>TH</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>TH</span>
<a name="line-65"></a><span class='hs-cpp'>#endif</span>
</pre>\end{code}

\subsection{Monad and carried data structure definitions}

\begin{code}
<pre><a name="line-1"></a><a name="CoreState"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CoreState</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreState</span> <span class='hs-layout'>{</span>
<a name="line-2"></a>        <span class='hs-varid'>cs_uniq_supply</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UniqSupply</span><span class='hs-layout'>,</span>
<a name="line-3"></a>        <span class='hs-varid'>cs_ann_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AnnEnv</span>
<a name="line-4"></a><span class='hs-layout'>}</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="CoreReader"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CoreReader</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreReader</span> <span class='hs-layout'>{</span>
<a name="line-7"></a>        <span class='hs-varid'>cr_hsc_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span><span class='hs-layout'>,</span>
<a name="line-8"></a>        <span class='hs-varid'>cr_rule_base</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>RuleBase</span><span class='hs-layout'>,</span>
<a name="line-9"></a>        <span class='hs-varid'>cr_module</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span>
<a name="line-10"></a><span class='hs-layout'>}</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="CoreWriter"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CoreWriter</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreWriter</span> <span class='hs-layout'>{</span>
<a name="line-13"></a>        <span class='hs-varid'>cw_simpl_count</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SimplCount</span>
<a name="line-14"></a><span class='hs-layout'>}</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="emptyWriter"></a><span class='hs-definition'>emptyWriter</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlags</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreWriter</span>
<a name="line-17"></a><span class='hs-definition'>emptyWriter</span> <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreWriter</span> <span class='hs-layout'>{</span>
<a name="line-18"></a>        <span class='hs-varid'>cw_simpl_count</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>zeroSimplCount</span> <span class='hs-varid'>dflags</span>
<a name="line-19"></a>    <span class='hs-layout'>}</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="plusWriter"></a><span class='hs-definition'>plusWriter</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreWriter</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreWriter</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreWriter</span>
<a name="line-22"></a><span class='hs-definition'>plusWriter</span> <span class='hs-varid'>w1</span> <span class='hs-varid'>w2</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreWriter</span> <span class='hs-layout'>{</span>
<a name="line-23"></a>        <span class='hs-varid'>cw_simpl_count</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>cw_simpl_count</span> <span class='hs-varid'>w1</span><span class='hs-layout'>)</span> <span class='hs-varop'>`plusSimplCount`</span> <span class='hs-layout'>(</span><span class='hs-varid'>cw_simpl_count</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span>
<a name="line-24"></a>    <span class='hs-layout'>}</span>
<a name="line-25"></a>
<a name="line-26"></a><a name="CoreIOEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>CoreIOEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IOEnv</span> <span class='hs-conid'>CoreReader</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="CoreM"></a><span class='hs-comment'>-- | The monad used by Core-to-Core passes to access common state, register simplification</span>
<a name="line-29"></a><a name="CoreM"></a><span class='hs-comment'>-- statistics and so on</span>
<a name="line-30"></a><a name="CoreM"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>CoreM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unCoreM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreIOEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreState</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreWriter</span><span class='hs-layout'>)</span> <span class='hs-layout'>}</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyword'>where</span>
<a name="line-33"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>ma</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-34"></a>        <span class='hs-varid'>a</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ma</span>
<a name="line-35"></a>        <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span>
<a name="line-36"></a>
<a name="line-37"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyword'>where</span>
<a name="line-38"></a>    <span class='hs-varid'>return</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>nop</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-39"></a>    <span class='hs-varid'>mx</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-40"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>s'</span><span class='hs-layout'>,</span> <span class='hs-varid'>w1</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unCoreM</span> <span class='hs-varid'>mx</span> <span class='hs-varid'>s</span>
<a name="line-41"></a>            <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>s''</span><span class='hs-layout'>,</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unCoreM</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-varid'>s'</span>
<a name="line-42"></a>            <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>y</span><span class='hs-layout'>,</span> <span class='hs-varid'>s''</span><span class='hs-layout'>,</span> <span class='hs-varid'>w1</span> <span class='hs-varop'>`plusWriter`</span> <span class='hs-varid'>w2</span><span class='hs-layout'>)</span>
<a name="line-43"></a>
<a name="line-44"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Applicative</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyword'>where</span>
<a name="line-45"></a>    <span class='hs-varid'>pure</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span>
<a name="line-46"></a>    <span class='hs-layout'>(</span><span class='hs-varop'>&lt;*&gt;</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ap</span>
<a name="line-47"></a>
<a name="line-48"></a><span class='hs-comment'>-- For use if the user has imported Control.Monad.Error from MTL</span>
<a name="line-49"></a><span class='hs-comment'>-- Requires UndecidableInstances</span>
<a name="line-50"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadPlus</span> <span class='hs-conid'>IO</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadPlus</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyword'>where</span>
<a name="line-51"></a>    <span class='hs-varid'>mzero</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-varid'>const</span> <span class='hs-varid'>mzero</span><span class='hs-layout'>)</span>
<a name="line-52"></a>    <span class='hs-varid'>m</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>rs</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unCoreM</span> <span class='hs-varid'>m</span> <span class='hs-varid'>rs</span> <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>unCoreM</span> <span class='hs-varid'>n</span> <span class='hs-varid'>rs</span><span class='hs-layout'>)</span>
<a name="line-53"></a>
<a name="line-54"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadUnique</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyword'>where</span>
<a name="line-55"></a>    <span class='hs-varid'>getUniqueSupplyM</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-56"></a>        <span class='hs-varid'>us</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getS</span> <span class='hs-varid'>cs_uniq_supply</span>
<a name="line-57"></a>        <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>us1</span><span class='hs-layout'>,</span> <span class='hs-varid'>us2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>splitUniqSupply</span> <span class='hs-varid'>us</span>
<a name="line-58"></a>        <span class='hs-varid'>modifyS</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>s</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cs_uniq_supply</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>us2</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-59"></a>        <span class='hs-varid'>return</span> <span class='hs-varid'>us1</span>
<a name="line-60"></a>
<a name="line-61"></a><a name="runCoreM"></a><span class='hs-definition'>runCoreM</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span>
<a name="line-62"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>AnnEnv</span>
<a name="line-63"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>RuleBase</span>
<a name="line-64"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>UniqSupply</span>
<a name="line-65"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Module</span>
<a name="line-66"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-varid'>a</span>
<a name="line-67"></a>         <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>SimplCount</span><span class='hs-layout'>)</span>
<a name="line-68"></a><span class='hs-definition'>runCoreM</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>ann_env</span> <span class='hs-varid'>rule_base</span> <span class='hs-varid'>us</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span>
<a name="line-69"></a>        <span class='hs-varid'>liftM</span> <span class='hs-varid'>extract</span> <span class='hs-varop'>$</span> <span class='hs-varid'>runIOEnv</span> <span class='hs-varid'>reader</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unCoreM</span> <span class='hs-varid'>m</span> <span class='hs-varid'>state</span>
<a name="line-70"></a>  <span class='hs-keyword'>where</span>
<a name="line-71"></a>    <span class='hs-varid'>reader</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreReader</span> <span class='hs-layout'>{</span>
<a name="line-72"></a>            <span class='hs-varid'>cr_hsc_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsc_env</span><span class='hs-layout'>,</span>
<a name="line-73"></a>            <span class='hs-varid'>cr_rule_base</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>rule_base</span><span class='hs-layout'>,</span>
<a name="line-74"></a>            <span class='hs-varid'>cr_module</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mod</span>
<a name="line-75"></a>        <span class='hs-layout'>}</span>
<a name="line-76"></a>    <span class='hs-varid'>state</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreState</span> <span class='hs-layout'>{</span> 
<a name="line-77"></a>            <span class='hs-varid'>cs_uniq_supply</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>us</span><span class='hs-layout'>,</span>
<a name="line-78"></a>            <span class='hs-varid'>cs_ann_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ann_env</span>
<a name="line-79"></a>        <span class='hs-layout'>}</span>
<a name="line-80"></a>
<a name="line-81"></a>    <span class='hs-varid'>extract</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreState</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreWriter</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>SimplCount</span><span class='hs-layout'>)</span>
<a name="line-82"></a>    <span class='hs-varid'>extract</span> <span class='hs-layout'>(</span><span class='hs-varid'>value</span><span class='hs-layout'>,</span> <span class='hs-keyword'>_</span><span class='hs-layout'>,</span> <span class='hs-varid'>writer</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>value</span><span class='hs-layout'>,</span> <span class='hs-varid'>cw_simpl_count</span> <span class='hs-varid'>writer</span><span class='hs-layout'>)</span>
<a name="line-83"></a>
</pre>\end{code}

\subsection{Core combinators, not exported}

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="nop"></a><span class='hs-definition'>nop</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreIOEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreState</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreWriter</span><span class='hs-layout'>)</span>
<a name="line-3"></a><span class='hs-definition'>nop</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-4"></a>    <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getEnv</span>
<a name="line-5"></a>    <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>x</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyWriter</span> <span class='hs-varop'>$</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_dflags</span> <span class='hs-varop'>.</span> <span class='hs-varid'>cr_hsc_env</span><span class='hs-layout'>)</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="read"></a><span class='hs-definition'>read</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoreReader</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-varid'>a</span>
<a name="line-8"></a><span class='hs-definition'>read</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>getEnv</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>r</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>nop</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="getS"></a><span class='hs-definition'>getS</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoreState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-varid'>a</span>
<a name="line-11"></a><span class='hs-definition'>getS</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>nop</span> <span class='hs-varid'>s</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="modifyS"></a><span class='hs-definition'>modifyS</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoreState</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreState</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-14"></a><span class='hs-definition'>modifyS</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>nop</span> <span class='hs-layout'>(</span><span class='hs-varid'>f</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="write"></a><span class='hs-definition'>write</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreWriter</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-17"></a><span class='hs-definition'>write</span> <span class='hs-varid'>w</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-conid'>()</span><span class='hs-layout'>,</span> <span class='hs-varid'>s</span><span class='hs-layout'>,</span> <span class='hs-varid'>w</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-18"></a>
</pre>\end{code}

\subsection{Lifting IO into the monad}

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="liftIOEnv"></a><span class='hs-comment'>-- | Lift an 'IOEnv' operation into 'CoreM'</span>
<a name="line-3"></a><span class='hs-definition'>liftIOEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreIOEnv</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-varid'>a</span>
<a name="line-4"></a><span class='hs-definition'>liftIOEnv</span> <span class='hs-varid'>mx</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>mx</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>x</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>nop</span> <span class='hs-varid'>s</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-5"></a>
<a name="line-6"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyword'>where</span>
<a name="line-7"></a>    <span class='hs-varid'>liftIO</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIOEnv</span> <span class='hs-varop'>.</span> <span class='hs-conid'>IOEnv</span><span class='hs-varop'>.</span><span class='hs-varid'>liftIO</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="liftIOWithCount"></a><span class='hs-comment'>-- | Lift an 'IO' operation into 'CoreM' while consuming its 'SimplCount'</span>
<a name="line-10"></a><span class='hs-definition'>liftIOWithCount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>SimplCount</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-varid'>a</span>
<a name="line-11"></a><span class='hs-definition'>liftIOWithCount</span> <span class='hs-varid'>what</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>what</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>count</span><span class='hs-layout'>,</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>addSimplCount</span> <span class='hs-varid'>count</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
</pre>\end{code}

\subsection{Reader, writer and state accessors}

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="getHscEnv"></a><span class='hs-definition'>getHscEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>HscEnv</span>
<a name="line-3"></a><span class='hs-definition'>getHscEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>read</span> <span class='hs-varid'>cr_hsc_env</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="getAnnEnv"></a><span class='hs-definition'>getAnnEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>AnnEnv</span>
<a name="line-6"></a><span class='hs-definition'>getAnnEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getS</span> <span class='hs-varid'>cs_ann_env</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="getRuleBase"></a><span class='hs-definition'>getRuleBase</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>RuleBase</span>
<a name="line-9"></a><span class='hs-definition'>getRuleBase</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>read</span> <span class='hs-varid'>cr_rule_base</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="getModule"></a><span class='hs-definition'>getModule</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>Module</span>
<a name="line-12"></a><span class='hs-definition'>getModule</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>read</span> <span class='hs-varid'>cr_module</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="addSimplCount"></a><span class='hs-definition'>addSimplCount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SimplCount</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-15"></a><span class='hs-definition'>addSimplCount</span> <span class='hs-varid'>count</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>write</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoreWriter</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cw_simpl_count</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>count</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-16"></a>
<a name="line-17"></a><span class='hs-comment'>-- Convenience accessors for useful fields of HscEnv</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="getDynFlags"></a><span class='hs-definition'>getDynFlags</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>DynFlags</span>
<a name="line-20"></a><span class='hs-definition'>getDynFlags</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>hsc_dflags</span> <span class='hs-varid'>getHscEnv</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="getOrigNameCache"></a><span class='hs-comment'>-- | The original name cache is the current mapping from 'Module' and</span>
<a name="line-23"></a><span class='hs-comment'>-- 'OccName' to a compiler-wide unique 'Name'</span>
<a name="line-24"></a><span class='hs-definition'>getOrigNameCache</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>OrigNameCache</span>
<a name="line-25"></a><span class='hs-definition'>getOrigNameCache</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-26"></a>    <span class='hs-varid'>nameCacheRef</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>hsc_NC</span> <span class='hs-varid'>getHscEnv</span>
<a name="line-27"></a>    <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fmap</span> <span class='hs-varid'>nsNames</span> <span class='hs-varop'>$</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>nameCacheRef</span>
<a name="line-28"></a>
</pre>\end{code}

\subsection{Dealing with annotations}

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="findAnnotations"></a><span class='hs-comment'>-- | Find all the annotations we currently know about for the given target. Note that no</span>
<a name="line-3"></a><span class='hs-comment'>-- annotations will be returned if we haven't loaded information about the particular target</span>
<a name="line-4"></a><span class='hs-comment'>-- you are inquiring about: by default, only those modules that have been imported by the</span>
<a name="line-5"></a><span class='hs-comment'>-- program being compiled will have been loaded in this way.</span>
<a name="line-6"></a><span class='hs-comment'>--</span>
<a name="line-7"></a><span class='hs-comment'>-- To load the information from additional modules, you can use the functions 'DynamicLoading.forceLoadModuleInterfaces'</span>
<a name="line-8"></a><span class='hs-comment'>-- and 'DynamicLoading.forceLoadNameModuleInterface', but be aware that doing this indiscriminantly</span>
<a name="line-9"></a><span class='hs-comment'>-- will impose a performance penalty.</span>
<a name="line-10"></a><span class='hs-comment'>--</span>
<a name="line-11"></a><span class='hs-comment'>-- If no deserialization function is supplied, only transient annotations will be returned.</span>
<a name="line-12"></a><span class='hs-definition'>findAnnotations</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Typeable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Word8</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreAnnTarget</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-13"></a><span class='hs-definition'>findAnnotations</span> <span class='hs-varid'>deserialize</span> <span class='hs-varid'>target</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-14"></a>     <span class='hs-varid'>ann_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getAnnEnv</span>
<a name="line-15"></a>     <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>findAnns</span> <span class='hs-varid'>deserialize</span> <span class='hs-varid'>ann_env</span> <span class='hs-varid'>target</span><span class='hs-layout'>)</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="addAnnotation"></a><span class='hs-definition'>addAnnotation</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Typeable</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Word8</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreAnnTarget</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-18"></a><span class='hs-definition'>addAnnotation</span> <span class='hs-varid'>serialize</span> <span class='hs-varid'>target</span> <span class='hs-varid'>what</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addAnnotationToEnv</span> <span class='hs-varop'>$</span> <span class='hs-conid'>Annotation</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ann_target</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>target</span><span class='hs-layout'>,</span> <span class='hs-varid'>ann_value</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>toSerialized</span> <span class='hs-varid'>serialize</span> <span class='hs-varid'>what</span> <span class='hs-layout'>}</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="addAnnotationToEnv"></a><span class='hs-definition'>addAnnotationToEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Annotation</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-21"></a><span class='hs-definition'>addAnnotationToEnv</span> <span class='hs-varid'>annotation</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>modifyS</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>state</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>state</span> <span class='hs-layout'>{</span> <span class='hs-varid'>cs_ann_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendAnnEnvList</span> <span class='hs-layout'>(</span><span class='hs-varid'>cs_ann_env</span> <span class='hs-varid'>state</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>annotation</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-22"></a>
</pre>\end{code}

\subsection{Direct screen output}

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="msg"></a><span class='hs-definition'>msg</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>DynFlags</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>()</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-3"></a><span class='hs-definition'>msg</span> <span class='hs-varid'>how</span> <span class='hs-varid'>doc</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-4"></a>        <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getDynFlags</span>
<a name="line-5"></a>        <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>how</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>doc</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="putMsgS"></a><span class='hs-comment'>-- | Output a String message to the screen</span>
<a name="line-8"></a><span class='hs-definition'>putMsgS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-9"></a><span class='hs-definition'>putMsgS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>putMsg</span> <span class='hs-varop'>.</span> <span class='hs-varid'>text</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="putMsg"></a><span class='hs-comment'>-- | Output a message to the screen</span>
<a name="line-12"></a><span class='hs-definition'>putMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-13"></a><span class='hs-definition'>putMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>msg</span> <span class='hs-conid'>Err</span><span class='hs-varop'>.</span><span class='hs-varid'>putMsg</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="errorMsgS"></a><span class='hs-comment'>-- | Output a string error to the screen</span>
<a name="line-16"></a><span class='hs-definition'>errorMsgS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-17"></a><span class='hs-definition'>errorMsgS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>errorMsg</span> <span class='hs-varop'>.</span> <span class='hs-varid'>text</span>
<a name="line-18"></a>
<a name="line-19"></a><a name="errorMsg"></a><span class='hs-comment'>-- | Output an error to the screen</span>
<a name="line-20"></a><span class='hs-definition'>errorMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-21"></a><span class='hs-definition'>errorMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>msg</span> <span class='hs-conid'>Err</span><span class='hs-varop'>.</span><span class='hs-varid'>errorMsg</span>
<a name="line-22"></a>
<a name="line-23"></a><a name="fatalErrorMsgS"></a><span class='hs-comment'>-- | Output a fatal string error to the screen. Note this does not by itself cause the compiler to die</span>
<a name="line-24"></a><span class='hs-definition'>fatalErrorMsgS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-25"></a><span class='hs-definition'>fatalErrorMsgS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fatalErrorMsg</span> <span class='hs-varop'>.</span> <span class='hs-varid'>text</span>
<a name="line-26"></a>
<a name="line-27"></a><a name="fatalErrorMsg"></a><span class='hs-comment'>-- | Output a fatal error to the screen. Note this does not by itself cause the compiler to die</span>
<a name="line-28"></a><span class='hs-definition'>fatalErrorMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-29"></a><span class='hs-definition'>fatalErrorMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>msg</span> <span class='hs-conid'>Err</span><span class='hs-varop'>.</span><span class='hs-varid'>fatalErrorMsg</span>
<a name="line-30"></a>
<a name="line-31"></a><a name="debugTraceMsgS"></a><span class='hs-comment'>-- | Output a string debugging message at verbosity level of @-v@ or higher</span>
<a name="line-32"></a><span class='hs-definition'>debugTraceMsgS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-33"></a><span class='hs-definition'>debugTraceMsgS</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>debugTraceMsg</span> <span class='hs-varop'>.</span> <span class='hs-varid'>text</span>
<a name="line-34"></a>
<a name="line-35"></a><a name="debugTraceMsg"></a><span class='hs-comment'>-- | Outputs a debugging message at verbosity level of @-v@ or higher</span>
<a name="line-36"></a><span class='hs-definition'>debugTraceMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-37"></a><span class='hs-definition'>debugTraceMsg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>msg</span> <span class='hs-layout'>(</span><span class='hs-varid'>flip</span> <span class='hs-conid'>Err</span><span class='hs-varop'>.</span><span class='hs-varid'>debugTraceMsg</span> <span class='hs-num'>3</span><span class='hs-layout'>)</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="dumpIfSet_dyn"></a><span class='hs-comment'>-- | Show some labelled 'SDoc' if a particular flag is set or at a verbosity level of @-v -ddump-most@ or higher</span>
<a name="line-40"></a><span class='hs-definition'>dumpIfSet_dyn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlag</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-conid'>()</span>
<a name="line-41"></a><span class='hs-definition'>dumpIfSet_dyn</span> <span class='hs-varid'>flag</span> <span class='hs-varid'>str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>msg</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Err</span><span class='hs-varop'>.</span><span class='hs-varid'>dumpIfSet_dyn</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>flag</span> <span class='hs-varid'>str</span><span class='hs-layout'>)</span>
<a name="line-42"></a>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><a name="initTcForLookup"></a><span class='hs-definition'>initTcForLookup</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TcM</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-3"></a><span class='hs-definition'>initTcForLookup</span> <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-layout'>(</span><span class='hs-varid'>expectJust</span> <span class='hs-str'>"initTcInteractive"</span> <span class='hs-varop'>.</span> <span class='hs-varid'>snd</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>initTc</span> <span class='hs-varid'>hsc_env</span> <span class='hs-conid'>HsSrcFile</span> <span class='hs-conid'>False</span> <span class='hs-varid'>iNTERACTIVE</span>
<a name="line-4"></a>
</pre>\end{code}

\subsection{Finding TyThings}

\begin{code}
<pre><a name="line-1"></a>
<a name="line-2"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadThings</span> <span class='hs-conid'>CoreM</span> <span class='hs-keyword'>where</span>
<a name="line-3"></a>    <span class='hs-varid'>lookupThing</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-4"></a>        <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getHscEnv</span>
<a name="line-5"></a>        <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>initTcForLookup</span> <span class='hs-varid'>hsc_env</span> <span class='hs-layout'>(</span><span class='hs-varid'>tcLookupGlobal</span> <span class='hs-varid'>name</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
</pre>\end{code}

\subsection{Template Haskell interoperability}

\begin{code}
<pre><a name="line-1"></a><span class='hs-cpp'>#</span><span class='hs-varid'>ifdef</span> <span class='hs-conid'>GHCI</span>
<a name="line-2"></a><a name="thNameToGhcName"></a><span class='hs-comment'>-- | Attempt to convert a Template Haskell name to one that GHC can</span>
<a name="line-3"></a><span class='hs-comment'>-- understand. Original TH names such as those you get when you use</span>
<a name="line-4"></a><span class='hs-comment'>-- the @'foo@ syntax will be translated to their equivalent GHC name</span>
<a name="line-5"></a><span class='hs-comment'>-- exactly. Qualified or unqualifed TH names will be dynamically bound</span>
<a name="line-6"></a><span class='hs-comment'>-- to names in the module being compiled, if possible. Exact TH names</span>
<a name="line-7"></a><span class='hs-comment'>-- will be bound to the name they represent, exactly.</span>
<a name="line-8"></a><span class='hs-definition'>thNameToGhcName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TH</span><span class='hs-varop'>.</span><span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CoreM</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-9"></a><span class='hs-definition'>thNameToGhcName</span> <span class='hs-varid'>th_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-10"></a>    <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getHscEnv</span>
<a name="line-11"></a>    <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>initTcForLookup</span> <span class='hs-varid'>hsc_env</span> <span class='hs-layout'>(</span><span class='hs-varid'>lookupThName_maybe</span> <span class='hs-varid'>th_name</span><span class='hs-layout'>)</span>
<a name="line-12"></a><span class='hs-cpp'>#endif</span>
</pre>\end{code}
</body>
</html>