Author: Harald van Dijk Date: 2025-07-15T23:49:52+01:00 New Revision: 66e707ec68d6dc8d8f70083b68daf52559a862c1
URL: https://github.com/llvm/llvm-project/commit/66e707ec68d6dc8d8f70083b68daf52559a862c1 DIFF: https://github.com/llvm/llvm-project/commit/66e707ec68d6dc8d8f70083b68daf52559a862c1.diff LOG: [NFC] Remove getDefaultCallingConvention IsBuiltin (#145904) ASTContext::getDefaultCallingConvention() was documented as returning "the default calling convention for the current target", but did not do this, and was never intended to do this, it has always been controlled by command-line options to deviate from the target default. This commit changes ASTContext::getDefaultCallingConvention() to reflect the fact that it returns the context's default calling convention, not the target's default calling convention. The IsBuiltin parameter, which was used to return the target's default calling convention rather than the context's, is removed in favor of getTargetInfo().getDefaultCallingConv() which is more explicit of the intent. Added: Modified: clang/include/clang/AST/ASTContext.h clang/include/clang/Basic/TargetInfo.h clang/lib/AST/ASTContext.cpp clang/lib/Sema/SemaExprCXX.cpp clang/lib/Sema/SemaLookup.cpp clang/lib/Sema/SemaRISCV.cpp Removed: ################################################################################ diff --git a/clang/include/clang/AST/ASTContext.h b/clang/include/clang/AST/ASTContext.h index 8c27728c404dd..66ec3395571ea 100644 --- a/clang/include/clang/AST/ASTContext.h +++ b/clang/include/clang/AST/ASTContext.h @@ -2916,10 +2916,14 @@ class ASTContext : public RefCountedBase<ASTContext> { 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 diff er 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/include/clang/Basic/TargetInfo.h b/clang/include/clang/Basic/TargetInfo.h index 7442ffbb6733c..8b66c73474704 100644 --- a/clang/include/clang/Basic/TargetInfo.h +++ b/clang/include/clang/Basic/TargetInfo.h @@ -1698,8 +1698,11 @@ class TargetInfo : public TransferrableTargetInfo, /// Controls if __arithmetic_fence is supported in the targeted backend. virtual bool checkArithmeticFenceSupported() const { return false; } - /// Gets the default calling convention for the given target and - /// declaration context. + /// Gets the default calling convention for the given target. + /// + /// This function does not take into account any user options to override the + /// default calling convention. For that, see + /// ASTContext::getDefaultCallingConvention(). virtual CallingConv getDefaultCallingConv() const { // Not all targets will specify an explicit calling convention that we can // express. This will always do the right thing, even though it's not diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index d9019727e3681..50bd93a143a28 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -12678,10 +12678,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()) @@ -13065,43 +13064,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 25afa2f4dfe7a..f851c9e1d5015 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -3477,8 +3477,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<QualType> &FunctionList, SmallVector<QualType, 1> &RetTypes, SmallVector<SmallVector<QualType, 1>, 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 cc110e1115ed5..43f7992906c54 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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits