#7510: Immediate seg-fault on 32-bit windows build
---------------------------------+------------------------------------------
    Reporter:  simonpj           |       Owner:                  
        Type:  bug               |      Status:  new             
    Priority:  highest           |   Milestone:  7.8.1           
   Component:  Compiler          |     Version:  7.6.1           
    Keywords:                    |          Os:  Unknown/Multiple
Architecture:  Unknown/Multiple  |     Failure:  None/Unknown    
  Difficulty:  Unknown           |    Testcase:                  
   Blockedby:                    |    Blocking:                  
     Related:                    |  
---------------------------------+------------------------------------------

Comment(by joeyadams):

 I think I found the bug, introduced by commit 0b0a41f: "Teach the linear
 register allocator how to allocate more stack if necessary"

 Somewhere in compiler/nativeGen/AsmCodeGen.lhs:

 {{{
 -- do linear register allocation
 let reg_alloc proc = do
        (alloced, maybe_more_stack, ra_stats) <-
                Linear.regAlloc dflags proc
        case maybe_more_stack of
          Nothing -> return ( alloced, ra_stats )
          Just amount ->
            return ( ncgAllocMoreStack ncgImpl amount alloced
                   , ra_stats )
 }}}

 ncgAllocMoreStack is implemented by X86.Instr.allocMoreStack:

 {{{
 allocMoreStack
   :: Platform
   -> Int
   -> NatCmmDecl statics X86.Instr.Instr
   -> NatCmmDecl statics X86.Instr.Instr

 allocMoreStack _ _ top@(CmmData _ _) = top
 allocMoreStack platform amount (CmmProc info lbl live (ListGraph code)) =
         CmmProc info lbl live (ListGraph (map insert_stack_insns code))
   where
     alloc   = mkStackAllocInstr platform amount
     dealloc = mkStackDeallocInstr platform amount
 ...
 }}}

 mkStackAllocInstr is implemented by x86_mkStackAllocInstr:

 {{{
 x86_mkStackAllocInstr
         :: Platform
         -> Int
         -> Instr
 x86_mkStackAllocInstr platform amount
   = case platformArch platform of
       ArchX86    -> SUB II32 (OpImm (ImmInt amount)) (OpReg esp)
       ArchX86_64 -> SUB II64 (OpImm (ImmInt amount)) (OpReg rsp)
       _ -> panic "x86_mkStackAllocInstr"
 }}}

 It looks to me like the amount is never multiplied to convert from slots
 to bytes.

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7510#comment:4>
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