https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89177

            Bug ID: 89177
           Summary: unaligned memory access in libphobos
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bernd.edlinger at hotmail dot de
  Target Milestone: ---

While bootstrapping gcc on an ARMv7 target,
I observe many kernel messages as follows, when running the testsuite:
Alignment trap: unittest_static (23723) PC=0x00e280e4 Instr=0xe893000e
Address=0x7e8100b5 FSR 0x011


disassembly of armv7l-unknown-linux-gnueabihf/libphobos/src/unittest_static

  e28080:       e51b30d8        ldr     r3, [fp, #-216] ; 0xffffff28
  e28084:       e51b2008        ldr     r2, [fp, #-8]
  e28088:       e1520003        cmp     r2, r3
  e2808c:       2a00001b        bcs     e28100
<_D3std6digest10murmurhash28__T11MurmurHash3Vki128Vki32Z11MurmurHash33putMFNaNbNiNfMAxhXv+0x468>
  e28090:       e51b20d4        ldr     r2, [fp, #-212] ; 0xffffff2c
  e28094:       e51b30d8        ldr     r3, [fp, #-216] ; 0xffffff28
  e28098:       e51b1008        ldr     r1, [fp, #-8]
  e2809c:       e1510003        cmp     r1, r3
  e280a0:       3a000008        bcc     e280c8
<_D3std6digest10murmurhash28__T11MurmurHash3Vki128Vki32Z11MurmurHash33putMFNaNbNiNfMAxhXv+0x430>
  e280a4:       e59f21b4        ldr     r2, [pc, #436]  ; e28260
<_D3std6digest10murmurhash28__T11MurmurHash3Vki128Vki32Z11MurmurHash33putMFNaNbNiNfMAxhXv+0x5c8>
  e280a8:       e08f2002        add     r2, pc, r2
  e280ac:       e24b3048        sub     r3, fp, #72     ; 0x48
  e280b0:       e8920003        ldm     r2, {r0, r1}
  e280b4:       e8830003        stm     r3, {r0, r1}
  e280b8:       e3002207        movw    r2, #519        ; 0x207
  e280bc:       e24b3048        sub     r3, fp, #72     ; 0x48
  e280c0:       e8930003        ldm     r3, {r0, r1}
  e280c4:       eb4cef27        bl      2163d68 <_d_arraybounds>
  e280c8:       e51b3008        ldr     r3, [fp, #-8]
  e280cc:       e1a03203        lsl     r3, r3, #4
  e280d0:       e0823003        add     r3, r2, r3
  e280d4:       e50b3018        str     r3, [fp, #-24]  ; 0xffffffe8
  e280d8:       e51b3018        ldr     r3, [fp, #-24]  ; 0xffffffe8
  e280dc:       e593200c        ldr     r2, [r3, #12]
  e280e0:       e58d2000        str     r2, [sp]
  e280e4:       e893000e        ldm     r3, {r1, r2, r3}
  e280e8:       e51b00e0        ldr     r0, [fp, #-224] ; 0xffffff20
  e280ec:       ebfffa47        bl      e26a10
<_D3std6digest10murmurhash28__T11MurmurHash3Vki128Vki32Z11MurmurHash310putElementMFNaNbNiNfG4kZv>
  e280f0:       e51b3008        ldr     r3, [fp, #-8]
  e280f4:       e2833001        add     r3, r3, #1
  e280f8:       e50b3008        str     r3, [fp, #-8]
  e280fc:       eaffffdf        b       e28080
<_D3std6digest10murmurhash28__T11MurmurHash3Vki128Vki32Z11MurmurHash33putMFNaNbNiNfMAxhXv+0x3e8>


ldm is not able to use unaligned memory address in r3,
the kernel trap emuates the ldm and complains afterwards.

The debug info points to this which looks like invalid, casting
unaligned data to 4-byte aligned Element:

(gdb) b *0x00e280e4
Breakpoint 1 at 0xe280e4: file
../../../../gcc-9-20190127/libphobos/src/std/digest/murmurhash.d, line 521.


        const numElements = data.length / Element.sizeof;
        const remainderStart = numElements * Element.sizeof;
        foreach (ref const Element block; cast(const(Element[]))(data[0 ..
remainderStart]))
        {
            putElement(block);
        }

Reply via email to