From 9c68db9dbd57cbd01008df1affe542a7ad572381 Mon Sep 17 00:00:00 2001
From: Simon Marlow <marlowsd@gmail.com>
Date: Tue, 22 May 2012 11:51:46 +0100
Subject: [PATCH] Read the source file timestamp *before* preprocessing (#6106)

MERGED from commit d82da293078b00d0f2d85c947e70382d398aab64
---
 compiler/main/GhcMake.hs | 24 +++++++++++-------------
 1 file changed, 11 insertions(+), 13 deletions(-)

diff --git a/compiler/main/GhcMake.hs b/compiler/main/GhcMake.hs
index 11a3ba58c295..091e1be6ad07 100644
--- a/compiler/main/GhcMake.hs
+++ b/compiler/main/GhcMake.hs
@@ -1213,16 +1213,14 @@ summariseFile hsc_env old_summaries file mb_phase obj_allowed maybe_buf
    = do
         let location = ms_location old_summary
 
-                -- return the cached summary if the source didn't change
-        src_timestamp <- case maybe_buf of
-                           Just (_,t) -> return t
-                           Nothing    -> liftIO $ getModificationTime file
+        src_timestamp <- get_src_timestamp
                 -- The file exists; we checked in getRootSummary above.
                 -- If it gets removed subsequently, then this 
                 -- getModificationTime may fail, but that's the right
                 -- behaviour.
 
-        if ms_hs_date old_summary == src_timestamp 
+                -- return the cached summary if the source didn't change
+        if ms_hs_date old_summary == src_timestamp
            then do -- update the object-file timestamp
                   obj_timestamp <-
                     if isObjectTarget (hscTarget (hsc_dflags hsc_env)) 
@@ -1231,12 +1229,17 @@ summariseFile hsc_env old_summaries file mb_phase obj_allowed maybe_buf
                         else return Nothing
                   return old_summary{ ms_obj_date = obj_timestamp }
            else
-                new_summary
+                new_summary src_timestamp
 
    | otherwise
-   = new_summary
+   = do src_timestamp <- get_src_timestamp
+        new_summary src_timestamp
   where
-    new_summary = do
+    get_src_timestamp = case maybe_buf of
+                           Just (_,t) -> return t
+                           Nothing    -> liftIO $ getModificationTime file
+
+    new_summary src_timestamp = do
         let dflags = hsc_dflags hsc_env
 
         (dflags', hspp_fn, buf)
@@ -1251,11 +1254,6 @@ summariseFile hsc_env old_summaries file mb_phase obj_allowed maybe_buf
         -- to findModule will find it, even if it's not on any search path
         mod <- liftIO $ addHomeModuleToFinder hsc_env mod_name location
 
-        src_timestamp <- case maybe_buf of
-                           Just (_,t) -> return t
-                           Nothing    -> liftIO $ getModificationTime file
-                        -- getMofificationTime may fail
-
         -- when the user asks to load a source file by name, we only
         -- use an object file if -fobject-code is on.  See #1205.
         obj_timestamp <-
-- 
GitLab