llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Prabhuk (Prabhuk) <details> <summary>Changes</summary> The logic to decide which va_start builtin should be used must rely on the ABI information. The target triple based check is rigid. It makes the support for new triples such as x86_64-uefi to add more triple based checks across the codebase. --- Full diff: https://github.com/llvm/llvm-project/pull/129909.diff 1 Files Affected: - (modified) clang/lib/Sema/SemaChecking.cpp (+7-6) ``````````diff diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index f9926c6b4adab..2af02c337b6e1 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -4769,11 +4769,12 @@ ExprResult Sema::CheckOSLogFormatStringArg(Expr *Arg) { /// Check that the user is calling the appropriate va_start builtin for the /// target and calling convention. static bool checkVAStartABI(Sema &S, unsigned BuiltinID, Expr *Fn) { - const llvm::Triple &TT = S.Context.getTargetInfo().getTriple(); + const TargetInfo &TI = S.Context.getTargetInfo(); + bool IsMicrosoftABI = TI.getCXXABI().isMicrosoft(); + const llvm::Triple &TT = TI.getTriple(); bool IsX64 = TT.getArch() == llvm::Triple::x86_64; bool IsAArch64 = (TT.getArch() == llvm::Triple::aarch64 || TT.getArch() == llvm::Triple::aarch64_32); - bool IsWindows = TT.isOSWindows(); bool IsMSVAStart = BuiltinID == Builtin::BI__builtin_ms_va_start; if (IsX64 || IsAArch64) { CallingConv CC = CC_C; @@ -4781,7 +4782,7 @@ static bool checkVAStartABI(Sema &S, unsigned BuiltinID, Expr *Fn) { CC = FD->getType()->castAs<FunctionType>()->getCallConv(); if (IsMSVAStart) { // Don't allow this in System V ABI functions. - if (CC == CC_X86_64SysV || (!IsWindows && CC != CC_Win64)) + if (CC == CC_X86_64SysV || (!IsMicrosoftABI && CC != CC_Win64)) return S.Diag(Fn->getBeginLoc(), diag::err_ms_va_start_used_in_sysv_function); } else { @@ -4789,11 +4790,11 @@ static bool checkVAStartABI(Sema &S, unsigned BuiltinID, Expr *Fn) { // On x64 Windows, don't allow this in System V ABI functions. // (Yes, that means there's no corresponding way to support variadic // System V ABI functions on Windows.) - if ((IsWindows && CC == CC_X86_64SysV) || - (!IsWindows && CC == CC_Win64)) + if ((IsMicrosoftABI && CC == CC_X86_64SysV) || + (!IsMicrosoftABI && CC == CC_Win64)) return S.Diag(Fn->getBeginLoc(), diag::err_va_start_used_in_wrong_abi_function) - << !IsWindows; + << !IsMicrosoftABI; } return false; } `````````` </details> https://github.com/llvm/llvm-project/pull/129909 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits