Revert "[X86] Fix i386 struct and union parameter alignment"
This reverts commit d61cb749f4
(SVN:
361934).
According to James suggestion, revert this change. Please ref:
https://reviews.llvm.org/D60748
llvm-svn: 362186
This commit is contained in:
parent
2ab7af29c6
commit
48387ec187
|
@ -1010,7 +1010,6 @@ class X86_32ABIInfo : public SwiftABIInfo {
|
||||||
bool IsWin32StructABI;
|
bool IsWin32StructABI;
|
||||||
bool IsSoftFloatABI;
|
bool IsSoftFloatABI;
|
||||||
bool IsMCUABI;
|
bool IsMCUABI;
|
||||||
bool IsLinuxABI;
|
|
||||||
unsigned DefaultNumRegisterParameters;
|
unsigned DefaultNumRegisterParameters;
|
||||||
|
|
||||||
static bool isRegisterSize(unsigned Size) {
|
static bool isRegisterSize(unsigned Size) {
|
||||||
|
@ -1077,7 +1076,6 @@ public:
|
||||||
IsWin32StructABI(Win32StructABI),
|
IsWin32StructABI(Win32StructABI),
|
||||||
IsSoftFloatABI(SoftFloatABI),
|
IsSoftFloatABI(SoftFloatABI),
|
||||||
IsMCUABI(CGT.getTarget().getTriple().isOSIAMCU()),
|
IsMCUABI(CGT.getTarget().getTriple().isOSIAMCU()),
|
||||||
IsLinuxABI(CGT.getTarget().getTriple().isOSLinux()),
|
|
||||||
DefaultNumRegisterParameters(NumRegisterParameters) {}
|
DefaultNumRegisterParameters(NumRegisterParameters) {}
|
||||||
|
|
||||||
bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
|
bool shouldPassIndirectlyForSwift(ArrayRef<llvm::Type*> scalars,
|
||||||
|
@ -1494,15 +1492,8 @@ unsigned X86_32ABIInfo::getTypeStackAlignInBytes(QualType Ty,
|
||||||
if (Align <= MinABIStackAlignInBytes)
|
if (Align <= MinABIStackAlignInBytes)
|
||||||
return 0; // Use default alignment.
|
return 0; // Use default alignment.
|
||||||
|
|
||||||
if (IsLinuxABI) {
|
// On non-Darwin, the stack type alignment is always 4.
|
||||||
// i386 System V ABI 2.1: Structures and unions assume the alignment of their
|
if (!IsDarwinVectorABI) {
|
||||||
// most strictly aligned component.
|
|
||||||
//
|
|
||||||
// Exclude other System V OS (e.g Darwin, PS4 and FreeBSD) since we don't
|
|
||||||
// want to spend any effort dealing with the ramifications of ABI breaks.
|
|
||||||
return Align;
|
|
||||||
} else if (!IsDarwinVectorABI) {
|
|
||||||
// On non-Darwin and non-Linux, the stack type alignment is always 4.
|
|
||||||
// Set explicit alignment, since we may need to realign the top.
|
// Set explicit alignment, since we may need to realign the top.
|
||||||
return MinABIStackAlignInBytes;
|
return MinABIStackAlignInBytes;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
// RUN: %clang_cc1 -w -fblocks -ffreestanding -triple i386-pc-linux-gnu -emit-llvm -o %t %s
|
|
||||||
// RUN: FileCheck < %t %s
|
|
||||||
|
|
||||||
#include <immintrin.h>
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
int d[4];
|
|
||||||
__m128 m;
|
|
||||||
} M128;
|
|
||||||
|
|
||||||
extern void foo(int, ...);
|
|
||||||
|
|
||||||
M128 a;
|
|
||||||
|
|
||||||
// CHECK-LABEL: define void @test
|
|
||||||
// CHECK: entry:
|
|
||||||
// CHECK: call void (i32, ...) @foo(i32 1, %union.M128* byval align 16
|
|
||||||
// CHECK: call void (i32, ...) @foo(i32 1, <4 x float>
|
|
||||||
|
|
||||||
void test(void)
|
|
||||||
{
|
|
||||||
foo(1, a);
|
|
||||||
foo(1, a.m);
|
|
||||||
}
|
|
||||||
|
|
|
@ -3,21 +3,21 @@
|
||||||
|
|
||||||
// CHECK-LABEL: define void @f56(
|
// CHECK-LABEL: define void @f56(
|
||||||
// CHECK: i8 signext %a0, %struct.s56_0* byval align 4 %a1,
|
// CHECK: i8 signext %a0, %struct.s56_0* byval align 4 %a1,
|
||||||
// CHECK: i64 %a2.coerce, %struct.s56_1* byval align 8 %a3,
|
// CHECK: i64 %a2.coerce, %struct.s56_1* byval align 4,
|
||||||
// CHECK: <1 x double> %a4, %struct.s56_2* byval align 8 %a5,
|
// CHECK: <1 x double> %a4, %struct.s56_2* byval align 4,
|
||||||
// CHECK: <4 x i32> %a6, %struct.s56_3* byval align 16 %a7,
|
// CHECK: <4 x i32> %a6, %struct.s56_3* byval align 4,
|
||||||
// CHECK: <2 x double> %a8, %struct.s56_4* byval align 16 %a9,
|
// CHECK: <2 x double> %a8, %struct.s56_4* byval align 4,
|
||||||
// CHECK: <8 x i32> %a10, %struct.s56_5* byval align 32 %a11,
|
// CHECK: <8 x i32> %a10, %struct.s56_5* byval align 4,
|
||||||
// CHECK: <4 x double> %a12, %struct.s56_6* byval align 32 %a13)
|
// CHECK: <4 x double> %a12, %struct.s56_6* byval align 4)
|
||||||
|
|
||||||
// CHECK: call void (i32, ...) @f56_0(i32 1,
|
// CHECK: call void (i32, ...) @f56_0(i32 1,
|
||||||
// CHECK: i32 %{{.*}}, %struct.s56_0* byval align 4 %{{[^ ]*}},
|
// CHECK: i32 %{{.*}}, %struct.s56_0* byval align 4 %{{[^ ]*}},
|
||||||
// CHECK: i64 %{{[^ ]*}}, %struct.s56_1* byval align 8 %{{[^ ]*}},
|
// CHECK: i64 %{{[^ ]*}}, %struct.s56_1* byval align 4 %{{[^ ]*}},
|
||||||
// CHECK: <1 x double> %{{[^ ]*}}, %struct.s56_2* byval align 8 %{{[^ ]*}},
|
// CHECK: <1 x double> %{{[^ ]*}}, %struct.s56_2* byval align 4 %{{[^ ]*}},
|
||||||
// CHECK: <4 x i32> %{{[^ ]*}}, %struct.s56_3* byval align 16 %{{[^ ]*}},
|
// CHECK: <4 x i32> %{{[^ ]*}}, %struct.s56_3* byval align 4 %{{[^ ]*}},
|
||||||
// CHECK: <2 x double> %{{[^ ]*}}, %struct.s56_4* byval align 16 %{{[^ ]*}},
|
// CHECK: <2 x double> %{{[^ ]*}}, %struct.s56_4* byval align 4 %{{[^ ]*}},
|
||||||
// CHECK: <8 x i32> %{{[^ ]*}}, %struct.s56_5* byval align 32 %{{[^ ]*}},
|
// CHECK: <8 x i32> %{{[^ ]*}}, %struct.s56_5* byval align 4 %{{[^ ]*}},
|
||||||
// CHECK: <4 x double> %{{[^ ]*}}, %struct.s56_6* byval align 32 %{{[^ ]*}})
|
// CHECK: <4 x double> %{{[^ ]*}}, %struct.s56_6* byval align 4 %{{[^ ]*}})
|
||||||
// CHECK: }
|
// CHECK: }
|
||||||
//
|
//
|
||||||
// <rdar://problem/7964854> [i386] clang misaligns long double in structures
|
// <rdar://problem/7964854> [i386] clang misaligns long double in structures
|
||||||
|
|
Loading…
Reference in New Issue