Skip to content
  • Erik de Castro Lopo's avatar
    Fix GHCi on Arm (#10375). · 933adc0f
    Erik de Castro Lopo authored
    Arm has two instruction sets, Arm and Thumb, and an execution mode for each.
    Executing Arm code in Thumb mode or vice-versa will likely result in an
    Illegal instruction exception.
    
    Furthermore, Haskell code compiled via LLVM was generating Arm instructions
    while C code compiled via GCC was generating Thumb code by default. When
    these two object code types were being linked by the system linker, all was
    fine, because the system linker knows how to jump and call from one
    instruction set to the other.
    
    The first problem was with GHCi's object code loader which did not know
    about Thumb vs Arm. When loading an object file `StgCRun` would jump
    into the loaded object which could change the mode causing a crash after
    it returned. This was fixed by forcing all C code to generate Arm
    instructions by passing `-marm` to GCC.
    
    The second problem was the `mkJumpToAddr` function which was generating
    Thumb instructions. Changing that to generate Arm instructions instead
    results in a working GHCi on Arm.
    
    Test Plan: validate on x86_64 and arm
    
    Reviewers: bgamari, austin, hvr
    
    Subscribers: thomie
    
    Differential Revision: https://phabricator.haskell.org/D1323
    
    GHC Trac Issues: #10375
    933adc0f