64#include "llvm/ADT/APFloat.h"
65#include "llvm/ADT/APInt.h"
66#include "llvm/ADT/APSInt.h"
67#include "llvm/ADT/ArrayRef.h"
68#include "llvm/ADT/DenseMap.h"
69#include "llvm/ADT/FoldingSet.h"
70#include "llvm/ADT/STLExtras.h"
71#include "llvm/ADT/SmallBitVector.h"
72#include "llvm/ADT/SmallPtrSet.h"
73#include "llvm/ADT/SmallString.h"
74#include "llvm/ADT/SmallVector.h"
75#include "llvm/ADT/StringRef.h"
76#include "llvm/ADT/StringSet.h"
77#include "llvm/ADT/StringSwitch.h"
78#include "llvm/Support/AtomicOrdering.h"
79#include "llvm/Support/Casting.h"
80#include "llvm/Support/Compiler.h"
81#include "llvm/Support/ConvertUTF.h"
82#include "llvm/Support/ErrorHandling.h"
83#include "llvm/Support/Format.h"
84#include "llvm/Support/Locale.h"
85#include "llvm/Support/MathExtras.h"
86#include "llvm/Support/SaveAndRestore.h"
87#include "llvm/Support/raw_ostream.h"
88#include "llvm/TargetParser/Triple.h"
102using namespace clang;
106 unsigned ByteNo)
const {
120 unsigned MinArgCount) {
121 unsigned ArgCount = Call->getNumArgs();
122 if (ArgCount >= MinArgCount)
125 return S.
Diag(Call->getEndLoc(), diag::err_typecheck_call_too_few_args)
126 << 0 << MinArgCount << ArgCount
127 << Call->getSourceRange();
134 unsigned ArgCount = Call->getNumArgs();
135 if (ArgCount <= MaxArgCount)
137 return S.
Diag(Call->getEndLoc(),
138 diag::err_typecheck_call_too_many_args_at_most)
139 << 0 << MaxArgCount << ArgCount
140 << Call->getSourceRange();
147 unsigned MaxArgCount) {
155 unsigned ArgCount = Call->getNumArgs();
156 if (ArgCount == DesiredArgCount)
161 assert(ArgCount > DesiredArgCount &&
"should have diagnosed this");
164 SourceRange Range(Call->getArg(DesiredArgCount)->getBeginLoc(),
165 Call->getArg(ArgCount - 1)->getEndLoc());
167 return S.
Diag(Range.getBegin(), diag::err_typecheck_call_too_many_args)
168 << 0 << DesiredArgCount << ArgCount
169 << Call->getArg(1)->getSourceRange();
173 if (
Value->isTypeDependent())
204 if (!Literal || !Literal->isOrdinary()) {
217 S.
Diag(TheCall->
getEndLoc(), diag::err_typecheck_call_too_few_args_at_least)
225 auto *Literal = dyn_cast<StringLiteral>(Arg->IgnoreParenCasts());
226 if (!Literal || !Literal->isWide()) {
227 S.
Diag(Arg->getBeginLoc(), diag::err_msvc_annotation_wide_str)
228 << Arg->getSourceRange();
262 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(
293 bool IsBooleanAlignBuiltin = ID == Builtin::BI__builtin_is_aligned;
295 auto IsValidIntegerType = [](
QualType Ty) {
296 return Ty->isIntegerType() && !Ty->isEnumeralType() && !Ty->isBooleanType();
303 if ((!SrcTy->
isPointerType() && !IsValidIntegerType(SrcTy)) ||
307 S.
Diag(Source->
getExprLoc(), diag::err_typecheck_expect_scalar_operand)
313 if (!IsValidIntegerType(AlignOp->
getType())) {
324 llvm::APSInt AlignValue = AlignResult.
Val.
getInt();
325 llvm::APSInt MaxValue(
326 llvm::APInt::getOneBitSet(MaxAlignmentBits + 1, MaxAlignmentBits));
327 if (AlignValue < 1) {
328 S.
Diag(AlignOp->
getExprLoc(), diag::err_alignment_too_small) << 1;
331 if (llvm::APSInt::compareValues(AlignValue, MaxValue) > 0) {
336 if (!AlignValue.isPowerOf2()) {
337 S.
Diag(AlignOp->
getExprLoc(), diag::err_alignment_not_power_of_two);
340 if (AlignValue == 1) {
341 S.
Diag(AlignOp->
getExprLoc(), diag::warn_alignment_builtin_useless)
342 << IsBooleanAlignBuiltin;
367 unsigned BuiltinID) {
372 for (
unsigned I = 0; I < 2; ++I) {
396 !PtrTy->getPointeeType()->isIntegerType() ||
397 PtrTy->getPointeeType().isConstQualified()) {
399 diag::err_overflow_builtin_must_be_ptr_int)
407 if (BuiltinID == Builtin::BI__builtin_mul_overflow) {
408 for (
unsigned I = 0; I < 3; ++I) {
409 const auto Arg = TheCall->
getArg(I);
412 if (Ty->isBitIntType() && Ty->isSignedIntegerType() &&
414 return S.
Diag(Arg->getBeginLoc(),
415 diag::err_overflow_builtin_bit_int_max_size)
424struct BuiltinDumpStructGenerator {
433 : S(S), TheCall(TheCall), ErrorTracker(S.getDiagnostics()),
434 Policy(S.Context.getPrintingPolicy()) {
438 Expr *makeOpaqueValueExpr(
Expr *Inner) {
441 Inner->getObjectKind(), Inner);
442 Actions.push_back(OVE);
446 Expr *getStringLiteral(llvm::StringRef Str) {
452 bool callPrintFunction(llvm::StringRef Format,
456 Args.reserve((TheCall->
getNumArgs() - 2) + 1 + Exprs.size());
458 Args.push_back(getStringLiteral(Format));
459 Args.insert(Args.end(), Exprs.begin(), Exprs.end());
475 Actions.push_back(RealCall.
get());
481 Expr *getIndentString(
unsigned Depth) {
487 return getStringLiteral(Indent);
495 llvm::raw_svector_ostream
OS(Str);
500 switch (BT->getKind()) {
501 case BuiltinType::Bool:
504 case BuiltinType::Char_U:
505 case BuiltinType::UChar:
508 case BuiltinType::Char_S:
509 case BuiltinType::SChar:
521 analyze_printf::PrintfConversionSpecifier::sArg) {
547 bool dumpUnnamedRecord(
const RecordDecl *RD,
Expr *E,
unsigned Depth) {
548 Expr *IndentLit = getIndentString(Depth);
550 if (IndentLit ? callPrintFunction(
"%s%s", {IndentLit, TypeLit})
551 : callPrintFunction(
"%s", {TypeLit}))
554 return dumpRecordValue(RD, E, IndentLit, Depth);
567 Expr *RecordArg = makeOpaqueValueExpr(E);
570 if (callPrintFunction(
" {\n"))
574 if (
const auto *CXXRD = dyn_cast<CXXRecordDecl>(RD)) {
575 for (
const auto &
Base : CXXRD->bases()) {
583 dumpUnnamedRecord(
Base.getType()->getAsRecordDecl(), BasePtr.
get(),
589 Expr *FieldIndentArg = getIndentString(Depth + 1);
592 for (
auto *D : RD->
decls()) {
593 auto *IFD = dyn_cast<IndirectFieldDecl>(D);
594 auto *FD = IFD ? IFD->getAnonField() : dyn_cast<FieldDecl>(D);
595 if (!FD || FD->isUnnamedBitfield() || FD->isAnonymousStructOrUnion())
601 getStringLiteral(FD->getName())};
603 if (FD->isBitField()) {
607 FD->getBitWidthValue(S.
Context));
621 if (
Field.isInvalid())
624 auto *InnerRD = FD->getType()->getAsRecordDecl();
625 auto *InnerCXXRD = dyn_cast_or_null<CXXRecordDecl>(InnerRD);
626 if (InnerRD && (!InnerCXXRD || InnerCXXRD->isAggregate())) {
628 if (callPrintFunction(Format, Args) ||
629 dumpRecordValue(InnerRD,
Field.get(), FieldIndentArg, Depth + 1))
633 if (appendFormatSpecifier(FD->getType(), Format)) {
635 Args.push_back(
Field.get());
645 Args.push_back(FieldAddr.
get());
648 if (callPrintFunction(Format, Args))
653 return RecordIndent ? callPrintFunction(
"%s}\n", RecordIndent)
654 : callPrintFunction(
"}\n");
657 Expr *buildWrapper() {
660 TheCall->
setType(Wrapper->getType());
681 diag::err_expected_struct_pointer_argument)
694 switch (BT ? BT->getKind() : BuiltinType::Void) {
695 case BuiltinType::Dependent:
696 case BuiltinType::Overload:
697 case BuiltinType::BoundMember:
698 case BuiltinType::PseudoObject:
699 case BuiltinType::UnknownAny:
700 case BuiltinType::BuiltinFn:
706 diag::err_expected_callable_argument)
712 BuiltinDumpStructGenerator Generator(S, TheCall);
718 Expr *PtrArg = PtrArgResult.
get();
722 if (Generator.dumpUnnamedRecord(RD, PtrArg, 0))
725 return Generator.buildWrapper();
737 if (Call->getStmtClass() != Stmt::CallExprClass) {
738 S.
Diag(BuiltinLoc, diag::err_first_argument_to_cwsc_not_call)
739 << Call->getSourceRange();
743 auto CE = cast<CallExpr>(Call);
744 if (CE->getCallee()->getType()->isBlockPointerType()) {
745 S.
Diag(BuiltinLoc, diag::err_first_argument_to_cwsc_block_call)
746 << Call->getSourceRange();
750 const Decl *TargetDecl = CE->getCalleeDecl();
751 if (
const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl))
752 if (FD->getBuiltinID()) {
753 S.
Diag(BuiltinLoc, diag::err_first_argument_to_cwsc_builtin_call)
754 << Call->getSourceRange();
758 if (isa<CXXPseudoDestructorExpr>(CE->getCallee()->IgnoreParens())) {
759 S.
Diag(BuiltinLoc, diag::err_first_argument_to_cwsc_pdtor_call)
760 << Call->getSourceRange();
768 S.
Diag(BuiltinLoc, diag::err_second_argument_to_cwsc_not_pointer)
782 BuiltinCall->
setType(CE->getType());
786 BuiltinCall->
setArg(1, ChainResult.
get());
793class ScanfDiagnosticFormatHandler
797 using ComputeSizeFunction =
798 llvm::function_ref<std::optional<llvm::APSInt>(
unsigned)>;
802 using DiagnoseFunction =
803 llvm::function_ref<void(
unsigned,
unsigned,
unsigned)>;
805 ComputeSizeFunction ComputeSizeArgument;
806 DiagnoseFunction Diagnose;
809 ScanfDiagnosticFormatHandler(ComputeSizeFunction ComputeSizeArgument,
810 DiagnoseFunction Diagnose)
811 : ComputeSizeArgument(ComputeSizeArgument), Diagnose(Diagnose) {}
814 const char *StartSpecifier,
815 unsigned specifierLen)
override {
816 if (!FS.consumesDataArgument())
819 unsigned NulByte = 0;
820 switch ((FS.getConversionSpecifier().getKind())) {
833 analyze_format_string::OptionalAmount::HowSpecified::Constant)
838 std::optional<llvm::APSInt> DestSizeAPS =
839 ComputeSizeArgument(FS.getArgIndex());
843 unsigned DestSize = DestSizeAPS->getZExtValue();
845 if (DestSize < SourceSize)
846 Diagnose(FS.getArgIndex(), DestSize, SourceSize);
852class EstimateSizeFormatHandler
857 EstimateSizeFormatHandler(StringRef Format)
858 :
Size(
std::
min(Format.find(0), Format.size()) +
862 const char *,
unsigned SpecifierLen,
865 const size_t FieldWidth = computeFieldWidth(FS);
866 const size_t Precision = computePrecision(FS);
869 switch (FS.getConversionSpecifier().getKind()) {
873 Size += std::max(FieldWidth, (
size_t)1);
885 Size += std::max(FieldWidth, Precision);
896 Size += std::max(FieldWidth, 1 +
897 (Precision ? 1 + Precision
907 (Precision ? 1 + Precision : 0) +
917 (Precision ? 1 + Precision : 0) +
929 Size += std::max(FieldWidth, 2 + Precision);
941 Size += FS.hasPlusPrefix() || FS.hasSpacePrefix();
943 if (FS.hasAlternativeForm()) {
944 switch (FS.getConversionSpecifier().getKind()) {
965 Size += (Precision ? 0 : 1);
969 assert(SpecifierLen <= Size &&
"no underflow");
970 Size -= SpecifierLen;
974 size_t getSizeLowerBound()
const {
return Size; }
979 size_t FieldWidth = 0;
987 size_t Precision = 0;
992 switch (FS.getConversionSpecifier().getKind()) {
1033void Sema::checkFortifiedBuiltinMemoryFunction(
FunctionDecl *FD,
1039 bool UseDABAttr =
false;
1042 const auto *DABAttr = FD->
getAttr<DiagnoseAsBuiltinAttr>();
1044 UseDecl = DABAttr->getFunction();
1045 assert(UseDecl &&
"Missing FunctionDecl in DiagnoseAsBuiltin attribute!");
1057 auto TranslateIndex = [&](
unsigned Index) -> std::optional<unsigned> {
1064 unsigned DABIndices = DABAttr->argIndices_size();
1065 unsigned NewIndex = Index < DABIndices
1066 ? DABAttr->argIndices_begin()[Index]
1069 return std::nullopt;
1073 auto ComputeExplicitObjectSizeArgument =
1074 [&](
unsigned Index) -> std::optional<llvm::APSInt> {
1075 std::optional<unsigned> IndexOptional = TranslateIndex(Index);
1077 return std::nullopt;
1078 unsigned NewIndex = *IndexOptional;
1082 return std::nullopt;
1088 auto ComputeSizeArgument =
1089 [&](
unsigned Index) -> std::optional<llvm::APSInt> {
1095 if (Index < FD->getNumParams()) {
1096 if (
const auto *POS =
1098 BOSType = POS->getType();
1101 std::optional<unsigned> IndexOptional = TranslateIndex(Index);
1103 return std::nullopt;
1104 unsigned NewIndex = *IndexOptional;
1107 return std::nullopt;
1109 const Expr *ObjArg = TheCall->
getArg(NewIndex);
1112 return std::nullopt;
1115 return llvm::APSInt::getUnsigned(
Result).extOrTrunc(SizeTypeWidth);
1118 auto ComputeStrLenArgument =
1119 [&](
unsigned Index) -> std::optional<llvm::APSInt> {
1120 std::optional<unsigned> IndexOptional = TranslateIndex(Index);
1122 return std::nullopt;
1123 unsigned NewIndex = *IndexOptional;
1125 const Expr *ObjArg = TheCall->
getArg(NewIndex);
1128 return std::nullopt;
1130 return llvm::APSInt::getUnsigned(
Result + 1).extOrTrunc(SizeTypeWidth);
1133 std::optional<llvm::APSInt> SourceSize;
1134 std::optional<llvm::APSInt> DestinationSize;
1135 unsigned DiagID = 0;
1136 bool IsChkVariant =
false;
1138 auto GetFunctionName = [&]() {
1144 FunctionName = FunctionName.drop_front(std::strlen(
"__builtin___"));
1145 FunctionName = FunctionName.drop_back(std::strlen(
"_chk"));
1146 }
else if (FunctionName.startswith(
"__builtin_")) {
1147 FunctionName = FunctionName.drop_front(std::strlen(
"__builtin_"));
1149 return FunctionName;
1152 switch (BuiltinID) {
1155 case Builtin::BI__builtin_strcpy:
1156 case Builtin::BIstrcpy: {
1157 DiagID = diag::warn_fortify_strlen_overflow;
1158 SourceSize = ComputeStrLenArgument(1);
1159 DestinationSize = ComputeSizeArgument(0);
1163 case Builtin::BI__builtin___strcpy_chk: {
1164 DiagID = diag::warn_fortify_strlen_overflow;
1165 SourceSize = ComputeStrLenArgument(1);
1166 DestinationSize = ComputeExplicitObjectSizeArgument(2);
1167 IsChkVariant =
true;
1171 case Builtin::BIscanf:
1172 case Builtin::BIfscanf:
1173 case Builtin::BIsscanf: {
1174 unsigned FormatIndex = 1;
1175 unsigned DataIndex = 2;
1176 if (BuiltinID == Builtin::BIscanf) {
1181 const auto *FormatExpr =
1184 const auto *Format = dyn_cast<StringLiteral>(FormatExpr);
1188 if (!Format->isOrdinary() && !Format->isUTF8())
1191 auto Diagnose = [&](
unsigned ArgIndex,
unsigned DestSize,
1192 unsigned SourceSize) {
1193 DiagID = diag::warn_fortify_scanf_overflow;
1194 unsigned Index = ArgIndex + DataIndex;
1195 StringRef FunctionName = GetFunctionName();
1197 PDiag(DiagID) << FunctionName << (Index + 1)
1198 << DestSize << SourceSize);
1201 StringRef FormatStrRef = Format->getString();
1202 auto ShiftedComputeSizeArgument = [&](
unsigned Index) {
1203 return ComputeSizeArgument(Index + DataIndex);
1205 ScanfDiagnosticFormatHandler H(ShiftedComputeSizeArgument,
Diagnose);
1206 const char *FormatBytes = FormatStrRef.data();
1209 assert(T &&
"String literal not of constant array type!");
1210 size_t TypeSize = T->
getSize().getZExtValue();
1214 std::min(std::max(TypeSize,
size_t(1)) - 1, FormatStrRef.find(0));
1226 case Builtin::BIsprintf:
1227 case Builtin::BI__builtin___sprintf_chk: {
1228 size_t FormatIndex = BuiltinID == Builtin::BIsprintf ? 1 : 3;
1231 if (
auto *Format = dyn_cast<StringLiteral>(FormatExpr)) {
1233 if (!Format->isOrdinary() && !Format->isUTF8())
1236 StringRef FormatStrRef = Format->getString();
1237 EstimateSizeFormatHandler H(FormatStrRef);
1238 const char *FormatBytes = FormatStrRef.data();
1241 assert(T &&
"String literal not of constant array type!");
1242 size_t TypeSize = T->
getSize().getZExtValue();
1246 std::min(std::max(TypeSize,
size_t(1)) - 1, FormatStrRef.find(0));
1248 H, FormatBytes, FormatBytes + StrLen,
getLangOpts(),
1250 DiagID = diag::warn_fortify_source_format_overflow;
1251 SourceSize = llvm::APSInt::getUnsigned(H.getSizeLowerBound())
1252 .extOrTrunc(SizeTypeWidth);
1253 if (BuiltinID == Builtin::BI__builtin___sprintf_chk) {
1254 DestinationSize = ComputeExplicitObjectSizeArgument(2);
1255 IsChkVariant =
true;
1257 DestinationSize = ComputeSizeArgument(0);
1264 case Builtin::BI__builtin___memcpy_chk:
1265 case Builtin::BI__builtin___memmove_chk:
1266 case Builtin::BI__builtin___memset_chk:
1267 case Builtin::BI__builtin___strlcat_chk:
1268 case Builtin::BI__builtin___strlcpy_chk:
1269 case Builtin::BI__builtin___strncat_chk:
1270 case Builtin::BI__builtin___strncpy_chk:
1271 case Builtin::BI__builtin___stpncpy_chk:
1272 case Builtin::BI__builtin___memccpy_chk:
1273 case Builtin::BI__builtin___mempcpy_chk: {
1274 DiagID = diag::warn_builtin_chk_overflow;
1275 SourceSize = ComputeExplicitObjectSizeArgument(TheCall->
getNumArgs() - 2);
1277 ComputeExplicitObjectSizeArgument(TheCall->
getNumArgs() - 1);
1278 IsChkVariant =
true;
1282 case Builtin::BI__builtin___snprintf_chk:
1283 case Builtin::BI__builtin___vsnprintf_chk: {
1284 DiagID = diag::warn_builtin_chk_overflow;
1285 SourceSize = ComputeExplicitObjectSizeArgument(1);
1286 DestinationSize = ComputeExplicitObjectSizeArgument(3);
1287 IsChkVariant =
true;
1291 case Builtin::BIstrncat:
1292 case Builtin::BI__builtin_strncat:
1293 case Builtin::BIstrncpy:
1294 case Builtin::BI__builtin_strncpy:
1295 case Builtin::BIstpncpy:
1296 case Builtin::BI__builtin_stpncpy: {
1302 DiagID = diag::warn_fortify_source_size_mismatch;
1303 SourceSize = ComputeExplicitObjectSizeArgument(TheCall->
getNumArgs() - 1);
1304 DestinationSize = ComputeSizeArgument(0);
1308 case Builtin::BImemcpy:
1309 case Builtin::BI__builtin_memcpy:
1310 case Builtin::BImemmove:
1311 case Builtin::BI__builtin_memmove:
1312 case Builtin::BImemset:
1313 case Builtin::BI__builtin_memset:
1314 case Builtin::BImempcpy:
1315 case Builtin::BI__builtin_mempcpy: {
1316 DiagID = diag::warn_fortify_source_overflow;
1317 SourceSize = ComputeExplicitObjectSizeArgument(TheCall->
getNumArgs() - 1);
1318 DestinationSize = ComputeSizeArgument(0);
1321 case Builtin::BIsnprintf:
1322 case Builtin::BI__builtin_snprintf:
1323 case Builtin::BIvsnprintf:
1324 case Builtin::BI__builtin_vsnprintf: {
1325 DiagID = diag::warn_fortify_source_size_mismatch;
1326 SourceSize = ComputeExplicitObjectSizeArgument(1);
1327 DestinationSize = ComputeSizeArgument(0);
1332 if (!SourceSize || !DestinationSize ||
1333 llvm::APSInt::compareValues(*SourceSize, *DestinationSize) <= 0)
1336 StringRef FunctionName = GetFunctionName();
1340 DestinationSize->toString(DestinationStr, 10);
1341 SourceSize->toString(SourceStr, 10);
1344 << FunctionName << DestinationStr << SourceStr);
1357 while (S && !S->isSEHExceptScope())
1359 if (!S || !(S->getFlags() & NeededScopeFlags)) {
1362 << DRE->getDecl()->getIdentifier();
1380 unsigned ArgCounter = 0;
1381 bool IllegalParams =
false;
1385 I != E; ++I, ++ArgCounter) {
1386 if (!(*I)->isPointerType() || !(*I)->getPointeeType()->isVoidType() ||
1387 (*I)->getPointeeType().getQualifiers().getAddressSpace() !=
1393 if (isa<BlockExpr>(BlockArg)) {
1394 BlockDecl *BD = cast<BlockExpr>(BlockArg)->getBlockDecl();
1396 }
else if (isa<DeclRefExpr>(BlockArg)) {
1397 ErrorLoc = cast<DeclRefExpr>(BlockArg)->getBeginLoc();
1400 diag::err_opencl_enqueue_kernel_blocks_non_local_void_args);
1401 IllegalParams =
true;
1405 return IllegalParams;
1415 S.
Diag(Call->getBeginLoc(), diag::err_opencl_requires_extension)
1416 << 1 << Call->getDirectCallee()
1417 <<
"cl_khr_subgroups or __opencl_c_subgroups";
1433 S.
Diag(NDRangeArg->
getBeginLoc(), diag::err_opencl_builtin_expected_type)
1440 S.
Diag(BlockArg->
getBeginLoc(), diag::err_opencl_builtin_expected_type)
1456 S.
Diag(BlockArg->
getBeginLoc(), diag::err_opencl_builtin_expected_type)
1468 unsigned Start,
unsigned End) {
1469 bool IllegalParams =
false;
1470 for (
unsigned I = Start; I <= End; ++I)
1473 return IllegalParams;
1480 unsigned NumNonVarArgs) {
1483 unsigned NumBlockParams =
1485 unsigned TotalNumArgs = TheCall->
getNumArgs();
1489 if (TotalNumArgs != NumBlockParams + NumNonVarArgs) {
1491 diag::err_opencl_enqueue_kernel_local_size_args);
1531 diag::err_typecheck_call_too_few_args_at_least)
1532 << 0 << 4 << NumArgs;
1544 diag::err_opencl_builtin_expected_type)
1552 diag::err_opencl_builtin_expected_type)
1553 << TheCall->
getDirectCallee() <<
"'kernel_enqueue_flags_t' (i.e. uint)";
1560 diag::err_opencl_builtin_expected_type)
1579 diag::err_opencl_enqueue_kernel_blocks_no_args);
1603 diag::err_opencl_builtin_expected_type)
1616 diag::err_opencl_builtin_expected_type)
1628 diag::err_opencl_builtin_expected_type)
1642 diag::err_opencl_enqueue_kernel_incorrect_args);
1648 return D->
getAttr<OpenCLAccessAttr>();
1653 const Expr *Arg0 = Call->getArg(0);
1656 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_first_arg)
1660 OpenCLAccessAttr *AccessQual =
1666 switch (Call->getDirectCallee()->getBuiltinID()) {
1667 case Builtin::BIread_pipe:
1668 case Builtin::BIreserve_read_pipe:
1669 case Builtin::BIcommit_read_pipe:
1670 case Builtin::BIwork_group_reserve_read_pipe:
1671 case Builtin::BIsub_group_reserve_read_pipe:
1672 case Builtin::BIwork_group_commit_read_pipe:
1673 case Builtin::BIsub_group_commit_read_pipe:
1674 if (!(!AccessQual || AccessQual->isReadOnly())) {
1676 diag::err_opencl_builtin_pipe_invalid_access_modifier)
1681 case Builtin::BIwrite_pipe:
1682 case Builtin::BIreserve_write_pipe:
1683 case Builtin::BIcommit_write_pipe:
1684 case Builtin::BIwork_group_reserve_write_pipe:
1685 case Builtin::BIsub_group_reserve_write_pipe:
1686 case Builtin::BIwork_group_commit_write_pipe:
1687 case Builtin::BIsub_group_commit_write_pipe:
1688 if (!(AccessQual && AccessQual->isWriteOnly())) {
1690 diag::err_opencl_builtin_pipe_invalid_access_modifier)
1703 const Expr *Arg0 = Call->getArg(0);
1704 const Expr *ArgIdx = Call->getArg(Idx);
1713 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_invalid_arg)
1728 switch (Call->getNumArgs()) {
1745 if (!Call->getArg(1)->getType()->isReserveIDT()) {
1746 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_invalid_arg)
1748 << Call->getArg(1)->getType() << Call->getArg(1)->getSourceRange();
1753 const Expr *Arg2 = Call->getArg(2);
1756 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_invalid_arg)
1767 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_arg_num)
1768 << Call->getDirectCallee() << Call->getSourceRange();
1788 if (!Call->getArg(1)->getType()->isIntegerType() &&
1789 !Call->getArg(1)->getType()->isUnsignedIntegerType()) {
1790 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_invalid_arg)
1792 << Call->getArg(1)->getType() << Call->getArg(1)->getSourceRange();
1817 if (!Call->getArg(1)->getType()->isReserveIDT()) {
1818 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_invalid_arg)
1820 << Call->getArg(1)->getType() << Call->getArg(1)->getSourceRange();
1836 if (!Call->getArg(0)->getType()->isPipeType()) {
1837 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_pipe_first_arg)
1838 << Call->getDirectCallee() << Call->getArg(0)->getSourceRange();
1856 auto RT = Call->getArg(0)->getType();
1857 if (!RT->isPointerType() || RT->getPointeeType()
1859 S.
Diag(Call->getBeginLoc(), diag::err_opencl_builtin_to_addr_invalid_arg)
1860 << Call->getArg(0) << Call->getDirectCallee() << Call->getSourceRange();
1865 S.
Diag(Call->getArg(0)->getBeginLoc(),
1866 diag::warn_opencl_generic_address_space_arg)
1867 << Call->getDirectCallee()->getNameInfo().getAsString()
1868 << Call->getArg(0)->getSourceRange();
1871 RT = RT->getPointeeType();
1872 auto Qual = RT.getQualifiers();
1873 switch (BuiltinID) {
1874 case Builtin::BIto_global:
1877 case Builtin::BIto_local:
1880 case Builtin::BIto_private:
1884 llvm_unreachable(
"Invalid builtin function");
1887 RT.getUnqualifiedType(), Qual)));
1913 auto DiagSelect = [&]() -> std::optional<unsigned> {
1920 return std::optional<unsigned>{};
1935 diag::err_incomplete_type))
1939 "Unhandled non-object pointer case");
1957 llvm::Triple::ObjectFormatType CurObjFormat =
1959 if (llvm::is_contained(UnsupportedObjectFormatTypes, CurObjFormat)) {
1972 llvm::Triple::ArchType CurArch =
1974 if (llvm::is_contained(SupportedArchs, CurArch))
1984bool Sema::CheckTSBuiltinFunctionCall(
const TargetInfo &TI,
unsigned BuiltinID,
1991 case llvm::Triple::arm:
1992 case llvm::Triple::armeb:
1993 case llvm::Triple::thumb:
1994 case llvm::Triple::thumbeb:
1995 return CheckARMBuiltinFunctionCall(TI, BuiltinID, TheCall);
1996 case llvm::Triple::aarch64:
1997 case llvm::Triple::aarch64_32:
1998 case llvm::Triple::aarch64_be:
1999 return CheckAArch64BuiltinFunctionCall(TI, BuiltinID, TheCall);
2000 case llvm::Triple::bpfeb:
2001 case llvm::Triple::bpfel:
2002 return CheckBPFBuiltinFunctionCall(BuiltinID, TheCall);
2003 case llvm::Triple::hexagon:
2004 return CheckHexagonBuiltinFunctionCall(BuiltinID, TheCall);
2005 case llvm::Triple::mips:
2006 case llvm::Triple::mipsel:
2007 case llvm::Triple::mips64:
2008 case llvm::Triple::mips64el:
2009 return CheckMipsBuiltinFunctionCall(TI, BuiltinID, TheCall);
2010 case llvm::Triple::systemz:
2011 return CheckSystemZBuiltinFunctionCall(BuiltinID, TheCall);
2012 case llvm::Triple::x86:
2013 case llvm::Triple::x86_64:
2014 return CheckX86BuiltinFunctionCall(TI, BuiltinID, TheCall);
2015 case llvm::Triple::ppc:
2016 case llvm::Triple::ppcle:
2017 case llvm::Triple::ppc64:
2018 case llvm::Triple::ppc64le:
2019 return CheckPPCBuiltinFunctionCall(TI, BuiltinID, TheCall);
2020 case llvm::Triple::amdgcn:
2021 return CheckAMDGCNBuiltinFunctionCall(BuiltinID, TheCall);
2022 case llvm::Triple::riscv32:
2023 case llvm::Triple::riscv64:
2024 return CheckRISCVBuiltinFunctionCall(TI, BuiltinID, TheCall);
2025 case llvm::Triple::loongarch32:
2026 case llvm::Triple::loongarch64:
2027 return CheckLoongArchBuiltinFunctionCall(TI, BuiltinID, TheCall);
2028 case llvm::Triple::wasm32:
2029 case llvm::Triple::wasm64:
2030 return CheckWebAssemblyBuiltinFunctionCall(TI, BuiltinID, TheCall);
2040 return S.
Diag(Loc, diag::err_builtin_invalid_arg_type)
2051 EltTy = VecTy->getElementType();
2054 return S.
Diag(Loc, diag::err_builtin_invalid_arg_type)
2055 << ArgIndex << 5 << ArgTy;
2062Sema::CheckBuiltinFunctionCall(
FunctionDecl *FDecl,
unsigned BuiltinID,
2067 unsigned ICEArguments = 0;
2074 for (
unsigned ArgNo = 0; ICEArguments != 0; ++ArgNo) {
2076 if ((ICEArguments & (1 << ArgNo)) == 0)
continue;
2081 if (ArgNo < TheCall->getNumArgs() &&
2082 SemaBuiltinConstantArg(TheCall, ArgNo,
Result))
2084 ICEArguments &= ~(1 << ArgNo);
2087 switch (BuiltinID) {
2088 case Builtin::BI__builtin___CFStringMakeConstantString:
2092 *
this, BuiltinID, TheCall,
2093 {llvm::Triple::GOFF, llvm::Triple::XCOFF}))
2096 "Wrong # arguments to builtin CFStringMakeConstantString");
2097 if (CheckObjCString(TheCall->
getArg(0)))
2100 case Builtin::BI__builtin_ms_va_start:
2101 case Builtin::BI__builtin_stdarg_start:
2102 case Builtin::BI__builtin_va_start:
2103 if (SemaBuiltinVAStart(BuiltinID, TheCall))
2106 case Builtin::BI__va_start: {
2108 case llvm::Triple::aarch64:
2109 case llvm::Triple::arm:
2110 case llvm::Triple::thumb:
2111 if (SemaBuiltinVAStartARMMicrosoft(TheCall))
2115 if (SemaBuiltinVAStart(BuiltinID, TheCall))
2123 case Builtin::BI_interlockedbittestandset_acq:
2124 case Builtin::BI_interlockedbittestandset_rel:
2125 case Builtin::BI_interlockedbittestandset_nf:
2126 case Builtin::BI_interlockedbittestandreset_acq:
2127 case Builtin::BI_interlockedbittestandreset_rel:
2128 case Builtin::BI_interlockedbittestandreset_nf:
2130 *
this, BuiltinID, TheCall,
2131 {llvm::Triple::arm, llvm::Triple::thumb, llvm::Triple::aarch64}))
2136 case Builtin::BI_bittest64:
2137 case Builtin::BI_bittestandcomplement64:
2138 case Builtin::BI_bittestandreset64:
2139 case Builtin::BI_bittestandset64:
2140 case Builtin::BI_interlockedbittestandreset64:
2141 case Builtin::BI_interlockedbittestandset64:
2143 {llvm::Triple::x86_64, llvm::Triple::arm,
2144 llvm::Triple::thumb,
2145 llvm::Triple::aarch64}))
2149 case Builtin::BI__builtin_set_flt_rounds:
2151 {llvm::Triple::x86, llvm::Triple::x86_64,
2152 llvm::Triple::arm, llvm::Triple::thumb,
2153 llvm::Triple::aarch64}))
2157 case Builtin::BI__builtin_isgreater:
2158 case Builtin::BI__builtin_isgreaterequal:
2159 case Builtin::BI__builtin_isless:
2160 case Builtin::BI__builtin_islessequal:
2161 case Builtin::BI__builtin_islessgreater:
2162 case Builtin::BI__builtin_isunordered:
2163 if (SemaBuiltinUnorderedCompare(TheCall))
2166 case Builtin::BI__builtin_fpclassify:
2167 if (SemaBuiltinFPClassification(TheCall, 6))
2170 case Builtin::BI__builtin_isfinite:
2171 case Builtin::BI__builtin_isinf:
2172 case Builtin::BI__builtin_isinf_sign:
2173 case Builtin::BI__builtin_isnan:
2174 case Builtin::BI__builtin_isnormal:
2175 case Builtin::BI__builtin_signbit:
2176 case Builtin::BI__builtin_signbitf:
2177 case Builtin::BI__builtin_signbitl:
2178 if (SemaBuiltinFPClassification(TheCall, 1))
2181 case Builtin::BI__builtin_shufflevector:
2185 case Builtin::BI__builtin_prefetch:
2186 if (SemaBuiltinPrefetch(TheCall))
2189 case Builtin::BI__builtin_alloca_with_align:
2190 case Builtin::BI__builtin_alloca_with_align_uninitialized:
2191 if (SemaBuiltinAllocaWithAlign(TheCall))
2194 case Builtin::BI__builtin_alloca:
2195 case Builtin::BI__builtin_alloca_uninitialized:
2199 case Builtin::BI__arithmetic_fence:
2200 if (SemaBuiltinArithmeticFence(TheCall))
2203 case Builtin::BI__assume:
2204 case Builtin::BI__builtin_assume:
2205 if (SemaBuiltinAssume(TheCall))
2208 case Builtin::BI__builtin_assume_aligned:
2209 if (SemaBuiltinAssumeAligned(TheCall))
2212 case Builtin::BI__builtin_dynamic_object_size:
2213 case Builtin::BI__builtin_object_size:
2214 if (SemaBuiltinConstantArgRange(TheCall, 1, 0, 3))
2217 case Builtin::BI__builtin_longjmp:
2218 if (SemaBuiltinLongjmp(TheCall))
2221 case Builtin::BI__builtin_setjmp:
2222 if (SemaBuiltinSetjmp(TheCall))
2225 case Builtin::BI__builtin_classify_type:
2229 case Builtin::BI__builtin_complex:
2230 if (SemaBuiltinComplex(TheCall))
2233 case Builtin::BI__builtin_constant_p: {
2241 case Builtin::BI__builtin_launder:
2243 case Builtin::BI__sync_fetch_and_add:
2244 case Builtin::BI__sync_fetch_and_add_1:
2245 case Builtin::BI__sync_fetch_and_add_2:
2246 case Builtin::BI__sync_fetch_and_add_4:
2247 case Builtin::BI__sync_fetch_and_add_8:
2248 case Builtin::BI__sync_fetch_and_add_16:
2249 case Builtin::BI__sync_fetch_and_sub:
2250 case Builtin::BI__sync_fetch_and_sub_1:
2251 case Builtin::BI__sync_fetch_and_sub_2:
2252 case Builtin::BI__sync_fetch_and_sub_4:
2253 case Builtin::BI__sync_fetch_and_sub_8:
2254 case Builtin::BI__sync_fetch_and_sub_16:
2255 case Builtin::BI__sync_fetch_and_or:
2256 case Builtin::BI__sync_fetch_and_or_1:
2257 case Builtin::BI__sync_fetch_and_or_2:
2258 case Builtin::BI__sync_fetch_and_or_4:
2259 case Builtin::BI__sync_fetch_and_or_8:
2260 case Builtin::BI__sync_fetch_and_or_16:
2261 case Builtin::BI__sync_fetch_and_and:
2262 case Builtin::BI__sync_fetch_and_and_1:
2263 case Builtin::BI__sync_fetch_and_and_2:
2264 case Builtin::BI__sync_fetch_and_and_4:
2265 case Builtin::BI__sync_fetch_and_and_8:
2266 case Builtin::BI__sync_fetch_and_and_16:
2267 case Builtin::BI__sync_fetch_and_xor:
2268 case Builtin::BI__sync_fetch_and_xor_1:
2269 case Builtin::BI__sync_fetch_and_xor_2:
2270 case Builtin::BI__sync_fetch_and_xor_4:
2271 case Builtin::BI__sync_fetch_and_xor_8:
2272 case Builtin::BI__sync_fetch_and_xor_16:
2273 case Builtin::BI__sync_fetch_and_nand:
2274 case Builtin::BI__sync_fetch_and_nand_1:
2275 case Builtin::BI__sync_fetch_and_nand_2:
2276 case Builtin::BI__sync_fetch_and_nand_4:
2277 case Builtin::BI__sync_fetch_and_nand_8:
2278 case Builtin::BI__sync_fetch_and_nand_16:
2279 case Builtin::BI__sync_add_and_fetch:
2280 case Builtin::BI__sync_add_and_fetch_1:
2281 case Builtin::BI__sync_add_and_fetch_2:
2282 case Builtin::BI__sync_add_and_fetch_4:
2283 case Builtin::BI__sync_add_and_fetch_8:
2284 case Builtin::BI__sync_add_and_fetch_16:
2285 case Builtin::BI__sync_sub_and_fetch:
2286 case Builtin::BI__sync_sub_and_fetch_1:
2287 case Builtin::BI__sync_sub_and_fetch_2:
2288 case Builtin::BI__sync_sub_and_fetch_4:
2289 case Builtin::BI__sync_sub_and_fetch_8:
2290 case Builtin::BI__sync_sub_and_fetch_16:
2291 case Builtin::BI__sync_and_and_fetch:
2292 case Builtin::BI__sync_and_and_fetch_1:
2293 case Builtin::BI__sync_and_and_fetch_2:
2294 case Builtin::BI__sync_and_and_fetch_4:
2295 case Builtin::BI__sync_and_and_fetch_8:
2296 case Builtin::BI__sync_and_and_fetch_16:
2297 case Builtin::BI__sync_or_and_fetch:
2298 case Builtin::BI__sync_or_and_fetch_1:
2299 case Builtin::BI__sync_or_and_fetch_2:
2300 case Builtin::BI__sync_or_and_fetch_4:
2301 case Builtin::BI__sync_or_and_fetch_8:
2302 case Builtin::BI__sync_or_and_fetch_16:
2303 case Builtin::BI__sync_xor_and_fetch:
2304 case Builtin::BI__sync_xor_and_fetch_1:
2305 case Builtin::BI__sync_xor_and_fetch_2:
2306 case Builtin::BI__sync_xor_and_fetch_4:
2307 case Builtin::BI__sync_xor_and_fetch_8:
2308 case Builtin::BI__sync_xor_and_fetch_16:
2309 case Builtin::BI__sync_nand_and_fetch:
2310 case Builtin::BI__sync_nand_and_fetch_1:
2311 case Builtin::BI__sync_nand_and_fetch_2:
2312 case Builtin::BI__sync_nand_and_fetch_4:
2313 case Builtin::BI__sync_nand_and_fetch_8:
2314 case Builtin::BI__sync_nand_and_fetch_16:
2315 case Builtin::BI__sync_val_compare_and_swap:
2316 case Builtin::BI__sync_val_compare_and_swap_1:
2317 case Builtin::BI__sync_val_compare_and_swap_2:
2318 case Builtin::BI__sync_val_compare_and_swap_4:
2319 case Builtin::BI__sync_val_compare_and_swap_8:
2320 case Builtin::BI__sync_val_compare_and_swap_16:
2321 case Builtin::BI__sync_bool_compare_and_swap:
2322 case Builtin::BI__sync_bool_compare_and_swap_1:
2323 case Builtin::BI__sync_bool_compare_and_swap_2:
2324 case Builtin::BI__sync_bool_compare_and_swap_4:
2325 case Builtin::BI__sync_bool_compare_and_swap_8:
2326 case Builtin::BI__sync_bool_compare_and_swap_16:
2327 case Builtin::BI__sync_lock_test_and_set:
2328 case Builtin::BI__sync_lock_test_and_set_1:
2329 case Builtin::BI__sync_lock_test_and_set_2:
2330 case Builtin::BI__sync_lock_test_and_set_4:
2331 case Builtin::BI__sync_lock_test_and_set_8:
2332 case Builtin::BI__sync_lock_test_and_set_16:
2333 case Builtin::BI__sync_lock_release:
2334 case Builtin::BI__sync_lock_release_1:
2335 case Builtin::BI__sync_lock_release_2:
2336 case Builtin::BI__sync_lock_release_4:
2337 case Builtin::BI__sync_lock_release_8:
2338 case Builtin::BI__sync_lock_release_16:
2339 case Builtin::BI__sync_swap:
2340 case Builtin::BI__sync_swap_1:
2341 case Builtin::BI__sync_swap_2:
2342 case Builtin::BI__sync_swap_4:
2343 case Builtin::BI__sync_swap_8:
2344 case Builtin::BI__sync_swap_16:
2345 return SemaBuiltinAtomicOverloaded(TheCallResult);
2346 case Builtin::BI__sync_synchronize:
2350 case Builtin::BI__builtin_nontemporal_load:
2351 case Builtin::BI__builtin_nontemporal_store:
2352 return SemaBuiltinNontemporalOverloaded(TheCallResult);
2353 case Builtin::BI__builtin_memcpy_inline: {
2366 case Builtin::BI__builtin_memset_inline: {
2377#define BUILTIN(ID, TYPE, ATTRS)
2378#define ATOMIC_BUILTIN(ID, TYPE, ATTRS) \
2379 case Builtin::BI##ID: \
2380 return SemaAtomicOpsOverloaded(TheCallResult, AtomicExpr::AO##ID);
2381#include "clang/Basic/Builtins.def"
2382 case Builtin::BI__annotation:
2386 case Builtin::BI__builtin_annotation:
2390 case Builtin::BI__builtin_addressof:
2394 case Builtin::BI__builtin_function_start:
2398 case Builtin::BI__builtin_is_aligned:
2399 case Builtin::BI__builtin_align_up:
2400 case Builtin::BI__builtin_align_down:
2404 case Builtin::BI__builtin_add_overflow:
2405 case Builtin::BI__builtin_sub_overflow:
2406 case Builtin::BI__builtin_mul_overflow:
2410 case Builtin::BI__builtin_operator_new:
2411 case Builtin::BI__builtin_operator_delete: {
2412 bool IsDelete = BuiltinID == Builtin::BI__builtin_operator_delete;
2414 SemaBuiltinOperatorNewDeleteOverloaded(TheCallResult, IsDelete);
2419 case Builtin::BI__builtin_dump_struct:
2421 case Builtin::BI__builtin_expect_with_probability: {
2432 Diag(ProbArg->
getBeginLoc(), diag::err_probability_not_constant_float)
2439 bool LoseInfo =
false;
2440 Probability.convert(llvm::APFloat::IEEEdouble(),
2441 llvm::RoundingMode::Dynamic, &LoseInfo);
2442 if (!(Probability >= llvm::APFloat(0.0) &&
2443 Probability <= llvm::APFloat(1.0))) {
2450 case Builtin::BI__builtin_preserve_access_index:
2454 case Builtin::BI__builtin_call_with_static_chain:
2458 case Builtin::BI__exception_code:
2459 case Builtin::BI_exception_code:
2461 diag::err_seh___except_block))
2464 case Builtin::BI__exception_info:
2465 case Builtin::BI_exception_info:
2467 diag::err_seh___except_filter))
2470 case Builtin::BI__GetExceptionInfo:
2482 case Builtin::BIaddressof:
2483 case Builtin::BI__addressof:
2484 case Builtin::BIforward:
2485 case Builtin::BIforward_like:
2486 case Builtin::BImove:
2487 case Builtin::BImove_if_noexcept:
2488 case Builtin::BIas_const: {
2496 bool ReturnsPointer = BuiltinID == Builtin::BIaddressof ||
2497 BuiltinID == Builtin::BI__addressof;
2499 (ReturnsPointer ?
Result->isAnyPointerType()
2500 :
Result->isReferenceType()) &&
2502 Result->getPointeeType()))) {
2503 Diag(TheCall->
getBeginLoc(), diag::err_builtin_move_forward_unsupported)
2510 case Builtin::BIread_pipe:
2511 case Builtin::BIwrite_pipe:
2517 case Builtin::BIreserve_read_pipe:
2518 case Builtin::BIreserve_write_pipe:
2519 case Builtin::BIwork_group_reserve_read_pipe:
2520 case Builtin::BIwork_group_reserve_write_pipe:
2524 case Builtin::BIsub_group_reserve_read_pipe:
2525 case Builtin::BIsub_group_reserve_write_pipe:
2530 case Builtin::BIcommit_read_pipe:
2531 case Builtin::BIcommit_write_pipe:
2532 case Builtin::BIwork_group_commit_read_pipe:
2533 case Builtin::BIwork_group_commit_write_pipe:
2537 case Builtin::BIsub_group_commit_read_pipe:
2538 case Builtin::BIsub_group_commit_write_pipe:
2543 case Builtin::BIget_pipe_num_packets:
2544 case Builtin::BIget_pipe_max_packets:
2548 case Builtin::BIto_global:
2549 case Builtin::BIto_local:
2550 case Builtin::BIto_private:
2555 case Builtin::BIenqueue_kernel:
2559 case Builtin::BIget_kernel_work_group_size:
2560 case Builtin::BIget_kernel_preferred_work_group_size_multiple:
2564 case Builtin::BIget_kernel_max_sub_group_size_for_ndrange:
2565 case Builtin::BIget_kernel_sub_group_count_for_ndrange:
2569 case Builtin::BI__builtin_os_log_format:
2572 case Builtin::BI__builtin_os_log_format_buffer_size:
2573 if (SemaBuiltinOSLogFormat(TheCall))
2576 case Builtin::BI__builtin_frame_address:
2577 case Builtin::BI__builtin_return_address: {
2578 if (SemaBuiltinConstantArgRange(TheCall, 0, 0, 0xFFFF))
2586 Result.Val.getInt() != 0)
2588 << ((BuiltinID == Builtin::BI__builtin_return_address)
2589 ?
"__builtin_return_address"
2590 :
"__builtin_frame_address")
2595 case Builtin::BI__builtin_nondeterministic_value: {
2596 if (SemaBuiltinNonDeterministicValue(TheCall))
2603 case Builtin::BI__builtin_elementwise_abs: {
2604 if (PrepareBuiltinElementwiseMathOneArgCall(TheCall))
2611 EltTy = VecTy->getElementType();
2614 diag::err_builtin_invalid_arg_type)
2623 case Builtin::BI__builtin_elementwise_ceil:
2624 case Builtin::BI__builtin_elementwise_cos:
2625 case Builtin::BI__builtin_elementwise_exp:
2626 case Builtin::BI__builtin_elementwise_exp2:
2627 case Builtin::BI__builtin_elementwise_floor:
2628 case Builtin::BI__builtin_elementwise_log:
2629 case Builtin::BI__builtin_elementwise_log2:
2630 case Builtin::BI__builtin_elementwise_log10:
2631 case Builtin::BI__builtin_elementwise_roundeven:
2632 case Builtin::BI__builtin_elementwise_sin:
2633 case Builtin::BI__builtin_elementwise_trunc:
2634 case Builtin::BI__builtin_elementwise_canonicalize: {
2635 if (PrepareBuiltinElementwiseMathOneArgCall(TheCall))
2644 case Builtin::BI__builtin_elementwise_fma: {
2645 if (SemaBuiltinElementwiseTernaryMath(TheCall))
2651 case Builtin::BI__builtin_elementwise_add_sat:
2652 case Builtin::BI__builtin_elementwise_sub_sat: {
2653 if (SemaBuiltinElementwiseMath(TheCall))
2661 EltTy = VecTy->getElementType();
2671 case Builtin::BI__builtin_elementwise_min:
2672 case Builtin::BI__builtin_elementwise_max:
2673 if (SemaBuiltinElementwiseMath(TheCall))
2676 case Builtin::BI__builtin_elementwise_copysign: {
2696 diag::err_typecheck_call_different_arg_types)
2697 << MagnitudeTy << SignTy;
2705 case Builtin::BI__builtin_reduce_max:
2706 case Builtin::BI__builtin_reduce_min: {
2707 if (PrepareBuiltinReduceMathOneArgCall(TheCall))
2718 TheCall->
setType(TyA->getElementType());
2724 case Builtin::BI__builtin_reduce_add:
2725 case Builtin::BI__builtin_reduce_mul:
2726 case Builtin::BI__builtin_reduce_xor:
2727 case Builtin::BI__builtin_reduce_or:
2728 case Builtin::BI__builtin_reduce_and: {
2729 if (PrepareBuiltinReduceMathOneArgCall(TheCall))
2734 if (!TyA || !TyA->getElementType()->isIntegerType()) {
2739 TheCall->
setType(TyA->getElementType());
2743 case Builtin::BI__builtin_matrix_transpose:
2744 return SemaBuiltinMatrixTranspose(TheCall, TheCallResult);
2746 case Builtin::BI__builtin_matrix_column_major_load:
2747 return SemaBuiltinMatrixColumnMajorLoad(TheCall, TheCallResult);
2749 case Builtin::BI__builtin_matrix_column_major_store:
2750 return SemaBuiltinMatrixColumnMajorStore(TheCall, TheCallResult);
2752 case Builtin::BI__builtin_get_device_side_mangled_name: {
2753 auto Check = [](
CallExpr *TheCall) {
2759 auto *D = DRE->getDecl();
2760 if (!isa<FunctionDecl>(D) && !isa<VarDecl>(D))
2762 return D->hasAttr<CUDAGlobalAttr>() || D->hasAttr<CUDADeviceAttr>() ||
2763 D->hasAttr<CUDAConstantAttr>() || D->hasAttr<HIPManagedAttr>();
2765 if (!Check(TheCall)) {
2767 diag::err_hip_invalid_args_builtin_mangled_name);
2778 "Aux Target Builtin, but not an aux target?");
2780 if (CheckTSBuiltinFunctionCall(
2791 return TheCallResult;
2795static unsigned RFT(
unsigned t,
bool shift =
false,
bool ForceQuad =
false) {
2797 int IsQuad = ForceQuad ?
true :
Type.isQuad();
2798 switch (
Type.getEltType()) {
2801 return shift ? 7 : (8 << IsQuad) - 1;
2804 return shift ? 15 : (4 << IsQuad) - 1;
2806 return shift ? 31 : (2 << IsQuad) - 1;
2809 return shift ? 63 : (1 << IsQuad) - 1;
2811 return shift ? 127 : (1 << IsQuad) - 1;
2813 assert(!shift &&
"cannot shift float types!");
2814 return (4 << IsQuad) - 1;
2816 assert(!shift &&
"cannot shift float types!");
2817 return (2 << IsQuad) - 1;
2819 assert(!shift &&
"cannot shift float types!");
2820 return (1 << IsQuad) - 1;
2822 assert(!shift &&
"cannot shift float types!");
2823 return (4 << IsQuad) - 1;
2825 llvm_unreachable(
"Invalid NeonTypeFlag!");
2832 bool IsPolyUnsigned,
bool IsInt64Long) {
2866 llvm_unreachable(
"Invalid NeonTypeFlag!");
2869bool Sema::CheckSVEBuiltinFunctionCall(
unsigned BuiltinID,
CallExpr *TheCall) {
2873 switch (BuiltinID) {
2876#define GET_SVE_IMMEDIATE_CHECK
2877#include "clang/Basic/arm_sve_sema_rangechecks.inc"
2878#undef GET_SVE_IMMEDIATE_CHECK
2882 bool HasError =
false;
2883 for (
auto &I : ImmChecks) {
2884 int ArgNum, CheckTy, ElementSizeInBits;
2885 std::tie(ArgNum, CheckTy, ElementSizeInBits) = I;
2891 auto CheckImmediateInSet = [&](OptionSetCheckFnTy CheckImm,
2892 int ErrDiag) ->
bool {
2900 if (SemaBuiltinConstantArg(TheCall, ArgNum, Imm))
2903 if (!CheckImm(Imm.getSExtValue()))
2909 case SVETypeFlags::ImmCheck0_31:
2910 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 31))
2913 case SVETypeFlags::ImmCheck0_13:
2914 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 13))
2917 case SVETypeFlags::ImmCheck1_16:
2918 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, 16))
2921 case SVETypeFlags::ImmCheck0_7:
2922 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 7))
2925 case SVETypeFlags::ImmCheckExtract:
2926 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
2927 (2048 / ElementSizeInBits) - 1))
2930 case SVETypeFlags::ImmCheckShiftRight:
2931 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1, ElementSizeInBits))
2934 case SVETypeFlags::ImmCheckShiftRightNarrow:
2935 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 1,
2936 ElementSizeInBits / 2))
2939 case SVETypeFlags::ImmCheckShiftLeft:
2940 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
2941 ElementSizeInBits - 1))
2944 case SVETypeFlags::ImmCheckLaneIndex:
2945 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
2946 (128 / (1 * ElementSizeInBits)) - 1))
2949 case SVETypeFlags::ImmCheckLaneIndexCompRotate:
2950 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
2951 (128 / (2 * ElementSizeInBits)) - 1))
2954 case SVETypeFlags::ImmCheckLaneIndexDot:
2955 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0,
2956 (128 / (4 * ElementSizeInBits)) - 1))
2959 case SVETypeFlags::ImmCheckComplexRot90_270:
2960 if (CheckImmediateInSet([](int64_t
V) {
return V == 90 ||
V == 270; },
2961 diag::err_rotation_argument_to_cadd))
2964 case SVETypeFlags::ImmCheckComplexRotAll90:
2965 if (CheckImmediateInSet(
2967 return V == 0 ||
V == 90 ||
V == 180 ||
V == 270;
2969 diag::err_rotation_argument_to_cmla))
2972 case SVETypeFlags::ImmCheck0_1:
2973 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 1))
2976 case SVETypeFlags::ImmCheck0_2:
2977 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 2))
2980 case SVETypeFlags::ImmCheck0_3:
2981 if (SemaBuiltinConstantArgRange(TheCall, ArgNum, 0, 3))
2990bool Sema::CheckNeonBuiltinFunctionCall(
const TargetInfo &TI,
2991 unsigned BuiltinID,
CallExpr *TheCall) {
2996 bool HasConstPtr =
false;
2997 switch (BuiltinID) {
2998#define GET_NEON_OVERLOAD_CHECK
2999#include "clang/Basic/arm_neon.inc"
3000#include "clang/Basic/arm_fp16.inc"
3001#undef GET_NEON_OVERLOAD_CHECK
3008 if (SemaBuiltinConstantArg(TheCall, ImmArg,
Result))
3011 TV =
Result.getLimitedValue(64);
3012 if ((TV > 63) || (mask & (1ULL << TV)) == 0)
3017 if (PtrArgNum >= 0) {
3021 Arg = ICE->getSubExpr();
3025 llvm::Triple::ArchType Arch = TI.
getTriple().getArch();
3026 bool IsPolyUnsigned = Arch == llvm::Triple::aarch64 ||
3027 Arch == llvm::Triple::aarch64_32 ||
3028 Arch == llvm::Triple::aarch64_be;
3046 unsigned i = 0, l = 0, u = 0;
3047 switch (BuiltinID) {
3050 #define GET_NEON_IMMEDIATE_CHECK
3051 #include "clang/Basic/arm_neon.inc"
3052 #include "clang/Basic/arm_fp16.inc"
3053 #undef GET_NEON_IMMEDIATE_CHECK
3056 return SemaBuiltinConstantArgRange(TheCall, i, l, u + l);
3059bool Sema::CheckMVEBuiltinFunctionCall(
unsigned BuiltinID,
CallExpr *TheCall) {
3060 switch (BuiltinID) {
3063 #include "clang/Basic/arm_mve_builtin_sema.inc"
3067bool Sema::CheckCDEBuiltinFunctionCall(
const TargetInfo &TI,
unsigned BuiltinID,
3070 switch (BuiltinID) {
3073#include "clang/Basic/arm_cde_builtin_sema.inc"
3079 return CheckARMCoprocessorImmediate(TI, TheCall->
getArg(0),
true);
3082bool Sema::CheckARMCoprocessorImmediate(
const TargetInfo &TI,
3083 const Expr *CoprocArg,
bool WantCDE) {
3092 int64_t CoprocNo = CoprocNoAP.getExtValue();
3093 assert(CoprocNo >= 0 &&
"Coprocessor immediate must be non-negative");
3096 bool IsCDECoproc = CoprocNo <= 7 && (CDECoprocMask & (1 << CoprocNo));
3098 if (IsCDECoproc != WantCDE)
3105bool Sema::CheckARMBuiltinExclusiveCall(
unsigned BuiltinID,
CallExpr *TheCall,
3106 unsigned MaxWidth) {
3107 assert((BuiltinID == ARM::BI__builtin_arm_ldrex ||
3108 BuiltinID == ARM::BI__builtin_arm_ldaex ||
3109 BuiltinID == ARM::BI__builtin_arm_strex ||
3110 BuiltinID == ARM::BI__builtin_arm_stlex ||
3111 BuiltinID == AArch64::BI__builtin_arm_ldrex ||
3112 BuiltinID == AArch64::BI__builtin_arm_ldaex ||
3113 BuiltinID == AArch64::BI__builtin_arm_strex ||
3114 BuiltinID == AArch64::BI__builtin_arm_stlex) &&
3115 "unexpected ARM builtin");
3116 bool IsLdrex = BuiltinID == ARM::BI__builtin_arm_ldrex ||
3117 BuiltinID == ARM::BI__builtin_arm_ldaex ||
3118 BuiltinID == AArch64::BI__builtin_arm_ldrex ||
3119 BuiltinID == AArch64::BI__builtin_arm_ldaex;
3131 Expr *PointerArg = TheCall->
getArg(IsLdrex ? 0 : 1);
3135 PointerArg = PointerArgRes.
get();
3155 CastNeeded = CK_BitCast;
3156 Diag(DRE->
getBeginLoc(), diag::ext_typecheck_convert_discards_qualifiers)
3166 PointerArg = PointerArgRes.
get();
3168 TheCall->
setArg(IsLdrex ? 0 : 1, PointerArg);
3173 Diag(DRE->
getBeginLoc(), diag::err_atomic_builtin_must_be_pointer_intfltptr)
3180 assert(MaxWidth == 64 &&
"Diagnostic unexpectedly inaccurate");
3181 Diag(DRE->
getBeginLoc(), diag::err_atomic_exclusive_builtin_pointer_size)
3220bool Sema::CheckARMBuiltinFunctionCall(
const TargetInfo &TI,
unsigned BuiltinID,
3222 if (BuiltinID == ARM::BI__builtin_arm_ldrex ||
3223 BuiltinID == ARM::BI__builtin_arm_ldaex ||
3224 BuiltinID == ARM::BI__builtin_arm_strex ||
3225 BuiltinID == ARM::BI__builtin_arm_stlex) {
3226 return CheckARMBuiltinExclusiveCall(BuiltinID, TheCall, 64);
3229 if (BuiltinID == ARM::BI__builtin_arm_prefetch) {
3230 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1) ||
3231 SemaBuiltinConstantArgRange(TheCall, 2, 0, 1);
3234 if (BuiltinID == ARM::BI__builtin_arm_rsr64 ||
3235 BuiltinID == ARM::BI__builtin_arm_wsr64)
3236 return SemaBuiltinARMSpecialReg(BuiltinID, TheCall, 0, 3,
false);
3238 if (BuiltinID == ARM::BI__builtin_arm_rsr ||
3239 BuiltinID == ARM::BI__builtin_arm_rsrp ||
3240 BuiltinID == ARM::BI__builtin_arm_wsr ||
3241 BuiltinID == ARM::BI__builtin_arm_wsrp)
3242 return SemaBuiltinARMSpecialReg(BuiltinID, TheCall, 0, 5,
true);
3244 if (CheckNeonBuiltinFunctionCall(TI, BuiltinID, TheCall))
3246 if (CheckMVEBuiltinFunctionCall(BuiltinID, TheCall))
3248 if (CheckCDEBuiltinFunctionCall(TI, BuiltinID, TheCall))
3254 switch (BuiltinID) {
3255 default:
return false;
3256 case ARM::BI__builtin_arm_ssat:
3257 return SemaBuiltinConstantArgRange(TheCall, 1, 1, 32);
3258 case ARM::BI__builtin_arm_usat:
3259 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 31);
3260 case ARM::BI__builtin_arm_ssat16:
3261 return SemaBuiltinConstantArgRange(TheCall, 1, 1, 16);
3262 case ARM::BI__builtin_arm_usat16:
3263 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 15);
3264 case ARM::BI__builtin_arm_vcvtr_f:
3265 case ARM::BI__builtin_arm_vcvtr_d:
3266 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1);
3267 case ARM::BI__builtin_arm_dmb:
3268 case ARM::BI__builtin_arm_dsb:
3269 case ARM::BI__builtin_arm_isb:
3270 case ARM::BI__builtin_arm_dbg:
3271 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 15);
3272 case ARM::BI__builtin_arm_cdp:
3273 case ARM::BI__builtin_arm_cdp2:
3274 case ARM::BI__builtin_arm_mcr:
3275 case ARM::BI__builtin_arm_mcr2:
3276 case ARM::BI__builtin_arm_mrc:
3277 case ARM::BI__builtin_arm_mrc2:
3278 case ARM::BI__builtin_arm_mcrr:
3279 case ARM::BI__builtin_arm_mcrr2:
3280 case ARM::BI__builtin_arm_mrrc:
3281 case ARM::BI__builtin_arm_mrrc2:
3282 case ARM::BI__builtin_arm_ldc:
3283 case ARM::BI__builtin_arm_ldcl:
3284 case ARM::BI__builtin_arm_ldc2:
3285 case ARM::BI__builtin_arm_ldc2l:
3286 case ARM::BI__builtin_arm_stc:
3287 case ARM::BI__builtin_arm_stcl:
3288 case ARM::BI__builtin_arm_stc2:
3289 case ARM::BI__builtin_arm_stc2l:
3290 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 15) ||
3291 CheckARMCoprocessorImmediate(TI, TheCall->
getArg(0),
3296bool Sema::CheckAArch64BuiltinFunctionCall(
const TargetInfo &TI,
3299 if (BuiltinID == AArch64::BI__builtin_arm_ldrex ||
3300 BuiltinID == AArch64::BI__builtin_arm_ldaex ||
3301 BuiltinID == AArch64::BI__builtin_arm_strex ||
3302 BuiltinID == AArch64::BI__builtin_arm_stlex) {
3303 return CheckARMBuiltinExclusiveCall(BuiltinID, TheCall, 128);
3306 if (BuiltinID == AArch64::BI__builtin_arm_prefetch) {
3307 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1) ||
3308 SemaBuiltinConstantArgRange(TheCall, 2, 0, 3) ||
3309 SemaBuiltinConstantArgRange(TheCall, 3, 0, 1) ||
3310 SemaBuiltinConstantArgRange(TheCall, 4, 0, 1);
3313 if (BuiltinID == AArch64::BI__builtin_arm_rsr64 ||
3314 BuiltinID == AArch64::BI__builtin_arm_wsr64 ||
3315 BuiltinID == AArch64::BI__builtin_arm_rsr128 ||
3316 BuiltinID == AArch64::BI__builtin_arm_wsr128)
3317 return SemaBuiltinARMSpecialReg(BuiltinID, TheCall, 0, 5,
true);
3320 if (BuiltinID == AArch64::BI__builtin_arm_irg ||
3321 BuiltinID == AArch64::BI__builtin_arm_addg ||
3322 BuiltinID == AArch64::BI__builtin_arm_gmi ||
3323 BuiltinID == AArch64::BI__builtin_arm_ldg ||
3324 BuiltinID == AArch64::BI__builtin_arm_stg ||
3325 BuiltinID == AArch64::BI__builtin_arm_subp) {
3326 return SemaBuiltinARMMemoryTaggingCall(BuiltinID, TheCall);
3329 if (BuiltinID == AArch64::BI__builtin_arm_rsr ||
3330 BuiltinID == AArch64::BI__builtin_arm_rsrp ||
3331 BuiltinID == AArch64::BI__builtin_arm_wsr ||
3332 BuiltinID == AArch64::BI__builtin_arm_wsrp)
3333 return SemaBuiltinARMSpecialReg(BuiltinID, TheCall, 0, 5,
true);
3338 if (BuiltinID == AArch64::BI_ReadStatusReg ||
3339 BuiltinID == AArch64::BI_WriteStatusReg)
3340 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 0x7fff);
3342 if (BuiltinID == AArch64::BI__getReg)
3343 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31);
3345 if (BuiltinID == AArch64::BI__break)
3346 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 0xffff);
3348 if (CheckNeonBuiltinFunctionCall(TI, BuiltinID, TheCall))
3351 if (CheckSVEBuiltinFunctionCall(BuiltinID, TheCall))
3356 unsigned i = 0, l = 0, u = 0;
3357 switch (BuiltinID) {
3358 default:
return false;
3359 case AArch64::BI__builtin_arm_dmb:
3360 case AArch64::BI__builtin_arm_dsb:
3361 case AArch64::BI__builtin_arm_isb: l = 0; u = 15;
break;
3362 case AArch64::BI__builtin_arm_tcancel: l = 0; u = 65535;
break;
3365 return SemaBuiltinConstantArgRange(TheCall, i, l, u + l);
3402 if (!RT->getDecl()->getDeclName().isEmpty())
3405 if (!ET->getDecl()->getDeclName().isEmpty())
3421 const auto *UO = dyn_cast<UnaryOperator>(Arg->
IgnoreParens());
3425 const auto *CE = dyn_cast<CStyleCastExpr>(UO->getSubExpr());
3428 if (CE->getCastKind() != CK_IntegralToPointer &&
3429 CE->getCastKind() != CK_NullToPointer)
3433 const auto *DR = dyn_cast<DeclRefExpr>(CE->getSubExpr());
3438 dyn_cast<EnumConstantDecl>(DR->getDecl());
3449 return llvm::is_contained(ET->getDecl()->enumerators(), Enumerator);
3452bool Sema::CheckBPFBuiltinFunctionCall(
unsigned BuiltinID,
3454 assert((BuiltinID == BPF::BI__builtin_preserve_field_info ||
3455 BuiltinID == BPF::BI__builtin_btf_type_id ||
3456 BuiltinID == BPF::BI__builtin_preserve_type_info ||
3457 BuiltinID == BPF::BI__builtin_preserve_enum_value) &&
3458 "unexpected BPF builtin");
3468 if (BuiltinID == BPF::BI__builtin_preserve_field_info)
3469 kind = diag::err_preserve_field_info_not_const;
3470 else if (BuiltinID == BPF::BI__builtin_btf_type_id)
3471 kind = diag::err_btf_type_id_not_const;
3472 else if (BuiltinID == BPF::BI__builtin_preserve_type_info)
3473 kind = diag::err_preserve_type_info_not_const;
3475 kind = diag::err_preserve_enum_value_not_const;
3481 Arg = TheCall->
getArg(0);
3482 bool InvalidArg =
false;
3483 bool ReturnUnsignedInt =
true;
3484 if (BuiltinID == BPF::BI__builtin_preserve_field_info) {
3487 kind = diag::err_preserve_field_info_not_field;
3489 }
else if (BuiltinID == BPF::BI__builtin_preserve_type_info) {
3492 kind = diag::err_preserve_type_info_invalid;
3494 }
else if (BuiltinID == BPF::BI__builtin_preserve_enum_value) {
3497 kind = diag::err_preserve_enum_value_invalid;
3499 ReturnUnsignedInt =
false;
3500 }
else if (BuiltinID == BPF::BI__builtin_btf_type_id) {
3501 ReturnUnsignedInt =
false;
3509 if (ReturnUnsignedInt)
3516bool Sema::CheckHexagonBuiltinArgument(
unsigned BuiltinID,
CallExpr *TheCall) {
3529 { Hexagon::BI__builtin_circ_ldd, {{ 3,
true, 4, 3 }} },
3530 { Hexagon::BI__builtin_circ_ldw, {{ 3,
true, 4, 2 }} },
3531 { Hexagon::BI__builtin_circ_ldh, {{ 3,
true, 4, 1 }} },
3532 { Hexagon::BI__builtin_circ_lduh, {{ 3,
true, 4, 1 }} },
3533 { Hexagon::BI__builtin_circ_ldb, {{ 3,
true, 4, 0 }} },
3534 { Hexagon::BI__builtin_circ_ldub, {{ 3,
true, 4, 0 }} },
3535 { Hexagon::BI__builtin_circ_std, {{ 3,
true, 4, 3 }} },
3536 { Hexagon::BI__builtin_circ_stw, {{ 3,
true, 4, 2 }} },
3537 { Hexagon::BI__builtin_circ_sth, {{ 3,
true, 4, 1 }} },
3538 { Hexagon::BI__builtin_circ_sthhi, {{ 3,
true, 4, 1 }} },
3539 { Hexagon::BI__builtin_circ_stb, {{ 3,
true, 4, 0 }} },
3541 { Hexagon::BI__builtin_HEXAGON_L2_loadrub_pci, {{ 1,
true, 4, 0 }} },
3542 { Hexagon::BI__builtin_HEXAGON_L2_loadrb_pci, {{ 1,
true, 4, 0 }} },
3543 { Hexagon::BI__builtin_HEXAGON_L2_loadruh_pci, {{ 1,
true, 4, 1 }} },
3544 { Hexagon::BI__builtin_HEXAGON_L2_loadrh_pci, {{ 1,
true, 4, 1 }} },
3545 { Hexagon::BI__builtin_HEXAGON_L2_loadri_pci, {{ 1,
true, 4, 2 }} },
3546 { Hexagon::BI__builtin_HEXAGON_L2_loadrd_pci, {{ 1,
true, 4, 3 }} },
3547 { Hexagon::BI__builtin_HEXAGON_S2_storerb_pci, {{ 1,
true, 4, 0 }} },
3548 { Hexagon::BI__builtin_HEXAGON_S2_storerh_pci, {{ 1,
true, 4, 1 }} },
3549 { Hexagon::BI__builtin_HEXAGON_S2_storerf_pci, {{ 1,
true, 4, 1 }} },
3550 { Hexagon::BI__builtin_HEXAGON_S2_storeri_pci, {{ 1,
true, 4, 2 }} },
3551 { Hexagon::BI__builtin_HEXAGON_S2_storerd_pci, {{ 1,
true, 4, 3 }} },
3553 { Hexagon::BI__builtin_HEXAGON_A2_combineii, {{ 1,
true, 8, 0 }} },
3554 { Hexagon::BI__builtin_HEXAGON_A2_tfrih, {{ 1,
false, 16, 0 }} },
3555 { Hexagon::BI__builtin_HEXAGON_A2_tfril, {{ 1,
false, 16, 0 }} },
3556 { Hexagon::BI__builtin_HEXAGON_A2_tfrpi, {{ 0,
true, 8, 0 }} },
3557 { Hexagon::BI__builtin_HEXAGON_A4_bitspliti, {{ 1,
false, 5, 0 }} },
3558 { Hexagon::BI__builtin_HEXAGON_A4_cmpbeqi, {{ 1,
false, 8, 0 }} },
3559 { Hexagon::BI__builtin_HEXAGON_A4_cmpbgti, {{ 1,
true, 8, 0 }} },
3560 { Hexagon::BI__builtin_HEXAGON_A4_cround_ri, {{ 1,
false, 5, 0 }} },
3561 { Hexagon::BI__builtin_HEXAGON_A4_round_ri, {{ 1,
false, 5, 0 }} },
3562 { Hexagon::BI__builtin_HEXAGON_A4_round_ri_sat, {{ 1,
false, 5, 0 }} },
3563 { Hexagon::BI__builtin_HEXAGON_A4_vcmpbeqi, {{ 1,
false, 8, 0 }} },
3564 { Hexagon::BI__builtin_HEXAGON_A4_vcmpbgti, {{ 1,
true, 8, 0 }} },
3565 { Hexagon::BI__builtin_HEXAGON_A4_vcmpbgtui, {{ 1,
false, 7, 0 }} },
3566 { Hexagon::BI__builtin_HEXAGON_A4_vcmpheqi, {{ 1,
true, 8, 0 }} },
3567 { Hexagon::BI__builtin_HEXAGON_A4_vcmphgti, {{ 1,
true, 8, 0 }} },
3568 { Hexagon::BI__builtin_HEXAGON_A4_vcmphgtui, {{ 1,
false, 7, 0 }} },
3569 { Hexagon::BI__builtin_HEXAGON_A4_vcmpweqi, {{ 1,
true, 8, 0 }} },
3570 { Hexagon::BI__builtin_HEXAGON_A4_vcmpwgti, {{ 1,
true, 8, 0 }} },
3571 { Hexagon::BI__builtin_HEXAGON_A4_vcmpwgtui, {{ 1,
false, 7, 0 }} },
3572 { Hexagon::BI__builtin_HEXAGON_C2_bitsclri, {{ 1,
false, 6, 0 }} },
3573 { Hexagon::BI__builtin_HEXAGON_C2_muxii, {{ 2,
true, 8, 0 }} },
3574 { Hexagon::BI__builtin_HEXAGON_C4_nbitsclri, {{ 1,
false, 6, 0 }} },
3575 { Hexagon::BI__builtin_HEXAGON_F2_dfclass, {{ 1,
false, 5, 0 }} },
3576 { Hexagon::BI__builtin_HEXAGON_F2_dfimm_n, {{ 0,
false, 10, 0 }} },
3577 { Hexagon::BI__builtin_HEXAGON_F2_dfimm_p, {{ 0,
false, 10, 0 }} },
3578 { Hexagon::BI__builtin_HEXAGON_F2_sfclass, {{ 1,
false, 5, 0 }} },
3579 { Hexagon::BI__builtin_HEXAGON_F2_sfimm_n, {{ 0,
false, 10, 0 }} },
3580 { Hexagon::BI__builtin_HEXAGON_F2_sfimm_p, {{ 0,
false, 10, 0 }} },
3581 { Hexagon::BI__builtin_HEXAGON_M4_mpyri_addi, {{ 2,
false, 6, 0 }} },
3582 { Hexagon::BI__builtin_HEXAGON_M4_mpyri_addr_u2, {{ 1,
false, 6, 2 }} },
3583 { Hexagon::BI__builtin_HEXAGON_S2_addasl_rrri, {{ 2,
false, 3, 0 }} },
3584 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_acc, {{ 2,
false, 6, 0 }} },
3585 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_and, {{ 2,
false, 6, 0 }} },
3586 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p, {{ 1,
false, 6, 0 }} },
3587 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_nac, {{ 2,
false, 6, 0 }} },
3588 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_or, {{ 2,
false, 6, 0 }} },
3589 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_p_xacc, {{ 2,
false, 6, 0 }} },
3590 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_acc, {{ 2,
false, 5, 0 }} },
3591 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_and, {{ 2,
false, 5, 0 }} },
3592 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r, {{ 1,
false, 5, 0 }} },
3593 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_nac, {{ 2,
false, 5, 0 }} },
3594 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_or, {{ 2,
false, 5, 0 }} },
3595 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_sat, {{ 1,
false, 5, 0 }} },
3596 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_r_xacc, {{ 2,
false, 5, 0 }} },
3597 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_vh, {{ 1,
false, 4, 0 }} },
3598 { Hexagon::BI__builtin_HEXAGON_S2_asl_i_vw, {{ 1,
false, 5, 0 }} },
3599 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_acc, {{ 2,
false, 6, 0 }} },
3600 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_and, {{ 2,
false, 6, 0 }} },
3601 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p, {{ 1,
false, 6, 0 }} },
3602 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_nac, {{ 2,
false, 6, 0 }} },
3603 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_or, {{ 2,
false, 6, 0 }} },
3604 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_rnd_goodsyntax,
3605 {{ 1,
false, 6, 0 }} },
3606 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_p_rnd, {{ 1,
false, 6, 0 }} },
3607 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_acc, {{ 2,
false, 5, 0 }} },
3608 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_and, {{ 2,
false, 5, 0 }} },
3609 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r, {{ 1,
false, 5, 0 }} },
3610 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_nac, {{ 2,
false, 5, 0 }} },
3611 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_or, {{ 2,
false, 5, 0 }} },
3612 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd_goodsyntax,
3613 {{ 1,
false, 5, 0 }} },
3614 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_r_rnd, {{ 1,
false, 5, 0 }} },
3615 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_svw_trun, {{ 1,
false, 5, 0 }} },
3616 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_vh, {{ 1,
false, 4, 0 }} },
3617 { Hexagon::BI__builtin_HEXAGON_S2_asr_i_vw, {{ 1,
false, 5, 0 }} },
3618 { Hexagon::BI__builtin_HEXAGON_S2_clrbit_i, {{ 1,
false, 5, 0 }} },
3619 { Hexagon::BI__builtin_HEXAGON_S2_extractu, {{ 1,
false, 5, 0 },
3620 { 2,
false, 5, 0 }} },
3621 { Hexagon::BI__builtin_HEXAGON_S2_extractup, {{ 1,
false, 6, 0 },
3622 { 2,
false, 6, 0 }} },
3623 { Hexagon::BI__builtin_HEXAGON_S2_insert, {{ 2,
false, 5, 0 },
3624 { 3,
false, 5, 0 }} },
3625 { Hexagon::BI__builtin_HEXAGON_S2_insertp, {{ 2,
false, 6, 0 },
3626 { 3,
false, 6, 0 }} },
3627 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_acc, {{ 2,
false, 6, 0 }} },
3628 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_and, {{ 2,
false, 6, 0 }} },
3629 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p, {{ 1,
false, 6, 0 }} },
3630 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_nac, {{ 2,
false, 6, 0 }} },
3631 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_or, {{ 2,
false, 6, 0 }} },
3632 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_p_xacc, {{ 2,
false, 6, 0 }} },
3633 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_acc, {{ 2,
false, 5, 0 }} },
3634 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_and, {{ 2,
false, 5, 0 }} },
3635 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r, {{ 1,
false, 5, 0 }} },
3636 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_nac, {{ 2,
false, 5, 0 }} },
3637 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_or, {{ 2,
false, 5, 0 }} },
3638 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_r_xacc, {{ 2,
false, 5, 0 }} },
3639 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vh, {{ 1,
false, 4, 0 }} },
3640 { Hexagon::BI__builtin_HEXAGON_S2_lsr_i_vw, {{ 1,
false, 5, 0 }} },
3641 { Hexagon::BI__builtin_HEXAGON_S2_setbit_i, {{ 1,
false, 5, 0 }} },
3642 { Hexagon::BI__builtin_HEXAGON_S2_tableidxb_goodsyntax,
3643 {{ 2,
false, 4, 0 },
3644 { 3,
false, 5, 0 }} },
3645 { Hexagon::BI__builtin_HEXAGON_S2_tableidxd_goodsyntax,
3646 {{ 2,
false, 4, 0 },
3647 { 3,
false, 5, 0 }} },
3648 { Hexagon::BI__builtin_HEXAGON_S2_tableidxh_goodsyntax,
3649 {{ 2,
false, 4, 0 },
3650 { 3,
false, 5, 0 }} },
3651 { Hexagon::BI__builtin_HEXAGON_S2_tableidxw_goodsyntax,
3652 {{ 2,
false, 4, 0 },
3653 { 3,
false, 5, 0 }} },
3654 { Hexagon::BI__builtin_HEXAGON_S2_togglebit_i, {{ 1,
false, 5, 0 }} },
3655 { Hexagon::BI__builtin_HEXAGON_S2_tstbit_i, {{ 1,
false, 5, 0 }} },
3656 { Hexagon::BI__builtin_HEXAGON_S2_valignib, {{ 2,
false, 3, 0 }} },
3657 { Hexagon::BI__builtin_HEXAGON_S2_vspliceib, {{ 2,
false, 3, 0 }} },
3658 { Hexagon::BI__builtin_HEXAGON_S4_addi_asl_ri, {{ 2,
false, 5, 0 }} },
3659 { Hexagon::BI__builtin_HEXAGON_S4_addi_lsr_ri, {{ 2,
false, 5, 0 }} },
3660 { Hexagon::BI__builtin_HEXAGON_S4_andi_asl_ri, {{ 2,
false, 5, 0 }} },
3661 { Hexagon::BI__builtin_HEXAGON_S4_andi_lsr_ri, {{ 2,
false, 5, 0 }} },
3662 { Hexagon::BI__builtin_HEXAGON_S4_clbaddi, {{ 1,
true , 6, 0 }} },
3663 { Hexagon::BI__builtin_HEXAGON_S4_clbpaddi, {{ 1,
true, 6, 0 }} },
3664 { Hexagon::BI__builtin_HEXAGON_S4_extract, {{ 1,
false, 5, 0 },
3665 { 2,
false, 5, 0 }} },
3666 { Hexagon::BI__builtin_HEXAGON_S4_extractp, {{ 1,
false, 6, 0 },
3667 { 2,
false, 6, 0 }} },
3668 { Hexagon::BI__builtin_HEXAGON_S4_lsli, {{ 0,
true, 6, 0 }} },
3669 { Hexagon::BI__builtin_HEXAGON_S4_ntstbit_i, {{ 1,
false, 5, 0 }} },
3670 { Hexagon::BI__builtin_HEXAGON_S4_ori_asl_ri, {{ 2,
false, 5, 0 }} },
3671 { Hexagon::BI__builtin_HEXAGON_S4_ori_lsr_ri, {{ 2,
false, 5, 0 }} },
3672 { Hexagon::BI__builtin_HEXAGON_S4_subi_asl_ri, {{ 2,
false, 5, 0 }} },
3673 { Hexagon::BI__builtin_HEXAGON_S4_subi_lsr_ri, {{ 2,
false, 5, 0 }} },
3674 { Hexagon::BI__builtin_HEXAGON_S4_vrcrotate_acc, {{ 3,
false, 2, 0 }} },
3675 { Hexagon::BI__builtin_HEXAGON_S4_vrcrotate, {{ 2,
false, 2, 0 }} },
3676 { Hexagon::BI__builtin_HEXAGON_S5_asrhub_rnd_sat_goodsyntax,
3677 {{ 1,
false, 4, 0 }} },
3678 { Hexagon::BI__builtin_HEXAGON_S5_asrhub_sat, {{ 1,
false, 4, 0 }} },
3679 { Hexagon::BI__builtin_HEXAGON_S5_vasrhrnd_goodsyntax,
3680 {{ 1,
false, 4, 0 }} },
3681 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p, {{ 1,
false, 6, 0 }} },
3682 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_acc, {{ 2,
false, 6, 0 }} },
3683 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_and, {{ 2,
false, 6, 0 }} },
3684 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_nac, {{ 2,
false, 6, 0 }} },
3685 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_or, {{ 2,
false, 6, 0 }} },
3686 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_p_xacc, {{ 2,
false, 6, 0 }} },
3687 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r, {{ 1,
false, 5, 0 }} },
3688 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_acc, {{ 2,
false, 5, 0 }} },
3689 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_and, {{ 2,
false, 5, 0 }} },
3690 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_nac, {{ 2,
false, 5, 0 }} },
3691 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_or, {{ 2,
false, 5, 0 }} },
3692 { Hexagon::BI__builtin_HEXAGON_S6_rol_i_r_xacc, {{ 2,
false, 5, 0 }} },
3693 { Hexagon::BI__builtin_HEXAGON_V6_valignbi, {{ 2,
false, 3, 0 }} },
3694 { Hexagon::BI__builtin_HEXAGON_V6_valignbi_128B, {{ 2,
false, 3, 0 }} },
3695 { Hexagon::BI__builtin_HEXAGON_V6_vlalignbi, {{ 2,
false, 3, 0 }} },
3696 { Hexagon::BI__builtin_HEXAGON_V6_vlalignbi_128B, {{ 2,
false, 3, 0 }} },
3697 { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi, {{ 2,
false, 1, 0 }} },
3698 { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi_128B, {{ 2,
false, 1, 0 }} },
3699 { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi_acc, {{ 3,
false, 1, 0 }} },
3700 { Hexagon::BI__builtin_HEXAGON_V6_vrmpybusi_acc_128B,
3701 {{ 3,
false, 1, 0 }} },
3702 { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi, {{ 2,
false, 1, 0 }} },
3703 { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi_128B, {{ 2,
false, 1, 0 }} },
3704 { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi_acc, {{ 3,
false, 1, 0 }} },
3705 { Hexagon::BI__builtin_HEXAGON_V6_vrmpyubi_acc_128B,
3706 {{ 3,
false, 1, 0 }} },
3707 { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi, {{ 2,
false, 1, 0 }} },
3708 { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi_128B, {{ 2,
false, 1, 0 }} },
3709 { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi_acc, {{ 3,
false, 1, 0 }} },
3710 { Hexagon::BI__builtin_HEXAGON_V6_vrsadubi_acc_128B,
3711 {{ 3,
false, 1, 0 }} },
3713 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10, {{ 2,
false, 2, 0 }} },
3714 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10_128B,
3715 {{ 2,
false, 2, 0 }} },
3716 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10_vxx,
3717 {{ 3,
false, 2, 0 }} },
3718 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyhubs10_vxx_128B,
3719 {{ 3,
false, 2, 0 }} },
3720 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10, {{ 2,
false, 2, 0 }} },
3721 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10_128B,
3722 {{ 2,
false, 2, 0 }} },
3723 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10_vxx,
3724 {{ 3,
false, 2, 0 }} },
3725 { Hexagon::BI__builtin_HEXAGON_V6_v6mpyvubs10_vxx_128B,
3726 {{ 3,
false, 2, 0 }} },
3727 { Hexagon::BI__builtin_HEXAGON_V6_vlutvvbi, {{ 2,
false, 3, 0 }} },
3728 { Hexagon::BI__builtin_HEXAGON_V6_vlutvvbi_128B, {{ 2,
false, 3, 0 }} },
3729 { Hexagon::BI__builtin_HEXAGON_V6_vlutvvb_oracci, {{ 3,
false, 3, 0 }} },
3730 { Hexagon::BI__builtin_HEXAGON_V6_vlutvvb_oracci_128B,
3731 {{ 3,
false, 3, 0 }} },
3732 { Hexagon::BI__builtin_HEXAGON_V6_vlutvwhi, {{ 2,
false, 3, 0 }} },
3733 { Hexagon::BI__builtin_HEXAGON_V6_vlutvwhi_128B, {{ 2,
false, 3, 0 }} },
3734 { Hexagon::BI__builtin_HEXAGON_V6_vlutvwh_oracci, {{ 3,
false, 3, 0 }} },
3735 { Hexagon::BI__builtin_HEXAGON_V6_vlutvwh_oracci_128B,
3736 {{ 3,
false, 3, 0 }} },
3741 static const bool SortOnce =
3744 return LHS.BuiltinID < RHS.BuiltinID;
3750 Infos, [=](
const BuiltinInfo &BI) {
return BI.BuiltinID < BuiltinID; });
3751 if (F == std::end(Infos) || F->BuiltinID != BuiltinID)
3756 for (
const ArgInfo &A : F->Infos) {
3758 if (A.BitWidth == 0)
3761 int32_t Min = A.IsSigned ? -(1 << (A.BitWidth - 1)) : 0;
3762 int32_t Max = (1 << (A.IsSigned ? A.BitWidth - 1 : A.BitWidth)) - 1;
3764 Error |= SemaBuiltinConstantArgRange(TheCall, A.OpNum, Min, Max);
3766 unsigned M = 1 << A.Align;
3769 Error |= SemaBuiltinConstantArgRange(TheCall, A.OpNum, Min, Max);
3770 Error |= SemaBuiltinConstantArgMultiple(TheCall, A.OpNum, M);
3776bool Sema::CheckHexagonBuiltinFunctionCall(
unsigned BuiltinID,
3778 return CheckHexagonBuiltinArgument(BuiltinID, TheCall);
3781bool Sema::CheckLoongArchBuiltinFunctionCall(
const TargetInfo &TI,
3784 switch (BuiltinID) {
3787 case LoongArch::BI__builtin_loongarch_cacop_d:
3790 diag::err_loongarch_builtin_requires_la64)
3793 case LoongArch::BI__builtin_loongarch_cacop_w: {
3794 if (BuiltinID == LoongArch::BI__builtin_loongarch_cacop_w &&
3797 diag::err_loongarch_builtin_requires_la32)
3799 SemaBuiltinConstantArgRange(TheCall, 0, 0, llvm::maxUIntN(5));
3800 SemaBuiltinConstantArgRange(TheCall, 2, llvm::minIntN(12),
3804 case LoongArch::BI__builtin_loongarch_crc_w_b_w:
3805 case LoongArch::BI__builtin_loongarch_crc_w_h_w:
3806 case LoongArch::BI__builtin_loongarch_crc_w_w_w:
3807 case LoongArch::BI__builtin_loongarch_crc_w_d_w:
3808 case LoongArch::BI__builtin_loongarch_crcc_w_b_w:
3809 case LoongArch::BI__builtin_loongarch_crcc_w_h_w:
3810 case LoongArch::BI__builtin_loongarch_crcc_w_w_w:
3811 case LoongArch::BI__builtin_loongarch_crcc_w_d_w:
3812 case LoongArch::BI__builtin_loongarch_iocsrrd_d:
3813 case LoongArch::BI__builtin_loongarch_iocsrwr_d:
3814 case LoongArch::BI__builtin_loongarch_asrtle_d:
3815 case LoongArch::BI__builtin_loongarch_asrtgt_d:
3818 diag::err_loongarch_builtin_requires_la64)
3821 case LoongArch::BI__builtin_loongarch_break:
3822 case LoongArch::BI__builtin_loongarch_dbar:
3823 case LoongArch::BI__builtin_loongarch_ibar:
3824 case LoongArch::BI__builtin_loongarch_syscall:
3826 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 32767);
3827 case LoongArch::BI__builtin_loongarch_csrrd_w:
3828 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 16383);
3829 case LoongArch::BI__builtin_loongarch_csrwr_w:
3830 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 16383);
3831 case LoongArch::BI__builtin_loongarch_csrxchg_w:
3832 return SemaBuiltinConstantArgRange(TheCall, 2, 0, 16383);
3833 case LoongArch::BI__builtin_loongarch_csrrd_d:
3836 diag::err_loongarch_builtin_requires_la64)
3838 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 16383);
3839 case LoongArch::BI__builtin_loongarch_csrwr_d:
3842 diag::err_loongarch_builtin_requires_la64)
3844 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 16383);
3845 case LoongArch::BI__builtin_loongarch_csrxchg_d:
3848 diag::err_loongarch_builtin_requires_la64)
3850 return SemaBuiltinConstantArgRange(TheCall, 2, 0, 16383);
3851 case LoongArch::BI__builtin_loongarch_lddir_d:
3852 case LoongArch::BI__builtin_loongarch_ldpte_d:
3855 diag::err_loongarch_builtin_requires_la64)
3857 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 31);
3858 case LoongArch::BI__builtin_loongarch_movfcsr2gr:
3859 case LoongArch::BI__builtin_loongarch_movgr2fcsr:
3860 return SemaBuiltinConstantArgRange(TheCall, 0, 0, llvm::maxUIntN(2));
3866bool Sema::CheckMipsBuiltinFunctionCall(
const TargetInfo &TI,
3867 unsigned BuiltinID,
CallExpr *TheCall) {
3868 return CheckMipsBuiltinCpu(TI, BuiltinID, TheCall) ||
3869 CheckMipsBuiltinArgument(BuiltinID, TheCall);
3872bool Sema::CheckMipsBuiltinCpu(
const TargetInfo &TI,
unsigned BuiltinID,
3875 if (Mips::BI__builtin_mips_addu_qb <= BuiltinID &&
3876 BuiltinID <= Mips::BI__builtin_mips_lwx) {
3878 return Diag(TheCall->
getBeginLoc(), diag::err_mips_builtin_requires_dsp);
3881 if (Mips::BI__builtin_mips_absq_s_qb <= BuiltinID &&
3882 BuiltinID <= Mips::BI__builtin_mips_subuh_r_qb) {
3885 diag::err_mips_builtin_requires_dspr2);
3888 if (Mips::BI__builtin_msa_add_a_b <= BuiltinID &&
3889 BuiltinID <= Mips::BI__builtin_msa_xori_b) {
3891 return Diag(TheCall->
getBeginLoc(), diag::err_mips_builtin_requires_msa);
3906bool Sema::CheckMipsBuiltinArgument(
unsigned BuiltinID,
CallExpr *TheCall) {
3907 unsigned i = 0, l = 0, u = 0, m = 0;
3908 switch (BuiltinID) {
3909 default:
return false;
3910 case Mips::BI__builtin_mips_wrdsp: i = 1; l = 0; u = 63;
break;
3911 case Mips::BI__builtin_mips_rddsp: i = 0; l = 0; u = 63;
break;
3912 case Mips::BI__builtin_mips_append: i = 2; l = 0; u = 31;
break;
3913 case Mips::BI__builtin_mips_balign: i = 2; l = 0; u = 3;
break;
3914 case Mips::BI__builtin_mips_precr_sra_ph_w: i = 2; l = 0; u = 31;
break;
3915 case Mips::BI__builtin_mips_precr_sra_r_ph_w: i = 2; l = 0; u = 31;
break;
3916 case Mips::BI__builtin_mips_prepend: i = 2; l = 0; u = 31;
break;
3920 case Mips::BI__builtin_msa_bclri_b:
3921 case Mips::BI__builtin_msa_bnegi_b:
3922 case Mips::BI__builtin_msa_bseti_b:
3923 case Mips::BI__builtin_msa_sat_s_b:
3924 case Mips::BI__builtin_msa_sat_u_b:
3925 case Mips::BI__builtin_msa_slli_b:
3926 case Mips::BI__builtin_msa_srai_b:
3927 case Mips::BI__builtin_msa_srari_b:
3928 case Mips::BI__builtin_msa_srli_b:
3929 case Mips::BI__builtin_msa_srlri_b: i = 1; l = 0; u = 7;
break;
3930 case Mips::BI__builtin_msa_binsli_b:
3931 case Mips::BI__builtin_msa_binsri_b: i = 2; l = 0; u = 7;
break;
3933 case Mips::BI__builtin_msa_bclri_h:
3934 case Mips::BI__builtin_msa_bnegi_h:
3935 case Mips::BI__builtin_msa_bseti_h:
3936 case Mips::BI__builtin_msa_sat_s_h:
3937 case Mips::BI__builtin_msa_sat_u_h:
3938 case Mips::BI__builtin_msa_slli_h:
3939 case Mips::BI__builtin_msa_srai_h:
3940 case Mips::BI__builtin_msa_srari_h:
3941 case Mips::BI__builtin_msa_srli_h:
3942 case Mips::BI__builtin_msa_srlri_h: i = 1; l = 0; u = 15;
break;
3943 case Mips::BI__builtin_msa_binsli_h:
3944 case Mips::BI__builtin_msa_binsri_h: i = 2; l = 0; u = 15;
break;
3948 case Mips::BI__builtin_msa_cfcmsa:
3949 case Mips::BI__builtin_msa_ctcmsa: i = 0; l = 0; u = 31;
break;
3950 case Mips::BI__builtin_msa_clei_u_b:
3951 case Mips::BI__builtin_msa_clei_u_h:
3952 case Mips::BI__builtin_msa_clei_u_w:
3953 case Mips::BI__builtin_msa_clei_u_d:
3954 case Mips::BI__builtin_msa_clti_u_b:
3955 case Mips::BI__builtin_msa_clti_u_h:
3956 case Mips::BI__builtin_msa_clti_u_w:
3957 case Mips::BI__builtin_msa_clti_u_d:
3958 case Mips::BI__builtin_msa_maxi_u_b:
3959 case Mips::BI__builtin_msa_maxi_u_h:
3960 case Mips::BI__builtin_msa_maxi_u_w:
3961 case Mips::BI__builtin_msa_maxi_u_d:
3962 case Mips::BI__builtin_msa_mini_u_b:
3963 case Mips::BI__builtin_msa_mini_u_h:
3964 case Mips::BI__builtin_msa_mini_u_w:
3965 case Mips::BI__builtin_msa_mini_u_d:
3966 case Mips::BI__builtin_msa_addvi_b:
3967 case Mips::BI__builtin_msa_addvi_h:
3968 case Mips::BI__builtin_msa_addvi_w:
3969 case Mips::BI__builtin_msa_addvi_d:
3970 case Mips::BI__builtin_msa_bclri_w:
3971 case Mips::BI__builtin_msa_bnegi_w:
3972 case Mips::BI__builtin_msa_bseti_w:
3973 case Mips::BI__builtin_msa_sat_s_w:
3974 case Mips::BI__builtin_msa_sat_u_w:
3975 case Mips::BI__builtin_msa_slli_w:
3976 case Mips::BI__builtin_msa_srai_w:
3977 case Mips::BI__builtin_msa_srari_w:
3978 case Mips::BI__builtin_msa_srli_w:
3979 case Mips::BI__builtin_msa_srlri_w:
3980 case Mips::BI__builtin_msa_subvi_b:
3981 case Mips::BI__builtin_msa_subvi_h:
3982 case Mips::BI__builtin_msa_subvi_w:
3983 case Mips::BI__builtin_msa_subvi_d: i = 1; l = 0; u = 31;
break;
3984 case Mips::BI__builtin_msa_binsli_w:
3985 case Mips::BI__builtin_msa_binsri_w: i = 2; l = 0; u = 31;
break;
3987 case Mips::BI__builtin_msa_bclri_d:
3988 case Mips::BI__builtin_msa_bnegi_d:
3989 case Mips::BI__builtin_msa_bseti_d:
3990 case Mips::BI__builtin_msa_sat_s_d:
3991 case Mips::BI__builtin_msa_sat_u_d:
3992 case Mips::BI__builtin_msa_slli_d:
3993 case Mips::BI__builtin_msa_srai_d:
3994 case Mips::BI__builtin_msa_srari_d:
3995 case Mips::BI__builtin_msa_srli_d:
3996 case Mips::BI__builtin_msa_srlri_d: i = 1; l = 0; u = 63;
break;
3997 case Mips::BI__builtin_msa_binsli_d:
3998 case Mips::BI__builtin_msa_binsri_d: i = 2; l = 0; u = 63;
break;
4000 case Mips::BI__builtin_msa_ceqi_b:
4001 case Mips::BI__builtin_msa_ceqi_h:
4002 case Mips::BI__builtin_msa_ceqi_w:
4003 case Mips::BI__builtin_msa_ceqi_d:
4004 case Mips::BI__builtin_msa_clti_s_b:
4005 case Mips::BI__builtin_msa_clti_s_h:
4006 case Mips::BI__builtin_msa_clti_s_w:
4007 case Mips::BI__builtin_msa_clti_s_d:
4008 case Mips::BI__builtin_msa_clei_s_b:
4009 case Mips::BI__builtin_msa_clei_s_h:
4010 case Mips::BI__builtin_msa_clei_s_w:
4011 case Mips::BI__builtin_msa_clei_s_d:
4012 case Mips::BI__builtin_msa_maxi_s_b:
4013 case Mips::BI__builtin_msa_maxi_s_h:
4014 case Mips::BI__builtin_msa_maxi_s_w:
4015 case Mips::BI__builtin_msa_maxi_s_d:
4016 case Mips::BI__builtin_msa_mini_s_b:
4017 case Mips::BI__builtin_msa_mini_s_h:
4018 case Mips::BI__builtin_msa_mini_s_w:
4019 case Mips::BI__builtin_msa_mini_s_d: i = 1; l = -16; u = 15;
break;
4021 case Mips::BI__builtin_msa_andi_b:
4022 case Mips::BI__builtin_msa_nori_b:
4023 case Mips::BI__builtin_msa_ori_b:
4024 case Mips::BI__builtin_msa_shf_b:
4025 case Mips::BI__builtin_msa_shf_h:
4026 case Mips::BI__builtin_msa_shf_w:
4027 case Mips::BI__builtin_msa_xori_b: i = 1; l = 0; u = 255;
break;
4028 case Mips::BI__builtin_msa_bseli_b:
4029 case Mips::BI__builtin_msa_bmnzi_b:
4030 case Mips::BI__builtin_msa_bmzi_b: i = 2; l = 0; u = 255;
break;
4033 case Mips::BI__builtin_msa_copy_s_b:
4034 case Mips::BI__builtin_msa_copy_u_b:
4035 case Mips::BI__builtin_msa_insve_b:
4036 case Mips::BI__builtin_msa_splati_b: i = 1; l = 0; u = 15;
break;
4037 case Mips::BI__builtin_msa_sldi_b: i = 2; l = 0; u = 15;
break;
4039 case Mips::BI__builtin_msa_copy_s_h:
4040 case Mips::BI__builtin_msa_copy_u_h:
4041 case Mips::BI__builtin_msa_insve_h:
4042 case Mips::BI__builtin_msa_splati_h: i = 1; l = 0; u = 7;
break;
4043 case Mips::BI__builtin_msa_sldi_h: i = 2; l = 0; u = 7;
break;
4045 case Mips::BI__builtin_msa_copy_s_w:
4046 case Mips::BI__builtin_msa_copy_u_w:
4047 case Mips::BI__builtin_msa_insve_w:
4048 case Mips::BI__builtin_msa_splati_w: i = 1; l = 0; u = 3;
break;
4049 case Mips::BI__builtin_msa_sldi_w: i = 2; l = 0; u = 3;
break;
4051 case Mips::BI__builtin_msa_copy_s_d:
4052 case Mips::BI__builtin_msa_copy_u_d:
4053 case Mips::BI__builtin_msa_insve_d:
4054 case Mips::BI__builtin_msa_splati_d: i = 1; l = 0; u = 1;
break;
4055 case Mips::BI__builtin_msa_sldi_d: i = 2; l = 0; u = 1;
break;
4058 case Mips::BI__builtin_msa_ldi_b: i = 0; l = -128; u = 255;
break;
4059 case Mips::BI__builtin_msa_ldi_h:
4060 case Mips::BI__builtin_msa_ldi_w:
4061 case Mips::BI__builtin_msa_ldi_d: i = 0; l = -512; u = 511;
break;
4062 case Mips::BI__builtin_msa_ld_b: i = 1; l = -512; u = 511; m = 1;
break;
4063 case Mips::BI__builtin_msa_ld_h: i = 1; l = -1024; u = 1022; m = 2;
break;
4064 case Mips::BI__builtin_msa_ld_w: i = 1; l = -2048; u = 2044; m = 4;
break;
4065 case Mips::BI__builtin_msa_ld_d: i = 1; l = -4096; u = 4088; m = 8;
break;
4066 case Mips::BI__builtin_msa_ldr_d: i = 1; l = -4096; u = 4088; m = 8;
break;
4067 case Mips::BI__builtin_msa_ldr_w: i = 1; l = -2048; u = 2044; m = 4;
break;
4068 case Mips::BI__builtin_msa_st_b: i = 2; l = -512; u = 511; m = 1;
break;
4069 case Mips::BI__builtin_msa_st_h: i = 2; l = -1024; u = 1022; m = 2;
break;
4070 case Mips::BI__builtin_msa_st_w: i = 2; l = -2048; u = 2044; m = 4;
break;
4071 case Mips::BI__builtin_msa_st_d: i = 2; l = -4096; u = 4088; m = 8;
break;
4072 case Mips::BI__builtin_msa_str_d: i = 2; l = -4096; u = 4088; m = 8;
break;
4073 case Mips::BI__builtin_msa_str_w: i = 2; l = -2048; u = 2044; m = 4;
break;
4077 return SemaBuiltinConstantArgRange(TheCall, i, l, u);
4079 return SemaBuiltinConstantArgRange(TheCall, i, l, u) ||
4080 SemaBuiltinConstantArgMultiple(TheCall, i, m);
4091 bool RequireICE =
false;
4099 unsigned size = strtoul(Str, &End, 10);
4100 assert(End != Str &&
"Missing constant parameter constraint");
4103 return Context.
IntTy;
4107 unsigned size = strtoul(Str, &End, 10);
4108 assert(End != Str &&
"Missing PowerPC MMA type size");
4112 #define PPC_VECTOR_TYPE(typeName, Id, size) \
4113 case size: Type = Context.Id##Ty; break;
4114 #include "clang/Basic/PPCTypes.def"
4115 default: llvm_unreachable(
"Invalid PowerPC MMA vector type");
4117 bool CheckVectorArgs =
false;
4118 while (!CheckVectorArgs) {
4127 CheckVectorArgs =
true;
4141 switch (BuiltinID) {
4142 case PPC::BI__builtin_divde:
4143 case PPC::BI__builtin_divdeu:
4144 case PPC::BI__builtin_bpermd:
4145 case PPC::BI__builtin_pdepd:
4146 case PPC::BI__builtin_pextd:
4147 case PPC::BI__builtin_ppc_ldarx:
4148 case PPC::BI__builtin_ppc_stdcx:
4149 case PPC::BI__builtin_ppc_tdw:
4150 case PPC::BI__builtin_ppc_trapd:
4151 case PPC::BI__builtin_ppc_cmpeqb:
4152 case PPC::BI__builtin_ppc_setb:
4153 case PPC::BI__builtin_ppc_mulhd:
4154 case PPC::BI__builtin_ppc_mulhdu:
4155 case PPC::BI__builtin_ppc_maddhd:
4156 case PPC::BI__builtin_ppc_maddhdu:
4157 case PPC::BI__builtin_ppc_maddld:
4158 case PPC::BI__builtin_ppc_load8r:
4159 case PPC::BI__builtin_ppc_store8r:
4160 case PPC::BI__builtin_ppc_insert_exp:
4161 case PPC::BI__builtin_ppc_extract_sig:
4162 case PPC::BI__builtin_ppc_addex:
4163 case PPC::BI__builtin_darn:
4164 case PPC::BI__builtin_darn_raw:
4165 case PPC::BI__builtin_ppc_compare_and_swaplp:
4166 case PPC::BI__builtin_ppc_fetch_and_addlp:
4167 case PPC::BI__builtin_ppc_fetch_and_andlp:
4168 case PPC::BI__builtin_ppc_fetch_and_orlp:
4169 case PPC::BI__builtin_ppc_fetch_and_swaplp:
4176 StringRef FeatureToCheck,
unsigned DiagID,
4177 StringRef DiagArg =
"") {
4181 if (DiagArg.empty())
4194bool Sema::SemaValueIsRunOfOnes(
CallExpr *TheCall,
unsigned ArgNum) {
4202 if (SemaBuiltinConstantArg(TheCall, ArgNum,
Result))
4206 if (
Result.isShiftedMask() || (~
Result).isShiftedMask())
4210 diag::err_argument_not_contiguous_bit_field)
4214bool Sema::CheckPPCBuiltinFunctionCall(
const TargetInfo &TI,
unsigned BuiltinID,
4216 unsigned i = 0, l = 0, u = 0;
4221 return Diag(TheCall->
getBeginLoc(), diag::err_64_bit_builtin_32_bit_tgt)
4224 switch (BuiltinID) {
4225 default:
return false;
4226 case PPC::BI__builtin_altivec_crypto_vshasigmaw:
4227 case PPC::BI__builtin_altivec_crypto_vshasigmad:
4228 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1) ||
4229 SemaBuiltinConstantArgRange(TheCall, 2, 0, 15);
4230 case PPC::BI__builtin_altivec_dss:
4231 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 3);
4232 case PPC::BI__builtin_tbegin:
4233 case PPC::BI__builtin_tend:
4234 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 1) ||
4236 diag::err_ppc_builtin_requires_htm);
4237 case PPC::BI__builtin_tsr:
4238 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 7) ||
4240 diag::err_ppc_builtin_requires_htm);
4241 case PPC::BI__builtin_tabortwc:
4242 case PPC::BI__builtin_tabortdc:
4243 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31) ||
4245 diag::err_ppc_builtin_requires_htm);
4246 case PPC::BI__builtin_tabortwci:
4247 case PPC::BI__builtin_tabortdci:
4249 diag::err_ppc_builtin_requires_htm) ||
4250 (SemaBuiltinConstantArgRange(TheCall, 0, 0, 31) ||
4251 SemaBuiltinConstantArgRange(TheCall, 2, 0, 31));
4252 case PPC::BI__builtin_tabort:
4253 case PPC::BI__builtin_tcheck:
4254 case PPC::BI__builtin_treclaim:
4255 case PPC::BI__builtin_trechkpt:
4256 case PPC::BI__builtin_tendall:
4257 case PPC::BI__builtin_tresume:
4258 case PPC::BI__builtin_tsuspend:
4259 case PPC::BI__builtin_get_texasr:
4260 case PPC::BI__builtin_get_texasru:
4261 case PPC::BI__builtin_get_tfhar:
4262 case PPC::BI__builtin_get_tfiar:
4263 case PPC::BI__builtin_set_texasr:
4264 case PPC::BI__builtin_set_texasru:
4265 case PPC::BI__builtin_set_tfhar:
4266 case PPC::BI__builtin_set_tfiar:
4267 case PPC::BI__builtin_ttest:
4269 diag::err_ppc_builtin_requires_htm);
4273 case PPC::BI__builtin_unpack_longdouble:
4274 if (SemaBuiltinConstantArgRange(TheCall, 1, 0, 1))
4277 case PPC::BI__builtin_pack_longdouble:
4279 return Diag(TheCall->
getBeginLoc(), diag::err_ppc_builtin_requires_abi)
4282 case PPC::BI__builtin_altivec_dst:
4283 case PPC::BI__builtin_altivec_dstt:
4284 case PPC::BI__builtin_altivec_dstst:
4285 case PPC::BI__builtin_altivec_dststt:
4286 return SemaBuiltinConstantArgRange(TheCall, 2, 0, 3);
4287 case PPC::BI__builtin_vsx_xxpermdi:
4288 case PPC::BI__builtin_vsx_xxsldwi:
4289 return SemaBuiltinVSX(TheCall);
4290 case PPC::BI__builtin_divwe:
4291 case PPC::BI__builtin_divweu:
4292 case PPC::BI__builtin_divde:
4293 case PPC::BI__builtin_divdeu:
4295 diag::err_ppc_builtin_only_on_arch,
"7");
4296 case PPC::BI__builtin_bpermd:
4298 diag::err_ppc_builtin_only_on_arch,
"7");
4299 case PPC::BI__builtin_unpack_vector_int128:
4301 diag::err_ppc_builtin_only_on_arch,
"7") ||
4302 SemaBuiltinConstantArgRange(TheCall, 1, 0, 1);
4303 case PPC::BI__builtin_pack_vector_int128:
4305 diag::err_ppc_builtin_only_on_arch,
"7");
4306 case PPC::BI__builtin_pdepd:
4307 case PPC::BI__builtin_pextd:
4309 diag::err_ppc_builtin_only_on_arch,
"10");
4310 case PPC::BI__builtin_altivec_vgnb:
4311 return SemaBuiltinConstantArgRange(TheCall, 1, 2, 7);
4312 case PPC::BI__builtin_vsx_xxeval:
4313 return SemaBuiltinConstantArgRange(TheCall, 3, 0, 255);
4314 case PPC::BI__builtin_altivec_vsldbi:
4315 return SemaBuiltinConstantArgRange(TheCall, 2, 0, 7);
4316 case PPC::BI__builtin_altivec_vsrdbi:
4317 return SemaBuiltinConstantArgRange(TheCall, 2, 0, 7);
4318 case PPC::BI__builtin_vsx_xxpermx:
4319 return SemaBuiltinConstantArgRange(TheCall, 3, 0, 7);
4320 case PPC::BI__builtin_ppc_tw:
4321 case PPC::BI__builtin_ppc_tdw:
4322 return SemaBuiltinConstantArgRange(TheCall, 2, 1, 31);
4323 case PPC::BI__builtin_ppc_cmpeqb:
4324 case PPC::BI__builtin_ppc_setb:
4325 case PPC::BI__builtin_ppc_maddhd:
4326 case PPC::BI__builtin_ppc_maddhdu:
4327 case PPC::BI__builtin_ppc_maddld:
4329 diag::err_ppc_builtin_only_on_arch,
"9");
4330 case PPC::BI__builtin_ppc_cmprb:
4332 diag::err_ppc_builtin_only_on_arch,
"9") ||
4333 SemaBuiltinConstantArgRange(TheCall, 0, 0, 1);
4336 case PPC::BI__builtin_ppc_rlwnm:
4337 return SemaValueIsRunOfOnes(TheCall, 2);
4338 case PPC::BI__builtin_ppc_rlwimi:
4339 case PPC::BI__builtin_ppc_rldimi:
4340 return SemaBuiltinConstantArg(TheCall, 2,
Result) ||
4341 SemaValueIsRunOfOnes(TheCall, 3);
4342 case PPC::BI__builtin_ppc_extract_exp:
4343 case PPC::BI__builtin_ppc_extract_sig:
4344 case PPC::BI__builtin_ppc_insert_exp:
4346 diag::err_ppc_builtin_only_on_arch,
"9");
4347 case PPC::BI__builtin_ppc_addex: {
4349 diag::err_ppc_builtin_only_on_arch,
"9") ||
4350 SemaBuiltinConstantArgRange(TheCall, 2, 0, 3))
4360 case PPC::BI__builtin_ppc_mtfsb0:
4361 case PPC::BI__builtin_ppc_mtfsb1:
4362 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 31);
4363 case PPC::BI__builtin_ppc_mtfsf:
4364 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 255);
4365 case PPC::BI__builtin_ppc_mtfsfi:
4366 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 7) ||
4367 SemaBuiltinConstantArgRange(TheCall, 1, 0, 15);
4368 case PPC::BI__builtin_ppc_alignx:
4369 return SemaBuiltinConstantArgPower2(TheCall, 0);
4370 case PPC::BI__builtin_ppc_rdlam:
4371 return SemaValueIsRunOfOnes(TheCall, 2);
4372 case PPC::BI__builtin_ppc_icbt:
4373 case PPC::BI__builtin_ppc_sthcx:
4374 case PPC::BI__builtin_ppc_stbcx:
4375 case PPC::BI__builtin_ppc_lharx:
4376 case PPC::BI__builtin_ppc_lbarx:
4378 diag::err_ppc_builtin_only_on_arch,
"8");
4379 case PPC::BI__builtin_vsx_ldrmb:
4380 case PPC::BI__builtin_vsx_strmb:
4382 diag::err_ppc_builtin_only_on_arch,
"8") ||
4383 SemaBuiltinConstantArgRange(TheCall, 1, 1, 16);
4384 case PPC::BI__builtin_altivec_vcntmbb:
4385 case PPC::BI__builtin_altivec_vcntmbh:
4386 case PPC::BI__builtin_altivec_vcntmbw:
4387 case PPC::BI__builtin_altivec_vcntmbd:
4388 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 1);
4389 case PPC::BI__builtin_darn:
4390 case PPC::BI__builtin_darn_raw:
4391 case PPC::BI__builtin_darn_32:
4393 diag::err_ppc_builtin_only_on_arch,
"9");
4394 case PPC::BI__builtin_vsx_xxgenpcvbm:
4395 case PPC::BI__builtin_vsx_xxgenpcvhm:
4396 case PPC::BI__builtin_vsx_xxgenpcvwm:
4397 case PPC::BI__builtin_vsx_xxgenpcvdm:
4398 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 3);
4399 case PPC::BI__builtin_ppc_compare_exp_uo:
4400 case PPC::BI__builtin_ppc_compare_exp_lt:
4401 case PPC::BI__builtin_ppc_compare_exp_gt:
4402 case PPC::BI__builtin_ppc_compare_exp_eq:
4404 diag::err_ppc_builtin_only_on_arch,
"9") ||
4406 diag::err_ppc_builtin_requires_vsx);
4407 case PPC::BI__builtin_ppc_test_data_class: {
4415 diag::err_ppc_invalid_test_data_class_type);
4417 diag::err_ppc_builtin_only_on_arch,
"9") ||
4419 diag::err_ppc_builtin_requires_vsx) ||
4420 SemaBuiltinConstantArgRange(TheCall, 1, 0, 127);
4422 case PPC::BI__builtin_ppc_maxfe:
4423 case PPC::BI__builtin_ppc_minfe:
4424 case PPC::BI__builtin_ppc_maxfl:
4425 case PPC::BI__builtin_ppc_minfl:
4426 case PPC::BI__builtin_ppc_maxfs:
4427 case PPC::BI__builtin_ppc_minfs: {
4429 (BuiltinID == PPC::BI__builtin_ppc_maxfe ||
4430 BuiltinID == PPC::BI__builtin_ppc_minfe))
4431 return Diag(TheCall->
getBeginLoc(), diag::err_target_unsupported_type)
4436 if (BuiltinID == PPC::BI__builtin_ppc_maxfl ||
4437 BuiltinID == PPC::BI__builtin_ppc_minfl)
4439 else if (BuiltinID == PPC::BI__builtin_ppc_maxfs ||
4440 BuiltinID == PPC::BI__builtin_ppc_minfs)
4442 for (
unsigned I = 0, E = TheCall->
getNumArgs(); I < E; ++I)
4445 diag::err_typecheck_convert_incompatible)
4449 case PPC::BI__builtin_ppc_load8r:
4450 case PPC::BI__builtin_ppc_store8r:
4452 diag::err_ppc_builtin_only_on_arch,
"7");
4453#define CUSTOM_BUILTIN(Name, Intr, Types, Acc) \
4454 case PPC::BI__builtin_##Name: \
4455 return SemaBuiltinPPCMMACall(TheCall, BuiltinID, Types);
4456#include "clang/Basic/BuiltinsPPC.def"
4458 return SemaBuiltinConstantArgRange(TheCall, i, l, u);
4467 QualType CoreType =
Type.getCanonicalType().getUnqualifiedType();
4468#define PPC_VECTOR_TYPE(Name, Id, Size) || CoreType == Context.Id##Ty
4470#include
"clang/Basic/PPCTypes.def"
4472 Diag(
TypeLoc, diag::err_ppc_invalid_use_mma_type);
4478bool Sema::CheckAMDGCNBuiltinFunctionCall(
unsigned BuiltinID,
4481 unsigned OrderIndex, ScopeIndex;
4482 switch (BuiltinID) {
4483 case AMDGPU::BI__builtin_amdgcn_atomic_inc32:
4484 case AMDGPU::BI__builtin_amdgcn_atomic_inc64:
4485 case AMDGPU::BI__builtin_amdgcn_atomic_dec32:
4486 case AMDGPU::BI__builtin_amdgcn_atomic_dec64:
4490 case AMDGPU::BI__builtin_amdgcn_fence:
4499 auto ArgExpr = Arg.
get();
4502 if (!ArgExpr->EvaluateAsInt(ArgResult,
Context))
4503 return Diag(ArgExpr->getExprLoc(), diag::err_typecheck_expect_int)
4504 << ArgExpr->getType();
4505 auto Ord = ArgResult.
Val.
getInt().getZExtValue();
4509 if (!llvm::isValidAtomicOrderingCABI(Ord))
4510 return Diag(ArgExpr->getBeginLoc(),
4511 diag::warn_atomic_op_has_invalid_memory_order)
4512 << ArgExpr->getSourceRange();
4513 switch (
static_cast<llvm::AtomicOrderingCABI
>(Ord)) {
4514 case llvm::AtomicOrderingCABI::relaxed:
4515 case llvm::AtomicOrderingCABI::consume:
4516 if (BuiltinID == AMDGPU::BI__builtin_amdgcn_fence)
4517 return Diag(ArgExpr->getBeginLoc(),
4518 diag::warn_atomic_op_has_invalid_memory_order)
4519 << ArgExpr->getSourceRange();
4521 case llvm::AtomicOrderingCABI::acquire:
4522 case llvm::AtomicOrderingCABI::release:
4523 case llvm::AtomicOrderingCABI::acq_rel:
4524 case llvm::AtomicOrderingCABI::seq_cst:
4528 Arg = TheCall->
getArg(ScopeIndex);
4529 ArgExpr = Arg.
get();
4532 if (!ArgExpr->EvaluateAsConstantExpr(ArgResult1,
Context))
4533 return Diag(ArgExpr->getExprLoc(), diag::err_expr_not_string_literal)
4534 << ArgExpr->getType();
4539bool Sema::CheckRISCVLMUL(
CallExpr *TheCall,
unsigned ArgNum) {
4548 if (SemaBuiltinConstantArg(TheCall, ArgNum,
Result))
4552 if ((Val >= 0 && Val <= 3) || (Val >= 5 && Val <= 7))
4555 return Diag(TheCall->
getBeginLoc(), diag::err_riscv_builtin_invalid_lmul)
4559bool Sema::CheckRISCVBuiltinFunctionCall(
const TargetInfo &TI,
4564 bool FeatureMissing =
false;
4567 Features.split(ReqFeatures,
',');
4570 for (StringRef F : ReqFeatures) {
4572 F.split(ReqOpFeatures,
'|');
4574 if (llvm::none_of(ReqOpFeatures,
4575 [&TI](StringRef OF) {
return TI.
hasFeature(OF); })) {
4576 std::string FeatureStrs;
4577 bool IsExtension =
true;
4578 for (StringRef OF : ReqOpFeatures) {
4581 if (OF ==
"64bit") {
4582 assert(ReqOpFeatures.size() == 1 &&
"Expected '64bit' to be alone");
4584 IsExtension =
false;
4586 if (OF ==
"32bit") {
4587 assert(ReqOpFeatures.size() == 1 &&
"Expected '32bit' to be alone");
4589 IsExtension =
false;
4593 OF.consume_front(
"experimental-");
4594 std::string FeatureStr = OF.str();
4595 FeatureStr[0] = std::toupper(FeatureStr[0]);
4597 FeatureStrs += FeatureStrs ==
"" ?
"" :
", ";
4599 FeatureStrs += FeatureStr;
4603 FeatureMissing =
true;
4604 Diag(TheCall->
getBeginLoc(), diag::err_riscv_builtin_requires_extension)
4613 switch (BuiltinID) {
4614 case RISCVVector::BI__builtin_rvv_vsetvli:
4615 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 3) ||
4616 CheckRISCVLMUL(TheCall, 2);
4617 case RISCVVector::BI__builtin_rvv_vsetvlimax:
4618 return SemaBuiltinConstantArgRange(TheCall, 0, 0, 3) ||
4619 CheckRISCVLMUL(TheCall, 1);
4620 case RISCVVector::BI__builtin_rvv_vget_v: {
4629 (ResVecInfo.
EC.getKnownMinValue() * ResVecInfo.
NumVectors);
4630 return SemaBuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);
4632 case RISCVVector::BI__builtin_rvv_vset_v: {
4640 (ResVecInfo.
EC.getKnownMinValue() * ResVecInfo.
NumVectors) /
4642 return SemaBuiltinConstantArgRange(TheCall, 1, 0, MaxIndex - 1);
4645 case RISCV::BI__builtin_riscv_aes32dsi_32:
4646 case RISCV::BI__builtin_riscv_aes32dsmi_32:
4647 case RISCV::BI__builtin_riscv_aes32esi_32:
4648 case RISCV::BI__builtin_riscv_aes32esmi_32:
4649 case RISCV::BI__builtin_riscv_sm4ks:
4650 case RISCV::BI__builtin_riscv_sm4ed:
4651 return SemaBuiltinConstantArgRange(TheCall, 2, 0, 3);
4653 case RISCV::BI__builtin_riscv_aes64ks1i_64:
4654 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 10);
4660bool Sema::CheckSystemZBuiltinFunctionCall(
unsigned BuiltinID,
4662 if (BuiltinID == SystemZ::BI__builtin_tabort) {
4664 if (std::optional<llvm::APSInt> AbortCode =
4666 if (AbortCode->getSExtValue() >= 0 && AbortCode->getSExtValue() < 256)
4667 return Diag(Arg->
getBeginLoc(), diag::err_systemz_invalid_tabort_code)
4673 unsigned i = 0, l = 0, u = 0;
4674 switch (BuiltinID) {
4675 default:
return false;
4676 case SystemZ::BI__builtin_s390_lcbb: i = 1; l = 0; u = 15;
break;
4677 case SystemZ::BI__builtin_s390_verimb:
4678 case SystemZ::BI__builtin_s390_verimh:
4679 case SystemZ::BI__builtin_s390_verimf:
4680 case SystemZ::BI__builtin_s390_verimg: i = 3; l = 0; u = 255;
break;
4681 case SystemZ::BI__builtin_s390_vfaeb:
4682 case SystemZ::BI__builtin_s390_vfaeh:
4683 case SystemZ::BI__builtin_s390_vfaef:
4684 case SystemZ::BI__builtin_s390_vfaebs:
4685 case SystemZ::BI__builtin_s390_vfaehs:
4686 case SystemZ::BI__builtin_s390_vfaefs:
4687 case SystemZ::BI__builtin_s390_vfaezb:
4688 case SystemZ::BI__builtin_s390_vfaezh:
4689 case SystemZ::BI__builtin_s390_vfaezf:
4690 case SystemZ::BI__builtin_s390_vfaezbs:
4691 case SystemZ::BI__builtin_s390_vfaezhs:
4692 case SystemZ::BI__builtin_s390_vfaezfs: i = 2; l = 0; u = 15;
break;
4693 case SystemZ::BI__builtin_s390_vfisb:
4694 case SystemZ::BI__builtin_s390_vfidb:
4695 return SemaBuiltinConstantArgRange(TheCall, 1, 0, 15) ||
4696 SemaBuiltinConstantArgRange(TheCall, 2, 0, 15);
4697 case SystemZ::BI__builtin_s390_vftcisb:
4698 case SystemZ::BI__builtin_s390_vftcidb: i = 1; l = 0; u = 4095;
break;
4699 case SystemZ::BI__builtin_s390_vlbb: i = 1; l = 0; u = 15;
break;
4700 case SystemZ::BI__builtin_s390_vpdi: i = 2; l = 0; u = 15;
break;
4701 case SystemZ::BI__builtin_s390_vsldb: i = 2; l = 0; u = 15;
break;
4702 case SystemZ::BI__builtin_s390_vstrcb:
4703 case SystemZ::BI__builtin_s390_vstrch:
4704 case SystemZ::BI__builtin_s390_vstrcf:
4705 case SystemZ::BI__builtin_s390_vstrczb:
4706 case SystemZ::BI__builtin_s390_vstrczh:
4707 case SystemZ::BI__builtin_s390_vstrczf:
4708 case SystemZ::BI__builtin_s390_vstrcbs:
4709 case SystemZ::BI__builtin_s390_vstrchs:
4710 case SystemZ::BI__builtin_s390_vstrcfs:
4711 case SystemZ::BI__builtin_s390_vstrczbs:
4712 case SystemZ::BI__builtin_s390_vstrczhs:
4713 case SystemZ::BI__builtin_s390_vstrczfs: i = 3; l = 0; u = 15;
break;
4714 case SystemZ::BI__builtin_s390_vmslg: i = 3; l = 0; u = 15;
break;
4715 case SystemZ::BI__builtin_s390_vfminsb:
4716 case SystemZ::BI__builtin_s390_vfmaxsb:
4717 case SystemZ::BI__builtin_s390_vfmindb:
4718 case SystemZ::BI__builtin_s390_vfmaxdb: i = 2; l = 0; u = 15;
break;
4719 case SystemZ::BI__builtin_s390_vsld: i = 2; l = 0; u = 7;
break;
4720 case SystemZ::BI__builtin_s390_vsrd: i = 2; l = 0; u = 7;
break;
4721 case SystemZ::BI__builtin_s390_vclfnhs:
4722 case SystemZ::BI__builtin_s390_vclfnls:
4723 case SystemZ::BI__builtin_s390_vcfn:
4724 case SystemZ::BI__builtin_s390_vcnf: i = 1; l = 0; u = 15;
break;
4725 case SystemZ::BI__builtin_s390_vcrnfs: i = 2; l = 0; u = 15;
break;
4727 return SemaBuiltinConstantArgRange(TheCall, i, l, u);
4730bool Sema::CheckWebAssemblyBuiltinFunctionCall(
const TargetInfo &TI,
4733 switch (BuiltinID) {
4734 case WebAssembly::BI__builtin_wasm_ref_null_extern:
4735 return BuiltinWasmRefNullExtern(TheCall);
4736 case WebAssembly::BI__builtin_wasm_ref_null_func:
4737 return BuiltinWasmRefNullFunc(TheCall);
4752 return S.
Diag(TheCall->
getBeginLoc(), diag::err_expr_not_string_literal)
4772 return S.
Diag(TheCall->
getBeginLoc(), diag::err_expr_not_string_literal)
4785bool Sema::CheckX86BuiltinRoundingOrSAE(
unsigned BuiltinID,
CallExpr *TheCall) {
4789 unsigned ArgNum = 0;
4790 switch (BuiltinID) {
4793 case X86::BI__builtin_ia32_vcvttsd2si32:
4794 case X86::BI__builtin_ia32_vcvttsd2si64:
4795 case X86::BI__builtin_ia32_vcvttsd2usi32:
4796 case X86::BI__builtin_ia32_vcvttsd2usi64:
4797 case X86::BI__builtin_ia32_vcvttss2si32:
4798 case X86::BI__builtin_ia32_vcvttss2si64:
4799 case X86::BI__builtin_ia32_vcvttss2usi32:
4800 case X86::BI__builtin_ia32_vcvttss2usi64:
4801 case X86::BI__builtin_ia32_vcvttsh2si32:
4802 case X86::BI__builtin_ia32_vcvttsh2si64:
4803 case X86::BI__builtin_ia32_vcvttsh2usi32:
4804 case X86::BI__builtin_ia32_vcvttsh2usi64:
4807 case X86::BI__builtin_ia32_maxpd512:
4808 case X86::BI__builtin_ia32_maxps512:
4809 case X86::BI__builtin_ia32_minpd512:
4810 case X86::BI__builtin_ia32_minps512:
4811 case X86::BI__builtin_ia32_maxph512:
4812 case X86::BI__builtin_ia32_minph512:
4815 case X86::BI__builtin_ia32_vcvtph2pd512_mask:
4816 case X86::BI__builtin_ia32_vcvtph2psx512_mask:
4817 case X86::BI__builtin_ia32_cvtps2pd512_mask:
4818 case X86::BI__builtin_ia32_cvttpd2dq512_mask:
4819 case X86::BI__builtin_ia32_cvttpd2qq512_mask:
4820 case X86::BI__builtin_ia32_cvttpd2udq512_mask:
4821 case X86::BI__builtin_ia32_cvttpd2uqq512_mask:
4822 case X86::BI__builtin_ia32_cvttps2dq512_mask:
4823 case X86::BI__builtin_ia32_cvttps2qq512_mask:
4824 case X86::BI__builtin_ia32_cvttps2udq512_mask:
4825 case X86::BI__builtin_ia32_cvttps2uqq512_mask:
4826 case X86::BI__builtin_ia32_vcvttph2w512_mask:
4827 case X86::BI__builtin_ia32_vcvttph2uw512_mask:
4828 case X86::BI__builtin_ia32_vcvttph2dq512_mask:
4829 case X86::BI__builtin_ia32_vcvttph2udq512_mask:
4830 case X86::BI__builtin_ia32_vcvttph2qq512_mask:
4831 case X86::BI__builtin_ia32_vcvttph2uqq512_mask:
4832 case X86::BI__builtin_ia32_exp2pd_mask:
4833 case X86::BI__builtin_ia32_exp2ps_mask:
4834 case X86::BI__builtin_ia32_getexppd512_mask:
4835 case X86::BI__builtin_ia32_getexpps512_mask:
4836 case X86::BI__builtin_ia32_getexpph512_mask:
4837 case X86::BI__builtin_ia32_rcp28pd_mask:
4838 case X86::BI__builtin_ia32_rcp28ps_mask:
4839 case X86::BI__builtin_ia32_rsqrt28pd_mask:
4840 case X86::BI__builtin_ia32_rsqrt28ps_mask:
4841 case X86::BI__builtin_ia32_vcomisd:
4842 case X86::BI__builtin_ia32_vcomiss:
4843 case X86::BI__builtin_ia32_vcomish:
4844 case X86::BI__builtin_ia32_vcvtph2ps512_mask:
4847 case X86::BI__builtin_ia32_cmppd512_mask:
4848 case X86::BI__builtin_ia32_cmpps512_mask:
4849 case X86::BI__builtin_ia32_cmpsd_mask:
4850 case X86::BI__builtin_ia32_cmpss_mask:
4851 case X86::BI__builtin_ia32_cmpsh_mask:
4852 case X86::BI__builtin_ia32_vcvtsh2sd_round_mask:
4853 case X86::BI__builtin_ia32_vcvtsh2ss_round_mask:
4854 case X86::BI__builtin_ia32_cvtss2sd_round_mask:
4855 case X86::BI__builtin_ia32_getexpsd128_round_mask:
4856 case X86::BI__builtin_ia32_getexpss128_round_mask:
4857 case X86::BI__builtin_ia32_getexpsh128_round_mask:
4858 case X86::BI__builtin_ia32_getmantpd512_mask:
4859 case X86::BI__builtin_ia32_getmantps512_mask:
4860 case X86::BI__builtin_ia32_getmantph512_mask:
4861 case X86::BI__builtin_ia32_maxsd_round_mask:
4862 case X86::BI__builtin_ia32_maxss_round_mask:
4863 case X86::BI__builtin_ia32_maxsh_round_mask:
4864 case X86::BI__builtin_ia32_minsd_round_mask:
4865 case X86::BI__builtin_ia32_minss_round_mask:
4866 case X86::BI__builtin_ia32_minsh_round_mask:
4867 case X86::BI__builtin_ia32_rcp28sd_round_mask:
4868 case X86::BI__builtin_ia32_rcp28ss_round_mask:
4869 case X86::BI__builtin_ia32_reducepd512_mask:
4870 case X86::BI__builtin_ia32_reduceps512_mask:
4871 case X86::BI__builtin_ia32_reduceph512_mask:
4872 case X86::BI__builtin_ia32_rndscalepd_mask:
4873 case X86::BI__builtin_ia32_rndscaleps_mask:
4874 case X86::BI__builtin_ia32_rndscaleph_mask:
4875 case X86::BI__builtin_ia32_rsqrt28sd_round_mask:
4876 case X86::BI__builtin_ia32_rsqrt28ss_round_mask:
4879 case X86::BI__builtin_ia32_fixupimmpd512_mask:
4880 case X86::BI__builtin_ia32_fixupimmpd512_maskz:
4881 case X86::BI__builtin_ia32_fixupimmps512_mask:
4882 case X86::BI__builtin_ia32_fixupimmps512_maskz:
4883 case X86::BI__builtin_ia32_fixupimmsd_mask:
4884 case X86::BI__builtin_ia32_fixupimmsd_maskz:
4885 case X86::BI__builtin_ia32_fixupimmss_mask:
4886 case X86::BI__builtin_ia32_fixupimmss_maskz:
4887 case X86::BI__builtin_ia32_getmantsd_round_mask:
4888 case X86::BI__builtin_ia32_getmantss_round_mask:
4889 case X86::BI__builtin_ia32_getmantsh_round_mask:
4890 case X86::BI__builtin_ia32_rangepd512_mask:
4891 case X86::BI__builtin_ia32_rangeps512_mask:
4892 case X86::BI__builtin_ia32_rangesd128_round_mask:
4893 case X86::BI__builtin_ia32_rangess128_round_mask:
4894 case X86::BI__builtin_ia32_reducesd_mask:
4895 case X86::BI__builtin_ia32_reducess_mask:
4896 case X86::BI__builtin_ia32_reducesh_mask:
4897 case X86::BI__builtin_ia32_rndscalesd_round_mask:
4898 case X86::BI__builtin_ia32_rndscaless_round_mask:
4899 case X86::BI__builtin_ia32_rndscalesh_round_mask:
4902 case X86::BI__builtin_ia32_vcvtsd2si64:
4903 case X86::BI__builtin_ia32_vcvtsd2si32:
4904 case X86::BI__builtin_ia32_vcvtsd2usi32:
4905 case X86::BI__builtin_ia32_vcvtsd2usi64:
4906 case X86::BI__builtin_ia32_vcvtss2si32:
4907 case X86::BI__builtin_ia32_vcvtss2si64:
4908 case X86::BI__builtin_ia32_vcvtss2usi32:
4909 case X86::BI__builtin_ia32_vcvtss2usi64:
4910 case X86::BI__builtin_ia32_vcvtsh2si32:
4911 case X86::BI__builtin_ia32_vcvtsh2si64:
4912 case X86::BI__builtin_ia32_vcvtsh2usi32:
4913 case X86::BI__builtin_ia32_vcvtsh2usi64:
4914 case X86::BI__builtin_ia32_sqrtpd512:
4915 case X86::BI__builtin_ia32_sqrtps512:
4916 case X86::BI__builtin_ia32_sqrtph512:
4920 case X86::BI__builtin_ia32_addph512:
4921 case X86::BI__builtin_ia32_divph512:
4922 case X86::BI__builtin_ia32_mulph512:
4923 case X86::BI__builtin_ia32_subph512:
4924 case X86::BI__builtin_ia32_addpd512:
4925 case X86::BI__builtin_ia32_addps512:
4926 case X86::BI__builtin_ia32_divpd512:
4927 case X86::BI__builtin_ia32_divps512:
4928 case X86::BI__builtin_ia32_mulpd512:
4929 case X86::BI__builtin_ia32_mulps512:
4930 case X86::BI__builtin_ia32_subpd512:
4931 case X86::BI__builtin_ia32_subps512:
4932 case X86::BI__builtin_ia32_cvtsi2sd64:
4933 case X86::BI__builtin_ia32_cvtsi2ss32:
4934 case X86::BI__builtin_ia32_cvtsi2ss64:
4935 case X86::BI__builtin_ia32_cvtusi2sd64:
4936 case X86::BI__builtin_ia32_cvtusi2ss32:
4937 case X86::BI__builtin_ia32_cvtusi2ss64:
4938 case X86::BI__builtin_ia32_vcvtusi2sh:
4939 case X86::BI__builtin_ia32_vcvtusi642sh:
4940 case X86::BI__builtin_ia32_vcvtsi2sh:
4941 case X86::BI__builtin_ia32_vcvtsi642sh:
4945 case X86::BI__builtin_ia32_cvtdq2ps512_mask:
4946 case X86::BI__builtin_ia32_cvtudq2ps512_mask:
4947 case X86::BI__builtin_ia32_vcvtpd2ph512_mask:
4948 case X86::BI__builtin_ia32_vcvtps2phx512_mask:
4949 case X86::BI__builtin_ia32_cvtpd2ps512_mask:
4950 case X86::BI__builtin_ia32_cvtpd2dq512_mask:
4951 case X86::BI__builtin_ia32_cvtpd2qq512_mask:
4952 case X86::BI__builtin_ia32_cvtpd2udq512_mask:
4953 case X86::BI__builtin_ia32_cvtpd2uqq512_mask:
4954 case X86::BI__builtin_ia32_cvtps2dq512_mask:
4955 case X86::BI__builtin_ia32_cvtps2qq512_mask:
4956 case X86::BI__builtin_ia32_cvtps2udq512_mask:
4957 case X86::BI__builtin_ia32_cvtps2uqq512_mask:
4958 case X86::BI__builtin_ia32_cvtqq2pd512_mask:
4959 case X86::BI__builtin_ia32_cvtqq2ps512_mask:
4960 case X86::BI__builtin_ia32_cvtuqq2pd512_mask:
4961 case X86::BI__builtin_ia32_cvtuqq2ps512_mask:
4962 case X86::BI__builtin_ia32_vcvtdq2ph512_mask:
4963 case X86::BI__builtin_ia32_vcvtudq2ph512_mask:
4964 case X86::BI__builtin_ia32_vcvtw2ph512_mask:
4965 case X86::BI__builtin_ia32_vcvtuw2ph512_mask:
4966 case X86::BI__builtin_ia32_vcvtph2w512_mask:
4967 case X86::BI__builtin_ia32_vcvtph2uw512_mask:
4968 case X86::BI__builtin_ia32_vcvtph2dq512_mask:
4969 case X86::BI__builtin_ia32_vcvtph2udq512_mask:
4970 case X86::BI__builtin_ia32_vcvtph2qq512_mask:
4971 case X86::BI__builtin_ia32_vcvtph2uqq512_mask:
4972 case X86::BI__builtin_ia32_vcvtqq2ph512_mask:
4973 case X86::BI__builtin_ia32_vcvtuqq2ph512_mask:
4977 case X86::BI__builtin_ia32_addsh_round_mask:
4978 case X86::BI__builtin_ia32_addss_round_mask:
4979 case X86::BI__builtin_ia32_addsd_round_mask:
4980 case X86::BI__builtin_ia32_divsh_round_mask:
4981 case X86::BI__builtin_ia32_divss_round_mask:
4982 case X86::BI__builtin_ia32_divsd_round_mask:
4983 case X86::BI__builtin_ia32_mulsh_round_mask:
4984 case X86::BI__builtin_ia32_mulss_round_mask:
4985 case X86::BI__builtin_ia32_mulsd_round_mask:
4986 case X86::BI__builtin_ia32_subsh_round_mask:
4987 case X86::BI__builtin_ia32_subss_round_mask:
4988 case X86::BI__builtin_ia32_subsd_round_mask:
4989 case X86::BI__builtin_ia32_scalefph512_mask:
4990 case X86::BI__builtin_ia32_scalefpd512_mask:
4991 case X86::BI__builtin_ia32_scalefps512_mask:
4992 case X86::BI__builtin_ia32_scalefsd_round_mask:
4993 case X86::BI__builtin_ia32_scalefss_round_mask:
4994 case X86::BI__builtin_ia32_scalefsh_round_mask:
4995 case X86::BI__builtin_ia32_cvtsd2ss_round_mask:
4996 case X86::BI__builtin_ia32_vcvtss2sh_round_mask:
4997 case X86::BI__builtin_ia32_vcvtsd2sh_round_mask:
4998 case X86::BI__builtin_ia32_sqrtsd_round_mask:
4999 case X86::BI__builtin_ia32_sqrtss_round_mask:
5000 case X86::BI__builtin_ia32_sqrtsh_round_mask:
5001 case X86::BI__builtin_ia32_vfmaddsd3_mask:
5002 case X86::BI__builtin_ia32_vfmaddsd3_maskz:
5003 case X86::BI__builtin_ia32_vfmaddsd3_mask3:
5004 case X86::BI__builtin_ia32_vfmaddss3_mask:
5005 case X86::BI__builtin_ia32_vfmaddss3_maskz:
5006 case X86::BI__builtin_ia32_vfmaddss3_mask3:
5007 case X86::BI__builtin_ia32_vfmaddsh3_mask:
5008 case X86::BI__builtin_ia32_vfmaddsh3_maskz:
5009 case X86::BI__builtin_ia32_vfmaddsh3_mask3:
5010 case X86::BI__builtin_ia32_vfmaddpd512_mask:
5011 case X86::BI__builtin_ia32_vfmaddpd512_maskz:
5012 case X86::BI__builtin_ia32_vfmaddpd512_mask3:
5013 case X86::BI__builtin_ia32_vfmsubpd512_mask3:
5014 case X86::BI__builtin_ia32_vfmaddps512_mask:
5015 case X86::BI__builtin_ia32_vfmaddps512_maskz:
5016 case X86::BI__builtin_ia32_vfmaddps512_mask3:
5017 case X86::BI__builtin_ia32_vfmsubps512_mask3:
5018 case X86::BI__builtin_ia32_vfmaddph512_mask:
5019 case X86::BI__builtin_ia32_vfmaddph512_maskz:
5020 case X86::BI__builtin_ia32_vfmaddph512_mask3:
5021 case X86::BI__builtin_ia32_vfmsubph512_mask3:
5022 case X86::BI__builtin_ia32_vfmaddsubpd512_mask:
5023 case X86::BI__builtin_ia32_vfmaddsubpd512_maskz:
5024 case X86::BI__builtin_ia32_vfmaddsubpd512_mask3:
5025 case X86::BI__builtin_ia32_vfmsubaddpd512_mask3:
5026 case X86::BI__builtin_ia32_vfmaddsubps512_mask:
5027 case X86::BI__builtin_ia32_vfmaddsubps512_maskz:
5028 case X86::BI__builtin_ia32_vfmaddsubps512_mask3:
5029 case X86::BI__builtin_ia32_vfmsubaddps512_mask3:
5030 case X86::BI__builtin_ia32_vfmaddsubph512_mask:
5031 case X86::BI__builtin_ia32_vfmaddsubph512_maskz:
5032 case X86::BI__builtin_ia32_vfmaddsubph512_mask3:
5033 case X86::BI__builtin_ia32_vfmsubaddph512_mask3:
5034 case X86::BI__builtin_ia32_vfmaddcsh_mask:
5035 case X86::BI__builtin_ia32_vfmaddcsh_round_mask:
5036 case X86::BI__builtin_ia32_vfmaddcsh_round_mask3:
5037 case X86::BI__builtin_ia32_vfmaddcph512_mask:
5038 case X86::BI__builtin_ia32_vfmaddcph512_maskz:
5039 case X86::BI__builtin_ia32_vfmaddcph512_mask3:
5040 case X86::BI__builtin_ia32_vfcmaddcsh_mask:
5041 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask:
5042 case X86::BI__builtin_ia32_vfcmaddcsh_round_mask3:
5043 case X86::BI__builtin_ia32_vfcmaddcph512_mask:
5044 case X86::BI__builtin_ia32_vfcmaddcph512_maskz:
5045 case X86::BI__builtin_ia32_vfcmaddcph512_mask3:
5046 case X86::BI__builtin_ia32_vfmulcsh_mask:
5047 case X86::BI__builtin_ia32_vfmulcph512_mask:
5048 case X86::BI__builtin_ia32_vfcmulcsh_mask:
5049 case X86::BI__builtin_ia32_vfcmulcph512_mask:
5063 if (SemaBuiltinConstantArg(TheCall, ArgNum,
Result))
5072 (!HasRC &&
Result == 12) ||
5073 (HasRC &&
Result.getZExtValue() >= 8 &&
Result.getZExtValue() <= 11))
5076 return Diag(TheCall->
getBeginLoc(), diag::err_x86_builtin_invalid_rounding)
5081bool Sema::CheckX86BuiltinGatherScatterScale(
unsigned BuiltinID,
5083 unsigned ArgNum = 0;
5084 switch (BuiltinID) {
5087 case X86::BI__builtin_ia32_gatherpfdpd:
5088 case X86::BI__builtin_ia32_gatherpfdps:
5089 case X86::BI__builtin_ia32_gatherpfqpd:
5090 case X86::BI__builtin_ia32_gatherpfqps:
5091 case X86::BI__builtin_ia32_scatterpfdpd:
5092 case X86::BI__builtin_ia32_scatterpfdps:
5093 case X86::BI__builtin_ia32_scatterpfqpd:
5094 case X86::BI__builtin_ia32_scatterpfqps:
5097 case X86::BI__builtin_ia32_gatherd_pd:
5098 case X86::BI__builtin_ia32_gatherd_pd256:
5099 case X86::BI__builtin_ia32_gatherq_pd:
5100 case X86::BI__builtin_ia32_gatherq_pd256:
5101 case X86::BI__builtin_ia32_gatherd_ps:
5102 case X86::BI__builtin_ia32_gatherd_ps256:
5103 case X86::BI__builtin_ia32_gatherq_ps:
5104 case X86::BI__builtin_ia32_gatherq_ps256:
5105 case X86::BI__builtin_ia32_gatherd_q:
5106 case X86::BI__builtin_ia32_gatherd_q256:
5107 case X86::BI__builtin_ia32_gatherq_q:
5108 case X86::BI__builtin_ia32_gatherq_q256:
5109 case X86::BI__builtin_ia32_gatherd_d:
5110 case X86::BI__builtin_ia32_gatherd_d256:
5111 case X86::BI__builtin_ia32_gatherq_d:
5112 case X86::BI__builtin_ia32_gatherq_d256:
5113 case X86::BI__builtin_ia32_gather3div2df:
5114 case X86::BI__builtin_ia32_gather3div2di:
5115 case X86::BI__builtin_ia32_gather3div4df:
5116 case X86::BI__builtin_ia32_gather3div4di:
5117 case X86::BI__builtin_ia32_gather3div4sf:
5118 case X86::BI__builtin_ia32_gather3div4si:
5119 case X86::BI__builtin_ia32_gather3div8sf:
5120 case X86::BI__builtin_ia32_gather3div8si:
5121 case X86::BI__builtin_ia32_gather3siv2df:
5122 case X86::BI__builtin_ia32_gather3siv2di:
5123 case X86::BI__builtin_ia32_gather3siv4df:
5124 case X86::BI__builtin_ia32_gather3siv4di:
5125 case X86::BI__builtin_ia32_gather3siv4sf:
5126 case X86::BI__builtin_ia32_gather3siv4si:
5127 case X86::BI__builtin_ia32_gather3siv8sf:
5128 case X86::BI__builtin_ia32_gather3siv8si:
5129 case X86::BI__builtin_ia32_gathersiv8df:
5130 case X86::BI__builtin_ia32_gathersiv16sf:
5131 case X86::BI__builtin_ia32_gatherdiv8df:
5132 case X86::BI__builtin_ia32_gatherdiv16sf:
5133 case X86::BI__builtin_ia32_gathersiv8di:
5134 case X86::BI__builtin_ia32_gathersiv16si:
5135 case X86::BI__builtin_ia32_gatherdiv8di:
5136 case X86::BI__builtin_ia32_gatherdiv16si:
5137 case X86::BI__builtin_ia32_scatterdiv2df:
5138 case X86::BI__builtin_ia32_scatterdiv2di:
5139 case X86::BI__builtin_ia32_scatterdiv4df:
5140 case X86::BI__builtin_ia32_scatterdiv4di:
5141 case X86::BI__builtin_ia32_scatterdiv4sf:
5142 case X86::BI__builtin_ia32_scatterdiv4si:
5143 case X86::BI__builtin_ia32_scatterdiv8sf:
5144 case X86::BI__builtin_ia32_scatterdiv8si:
5145 case X86::BI__builtin_ia32_scattersiv2df:
5146 case X86::BI__builtin_ia32_scattersiv2di:
5147 case X86::BI__builtin_ia32_scattersiv4df:
5148 case X86::BI__builtin_ia32_scattersiv4di:
5149 case X86::BI__builtin_ia32_scattersiv4sf:
5150 case X86::BI__builtin_ia32_scattersiv4si:
5151 case X86::BI__builtin_ia32_scattersiv8sf:
5152 case X86::BI__builtin_ia32_scattersiv8si:
5153 case X86::BI__builtin_ia32_scattersiv8df:
5154 case X86::BI__builtin_ia32_scattersiv16sf:
5155 case X86::BI__builtin_ia32_scatterdiv8df:
5156 case X86::BI__builtin_ia32_scatterdiv16sf:
5157 case X86::BI__builtin_ia32_scattersiv8di:
5158 case X86::BI__builtin_ia32_scattersiv16si:
5159 case X86::BI__builtin_ia32_scatterdiv8di:
5160 case X86::BI__builtin_ia32_scatterdiv16si:
5173 if (SemaBuiltinConstantArg(TheCall, ArgNum,
Result))
5179 return Diag(TheCall->
getBeginLoc(), diag::err_x86_builtin_invalid_scale)
5185bool Sema::CheckX86BuiltinTileArgumentsRange(
CallExpr *TheCall,
5187 for (
int ArgNum : ArgNums) {
5194bool Sema::CheckX86BuiltinTileDuplicate(
CallExpr *TheCall,
5198 std::bitset<TileRegHigh + 1> ArgValues;
5199 for (
int ArgNum : ArgNums) {
5205 if (SemaBuiltinConstantArg(TheCall, ArgNum,
Result))
5207 int ArgExtValue =
Result.getExtValue();
5209 "Incorrect tile register num.");
5210 if (ArgValues.test(ArgExtValue))
5212 diag::err_x86_builtin_tile_arg_duplicate)
5214 ArgValues.set(ArgExtValue);
5219bool Sema::CheckX86BuiltinTileRangeAndDuplicate(
CallExpr *TheCall,
5221 return CheckX86BuiltinTileArgumentsRange(TheCall, ArgNums) ||
5222 CheckX86BuiltinTileDuplicate(TheCall, ArgNums);
5225bool Sema::CheckX86BuiltinTileArguments(
unsigned BuiltinID,
CallExpr *TheCall) {
5226 switch (BuiltinID) {
5229 case X86::BI__builtin_ia32_tileloadd64:
5230 case X86::BI__builtin_ia32_tileloaddt164:
5231 case X86::BI__builtin_ia32_tilestored64:
5232 case X86::BI__builtin_ia32_tilezero:
5233 return CheckX86BuiltinTileArgumentsRange(TheCall, 0);
5234 case X86::BI__builtin_ia32_tdpbssd:
5235 case X86::BI__builtin_ia32_tdpbsud:
5236 case X86::BI__builtin_ia32_tdpbusd:
5237 case X86::BI__builtin_ia32_tdpbuud:
5238 case X86::BI__builtin_ia32_tdpbf16ps:
5239 case X86::BI__builtin_ia32_tdpfp16ps:
5240 return CheckX86BuiltinTileRangeAndDuplicate(TheCall, {0, 1, 2});
5245 switch (BuiltinID) {
5246 case X86::BI__builtin_ia32_readeflags_u32:
5247 case X86::BI__builtin_ia32_writeeflags_u32:
5254bool Sema::CheckX86BuiltinFunctionCall(
const TargetInfo &TI,
unsigned BuiltinID,
5256 if (BuiltinID == X86::BI__builtin_cpu_supports)
5259 if (BuiltinID == X86::BI__builtin_cpu_is)
5263 const llvm::Triple &TT = TI.
getTriple();
5266 diag::err_32_bit_builtin_64_bit_tgt);
5269 if (CheckX86BuiltinRoundingOrSAE(BuiltinID, TheCall))
5273 if (CheckX86BuiltinGatherScatterScale(BuiltinID, TheCall))
5277 if (CheckX86BuiltinTileArguments(BuiltinID, TheCall))
5282 int i = 0, l = 0, u = 0;
5283 switch (BuiltinID) {
5286 case X86::BI__builtin_ia32_vec_ext_v2si:
5287 case X86::BI__builtin_ia32_vec_ext_v2di:
5288 case X86::BI__builtin_ia32_vextractf128_pd256:
5289 case X86::BI__builtin_ia32_vextractf128_ps256:
5290 case X86::BI__builtin_ia32_vextractf128_si256:
5291 case X86::BI__builtin_ia32_extract128i256:
5292 case X86::BI__builtin_ia32_extractf64x4_mask:
5293 case X86::BI__builtin_ia32_extracti64x4_mask:
5294 case X86::BI__builtin_ia32_extractf32x8_mask:
5295 case X86::BI__builtin_ia32_extracti32x8_mask:
5296 case X86::BI__builtin_ia32_extractf64x2_256_mask:
5297 case X86::BI__builtin_ia32_extracti64x2_256_mask:
5298 case X86::BI__builtin_ia32_extractf32x4_256_mask:
5299 case X86::BI__builtin_ia32_extracti32x4_256_mask:
5300 i = 1; l = 0; u = 1;
5302 case X86::BI__builtin_ia32_vec_set_v2di:
5303 case X86::BI__builtin_ia32_vinsertf128_pd256:
5304 case X86::BI__builtin_ia32_vinsertf128_ps256:
5305 case X86::BI__builtin_ia32_vinsertf128_si256:
5306 case X86::BI__builtin_ia32_insert128i256:
5307 case X86::BI__builtin_ia32_insertf32x8:
5308 case X86::BI__builtin_ia32_inserti32x8:
5309 case X86::BI__builtin_ia32_insertf64x4:
5310 case X86::BI__builtin_ia32_inserti64x4:
5311 case X86::BI__builtin_ia32_insertf64x2_256:
5312 case X86::BI__builtin_ia32_inserti64x2_256:
5313 case X86::BI__builtin_ia32_insertf32x4_256:
5314 case X86::BI__builtin_ia32_inserti32x4_256:
5315 i = 2; l = 0; u = 1;
5317 case X86::BI__builtin_ia32_vpermilpd:
5318 case X86::BI__builtin_ia32_vec_ext_v4hi:
5319 case X86::BI__builtin_ia32_vec_ext_v4si:
5320 case X86::BI__builtin_ia32_vec_ext_v4sf:
5321 case X86::BI__builtin_ia32_vec_ext_v4di:
5322 case X86::BI__builtin_ia32_extractf32x4_mask:
5323 case X86::BI__builtin_ia32_extracti32x4_mask:
5324 case X86::BI__builtin_ia32_extractf64x2_512_mask:
5325 case X86::BI__builtin_ia32_extracti64x2_512_mask:
5326 i = 1; l = 0; u = 3;
5328 case X86::BI_mm_prefetch:
5329 case X86::BI__builtin_ia32_vec_ext_v8hi:
5330 case X86::BI__builtin_ia32_vec_ext_v8si:
5331 i = 1; l = 0; u = 7;
5333 case X86::BI__builtin_ia32_sha1rnds4:
5334 case X86::BI__builtin_ia32_blendpd:
5335 case X86::BI__builtin_ia32_shufpd:
5336 case X86::BI__builtin_ia32_vec_set_v4hi:
5337 case X86::BI__builtin_ia32_vec_set_v4si:
5338 case X86::BI__builtin_ia32_vec_set_v4di:
5339 case X86::BI__builtin_ia32_shuf_f32x4_256:
5340 case X86::BI__builtin_ia32_shuf_f64x2_256:
5341 case X86::BI__builtin_ia32_shuf_i32x4_256:
5342 case X86::BI__builtin_ia32_shuf_i64x2_256:
5343 case X86::BI__builtin_ia32_insertf64x2_512:
5344 case X86::BI__builtin_ia32_inserti64x2_512:
5345 case X86::BI__builtin_ia32_insertf32x4:
5346 case X86::BI__builtin_ia32_inserti32x4:
5347 i = 2; l = 0; u = 3;
5349 case X86::BI__builtin_ia32_vpermil2pd:
5350 case X86::BI__builtin_ia32_vpermil2pd256:
5351 case X86::BI__builtin_ia32_vpermil2ps:
5352 case X86::BI__builtin_ia32_vpermil2ps256:
5353 i = 3; l = 0; u = 3;
5355 case X86::BI__builtin_ia32_cmpb128_mask:
5356 case X86::BI__builtin_ia32_cmpw128_mask:
5357 case X86::BI__builtin_ia32_cmpd128_mask:
5358 case X86::BI__builtin_ia32_cmpq128_mask:
5359 case X86::BI__builtin_ia32_cmpb256_mask:
5360 case X86::BI__builtin_ia32_cmpw256_mask:
5361 case X86::BI__builtin_ia32_cmpd256_mask:
5362 case X86::BI__builtin_ia32_cmpq256_mask:
5363 case X86::BI__builtin_ia32_cmpb512_mask:
5364 case X86::BI__builtin_ia32_cmpw512_mask:
5365 case X86::BI__builtin_ia32_cmpd512_mask:
5366 case X86::BI__builtin_ia32_cmpq512_mask:
5367 case X86::BI__builtin_ia32_ucmpb128_mask:
5368 case X86::BI__builtin_ia32_ucmpw128_mask:
5369 case X86::BI__builtin_ia32_ucmpd128_mask:
5370 case X86::BI__builtin_ia32_ucmpq128_mask:
5371 case X86::BI__builtin_ia32_ucmpb256_mask:
5372 case X86::BI__builtin_ia32_ucmpw256_mask:
5373 case X86::BI__builtin_ia32_ucmpd256_mask:
5374 case X86::BI__builtin_ia32_ucmpq256_mask:
5375 case X86::BI__builtin_ia32_ucmpb512_mask:
5376 case X86::BI__builtin_ia32_ucmpw512_mask:
5377 case X86::BI__builtin_ia32_ucmpd512_mask:
5378 case X86::BI__builtin_ia32_ucmpq512_mask:
5379 case X86::BI__builtin_ia32_vpcomub:
5380 case X86::BI__builtin_ia32_vpcomuw:
5381 case X86::BI__builtin_ia32_vpcomud:
5382 case X86::BI__builtin_ia32_vpcomuq:
5383 case X86::BI__builtin_ia32_vpcomb:
5384 case X86::BI__builtin_ia32_vpcomw:
5385 case X86::BI__builtin_ia32_vpcomd:
5386 case X86::BI__builtin_ia32_vpcomq:
5387 case X86::BI__builtin_ia32_vec_set_v8hi:
5388 case X86::BI__builtin_ia32_vec_set_v8si: