Skip to content

Commit 9fde2e0

Browse files
committed
Win64: Silently ignore __stdcall, __fastcall, and __thiscall
MSVC doesn't warn on this. Users are expected to apply the WINAPI macro to functions passed by pointer to the Win32 API, and this macro expands to __stdcall. This means we end up with a lot of useless noisy warnings about ignored calling conventions when compiling code with clang for Win64. llvm-svn: 230668
1 parent e810172 commit 9fde2e0

File tree

4 files changed

+32
-11
lines changed

4 files changed

+32
-11
lines changed

clang/include/clang/Basic/TargetInfo.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,8 @@ class TargetInfo : public RefCountedBase<TargetInfo> {
842842

843843
enum CallingConvCheckResult {
844844
CCCR_OK,
845-
CCCR_Warning
845+
CCCR_Warning,
846+
CCCR_Ignore,
846847
};
847848

848849
/// \brief Determines whether a given calling convention is valid for the

clang/lib/Basic/Targets.cpp

+16-4
Original file line numberDiff line numberDiff line change
@@ -3626,19 +3626,31 @@ class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
36263626
IntPtrType = SignedLongLong;
36273627
this->UserLabelPrefix = "";
36283628
}
3629+
36293630
void getTargetDefines(const LangOptions &Opts,
36303631
MacroBuilder &Builder) const override {
36313632
WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
36323633
Builder.defineMacro("_WIN64");
36333634
}
3635+
36343636
BuiltinVaListKind getBuiltinVaListKind() const override {
36353637
return TargetInfo::CharPtrBuiltinVaList;
36363638
}
3639+
36373640
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3638-
return (CC == CC_C ||
3639-
CC == CC_X86VectorCall ||
3640-
CC == CC_IntelOclBicc ||
3641-
CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3641+
switch (CC) {
3642+
case CC_X86StdCall:
3643+
case CC_X86ThisCall:
3644+
case CC_X86FastCall:
3645+
return CCCR_Ignore;
3646+
case CC_C:
3647+
case CC_X86VectorCall:
3648+
case CC_IntelOclBicc:
3649+
case CC_X86_64SysV:
3650+
return CCCR_OK;
3651+
default:
3652+
return CCCR_Warning;
3653+
}
36423654
}
36433655
};
36443656
} // end anonymous namespace

clang/lib/Sema/SemaDeclAttr.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -3393,9 +3393,12 @@ bool Sema::CheckCallingConvAttr(const AttributeList &attr, CallingConv &CC,
33933393

33943394
const TargetInfo &TI = Context.getTargetInfo();
33953395
TargetInfo::CallingConvCheckResult A = TI.checkCallingConvention(CC);
3396-
if (A == TargetInfo::CCCR_Warning) {
3397-
Diag(attr.getLoc(), diag::warn_cconv_ignored) << attr.getName();
3396+
if (A != TargetInfo::CCCR_OK) {
3397+
if (A == TargetInfo::CCCR_Warning)
3398+
Diag(attr.getLoc(), diag::warn_cconv_ignored) << attr.getName();
33983399

3400+
// This convention is not valid for the target. Use the default function or
3401+
// method calling convention.
33993402
TargetInfo::CallingConvMethodType MT = TargetInfo::CCMT_Unknown;
34003403
if (FD)
34013404
MT = FD->isCXXInstanceMember() ? TargetInfo::CCMT_Member :
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
1-
// RUN: %clang_cc1 %s -fsyntax-only -Wno-unused-value -Wmicrosoft -verify -fms-compatibility -triple x86_64-pc-win32
2-
int __stdcall f(void); /* expected-warning {{calling convention '__stdcall' ignored for this target}} */
1+
// RUN: %clang_cc1 %s -Wmicrosoft -verify -fms-compatibility -triple x86_64-pc-win32
32

4-
/* This should compile without warning because __stdcall is treated
5-
as __cdecl in MS compatibility mode for x64 compiles*/
3+
// None of these should warn. stdcall is treated as equivalent to cdecl on
4+
// x64.
5+
// expected-no-diagnostics
6+
7+
int __stdcall f(void);
68
int __cdecl f(void) {
79
return 0;
810
}
11+
int __stdcall func_std(void);
12+
int __thiscall func_this(void);
13+
int __fastcall func_fast(void);

0 commit comments

Comments
 (0)