#8965: bootstrapping failure on Linux/ppc64el -----------------------------+-------------------------------------------- Reporter: cjwatson | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.8.1-rc2 Keywords: | Operating System: Linux Architecture: powerpc64 | Type of failure: GHC doesn't work at all Difficulty: Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | -----------------------------+-------------------------------------------- A few distributions, including Ubuntu which I work on, have a new little- endian Linux ppc64 port (known variously as ppc64el, ppc64le, powerpc64le, etc.). As well as the obvious endianness difference, this varies from traditional ppc64 in that it uses a new version of the ELF ABI. https://bugs.openjdk.java.net/browse/JDK-8035647 has a useful set of links explaining the changes. I've been trying to bootstrap GHC on this architecture, but I've been running into failures, which I explained here along with my procedure: https://lists.ubuntu.com/archives/ubuntu-devel- discuss/2014-April/014922.html Things that I believe I have ruled out so far: * It's not libffi. In the above procedure I was missing unpacking libffi6:ppc64el in the sysroot and configuring using `--with-system- libffi` (our libffi is newer), but that makes no difference; furthermore, breakpoints set on all exposed `ffi_*` symbols and on `createAdjustor` never fire. * It's not signal handling. I replaced unlit with a shell script that sleeps 5 and then execs the real unlit, and ghc-stage2 segfaulted before it returned; strace shows that SIGSEGV is the first signal received. * It's not buggy native code generation. Although getting an NCG up on this platform might be tractable later, for now I added a `powerpc64le*) $2="powerpc64le" ;;` case before `powerpc64*` to `GHC_CONVERT_CPU` and added powerpc64le to the `ArchUnknown` list in `FPTOOLS_SET_HASKELL_PLATFORM_VARS`. Everything should be going via GCC. * I don't think I'm taking a fundamentally wrong bootstrapping approach; I'm using the exact same procedure and in fact I started from the exact same git tree that I just used to successfully bootstrap GHC on arm64. Here's a gdb trace showing the location of the segfault: {{{ *** Literate pre-processor: ../inplace/lib/unlit -h HelloWorld.lhs HelloWorld.lhs /tmp/ghc6597_0/ghc6597_1.lpp Breakpoint 1, 0x000000001507daac in runInteractiveProcess () (gdb) bt #0 0x000000001507daac in runInteractiveProcess () #1 0x000000001507d968 in c8z6_entry () #2 0x00003fffb7804a20 in ?? () Cannot access memory at address 0xf (gdb) finish Run till exit from #0 0x000000001507daac in runInteractiveProcess () 0x000000001507d968 in c8z6_entry () (gdb) stepi 0x000000001507d96c in c8z6_entry () (gdb) 0x000000001507d970 in c8z6_entry () (gdb) 0x000000001507d974 in c8z6_entry () (gdb) 0x000000001507d978 in c8z6_entry () (gdb) 0x000000001507d97c in c8z6_entry () (gdb) 0x000000001507d980 in c8z6_entry () (gdb) 0x000000001507d984 in c8z6_entry () (gdb) 0x000000001507d988 in c8z6_entry () (gdb) 0x000000001507d98c in c8z6_entry () (gdb) 0x000000001507d990 in c8z6_entry () (gdb) 0x000000001507d994 in c8z6_entry () (gdb) 0x000000001507d998 in c8z6_entry () (gdb) 0x000000001507d99c in c8z6_entry () (gdb) 0x000000001507d9a0 in c8z6_entry () (gdb) 0x000000001507d9a4 in c8z6_entry () (gdb) 0x000000001507d9a8 in c8z6_entry () (gdb) 0x000000001507d9ac in c8z6_entry () (gdb) 0x000000001507d9b0 in c8z6_entry () (gdb) 0x000000001507d9e8 in c8z6_entry () (gdb) Cannot access memory at address 0xf (gdb) disas /rm Dump of assembler code for function c8z6_entry: 0x000000001507d8ec <+0>: 6f 16 40 3c lis r2,5743 0x000000001507d8f0 <+4>: 20 9c 42 38 addi r2,r2,-25568 0x000000001507d8f4 <+8>: a6 02 08 7c mflr r0 0x000000001507d8f8 <+12>: 10 00 01 f8 std r0,16(r1) 0x000000001507d8fc <+16>: c1 ff 21 f8 stdu r1,-64(r1) 0x000000001507d900 <+20>: 00 00 00 60 nop 0x000000001507d904 <+24>: 60 92 22 39 addi r9,r2,-28064 0x000000001507d908 <+28>: 68 03 49 e9 ld r10,872(r9) 0x000000001507d90c <+32>: 10 00 4a 39 addi r10,r10,16 0x000000001507d910 <+36>: 68 03 49 f9 std r10,872(r9) 0x000000001507d914 <+40>: 58 03 69 e9 ld r11,856(r9) 0x000000001507d918 <+44>: 08 00 0b e8 ld r0,8(r11) 0x000000001507d91c <+48>: 70 03 29 e9 ld r9,880(r9) 0x000000001507d920 <+52>: 40 48 aa 7f cmpld cr7,r10,r9 0x000000001507d924 <+56>: 90 00 9d 41 bgt cr7,0x1507d9b4 <c8z6_entry+200> 0x000000001507d928 <+60>: 40 00 6b e8 ld r3,64(r11) 0x000000001507d92c <+64>: 38 00 8b e8 ld r4,56(r11) 0x000000001507d930 <+68>: 48 00 ab e8 ld r5,72(r11) 0x000000001507d934 <+72>: 50 00 cb e8 ld r6,80(r11) 0x000000001507d938 <+76>: 58 00 eb e8 ld r7,88(r11) 0x000000001507d93c <+80>: 10 00 0b e9 ld r8,16(r11) 0x000000001507d940 <+84>: 30 00 2b e9 ld r9,48(r11) 0x000000001507d944 <+88>: 28 00 4b e9 ld r10,40(r11) 0x000000001507d948 <+92>: 20 00 8b e9 ld r12,32(r11) 0x000000001507d94c <+96>: 20 00 81 f9 std r12,32(r1) 0x000000001507d950 <+100>: 00 00 8b e9 ld r12,0(r11) 0x000000001507d954 <+104>: 28 00 81 f9 std r12,40(r1) 0x000000001507d958 <+108>: 30 00 01 f8 std r0,48(r1) 0x000000001507d95c <+112>: 18 00 6b e9 ld r11,24(r11) 0x000000001507d960 <+116>: 38 00 61 f9 std r11,56(r1) 0x000000001507d964 <+120>: 19 01 00 48 bl 0x1507da7c <runInteractiveProcess+8> 0x000000001507d968 <+124>: 00 00 00 60 nop 0x000000001507d96c <+128>: 00 00 00 60 nop 0x000000001507d970 <+132>: 60 92 22 39 addi r9,r2,-28064 0x000000001507d974 <+136>: 68 03 49 e9 ld r10,872(r9) 0x000000001507d978 <+140>: f6 ff e2 3c addis r7,r2,-10 0x000000001507d97c <+144>: 30 17 07 39 addi r8,r7,5936 0x000000001507d980 <+148>: f8 ff 0a f9 std r8,-8(r10) 0x000000001507d984 <+152>: 68 03 49 e9 ld r10,872(r9) 0x000000001507d988 <+156>: b4 07 63 7c extsw r3,r3 0x000000001507d98c <+160>: 00 00 6a f8 std r3,0(r10) 0x000000001507d990 <+164>: 68 03 49 e9 ld r10,872(r9) 0x000000001507d994 <+168>: f9 ff 4a 39 addi r10,r10,-7 0x000000001507d998 <+172>: 18 00 49 f9 std r10,24(r9) 0x000000001507d99c <+176>: 58 03 49 e9 ld r10,856(r9) 0x000000001507d9a0 <+180>: 60 00 0a 39 addi r8,r10,96 0x000000001507d9a4 <+184>: 58 03 09 f9 std r8,856(r9) 0x000000001507d9a8 <+188>: 60 00 2a e9 ld r9,96(r10) 0x000000001507d9ac <+192>: 00 00 69 e8 ld r3,0(r9) 0x000000001507d9b0 <+196>: 38 00 00 48 b 0x1507d9e8 <c8z6_entry+252> 0x000000001507d9b4 <+200>: 00 00 00 60 nop 0x000000001507d9b8 <+204>: 60 92 22 39 addi r9,r2,-28064 0x000000001507d9bc <+208>: 10 00 40 39 li r10,16 0x000000001507d9c0 <+212>: a0 03 49 f9 std r10,928(r9) 0x000000001507d9c4 <+216>: da ff 42 3d addis r10,r2,-38 0x000000001507d9c8 <+220>: 38 36 4a 39 addi r10,r10,13880 0x000000001507d9cc <+224>: f8 ff 4b f9 std r10,-8(r11) 0x000000001507d9d0 <+228>: 18 00 09 f8 std r0,24(r9) 0x000000001507d9d4 <+232>: 58 03 49 e9 ld r10,856(r9) 0x000000001507d9d8 <+236>: f8 ff 4a 39 addi r10,r10,-8 0x000000001507d9dc <+240>: 58 03 49 f9 std r10,856(r9) 0x000000001507d9e0 <+244>: 3b ff e2 3c addis r7,r2,-197 0x000000001507d9e4 <+248>: 60 c0 67 38 addi r3,r7,-16288 0x000000001507d9e8 <+252>: 40 00 21 38 addi r1,r1,64 => 0x000000001507d9ec <+256>: 10 00 01 e8 ld r0,16(r1) ---Type <return> to continue, or q <return> to quit--- 0x000000001507d9f0 <+260>: a6 03 08 7c mtlr r0 0x000000001507d9f4 <+264>: 20 00 80 4e blr 0x000000001507d9f8 <+268>: 00 00 00 00 .long 0x0 0x000000001507d9fc <+272>: 00 00 00 01 .long 0x1000000 0x000000001507da00 <+276>: 80 00 00 00 .long 0x80 End of assembler dump. (gdb) }}} Let me know what else I could try. -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8965> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler