Quellcode durchsuchen

Revert "[X86] Fix i386 struct and union parameter alignment"

This reverts commit d61cb749f4ac2c90244906d756e80a5c4a7ffa89 (SVN:
361934).

According to James suggestion, revert this change. Please ref:
https://reviews.llvm.org/D60748

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@362186 91177308-0d34-0410-b5e6-96231b3b80d8
Pengfei Wang vor 6 Jahren
Ursprung
Commit
e11ffa2699
3 geänderte Dateien mit 14 neuen und 48 gelöschten Zeilen
  1. 2 11
      lib/CodeGen/TargetInfo.cpp
  2. 0 25
      test/CodeGen/x86_32-align-linux.c
  3. 12 12
      test/CodeGen/x86_32-arguments-linux.c

+ 2 - 11
lib/CodeGen/TargetInfo.cpp

@@ -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) {
-    // i386 System V ABI 2.1: Structures and unions assume the alignment of their
-    // 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.
+  // On non-Darwin, the stack type alignment is always 4.
+  if (!IsDarwinVectorABI) {
     // 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;
   }
   }

+ 0 - 25
test/CodeGen/x86_32-align-linux.c

@@ -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);
-}
-

+ 12 - 12
test/CodeGen/x86_32-arguments-linux.c

@@ -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: <1 x double> %a4, %struct.s56_2* byval align 8 %a5,
-// CHECK: <4 x i32> %a6, %struct.s56_3* byval align 16 %a7,
-// CHECK: <2 x double> %a8, %struct.s56_4* byval align 16 %a9,
-// CHECK: <8 x i32> %a10, %struct.s56_5* byval align 32 %a11,
-// CHECK: <4 x double> %a12, %struct.s56_6* byval align 32 %a13)
+// CHECK: i64 %a2.coerce, %struct.s56_1* byval align 4,
+// CHECK: <1 x double> %a4, %struct.s56_2* byval align 4,
+// CHECK: <4 x i32> %a6, %struct.s56_3* byval align 4,
+// CHECK: <2 x double> %a8, %struct.s56_4* byval align 4,
+// CHECK: <8 x i32> %a10, %struct.s56_5* byval align 4,
+// 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: <1 x double> %{{[^ ]*}}, %struct.s56_2* byval align 8 %{{[^ ]*}},
-// CHECK: <4 x i32> %{{[^ ]*}}, %struct.s56_3* byval align 16 %{{[^ ]*}},
-// CHECK: <2 x double> %{{[^ ]*}}, %struct.s56_4* byval align 16 %{{[^ ]*}},
-// CHECK: <8 x i32> %{{[^ ]*}}, %struct.s56_5* byval align 32 %{{[^ ]*}},
-// CHECK: <4 x double> %{{[^ ]*}}, %struct.s56_6* byval align 32 %{{[^ ]*}})
+// CHECK: i64 %{{[^ ]*}}, %struct.s56_1* byval align 4 %{{[^ ]*}},
+// CHECK: <1 x double> %{{[^ ]*}}, %struct.s56_2* byval align 4 %{{[^ ]*}},
+// CHECK: <4 x i32> %{{[^ ]*}}, %struct.s56_3* byval align 4 %{{[^ ]*}},
+// CHECK: <2 x double> %{{[^ ]*}}, %struct.s56_4* byval align 4 %{{[^ ]*}},
+// CHECK: <8 x i32> %{{[^ ]*}}, %struct.s56_5* byval align 4 %{{[^ ]*}},
+// 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