GCC generates odd code sequence..

Part of the source (full source in attachment):

usbd_status
usbd_do_request_flags_pipe(usbd_device_handle dev, usbd_pipe_handle pipe,
        usb_device_request_t *req, void *data, u_int16_t flags, int *actlen,
        u_int32_t timeout)
{
        usbd_xfer_handle xfer;
        usbd_status err;

        xfer = usbd_alloc_xfer(dev);
...


objdump output:

00000000 <usbd_do_request_flags_pipe>:
   0:   b5f0            push    {r4, r5, r6, r7, lr}
   2:   b089            sub     sp, #36
   4:   1c14            adds    r4, r2, #0
   6:   9a0f            ldr     r2, [sp, #60]
   8:   1c1e            adds    r6, r3, #0
   a:   605a            str     r2, [r3, #4]    <-- writes using r3 (data)
   c:   9b10            ldr     r3, [sp, #64]
   e:   9007            str     r0, [sp, #28]
  10:   609b            str     r3, [r3, #8]
  12:   ab0e            add     r3, sp, #56
  14:   9106            str     r1, [sp, #24]
  16:   881f            ldrh    r7, [r3, #0]
  18:   f7ff fffe       bl      0 <usbd_alloc_xfer>


And here's objdump output when compiled with the same options but gcc 4.2.1:

00000000 <usbd_do_request_flags_pipe>:
   0:   b5f0            push    {r4, r5, r6, r7, lr}
   2:   b089            sub     sp, #36
   4:   1c1e            adds    r6, r3, #0
   6:   ab0e            add     r3, sp, #56
   8:   9007            str     r0, [sp, #28]
   a:   9106            str     r1, [sp, #24]
   c:   1c14            adds    r4, r2, #0
   e:   881f            ldrh    r7, [r3, #0]
  10:   f7ff fffe       bl      0 <usbd_alloc_xfer>

Environment:
System: Linux kivi 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686
GNU/Linux
Architecture: i686
host: i686-pc-linux-gnu
build: i686-pc-linux-gnu
target: arm-unknown-elf
configured with: /s/devel/gcc-4.1.1/configure --target=arm-elf --with-gnu-as
--with-gcc --with-gnu-ld --enable-languages=c --disable-libstdc
--disable-hosted-libstdcxx --disable-libstdcxx --disable-libstdcxx-v3
--disable-libstdcxx_v3 --disable-nls --disable-shared --disable-threads
--disable-libmudflap --disable-libssp --disable-libgomp --disable-libstdcxx-pch
--prefix=/emb/arm-elf-gcc-4.1.1 --program-prefix=arm-elf- --program-suffix=
--with-newlib -v --without-headers -v

How-To-Repeat:
Compile the test case like:
# arm-elf-gcc -Os -Wall -Werror -mcpu=arm920t -mlittle-endian -mthumb
-mabi=aapcs -c usbdi.c -o usbdi.o


------- Comment #1 from sami dot kantoluoto at embedtronics dot fi  2007-09-21 
16:29 -------
Fix:
        Work arounds: gcc 4.2.1, optimize for speed instead of size.


-- 
           Summary: Invalid code generated with a combination of thumb,
                    AAPCS and -Os.
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: sami dot kantoluoto at embedtronics dot fi
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: arm-unknown-elf


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33519

Reply via email to