
#8024: Dynamic linking not working on PowerPC Linux. ----------------------------------------------+--------------------------- Reporter: erikd | Owner: Type: bug | Status: patch Priority: normal | Milestone: Component: Compiler | Version: 7.7 Resolution: | Keywords: Operating System: Linux | Architecture: powerpc Type of failure: Building GHC failed | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: Differential Revisions: D560 | ----------------------------------------------+--------------------------- Changes (by slyfox): * status: infoneeded => patch * differential: => D560 Comment: The problem happened to be in code emitting prologs for basic block entries (also got fixed by https://phabricator.haskell.org/D560). Typically haskell function has single entry point (-fPIC -ddump-asm- native): {{{ M.f_info: _ci4: ; PIC prolog bcl 20,31,1f 1: mflr %vI_nic lwz %vI_nij, _nii-(1b)(%vI_nic) add %vI_nic, %vI_nic, %vI_nij ... <HERE GOES ACTUAL CODE> ... ; offset to LCTOC from nearest '1:' .text .align 2 _nii: .long .LCTOC1-(1b)+0 }}} But sometimes runtime needs to return back into a middle of haskell function (try/catch primitives?) and prolog gets emitted at each such point using the same LCTOC offset: {{{ M.f_info: _ci4: ; PIC prolog bcl 20,31,1f 1: mflr %vI_nic ; REF 1 lwz %vI_nij, _nii-(1b)(%vI_nic) add %vI_nic, %vI_nic, %vI_nij ... <HERE GOES ACTUAL CODE> ... returns_here_later: ; PIC prolog bcl 20,31,1f 1: mflr %vI_nic ; REF 2 lwz %vI_nij, _nii-(1b)(%vI_nic) add %vI_nic, %vI_nic, %vI_nij ... ; offset to LCTOC from nearest '1:' .text .align 2 _nii: .long .LCTOC1-(1b)+0 }}} Here '_nii' contains offset to nearest '1:' label, not first one (as intended). It leads to miscomputation of LCTOC1 in function entry (around first '1:' which usually manifests in call to random location. It is fixed by using simpler prolog (similar to what modern gcc emits nowadays): {{{ bcl 20,31,1f 1: mflr %vI_ny4 addis %vI_ny4, %vI_ny4, .LCTOC1-(1b)@ha addi %vI_ny4, %vI_ny4, .LCTOC1-(1b)@l mr 30, %vI_ny4 }}} And it is safe to duplicate. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8024#comment:10 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler