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:4cff1b40daRevert of first attempt:bebfc3b92dDifferential Revision: https://reviews.llvm.org/D97941
98 lines
3.5 KiB
C++
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
|