
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
43 lines
777 B
C
43 lines
777 B
C
// RUN: %clang_cc1 -triple i686-windows-itanium -emit-llvm -o - %s | FileCheck %s
|
|
|
|
struct f1 {
|
|
float f;
|
|
};
|
|
|
|
struct f1 return_f1(void) { while (1); }
|
|
|
|
// CHECK: define i32 @return_f1()
|
|
|
|
void receive_f1(struct f1 a0) { }
|
|
|
|
// CHECK: define void @receive_f1(float %a0.0)
|
|
|
|
struct f2 {
|
|
float f;
|
|
float g;
|
|
};
|
|
|
|
struct f2 return_f2(void) { while (1); }
|
|
|
|
// CHECK: define i64 @return_f2()
|
|
|
|
void receive_f2(struct f2 a0) { }
|
|
|
|
// CHECK: define void @receive_f2(float %a0.0, float %a0.1)
|
|
|
|
struct f4 {
|
|
float f;
|
|
float g;
|
|
float h;
|
|
float i;
|
|
};
|
|
|
|
struct f4 return_f4(void) { while (1); }
|
|
|
|
// CHECK: define void @return_f4(%struct.f4* noalias sret %agg.result)
|
|
|
|
void receive_f4(struct f4 a0) { }
|
|
|
|
// CHECK: define void @receive_f4(float %a0.0, float %a0.1, float %a0.2, float %a0.3)
|
|
|