I've found the holy grail. Problem is happening if you are using a pointer to a struct. Normally, while accessing to that struct members, nothing is wrong, it accesses word by word. But if you declare a pointer to that struct and do your business with it, problem arises and GCC starts using byte by byte method even while unaligned access is enabled.
Here's worse part: It doesn't matter whether you use -fpack-struct flag or #pragma pack(push, 1). You'll get the same result.
Please find the simplest example as attachment. And use this line (don't forget to add your toolchains path in the beginning)
I've found the holy grail. Problem is happening if you are using a pointer to a struct. Normally, while accessing to that struct members, nothing is wrong, it accesses word by word. But if you declare a pointer to that struct and do your business with it, problem arises and GCC starts using byte by byte method even while unaligned access is enabled.
Here's worse part: It doesn't matter whether you use -fpack-struct flag or #pragma pack(push, 1). You'll get the same result.
Please find the simplest example as attachment. And use this line (don't forget to add your toolchains path in the beginning)
arm-none-eabi-g++ -gdwarf-2 -mcpu=cortex-m3 -mthumb -std=c++1y '-DDEBUG=1' -O0 -pedantic -Wall -Wextra -c -fmessage-length=0 -fno-rtti -fno-exceptions -mno-sched-prolog -fno-builtin -fshort-enums -ffunction-sections -fdata-sections -MMD -MP -MF"main.d" -MT"main.o" -S -o "main.s" "main.cpp"
Here's the output of the important part:
.LCFI2: cfa_register 7
.cfi_def_
.loc 1 17 0
ldr r2, .L3
mov r3, r7
str r3, [r2]
.loc 1 19 0
ldr r3, .L3
ldr r3, [r3]
ldrb r2, [r3]
movs r2, #0
orr r2, r2, #1
strb r2, [r3]
ldrb r2, [r3, #1]
movs r2, #0
orr r2, r2, #4
strb r2, [r3, #1]
ldrb r2, [r3, #2]
movs r2, #0
strb r2, [r3, #2]
ldrb r2, [r3, #3]
movs r2, #0
strb r2, [r3, #3]
I would be glad if anyone can pinpoint the root cause. Things should be gone bad between 4.9 and 5.4.
Regards,