#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
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to