[Bug c/98627] New: GCC emits unaligned memory access instructions causing address error exceptions with the 68000 architecture
noring at nocrew dot org
gcc-bugzilla@gcc.gnu.org
Mon Jan 11 17:22:32 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98627
Bug ID: 98627
Summary: GCC emits unaligned memory access instructions causing
address error exceptions with the 68000 architecture
Product: gcc
Version: 9.3.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: noring at nocrew dot org
Target Milestone: ---
The 68000 architecture requires that (16-bit) word and (32-bit) long memory
accesses are aligned with even addresses, but GCC frequently emits code that
breaks this when compiling with optimisations (O1 or higher). This causes
address error exceptions, which are fatal errors that crash programs.
For example, consider
struct s { char a, b, c, d, e; };
struct s f(char a)
{
return (struct s) { .a = a, .d = 'd' };
}
that GCC with O1 will compile into
00000000 <f>:
0: 2049 moveal %a1,%a0
2: 202f 0004 movel %sp@(4),%d0
6: 42a9 0001 clrl %a1@(1) /* <<<--- unaligned long clear */
a: 1280 moveb %d0,%a1@
c: 137c 0064 0003 moveb #100,%a1@(3)
12: 4e75 rts
where offset 6 has "clrl %a1@(1)", which is an unaligned 32-bit long clear. GCC
can emit several similar variants of this, for example unaligned 16-bit word
clears, and possibly others.
More information about the Gcc-bugs
mailing list