diff options
author | Pengfei Wang <pengfei.wang@intel.com> | 2019-05-29 08:42:35 +0000 |
---|---|---|
committer | Pengfei Wang <pengfei.wang@intel.com> | 2019-05-29 08:42:35 +0000 |
commit | d61cb749f4ac2c90244906d756e80a5c4a7ffa89 (patch) | |
tree | 19ae589c7adcebd0b0ec17507e2e44cc0002a591 /llvm/lib/CodeGen/MachineModuleInfo.cpp | |
parent | 4f58ad4e720df4c265271907758b3daffbf764d2 (diff) | |
download | llvm-d61cb749f4ac2c90244906d756e80a5c4a7ffa89.zip llvm-d61cb749f4ac2c90244906d756e80a5c4a7ffa89.tar.gz llvm-d61cb749f4ac2c90244906d756e80a5c4a7ffa89.tar.bz2 |
[X86] Fix i386 struct and union parameter alignment
According to i386 System V ABI 2.1: Structures and unions assume the
alignment of their most strictly aligned component. But current
implementation always takes them as 4-byte aligned which will result
in incorrect code, e.g:
1 #include <immintrin.h>
2 typedef union {
3 int d[4];
4 __m128 m;
5 } M128;
6 extern void foo(int, ...);
7 void test(void)
8 {
9 M128 a;
10 foo(1, a);
11 foo(1, a.m);
12 }
The first call (line 10) takes the second arg as 4-byte aligned while
the second call (line 11) takes the second arg as 16-byte aligned.
There is oxymoron for the alignment of the 2 calls because they should
be the same.
This patch fixes the bug by following i386 System V ABI and apply it to
Linux only since other System V OS (e.g Darwin, PS4 and FreeBSD) don't
want to spend any effort dealing with the ramifications of ABI breaks
at present.
Patch by Wei Xiao (wxiao3)
Differential Revision: https://reviews.llvm.org/D60748
llvm-svn: 361934
Diffstat (limited to 'llvm/lib/CodeGen/MachineModuleInfo.cpp')
0 files changed, 0 insertions, 0 deletions