In this case ldm is loading at alignment address. It is just loaded
more than sizeof a. So it can be the bus that does not permit
accessing memory beyond address range of a. Such a case I don't
believe compiler is doing wrong.

On Mon, May 18, 2015 at 4:50 PM, Richard Earnshaw
<richard.earns...@foss.arm.com> wrote:
> On 18/05/15 10:05, Umesh Kalappa wrote:
>> Hi All,
>>
>> Getting a bus/hard error for the below case ,make sense since ldm/stm
>> expects the address to be word aligned .
>>
>> bash-4.1$ cat test.c
>> struct test
>> {
>>         char c;
>>         int i;
>> } __attribute__((packed));
>>
>> struct test a,b;
>>
>> int main()
>> {
>>         a =b ; //here compiler is not sure that a or b is word aligned
>>         return a.i;
>> }
>>
>> bash-4.1$ arm-eabi-gcc -v
>> Using built-in specs.
>> COLLECT_GCC=arm-eabi-gcc
>> COLLECT_LTO_WRAPPER=/nobackup/ukalappa/build/gcc/mv-ga/c4.7.0-p1/x86_64-linux/libexec/gcc/arm-eabi/4.7.0/lto-wrapper
>> Target: arm-eabi
>> Configured with: /nobackup/ukalappa/src/gcc/mv-ga/gcc/configure
>> --srcdir=/nobackup/ukalappa/src/gcc/mv-ga/gcc --build=x86_64-linux
>> --target=arm-eabi --host=x86_64-linux
>> --prefix=/nobackup/ukalappa/build/gcc/mv-ga/c4.7.0-p1
>> --exec-prefix=/nobackup/ukalappa/build/gcc/mv-ga/c4.7.0-p1/x86_64-linux
>> --with-pkgversion='Cisco GCC c4.7.0-p1' --with-cisco-patch-level=1
>> --with-cisco-patch-level-minor=0
>> --with-bugurl=http://wwwin.cisco.com/it/services/
>> --disable-maintainer-mode --enable-languages=c,c++ --disable-nls
>> Thread model: single
>> gcc version 4.7.0
>>
>> bash-4.1$ ./arm-eabi-gcc -march=armv7 -mthumb  -S test.c
>>
>> bash-4.1$ cat test.s
>>         .syntax unified
>>         .arch armv7
>>         .fpu softvfp
>>         .eabi_attribute 20, 1
>>         .eabi_attribute 21, 1
>>         .eabi_attribute 23, 3
>>         .eabi_attribute 24, 1
>>         .eabi_attribute 25, 1
>>         .eabi_attribute 26, 1
>>         .eabi_attribute 30, 6
>>         .eabi_attribute 34, 1
>>         .eabi_attribute 18, 4
>>         .thumb
>>         .file   "test.c"
>>         .comm   a,5,4
>>         .comm   b,5,4
>
> The above two lines create (common) instances of a and b that are 4-byte
> aligned, so the LDM should not be faulting in this case, unless your
> binutils have ignored the alignment constraints.
>
> I don't think the compiler has done the wrong thing here.
>
> R.
>
>>         .text
>>         .align  2
>>         .global main
>>         .thumb
>>         .thumb_func
>>         .type   main, %function
>> main:
>>         @ args = 0, pretend = 0, frame = 0
>>         @ frame_needed = 1, uses_anonymous_args = 0
>>         @ link register save eliminated.
>>         push    {r7}
>>         add     r7, sp, #0
>>         movw    r3, #:lower16:a
>>         movt    r3, #:upper16:a
>>         movw    r2, #:lower16:b
>>         movt    r2, #:upper16:b
>>         ldmia   r2, {r0, r1}   //Bus error
>>         str     r0, [r3]
>>         adds    r3, r3, #4
>>         strb    r1, [r3]
>>         movw    r3, #:lower16:a
>>         movt    r3, #:upper16:a
>>         ldr     r3, [r3, #1]    @ unaligned
>>         mov     r0, r3
>>         mov     sp, r7
>>         pop     {r7}
>>         bx      lr
>>         .size   main, .-main
>>
>>
>> Arm states that ldm/stm should be word aligned and generating ldm/stm
>> in the above case is the compiler error/bug ,do you guys agree with me
>> or i'm missing something here ?
>>
>>
>> Thank you
>> ~Umesh
>>
>

Reply via email to