mirror of
https://github.com/llvm/llvm-project.git
synced 2025-05-14 20:16:06 +00:00

The most complex aspect of the convention is the handling of homogeneous vector and floating point aggregates. Reuse the homogeneous aggregate classification code that we use on PPC64 and ARM for this. This convention also has a C mangling, and we apparently implement that in both Clang and LLVM. Reviewed By: majnemer Differential Revision: http://reviews.llvm.org/D6063 llvm-svn: 221006
69 lines
2.0 KiB
C
69 lines
2.0 KiB
C
// RUN: %clang_cc1 -triple i386-pc-linux -emit-llvm < %s | FileCheck %s
|
|
// RUN: %clang_cc1 -triple i386-pc-linux -emit-llvm -mrtd < %s | FileCheck %s
|
|
// RUN: %clang_cc1 -triple i386-pc-linux -emit-llvm -fms-compatibility < %s
|
|
|
|
void __fastcall f1(void);
|
|
void __stdcall f2(void);
|
|
void __thiscall f3(void);
|
|
void __fastcall f4(void) {
|
|
// CHECK-LABEL: define x86_fastcallcc void @f4()
|
|
f1();
|
|
// CHECK: call x86_fastcallcc void @f1()
|
|
}
|
|
void __stdcall f5(void) {
|
|
// CHECK-LABEL: define x86_stdcallcc void @f5()
|
|
f2();
|
|
// CHECK: call x86_stdcallcc void @f2()
|
|
}
|
|
void __thiscall f6(void) {
|
|
// CHECK-LABEL: define x86_thiscallcc void @f6()
|
|
f3();
|
|
// CHECK: call x86_thiscallcc void @f3()
|
|
}
|
|
void __vectorcall f61(void) {
|
|
// CHECK-LABEL: define x86_vectorcallcc void @f61()
|
|
f3();
|
|
// CHECK: call x86_thiscallcc void @f3()
|
|
}
|
|
|
|
// PR5280
|
|
void (__fastcall *pf1)(void) = f1;
|
|
void (__stdcall *pf2)(void) = f2;
|
|
void (__thiscall *pf3)(void) = f3;
|
|
void (__fastcall *pf4)(void) = f4;
|
|
void (__stdcall *pf5)(void) = f5;
|
|
void (__thiscall *pf6)(void) = f6;
|
|
void (__vectorcall *pf7)(void) = f61;
|
|
|
|
int main(void) {
|
|
f4(); f5(); f6(); f61();
|
|
// CHECK: call x86_fastcallcc void @f4()
|
|
// CHECK: call x86_stdcallcc void @f5()
|
|
// CHECK: call x86_thiscallcc void @f6()
|
|
// CHECK: call x86_vectorcallcc void @f61()
|
|
pf1(); pf2(); pf3(); pf4(); pf5(); pf6(); pf7();
|
|
// CHECK: call x86_fastcallcc void %{{.*}}()
|
|
// CHECK: call x86_stdcallcc void %{{.*}}()
|
|
// CHECK: call x86_thiscallcc void %{{.*}}()
|
|
// CHECK: call x86_fastcallcc void %{{.*}}()
|
|
// CHECK: call x86_stdcallcc void %{{.*}}()
|
|
// CHECK: call x86_thiscallcc void %{{.*}}()
|
|
// CHECK: call x86_vectorcallcc void %{{.*}}()
|
|
return 0;
|
|
}
|
|
|
|
// PR7117
|
|
void __stdcall f7(foo) int foo; {}
|
|
void f8(void) {
|
|
f7(0);
|
|
// CHECK: call x86_stdcallcc void @f7(i32 0)
|
|
}
|
|
|
|
// PR12535
|
|
void __fastcall f9(int x, int y) {};
|
|
// WIN: define x86_fastcallcc void @f9({{.*}})
|
|
void __fastcall f10(int x, ...) {};
|
|
// WIN: define void @f10({{.*}})
|
|
void __stdcall f11(int x, ...) {};
|
|
// WIN: define void @f11({{.*}})
|