[GHC] #10375: arm: ghci hits an illegal instruction

GHC ghc-devs at haskell.org
Fri Sep 18 10:42:04 UTC 2015


#10375: arm: ghci hits an illegal instruction
-------------------------------------+-------------------------------------
        Reporter:  erikd             |                   Owner:
            Type:  bug               |                  Status:  new
        Priority:  high              |               Milestone:  7.10.3
       Component:  Runtime System    |                 Version:  7.10.1
  (Linker)                           |
      Resolution:                    |                Keywords:
Operating System:  Unknown/Multiple  |            Architecture:  arm
 Type of failure:  GHCi crash        |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:                    |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by erikd):

 Notice that when it crashes the back trace looks like:

 {{{
 (gdb) bt
 #0  0xb6ff0024 in ?? ()
 #1  0x70000000 in ?? ()
 }}}

 The address of the previous function (the value `0x70000000`) is a bit
 strange. If comes from the link register, `lr`:

 {{{
 (gdb) info registers
 r0             0xb6ff0018       3070165016
 r1             0x28     40
 r2             0x1      1
 r3             0x70000000       1879048192
 r4             0x2350b50        37030736
 r5             0xb38c4a0c       3012315660
 r6             0xb5187d24       3038280996
 r7             0xb38c4b30       3012315952
 r8             0xb2ad2c38       2997693496
 r9             0x7fffffff       2147483647
 r10            0x1e6cef4        31903476
 r11            0xb38c4750       3012314960
 r12            0x235036c        37028716
 sp             0xb59fcd70       0xb59fcd70
 lr             0x70000000       1879048192
 pc             0xb6ff0024       0xb6ff0024
 cpsr           0x400f0010       1074724880
 }}}

 So lets run the program under GDB and break on `$lr == 0x70000000` :

 {{{
 (gdb) break main
 Breakpoint 1 at 0x93b08
 (gdb) r
 Starting program: /home/erikd/Git/ghc-upstream/inplace/lib/bin/ghc-stage2
  -B/home/erikd/Git/ghc-upstream/inplace/lib --interactive
 [Thread debugging using libthread_db enabled]
 Using host libthread_db library "/lib/arm-linux-
 gnueabihf/libthread_db.so.1".

 Breakpoint 1, 0x00093b08 in main ()
 (gdb) watch $lr == 0x70000000
 Watchpoint 2: $lr == 0x70000000
 (gdb) c
 Continuing.
 [New Thread 0xb6bff460 (LWP 5344)]
 [New Thread 0xb61ff460 (LWP 5345)]
 [New Thread 0xb59ff460 (LWP 5346)]

 Program received signal SIGILL, Illegal instruction.
 strlen () at ../ports/sysdeps/arm/armv6t2/strlen.S:82
 82      ../ports/sys
 }}}

 so we're back to `SIGILL`, but the assembly looks mostly sane:

 {{{
 (gdb) disass 0xb6fe8800
 Dump of assembler code for function strlen:
    0xb6fe8800 <+0>:     pld     [r0]
    0xb6fe8804 <+4>:     strd    r4, r5, [sp, #-8]!
    0xb6fe8808 <+8>:     bic.w   r1, r0, #7
    0xb6fe880c <+12>:    mvn.w   r12, #0
    0xb6fe8810 <+16>:    ands.w  r4, r0, #7
    0xb6fe8814 <+20>:    pld     [r1, #32]
    0xb6fe8818 <+24>:    bne.w   0xb6fe88ae <strlen+174>
    0xb6fe881c <+28>:    mov.w   r4, #0
 => 0xb6fe8820 <+32>:    mvn.w   r0, #7
    0xb6fe8824 <+36>:    ldrd    r2, r3, [r1]
    0xb6fe8828 <+40>:    pld     [r1, #64]       ; 0x40
    0xb6fe882c <+44>:    add.w   r0, r0, #8
 }}}

 I'm not sure why GDB thinks this is within the `strlen` function. If I
 disassemble `strlen` I get the same assembler instructions, but at a
 different address:

 {{{
 (gdb) disass strlen
 Dump of assembler code for function strlen:
    0xb6dbdb40 <+0>:     pld     [r0]
    0xb6dbdb44 <+4>:     strd    r4, r5, [sp, #-8]!
    0xb6dbdb48 <+8>:     bic.w   r1, r0, #7
    0xb6dbdb4c <+12>:    mvn.w   r12, #0
    0xb6dbdb50 <+16>:    ands.w  r4, r0, #7
    0xb6dbdb54 <+20>:    pld     [r1, #32]
    0xb6dbdb58 <+24>:    bne.w   0xb6dbdbee <strlen+174>
    0xb6dbdb5c <+28>:    mov.w   r4, #0
    0xb6dbdb60 <+32>:    mvn.w   r0, #7
    0xb6dbdb64 <+36>:    ldrd    r2, r3, [r1]
    0xb6dbdb68 <+40>:    pld     [r1, #64]       ; 0x40
    0xb6dbdb6c <+44>:    add.w   r0, r0, #8
 }}}

 This does not make sense!

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10375#comment:57>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list