
Before this change, we would pass all non-HFA record arguments on Windows with byval. Byval often blocks optimizations and results in bad code generation. Windows now uses the existing workaround that other x86_32 platforms use. I also expanded the workaround to handle C++ records with constructors on Windows. On non-Windows platforms, we have to keep generating the same LLVM IR prototypes if we want our bitcode to be ABI compatible. Otherwise we will encounter mismatch issues like PR21573. Essentially fixes PR27522 in Clang instead of LLVM. Reviewers: hans Differential Revision: http://reviews.llvm.org/D19756 llvm-svn: 268261
49 lines
951 B
C
49 lines
951 B
C
// RUN: %clang_cc1 -w -triple i386-pc-win32 -emit-llvm -o - %s | FileCheck %s
|
|
|
|
// CHECK-LABEL: define i64 @f1_1()
|
|
// CHECK-LABEL: define void @f1_2(i32 %a0.0, i32 %a0.1)
|
|
struct s1 {
|
|
int a;
|
|
int b;
|
|
};
|
|
struct s1 f1_1(void) { while (1) {} }
|
|
void f1_2(struct s1 a0) {}
|
|
|
|
// CHECK-LABEL: define i32 @f2_1()
|
|
struct s2 {
|
|
short a;
|
|
short b;
|
|
};
|
|
struct s2 f2_1(void) { while (1) {} }
|
|
|
|
// CHECK-LABEL: define i16 @f3_1()
|
|
struct s3 {
|
|
char a;
|
|
char b;
|
|
};
|
|
struct s3 f3_1(void) { while (1) {} }
|
|
|
|
// CHECK-LABEL: define i8 @f4_1()
|
|
struct s4 {
|
|
char a:4;
|
|
char b:4;
|
|
};
|
|
struct s4 f4_1(void) { while (1) {} }
|
|
|
|
// CHECK-LABEL: define i64 @f5_1()
|
|
// CHECK-LABEL: define void @f5_2(double %a0.0)
|
|
struct s5 {
|
|
double a;
|
|
};
|
|
struct s5 f5_1(void) { while (1) {} }
|
|
void f5_2(struct s5 a0) {}
|
|
|
|
// CHECK-LABEL: define i32 @f6_1()
|
|
// CHECK-LABEL: define void @f6_2(float %a0.0)
|
|
struct s6 {
|
|
float a;
|
|
};
|
|
struct s6 f6_1(void) { while (1) {} }
|
|
void f6_2(struct s6 a0) {}
|
|
|