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 /compiler | |
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 'compiler')
-rw-r--r-- | compiler/cmm/CLabel.hs | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/compiler/cmm/CLabel.hs b/compiler/cmm/CLabel.hs index f07abebf50..dbb92e5f41 100644 --- a/compiler/cmm/CLabel.hs +++ b/compiler/cmm/CLabel.hs @@ -1019,7 +1019,7 @@ labelDynamic dflags this_mod lbl = case lbl of -- is the RTS in a DLL or not? RtsLabel _ -> - (gopt Opt_ExternalDynamicRefs dflags) && (this_pkg /= rtsUnitId) + externalDynamicRefs && (this_pkg /= rtsUnitId) IdLabel n _ _ -> isDllName dflags this_mod n @@ -1028,7 +1028,7 @@ labelDynamic dflags this_mod lbl = -- its own shared library. CmmLabel pkg _ _ | os == OSMinGW32 -> - (gopt Opt_ExternalDynamicRefs dflags) && (this_pkg /= pkg) + externalDynamicRefs && (this_pkg /= pkg) | otherwise -> gopt Opt_ExternalDynamicRefs dflags @@ -1048,19 +1048,26 @@ labelDynamic dflags this_mod lbl = -- When compiling in the "dyn" way, each package is to be -- linked into its own DLL. ForeignLabelInPackage pkgId -> - (gopt Opt_ExternalDynamicRefs dflags) && (this_pkg /= pkgId) + externalDynamicRefs && (this_pkg /= pkgId) else -- On Mac OS X and on ELF platforms, false positives are OK, -- so we claim that all foreign imports come from dynamic -- libraries True + CC_Label cc -> + externalDynamicRefs && not (ccFromThisModule cc this_mod) + + -- CCS_Label always contains a CostCentre defined in the current module + CCS_Label _ -> False + HpcTicksLabel m -> - (gopt Opt_ExternalDynamicRefs dflags) && this_mod /= m + externalDynamicRefs && this_mod /= m -- Note that DynamicLinkerLabels do NOT require dynamic linking themselves. _ -> False where + externalDynamicRefs = gopt Opt_ExternalDynamicRefs dflags os = platformOS (targetPlatform dflags) this_pkg = moduleUnitId this_mod |