summaryrefslogtreecommitdiff
path: root/compiler/nativeGen/X86/Ppr.hs
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2016-08-18 18:16:01 +0100
committerSimon Peyton Jones <simonpj@microsoft.com>2016-08-19 08:20:58 +0100
commitb2c5e4ce5c44a7be7c2b81c2600cae40c5b225ad (patch)
treeef56139032543cbef3ce4985501ff85421ce866c /compiler/nativeGen/X86/Ppr.hs
parent113d50b791c469394d38fab6ce5b760e5e8c35e2 (diff)
downloadhaskell-b2c5e4ce5c44a7be7c2b81c2600cae40c5b225ad.tar.gz
Revert "codeGen: Remove binutils<2.17 hack, fixes T11758"
This reverts commit e3e2e49a8f6952e1c8a19321c729c17b294d8c92. I'm reverting because it makes ghc-stage2 seg-fault on 64-bit Windows machines. Even ghc-stage2 --version seg-faults.
Diffstat (limited to 'compiler/nativeGen/X86/Ppr.hs')
-rw-r--r--compiler/nativeGen/X86/Ppr.hs23
1 files changed, 21 insertions, 2 deletions
diff --git a/compiler/nativeGen/X86/Ppr.hs b/compiler/nativeGen/X86/Ppr.hs
index 090ff53edf..7809ae1df9 100644
--- a/compiler/nativeGen/X86/Ppr.hs
+++ b/compiler/nativeGen/X86/Ppr.hs
@@ -454,8 +454,27 @@ pprDataItem' dflags lit
_ -> panic "X86.Ppr.ppr_item: no match for II64"
| otherwise ->
[text "\t.quad\t" <> pprImm imm]
-
- _ -> [text "\t.quad\t" <> pprImm imm]
+ _
+ | target32Bit platform ->
+ [text "\t.quad\t" <> pprImm imm]
+ | otherwise ->
+ -- x86_64: binutils can't handle the R_X86_64_PC64
+ -- relocation type, which means we can't do
+ -- pc-relative 64-bit addresses. Fortunately we're
+ -- assuming the small memory model, in which all such
+ -- offsets will fit into 32 bits, so we have to stick
+ -- to 32-bit offset fields and modify the RTS
+ -- appropriately
+ --
+ -- See Note [x86-64-relative] in includes/rts/storage/InfoTables.h
+ --
+ case lit of
+ -- A relative relocation:
+ CmmLabelDiffOff _ _ _ ->
+ [text "\t.long\t" <> pprImm imm,
+ text "\t.long\t0"]
+ _ ->
+ [text "\t.quad\t" <> pprImm imm]
ppr_item _ _
= panic "X86.Ppr.ppr_item: no match"