diff options
author | Zejun Wu <watashi@fb.com> | 2018-10-15 13:51:24 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2018-10-15 18:34:17 -0400 |
commit | 95ec7c88c7223508db3ba91d6ab9e303d0b062ad (patch) | |
tree | d249e525aa48e841104e89411b4791f218ff6db5 /testsuite/tests | |
parent | 02b2116e458357e87718e7378a80579a7021e2a7 (diff) | |
download | haskell-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/tests')
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']) |