summaryrefslogtreecommitdiff
path: root/testsuite
diff options
context:
space:
mode:
authorZejun Wu <watashi@fb.com>2018-10-15 13:51:24 -0400
committerBen Gamari <ben@smart-cactus.org>2018-10-15 18:34:17 -0400
commit95ec7c88c7223508db3ba91d6ab9e303d0b062ad (patch)
treed249e525aa48e841104e89411b4791f218ff6db5 /testsuite
parent02b2116e458357e87718e7378a80579a7021e2a7 (diff)
downloadhaskell-95ec7c88c7223508db3ba91d6ab9e303d0b062ad.tar.gz
Generate correct relocation for external cost centre
We used to always generate direct access for cost centre labels. We fixed this by generating indirect data load for cost centre defined in external module. Test Plan: The added test used to fail with error message ``` /bin/ld.gold: error: T15723B.o: requires dynamic R_X86_64_PC32 reloc against 'T15723A_foo1_EXPR_cc' which may overflow at runtime; recompile with -fPIC ``` and now passes. Also check that `R_X86_64_PC32` is generated for CostCentre from the same module and `R_X86_64_GOTPCREL` is generated for CostCentre from external module: ``` $ objdump -rdS T15723B.o 0000000000000028 <T15723B_test_info>: 28: 48 8d 45 f0 lea -0x10(%rbp),%rax 2c: 4c 39 f8 cmp %r15,%rax 2f: 72 70 jb a1 <T15723B_test_info+0x79> 31: 48 83 ec 08 sub $0x8,%rsp 35: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi # 3c <T15723B_test_info+0x14> 38: R_X86_64_PC32 T15723B_test1_EXPR_cc-0x4 3c: 49 8b bd 60 03 00 00 mov 0x360(%r13),%rdi 43: 31 c0 xor %eax,%eax 45: e8 00 00 00 00 callq 4a <T15723B_test_info+0x22> 46: R_X86_64_PLT32 pushCostCentre-0x4 4a: 48 83 c4 08 add $0x8,%rsp 4e: 48 ff 40 30 incq 0x30(%rax) 52: 49 89 85 60 03 00 00 mov %rax,0x360(%r13) 59: 48 83 ec 08 sub $0x8,%rsp 5d: 49 8b bd 60 03 00 00 mov 0x360(%r13),%rdi 64: 48 8b 35 00 00 00 00 mov 0x0(%rip),%rsi # 6b <T15723B_test_info+0x43> 67: R_X86_64_GOTPCREL T15723A_foo1_EXPR_cc-0x4 6b: 31 c0 xor %eax,%eax 6d: e8 00 00 00 00 callq 72 <T15723B_test_info+0x4a> 6e: R_X86_64_PLT32 pushCostCentre-0x4 72: 48 83 c4 08 add $0x8,%rsp 76: 48 ff 40 30 incq 0x30(%rax) ``` Reviewers: simonmar, bgamari Reviewed By: simonmar Subscribers: rwbarton, carter GHC Trac Issues: #15723 Differential Revision: https://phabricator.haskell.org/D5214
Diffstat (limited to 'testsuite')
-rw-r--r--testsuite/tests/codeGen/should_compile/Makefile5
-rw-r--r--testsuite/tests/codeGen/should_compile/T15723.stderr2
-rw-r--r--testsuite/tests/codeGen/should_compile/T15723A.hs9
-rw-r--r--testsuite/tests/codeGen/should_compile/T15723B.hs6
-rw-r--r--testsuite/tests/codeGen/should_compile/all.T5
5 files changed, 27 insertions, 0 deletions
diff --git a/testsuite/tests/codeGen/should_compile/Makefile b/testsuite/tests/codeGen/should_compile/Makefile
index a1fc58f89b..c0729443c9 100644
--- a/testsuite/tests/codeGen/should_compile/Makefile
+++ b/testsuite/tests/codeGen/should_compile/Makefile
@@ -38,3 +38,8 @@ T14999:
T15196:
'$(TEST_HC)' $(TEST_HC_OPTS) -c -O -ddump-asm T15196.hs | grep "jp " ; echo $$?
+
+T15723:
+ '$(TEST_HC)' $(TEST_HC_OPTS) -prof -fPIC -fexternal-dynamic-refs -fforce-recomp -O2 -c T15723A.hs -o T15723A.o
+ '$(TEST_HC)' $(TEST_HC_OPTS) -prof -fPIC -fexternal-dynamic-refs -fforce-recomp -O2 -c T15723B.hs -o T15723B.o
+ '$(TEST_HC)' $(TEST_HC_OPTS) -dynamic -shared T15723B.o -o T15723B.so
diff --git a/testsuite/tests/codeGen/should_compile/T15723.stderr b/testsuite/tests/codeGen/should_compile/T15723.stderr
new file mode 100644
index 0000000000..cd2812b10c
--- /dev/null
+++ b/testsuite/tests/codeGen/should_compile/T15723.stderr
@@ -0,0 +1,2 @@
+Warning: -rtsopts and -with-rtsopts have no effect with -shared.
+ Call hs_init_ghc() from your main() function to set these options.
diff --git a/testsuite/tests/codeGen/should_compile/T15723A.hs b/testsuite/tests/codeGen/should_compile/T15723A.hs
new file mode 100644
index 0000000000..aa47ece6ec
--- /dev/null
+++ b/testsuite/tests/codeGen/should_compile/T15723A.hs
@@ -0,0 +1,9 @@
+module T15723A where
+
+{-# INLINE foo #-}
+foo :: Int -> Int
+foo x = {-# SCC foo1 #-} bar x
+
+{-# NOINLINE bar #-}
+bar :: Int -> Int
+bar x = x
diff --git a/testsuite/tests/codeGen/should_compile/T15723B.hs b/testsuite/tests/codeGen/should_compile/T15723B.hs
new file mode 100644
index 0000000000..5b7b44d2f6
--- /dev/null
+++ b/testsuite/tests/codeGen/should_compile/T15723B.hs
@@ -0,0 +1,6 @@
+module T15723B where
+
+import T15723A
+
+test :: Int -> Int
+test x = {-# SCC test1 #-} foo $ foo x
diff --git a/testsuite/tests/codeGen/should_compile/all.T b/testsuite/tests/codeGen/should_compile/all.T
index a5d5a47034..f8e2fb0033 100644
--- a/testsuite/tests/codeGen/should_compile/all.T
+++ b/testsuite/tests/codeGen/should_compile/all.T
@@ -46,3 +46,8 @@ test('T15196',
[ unless(arch('x86_64'),skip),
only_ways('normal'),
], run_command, ['$MAKE -s --no-print-directory T15196'])
+
+test('T15723',
+ [ unless(have_profiling(), skip),
+ unless(have_dynamic(), skip),
+ ], run_command, ['$MAKE -s --no-print-directory T15723'])