Hi Richard/Joseph,
I noticed, this test case crashes on arm-eabi already witout the patch.
extern void abort (void);
#define test_type unsigned short
#define MAGIC (unsigned short)0x102u
typedef struct s{
unsigned char Prefix[1];
test_type Type;
}__attribute((__packed__,__aligned__(4))) ss;
volatile ss v;
ss g;
void __attribute__((noinline))
foo (test_type u)
{
v.Type = u;
}
test_type __attribute__((noinline))
bar (void)
{
return v.Type;
}
However when compiled with -fno-strict-volatile-bitfields it does not crash,
but AFAIK the generated code for foo() violates the C++ memory model:
foo:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
ldr r2, .L2
ldr r3, [r2]
bic r3, r3, #16711680
bic r3, r3, #65280
orr r3, r3, r0, asl #8
str r3, [r2]
bx lr
On Intel the generated code uses unaligned access, but is OK for the memory
model:
foo:
.LFB0:
.cfi_startproc
movw %di, v+1(%rip)
ret
Am I right, or is the code OK for the Memory model?
Regards
Bernd.