void test(void)
{
    struct
    {
        int a, b, c, d, e, f;
    } x;

    x.d = 5;
    asm volatile("in r28, 0x2F" : : : "r28");
    x.d = 6;
}

$ avr-gcc.exe -v
Using built-in specs.
Target: avr
Configured with: ../gcc-4.1.1/configure
--prefix=/c/WinAVR --target=avr
--enable-languages=c,c++ --with-dwarf2
--enable-win32-registry=WinAVR --disable-nls
--disable-libssp --disable-fixincludes
--disable-libada --with-gnu-ld --with-gnu-as
--enable-doc
Thread model: single
gcc version 4.1.1 (WinAVR 20070122)

$ avr-gcc.exe -mmcu=atmega8515 -c test.c -Wall
-gdwarf-2 -o test.o

$ avr-objdump.exe -S test.o
.
:
which compiles to:
.
:
    x.d = 5;
  14:   85 e0           ldi     r24, 0x05       ; 5
  16:   90 e0           ldi     r25, 0x00       ; 0
  18:   98 87           std     Y+8, r25        ; 0x08
  1a:   8f 83           std     Y+7, r24        ; 0x07
    asm volatile("in r28, 0x2F" : : : "r28");
  1c:   cf b5           in      r28, 0x2f       ; 47
    x.d = 6;
  1e:   86 e0           ldi     r24, 0x06       ; 6
  20:   90 e0           ldi     r25, 0x00       ; 0
  22:   98 87           std     Y+8, r25        ; 0x08
  24:   8f 83           std     Y+7, r24        ; 0x07
.
:

As you can see at 0x22 and 0x24, Y is getting used
without being reloaded after r28 is being messed up at 0x1C.

I suspect the problem is that inline asm doesn't want you to use r28 or r29
without restoring them, and I'm fine with that, but gcc should generate some
sort of warning then, if it sees r28 or r29 in the clobber list.


-- 
           Summary: Clobber list isn't working
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: hafeliel at yahoo dot com


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

Reply via email to