30 if (BuiltinID == AArch64::BI__builtin_arm_irg) {
41 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
50 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_integer)
58 if (BuiltinID == AArch64::BI__builtin_arm_addg) {
68 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
79 if (BuiltinID == AArch64::BI__builtin_arm_gmi) {
90 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
95 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_integer)
97 TheCall->
setType(Context.IntTy);
101 if (BuiltinID == AArch64::BI__builtin_arm_ldg ||
102 BuiltinID == AArch64::BI__builtin_arm_stg) {
112 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_must_be_pointer)
117 if (BuiltinID == AArch64::BI__builtin_arm_ldg)
118 TheCall->
setType(FirstArgType);
122 if (BuiltinID == AArch64::BI__builtin_arm_subp) {
135 auto isNull = [&](
Expr *
E) ->
bool {
136 return E->isNullPointerConstant(Context,
142 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_null_or_pointer)
146 return Diag(TheCall->
getBeginLoc(), diag::err_memtag_arg_null_or_pointer)
154 if (!Context.typesAreCompatible(
155 Context.getCanonicalType(pointeeA).getUnqualifiedType(),
156 Context.getCanonicalType(pointeeB).getUnqualifiedType())) {
158 diag::err_typecheck_sub_ptr_compatible)
179 TheCall->
setType(Context.LongLongTy);
182 assert(
false &&
"Unhandled ARM MTE intrinsic");
189 int ArgNum,
unsigned ExpectedFieldNum,
191 bool IsARMBuiltin = BuiltinID == ARM::BI__builtin_arm_rsr64 ||
192 BuiltinID == ARM::BI__builtin_arm_wsr64 ||
193 BuiltinID == ARM::BI__builtin_arm_rsr ||
194 BuiltinID == ARM::BI__builtin_arm_rsrp ||
195 BuiltinID == ARM::BI__builtin_arm_wsr ||
196 BuiltinID == ARM::BI__builtin_arm_wsrp;
197 bool IsAArch64Builtin = BuiltinID == AArch64::BI__builtin_arm_rsr64 ||
198 BuiltinID == AArch64::BI__builtin_arm_wsr64 ||
199 BuiltinID == AArch64::BI__builtin_arm_rsr128 ||
200 BuiltinID == AArch64::BI__builtin_arm_wsr128 ||
201 BuiltinID == AArch64::BI__builtin_arm_rsr ||
202 BuiltinID == AArch64::BI__builtin_arm_rsrp ||
203 BuiltinID == AArch64::BI__builtin_arm_wsr ||
204 BuiltinID == AArch64::BI__builtin_arm_wsrp;
205 assert((IsARMBuiltin || IsAArch64Builtin) &&
"Unexpected ARM builtin.");
220 Reg.split(Fields,
":");
222 if (Fields.size() != ExpectedFieldNum && !(AllowName && Fields.size() == 1))
230 if (Fields.size() > 1) {
231 bool FiveFields = Fields.size() == 5;
233 bool ValidString =
true;
235 ValidString &= Fields[0].starts_with_insensitive(
"cp") ||
236 Fields[0].starts_with_insensitive(
"p");
238 Fields[0] = Fields[0].drop_front(
239 Fields[0].starts_with_insensitive(
"cp") ? 2 : 1);
241 ValidString &= Fields[2].starts_with_insensitive(
"c");
243 Fields[2] = Fields[2].drop_front(1);
246 ValidString &= Fields[3].starts_with_insensitive(
"c");
248 Fields[3] = Fields[3].drop_front(1);
254 Ranges.append({IsAArch64Builtin ? 1 : 15, 7, 15, 15, 7});
256 Ranges.append({15, 7, 15});
258 for (
unsigned i = 0; i < Fields.size(); ++i) {
260 ValidString &= !Fields[i].getAsInteger(10, IntField);
261 ValidString &= (IntField >= 0 && IntField <= Ranges[i]);
267 }
else if (IsAArch64Builtin && Fields.size() == 1) {
275 if (BuiltinID == AArch64::BI__builtin_arm_rsr128 ||
276 BuiltinID == AArch64::BI__builtin_arm_wsr128)
281 auto MaxLimit = llvm::StringSwitch<std::optional<unsigned>>(Reg)
282 .CaseLower(
"spsel", 15)
283 .CaseLower(
"daifclr", 15)
284 .CaseLower(
"daifset", 15)
285 .CaseLower(
"pan", 15)
286 .CaseLower(
"uao", 15)
287 .CaseLower(
"dit", 15)
288 .CaseLower(
"ssbs", 15)
289 .CaseLower(
"tco", 15)
290 .CaseLower(
"allint", 1)
292 .Default(std::nullopt);
322 bool IsPolyUnsigned,
bool IsInt64Long) {
356 return Context.MFloat8Ty;
358 llvm_unreachable(
"Invalid NeonTypeFlag!");
376 unsigned ArgIdx,
unsigned EltBitWidth,
377 unsigned ContainerBitWidth) {
380 auto CheckImmediateInSet = [&](std::initializer_list<int64_t>
Set,
381 int ErrDiag) ->
bool {
392 if (std::find(
Set.begin(),
Set.end(), Imm.getSExtValue()) ==
Set.end())
398 case ImmCheckType::ImmCheck0_31:
402 case ImmCheckType::ImmCheck0_13:
406 case ImmCheckType::ImmCheck0_63:
410 case ImmCheckType::ImmCheck1_16:
414 case ImmCheckType::ImmCheck0_7:
418 case ImmCheckType::ImmCheck1_1:
422 case ImmCheckType::ImmCheck1_3:
426 case ImmCheckType::ImmCheck1_7:
430 case ImmCheckType::ImmCheckExtract:
432 (2048 / EltBitWidth) - 1))
435 case ImmCheckType::ImmCheckCvt:
436 case ImmCheckType::ImmCheckShiftRight:
440 case ImmCheckType::ImmCheckShiftRightNarrow:
444 case ImmCheckType::ImmCheckShiftLeft:
448 case ImmCheckType::ImmCheckLaneIndex:
450 (ContainerBitWidth / EltBitWidth) - 1))
453 case ImmCheckType::ImmCheckLaneIndexCompRotate:
455 TheCall, ArgIdx, 0, (ContainerBitWidth / (2 * EltBitWidth)) - 1))
458 case ImmCheckType::ImmCheckLaneIndexDot:
460 TheCall, ArgIdx, 0, (ContainerBitWidth / (4 * EltBitWidth)) - 1))
463 case ImmCheckType::ImmCheckComplexRot90_270:
464 if (CheckImmediateInSet({90, 270}, diag::err_rotation_argument_to_cadd))
467 case ImmCheckType::ImmCheckComplexRotAll90:
468 if (CheckImmediateInSet({0, 90, 180, 270},
469 diag::err_rotation_argument_to_cmla))
472 case ImmCheckType::ImmCheck0_1:
476 case ImmCheckType::ImmCheck0_2:
480 case ImmCheckType::ImmCheck0_3:
484 case ImmCheckType::ImmCheck0_0:
488 case ImmCheckType::ImmCheck0_15:
492 case ImmCheckType::ImmCheck0_255:
496 case ImmCheckType::ImmCheck1_32:
500 case ImmCheckType::ImmCheck1_64:
504 case ImmCheckType::ImmCheck2_4_Mul2:
517 bool HasError =
false;
519 for (
const auto &I : ImmChecks) {
520 auto [ArgIdx, CheckTy, ElementBitWidth, VecBitWidth] = I;
522 if (OverloadType >= 0)
534 bool HasError =
false;
536 for (
const auto &I : ImmChecks) {
537 auto [ArgIdx, CheckTy, ElementBitWidth] = I;
546 if (FD->
hasAttr<ArmLocallyStreamingAttr>())
550 if (FPT->getAArch64SMEAttributes() &
553 if (FPT->getAArch64SMEAttributes() &
564 unsigned BuiltinID) {
572 llvm::StringMap<bool> CallerFeatureMapWithoutSVE;
574 CallerFeatureMapWithoutSVE[
"sve"] =
false;
580 llvm::StringMap<bool> CallerFeatureMapWithoutSME;
582 CallerFeatureMapWithoutSME[
"sme"] =
false;
594 StringRef BuiltinTargetGuards(
597 BuiltinTargetGuards, CallerFeatureMapWithoutSME);
599 BuiltinTargetGuards, CallerFeatureMapWithoutSVE);
601 if ((SatisfiesSVE && SatisfiesSME) ||
604 else if (SatisfiesSVE)
606 else if (SatisfiesSME)
615 S.
Diag(TheCall->
getBeginLoc(), diag::err_attribute_arm_sm_incompat_builtin)
619 S.
Diag(TheCall->
getBeginLoc(), diag::err_attribute_arm_sm_incompat_builtin)
631 (FD->
hasAttr<ArmNewAttr>() && FD->
getAttr<ArmNewAttr>()->isNewZA());
638 (FD->
hasAttr<ArmNewAttr>() && FD->
getAttr<ArmNewAttr>()->isNewZT0());
645#define GET_SME_BUILTIN_GET_STATE
646#include "clang/Basic/arm_sme_builtins_za_state.inc"
647#undef GET_SME_BUILTIN_GET_STATE
657#define GET_SME_STREAMING_ATTRS
658#include "clang/Basic/arm_sme_streaming_attrs.inc"
659#undef GET_SME_STREAMING_ATTRS
668 diag::warn_attribute_arm_za_builtin_no_za_state)
673 diag::warn_attribute_arm_zt0_builtin_no_zt0_state)
683#define GET_SME_IMMEDIATE_CHECK
684#include "clang/Basic/arm_sme_sema_rangechecks.inc"
685#undef GET_SME_IMMEDIATE_CHECK
697#define GET_SVE_STREAMING_ATTRS
698#include "clang/Basic/arm_sve_streaming_attrs.inc"
699#undef GET_SVE_STREAMING_ATTRS
711#define GET_SVE_IMMEDIATE_CHECK
712#include "clang/Basic/arm_sve_sema_rangechecks.inc"
713#undef GET_SVE_IMMEDIATE_CHECK
727#define GET_NEON_BUILTINS
728#define TARGET_BUILTIN(id, ...) case NEON::BI##id:
729#define BUILTIN(id, ...) case NEON::BI##id:
730#include "clang/Basic/arm_neon.inc"
737#undef GET_NEON_BUILTINS
745 bool HasConstPtr =
false;
747#define GET_NEON_OVERLOAD_CHECK
748#include "clang/Basic/arm_fp16.inc"
749#include "clang/Basic/arm_neon.inc"
750#undef GET_NEON_OVERLOAD_CHECK
760 TV =
Result.getLimitedValue(64);
761 if ((TV > 63) || (mask & (1ULL << TV)) == 0)
766 if (PtrArgNum >= 0) {
770 Arg = ICE->getSubExpr();
774 llvm::Triple::ArchType Arch = TI.
getTriple().getArch();
775 bool IsPolyUnsigned = Arch == llvm::Triple::aarch64 ||
776 Arch == llvm::Triple::aarch64_32 ||
777 Arch == llvm::Triple::aarch64_be;
780 IsPolyUnsigned, IsInt64Long);
800#define GET_NEON_IMMEDIATE_CHECK
801#include "clang/Basic/arm_fp16.inc"
802#include "clang/Basic/arm_neon.inc"
803#undef GET_NEON_IMMEDIATE_CHECK
814#include "clang/Basic/arm_mve_builtin_sema.inc"
825#include "clang/Basic/arm_cde_builtin_sema.inc"
835 const Expr *CoprocArg,
846 int64_t CoprocNo = CoprocNoAP.getExtValue();
847 assert(CoprocNo >= 0 &&
"Coprocessor immediate must be non-negative");
850 bool IsCDECoproc = CoprocNo <= 7 && (CDECoprocMask & (1 << CoprocNo));
852 if (IsCDECoproc != WantCDE)
862 assert((BuiltinID == ARM::BI__builtin_arm_ldrex ||
863 BuiltinID == ARM::BI__builtin_arm_ldaex ||
864 BuiltinID == ARM::BI__builtin_arm_strex ||
865 BuiltinID == ARM::BI__builtin_arm_stlex ||
866 BuiltinID == AArch64::BI__builtin_arm_ldrex ||
867 BuiltinID == AArch64::BI__builtin_arm_ldaex ||
868 BuiltinID == AArch64::BI__builtin_arm_strex ||
869 BuiltinID == AArch64::BI__builtin_arm_stlex) &&
870 "unexpected ARM builtin");
871 bool IsLdrex = BuiltinID == ARM::BI__builtin_arm_ldrex ||
872 BuiltinID == ARM::BI__builtin_arm_ldaex ||
873 BuiltinID == AArch64::BI__builtin_arm_ldrex ||
874 BuiltinID == AArch64::BI__builtin_arm_ldaex;
888 Expr *PointerArg = TheCall->
getArg(IsLdrex ? 0 : 1);
893 PointerArg = PointerArgRes.
get();
913 CastNeeded = CK_BitCast;
914 Diag(DRE->
getBeginLoc(), diag::ext_typecheck_convert_discards_qualifiers)
915 << PointerArg->
getType() << Context.getPointerType(AddrType)
920 AddrType = Context.getPointerType(AddrType);
924 PointerArg = PointerArgRes.
get();
926 TheCall->
setArg(IsLdrex ? 0 : 1, PointerArg);
931 Diag(DRE->
getBeginLoc(), diag::err_atomic_builtin_must_be_pointer_intfltptr)
937 if (Context.getTypeSize(ValType) > MaxWidth) {
938 assert(MaxWidth == 64 &&
"Diagnostic unexpectedly inaccurate");
939 Diag(DRE->
getBeginLoc(), diag::err_atomic_exclusive_builtin_pointer_size)
966 Context, ValType,
false);
974 TheCall->
setType(Context.IntTy);
981 if (BuiltinID == ARM::BI__builtin_arm_ldrex ||
982 BuiltinID == ARM::BI__builtin_arm_ldaex ||
983 BuiltinID == ARM::BI__builtin_arm_strex ||
984 BuiltinID == ARM::BI__builtin_arm_stlex) {
988 if (BuiltinID == ARM::BI__builtin_arm_prefetch) {
993 if (BuiltinID == ARM::BI__builtin_arm_rsr64 ||
994 BuiltinID == ARM::BI__builtin_arm_wsr64)
997 if (BuiltinID == ARM::BI__builtin_arm_rsr ||
998 BuiltinID == ARM::BI__builtin_arm_rsrp ||
999 BuiltinID == ARM::BI__builtin_arm_wsr ||
1000 BuiltinID == ARM::BI__builtin_arm_wsrp)
1013 switch (BuiltinID) {
1016 case ARM::BI__builtin_arm_ssat:
1018 case ARM::BI__builtin_arm_usat:
1020 case ARM::BI__builtin_arm_ssat16:
1022 case ARM::BI__builtin_arm_usat16:
1024 case ARM::BI__builtin_arm_vcvtr_f:
1025 case ARM::BI__builtin_arm_vcvtr_d:
1027 case ARM::BI__builtin_arm_dmb:
1028 case ARM::BI__builtin_arm_dsb:
1029 case ARM::BI__builtin_arm_isb:
1030 case ARM::BI__builtin_arm_dbg:
1032 case ARM::BI__builtin_arm_cdp:
1033 case ARM::BI__builtin_arm_cdp2:
1034 case ARM::BI__builtin_arm_mcr:
1035 case ARM::BI__builtin_arm_mcr2:
1036 case ARM::BI__builtin_arm_mrc:
1037 case ARM::BI__builtin_arm_mrc2:
1038 case ARM::BI__builtin_arm_mcrr:
1039 case ARM::BI__builtin_arm_mcrr2:
1040 case ARM::BI__builtin_arm_mrrc:
1041 case ARM::BI__builtin_arm_mrrc2:
1042 case ARM::BI__builtin_arm_ldc:
1043 case ARM::BI__builtin_arm_ldcl:
1044 case ARM::BI__builtin_arm_ldc2:
1045 case ARM::BI__builtin_arm_ldc2l:
1046 case ARM::BI__builtin_arm_stc:
1047 case ARM::BI__builtin_arm_stcl:
1048 case ARM::BI__builtin_arm_stc2:
1049 case ARM::BI__builtin_arm_stc2l:
1059 if (BuiltinID == AArch64::BI__builtin_arm_ldrex ||
1060 BuiltinID == AArch64::BI__builtin_arm_ldaex ||
1061 BuiltinID == AArch64::BI__builtin_arm_strex ||
1062 BuiltinID == AArch64::BI__builtin_arm_stlex) {
1066 if (BuiltinID == AArch64::BI__builtin_arm_prefetch) {
1073 if (BuiltinID == AArch64::BI__builtin_arm_rsr64 ||
1074 BuiltinID == AArch64::BI__builtin_arm_wsr64 ||
1075 BuiltinID == AArch64::BI__builtin_arm_rsr128 ||
1076 BuiltinID == AArch64::BI__builtin_arm_wsr128)
1080 if (BuiltinID == AArch64::BI__builtin_arm_irg ||
1081 BuiltinID == AArch64::BI__builtin_arm_addg ||
1082 BuiltinID == AArch64::BI__builtin_arm_gmi ||
1083 BuiltinID == AArch64::BI__builtin_arm_ldg ||
1084 BuiltinID == AArch64::BI__builtin_arm_stg ||
1085 BuiltinID == AArch64::BI__builtin_arm_subp) {
1089 if (BuiltinID == AArch64::BI__builtin_arm_rsr ||
1090 BuiltinID == AArch64::BI__builtin_arm_rsrp ||
1091 BuiltinID == AArch64::BI__builtin_arm_wsr ||
1092 BuiltinID == AArch64::BI__builtin_arm_wsrp)
1098 if (BuiltinID == AArch64::BI_ReadStatusReg ||
1099 BuiltinID == AArch64::BI_WriteStatusReg)
1102 if (BuiltinID == AArch64::BI__getReg)
1105 if (BuiltinID == AArch64::BI__break)
1108 if (BuiltinID == AArch64::BI__hlt)
1122 unsigned i = 0, l = 0, u = 0;
1123 switch (BuiltinID) {
1124 default:
return false;
1125 case AArch64::BI__builtin_arm_dmb:
1126 case AArch64::BI__builtin_arm_dsb:
1127 case AArch64::BI__builtin_arm_isb: l = 0; u = 15;
break;
1128 case AArch64::BI__builtin_arm_tcancel: l = 0; u = 65535;
break;
1135struct IntrinToName {
1144 const char *IntrinNames) {
1145 AliasName.consume_front(
"__arm_");
1146 const IntrinToName *It =
1147 llvm::lower_bound(Map, BuiltinID, [](
const IntrinToName &L,
unsigned Id) {
1150 if (It == Map.end() || It->Id != BuiltinID)
1152 StringRef
FullName(&IntrinNames[It->FullName]);
1155 if (It->ShortName == -1)
1157 StringRef
ShortName(&IntrinNames[It->ShortName]);
1162#include "clang/Basic/arm_mve_builtin_aliases.inc"
1170#include "clang/Basic/arm_cde_builtin_aliases.inc"
1191 Diag(AL.
getLoc(), diag::err_attribute_argument_n_type)
1198 StringRef AliasName = cast<FunctionDecl>(
D)->getIdentifier()->getName();
1200 bool IsAArch64 = Context.getTargetInfo().getTriple().isAArch64();
1205 Diag(AL.
getLoc(), diag::err_attribute_arm_builtin_alias);
1209 D->addAttr(::new (Context) ArmBuiltinAliasAttr(Context, AL, Ident));
1215 auto CheckForIncompatibleAttr =
1217 StringRef IncompatibleStateName) {
1218 if (CurrentState == IncompatibleState) {
1219 S.
Diag(AL.
getLoc(), diag::err_attributes_are_not_compatible)
1220 << (std::string(
"'__arm_new(\"") + StateName.str() +
"\")'")
1221 << (std::string(
"'") + IncompatibleStateName.str() +
"(\"" +
1222 StateName.str() +
"\")'")
1237 Diag(AL.
getLoc(), diag::err_missing_arm_state) << AL;
1242 std::vector<StringRef> NewState;
1243 if (
const auto *ExistingAttr =
D->getAttr<ArmNewAttr>()) {
1244 for (StringRef S : ExistingAttr->newArgs())
1245 NewState.push_back(S);
1249 bool HasZT0 =
false;
1250 for (
unsigned I = 0,
E = AL.
getNumArgs(); I !=
E; ++I) {
1251 StringRef StateName;
1256 if (StateName ==
"za")
1258 else if (StateName ==
"zt0")
1261 Diag(LiteralLoc, diag::err_unknown_arm_state) << StateName;
1266 if (!llvm::is_contained(NewState, StateName))
1267 NewState.push_back(StateName);
1270 if (
auto *FPT = dyn_cast<FunctionProtoType>(
D->getFunctionType())) {
1283 D->dropAttr<ArmNewAttr>();
1290 Diag(AL.
getLoc(), diag::err_attribute_not_clinkage) << AL;
1294 const auto *FD = cast<FunctionDecl>(
D);
1295 if (!FD->isExternallyVisible()) {
1296 Diag(AL.
getLoc(), diag::warn_attribute_cmse_entry_static);
1306 Diag(AL.
getLoc(), diag::err_attribute_too_many_arguments) << AL << 1;
1318 ARMInterruptAttr::InterruptType
Kind;
1319 if (!ARMInterruptAttr::ConvertStrToInterruptType(Str,
Kind)) {
1320 Diag(AL.
getLoc(), diag::warn_attribute_type_not_supported)
1321 << AL << Str << ArgLoc;
1327 Diag(
D->getLocation(), diag::warn_arm_interrupt_vfp_clobber);
1338 bool UsesSM = FD->
hasAttr<ArmLocallyStreamingAttr>();
1339 bool UsesZA =
Attr &&
Attr->isNewZA();
1340 bool UsesZT0 =
Attr &&
Attr->isNewZT0();
1342 if (UsesZA || UsesZT0) {
1350 if (FD->
hasAttr<ArmLocallyStreamingAttr>()) {
1353 diag::warn_sme_locally_streaming_has_vl_args_returns)
1356 return P->getOriginalType()->isSizelessVectorType();
1359 diag::warn_sme_locally_streaming_has_vl_args_returns)
1372 if (UsesSM || UsesZA) {
1373 llvm::StringMap<bool> FeatureMap;
1374 Context.getFunctionFeatureMap(FeatureMap, FD);
1375 if (!FeatureMap.contains(
"sme")) {
1378 diag::err_sme_definition_using_sm_in_non_sme_target);
1381 diag::err_sme_definition_using_za_in_non_sme_target);
1385 llvm::StringMap<bool> FeatureMap;
1386 Context.getFunctionFeatureMap(FeatureMap, FD);
1387 if (!FeatureMap.contains(
"sme2")) {
1389 diag::err_sme_definition_using_zt0_in_non_sme2_target);
static constexpr Builtin::Info BuiltinInfo[]
enum clang::sema::@1727::IndirectLocalPathEntry::EntryKind Kind
This file declares semantic analysis functions specific to ARM.
Enumerates target-specific builtins in their own namespaces within namespace clang.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
Builtin::Context & BuiltinInfo
CanQualType UnsignedLongTy
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
CanQualType UnsignedLongLongTy
CanQualType UnsignedShortTy
const TargetInfo & getTargetInfo() const
void getFunctionFeatureMap(llvm::StringMap< bool > &FeatureMap, const FunctionDecl *) const
Attr - This represents one attribute.
SourceLocation getLoc() const
This class is used for builtin types like 'int'.
unsigned getAuxBuiltinID(unsigned ID) const
Return real builtin ID (i.e.
const char * getRequiredFeatures(unsigned ID) const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
SourceLocation getBeginLoc() const LLVM_READONLY
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
A reference to a declared variable, function, enum, etc.
SourceLocation getBeginLoc() const LLVM_READONLY
Decl - This represents one declaration (or definition), e.g.
SourceLocation getLocation() const
This represents one expression.
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
bool isValueDependent() const
Determines whether the value of this expression depends on.
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
@ NPC_ValueDependentIsNotNull
Specifies that a value-dependent expression should be considered to never be a null pointer constant.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, SourceLocation *Loc=nullptr) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Represents a function declaration or definition.
QualType getReturnType() const
ArrayRef< ParmVarDecl * > parameters() const
Represents a prototype with parameter type info, e.g.
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateMask
One of these records is kept for each identifier that is lexed.
unsigned getBuiltinID() const
Return a value indicating whether this is a builtin function.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Describes an entity that is being initialized.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
Flags to identify the types for overloaded Neon builtins.
unsigned getEltSizeInBits() const
EltType getEltType() const
Represents a parameter to a function.
ParsedAttr - Represents a syntactic attribute.
IdentifierLoc * getArgAsIdent(unsigned Arg) const
void setInvalid(bool b=true) const
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this attribute.
bool isArgIdent(unsigned Arg) const
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
QualType withConst() const
void addConst()
Add the const type qualifier to this QualType.
QualType withVolatile() const
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
const Type * getTypePtrOrNull() const
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void CheckSMEFunctionDefAttributes(const FunctionDecl *FD)
bool CheckARMBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall)
bool CheckSMEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall)
bool CheckARMCoprocessorImmediate(const TargetInfo &TI, const Expr *CoprocArg, bool WantCDE)
bool CheckSVEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall)
bool CheckNeonBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall)
bool CheckCDEBuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall)
bool PerformNeonImmChecks(CallExpr *TheCall, SmallVectorImpl< std::tuple< int, int, int, int > > &ImmChecks, int OverloadType=-1)
bool CheckMVEBuiltinFunctionCall(unsigned BuiltinID, CallExpr *TheCall)
void handleInterruptAttr(Decl *D, const ParsedAttr &AL)
bool PerformSVEImmChecks(CallExpr *TheCall, SmallVectorImpl< std::tuple< int, int, int > > &ImmChecks)
void handleBuiltinAliasAttr(Decl *D, const ParsedAttr &AL)
@ ArmStreaming
Intrinsic is only available in normal mode.
@ VerifyRuntimeMode
Intrinsic is available both in normal and Streaming-SVE mode.
@ ArmStreamingCompatible
Intrinsic is only available in Streaming-SVE mode.
void handleNewAttr(Decl *D, const ParsedAttr &AL)
bool CheckARMBuiltinExclusiveCall(unsigned BuiltinID, CallExpr *TheCall, unsigned MaxWidth)
bool SveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool CheckAArch64BuiltinFunctionCall(const TargetInfo &TI, unsigned BuiltinID, CallExpr *TheCall)
bool MveAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool BuiltinARMMemoryTaggingCall(unsigned BuiltinID, CallExpr *TheCall)
BuiltinARMMemoryTaggingCall - Handle calls of memory tagging extensions.
void handleCmseNSEntryAttr(Decl *D, const ParsedAttr &AL)
bool CheckImmediateArg(CallExpr *TheCall, unsigned CheckTy, unsigned ArgIdx, unsigned EltBitWidth, unsigned VecBitWidth)
bool BuiltinARMSpecialReg(unsigned BuiltinID, CallExpr *TheCall, int ArgNum, unsigned ExpectedFieldNum, bool AllowName)
BuiltinARMSpecialReg - Handle a check if argument ArgNum of CallExpr TheCall is an ARM/AArch64 specia...
bool SmeAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
bool CdeAliasValid(unsigned BuiltinID, llvm::StringRef AliasName)
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
ASTContext & getASTContext() const
const LangOptions & getLangOpts() const
Sema - This implements semantic analysis and AST building for C.
bool BuiltinConstantArgMultiple(CallExpr *TheCall, int ArgNum, unsigned Multiple)
BuiltinConstantArgMultiple - Handle a check if argument ArgNum of CallExpr TheCall is a constant expr...
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
ExprResult DefaultLvalueConversion(Expr *E)
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
bool BuiltinConstantArg(CallExpr *TheCall, int ArgNum, llvm::APSInt &Result)
BuiltinConstantArg - Handle a check if argument ArgNum of CallExpr TheCall is a constant expression.
bool isConstantEvaluatedContext() const
bool checkArgCount(CallExpr *Call, unsigned DesiredArgCount)
Checks that a call expression's argument count is the desired number.
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
bool BuiltinConstantArgRange(CallExpr *TheCall, int ArgNum, int Low, int High, bool RangeIsError=true)
BuiltinConstantArgRange - Handle a check if argument ArgNum of CallExpr TheCall is a constant express...
bool checkStringLiteralArgumentAttr(const AttributeCommonInfo &CI, const Expr *E, StringRef &Str, SourceLocation *ArgLocation=nullptr)
Check if the argument E is a ASCII string literal.
Encodes a location in the source.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
Exposes information about the current target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
IntType getInt64Type() const
uint32_t getARMCDECoprocMask() const
For ARM targets returns a mask defining which coprocessors are configured as Custom Datapath.
virtual bool hasFeature(StringRef Feature) const
Determine whether the given target has the given feature.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isFloatingType() const
bool isAnyPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isSizelessVectorType() const
Returns true for all scalable vector types.
Defines the clang::TargetInfo interface.
bool evaluateRequiredTargetFeatures(llvm::StringRef RequiredFatures, const llvm::StringMap< bool > &TargetFetureMap)
Returns true if the required target features of a builtin function are enabled.
const AstTypeMatcher< PointerType > pointerType
Matches pointer types, but does not match Objective-C object pointer types.
The JSON file list parser is used to communicate input to InstallAPI.
static bool hasArmZAState(const FunctionDecl *FD)
static bool BuiltinAliasValid(unsigned BuiltinID, StringRef AliasName, ArrayRef< IntrinToName > Map, const char *IntrinNames)
static ArmSMEState getSMEState(unsigned BuiltinID)
static bool checkArmStreamingBuiltin(Sema &S, CallExpr *TheCall, const FunctionDecl *FD, SemaARM::ArmStreamingType BuiltinType, unsigned BuiltinID)
SemaARM::ArmStreamingType getArmStreamingFnType(const FunctionDecl *FD)
@ AANT_ArgumentIdentifier
@ Result
The result type of a method or function.
static bool hasArmZT0State(const FunctionDecl *FD)
CastKind
CastKind - The kind of operation required for a conversion.
const FunctionProtoType * T
static QualType getNeonEltType(NeonTypeFlags Flags, ASTContext &Context, bool IsPolyUnsigned, bool IsInt64Long)
getNeonEltType - Return the QualType corresponding to the elements of the vector type specified by th...
static bool checkNewAttrMutualExclusion(Sema &S, const ParsedAttr &AL, const FunctionProtoType *FPT, FunctionType::ArmStateValue CurrentState, StringRef StateName)
Extra information about a function prototype.
unsigned AArch64SMEAttributes