summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornineonine <mail4chemik@gmail.com>2019-07-13 00:11:46 -0700
committerMarge Bot <ben+marge-bot@smart-cactus.org>2019-07-26 00:57:39 -0400
commitaae0457f412aa40dd192ca2cbea565ea60b182ec (patch)
treefd58e2a399fd70e0aeaa9e6c9eb7415877776ba3
parent30b6f391801d58e364f79df5da2cf9f02be2ba5f (diff)
downloadhaskell-aae0457f412aa40dd192ca2cbea565ea60b182ec.tar.gz
Change behaviour of -ddump-cmm-verbose to dump each Cmm pass output to a separate file and add -ddump-cmm-verbose-by-proc to keep old behaviour (#16930)
-rw-r--r--compiler/cmm/CmmPipeline.hs13
-rw-r--r--compiler/main/DynFlags.hs9
-rw-r--r--compiler/main/HscMain.hs2
-rw-r--r--docs/users_guide/debugging.rst11
-rw-r--r--testsuite/tests/cmm/should_compile/Makefile12
-rw-r--r--testsuite/tests/cmm/should_compile/T16930.hs10
-rw-r--r--testsuite/tests/cmm/should_compile/T16930.stdout9
-rw-r--r--testsuite/tests/cmm/should_compile/all.T1
-rw-r--r--testsuite/tests/codeGen/should_compile/Makefile4
9 files changed, 58 insertions, 13 deletions
diff --git a/compiler/cmm/CmmPipeline.hs b/compiler/cmm/CmmPipeline.hs
index b8ae2b57ab..a6d981a7f9 100644
--- a/compiler/cmm/CmmPipeline.hs
+++ b/compiler/cmm/CmmPipeline.hs
@@ -353,9 +353,10 @@ dumpGraph dflags flag name g = do
dumpWith :: DynFlags -> DumpFlag -> String -> SDoc -> IO ()
dumpWith dflags flag txt sdoc = do
- -- ToDo: No easy way of say "dump all the cmm, *and* split
- -- them into files." Also, -ddump-cmm-verbose doesn't play
- -- nicely with -ddump-to-file, since the headers get omitted.
- dumpIfSet_dyn dflags flag txt sdoc
- when (not (dopt flag dflags)) $
- dumpIfSet_dyn dflags Opt_D_dump_cmm_verbose txt sdoc
+ dumpIfSet_dyn dflags flag txt sdoc
+ when (not (dopt flag dflags)) $
+ -- If `-ddump-cmm-verbose -ddump-to-file` is specified,
+ -- dump each Cmm pipeline stage output to a separate file. #16930
+ when (dopt Opt_D_dump_cmm_verbose dflags)
+ $ dumpSDoc dflags alwaysQualify flag txt sdoc
+ dumpIfSet_dyn dflags Opt_D_dump_cmm_verbose_by_proc txt sdoc
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 24c6caaf4d..5d0b09a602 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -407,10 +407,13 @@ data DumpFlag
= Opt_D_dump_cmm
| Opt_D_dump_cmm_from_stg
| Opt_D_dump_cmm_raw
- | Opt_D_dump_cmm_verbose
+ | Opt_D_dump_cmm_verbose_by_proc
-- All of the cmm subflags (there are a lot!) automatically
- -- enabled if you run -ddump-cmm-verbose
+ -- enabled if you run -ddump-cmm-verbose-by-proc
-- Each flag corresponds to exact stage of Cmm pipeline.
+ | Opt_D_dump_cmm_verbose
+ -- same as -ddump-cmm-verbose-by-proc but writes each stage
+ -- to a separate file (if used with -ddump-to-file)
| Opt_D_dump_cmm_cfg
| Opt_D_dump_cmm_cbe
| Opt_D_dump_cmm_switch
@@ -3302,6 +3305,8 @@ dynamic_flags_deps = [
(setDumpFlag Opt_D_dump_cmm_raw)
, make_ord_flag defGhcFlag "ddump-cmm-verbose"
(setDumpFlag Opt_D_dump_cmm_verbose)
+ , make_ord_flag defGhcFlag "ddump-cmm-verbose-by-proc"
+ (setDumpFlag Opt_D_dump_cmm_verbose_by_proc)
, make_ord_flag defGhcFlag "ddump-cmm-cfg"
(setDumpFlag Opt_D_dump_cmm_cfg)
, make_ord_flag defGhcFlag "ddump-cmm-cbe"
diff --git a/compiler/main/HscMain.hs b/compiler/main/HscMain.hs
index aaf9a3c285..52501ec15f 100644
--- a/compiler/main/HscMain.hs
+++ b/compiler/main/HscMain.hs
@@ -1472,7 +1472,7 @@ hscCompileCmmFile hsc_env filename output_filename = runHsc hsc_env $ do
let dflags = hsc_dflags hsc_env
cmm <- ioMsgMaybe $ parseCmmFile dflags filename
liftIO $ do
- dumpIfSet_dyn dflags Opt_D_dump_cmm_verbose "Parsed Cmm" (ppr cmm)
+ dumpIfSet_dyn dflags Opt_D_dump_cmm_verbose_by_proc "Parsed Cmm" (ppr cmm)
let -- Make up a module name to give the NCG. We can't pass bottom here
-- lest we reproduce #11784.
mod_name = mkModuleName $ "Cmm$" ++ FilePath.takeFileName filename
diff --git a/docs/users_guide/debugging.rst b/docs/users_guide/debugging.rst
index ff02fc4c7b..f966e1a32f 100644
--- a/docs/users_guide/debugging.rst
+++ b/docs/users_guide/debugging.rst
@@ -391,8 +391,8 @@ C-\\- representation
These flags dump various phases of GHC's C-\\- pipeline.
-.. ghc-flag:: -ddump-cmm-verbose
- :shortdesc: Show output from main C-\\- pipeline passes
+.. ghc-flag:: -ddump-cmm-verbose-by-proc
+ :shortdesc: Show output from main C-\\- pipeline passes (grouped by proc)
:type: dynamic
Dump output from main C-\\- pipeline stages. In case of
@@ -404,6 +404,13 @@ These flags dump various phases of GHC's C-\\- pipeline.
Cmm dumps don't include unreachable blocks since we print
blocks in reverse post-order.
+.. ghc-flag:: -ddump-cmm-verbose
+ :shortdesc: Write output from main C-\\- pipeline passes to files
+ :type: dynamic
+
+ If used in conjunction with `-ddump-to-file`, writes dump
+ output from main C-\\- pipeline stages to files (each stage per file).
+
.. ghc-flag:: -ddump-cmm-from-stg
:shortdesc: Dump STG-to-C-\\- output
:type: dynamic
diff --git a/testsuite/tests/cmm/should_compile/Makefile b/testsuite/tests/cmm/should_compile/Makefile
index 9101fbd40a..ac96d11fac 100644
--- a/testsuite/tests/cmm/should_compile/Makefile
+++ b/testsuite/tests/cmm/should_compile/Makefile
@@ -1,3 +1,15 @@
TOP=../../..
include $(TOP)/mk/boilerplate.mk
include $(TOP)/mk/test.mk
+
+## check if -ddump-cmm-verbose -ddump-to-file generates files
+# for all cmm stages and dumps correspond to correct procs
+T16930:
+ echo "testing -ddump-cmm-verbose for T16930 ..."
+ '$(TEST_HC)' $(TEST_HC_OPTS) T16930.hs -fforce-recomp -ddump-cmm-verbose -ddump-to-file
+ grep -rl "CAFEnv" . --include=\T16930.*
+ grep -rl "Post control-flow optimisations" . --include=\T16930.*
+ grep -rl "Post CPS Cmm" . --include=\T16930.*
+ grep -rl "after setInfoTableStackMap" . --include=\T16930.*
+ grep -rl "Layout Stack" . --include=\T16930.*
+ grep -rl "Post switch plan" . --include=\T16930.*
diff --git a/testsuite/tests/cmm/should_compile/T16930.hs b/testsuite/tests/cmm/should_compile/T16930.hs
new file mode 100644
index 0000000000..74aaf0c59f
--- /dev/null
+++ b/testsuite/tests/cmm/should_compile/T16930.hs
@@ -0,0 +1,10 @@
+module Main where
+
+a :: Int
+a = 1
+
+b :: Int
+b = a + 7
+
+main :: IO ()
+main = return ()
diff --git a/testsuite/tests/cmm/should_compile/T16930.stdout b/testsuite/tests/cmm/should_compile/T16930.stdout
new file mode 100644
index 0000000000..bbad2da83f
--- /dev/null
+++ b/testsuite/tests/cmm/should_compile/T16930.stdout
@@ -0,0 +1,9 @@
+testing -ddump-cmm-verbose for T16930 ...
+[1 of 1] Compiling Main ( T16930.hs, T16930.o )
+Linking T16930 ...
+./T16930.dump-cmm-caf
+./T16930.dump-cmm-cfg
+./T16930.dump-cmm-cps
+./T16930.dump-cmm-info
+./T16930.dump-cmm-sp
+./T16930.dump-cmm-switch
diff --git a/testsuite/tests/cmm/should_compile/all.T b/testsuite/tests/cmm/should_compile/all.T
index 4bfa949a80..46dc86930a 100644
--- a/testsuite/tests/cmm/should_compile/all.T
+++ b/testsuite/tests/cmm/should_compile/all.T
@@ -1,2 +1,3 @@
#
test('selfloop', [cmm_src], compile, [''])
+test('T16930', normal, makefile_test, ['T16930'])
diff --git a/testsuite/tests/codeGen/should_compile/Makefile b/testsuite/tests/codeGen/should_compile/Makefile
index 8aa7917751..bcdefcbaba 100644
--- a/testsuite/tests/codeGen/should_compile/Makefile
+++ b/testsuite/tests/codeGen/should_compile/Makefile
@@ -9,13 +9,13 @@ debug:
# Without optimisations, we should get annotations for basically
# all expressions in the example program.
echo == Dbg ==
- '$(TEST_HC)' $(TEST_HC_OPTS) debug -fforce-recomp -g -ddump-cmm-verbose \
+ '$(TEST_HC)' $(TEST_HC_OPTS) debug -fforce-recomp -g -ddump-cmm-verbose-by-proc \
| grep -o src\<debug.hs:.*\> | sort -u
./debug
# With optimisations we will get fewer annotations.
echo == Dbg -O2 ==
- '$(TEST_HC)' $(TEST_HC_OPTS) debug -fforce-recomp -g -ddump-cmm-verbose -O2 \
+ '$(TEST_HC)' $(TEST_HC_OPTS) debug -fforce-recomp -g -ddump-cmm-verbose-by-proc -O2 \
> debug.cmm
cat debug.cmm | grep -o src\<debug.hs:.*\> | sort -u