Generate correct relocation for external cost centre
ClosedPublic

Authored by watashi on Oct 8 2018, 9:54 AM.

Details

Summary

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)

Diff Detail

Repository
rGHC Glasgow Haskell Compiler
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.
watashi created this revision.Oct 8 2018, 9:54 AM
simonmar added inline comments.Oct 9 2018, 3:15 PM
compiler/cmm/CLabel.hs
1059

unnecessary parens

1061–1066

I think a CCS_Label always contains a cc defined in the current module. I'm not even sure it would work if the cc was in another module, because we don't have a way to generate the dynamic reference from the CCS.

I think a CCS_Label never needs to be dynamic. But I could be wrong here.

watashi added inline comments.Oct 9 2018, 3:22 PM
compiler/cmm/CLabel.hs
1061–1066

I have little idea here, will replace this with a comment.

watashi updated this revision to Diff 18278.Oct 9 2018, 3:52 PM

nit + CCS_Label is always local

simonmar accepted this revision.Oct 10 2018, 2:42 PM

Thanks!

This revision is now accepted and ready to land.Oct 10 2018, 2:42 PM
This revision was automatically updated to reflect the committed changes.