diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 2b9cd035623cc..d374ec6e72a71 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -2914,10 +2914,14 @@ class ASTContext : public RefCountedBase { NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const; - /// Retrieves the default calling convention for the current target. + /// Retrieves the default calling convention for the current context. + /// + /// The context's default calling convention may differ from the current + /// target's default calling convention if the -fdefault-calling-conv option + /// is used; to get the target's default calling convention, e.g. for built-in + /// functions, call getTargetInfo().getDefaultCallingConv() instead. CallingConv getDefaultCallingConvention(bool IsVariadic, - bool IsCXXMethod, - bool IsBuiltin = false) const; + bool IsCXXMethod) const; /// Retrieves the "canonical" template name that refers to a /// given template. diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index e7abb18330e17..aa55018ddd249 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -12677,10 +12677,9 @@ QualType ASTContext::GetBuiltinType(unsigned Id, bool Variadic = (TypeStr[0] == '.'); - FunctionType::ExtInfo EI(getDefaultCallingConvention( - Variadic, /*IsCXXMethod=*/false, /*IsBuiltin=*/true)); - if (BuiltinInfo.isNoReturn(Id)) EI = EI.withNoReturn(true); - + FunctionType::ExtInfo EI(Target->getDefaultCallingConv()); + if (BuiltinInfo.isNoReturn(Id)) + EI = EI.withNoReturn(true); // We really shouldn't be making a no-proto type here. if (ArgTypes.empty() && Variadic && !getLangOpts().requiresStrictPrototypes()) @@ -13064,43 +13063,38 @@ void ASTContext::forEachMultiversionedFunctionVersion( } CallingConv ASTContext::getDefaultCallingConvention(bool IsVariadic, - bool IsCXXMethod, - bool IsBuiltin) const { + bool IsCXXMethod) const { // Pass through to the C++ ABI object if (IsCXXMethod) return ABI->getDefaultMethodCallConv(IsVariadic); - // Builtins ignore user-specified default calling convention and remain the - // Target's default calling convention. - if (!IsBuiltin) { - switch (LangOpts.getDefaultCallingConv()) { - case LangOptions::DCC_None: - break; - case LangOptions::DCC_CDecl: - return CC_C; - case LangOptions::DCC_FastCall: - if (getTargetInfo().hasFeature("sse2") && !IsVariadic) - return CC_X86FastCall; - break; - case LangOptions::DCC_StdCall: - if (!IsVariadic) - return CC_X86StdCall; - break; - case LangOptions::DCC_VectorCall: - // __vectorcall cannot be applied to variadic functions. - if (!IsVariadic) - return CC_X86VectorCall; - break; - case LangOptions::DCC_RegCall: - // __regcall cannot be applied to variadic functions. - if (!IsVariadic) - return CC_X86RegCall; - break; - case LangOptions::DCC_RtdCall: - if (!IsVariadic) - return CC_M68kRTD; - break; - } + switch (LangOpts.getDefaultCallingConv()) { + case LangOptions::DCC_None: + break; + case LangOptions::DCC_CDecl: + return CC_C; + case LangOptions::DCC_FastCall: + if (getTargetInfo().hasFeature("sse2") && !IsVariadic) + return CC_X86FastCall; + break; + case LangOptions::DCC_StdCall: + if (!IsVariadic) + return CC_X86StdCall; + break; + case LangOptions::DCC_VectorCall: + // __vectorcall cannot be applied to variadic functions. + if (!IsVariadic) + return CC_X86VectorCall; + break; + case LangOptions::DCC_RegCall: + // __regcall cannot be applied to variadic functions. + if (!IsVariadic) + return CC_X86RegCall; + break; + case LangOptions::DCC_RtdCall: + if (!IsVariadic) + return CC_M68kRTD; + break; } return Target->getDefaultCallingConv(); } diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 4a86cbd0633b6..cfdf855f65ff1 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -3467,8 +3467,8 @@ void Sema::DeclareGlobalAllocationFunction(DeclarationName Name, } } - FunctionProtoType::ExtProtoInfo EPI(Context.getDefaultCallingConvention( - /*IsVariadic=*/false, /*IsCXXMethod=*/false, /*IsBuiltin=*/true)); + FunctionProtoType::ExtProtoInfo EPI( + Context.getTargetInfo().getDefaultCallingConv()); QualType BadAllocType; bool HasBadAllocExceptionSpec = Name.isAnyOperatorNew(); diff --git a/clang/lib/Sema/SemaLookup.cpp b/clang/lib/Sema/SemaLookup.cpp index aa7191d2814fe..6d6e07a2c03c7 100644 --- a/clang/lib/Sema/SemaLookup.cpp +++ b/clang/lib/Sema/SemaLookup.cpp @@ -22,6 +22,7 @@ #include "clang/AST/ExprCXX.h" #include "clang/Basic/Builtins.h" #include "clang/Basic/LangOptions.h" +#include "clang/Basic/TargetInfo.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Lex/ModuleLoader.h" #include "clang/Lex/Preprocessor.h" @@ -777,7 +778,7 @@ static void GetOpenCLBuiltinFctOverloads( std::vector &FunctionList, SmallVector &RetTypes, SmallVector, 5> &ArgTypes) { FunctionProtoType::ExtProtoInfo PI( - Context.getDefaultCallingConvention(false, false, true)); + Context.getTargetInfo().getDefaultCallingConv()); PI.Variadic = false; // Do not attempt to create any FunctionTypes if there are no return types, diff --git a/clang/lib/Sema/SemaRISCV.cpp b/clang/lib/Sema/SemaRISCV.cpp index 9eab0c2a0df6a..c8b925156ed0b 100644 --- a/clang/lib/Sema/SemaRISCV.cpp +++ b/clang/lib/Sema/SemaRISCV.cpp @@ -417,7 +417,7 @@ void RISCVIntrinsicManagerImpl::CreateRVVIntrinsicDecl(LookupResult &LR, ArgTypes.push_back(RVVType2Qual(Context, Sigs[i])); FunctionProtoType::ExtProtoInfo PI( - Context.getDefaultCallingConvention(false, false, true)); + Context.getTargetInfo().getDefaultCallingConv()); PI.Variadic = false;