summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornineonine <mail4chemik@gmail.com>2019-07-08 07:09:15 (GMT)
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-07-11 21:48:18 (GMT)
commit8449c5b699c3a1a0e363ce75b1f151b38411298f (patch)
treef2ae57a63098f022abc3465ff87a418cc3ee8746
parentb507acebdc3dbec53c54ae07175b39da4066d4f8 (diff)
downloadghc-8449c5b699c3a1a0e363ce75b1f151b38411298f.zip
ghc-8449c5b699c3a1a0e363ce75b1f151b38411298f.tar.gz
ghc-8449c5b699c3a1a0e363ce75b1f151b38411298f.tar.bz2
Allow reusing temporary object files generated by GHCi by writing to -odir in case -fwrite-interface was specified (#16670)
-rw-r--r--compiler/main/GhcMake.hs12
-rw-r--r--testsuite/tests/ghci/T16670/Makefile24
-rw-r--r--testsuite/tests/ghci/T16670/T16670_th.hs7
-rw-r--r--testsuite/tests/ghci/T16670/T16670_th.stdout2
-rw-r--r--testsuite/tests/ghci/T16670/T16670_unboxed.hs8
-rw-r--r--testsuite/tests/ghci/T16670/T16670_unboxed.stdout2
-rw-r--r--testsuite/tests/ghci/T16670/TH.hs3
-rw-r--r--testsuite/tests/ghci/T16670/all.T7
8 files changed, 60 insertions, 5 deletions
diff --git a/compiler/main/GhcMake.hs b/compiler/main/GhcMake.hs
index 8767a6e..81311c1 100644
--- a/compiler/main/GhcMake.hs
+++ b/compiler/main/GhcMake.hs
@@ -2198,15 +2198,17 @@ enableCodeGenWhen condition should_modify staticLife dynLife target nodemap =
-- to by the user. But we need them, so we patch their locations in
-- the ModSummary with temporary files.
--
- hi_file <-
+ (hi_file, o_file) <-
+ -- If ``-fwrite-interface` is specified, then the .o and .hi files
+ -- are written into `-odir` and `-hidir` respectively. #16670
if gopt Opt_WriteInterface dflags
- then return $ ml_hi_file ms_location
- else new_temp_file (hiSuf dflags) (dynHiSuf dflags)
- o_temp_file <- new_temp_file (objectSuf dflags) (dynObjectSuf dflags)
+ then return (ml_hi_file ms_location, ml_obj_file ms_location)
+ else (,) <$> (new_temp_file (hiSuf dflags) (dynHiSuf dflags))
+ <*> (new_temp_file (objectSuf dflags) (dynObjectSuf dflags))
return $
ms
{ ms_location =
- ms_location {ml_hi_file = hi_file, ml_obj_file = o_temp_file}
+ ms_location {ml_hi_file = hi_file, ml_obj_file = o_file}
, ms_hspp_opts = updOptLevel 0 $ dflags {hscTarget = target}
}
| otherwise = return ms
diff --git a/testsuite/tests/ghci/T16670/Makefile b/testsuite/tests/ghci/T16670/Makefile
new file mode 100644
index 0000000..586f7e7
--- /dev/null
+++ b/testsuite/tests/ghci/T16670/Makefile
@@ -0,0 +1,24 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+clean:
+ $(RM) -rf my-odir
+
+T16670_unboxed:
+ @echo "~~~~~~~~ testing T16670_unboxed"
+ $(MAKE) -s --no-print-directory clean
+ mkdir my-odir
+ echo ":load T16670_unboxed.hs" | "$(TEST_HC)" $(TEST_HC_OPTS_INTERACTIVE) \
+ -v0 -fwrite-interface -odir my-odir
+ find . -name T16670_unboxed.o
+ test -f my-odir/T16670_unboxed.o
+
+T16670_th:
+ @echo "~~~~~~~~ testing T16670_th"
+ $(MAKE) -s --no-print-directory clean
+ mkdir my-odir
+ echo ":load T16670_th.hs" | "$(TEST_HC)" $(TEST_HC_OPTS_INTERACTIVE) \
+ -v0 -fno-code -fwrite-interface -odir my-odir
+ find . -name T16670_th.o
+ test -f my-odir/T16670_th.o
diff --git a/testsuite/tests/ghci/T16670/T16670_th.hs b/testsuite/tests/ghci/T16670/T16670_th.hs
new file mode 100644
index 0000000..f21c799
--- /dev/null
+++ b/testsuite/tests/ghci/T16670/T16670_th.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module T16670_th where
+
+import TH
+
+x = $(th)
diff --git a/testsuite/tests/ghci/T16670/T16670_th.stdout b/testsuite/tests/ghci/T16670/T16670_th.stdout
new file mode 100644
index 0000000..708b93a
--- /dev/null
+++ b/testsuite/tests/ghci/T16670/T16670_th.stdout
@@ -0,0 +1,2 @@
+~~~~~~~~ testing T16670_th
+./my-odir/T16670_th.o
diff --git a/testsuite/tests/ghci/T16670/T16670_unboxed.hs b/testsuite/tests/ghci/T16670/T16670_unboxed.hs
new file mode 100644
index 0000000..2e90395
--- /dev/null
+++ b/testsuite/tests/ghci/T16670/T16670_unboxed.hs
@@ -0,0 +1,8 @@
+{-# LANGUAGE UnboxedTuples #-}
+{-# OPTIONS_GHC -fwrite-interface #-}
+module T16670_unboxed where
+
+data UnboxedTupleData = MkUTD (# (),() #)
+
+doThings :: UnboxedTupleData -> ()
+doThings (MkUTD t) = ()
diff --git a/testsuite/tests/ghci/T16670/T16670_unboxed.stdout b/testsuite/tests/ghci/T16670/T16670_unboxed.stdout
new file mode 100644
index 0000000..61c74ca
--- /dev/null
+++ b/testsuite/tests/ghci/T16670/T16670_unboxed.stdout
@@ -0,0 +1,2 @@
+~~~~~~~~ testing T16670_unboxed
+./my-odir/T16670_unboxed.o
diff --git a/testsuite/tests/ghci/T16670/TH.hs b/testsuite/tests/ghci/T16670/TH.hs
new file mode 100644
index 0000000..f288c78
--- /dev/null
+++ b/testsuite/tests/ghci/T16670/TH.hs
@@ -0,0 +1,3 @@
+{-# LANGUAGE TemplateHaskell #-}
+module TH where
+th = [|909|]
diff --git a/testsuite/tests/ghci/T16670/all.T b/testsuite/tests/ghci/T16670/all.T
new file mode 100644
index 0000000..00a4f53
--- /dev/null
+++ b/testsuite/tests/ghci/T16670/all.T
@@ -0,0 +1,7 @@
+test('T16670_unboxed', [extra_files(['T16670_unboxed.hs']),
+ req_interp, omit_ways(prof_ways), unless(have_dynamic(), skip)],
+ makefile_test, ['T16670_unboxed'])
+
+test('T16670_th', [extra_files(['T16670_th.hs', 'TH.hs']),
+ req_interp, omit_ways(prof_ways), unless(have_dynamic(), skip)],
+ makefile_test, ['T16670_th'])