Files
clang-p2996/clang/test/CodeGenCXX/default_calling_conv.cpp
Elizabeth Andrews d8b8f544d9 [Reland] "Do not apply calling conventions to MSVC entry points"
This patch is a second attempt at fixing a link error for MSVC
entry points when calling conventions are specified using a flag.

Calling conventions specified using flags should not be applied to MSVC
entry points. The default calling convention is set in this case. The
default calling convention for MSVC entry points main and wmain is cdecl.
For WinMain, wWinMain and DllMain, the default calling convention is
stdcall on 32 bit Windows.

Explicitly specified calling conventions are applied to MSVC entry points.

For MinGW, the default calling convention for all MSVC entry points is
cdecl.

First attempt: 4cff1b40da
Revert of first attempt: bebfc3b92d

Differential Revision: https://reviews.llvm.org/D97941
2021-03-18 04:26:47 -07:00

98 lines
3.5 KiB
C++

// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -fdefault-calling-conv=cdecl -emit-llvm -o - %s | FileCheck %s --check-prefix=CDECL --check-prefix=ALL
// RUN: %clang_cc1 -triple i786-unknown-linux-gnu -target-feature +sse4.2 -fdefault-calling-conv=fastcall -emit-llvm -o - %s | FileCheck %s --check-prefix=FASTCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i486-unknown-linux-gnu -fdefault-calling-conv=stdcall -emit-llvm -o - %s | FileCheck %s --check-prefix=STDCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i486-unknown-linux-gnu -mrtd -emit-llvm -o - %s | FileCheck %s --check-prefix=STDCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i986-unknown-linux-gnu -fdefault-calling-conv=vectorcall -emit-llvm -o - %s | FileCheck %s --check-prefix=VECTORCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i986-unknown-linux-gnu -fdefault-calling-conv=regcall -emit-llvm -o - %s | FileCheck %s --check-prefix=REGCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i686-pc-win32 -fdefault-calling-conv=vectorcall -emit-llvm -o - %s -DWINDOWS | FileCheck %s --check-prefix=WIN32
// RUN: %clang_cc1 -triple x86_64-windows-msvc -fdefault-calling-conv=vectorcall -emit-llvm -o - %s -DWINDOWS | FileCheck %s --check-prefix=WIN64
// RUN: %clang_cc1 -triple i686-pc-win32 -emit-llvm -o - %s -DEXPLICITCC | FileCheck %s --check-prefix=EXPLICITCC
// CDECL: define{{.*}} void @_Z5test1v
// FASTCALL: define{{.*}} x86_fastcallcc void @_Z5test1v
// STDCALL: define{{.*}} x86_stdcallcc void @_Z5test1v
// VECTORCALL: define{{.*}} x86_vectorcallcc void @_Z5test1v
// REGCALL: define{{.*}} x86_regcallcc void @_Z17__regcall3__test1v
void test1() {}
// fastcall, stdcall, vectorcall and regcall do not support variadic functions.
// CDECL: define{{.*}} void @_Z12testVariadicz
// FASTCALL: define{{.*}} void @_Z12testVariadicz
// STDCALL: define{{.*}} void @_Z12testVariadicz
// VECTORCALL: define{{.*}} void @_Z12testVariadicz
// REGCALL: define{{.*}} void @_Z12testVariadicz
void testVariadic(...){}
// ALL: define{{.*}} void @_Z5test2v
void __attribute__((cdecl)) test2() {}
// ALL: define{{.*}} x86_fastcallcc void @_Z5test3v
void __attribute__((fastcall)) test3() {}
// ALL: define{{.*}} x86_stdcallcc void @_Z5test4v
void __attribute__((stdcall)) test4() {}
// ALL: define{{.*}} x86_vectorcallcc void @_Z5test5v
void __attribute__((vectorcall)) test5() {}
// ALL: define{{.*}} x86_regcallcc void @_Z17__regcall3__test6v
void __attribute__((regcall)) test6() {}
// ALL: define linkonce_odr void @_ZN1A11test_memberEv
class A {
public:
void test_member() {}
};
void test() {
A a;
a.test_member();
}
// ALL: define{{.*}} i32 @main
int main() {
return 1;
}
#ifdef WINDOWS
// WIN32: define dso_local i32 @wmain
// WIN64: define dso_local i32 @wmain
int wmain() {
return 1;
}
// WIN32: define dso_local x86_stdcallcc i32 @WinMain
// WIN64: define dso_local i32 @WinMain
int WinMain() {
return 1;
}
// WIN32: define dso_local x86_stdcallcc i32 @wWinMain
// WIN64: define dso_local i32 @wWinMain
int wWinMain() {
return 1;
}
// WIN32: define dso_local x86_stdcallcc i32 @DllMain
// WIN64: define dso_local i32 @DllMain
int DllMain() {
return 1;
}
#endif // Windows
#ifdef EXPLICITCC
// EXPLICITCC: define dso_local x86_fastcallcc i32 @wmain
int __fastcall wmain() {
return 1;
}
// EXPLICITCC: define dso_local x86_fastcallcc i32 @WinMain
int __fastcall WinMain() {
return 1;
}
// EXPLICITCC: define dso_local x86_fastcallcc i32 @wWinMain
int __fastcall wWinMain() {
return 1;
}
// EXPLICITCC: define dso_local x86_fastcallcc i32 @DllMain
int __fastcall DllMain() {
return 1;
}
#endif // ExplicitCC