# testcase
typedef volatile unsigned mutex;
void lockMutex(mutex* m)
{
while (*m != 1);
*m = 0;
}
void unlockMutex(mutex* m)
{
*m = 0;
}
*** GCC 3.4.2-20040916 ***
00000000 <lockMutex>:
0: e5903000 ldr r3, [r0]
4: e3530001 cmp r3, #1 ; 0x1
8: 1afffffe bne 8 <lockMutex+0x8> <== should jump to 0x00.
c: e2433001 sub r3, r3, #1 ; 0x1
10: e5803000 str r3, [r0]
14: e1a0f00e mov pc, lr
00000018 <unlockMutex>:
18: e3a03000 mov r3, #0 ; 0x0
1c: e5803000 str r3, [r0]
20: e1a0f00e mov pc, lr
*** IAR C compiler ***
lockMutex:
0x00000180 E5901000 LDR R1, [R0, #+0]
0x00000184 E3510001 CMP R1, #0x1
0x00000188 1AFFFFFC BNE lockMutex ; 0x180 <=== this works fine.
0x0000018C E3A01000 MOV R1, #0x0
0x00000190 E5801000 STR R1, [R0, #+0]
0x00000194 E12FFF1E BX LR
unlockMutex:
0x00000198 E3A01000 MOV R1, #0x0
0x0000019C E5801000 STR R1, [R0, #+0]
0x000001A0 E12FFF1E BX LR
# arm-elf-gcc -v
Reading specs from c:/winarm/bin/../lib/gcc/arm-elf/3.4.2/specs
Configured with: ../../gcc-3.4.2-20040916-1/configure --enable-languages=c,c++
--enable-interwork --enable-multilib --with-gcc --with-gnu-ld --with-gnu-as
--with-stabs --disable-shared --disable-threads --disable-win32-registry
--disable-nls --target=arm-elf --with-newlib
--with-headers=/c/winarms/newlib-1.12.0/newlib/libc/include --prefix=c:/WinARM/
-v : (reconfigured) ../../gcc-3.4.2-20040916-1/configure
--enable-languages=c,c++ --enable-interwork --enable-multilib --with-gcc
--with-gnu-ld --with-gnu-as --with-stabs --disable-shared --disable-threads
--disable-win32-registry --disable-nls --target=arm-elf --with-newlib
--prefix=c:/WinARM/ -v
Thread model: single
gcc version 3.4.2 (mingw-special)
--
Summary: volatile attr. doesn't work with pointers / wrong code
Product: gcc
Version: 3.4.2
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: other
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: pluto at pld-linux dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC host triplet: mingw
GCC target triplet: arm-elf
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19088