[Bug c/87942] New: every int seems to be unaligned in packed structure
johannes.vetter@dom-sicherheitstechnik.de
gcc-bugzilla@gcc.gnu.org
Thu Nov 8 14:39:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87942
Bug ID: 87942
Summary: every int seems to be unaligned in packed structure
Product: gcc
Version: 8.2.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: johannes.vetter@dom-sicherheitstechnik.de
Target Milestone: ---
testcode:
#pragma pack(1)
typedef struct
{
volatile int cmd;
} test_t;
#pragma pack(0)
test_t test;
int read32()
{
test.cmd = 11;
return 0;
}
host: win/linux x86_64
target: arm, STM32L471
gcc versions: 4.8.3 (ok), bugs in: 5.4.1, 6.3.0, 7.2.1, 8.2.0
---
since version gcc version>=5 there seems to be a bug if pragma pack(1) is used.
gcc thinks test.cmd is missaligned, but it isn't.
The code is ok in gcc version 4. The code with AND without pack(1) should be
identical in this example.
The inner code should be something like this:
mov r2, #11
str r2, [r3, #0]
but with pack(1):
mov r1, #11
mov r2, #0
ldr r3, .L3
ldrb r0, [r3] @ zero_extendqisi2
strb r1, [r3]
ldrb r1, [r3, #1] @ zero_extendqisi2
strb r2, [r3, #1]
ldrb r1, [r3, #2] @ zero_extendqisi2
strb r2, [r3, #2]
mov r0, r2
ldrb r1, [r3, #3] @ zero_extendqisi2
strb r2, [r3, #3]
The problem is that the variable in this case is a special function register of
the chip and have to be accessed in 32bit only. Every 8bit access to this
register crashes the system.
It would be nice, if there is a compiler switch, which leeds into an error, if
a volatile variable can't be read/write in one single access.
More information about the Gcc-bugs
mailing list