summaryrefslogtreecommitdiff
path: root/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite')
-rw-r--r--testsuite/tests/driver/recomp015/Generate.hs7
-rw-r--r--testsuite/tests/driver/recomp015/Makefile39
-rw-r--r--testsuite/tests/driver/recomp015/all.T7
-rw-r--r--testsuite/tests/driver/recomp015/recomp015.stderr0
-rw-r--r--testsuite/tests/driver/recomp015/recomp015.stdout6
5 files changed, 59 insertions, 0 deletions
diff --git a/testsuite/tests/driver/recomp015/Generate.hs b/testsuite/tests/driver/recomp015/Generate.hs
new file mode 100644
index 0000000000..059c763dd6
--- /dev/null
+++ b/testsuite/tests/driver/recomp015/Generate.hs
@@ -0,0 +1,7 @@
+import Control.Monad (forM_)
+
+main :: IO ()
+main = forM_ [0..0xffff] $ \i -> do
+ putStrLn $ ".section s" ++ show i ++ ",\"\",@progbits"
+ putStrLn $ ".asciz \"Section " ++ show i ++ "\""
+ putStrLn ""
diff --git a/testsuite/tests/driver/recomp015/Makefile b/testsuite/tests/driver/recomp015/Makefile
new file mode 100644
index 0000000000..9f7ebc0b7f
--- /dev/null
+++ b/testsuite/tests/driver/recomp015/Makefile
@@ -0,0 +1,39 @@
+TOP=../../..
+include $(TOP)/mk/boilerplate.mk
+include $(TOP)/mk/test.mk
+
+# -fforce-recomp makes lots of driver tests trivially pass, so we
+# filter it out from $(TEST_HC_OPTS).
+TEST_HC_OPTS_NO_RECOMP = $(filter-out -fforce-recomp,$(TEST_HC_OPTS))
+
+# Recompilation tests
+
+clean:
+ rm -f *.o *.hi
+ rm -f ManySections.s Main.hs
+ rm -f Main$(exeext)
+ rm -f Generate$(exeext)
+
+recomp015: clean
+ # Generate a file with more than 0xff00 sections to force different ELF
+ # fields to be used (ELF header fields are limited to 16-bit).
+ #
+ # You can confirm that fields of section 0 entry are used to store the
+ # number of section (size field of section 0) and the index of the .shstrtab
+ # section (link field of section 0) with:
+ # readelf -t ManySections.o | less
+ # and/or
+ # readelf -t Main | less
+ #
+ # This test checks that GHC can read these fields correctly and avoids
+ # recompilation (just like recomp011 which does the same thing for a smaller
+ # number of sections)
+ '$(TEST_HC)' $(TEST_HC_OPTS_NO_RECOMP) Generate.hs
+ ./Generate > ManySections.s
+ echo 'main = putStrLn "Running main..."' > Main.hs
+ '$(TEST_HC)' $(TEST_HC_OPTS_NO_RECOMP) -c ManySections.s
+ '$(TEST_HC)' $(TEST_HC_OPTS_NO_RECOMP) --make -O Main.hs ManySections.o
+ ./Main
+ sleep 1
+ '$(TEST_HC)' $(TEST_HC_OPTS_NO_RECOMP) --make -O Main.hs ManySections.o
+ ./Main
diff --git a/testsuite/tests/driver/recomp015/all.T b/testsuite/tests/driver/recomp015/all.T
new file mode 100644
index 0000000000..ff86cafa38
--- /dev/null
+++ b/testsuite/tests/driver/recomp015/all.T
@@ -0,0 +1,7 @@
+# Test for the ELF parser: more than 0xff00 sections (use different ELF fields)
+
+test('recomp015',
+ [ clean_cmd('$MAKE -s clean') ],
+ run_command,
+ ['$MAKE -s --no-print-directory recomp015'])
+
diff --git a/testsuite/tests/driver/recomp015/recomp015.stderr b/testsuite/tests/driver/recomp015/recomp015.stderr
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuite/tests/driver/recomp015/recomp015.stderr
diff --git a/testsuite/tests/driver/recomp015/recomp015.stdout b/testsuite/tests/driver/recomp015/recomp015.stdout
new file mode 100644
index 0000000000..a7dbad203a
--- /dev/null
+++ b/testsuite/tests/driver/recomp015/recomp015.stdout
@@ -0,0 +1,6 @@
+[1 of 1] Compiling Main ( Generate.hs, Generate.o )
+Linking Generate ...
+[1 of 1] Compiling Main ( Main.hs, Main.o )
+Linking Main ...
+Running main...
+Running main...