https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79065
Bug ID: 79065
Summary: ARM generates ldm/stm on packed structs with aligned
members
Product: gcc
Version: 5.4.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: vielster at zee dot aero
Target Milestone: ---
LDM/STM do not support unaligned access, so packed structs should not be
accessed in this way. If internal members of the struct are aligned to pad for
inter-platform compatibility (in this case, variable enum size), GCC generates
LDM/STM and can cause unaligned access faults.
Below is the code and the assembly generated with arm-none-eabi-gcc -O1
#include
typedef struct __attribute__((__packed__))
{
uint32_t a;
uint8_t b __attribute__((aligned(4)));
uint8_t c;
}foo_t;
void struct_copy(foo_t *p_dest, foo_t *p_src)
{
*p_src = *p_dest;
}
struct_copy(foo_t*, foo_t*):
mov r3, r1
ldmia r0, {r0, r1}
stmia r3, {r0, r1}
bx lr