<?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>main/DriverPhases.hs</title> <link type='text/css' rel='stylesheet' href='hscolour.css' /> </head> <body> <pre><a name="line-1"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span> <a name="line-2"></a><span class='hs-comment'>-- $Id: DriverPhases.hs,v 1.38 2005/05/17 11:01:59 simonmar Exp $</span> <a name="line-3"></a><span class='hs-comment'>--</span> <a name="line-4"></a><span class='hs-comment'>-- GHC Driver</span> <a name="line-5"></a><span class='hs-comment'>--</span> <a name="line-6"></a><span class='hs-comment'>-- (c) The University of Glasgow 2002</span> <a name="line-7"></a><span class='hs-comment'>--</span> <a name="line-8"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span> <a name="line-9"></a> <a name="line-10"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>DriverPhases</span> <span class='hs-layout'>(</span> <a name="line-11"></a> <span class='hs-conid'>HscSource</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHsBoot</span><span class='hs-layout'>,</span> <span class='hs-varid'>hscSourceString</span><span class='hs-layout'>,</span> <a name="line-12"></a> <span class='hs-conid'>Phase</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <a name="line-13"></a> <span class='hs-varid'>happensBefore</span><span class='hs-layout'>,</span> <span class='hs-varid'>eqPhase</span><span class='hs-layout'>,</span> <span class='hs-varid'>anyHsc</span><span class='hs-layout'>,</span> <span class='hs-varid'>isStopLn</span><span class='hs-layout'>,</span> <a name="line-14"></a> <span class='hs-varid'>startPhase</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- :: String -> Phase</span> <a name="line-15"></a> <span class='hs-varid'>phaseInputExt</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- :: Phase -> String</span> <a name="line-16"></a> <a name="line-17"></a> <span class='hs-varid'>isHaskellishSuffix</span><span class='hs-layout'>,</span> <a name="line-18"></a> <span class='hs-varid'>isHaskellSrcSuffix</span><span class='hs-layout'>,</span> <a name="line-19"></a> <span class='hs-varid'>isObjectSuffix</span><span class='hs-layout'>,</span> <a name="line-20"></a> <span class='hs-varid'>isCishSuffix</span><span class='hs-layout'>,</span> <a name="line-21"></a> <span class='hs-varid'>isExtCoreSuffix</span><span class='hs-layout'>,</span> <a name="line-22"></a> <span class='hs-varid'>isDynLibSuffix</span><span class='hs-layout'>,</span> <a name="line-23"></a> <span class='hs-varid'>isHaskellUserSrcSuffix</span><span class='hs-layout'>,</span> <a name="line-24"></a> <span class='hs-varid'>isSourceSuffix</span><span class='hs-layout'>,</span> <a name="line-25"></a> <a name="line-26"></a> <span class='hs-varid'>isHaskellishFilename</span><span class='hs-layout'>,</span> <a name="line-27"></a> <span class='hs-varid'>isHaskellSrcFilename</span><span class='hs-layout'>,</span> <a name="line-28"></a> <span class='hs-varid'>isObjectFilename</span><span class='hs-layout'>,</span> <a name="line-29"></a> <span class='hs-varid'>isCishFilename</span><span class='hs-layout'>,</span> <a name="line-30"></a> <span class='hs-varid'>isExtCoreFilename</span><span class='hs-layout'>,</span> <a name="line-31"></a> <span class='hs-varid'>isDynLibFilename</span><span class='hs-layout'>,</span> <a name="line-32"></a> <span class='hs-varid'>isHaskellUserSrcFilename</span><span class='hs-layout'>,</span> <a name="line-33"></a> <span class='hs-varid'>isSourceFilename</span> <span class='hs-comment'>-- :: FilePath -> Bool</span> <a name="line-34"></a> <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span> <a name="line-35"></a> <a name="line-36"></a><span class='hs-cpp'>#include "HsVersions.h"</span> <a name="line-37"></a> <a name="line-38"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Panic</span> <span class='hs-layout'>(</span> <span class='hs-varid'>panic</span> <span class='hs-layout'>)</span> <a name="line-39"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>FilePath</span> <a name="line-40"></a> <a name="line-41"></a><span class='hs-comment'>-----------------------------------------------------------------------------</span> <a name="line-42"></a><span class='hs-comment'>-- Phases</span> <a name="line-43"></a> <a name="line-44"></a><span class='hs-comment'>{- <a name="line-45"></a> Phase of the | Suffix saying | Flag saying | (suffix of) <a name="line-46"></a> compilation system | ``start here''| ``stop after''| output file <a name="line-47"></a> <a name="line-48"></a> literate pre-processor | .lhs | - | - <a name="line-49"></a> C pre-processor (opt.) | - | -E | - <a name="line-50"></a> Haskell compiler | .hs | -C, -S | .hc, .s <a name="line-51"></a> C compiler (opt.) | .hc or .c | -S | .s <a name="line-52"></a> assembler | .s or .S | -c | .o <a name="line-53"></a> linker | other | - | a.out <a name="line-54"></a>-}</span> <a name="line-55"></a> <a name="line-56"></a><a name="HscSource"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HscSource</span> <a name="line-57"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsSrcFile</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HsBootFile</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ExtCoreFile</span> <a name="line-58"></a> <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Ord</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span> <span class='hs-layout'>)</span> <a name="line-59"></a> <span class='hs-comment'>-- Ord needed for the finite maps we build in CompManager</span> <a name="line-60"></a> <a name="line-61"></a> <a name="line-62"></a><a name="hscSourceString"></a><span class='hs-definition'>hscSourceString</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscSource</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-63"></a><span class='hs-definition'>hscSourceString</span> <span class='hs-conid'>HsSrcFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>""</span> <a name="line-64"></a><span class='hs-definition'>hscSourceString</span> <span class='hs-conid'>HsBootFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"[boot]"</span> <a name="line-65"></a><span class='hs-definition'>hscSourceString</span> <span class='hs-conid'>ExtCoreFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"[ext core]"</span> <a name="line-66"></a> <a name="line-67"></a><a name="isHsBoot"></a><span class='hs-definition'>isHsBoot</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscSource</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-68"></a><span class='hs-definition'>isHsBoot</span> <span class='hs-conid'>HsBootFile</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-69"></a><span class='hs-definition'>isHsBoot</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-70"></a> <a name="line-71"></a><a name="Phase"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Phase</span> <a name="line-72"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Unlit</span> <span class='hs-conid'>HscSource</span> <a name="line-73"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Cpp</span> <span class='hs-conid'>HscSource</span> <a name="line-74"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HsPp</span> <span class='hs-conid'>HscSource</span> <a name="line-75"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Hsc</span> <span class='hs-conid'>HscSource</span> <a name="line-76"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Ccpp</span> <a name="line-77"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Cc</span> <a name="line-78"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>HCc</span> <span class='hs-comment'>-- Haskellised C (as opposed to vanilla C) compilation</span> <a name="line-79"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Mangle</span> <span class='hs-comment'>-- assembly mangling, now done by a separate script.</span> <a name="line-80"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SplitMangle</span> <span class='hs-comment'>-- after mangler if splitting</span> <a name="line-81"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>SplitAs</span> <a name="line-82"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>As</span> <a name="line-83"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>CmmCpp</span> <span class='hs-comment'>-- pre-process Cmm source</span> <a name="line-84"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Cmm</span> <span class='hs-comment'>-- parse & compile Cmm code</span> <a name="line-85"></a> <a name="line-86"></a> <span class='hs-comment'>-- The final phase is a pseudo-phase that tells the pipeline to stop.</span> <a name="line-87"></a> <span class='hs-comment'>-- There is no runPhase case for it.</span> <a name="line-88"></a> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>StopLn</span> <span class='hs-comment'>-- Stop, but linking will follow, so generate .o file</span> <a name="line-89"></a> <span class='hs-keyword'>deriving</span> <span class='hs-layout'>(</span><span class='hs-conid'>Eq</span><span class='hs-layout'>,</span> <span class='hs-conid'>Show</span><span class='hs-layout'>)</span> <a name="line-90"></a> <a name="line-91"></a><a name="anyHsc"></a><span class='hs-definition'>anyHsc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Phase</span> <a name="line-92"></a><span class='hs-definition'>anyHsc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Hsc</span> <span class='hs-layout'>(</span><span class='hs-varid'>panic</span> <span class='hs-str'>"anyHsc"</span><span class='hs-layout'>)</span> <a name="line-93"></a> <a name="line-94"></a><a name="isStopLn"></a><span class='hs-definition'>isStopLn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Phase</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-95"></a><span class='hs-definition'>isStopLn</span> <span class='hs-conid'>StopLn</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-96"></a><span class='hs-definition'>isStopLn</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-97"></a> <a name="line-98"></a><a name="eqPhase"></a><span class='hs-definition'>eqPhase</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Phase</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Phase</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-99"></a><span class='hs-comment'>-- Equality of constructors, ignoring the HscSource field</span> <a name="line-100"></a><span class='hs-comment'>-- NB: the HscSource field can be 'bot'; see anyHsc above</span> <a name="line-101"></a><span class='hs-definition'>eqPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>Unlit</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Unlit</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-102"></a><span class='hs-definition'>eqPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cpp</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cpp</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-103"></a><span class='hs-definition'>eqPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPp</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPp</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-104"></a><span class='hs-definition'>eqPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hsc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hsc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-105"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>Ccpp</span> <span class='hs-conid'>Ccpp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-106"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>Cc</span> <span class='hs-conid'>Cc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-107"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>HCc</span> <span class='hs-conid'>HCc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-108"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>Mangle</span> <span class='hs-conid'>Mangle</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-109"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>SplitMangle</span> <span class='hs-conid'>SplitMangle</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-110"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>SplitAs</span> <span class='hs-conid'>SplitAs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-111"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>As</span> <span class='hs-conid'>As</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-112"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>CmmCpp</span> <span class='hs-conid'>CmmCpp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-113"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>Cmm</span> <span class='hs-conid'>Cmm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-114"></a><span class='hs-definition'>eqPhase</span> <span class='hs-conid'>StopLn</span> <span class='hs-conid'>StopLn</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span> <a name="line-115"></a><span class='hs-definition'>eqPhase</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-116"></a> <a name="line-117"></a><a name="happensBefore"></a><span class='hs-comment'>-- Partial ordering on phases: we want to know which phases will occur before </span> <a name="line-118"></a><span class='hs-comment'>-- which others. This is used for sanity checking, to ensure that the</span> <a name="line-119"></a><span class='hs-comment'>-- pipeline will stop at some point (see DriverPipeline.runPipeline).</span> <a name="line-120"></a><span class='hs-definition'>happensBefore</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Phase</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Phase</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-121"></a><span class='hs-conid'>StopLn</span> <span class='hs-varop'>`happensBefore`</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span> <a name="line-122"></a><a name="happensBefore"></a><span class='hs-definition'>x</span> <span class='hs-varop'>`happensBefore`</span> <span class='hs-varid'>y</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>after_x</span> <span class='hs-varop'>`eqPhase`</span> <span class='hs-varid'>y</span> <span class='hs-varop'>||</span> <span class='hs-varid'>after_x</span> <span class='hs-varop'>`happensBefore`</span> <span class='hs-varid'>y</span> <a name="line-123"></a> <span class='hs-keyword'>where</span> <a name="line-124"></a> <span class='hs-varid'>after_x</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nextPhase</span> <span class='hs-varid'>x</span> <a name="line-125"></a> <a name="line-126"></a><a name="nextPhase"></a><span class='hs-definition'>nextPhase</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Phase</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Phase</span> <a name="line-127"></a><span class='hs-comment'>-- A conservative approximation the next phase, used in happensBefore</span> <a name="line-128"></a><span class='hs-definition'>nextPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>Unlit</span> <span class='hs-varid'>sf</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cpp</span> <span class='hs-varid'>sf</span> <a name="line-129"></a><span class='hs-definition'>nextPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cpp</span> <span class='hs-varid'>sf</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsPp</span> <span class='hs-varid'>sf</span> <a name="line-130"></a><span class='hs-definition'>nextPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPp</span> <span class='hs-varid'>sf</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Hsc</span> <span class='hs-varid'>sf</span> <a name="line-131"></a><span class='hs-definition'>nextPhase</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hsc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HCc</span> <a name="line-132"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>HCc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Mangle</span> <a name="line-133"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>Mangle</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SplitMangle</span> <a name="line-134"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>SplitMangle</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>As</span> <a name="line-135"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>As</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SplitAs</span> <a name="line-136"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>SplitAs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>StopLn</span> <a name="line-137"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>Ccpp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>As</span> <a name="line-138"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>Cc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>As</span> <a name="line-139"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>CmmCpp</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cmm</span> <a name="line-140"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>Cmm</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HCc</span> <a name="line-141"></a><span class='hs-definition'>nextPhase</span> <span class='hs-conid'>StopLn</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"nextPhase: nothing after StopLn"</span> <a name="line-142"></a> <a name="line-143"></a><a name="startPhase"></a><span class='hs-comment'>-- the first compilation phase for a given file is determined</span> <a name="line-144"></a><span class='hs-comment'>-- by its suffix.</span> <a name="line-145"></a><span class='hs-definition'>startPhase</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Phase</span> <a name="line-146"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"lhs"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Unlit</span> <span class='hs-conid'>HsSrcFile</span> <a name="line-147"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"lhs-boot"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Unlit</span> <span class='hs-conid'>HsBootFile</span> <a name="line-148"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"hs"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cpp</span> <span class='hs-conid'>HsSrcFile</span> <a name="line-149"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"hs-boot"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cpp</span> <span class='hs-conid'>HsBootFile</span> <a name="line-150"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"hscpp"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HsPp</span> <span class='hs-conid'>HsSrcFile</span> <a name="line-151"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"hspp"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Hsc</span> <span class='hs-conid'>HsSrcFile</span> <a name="line-152"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"hcr"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Hsc</span> <span class='hs-conid'>ExtCoreFile</span> <a name="line-153"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"hc"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HCc</span> <a name="line-154"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"c"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cc</span> <a name="line-155"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"cpp"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ccpp</span> <a name="line-156"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"C"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cc</span> <a name="line-157"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"cc"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ccpp</span> <a name="line-158"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"cxx"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ccpp</span> <a name="line-159"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"raw_s"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Mangle</span> <a name="line-160"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"split_s"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SplitMangle</span> <a name="line-161"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"s"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>As</span> <a name="line-162"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"S"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>As</span> <a name="line-163"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"o"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>StopLn</span> <a name="line-164"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"cmm"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CmmCpp</span> <a name="line-165"></a><span class='hs-definition'>startPhase</span> <span class='hs-str'>"cmmcpp"</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Cmm</span> <a name="line-166"></a><span class='hs-definition'>startPhase</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>StopLn</span> <span class='hs-comment'>-- all unknown file types</span> <a name="line-167"></a> <a name="line-168"></a><a name="phaseInputExt"></a><span class='hs-comment'>-- This is used to determine the extension for the output from the</span> <a name="line-169"></a><span class='hs-comment'>-- current phase (if it generates a new file). The extension depends</span> <a name="line-170"></a><span class='hs-comment'>-- on the next phase in the pipeline.</span> <a name="line-171"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Phase</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>String</span> <a name="line-172"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Unlit</span> <span class='hs-conid'>HsSrcFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"lhs"</span> <a name="line-173"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Unlit</span> <span class='hs-conid'>HsBootFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"lhs-boot"</span> <a name="line-174"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Unlit</span> <span class='hs-conid'>ExtCoreFile</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"lhcr"</span> <a name="line-175"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Cpp</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"lpp"</span> <span class='hs-comment'>-- intermediate only</span> <a name="line-176"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-layout'>(</span><span class='hs-conid'>HsPp</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"hscpp"</span> <span class='hs-comment'>-- intermediate only</span> <a name="line-177"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-layout'>(</span><span class='hs-conid'>Hsc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"hspp"</span> <span class='hs-comment'>-- intermediate only</span> <a name="line-178"></a> <span class='hs-comment'>-- NB: as things stand, phaseInputExt (Hsc x) must not evaluate x</span> <a name="line-179"></a> <span class='hs-comment'>-- because runPipeline uses the StopBefore phase to pick the</span> <a name="line-180"></a> <span class='hs-comment'>-- output filename. That could be fixed, but watch out.</span> <a name="line-181"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>HCc</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"hc"</span> <a name="line-182"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>Ccpp</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"cpp"</span> <a name="line-183"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>Cc</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"c"</span> <a name="line-184"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>Mangle</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"raw_s"</span> <a name="line-185"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>SplitMangle</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"split_s"</span> <span class='hs-comment'>-- not really generated</span> <a name="line-186"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>As</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"s"</span> <a name="line-187"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>SplitAs</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"split_s"</span> <span class='hs-comment'>-- not really generated</span> <a name="line-188"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>CmmCpp</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"cmm"</span> <a name="line-189"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>Cmm</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"cmmcpp"</span> <a name="line-190"></a><span class='hs-definition'>phaseInputExt</span> <span class='hs-conid'>StopLn</span> <span class='hs-keyglyph'>=</span> <span class='hs-str'>"o"</span> <a name="line-191"></a> <a name="line-192"></a><a name="haskellish_src_suffixes"></a><span class='hs-definition'>haskellish_src_suffixes</span><span class='hs-layout'>,</span> <span class='hs-varid'>haskellish_suffixes</span><span class='hs-layout'>,</span> <span class='hs-varid'>cish_suffixes</span><span class='hs-layout'>,</span> <a name="line-193"></a> <span class='hs-varid'>extcoreish_suffixes</span><span class='hs-layout'>,</span> <span class='hs-varid'>haskellish_user_src_suffixes</span> <a name="line-194"></a> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <a name="line-195"></a><span class='hs-definition'>haskellish_src_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>haskellish_user_src_suffixes</span> <span class='hs-varop'>++</span> <a name="line-196"></a> <span class='hs-keyglyph'>[</span> <span class='hs-str'>"hspp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hscpp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hcr"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cmm"</span> <span class='hs-keyglyph'>]</span> <a name="line-197"></a><a name="haskellish_suffixes"></a><span class='hs-definition'>haskellish_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>haskellish_src_suffixes</span> <span class='hs-varop'>++</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"hc"</span><span class='hs-layout'>,</span> <span class='hs-str'>"raw_s"</span><span class='hs-keyglyph'>]</span> <a name="line-198"></a><a name="cish_suffixes"></a><span class='hs-definition'>cish_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-str'>"c"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cpp"</span><span class='hs-layout'>,</span> <span class='hs-str'>"C"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cc"</span><span class='hs-layout'>,</span> <span class='hs-str'>"cxx"</span><span class='hs-layout'>,</span> <span class='hs-str'>"s"</span><span class='hs-layout'>,</span> <span class='hs-str'>"S"</span> <span class='hs-keyglyph'>]</span> <a name="line-199"></a><a name="extcoreish_suffixes"></a><span class='hs-definition'>extcoreish_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-str'>"hcr"</span> <span class='hs-keyglyph'>]</span> <a name="line-200"></a><a name="haskellish_user_src_suffixes"></a><span class='hs-comment'>-- Will not be deleted as temp files:</span> <a name="line-201"></a><span class='hs-definition'>haskellish_user_src_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-str'>"hs"</span><span class='hs-layout'>,</span> <span class='hs-str'>"lhs"</span><span class='hs-layout'>,</span> <span class='hs-str'>"hs-boot"</span><span class='hs-layout'>,</span> <span class='hs-str'>"lhs-boot"</span> <span class='hs-keyglyph'>]</span> <a name="line-202"></a> <a name="line-203"></a><a name="objish_suffixes"></a><span class='hs-definition'>objish_suffixes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <a name="line-204"></a><span class='hs-comment'>-- Use the appropriate suffix for the system on which</span> <a name="line-205"></a><span class='hs-comment'>-- the GHC-compiled code will run</span> <a name="line-206"></a><span class='hs-cpp'>#if mingw32_TARGET_OS || cygwin32_TARGET_OS</span> <a name="line-207"></a><span class='hs-definition'>objish_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-str'>"o"</span><span class='hs-layout'>,</span> <span class='hs-str'>"O"</span><span class='hs-layout'>,</span> <span class='hs-str'>"obj"</span><span class='hs-layout'>,</span> <span class='hs-str'>"OBJ"</span> <span class='hs-keyglyph'>]</span> <a name="line-208"></a><span class='hs-cpp'>#else</span> <a name="line-209"></a><span class='hs-definition'>objish_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-str'>"o"</span> <span class='hs-keyglyph'>]</span> <a name="line-210"></a><span class='hs-cpp'>#endif</span> <a name="line-211"></a> <a name="line-212"></a><a name="dynlib_suffixes"></a><span class='hs-definition'>dynlib_suffixes</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <a name="line-213"></a><span class='hs-cpp'>#ifdef mingw32_TARGET_OS</span> <a name="line-214"></a><span class='hs-definition'>dynlib_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"dll"</span><span class='hs-layout'>,</span> <span class='hs-str'>"DLL"</span><span class='hs-keyglyph'>]</span> <a name="line-215"></a><span class='hs-cpp'>#elif defined(darwin_TARGET_OS)</span> <a name="line-216"></a><span class='hs-definition'>dynlib_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"dylib"</span><span class='hs-keyglyph'>]</span> <a name="line-217"></a><span class='hs-cpp'>#else</span> <a name="line-218"></a><span class='hs-definition'>dynlib_suffixes</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-str'>"so"</span><span class='hs-keyglyph'>]</span> <a name="line-219"></a><span class='hs-cpp'>#endif</span> <a name="line-220"></a> <a name="line-221"></a><a name="isHaskellishSuffix"></a><span class='hs-definition'>isHaskellishSuffix</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHaskellSrcSuffix</span><span class='hs-layout'>,</span> <span class='hs-varid'>isCishSuffix</span><span class='hs-layout'>,</span> <span class='hs-varid'>isExtCoreSuffix</span><span class='hs-layout'>,</span> <a name="line-222"></a> <span class='hs-varid'>isObjectSuffix</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHaskellUserSrcSuffix</span><span class='hs-layout'>,</span> <span class='hs-varid'>isDynLibSuffix</span> <a name="line-223"></a> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-224"></a><span class='hs-definition'>isHaskellishSuffix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>haskellish_suffixes</span> <a name="line-225"></a><a name="isHaskellSrcSuffix"></a><span class='hs-definition'>isHaskellSrcSuffix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>haskellish_src_suffixes</span> <a name="line-226"></a><a name="isCishSuffix"></a><span class='hs-definition'>isCishSuffix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>cish_suffixes</span> <a name="line-227"></a><a name="isExtCoreSuffix"></a><span class='hs-definition'>isExtCoreSuffix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>extcoreish_suffixes</span> <a name="line-228"></a><a name="isObjectSuffix"></a><span class='hs-definition'>isObjectSuffix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>objish_suffixes</span> <a name="line-229"></a><a name="isHaskellUserSrcSuffix"></a><span class='hs-definition'>isHaskellUserSrcSuffix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>haskellish_user_src_suffixes</span> <a name="line-230"></a><a name="isDynLibSuffix"></a><span class='hs-definition'>isDynLibSuffix</span> <span class='hs-varid'>s</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`elem`</span> <span class='hs-varid'>dynlib_suffixes</span> <a name="line-231"></a> <a name="line-232"></a><a name="isSourceSuffix"></a><span class='hs-definition'>isSourceSuffix</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-233"></a><span class='hs-definition'>isSourceSuffix</span> <span class='hs-varid'>suff</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isHaskellishSuffix</span> <span class='hs-varid'>suff</span> <span class='hs-varop'>||</span> <span class='hs-varid'>isCishSuffix</span> <span class='hs-varid'>suff</span> <a name="line-234"></a> <a name="line-235"></a><a name="isHaskellishFilename"></a><span class='hs-definition'>isHaskellishFilename</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHaskellSrcFilename</span><span class='hs-layout'>,</span> <span class='hs-varid'>isCishFilename</span><span class='hs-layout'>,</span> <a name="line-236"></a> <span class='hs-varid'>isExtCoreFilename</span><span class='hs-layout'>,</span> <span class='hs-varid'>isObjectFilename</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHaskellUserSrcFilename</span><span class='hs-layout'>,</span> <a name="line-237"></a> <span class='hs-varid'>isDynLibFilename</span><span class='hs-layout'>,</span> <span class='hs-varid'>isSourceFilename</span> <a name="line-238"></a> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span> <span class='hs-keyglyph'>-></span> <span class='hs-conid'>Bool</span> <a name="line-239"></a><span class='hs-comment'>-- takeExtension return .foo, so we drop 1 to get rid of the .</span> <a name="line-240"></a><span class='hs-definition'>isHaskellishFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isHaskellishSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-241"></a><a name="isHaskellSrcFilename"></a><span class='hs-definition'>isHaskellSrcFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isHaskellSrcSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-242"></a><a name="isCishFilename"></a><span class='hs-definition'>isCishFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isCishSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-243"></a><a name="isExtCoreFilename"></a><span class='hs-definition'>isExtCoreFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isExtCoreSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-244"></a><a name="isObjectFilename"></a><span class='hs-definition'>isObjectFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isObjectSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-245"></a><a name="isHaskellUserSrcFilename"></a><span class='hs-definition'>isHaskellUserSrcFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isHaskellUserSrcSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-246"></a><a name="isDynLibFilename"></a><span class='hs-definition'>isDynLibFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isDynLibSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-247"></a><a name="isSourceFilename"></a><span class='hs-definition'>isSourceFilename</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isSourceSuffix</span> <span class='hs-layout'>(</span><span class='hs-varid'>drop</span> <span class='hs-num'>1</span> <span class='hs-varop'>$</span> <span class='hs-varid'>takeExtension</span> <span class='hs-varid'>f</span><span class='hs-layout'>)</span> <a name="line-248"></a> <a name="line-249"></a> </pre></body> </html>