#7442: [PATCH] Fix broken -fPIC on Darwin/PPC
--------------------------------+-------------------------------------------
Reporter: PHO | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler
Version: 7.7 | Keywords:
Os: MacOS X | Architecture: powerpc
Failure: Building GHC failed | Blockedby:
Blocking: | Related:
--------------------------------+-------------------------------------------
`PIC.initializePicBase_ppc` was wrongly assuming that only the first block
was an entry point, which resulted in the following panic when we were
compiling `libraries/ghc-prim/dist-install/build/GHC/Classes.dyn_o`:
{{{
ghc-stage1: panic! (the 'impossible' happened)
(GHC version 7.7.20121119 for powerpc-apple-darwin):
allocateRegsAndSpill: Cannot read from uninitialized register
%vI_nawI
}}}
Here is the result of `-ddump-opt-cmm` for the code block in question:
{{{
==================== Optimised Cmm ====================
section "data" {
ghc-prim:GHC.Classes.$dm<={v rbx}_closure:
const ghc-prim:GHC.Classes.$dm<={v rbx}_info;
}
==================== Optimised Cmm ====================
ghc-prim:GHC.Classes.$dm<={v rbx}_entry() // [R4, R3, R2]
{ [(cawk,
ghc-prim:GHC.Classes.$dm<={v rbx}_info:
const 1310723;
const 0;
const 983040;),
(cawl,
block{v cawl}_info:
const 0;
const 2097152;)]
}
{offset
cawk:
/***** FETCHPC is rightly inserted here. *****/
_s7Ce::P32 = R4;
_s7Cd::P32 = R3;
_s7Cc::P32 = R2;
if ((Sp + -16) < SpLim) goto cawA; else goto cawz;
cawA:
R4 = _s7Ce::P32;
R3 = _s7Cd::P32;
R2 = _s7Cc::P32;
R1 = I32[PicBaseReg + Lghc-prim:GHC.Classes.$dm<={v rbx}_closure
$non_lazy_ptr-1b];
call (I32[BaseReg - 4])(R4, R3, R2, R1) args: 4, res: 0, upd: 4;
cawz:
I32[Sp - 4] = PicBaseReg + block{v cawl}_info-1b;
R2 = _s7Cc::P32;
I32[Sp - 16] = I32[PicBaseReg + Lstg_ap_pp_info$non_lazy_ptr-
1b];
P32[Sp - 12] = _s7Cd::P32;
P32[Sp - 8] = _s7Ce::P32;
Sp = Sp - 16;
call ghc-prim:GHC.Classes.compare{v r5v}_info(R2) returns to
cawl, args: 16, res: 4, upd: 4;
cawl:
/***** But not here! This is the cause of panic! *****/
if (R1 & 3 != 3) goto cawt; else goto cawn;
cawt:
R1 = I32[PicBaseReg + Lghc-prim:GHC.Types.True{(w) d 6u}_closure
$non_lazy_ptr-1b] + 2;
Sp = Sp + 4;
call (P32[Sp])(R1) args: 4, res: 0, upd: 4;
cawn:
R1 = I32[PicBaseReg + Lghc-prim:GHC.Types.False{(w) d
68}_closure$non_lazy_ptr-1b] + 1;
Sp = Sp + 4;
call (P32[Sp])(R1) args: 4, res: 0, upd: 4;
}
}
}}}
To pull my
[https://github.com/phonohawk/ghc/commit/f744ccc168bedd4ab358d9bf9a15ca1adf69ae43
patch]:
{{{
% git fetch git://github.com/phonohawk/ghc.git darwin-ppc-pic-fix
}}}
I'm pretty sure that Linux/ppc32 suffers from the same bug too, but I have
no idea how to fix its awfully complicated logic so I have no choice but
to leave it untouched.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7442>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs