45#include "llvm/ADT/STLExtras.h"
46#include "llvm/ADT/ScopeExit.h"
47#include "llvm/ADT/StringExtras.h"
48#include "llvm/IR/Constants.h"
49#include "llvm/IR/DataLayout.h"
50#include "llvm/IR/Intrinsics.h"
51#include "llvm/IR/IntrinsicsWebAssembly.h"
52#include "llvm/IR/LLVMContext.h"
53#include "llvm/IR/MDBuilder.h"
54#include "llvm/IR/MatrixBuilder.h"
55#include "llvm/Support/ConvertUTF.h"
56#include "llvm/Support/Endian.h"
57#include "llvm/Support/MathExtras.h"
58#include "llvm/Support/Path.h"
59#include "llvm/Support/SaveAndRestore.h"
60#include "llvm/Support/xxhash.h"
61#include "llvm/Transforms/Utils/SanitizerStats.h"
75 llvm::cl::desc(
"Guard UBSAN checks with `llvm.allow.ubsan.check()`."));
101#define SANITIZER_CHECK(Enum, Name, Version, Msg) \
102 case SanitizerHandler::Enum: \
105#undef SANITIZER_CHECK
107 llvm_unreachable(
"unhandled switch case");
115 llvm::Value *ArraySize) {
117 auto Alloca =
Builder.CreateStructuredAlloca(Ty, Name);
128 llvm::Value *ArraySize) {
138 llvm::IRBuilderBase::InsertPointGuard IPG(Builder);
153 llvm::Value *ArraySize,
157 *AllocaAddr = Alloca;
158 return MaybeCastStackAddressSpace(Alloca, DestLangAS, ArraySize);
166 llvm::Value *ArraySize) {
167 llvm::AllocaInst *Alloca;
169 Alloca =
Builder.CreateAlloca(Ty, ArraySize, Name);
172 new llvm::AllocaInst(Ty,
CGM.getDataLayout().getAllocaAddrSpace(),
174 if (
SanOpts.Mask & SanitizerKind::Address) {
175 Alloca->addAnnotationMetadata({
"alloca_name_altered", Name.str()});
178 Allocas->Add(Alloca);
215 auto *ArrayElementTy = ArrayTy->getElementType();
216 auto ArrayElements = ArrayTy->getNumElements();
219 ArrayElementTy = VectorTy->getElementType();
220 ArrayElements *= VectorTy->getNumElements();
222 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
245 PGO->setCurrentStmt(E);
248 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this, MemPtr, MPT);
271 if (
const auto *CondOp = dyn_cast<AbstractConditionalOperator>(
294 if (!ignoreResult && aggSlot.
isIgnored())
299 llvm_unreachable(
"bad evaluation kind");
341 llvm_unreachable(
"bad evaluation kind");
364 llvm_unreachable(
"bad evaluation kind");
404 bool Precise = isa_and_nonnull<VarDecl>(VD) &&
405 VD->
hasAttr<ObjCPreciseLifetimeAttr>();
426 llvm_unreachable(
"temporary cannot have dynamic storage duration");
428 llvm_unreachable(
"unknown storage duration");
438 if (
const auto *ClassDecl =
442 ReferenceTemporaryDtor = ClassDecl->getDestructor();
444 if (!ReferenceTemporaryDtor)
449 bool CanRegisterDestructor =
454 llvm::FunctionCallee CleanupFn;
455 llvm::Constant *CleanupArg;
461 CleanupArg = llvm::Constant::getNullValue(CGF.
Int8PtrTy);
478 llvm_unreachable(
"temporary cannot have dynamic storage duration");
500 auto *GV =
new llvm::GlobalVariable(
502 llvm::GlobalValue::PrivateLinkage,
Init,
".ref.tmp",
nullptr,
503 llvm::GlobalValue::NotThreadLocal,
507 llvm::Constant *
C = GV;
514 return RawAddress(
C, GV->getValueType(), alignment);
523 llvm_unreachable(
"temporary can't have dynamic storage duration");
525 llvm_unreachable(
"unknown storage duration");
534 "Reference should never be pseudo-strong!");
542 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(
Object.getPointer())) {
552 if (Var->hasInitializer())
555 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
561 default: llvm_unreachable(
"expected scalar or aggregate expression");
584 for (
const auto &Ignored : CommaLHSs)
587 if (
const auto *opaque = dyn_cast<OpaqueValueExpr>(E)) {
588 if (opaque->getType()->isRecordType()) {
589 assert(Adjustments.empty());
597 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(
598 Object.getPointer()->stripPointerCasts())) {
604 if (!Var->hasInitializer()) {
605 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
626 if (!ShouldEmitLifetimeMarkers)
637 CGBuilderTy::InsertPoint OldIP;
639 ((!
SanOpts.has(SanitizerKind::HWAddress) &&
640 !
SanOpts.has(SanitizerKind::Memory) &&
641 !
SanOpts.has(SanitizerKind::MemtagStack) &&
642 !
CGM.getCodeGenOpts().SanitizeAddressUseAfterScope) ||
644 OldConditional = OutermostConditional;
645 OutermostConditional =
nullptr;
656 if (OldConditional) {
657 OutermostConditional = OldConditional;
674 switch (Adjustment.Kind) {
678 Adjustment.DerivedToBase.BasePath->path_begin(),
679 Adjustment.DerivedToBase.BasePath->path_end(),
687 "materialized temporary field is not a simple lvalue");
695 E,
Object, Ptr, Adjustment.Ptr.MPT,
true);
728 const llvm::Constant *Elts) {
736 Builder.CreateMul(Ptr, Builder.getInt64(0xbf58476d1ce4e5b9u));
738 Builder.CreateXor(A0, Builder.CreateLShr(A0, Builder.getInt64(31)));
739 return Builder.CreateXor(Acc, A1);
756 return SanOpts.has(SanitizerKind::Null) ||
757 SanOpts.has(SanitizerKind::Alignment) ||
758 SanOpts.has(SanitizerKind::ObjectSize) ||
759 SanOpts.has(SanitizerKind::Vptr);
766 llvm::Value *ArraySize) {
773 if (Ptr->getType()->getPointerAddressSpace())
784 auto PtrToAlloca = dyn_cast<llvm::AllocaInst>(Ptr->stripPointerCasts());
786 llvm::Value *IsNonNull =
nullptr;
787 bool IsGuaranteedNonNull =
788 SkippedChecks.
has(SanitizerKind::Null) || PtrToAlloca;
790 llvm::BasicBlock *Done =
nullptr;
791 bool DoneViaNullSanitize =
false;
794 auto CheckHandler = SanitizerHandler::TypeMismatch;
796 {SanitizerKind::SO_Null,
797 SanitizerKind::SO_ObjectSize,
798 SanitizerKind::SO_Alignment},
806 if ((
SanOpts.has(SanitizerKind::Null) || AllowNullPointers) &&
807 !IsGuaranteedNonNull) {
809 IsNonNull =
Builder.CreateIsNotNull(Ptr);
813 IsGuaranteedNonNull = IsNonNull ==
True;
816 if (!IsGuaranteedNonNull) {
817 if (AllowNullPointers) {
821 DoneViaNullSanitize =
true;
823 Builder.CreateCondBr(IsNonNull, Rest, Done);
826 Checks.push_back(std::make_pair(IsNonNull, SanitizerKind::SO_Null));
831 if (
SanOpts.has(SanitizerKind::ObjectSize) &&
832 !SkippedChecks.
has(SanitizerKind::ObjectSize) &&
834 uint64_t TySize =
CGM.getMinimumObjectSize(Ty).getQuantity();
835 llvm::Value *Size = llvm::ConstantInt::get(
IntPtrTy, TySize);
837 Size =
Builder.CreateMul(Size, ArraySize);
840 llvm::Constant *ConstantSize = dyn_cast<llvm::Constant>(Size);
841 if (!ConstantSize || !ConstantSize->isNullValue()) {
848 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::objectsize, Tys);
850 llvm::Value *NullIsUnknown =
Builder.getFalse();
851 llvm::Value *Dynamic =
Builder.getFalse();
852 llvm::Value *LargeEnough =
Builder.CreateICmpUGE(
853 Builder.CreateCall(F, {Ptr, Min, NullIsUnknown, Dynamic}), Size);
855 std::make_pair(LargeEnough, SanitizerKind::SO_ObjectSize));
859 llvm::MaybeAlign AlignVal;
860 llvm::Value *PtrAsInt =
nullptr;
862 if (
SanOpts.has(SanitizerKind::Alignment) &&
863 !SkippedChecks.
has(SanitizerKind::Alignment)) {
866 AlignVal =
CGM.getNaturalTypeAlignment(Ty,
nullptr,
nullptr,
871 if (AlignVal && *AlignVal > llvm::Align(1) &&
872 (!PtrToAlloca || PtrToAlloca->getAlign() < *AlignVal)) {
874 llvm::Value *Align =
Builder.CreateAnd(
875 PtrAsInt, llvm::ConstantInt::get(
IntPtrTy, AlignVal->value() - 1));
876 llvm::Value *Aligned =
880 std::make_pair(Aligned, SanitizerKind::SO_Alignment));
884 if (Checks.size() > 0) {
885 llvm::Constant *StaticData[] = {
887 llvm::ConstantInt::get(
Int8Ty, AlignVal ? llvm::Log2(*AlignVal) : 1),
888 llvm::ConstantInt::get(
Int8Ty, TCK)};
889 EmitCheck(Checks, CheckHandler, StaticData, PtrAsInt ? PtrAsInt : Ptr);
901 if (
SanOpts.has(SanitizerKind::Vptr) &&
904 SanitizerHandler::DynamicTypeCacheMiss);
908 if (!IsGuaranteedNonNull) {
910 IsNonNull =
Builder.CreateIsNotNull(Ptr);
914 Builder.CreateCondBr(IsNonNull, VptrNotNull, Done);
920 llvm::raw_svector_ostream Out(MangledName);
925 if (!
CGM.getContext().getNoSanitizeList().containsType(SanitizerKind::Vptr,
928 llvm::Value *TypeHash =
929 llvm::ConstantInt::get(
Int64Ty, xxh3_64bits(Out.str()));
943 const int CacheSize = 128;
944 llvm::Type *HashTable = llvm::ArrayType::get(
IntPtrTy, CacheSize);
945 llvm::Value *
Cache =
CGM.CreateRuntimeVariable(HashTable,
946 "__ubsan_vptr_type_cache");
947 llvm::Value *Slot =
Builder.CreateAnd(Hash,
950 llvm::Value *Indices[] = {
Builder.getInt32(0), Slot };
951 llvm::Value *CacheVal =
Builder.CreateAlignedLoad(
959 llvm::Value *EqualHash =
Builder.CreateICmpEQ(CacheVal, Hash);
960 llvm::Constant *StaticData[] = {
964 llvm::ConstantInt::get(
Int8Ty, TCK)
966 llvm::Value *DynamicData[] = { Ptr, Hash };
967 EmitCheck(std::make_pair(EqualHash, SanitizerKind::SO_Vptr),
968 SanitizerHandler::DynamicTypeCacheMiss, StaticData,
976 {DoneViaNullSanitize ? SanitizerKind::SO_Null : SanitizerKind::SO_Vptr},
977 DoneViaNullSanitize ? SanitizerHandler::TypeMismatch
978 : SanitizerHandler::DynamicTypeCacheMiss);
987 uint64_t EltSize =
C.getTypeSizeInChars(EltTy).getQuantity();
995 auto *ParamDecl = dyn_cast<ParmVarDecl>(ArrayDeclRef->getDecl());
999 auto *POSAttr = ParamDecl->getAttr<PassObjectSizeAttr>();
1004 int POSType = POSAttr->getType();
1005 if (POSType != 0 && POSType != 1)
1009 auto PassedSizeIt = SizeArguments.find(ParamDecl);
1010 if (PassedSizeIt == SizeArguments.end())
1014 assert(LocalDeclMap.count(PassedSizeDecl) &&
"Passed size not loadable");
1015 Address AddrOfSize = LocalDeclMap.find(PassedSizeDecl)->second;
1018 llvm::Value *SizeOfElement =
1019 llvm::ConstantInt::get(SizeInBytes->getType(), EltSize);
1020 return Builder.CreateUDiv(SizeInBytes, SizeOfElement);
1029 StrictFlexArraysLevel) {
1032 IndexedType =
Base->getType();
1033 return CGF.
Builder.getInt32(VT->getNumElements());
1038 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1039 if (CE->getCastKind() == CK_ArrayToPointerDecay &&
1040 !CE->getSubExpr()->isFlexibleArrayMemberLike(CGF.
getContext(),
1041 StrictFlexArraysLevel)) {
1044 IndexedType = CE->getSubExpr()->getType();
1046 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
1047 return CGF.
Builder.getInt(CAT->getSize());
1049 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT))
1057 QualType EltTy{
Base->getType()->getPointeeOrArrayElementType(), 0};
1059 IndexedType =
Base->getType();
1100class StructAccessBase
1101 :
public ConstStmtVisitor<StructAccessBase, const Expr *> {
1105 const FieldDecl *CountDecl;
1110 bool IsExpectedRecordDecl(
const Expr *E)
const {
1119 StructAccessBase(
const FieldDecl *CountDecl) : CountDecl(CountDecl) {}
1138 const Expr *Visit(
const Expr *E) {
1139 return ConstStmtVisitor<StructAccessBase, const Expr *>::Visit(E);
1142 const Expr *VisitStmt(
const Stmt *S) {
return nullptr; }
1157 const Expr *VisitDeclRefExpr(
const DeclRefExpr *E) {
1158 return IsExpectedRecordDecl(E) ? E :
nullptr;
1160 const Expr *VisitMemberExpr(
const MemberExpr *E) {
1161 if (IsExpectedRecordDecl(E) && E->
isArrow())
1163 const Expr *Res = Visit(E->
getBase());
1164 return !Res && IsExpectedRecordDecl(E) ? E : Res;
1166 const Expr *VisitCompoundLiteralExpr(
const CompoundLiteralExpr *E) {
1167 return IsExpectedRecordDecl(E) ? E :
nullptr;
1169 const Expr *VisitCallExpr(
const CallExpr *E) {
1170 return IsExpectedRecordDecl(E) ? E :
nullptr;
1173 const Expr *VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
1174 if (IsExpectedRecordDecl(E))
1178 const Expr *VisitCastExpr(
const CastExpr *E) {
1180 return IsExpectedRecordDecl(E) ? E :
nullptr;
1183 const Expr *VisitParenExpr(
const ParenExpr *E) {
1186 const Expr *VisitUnaryAddrOf(
const UnaryOperator *E) {
1189 const Expr *VisitUnaryDeref(
const UnaryOperator *E) {
1198 const FieldDecl *Field, int64_t &Offset) {
1201 unsigned FieldNo = 0;
1230 const Expr *StructBase = StructAccessBase(CountDecl).Visit(
Base);
1252 llvm::Value *Res =
nullptr;
1257 Res =
Addr.emitRawPointer(*
this);
1258 }
else if (StructBase->
isLValue()) {
1261 Res =
Addr.emitRawPointer(*
this);
1266 return Builder.CreateInBoundsGEP(
1288 const Expr *ArrayExprBase,
1289 llvm::Value *IndexVal,
QualType IndexType,
1291 assert(
SanOpts.has(SanitizerKind::ArrayBounds) &&
1292 "should not be called unless adding bounds checks");
1297 *
this, ArrayExprBase, ArrayExprBaseType, StrictFlexArraysLevel);
1300 BoundsVal,
getContext().getSizeType(), Accessed);
1305 llvm::Value *IndexVal,
1307 llvm::Value *BoundsVal,
1308 QualType BoundsType,
bool Accessed) {
1312 auto CheckKind = SanitizerKind::SO_ArrayBounds;
1313 auto CheckHandler = SanitizerHandler::OutOfBounds;
1325 llvm::Value *IndexInst =
Builder.CreateIntCast(IndexVal, Ty, IndexSigned);
1326 llvm::Value *BoundsInst =
Builder.CreateIntCast(BoundsVal, Ty,
false);
1328 llvm::Constant *StaticData[] = {
1334 llvm::Value *Check = Accessed ?
Builder.CreateICmpULT(IndexInst, BoundsInst)
1335 :
Builder.CreateICmpULE(IndexInst, BoundsInst);
1340 BoundsVal, llvm::ConstantInt::get(BoundsVal->getType(), 0));
1344 EmitCheck(std::make_pair(Check, CheckKind), CheckHandler, StaticData,
1353 const auto *ND = dyn_cast_if_present<NamedDecl>(D);
1363 llvm::raw_svector_ostream OS(Name);
1364 ND->printQualifiedName(OS, Policy);
1369 std::optional<llvm::AllocTokenMetadata> ATMD;
1373 const llvm::AllocTokenMode Mode =
1375 if (Mode == llvm::AllocTokenMode::TypeFuncHash ||
1376 Mode == llvm::AllocTokenMode::TypeFuncHashPointerSplit) {
1381 ATMD = llvm::AllocTokenMetadata{{},
false};
1391 auto *TypeNameMD = MDB.createString(ATMD->TypeName);
1392 auto *ContainsPtrC =
Builder.getInt1(ATMD->ContainsPointer);
1393 auto *ContainsPtrMD = MDB.createConstant(ContainsPtrC);
1397 if (ATMD->FunctionName)
1398 Ops.push_back(MDB.createString(*ATMD->FunctionName));
1399 return llvm::MDNode::get(
CGM.getLLVMContext(), Ops);
1403 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1404 "Only needed with -fsanitize=alloc-token");
1405 CB->setMetadata(llvm::LLVMContext::MD_alloc_token,
1415 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1416 "Only needed with -fsanitize=alloc-token");
1418 CB->setMetadata(llvm::LLVMContext::MD_alloc_token, MDN);
1423 bool isInc,
bool isPre) {
1426 llvm::Value *NextVal;
1428 uint64_t AmountVal = isInc ? 1 : -1;
1429 NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal,
true);
1432 NextVal =
Builder.CreateAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1435 llvm::APFloat FVal(
getContext().getFloatTypeSemantics(ElemTy), 1);
1441 NextVal =
Builder.CreateFAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1449 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
1454 return isPre ? IncVal : InVal;
1464 DI->EmitExplicitCastType(E->
getType());
1475 if (
auto *constantIdx = dyn_cast<llvm::ConstantInt>(idx)) {
1476 CharUnits offset = constantIdx->getZExtValue() * eltSize;
1490 assert(BO->
isAdditiveOp() &&
"Expect an addition or subtraction.");
1493 bool isSubtraction = BO->
getOpcode() == BO_Sub;
1496 llvm::Value *
index =
nullptr;
1500 std::swap(pointerOperand, indexOperand);
1512 BO, pointerOperand, pointer, indexOperand,
index, isSubtraction);
1519 nullptr, IsKnownNonNull);
1532 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
1533 if (
const auto *ECE = dyn_cast<ExplicitCastExpr>(CE))
1536 switch (CE->getCastKind()) {
1540 case CK_AddressSpaceConversion:
1541 if (
auto PtrTy = CE->getSubExpr()->getType()->getAs<
PointerType>()) {
1542 if (PtrTy->getPointeeType()->isVoidType())
1548 CE->getSubExpr(), &InnerBaseInfo, &InnerTBAAInfo, IsKnownNonNull);
1549 if (BaseInfo) *BaseInfo = InnerBaseInfo;
1550 if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
1556 E->
getType(), &TargetTypeBaseInfo, &TargetTypeTBAAInfo);
1564 BaseInfo->mergeForCast(TargetTypeBaseInfo);
1565 Addr.setAlignment(Align);
1569 if (CGF.
SanOpts.
has(SanitizerKind::CFIUnrelatedCast) &&
1570 CE->getCastKind() == CK_BitCast) {
1578 llvm::Type *ElemTy =
1580 Addr =
Addr.withElementType(ElemTy);
1581 if (CE->getCastKind() == CK_AddressSpaceConversion)
1591 case CK_ArrayToPointerDecay:
1595 case CK_UncheckedDerivedToBase:
1596 case CK_DerivedToBase: {
1603 CE->getSubExpr(), BaseInfo,
nullptr,
1605 CE->getCastKind() == CK_UncheckedDerivedToBase));
1606 auto Derived = CE->getSubExpr()->
getType()->getPointeeCXXRecordDecl();
1608 Addr, Derived, CE->path_begin(), CE->path_end(),
1621 if (UO->getOpcode() == UO_AddrOf) {
1622 LValue LV = CGF.
EmitLValue(UO->getSubExpr(), IsKnownNonNull);
1623 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1624 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1625 return LV.getAddress();
1630 if (
auto *
Call = dyn_cast<CallExpr>(E)) {
1631 switch (
Call->getBuiltinCallee()) {
1634 case Builtin::BIaddressof:
1635 case Builtin::BI__addressof:
1636 case Builtin::BI__builtin_addressof: {
1638 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1639 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1640 return LV.getAddress();
1646 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
1647 if (BO->isAdditiveOp())
1656 true, BaseInfo, TBAAInfo, IsKnownNonNull);
1666 if (IsKnownNonNull && !
Addr.isKnownNonNull())
1667 Addr.setKnownNonNull();
1674 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this,
V, MPT);
1675 return Builder.CreateICmpNE(
V, llvm::Constant::getNullValue(
V->getType()));
1686 llvm::Value *
U = llvm::UndefValue::get(EltTy);
1701 llvm_unreachable(
"bad evaluation kind");
1726 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1727 Base = CE->getSubExpr();
1728 }
else if (
const auto *PE = dyn_cast<ParenExpr>(
Base)) {
1729 Base = PE->getSubExpr();
1730 }
else if (
const auto *UO = dyn_cast<UnaryOperator>(
Base)) {
1731 if (UO->getOpcode() == UO_Extension)
1732 Base = UO->getSubExpr();
1750 if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
1753 SkippedChecks.
set(SanitizerKind::Alignment,
true);
1755 SkippedChecks.
set(SanitizerKind::Null,
true);
1782 CGM.runWithSufficientStackSpace(
1783 E->
getExprLoc(), [&] { LV = EmitLValueHelper(E, IsKnownNonNull); });
1790LValue CodeGenFunction::EmitLValueHelper(
const Expr *E,
1796 case Expr::ObjCPropertyRefExprClass:
1797 llvm_unreachable(
"cannot emit a property reference directly");
1799 case Expr::ObjCSelectorExprClass:
1801 case Expr::ObjCIsaExprClass:
1803 case Expr::BinaryOperatorClass:
1805 case Expr::CompoundAssignOperatorClass: {
1808 Ty = AT->getValueType();
1813 case Expr::CallExprClass:
1814 case Expr::CXXMemberCallExprClass:
1815 case Expr::CXXOperatorCallExprClass:
1816 case Expr::UserDefinedLiteralClass:
1818 case Expr::CXXRewrittenBinaryOperatorClass:
1821 case Expr::VAArgExprClass:
1823 case Expr::DeclRefExprClass:
1825 case Expr::ConstantExprClass: {
1831 case Expr::ParenExprClass:
1833 case Expr::GenericSelectionExprClass:
1836 case Expr::PredefinedExprClass:
1838 case Expr::StringLiteralClass:
1840 case Expr::ObjCEncodeExprClass:
1842 case Expr::PseudoObjectExprClass:
1844 case Expr::InitListExprClass:
1846 case Expr::CXXTemporaryObjectExprClass:
1847 case Expr::CXXConstructExprClass:
1849 case Expr::CXXBindTemporaryExprClass:
1851 case Expr::CXXUuidofExprClass:
1853 case Expr::LambdaExprClass:
1856 case Expr::ExprWithCleanupsClass: {
1858 RunCleanupsScope
Scope(*
this);
1859 LValue LV =
EmitLValue(cleanups->getSubExpr(), IsKnownNonNull);
1860 if (LV.isSimple()) {
1864 llvm::Value *
V =
Addr.getBasePointer();
1865 Scope.ForceCleanup({&
V});
1866 Addr.replaceBasePointer(
V);
1868 LV.getBaseInfo(), LV.getTBAAInfo());
1875 case Expr::CXXDefaultArgExprClass: {
1878 return EmitLValue(DAE->getExpr(), IsKnownNonNull);
1880 case Expr::CXXDefaultInitExprClass: {
1883 return EmitLValue(DIE->getExpr(), IsKnownNonNull);
1885 case Expr::CXXTypeidExprClass:
1888 case Expr::ObjCMessageExprClass:
1890 case Expr::ObjCIvarRefExprClass:
1892 case Expr::StmtExprClass:
1894 case Expr::UnaryOperatorClass:
1896 case Expr::ArraySubscriptExprClass:
1898 case Expr::MatrixSingleSubscriptExprClass:
1900 case Expr::MatrixSubscriptExprClass:
1902 case Expr::ArraySectionExprClass:
1904 case Expr::ExtVectorElementExprClass:
1906 case Expr::MatrixElementExprClass:
1908 case Expr::CXXThisExprClass:
1910 case Expr::MemberExprClass:
1912 case Expr::CompoundLiteralExprClass:
1914 case Expr::ConditionalOperatorClass:
1916 case Expr::BinaryConditionalOperatorClass:
1918 case Expr::ChooseExprClass:
1920 case Expr::OpaqueValueExprClass:
1922 case Expr::SubstNonTypeTemplateParmExprClass:
1925 case Expr::ImplicitCastExprClass:
1926 case Expr::CStyleCastExprClass:
1927 case Expr::CXXFunctionalCastExprClass:
1928 case Expr::CXXStaticCastExprClass:
1929 case Expr::CXXDynamicCastExprClass:
1930 case Expr::CXXReinterpretCastExprClass:
1931 case Expr::CXXConstCastExprClass:
1932 case Expr::CXXAddrspaceCastExprClass:
1933 case Expr::ObjCBridgedCastExprClass:
1936 case Expr::MaterializeTemporaryExprClass:
1939 case Expr::CoawaitExprClass:
1941 case Expr::CoyieldExprClass:
1943 case Expr::PackIndexingExprClass:
1945 case Expr::HLSLOutArgExprClass:
1946 llvm_unreachable(
"cannot emit a HLSL out argument directly");
1964 }
else if (
const auto *var = dyn_cast<VarDecl>(
Value)) {
1975 bool resultIsReference;
1981 resultIsReference =
false;
1987 resultIsReference =
true;
2008 auto *MD = dyn_cast_or_null<CXXMethodDecl>(
CurCodeDecl);
2009 if (
isLambdaMethod(MD) && MD->getOverloadedOperator() == OO_Call) {
2012 if (
const VarDecl *VD = dyn_cast<const VarDecl>(D)) {
2013 if (!VD->hasAttr<CUDADeviceAttr>()) {
2036 if (resultIsReference)
2063 assert(
Constant &&
"not a constant");
2086 llvm::APInt &End,
bool StrictEnums,
bool StrictBool,
2089 bool IsRegularCPlusPlusEnum =
2090 CGF.
getLangOpts().CPlusPlus && StrictEnums && ED && !ED->isFixed();
2091 if (!IsBool && !IsRegularCPlusPlusEnum)
2100 ED->getValueRange(End,
Min);
2105llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
2106 llvm::APInt
Min, End;
2108 bool StrictBoolEnabled =
CGM.getCodeGenOpts().getLoadBoolFromMem() ==
2111 CGM.getCodeGenOpts().StrictEnums,
2112 StrictBoolEnabled, IsBool))
2116 return MDHelper.createRange(
Min, End);
2124 }
else if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2125 if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty)) {
2126 Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
2127 Load->setMetadata(llvm::LLVMContext::MD_noundef,
2128 llvm::MDNode::get(
CGM.getLLVMContext(), {}));
2135 bool HasBoolCheck =
SanOpts.has(SanitizerKind::Bool);
2136 bool HasEnumCheck =
SanOpts.has(SanitizerKind::Enum);
2137 if (!HasBoolCheck && !HasEnumCheck)
2142 bool NeedsBoolCheck = HasBoolCheck && IsBool;
2144 if (!NeedsBoolCheck && !NeedsEnumCheck)
2154 if (NeedsEnumCheck &&
2155 getContext().isTypeIgnoredBySanitizer(SanitizerKind::Enum, Ty))
2158 llvm::APInt
Min, End;
2164 NeedsEnumCheck ? SanitizerKind::SO_Enum : SanitizerKind::SO_Bool;
2167 auto CheckHandler = SanitizerHandler::LoadInvalidValue;
2172 Check =
Builder.CreateICmpULE(
Value, llvm::ConstantInt::get(Ctx, End));
2174 llvm::Value *Upper =
2175 Builder.CreateICmpSLE(
Value, llvm::ConstantInt::get(Ctx, End));
2176 llvm::Value *Lower =
2178 Check =
Builder.CreateAnd(Upper, Lower);
2182 EmitCheck(std::make_pair(Check, Kind), CheckHandler, StaticArgs,
Value);
2191 bool isNontemporal) {
2192 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2193 if (GV->isThreadLocal())
2199 if (ClangVecTy->isPackedVectorBoolType(
getContext())) {
2201 unsigned ValNumElems =
2204 auto *RawIntV =
Builder.CreateLoad(
Addr, Volatile,
"load_bits");
2205 const auto *RawIntTy = RawIntV->getType();
2206 assert(RawIntTy->isIntegerTy() &&
"compressed iN storage for bitvectors");
2208 auto *PaddedVecTy = llvm::FixedVectorType::get(
2209 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2210 llvm::Value *
V =
Builder.CreateBitCast(RawIntV, PaddedVecTy);
2223 if (VTy != NewVecTy) {
2225 llvm::Value *
V =
Builder.CreateLoad(Cast, Volatile,
"loadVecN");
2226 unsigned OldNumElements = VTy->getNumElements();
2228 std::iota(Mask.begin(), Mask.end(), 0);
2229 V =
Builder.CreateShuffleVector(
V, Mask,
"extractVec");
2244 llvm::LoadInst *Load =
Builder.CreateLoad(
Addr, Volatile);
2245 if (isNontemporal) {
2246 llvm::MDNode *Node = llvm::MDNode::get(
2247 Load->getContext(), llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2248 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2251 CGM.DecorateInstructionWithTBAA(Load, TBAAInfo);
2263 Ty = AtomicTy->getValueType();
2271 if (StoreTy->isVectorTy() && StoreTy->getScalarSizeInBits() >
2276 unsigned MemNumElems = StoreTy->getPrimitiveSizeInBits();
2297 Ty = AtomicTy->getValueType();
2303 auto *PaddedVecTy = llvm::FixedVectorType::get(
2304 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2315 if (HasBoolRep &&
CGM.getCodeGenOpts().isConvertingBoolWithCmp0()) {
2329 bool IsVector =
true) {
2330 auto *ArrayTy = dyn_cast<llvm::ArrayType>(
Addr.getElementType());
2331 if (ArrayTy && IsVector) {
2332 auto ArrayElements = ArrayTy->getNumElements();
2333 auto *ArrayElementTy = ArrayTy->getElementType();
2336 ArrayElementTy = VectorTy->getElementType();
2337 ArrayElements *= VectorTy->getNumElements();
2339 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
2341 return Addr.withElementType(VectorTy);
2343 auto *VectorTy = dyn_cast<llvm::VectorType>(
Addr.getElementType());
2344 if (VectorTy && !IsVector) {
2345 auto *ArrayTy = llvm::ArrayType::get(
2346 VectorTy->getElementType(),
2349 return Addr.withElementType(ArrayTy);
2363 llvm::MatrixBuilder MB(CGF.
Builder);
2364 value = MB.CreateColumnMajorToRowMajorTransform(
2365 value, MatrixTy->getNumRows(), MatrixTy->getNumColumns());
2368 value->getType()->isVectorTy());
2370 lvalue.getBaseInfo(), lvalue.getTBAAInfo(), isInit,
2371 lvalue.isNontemporal());
2380 "Result must be a Constant Matrix");
2402 for (uint32_t &Idx : Indices) {
2404 unsigned Row = Idx / NumCols;
2405 unsigned Col = Idx % NumCols;
2407 Idx = MT->getColumnMajorFlattenedIndex(Row, Col);
2411 if (
Base.isSimple()) {
2415 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
Base, *
this);
2417 llvm::Constant *CV =
2420 CV, ResultType,
Base.getBaseInfo(),
2423 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
2425 llvm::Constant *BaseElts =
Base.getExtVectorElts();
2428 for (
unsigned Index : Indices)
2429 CElts.push_back(BaseElts->getAggregateElement(Index));
2430 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
2441 bool isInit,
bool isNontemporal) {
2442 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2443 if (GV->isThreadLocal())
2451 if (
auto *VecTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
2453 CGM.getABIInfo().getOptimalVectorMemoryType(VecTy,
getLangOpts());
2454 if (!ClangVecTy->isPackedVectorBoolType(
getContext()) &&
2455 VecTy != NewVecTy) {
2457 VecTy->getNumElements());
2458 std::iota(Mask.begin(), Mask.begin() + VecTy->getNumElements(), 0);
2462 Mask,
"extractVec");
2465 if (
Addr.getElementType() != SrcTy)
2466 Addr =
Addr.withElementType(SrcTy);
2483 if (isNontemporal) {
2484 llvm::MDNode *Node =
2485 llvm::MDNode::get(Store->getContext(),
2486 llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2487 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2490 CGM.DecorateInstructionWithTBAA(Store, TBAAInfo);
2509 assert(LV.getType()->isConstantMatrixType());
2519 LV.setAddress(
Addr);
2524 llvm::MatrixBuilder MB(CGF.
Builder);
2525 Value = MB.CreateRowMajorToColumnMajorTransform(
2526 Value, MatrixTy->getNumRows(), MatrixTy->getNumColumns());
2543 llvm_unreachable(
"bad evaluation kind");
2609 EltTy = MatTy->getElementType();
2610 if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2611 llvm::MatrixBuilder MB(
Builder);
2612 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2615 llvm::LoadInst *Load =
2617 llvm::Value *Elt =
Builder.CreateExtractElement(Load, Idx,
"matrixext");
2626 unsigned NumLanes = NumCols;
2630 llvm::Constant *ColConstsIndices =
nullptr;
2631 llvm::MatrixBuilder MB(
Builder);
2635 NumLanes = llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2639 llvm::Type *RowTy = llvm::FixedVectorType::get(ElemTy, NumLanes);
2640 llvm::Value *
Result = llvm::PoisonValue::get(RowTy);
2642 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2643 llvm::Value *ColIdx;
2644 if (ColConstsIndices)
2645 ColIdx = ColConstsIndices->getAggregateElement(Col);
2647 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2649 llvm::Value *EltIndex =
2650 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2651 llvm::Value *Elt =
Builder.CreateExtractElement(MatrixVec, EltIndex);
2652 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2659 assert(LV.
isBitField() &&
"Unknown LValue type!");
2678 const unsigned StorageSize =
2681 assert(
static_cast<unsigned>(Offset + Info.
Size) <= StorageSize);
2682 unsigned HighBits = StorageSize - Offset - Info.
Size;
2684 Val =
Builder.CreateShl(Val, HighBits,
"bf.shl");
2685 if (Offset + HighBits)
2686 Val =
Builder.CreateAShr(Val, Offset + HighBits,
"bf.ashr");
2689 Val =
Builder.CreateLShr(Val, Offset,
"bf.lshr");
2690 if (
static_cast<unsigned>(Offset) + Info.
Size < StorageSize)
2692 Val, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
"bf.clear");
2708 llvm::Type *DstTy = llvm::FixedVectorType::get(Vec->getType(), 1);
2709 llvm::Value *
Zero = llvm::Constant::getNullValue(
CGM.Int64Ty);
2710 Vec =
Builder.CreateInsertElement(DstTy, Vec,
Zero,
"cast.splat");
2720 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
2722 llvm::Value *Element =
Builder.CreateExtractElement(Vec, Elt);
2725 if (Element->getType()->getPrimitiveSizeInBits() >
2726 LVTy->getPrimitiveSizeInBits()) {
2728 CGM.getCodeGenOpts().isConvertingBoolWithCmp0())
2729 Element =
Builder.CreateICmpNE(
2730 Element, llvm::Constant::getNullValue(Element->getType()));
2732 Element =
Builder.CreateTrunc(Element, LVTy);
2742 for (
unsigned i = 0; i != NumResultElts; ++i)
2745 Vec =
Builder.CreateShuffleVector(Vec, Mask);
2748 if (
CGM.getCodeGenOpts().isConvertingBoolWithCmp0())
2749 Vec =
Builder.CreateICmpNE(Vec,
2750 llvm::Constant::getNullValue(Vec->getType()));
2762 llvm::Type *VectorElementTy =
CGM.getTypes().ConvertType(EQT);
2770 Builder.CreateConstInBoundsGEP(CastToPointerElement, ix,
2773 return VectorBasePtrPlusIx;
2779 "Bad type for register variable");
2784 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(LV.
getType());
2785 llvm::Type *Ty = OrigTy;
2786 if (OrigTy->isPointerTy())
2787 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
2788 llvm::Type *Types[] = { Ty };
2790 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
2792 F, llvm::MetadataAsValue::get(Ty->getContext(), RegName));
2793 if (OrigTy->isPointerTy())
2811 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2813 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2815 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2816 "vector element type must be at least byte-sized");
2819 if (Val->getType()->getPrimitiveSizeInBits() <
2820 ElemTy->getScalarSizeInBits())
2821 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2824 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2826 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2834 llvm::Type *VecTy = Vec->getType();
2837 if (VecTy->isVectorTy() && SrcVal->getType()->getPrimitiveSizeInBits() <
2838 VecTy->getScalarSizeInBits())
2839 SrcVal =
Builder.CreateZExt(SrcVal, VecTy->getScalarType());
2841 auto *IRStoreTy = dyn_cast<llvm::IntegerType>(Vec->getType());
2843 auto *IRVecTy = llvm::FixedVectorType::get(
2844 Builder.getInt1Ty(), IRStoreTy->getPrimitiveSizeInBits());
2845 Vec =
Builder.CreateBitCast(Vec, IRVecTy);
2852 if (
auto *EltTy = dyn_cast<llvm::FixedVectorType>(SrcVal->getType());
2853 EltTy && EltTy->getNumElements() == 1)
2854 SrcVal =
Builder.CreateBitCast(SrcVal, EltTy->getElementType());
2860 Vec =
Builder.CreateBitCast(Vec, IRStoreTy);
2884 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2886 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2888 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2889 "matrix element type must be at least byte-sized");
2892 if (Val->getType()->getPrimitiveSizeInBits() <
2893 ElemTy->getScalarSizeInBits())
2894 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2897 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2899 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2905 if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2907 llvm::MatrixBuilder MB(
Builder);
2908 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2913 Builder.CreateInsertElement(Load, InsertVal, Idx,
"matins");
2924 "Store through matrix row LValues is only implemented for HLSL!");
2930 unsigned NumLanes = NumCols;
2934 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2938 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2939 "matrix element type must be at least byte-sized");
2942 if (RowVal->getType()->getScalarType()->getPrimitiveSizeInBits() <
2943 ElemTy->getScalarSizeInBits()) {
2945 llvm::Type *StorageElmTy = llvm::FixedVectorType::get(
2946 ElemTy->getScalarType(), RowValVecTy->getNumElements());
2947 RowVal =
Builder.CreateZExt(RowVal, StorageElmTy);
2950 llvm::MatrixBuilder MB(
Builder);
2952 llvm::Constant *ColConstsIndices =
nullptr;
2956 llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2961 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2962 llvm::Value *ColIdx;
2963 if (ColConstsIndices)
2964 ColIdx = ColConstsIndices->getAggregateElement(Col);
2966 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2968 llvm::Value *EltIndex =
2969 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2970 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2971 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2972 llvm::Value *NewElt =
Builder.CreateExtractElement(RowVal, Lane);
2974 Builder.CreateGEP(DstAddr, {
Zero, EltIndex}, DestAddrTy, ElemAlign);
2981 assert(Dst.
isBitField() &&
"Unknown LValue type");
2996 llvm_unreachable(
"present but none");
3031 CGM.getObjCRuntime().EmitObjCWeakAssign(*
this, src, LvalueDst);
3044 RHS =
Builder.CreatePtrToInt(RHS, ResultType,
"sub.ptr.rhs.cast");
3046 ResultType,
"sub.ptr.lhs.cast");
3047 llvm::Value *BytesBetween =
Builder.CreateSub(LHS, RHS,
"ivar.offset");
3048 CGM.getObjCRuntime().EmitObjCIvarAssign(*
this, src, dst, BytesBetween);
3050 CGM.getObjCRuntime().EmitObjCGlobalAssign(*
this, src, LvalueDst,
3054 CGM.getObjCRuntime().EmitObjCStrongCastAssign(*
this, src, LvalueDst);
3058 assert(Src.
isScalar() &&
"Can't emit an agg store with this method");
3072 SrcVal =
Builder.CreateIntCast(SrcVal, Ptr.getElementType(),
3074 llvm::Value *MaskedVal = SrcVal;
3076 const bool UseVolatile =
3079 const unsigned StorageSize =
3084 if (StorageSize != Info.
Size) {
3085 assert(StorageSize > Info.
Size &&
"Invalid bitfield size.");
3092 SrcVal, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
3096 SrcVal =
Builder.CreateShl(SrcVal, Offset,
"bf.shl");
3100 Val, ~llvm::APInt::getBitsSet(StorageSize, Offset, Offset + Info.
Size),
3104 SrcVal =
Builder.CreateOr(Val, SrcVal,
"bf.set");
3106 assert(Offset == 0);
3113 CGM.getCodeGenOpts().ForceAAPCSBitfieldLoad)
3114 Builder.CreateLoad(Ptr,
true,
"bf.load");
3123 llvm::Value *ResultVal = MaskedVal;
3127 assert(Info.
Size <= StorageSize);
3128 unsigned HighBits = StorageSize - Info.
Size;
3130 ResultVal =
Builder.CreateShl(ResultVal, HighBits,
"bf.result.shl");
3131 ResultVal =
Builder.CreateAShr(ResultVal, HighBits,
"bf.result.ashr");
3147 SrcVal->getType()->getScalarSizeInBits())
3156 if (!DestAddrTy->isVectorTy()) {
3158 "this should only occur for non-vector l-values");
3171 CGM.getDataLayout().getPrefTypeAlign(DestAddrTy->getScalarType()));
3172 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
3174 for (
unsigned I = 0; I != NumSrcElts; ++I) {
3175 llvm::Value *Val = VTy ?
Builder.CreateExtractElement(
3176 SrcVal, llvm::ConstantInt::get(
Int32Ty, I))
3183 DstElemAddr =
Builder.CreateGEP(
3184 DstAddr, {
Zero, llvm::ConstantInt::get(
Int32Ty, FieldNo)},
3185 DestAddrTy, ElemAlign);
3194 llvm::Type *VecTy = Vec->getType();
3197 unsigned NumSrcElts = VTy->getNumElements();
3199 if (NumDstElts == NumSrcElts) {
3204 for (
unsigned i = 0; i != NumSrcElts; ++i)
3207 Vec =
Builder.CreateShuffleVector(SrcVal, Mask);
3208 }
else if (NumDstElts > NumSrcElts) {
3214 for (
unsigned i = 0; i != NumSrcElts; ++i)
3215 ExtMask.push_back(i);
3216 ExtMask.resize(NumDstElts, -1);
3217 llvm::Value *ExtSrcVal =
Builder.CreateShuffleVector(SrcVal, ExtMask);
3220 for (
unsigned i = 0; i != NumDstElts; ++i)
3230 for (
unsigned i = 0; i != NumSrcElts; ++i)
3232 Vec =
Builder.CreateShuffleVector(Vec, ExtSrcVal, Mask);
3235 llvm_unreachable(
"unexpected shorten vector length");
3241 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
3243 Vec =
Builder.CreateInsertElement(Vec, SrcVal, Elt);
3253 "Bad type for register variable");
3256 assert(RegName &&
"Register LValue is not metadata");
3259 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(Dst.
getType());
3260 llvm::Type *Ty = OrigTy;
3261 if (OrigTy->isPointerTy())
3262 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
3263 llvm::Type *Types[] = { Ty };
3265 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::write_register, Types);
3267 if (OrigTy->isPointerTy())
3270 F, {llvm::MetadataAsValue::get(Ty->getContext(), RegName),
Value});
3278 bool IsMemberAccess=
false) {
3290 LV.setObjCIvar(
false);
3294 LV.setObjCIvar(
true);
3296 LV.setBaseIvarExp(Exp->getBase());
3301 if (
const auto *Exp = dyn_cast<DeclRefExpr>(E)) {
3302 if (
const auto *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
3303 if (VD->hasGlobalStorage()) {
3304 LV.setGlobalObjCRef(
true);
3312 if (
const auto *Exp = dyn_cast<UnaryOperator>(E)) {
3317 if (
const auto *Exp = dyn_cast<ParenExpr>(E)) {
3319 if (LV.isObjCIvar()) {
3326 LV.setObjCIvar(
false);
3331 if (
const auto *Exp = dyn_cast<GenericSelectionExpr>(E)) {
3336 if (
const auto *Exp = dyn_cast<ImplicitCastExpr>(E)) {
3341 if (
const auto *Exp = dyn_cast<CStyleCastExpr>(E)) {
3346 if (
const auto *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
3351 if (
const auto *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
3353 if (LV.isObjCIvar() && !LV.isObjCArray())
3356 LV.setObjCIvar(
false);
3357 else if (LV.isGlobalObjCRef() && !LV.isObjCArray())
3360 LV.setGlobalObjCRef(
false);
3364 if (
const auto *Exp = dyn_cast<MemberExpr>(E)) {
3378 CGF, VD,
Addr, Loc);
3383 Addr =
Addr.withElementType(RealVarTy);
3389 std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
3390 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
3395 if (!Res || *Res == OMPDeclareTargetDeclAttr::MT_Local ||
3396 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3397 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3400 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3401 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3402 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3404 "Expected link clause OR to clause with unified memory enabled.");
3414 llvm::LoadInst *Load =
3419 PTy, PointeeBaseInfo, PointeeTBAAInfo,
true);
3422 llvm::MDBuilder MDB(Ctx);
3424 if (
CGM.getTypes().getTargetAddressSpace(PTy) == 0 &&
3425 !
CGM.getCodeGenOpts().NullPointerIsValid)
3426 Load->setMetadata(llvm::LLVMContext::MD_nonnull,
3427 llvm::MDNode::get(Ctx, {}));
3433 llvm::LLVMContext::MD_align,
3434 llvm::MDNode::get(Ctx, MDB.createConstant(llvm::ConstantInt::get(
3435 Builder.getInt64Ty(), AlignVal))));
3440 true, PointeeBaseInfo,
3450 PointeeBaseInfo, PointeeTBAAInfo);
3460 BaseInfo, TBAAInfo);
3490 std::optional<LValue> LV =
3499 V = CGF.
Builder.CreateThreadLocalAddress(
V);
3507 VD->
hasAttr<OMPThreadPrivateDeclAttr>()) {
3522 if (FD->
hasAttr<WeakRefAttr>()) {
3537 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
V))
3538 V = llvm::NoCFIValue::get(GV);
3545 llvm::Value *ThisValue) {
3558 AsmLabelAttr *
Asm = VD->
getAttr<AsmLabelAttr>();
3559 assert(
Asm->getLabel().size() < 64-Name.size() &&
3560 "Register name too big");
3561 Name.append(
Asm->getLabel());
3562 llvm::NamedMDNode *M =
3563 CGM.
getModule().getOrInsertNamedMetadata(Name);
3564 if (M->getNumOperands() == 0) {
3567 llvm::Metadata *Ops[] = {Str};
3574 llvm::MetadataAsValue::get(CGM.
getLLVMContext(), M->getOperand(0));
3617 case llvm::GlobalValue::ExternalLinkage:
3618 case llvm::GlobalValue::LinkOnceODRLinkage:
3619 case llvm::GlobalValue::WeakODRLinkage:
3620 case llvm::GlobalValue::InternalLinkage:
3621 case llvm::GlobalValue::PrivateLinkage:
3634 "Expected OpenMP captured region");
3635 assert(
CGM.getLangOpts().OpenMP &&
"Expected OpenMP to be enabled");
3638 It != LocalDeclMap.end())
3646 QualType DREType = DD->getType().getNonReferenceType();
3657 llvm::Type *ExpectedTy =
CGM.getTypes().ConvertTypeForMem(DDType);
3665 auto It = LocalDeclMap.find(DD);
3666 bool WasMapped = It != LocalDeclMap.end();
3669 if (DD->getType()->isReferenceType()) {
3675 It->second = MapAddr;
3677 LocalDeclMap.insert({DD, MapAddr});
3678 llvm::scope_exit Guard([&] {
3680 auto RestoreIt = LocalDeclMap.find(DD);
3681 assert(RestoreIt != LocalDeclMap.end() &&
"DD should still be in map");
3682 RestoreIt->second = SavedAddr;
3684 LocalDeclMap.erase(DD);
3696 "should not emit an unevaluated operand");
3698 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3701 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
3709 (VD->getType()->isReferenceType() ||
3711 VD->getAnyInitializer(VD);
3713 E->
getLocation(), *VD->evaluateValue(), VD->getType());
3714 assert(Val &&
"failed to emit constant expression");
3717 if (!VD->getType()->isReferenceType()) {
3719 Addr =
CGM.createUnnamedGlobalFrom(*VD, Val,
3722 auto *PTy = llvm::PointerType::get(
3741 VD = VD->getCanonicalDecl();
3745 auto I = LocalDeclMap.find(VD);
3746 if (I != LocalDeclMap.end()) {
3748 if (VD->getType()->isReferenceType())
3756 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3773 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3789 "Should not use decl without marking it used!");
3791 if (ND->
hasAttr<WeakRefAttr>()) {
3797 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3799 if (VD->hasLinkage() || VD->isStaticDataMember())
3805 auto iter = LocalDeclMap.find(VD);
3806 if (iter != LocalDeclMap.end()) {
3807 addr = iter->second;
3811 }
else if (VD->isStaticLocal()) {
3812 llvm::Constant *var =
CGM.getOrCreateStaticVarDecl(
3813 *VD,
CGM.getLLVMLinkageVarDefinition(VD));
3819 llvm_unreachable(
"DeclRefExpr for Decl not entered in LocalDeclMap?");
3830 VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
3837 bool isBlockByref = VD->isEscapingByref();
3843 LValue LV = VD->getType()->isReferenceType() ?
3847 bool isLocalStorage = VD->hasLocalStorage();
3849 bool NonGCable = isLocalStorage &&
3850 !VD->getType()->isReferenceType() &&
3857 bool isImpreciseLifetime =
3858 (isLocalStorage && !VD->hasAttr<ObjCPreciseLifetimeAttr>());
3859 if (isImpreciseLifetime)
3865 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
3871 if (
const auto *BD = dyn_cast<BindingDecl>(ND)) {
3873 auto ApplyNontemporal = [&](
LValue LV) {
3875 CGM.getOpenMPRuntime().isNontemporalDecl(BD))
3876 LV.setNontemporal(
true);
3881 auto It = LocalDeclMap.find(BD->getCanonicalDecl());
3882 if (It != LocalDeclMap.end()) {
3883 return ApplyNontemporal(
3890 CGM.getLangOpts().OpenMP) {
3891 auto NameIt = OMPPrivatizedBindings.find(
3893 if (NameIt != OMPPrivatizedBindings.end()) {
3915 if (
const auto *GD = dyn_cast<MSGuidDecl>(ND))
3919 if (
const auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
3923 if (AS !=
T.getAddressSpace()) {
3926 llvm::PointerType::get(
CGM.getLLVMContext(), TargetAS);
3927 llvm::Constant *ASC =
CGM.performAddrSpaceCast(ATPO.
getPointer(), PtrTy);
3934 llvm_unreachable(
"Unhandled DeclRefExpr");
3944 default: llvm_unreachable(
"Unknown unary operator lvalue!");
3947 assert(!
T.isNull() &&
"CodeGenFunction::EmitUnaryOpLValue: Illegal type");
3969 assert(LV.
isSimple() &&
"real/imag on non-ordinary l-value");
3986 CGM.getTBAAInfoForSubobject(LV,
T));
3993 bool isInc = E->
getOpcode() == UO_PreInc;
4016 assert(SL !=
nullptr &&
"No StringLiteral name in PredefinedExpr");
4017 StringRef FnName =
CurFn->getName();
4018 FnName.consume_front(
"\01");
4019 StringRef NameItems[] = {
4021 std::string GVName = llvm::join(NameItems, NameItems + 2,
".");
4022 if (
auto *BD = dyn_cast_or_null<BlockDecl>(
CurCodeDecl)) {
4023 std::string Name = std::string(SL->getString());
4024 if (!Name.empty()) {
4025 unsigned Discriminator =
4026 CGM.getCXXABI().getMangleContext().getBlockId(BD,
true);
4028 Name +=
"_" + Twine(Discriminator + 1).str();
4029 auto C =
CGM.GetAddrOfConstantCString(Name, GVName);
4032 auto C =
CGM.GetAddrOfConstantCString(std::string(FnName), GVName);
4036 auto C =
CGM.GetAddrOfConstantStringFromLiteral(SL, GVName);
4053 if (llvm::Constant *
C =
CGM.getTypeDescriptorFromMap(
T))
4058 bool IsBitInt =
false;
4060 if (
T->isIntegerType()) {
4063 (
T->isSignedIntegerType() ? 1 : 0);
4067 if (
T->isSignedIntegerType() &&
T->getAs<
BitIntType>()) {
4070 " non positive amount of bits in __BitInt type");
4072 " too many bits in __BitInt type");
4079 }
else if (
T->isFloatingType()) {
4088 (
intptr_t)
T.getAsOpaquePtr(), StringRef(),
4089 StringRef(), {}, Buffer, {});
4094 char S[6] = {
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'};
4097 llvm::support::endian::write32(S + 1, Bits,
4099 ? llvm::endianness::big
4100 : llvm::endianness::little);
4101 StringRef Str = StringRef(S,
sizeof(S) /
sizeof(
decltype(S[0])));
4105 llvm::Constant *Components[] = {
4109 llvm::Constant *Descriptor = llvm::ConstantStruct::getAnon(Components);
4111 auto *GV =
new llvm::GlobalVariable(
4112 CGM.getModule(), Descriptor->getType(),
4113 true, llvm::GlobalVariable::PrivateLinkage, Descriptor);
4114 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4115 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(GV);
4118 CGM.setTypeDescriptorInMap(
T, GV);
4126 if (
V->getType() == TargetTy)
4131 if (
V->getType()->isFloatingPointTy()) {
4132 unsigned Bits =
V->getType()->getPrimitiveSizeInBits().getFixedValue();
4133 if (Bits <= TargetTy->getIntegerBitWidth())
4139 if (
V->getType()->isIntegerTy() &&
4140 V->getType()->getIntegerBitWidth() <= TargetTy->getIntegerBitWidth())
4141 return Builder.CreateZExt(
V, TargetTy);
4144 if (!
V->getType()->isPointerTy()) {
4147 V = Ptr.getPointer();
4149 return Builder.CreatePtrToInt(
V, TargetTy);
4162 llvm::Constant *Filename;
4169 int PathComponentsToStrip =
4170 CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;
4171 if (PathComponentsToStrip < 0) {
4172 assert(PathComponentsToStrip !=
INT_MIN);
4173 int PathComponentsToKeep = -PathComponentsToStrip;
4174 auto I = llvm::sys::path::rbegin(FilenameString);
4175 auto E = llvm::sys::path::rend(FilenameString);
4176 while (I != E && --PathComponentsToKeep)
4179 FilenameString = FilenameString.substr(I - E);
4180 }
else if (PathComponentsToStrip > 0) {
4181 auto I = llvm::sys::path::begin(FilenameString);
4182 auto E = llvm::sys::path::end(FilenameString);
4183 while (I != E && PathComponentsToStrip--)
4188 FilenameString.substr(I - llvm::sys::path::begin(FilenameString));
4190 FilenameString = llvm::sys::path::filename(FilenameString);
4194 CGM.GetAddrOfConstantCString(std::string(FilenameString),
".src");
4195 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(
4197 FilenameGV.getPointer()->stripPointerCasts()));
4198 Filename = FilenameGV.getPointer();
4202 Filename = llvm::Constant::getNullValue(
Int8PtrTy);
4209 return llvm::ConstantStruct::getAnon(
Data);
4214enum class CheckRecoverableKind {
4225static CheckRecoverableKind
4227 if (Ordinal == SanitizerKind::SO_Vptr)
4228 return CheckRecoverableKind::AlwaysRecoverable;
4229 else if (Ordinal == SanitizerKind::SO_Return ||
4230 Ordinal == SanitizerKind::SO_Unreachable)
4231 return CheckRecoverableKind::Unrecoverable;
4233 return CheckRecoverableKind::Recoverable;
4237struct SanitizerHandlerInfo {
4238 char const *
const Name;
4244#define SANITIZER_CHECK(Enum, Name, Version, Msg) {#Name, Version},
4246#undef SANITIZER_CHECK
4250 llvm::FunctionType *FnType,
4253 CheckRecoverableKind RecoverKind,
bool IsFatal,
4254 llvm::BasicBlock *ContBB,
bool NoMerge) {
4255 assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
4256 std::optional<ApplyDebugLocation> DL;
4257 if (!CGF.
Builder.getCurrentDebugLocation()) {
4261 bool NeedsAbortSuffix =
4262 IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
4264 bool HandlerPreserveAllRegs =
4267 const StringRef CheckName = CheckInfo.Name;
4268 std::string FnName =
"__ubsan_handle_" + CheckName.str();
4269 if (CheckInfo.Version && !MinimalRuntime)
4270 FnName +=
"_v" + llvm::utostr(CheckInfo.Version);
4272 FnName +=
"_minimal";
4273 if (NeedsAbortSuffix)
4275 if (HandlerPreserveAllRegs && !NeedsAbortSuffix)
4276 FnName +=
"_preserve";
4278 !IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
4282 B.addAttribute(llvm::Attribute::NoReturn)
4283 .addAttribute(llvm::Attribute::NoUnwind);
4285 B.addUWTableAttr(llvm::UWTableKind::Default);
4290 llvm::AttributeList::FunctionIndex, B),
4296 HandlerCall->addFnAttr(llvm::Attribute::NoMerge);
4297 if (HandlerPreserveAllRegs && !NeedsAbortSuffix) {
4299 HandlerCall->setCallingConv(llvm::CallingConv::PreserveAll);
4302 HandlerCall->setDoesNotReturn();
4303 CGF.
Builder.CreateUnreachable();
4310 ArrayRef<std::pair<llvm::Value *, SanitizerKind::SanitizerOrdinal>> Checked,
4314 assert(Checked.size() > 0);
4315 assert(CheckHandler >= 0 &&
4319 llvm::Value *FatalCond =
nullptr;
4320 llvm::Value *RecoverableCond =
nullptr;
4321 llvm::Value *TrapCond =
nullptr;
4322 bool NoMerge =
false;
4329 for (
auto &[Check, Ord] : Checked) {
4330 llvm::Value *GuardedCheck = Check;
4332 (
CGM.getCodeGenOpts().SanitizeSkipHotCutoffs[Ord] > 0)) {
4334 CGM.getIntrinsic(llvm::Intrinsic::allow_ubsan_check),
4335 llvm::ConstantInt::get(
CGM.Int8Ty, Ord));
4340 llvm::Value *&Cond =
CGM.getCodeGenOpts().SanitizeTrap.has(Ord) ? TrapCond
4341 :
CGM.getCodeGenOpts().SanitizeRecover.has(Ord)
4344 Cond = Cond ?
Builder.CreateAnd(Cond, GuardedCheck) : GuardedCheck;
4346 if (!
CGM.getCodeGenOpts().SanitizeMergeHandlers.has(Ord))
4352 if (!FatalCond && !RecoverableCond)
4355 llvm::Value *JointCond;
4356 if (FatalCond && RecoverableCond)
4357 JointCond =
Builder.CreateAnd(FatalCond, RecoverableCond);
4359 JointCond = FatalCond ? FatalCond : RecoverableCond;
4363 assert(
SanOpts.has(Checked[0].second));
4365 for (
int i = 1, n = Checked.size(); i < n; ++i) {
4367 "All recoverable kinds in a single check must be same!");
4368 assert(
SanOpts.has(Checked[i].second));
4374 llvm::Instruction *Branch =
Builder.CreateCondBr(JointCond, Cont, Handlers);
4377 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4378 Branch->setMetadata(llvm::LLVMContext::MD_prof, Node);
4382 if (
CGM.getCodeGenOpts().SanitizeMinimalRuntime) {
4393 Args.reserve(DynamicArgs.size() + 1);
4394 ArgTypes.reserve(DynamicArgs.size() + 1);
4397 if (!StaticArgs.empty()) {
4398 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4399 auto *InfoPtr =
new llvm::GlobalVariable(
4400 CGM.getModule(), Info->getType(),
4403 false, llvm::GlobalVariable::PrivateLinkage, Info,
"",
4404 nullptr, llvm::GlobalVariable::NotThreadLocal,
4405 CGM.getDataLayout().getDefaultGlobalsAddressSpace());
4406 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4407 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4408 Args.push_back(
Builder.CreateAddrSpaceCast(InfoPtr,
CGM.VoidPtrTy));
4409 ArgTypes.push_back(
CGM.VoidPtrTy);
4412 for (llvm::Value *DynamicArg : DynamicArgs) {
4417 llvm::FunctionType *FnType =
4418 llvm::FunctionType::get(
CGM.VoidTy, ArgTypes,
false);
4420 if (!FatalCond || !RecoverableCond) {
4424 (FatalCond !=
nullptr), Cont, NoMerge);
4428 llvm::BasicBlock *NonFatalHandlerBB =
4431 Builder.CreateCondBr(FatalCond, NonFatalHandlerBB, FatalHandlerBB);
4434 NonFatalHandlerBB, NoMerge);
4445 llvm::ConstantInt *TypeId, llvm::Value *Ptr,
4450 llvm::CondBrInst *BI =
Builder.CreateCondBr(Cond, Cont, CheckBB);
4453 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4454 BI->setMetadata(llvm::LLVMContext::MD_prof, Node);
4458 bool WithDiag = !
CGM.getCodeGenOpts().SanitizeTrap.has(Ordinal);
4460 llvm::CallInst *CheckCall;
4461 llvm::FunctionCallee SlowPathFn;
4463 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4465 new llvm::GlobalVariable(
CGM.getModule(), Info->getType(),
false,
4466 llvm::GlobalVariable::PrivateLinkage, Info);
4467 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4468 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4470 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4471 "__cfi_slowpath_diag",
4474 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr, InfoPtr});
4476 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4479 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr});
4484 CheckCall->setDoesNotThrow();
4492 llvm::Module *M = &
CGM.getModule();
4494 QualType QInt64Ty =
C.getIntTypeForBitwidth(64,
false);
4496 auto *ArgCallsiteTypeId =
4500 auto *ArgCFICheckFailData =
4504 CGM.getTypes().arrangeBuiltinFunctionDeclaration(
C.VoidTy,
FnArgs);
4506 llvm::Function *F = llvm::Function::Create(
4508 llvm::GlobalValue::WeakAnyLinkage,
"__cfi_check", M);
4510 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4511 F->setAlignment(llvm::Align(4096));
4514 llvm::LLVMContext &Ctx = M->getContext();
4515 llvm::BasicBlock *BB = llvm::BasicBlock::Create(Ctx,
"entry", F);
4518 llvm::CallInst::Create(M->getFunction(
"__cfi_check_fail"), Args,
"", BB);
4519 llvm::ReturnInst::Create(Ctx,
nullptr, BB);
4530 auto CheckHandler = SanitizerHandler::CFICheckFail;
4537 {SanitizerKind::SO_CFIVCall, SanitizerKind::SO_CFINVCall,
4538 SanitizerKind::SO_CFIDerivedCast, SanitizerKind::SO_CFIUnrelatedCast,
4539 SanitizerKind::SO_CFIICall},
4550 llvm::Function *F = llvm::Function::Create(
4552 llvm::GlobalValue::WeakODRLinkage,
"__cfi_check_fail", &
CGM.getModule());
4555 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4556 F->setVisibility(llvm::GlobalValue::HiddenVisibility);
4570 CGM.getContext().VoidPtrTy, ArgData->getLocation());
4573 CGM.getContext().VoidPtrTy, ArgAddr->getLocation());
4576 llvm::Value *DataIsNotNullPtr =
4581 EmitTrapCheck(DataIsNotNullPtr, SanitizerHandler::CFICheckFail,
4584 llvm::StructType *SourceLocationTy =
4586 llvm::StructType *CfiCheckFailDataTy =
4589 llvm::Value *
V =
Builder.CreateConstGEP2_32(
4593 llvm::Value *CheckKind =
Builder.CreateLoad(CheckKindAddr);
4595 llvm::Value *AllVtables = llvm::MetadataAsValue::get(
4596 CGM.getLLVMContext(),
4597 llvm::MDString::get(
CGM.getLLVMContext(),
"all-vtables"));
4598 llvm::Value *ValidVtable =
Builder.CreateZExt(
4599 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::type_test),
4600 {Addr, AllVtables}),
4603 const std::pair<int, SanitizerKind::SanitizerOrdinal> CheckKinds[] = {
4610 for (
auto CheckKindOrdinalPair : CheckKinds) {
4611 int Kind = CheckKindOrdinalPair.first;
4618 Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(
Int8Ty, Kind));
4619 if (
CGM.getLangOpts().Sanitize.has(Ordinal))
4620 EmitCheck(std::make_pair(Cond, Ordinal), SanitizerHandler::CFICheckFail,
4633 CGM.addUsedGlobal(F);
4637 if (
SanOpts.has(SanitizerKind::Unreachable)) {
4638 auto CheckOrdinal = SanitizerKind::SO_Unreachable;
4639 auto CheckHandler = SanitizerHandler::BuiltinUnreachable;
4655 if ((
int)TrapBBs.size() <= CheckHandlerID)
4656 TrapBBs.resize(CheckHandlerID + 1);
4658 llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
4660 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
4661 llvm::StringRef TrapMessage;
4662 llvm::StringRef TrapCategory;
4663 auto DebugTrapReasonKind =
CGM.getCodeGenOpts().getSanitizeDebugTrapReasons();
4665 DebugTrapReasonKind ==
4671 TrapCategory =
"Undefined Behavior Sanitizer";
4675 DebugTrapReasonKind !=
4679 TrapLocation, TrapCategory, TrapMessage);
4682 NoMerge = NoMerge || !
CGM.getCodeGenOpts().isOptimizedBuild() ||
4686 if (TrapBB && !NoMerge) {
4687 auto Call = TrapBB->begin();
4690 Call->applyMergedLocation(
Call->getDebugLoc(), TrapLocation);
4692 Builder.CreateCondBr(Checked, Cont, TrapBB,
4693 MDHelper.createLikelyBranchWeights());
4696 Builder.CreateCondBr(Checked, Cont, TrapBB,
4697 MDHelper.createLikelyBranchWeights());
4702 llvm::CallInst *TrapCall;
4703 if (
CGM.getCodeGenOpts().SanitizeTrapLoop)
4705 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::looptrap));
4707 TrapCall =
Builder.CreateCall(
4708 CGM.getIntrinsic(llvm::Intrinsic::ubsantrap),
4709 llvm::ConstantInt::get(
CGM.Int8Ty, CheckHandlerID));
4711 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4712 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4713 CGM.getCodeGenOpts().TrapFuncName);
4714 TrapCall->addFnAttr(A);
4717 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4718 TrapCall->setDoesNotReturn();
4719 TrapCall->setDoesNotThrow();
4728 llvm::Function *TrapIntrinsic =
CGM.getIntrinsic(IntrID);
4729 llvm::CallInst *TrapCall =
Builder.CreateCall(TrapIntrinsic);
4731 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4732 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4733 CGM.getCodeGenOpts().TrapFuncName);
4734 TrapCall->addFnAttr(A);
4738 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4739 if (TrapIntrinsic->doesNotThrow())
4740 TrapCall->setDoesNotThrow();
4741 if (TrapIntrinsic->doesNotReturn()) {
4742 TrapCall->setDoesNotReturn();
4747 Builder.ClearInsertionPoint();
4753 llvm::CallInst *TrapCall =
4755 TrapCall->setDoesNotReturn();
4756 TrapCall->setDoesNotThrow();
4759 Builder.ClearInsertionPoint();
4767 "Array to pointer decay must have array source type!");
4776 Addr =
Addr.withElementType(NewTy);
4782 "Expected pointer to array");
4788 Builder.CreateStructuredGEP(NewTy,
Addr.emitRawPointer(*
this), {});
4802 if (TBAAInfo) *TBAAInfo =
CGM.getTBAAAccessInfo(EltType);
4811 const auto *CE = dyn_cast<CastExpr>(E);
4812 if (!CE || CE->getCastKind() != CK_ArrayToPointerDecay)
4824 llvm::Type *elemType,
4830 const llvm::Twine &name =
"arrayidx") {
4831 if (inbounds && CGF.
getLangOpts().EmitLogicalPointer)
4832 return CGF.
Builder.CreateStructuredGEP(elemType, ptr, indices);
4846 llvm::Type *elementType,
bool inbounds,
4849 const llvm::Twine &name =
"arrayidx") {
4850 if (inbounds && CGF.
getLangOpts().EmitLogicalPointer)
4853 indices.drop_front()),
4854 elementType, align);
4866 return D && D->
hasAttr<BPFPreserveStaticOffsetAttr>();
4873 if (PointeeType.
isNull())
4886 llvm::Function *Fn =
4888 llvm::CallInst *
Call = CGF.
Builder.CreateCall(Fn, {
Addr.emitRawPointer(CGF)});
4906 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4907 return ME->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>();
4909 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
4910 const auto *VarDef = dyn_cast<VarDecl>(DRE->getDecl());
4914 const auto *PtrT = VarDef->getType()->getAs<
PointerType>();
4920 if (
const auto *RecT = dyn_cast<RecordType>(PointeeT))
4921 return RecT->getDecl()
4922 ->getMostRecentDecl()
4923 ->
hasAttr<BPFPreserveAccessIndexAttr>();
4936 const llvm::Twine &name =
"arrayidx") {
4939 for (
auto *idx : indices.drop_back())
4958 llvm::Value *eltPtr;
4959 auto LastIndex = dyn_cast<llvm::ConstantInt>(indices.back());
4966 signedIndices, loc, eltAlign, name);
4970 unsigned idx = LastIndex->getZExtValue();
4971 llvm::DIType *DbgInfo =
nullptr;
4974 eltPtr = CGF.
Builder.CreatePreserveArrayAccessIndex(
4986struct StructFieldAccess
4987 :
public ConstStmtVisitor<StructFieldAccess, const Expr *> {
4988 const Expr *VisitCastExpr(
const CastExpr *E) {
4993 const Expr *VisitParenExpr(
const ParenExpr *E) {
5013 if (FD1OuterRec != FD2OuterRec)
5015 return std::optional<int64_t>();
5017 int64_t FD1Offset = 0;
5019 return std::optional<int64_t>();
5021 int64_t FD2Offset = 0;
5023 return std::optional<int64_t>();
5025 return std::make_optional<int64_t>(FD1Offset - FD2Offset);
5034 llvm::Value *BoundsVal,
5037 assert(BoundsVal->getType()->isIntegerTy());
5038 assert(!PointeeTy.
isNull() &&
"pointee type is never null");
5040 "Sema guarantees a '__sized_by' pointee is a non-function type");
5045 assert(PointeeTy->
isVoidType() &&
"expected a 'void' incomplete pointee");
5054 unsigned CountWidth = BoundsVal->getType()->getIntegerBitWidth();
5058 CountSigned ? llvm::isIntN(CountWidth, ElemSizeQ)
5059 : llvm::isUIntN(CountWidth,
static_cast<uint64_t
>(ElemSizeQ));
5064 return llvm::ConstantInt::get(BoundsVal->getType(), 0);
5066 llvm::Value *ElemSizeV =
5067 llvm::ConstantInt::get(BoundsVal->getType(), ElemSizeQ);
5072 return CountSigned ? CGF.
Builder.CreateSDiv(BoundsVal, ElemSizeV)
5073 : CGF.
Builder.CreateUDiv(BoundsVal, ElemSizeV);
5085 QualType IndexType, llvm::Value *IndexVal,
bool Accessed,
5086 bool FlexibleArray) {
5087 const auto *ME = dyn_cast<MemberExpr>(ArrayExpr->
IgnoreImpCasts());
5088 if (!ME || !ME->getMemberDecl()->getType()->isCountAttributedType())
5093 if (FlexibleArray &&
5094 !ME->isFlexibleArrayMemberLike(
getContext(), StrictFlexArraysLevel))
5102 if (std::optional<int64_t> Diff =
5121 llvm::Value *BoundsVal =
5123 Builder.getInt32(*Diff),
".counted_by.gep");
5125 ".counted_by.load");
5128 assert(CountAttributedTy &&
"expected FD to have a CountAttributedType");
5133 if (CountAttributedTy->isOrNull()) {
5136 llvm::Value *Ptr =
Builder.CreateLoad(ArrayInst);
5138 BoundsVal =
Builder.CreateSelect(
5139 IsNull, llvm::ConstantInt::get(BoundsType, 0), BoundsVal);
5146 if (CountAttributedTy->isCountInBytes())
5153 CountFD->
getType(), Accessed);
5161 llvm::Value *IdxPre =
5163 bool SignedIndices =
false;
5164 auto EmitIdxAfterBase = [&, IdxPre](
bool Promote) -> llvm::Value * {
5167 assert(E->
getRHS() == E->
getIdx() &&
"index was neither LHS nor RHS");
5173 SignedIndices |= IdxSigned;
5175 if (
SanOpts.has(SanitizerKind::ArrayBounds))
5179 if (Promote && Idx->getType() !=
IntPtrTy)
5192 auto *Idx = EmitIdxAfterBase(
false);
5193 assert(LHS.
isSimple() &&
"Can only subscript lvalue vectors here!");
5201 std::optional<LValue> LV;
5204 LV =
CGM.getHLSLRuntime().emitResourceArraySubscriptExpr(E, *
this);
5206 LV =
CGM.getHLSLRuntime().emitBufferArraySubscriptExpr(E, *
this,
5218 auto *Idx = EmitIdxAfterBase(
true);
5225 CGM.getTBAAInfoForSubobject(LV, EltType));
5237 auto *Idx = EmitIdxAfterBase(
true);
5247 Idx =
Builder.CreateMul(Idx, numElements);
5249 Idx =
Builder.CreateNSWMul(Idx, numElements);
5261 auto *Idx = EmitIdxAfterBase(
true);
5264 llvm::Value *InterfaceSizeVal =
5265 llvm::ConstantInt::get(Idx->getType(), InterfaceSize.
getQuantity());
5267 llvm::Value *ScaledIdx =
Builder.CreateMul(Idx, InterfaceSizeVal);
5273 llvm::Type *OrigBaseElemTy =
Addr.getElementType();
5278 llvm::Value *EltPtr =
5280 ScaledIdx,
false, SignedIndices, E->
getExprLoc());
5287 assert(Array->getType()->isArrayType() &&
5288 "Array to pointer decay must have array source type!");
5292 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5296 auto *Idx = EmitIdxAfterBase(
true);
5298 if (
SanOpts.has(SanitizerKind::ArrayBounds))
5306 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5310 if (!
CGM.getCodeGenOpts().NewStructPathTBAA) {
5313 EltTBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, E->
getType());
5318 EltTBAAInfo =
CGM.getTBAAAccessInfo(E->
getType());
5339 const CastExpr *CountedByLoad =
nullptr;
5341 if (
SanOpts.has(SanitizerKind::ArrayBounds)) {
5342 StructFieldAccess Visitor;
5343 if (
const auto *CE =
5344 dyn_cast_if_present<CastExpr>(Visitor.Visit(E->
getBase()));
5345 CE && CE->getCastKind() == CK_LValueToRValue) {
5346 const auto *ME = dyn_cast<MemberExpr>(CE->
getSubExpr());
5347 if (ME && ME->getMemberDecl()->getType()->isCountAttributedType()) {
5365 CountedByME ? &FieldCapture :
nullptr);
5374 auto *Idx = EmitIdxAfterBase(
true);
5386 if (CountedByME && (CountedByFieldAddr.
isValid() ||
5419 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
Base, *
this);
5429 "incomplete matrix subscript expressions should be rejected during Sema");
5435 llvm::MatrixBuilder MB(
Builder);
5438 unsigned NumRows = MatrixTy->getNumRows();
5439 bool IsMatrixRowMajor =
5441 llvm::Value *FinalIdx =
5442 MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
5453 bool IsLowerBound) {
5455 if (
auto *ASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParenImpCasts())) {
5459 BaseInfo = BaseLVal.getBaseInfo();
5464 Addr =
Addr.withElementType(NewTy);
5470 "Expected pointer to array");
5480 BaseInfo.mergeForCast(TypeBaseInfo);
5489 bool IsLowerBound) {
5492 "OpenACC Array section codegen not implemented");
5496 if (
auto *AT =
getContext().getAsArrayType(BaseTy))
5497 ResultExprTy = AT->getElementType();
5500 llvm::Value *Idx =
nullptr;
5508 LowerBound->getType()->hasSignedIntegerRepresentation());
5510 Idx = llvm::ConstantInt::getNullValue(
IntPtrTy);
5515 auto &
C =
CGM.getContext();
5517 llvm::APSInt ConstLength;
5520 if (std::optional<llvm::APSInt>
CL = Length->getIntegerConstantExpr(
C)) {
5527 if (std::optional<llvm::APSInt> LB =
5528 LowerBound->getIntegerConstantExpr(
C)) {
5530 LowerBound =
nullptr;
5535 else if (!LowerBound)
5538 if (Length || LowerBound) {
5539 auto *LowerBoundVal =
5543 LowerBound->getType()->hasSignedIntegerRepresentation())
5544 : llvm::ConstantInt::get(
IntPtrTy, ConstLowerBound);
5549 Length->getType()->hasSignedIntegerRepresentation())
5550 : llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5551 Idx =
Builder.CreateAdd(LowerBoundVal, LengthVal,
"lb_add_len",
5554 if (Length && LowerBound) {
5556 Idx, llvm::ConstantInt::get(
IntPtrTy, 1),
"idx_sub_1",
5560 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength + ConstLowerBound);
5566 if (
auto *VAT =
C.getAsVariableArrayType(ArrayTy)) {
5567 Length = VAT->getSizeExpr();
5568 if (std::optional<llvm::APSInt> L = Length->getIntegerConstantExpr(
C)) {
5573 auto *CAT =
C.getAsConstantArrayType(ArrayTy);
5574 assert(CAT &&
"unexpected type for array initializer");
5575 ConstLength = CAT->getSize();
5578 auto *LengthVal =
Builder.CreateIntCast(
5580 Length->getType()->hasSignedIntegerRepresentation());
5582 LengthVal, llvm::ConstantInt::get(
IntPtrTy, 1),
"len_sub_1",
5587 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5596 if (
auto *VLA =
getContext().getAsVariableArrayType(ResultExprTy)) {
5602 BaseTy, VLA->getElementType(), IsLowerBound);
5611 Idx =
Builder.CreateMul(Idx, NumElements);
5613 Idx =
Builder.CreateNSWMul(Idx, NumElements);
5622 assert(Array->getType()->isArrayType() &&
5623 "Array to pointer decay must have array source type!");
5627 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5634 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5635 ResultExprTy, !
getLangOpts().PointerOverflowDefined,
5638 TBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, ResultExprTy);
5642 ResultExprTy, IsLowerBound);
5665 Base.getQuals().removeObjCGCAttr();
5674 "Result must be a vector");
5682 if (LTy->getScalarSizeInBits() > Vec->getType()->getScalarSizeInBits())
5683 Vec =
Builder.CreateZExt(Vec, LTy);
5684 Builder.CreateStore(Vec, VecMem);
5695 if (
Base.isSimple()) {
5696 llvm::Constant *CV =
5702 if (
Base.isMatrixRow()) {
5704 llvm::dyn_cast<llvm::ConstantInt>(
Base.getMatrixRowIdx())) {
5708 unsigned NumCols = Indices.size();
5710 unsigned Row = RowIdx->getZExtValue();
5714 QualType ElemQT = EVT->getElementType();
5717 for (
unsigned C = 0;
C < NumCols; ++
C) {
5718 unsigned Col = Indices[
C];
5719 unsigned Linear = Col * NumRows + Row;
5720 MatIndices.push_back(llvm::ConstantInt::get(
Int32Ty, Linear));
5723 llvm::Constant *ConstIdxs = llvm::ConstantVector::get(MatIndices);
5727 llvm::Constant *Cols =
5734 Base.getMatrixAddress(),
Base.getMatrixRowIdx(), Cols,
Base.getType(),
5738 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
5740 llvm::Constant *BaseElts =
Base.getExtVectorElts();
5743 for (
unsigned Index : Indices)
5744 CElts.push_back(BaseElts->getAggregateElement(Index));
5745 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
5752 while (
auto *BaseMemberExpr = dyn_cast<MemberExpr>(UnderlyingBaseExpr))
5753 UnderlyingBaseExpr = BaseMemberExpr->getBase()->
IgnoreParens();
5766 return CGM.getHLSLRuntime().emitBufferMemberExpr(*
this, E);
5769 std::optional<LValue> LV;
5770 LV =
CGM.getHLSLRuntime().emitResourceMemberExpr(*
this, E);
5780 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
5792 SkippedChecks.
set(SanitizerKind::Alignment,
true);
5794 SkippedChecks.
set(SanitizerKind::Null,
true);
5802 if (
auto *Field = dyn_cast<FieldDecl>(ND)) {
5810 CGM.getOpenMPRuntime().isNontemporalDecl(Field)) ||
5817 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
5820 llvm_unreachable(
"Unhandled member declaration!");
5827 llvm::Value *ThisValue) {
5828 bool HasExplicitObjectParameter =
false;
5829 const auto *MD = dyn_cast_if_present<CXXMethodDecl>(
CurCodeDecl);
5831 HasExplicitObjectParameter = MD->isExplicitObjectMemberFunction();
5832 assert(MD->getParent()->isLambda());
5833 assert(MD->getParent() == Field->getParent());
5836 if (HasExplicitObjectParameter) {
5838 auto It = LocalDeclMap.find(D);
5839 assert(It != LocalDeclMap.end() &&
"explicit parameter not loaded?");
5840 Address AddrOfExplicitObject = It->getSecond();
5851 if (ThisTy != LambdaTy) {
5854 LambdaLV.
getAddress(), ThisTy, BasePathArray.begin(),
5878 if (Offset.isZero())
5900 llvm::Type *StructType =
5906 {CGF.Builder.getSize(idx)}),
5921 const FieldDecl *field,
bool IsInBounds) {
5933 auto [DbgInfo, DIIndex] =
5948 if (RD->isDynamicClass())
5951 for (
const auto &
Base : RD->bases())
5971 CGM.getCodeGenOpts().AAPCSBitfieldWidth &&
5993 getContext().getCanonicalTagType(rec), field);
6001 llvm::Type *FieldIntTy = llvm::Type::getIntNTy(
getLLVMContext(), SS);
6002 Addr =
Addr.withElementType(FieldIntTy);
6037 assert(!FieldTBAAInfo.
Offset &&
6038 "Nonzero offset for an access with no base type!");
6051 FieldTBAAInfo.
Size =
6062 if (
CGM.getCodeGenOpts().StrictVTablePointers &&
6066 addr =
Builder.CreateLaunderInvariantGroup(addr);
6071 auto [DbgInfo, DIIndex] =
6107 if (field->
hasAttr<AnnotateAttr>())
6123 QualType FieldType = Field->getType();
6129 *
this,
Base.getAddress(), Field,
6134 V =
V.withElementType(llvmType);
6143 CGM.getTBAAInfoForSubobject(
Base, FieldType));
6184 assert(E->
isTransparent() &&
"non-transparent glvalue init list");
6192 const Expr *Operand) {
6193 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Operand->IgnoreParens())) {
6195 return std::nullopt;
6204std::optional<LValue> HandleConditionalOperatorLValueSimpleCase(
6206 const Expr *condExpr = E->
getCond();
6211 std::swap(Live, Dead);
6221 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Live->
IgnoreParens())) {
6232 return std::nullopt;
6234struct ConditionalInfo {
6235 llvm::BasicBlock *lhsBlock, *rhsBlock;
6236 std::optional<LValue> LHS, RHS;
6241template<
typename FuncTy>
6243 const AbstractConditionalOperator *E,
6244 const FuncTy &BranchGenFunc) {
6260 Info.lhsBlock = CGF.
Builder.GetInsertBlock();
6263 CGF.
Builder.CreateBr(endBlock);
6271 Info.rhsBlock = CGF.
Builder.GetInsertBlock();
6283 "Unexpected conditional operator!");
6288 if (HandleConditionalOperatorLValueSimpleCase(*
this, E))
6291 EmitConditionalBlocks(*
this, E, [](CodeGenFunction &CGF,
const Expr *E) {
6298 if (!
expr->isGLValue()) {
6301 "Unexpected conditional operator!");
6306 if (std::optional<LValue> Res =
6307 HandleConditionalOperatorLValueSimpleCase(*
this,
expr))
6310 ConditionalInfo Info = EmitConditionalBlocks(
6311 *
this,
expr, [](CodeGenFunction &CGF,
const Expr *E) {
6315 if ((Info.LHS && !Info.LHS->isSimple()) ||
6316 (Info.RHS && !Info.RHS->isSimple()))
6319 if (Info.LHS && Info.RHS) {
6320 Address lhsAddr = Info.LHS->getAddress();
6321 Address rhsAddr = Info.RHS->getAddress();
6323 lhsAddr, rhsAddr, Info.lhsBlock, Info.rhsBlock,
6326 std::max(Info.LHS->getBaseInfo().getAlignmentSource(),
6327 Info.RHS->getBaseInfo().getAlignmentSource());
6329 Info.LHS->getTBAAInfo(), Info.RHS->getTBAAInfo());
6333 assert((Info.LHS || Info.RHS) &&
6334 "both operands of glvalue conditional are throw-expressions?");
6335 return Info.LHS ? *Info.LHS : *Info.RHS;
6347 llvm::scope_exit RestoreCurCast([
this, Prev =
CurCast] {
CurCast = Prev; });
6352 case CK_LValueToRValueBitCast:
6353 case CK_ArrayToPointerDecay:
6354 case CK_FunctionToPointerDecay:
6355 case CK_NullToMemberPointer:
6356 case CK_NullToPointer:
6357 case CK_IntegralToPointer:
6358 case CK_PointerToIntegral:
6359 case CK_PointerToBoolean:
6360 case CK_IntegralCast:
6361 case CK_BooleanToSignedIntegral:
6362 case CK_IntegralToBoolean:
6363 case CK_IntegralToFloating:
6364 case CK_FloatingToIntegral:
6365 case CK_FloatingToBoolean:
6366 case CK_FloatingCast:
6367 case CK_FloatingRealToComplex:
6368 case CK_FloatingComplexToReal:
6369 case CK_FloatingComplexToBoolean:
6370 case CK_FloatingComplexCast:
6371 case CK_FloatingComplexToIntegralComplex:
6372 case CK_IntegralRealToComplex:
6373 case CK_IntegralComplexToReal:
6374 case CK_IntegralComplexToBoolean:
6375 case CK_IntegralComplexCast:
6376 case CK_IntegralComplexToFloatingComplex:
6377 case CK_DerivedToBaseMemberPointer:
6378 case CK_BaseToDerivedMemberPointer:
6379 case CK_MemberPointerToBoolean:
6380 case CK_ReinterpretMemberPointer:
6381 case CK_AnyPointerToBlockPointerCast:
6382 case CK_ARCProduceObject:
6383 case CK_ARCConsumeObject:
6384 case CK_ARCReclaimReturnedObject:
6385 case CK_ARCExtendBlockObject:
6386 case CK_CopyAndAutoreleaseBlockObject:
6387 case CK_IntToOCLSampler:
6388 case CK_FloatingToFixedPoint:
6389 case CK_FixedPointToFloating:
6390 case CK_FixedPointCast:
6391 case CK_FixedPointToBoolean:
6392 case CK_FixedPointToIntegral:
6393 case CK_IntegralToFixedPoint:
6395 case CK_HLSLVectorTruncation:
6396 case CK_HLSLMatrixTruncation:
6397 case CK_HLSLArrayRValue:
6398 case CK_HLSLElementwiseCast:
6399 case CK_HLSLAggregateSplatCast:
6403 llvm_unreachable(
"dependent cast kind in IR gen!");
6405 case CK_BuiltinFnToFnPtr:
6406 llvm_unreachable(
"builtin functions are handled elsewhere");
6409 case CK_NonAtomicToAtomic:
6410 case CK_AtomicToNonAtomic:
6420 case CK_ConstructorConversion:
6421 case CK_UserDefinedConversion:
6422 case CK_CPointerToObjCPointerCast:
6423 case CK_BlockPointerToObjCPointerCast:
6424 case CK_LValueToRValue:
6439 if (
V.getElementType() !=
T)
6446 case CK_UncheckedDerivedToBase:
6447 case CK_DerivedToBase: {
6461 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6465 case CK_BaseToDerived: {
6480 if (
SanOpts.has(SanitizerKind::CFIDerivedCast))
6486 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6488 case CK_LValueBitCast: {
6492 CGM.EmitExplicitCastExprType(CE,
this);
6497 if (
SanOpts.has(SanitizerKind::CFIUnrelatedCast))
6503 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6505 case CK_AddressSpaceConversion: {
6514 case CK_ObjCObjectLValueCast: {
6518 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6520 case CK_ZeroToOCLOpaqueType:
6521 llvm_unreachable(
"NULL to OpenCL opaque type lvalue cast is not valid");
6523 case CK_VectorSplat: {
6531 llvm_unreachable(
"Unhandled lvalue cast kind?");
6539std::pair<LValue, LValue>
6559 return std::make_pair(BaseLV, TempLV);
6568 llvm::Value *
Addr = TempLV.getAddress().getBasePointer();
6571 Address TmpAddr(
Addr, ElTy, TempLV.getAlignment());
6582 llvm::DenseMap<const OpaqueValueExpr*,LValue>::iterator
6583 it = OpaqueLValues.find(e);
6585 if (it != OpaqueLValues.end())
6588 assert(e->
isUnique() &&
"LValue for a nonunique OVE hasn't been emitted");
6596 llvm::DenseMap<const OpaqueValueExpr*,RValue>::iterator
6597 it = OpaqueRValues.find(e);
6599 if (it != OpaqueRValues.end())
6602 assert(e->
isUnique() &&
"RValue for a nonunique OVE hasn't been emitted");
6608 return OpaqueLValues.contains(E);
6609 return OpaqueRValues.contains(E);
6633 llvm_unreachable(
"bad evaluation kind");
6642 llvm::CallBase **CallOrInvoke) {
6643 llvm::CallBase *CallOrInvokeStorage;
6644 if (!CallOrInvoke) {
6645 CallOrInvoke = &CallOrInvokeStorage;
6648 llvm::scope_exit AddCoroElideSafeOnExit([&] {
6650 auto *I = *CallOrInvoke;
6652 I->addFnAttr(llvm::Attribute::CoroElideSafe);
6660 if (
const auto *CE = dyn_cast<CXXMemberCallExpr>(E))
6663 if (
const auto *CE = dyn_cast<CUDAKernelCallExpr>(E))
6668 if (
const auto *CE = dyn_cast<CXXOperatorCallExpr>(E))
6669 if (
const auto *MD =
6670 dyn_cast_if_present<CXXMethodDecl>(CE->getCalleeDecl());
6671 MD && MD->isImplicitObjectMemberFunction())
6686 nullptr, CallOrInvoke);
6692 llvm::CallBase **CallOrInvoke) {
6695 nullptr, CallOrInvoke);
6702 std::string NoBuiltinFD = (
"no-builtin-" + FD->
getName()).str();
6703 std::string NoBuiltins =
"no-builtins";
6706 std::string FDInlineName = (Ident +
".inline").str();
6708 bool IsPredefinedLibFunction =
6710 bool HasAttributeNoBuiltin =
6711 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltinFD) ||
6712 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltins);
6716 if (CGF.
CurFn->getName() != FDInlineName &&
6719 llvm::Function *Fn = llvm::cast<llvm::Function>(CalleePtr);
6720 llvm::Module *M = Fn->getParent();
6721 llvm::Function *Clone = M->getFunction(FDInlineName);
6723 Clone = llvm::Function::Create(Fn->getFunctionType(),
6724 llvm::GlobalValue::InternalLinkage,
6725 Fn->getAddressSpace(), FDInlineName, M);
6726 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
6737 else if (!IsPredefinedLibFunction || !HasAttributeNoBuiltin)
6743 FD->
hasAttr<CUDAGlobalAttr>())
6751 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()))
6764 auto ConvertFuncrefToPtr = [&](llvm::Value *CalleePtr) -> llvm::Value * {
6765 if (
auto *TET = dyn_cast<llvm::TargetExtType>(CalleePtr->getType());
6766 TET && TET->getName() ==
"wasm.funcref") {
6767 llvm::Function *ToPtr =
6768 CGM.getIntrinsic(llvm::Intrinsic::wasm_funcref_to_ptr);
6769 return Builder.CreateCall(ToPtr, {CalleePtr});
6775 if (
auto ICE = dyn_cast<ImplicitCastExpr>(E)) {
6776 if (ICE->getCastKind() == CK_FunctionToPointerDecay ||
6777 ICE->getCastKind() == CK_BuiltinFnToFnPtr) {
6783 if (ICE->getCastKind() == CK_LValueToRValue) {
6784 const Expr *SubExpr = ICE->getSubExpr();
6786 std::pair<llvm::Value *, CGPointerAuthInfo>
Result =
6793 if (
const auto *VD =
6806 }
else if (
auto DRE = dyn_cast<DeclRefExpr>(E)) {
6807 if (
auto FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
6810 }
else if (
auto ME = dyn_cast<MemberExpr>(E)) {
6811 if (
auto FD = dyn_cast<FunctionDecl>(ME->getMemberDecl())) {
6817 }
else if (
auto NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
6821 }
else if (
auto PDE = dyn_cast<CXXPseudoDestructorExpr>(E)) {
6826 llvm::Value *calleePtr;
6838 if (
const auto *VD =
6844 CGCallee callee(calleeInfo, ConvertFuncrefToPtr(calleePtr), pointerAuth);
6860 assert(E->
getOpcode() == BO_Assign &&
"unexpected binary l-value");
6923 llvm::Value *
Result =
nullptr;
6926 if (
SanOpts.has(SanitizerKind::ImplicitBitfieldConversion))
6941 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
6958 llvm_unreachable(
"bad evaluation kind");
6974 if (
CGM.getHLSLRuntime().emitGlobalResourceArray(*
this, E->
getRHS(), Slot))
6986 llvm::CallBase **CallOrInvoke) {
6994 "Can't have a scalar return unless the return type is a "
7007 &&
"binding l-value to type which needs a temporary");
7045 "Can't have a scalar return unless the return type is a "
7059 return CGM.getObjCRuntime().EmitIvarOffset(*
this,
Interface, Ivar);
7067 return Builder.CreateZExtOrTrunc(OffsetValue,
7072 llvm::Value *BaseValue,
7074 unsigned CVRQualifiers) {
7075 return CGM.getObjCRuntime().EmitObjCValueForIvar(*
this, ObjectTy, BaseValue,
7076 Ivar, CVRQualifiers);
7081 llvm::Value *BaseValue =
nullptr;
7092 ObjectTy = BaseExpr->
getType();
7114 llvm::CallBase **CallOrInvoke,
7119 "Call must have function pointer type!");
7121 const Decl *TargetDecl =
7124 assert((!isa_and_present<FunctionDecl>(TargetDecl) ||
7126 "trying to emit a call to an immediate function");
7136 if (
SanOpts.has(SanitizerKind::Function) &&
7139 if (llvm::Constant *PrefixSig =
7140 CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(
CGM)) {
7141 auto CheckOrdinal = SanitizerKind::SO_Function;
7142 auto CheckHandler = SanitizerHandler::FunctionTypeMismatch;
7146 llvm::Type *PrefixSigType = PrefixSig->getType();
7147 llvm::StructType *PrefixStructTy = llvm::StructType::get(
7148 CGM.getLLVMContext(), {PrefixSigType, Int32Ty},
true);
7150 llvm::Value *CalleePtr = Callee.getFunctionPointer();
7151 if (
CGM.getCodeGenOpts().PointerAuth.FunctionPointers) {
7154 Address(CalleePtr, CalleePtr->getType(),
7156 CalleePtr->getPointerAlignment(
CGM.getDataLayout())),
7157 Callee.getPointerAuthInfo(),
nullptr);
7158 CalleePtr =
Addr.emitRawPointer(*
this);
7170 llvm::Value *AlignedCalleePtr;
7171 if (
CGM.getTriple().isARM() ||
CGM.getTriple().isThumb()) {
7172 AlignedCalleePtr =
Builder.CreateIntrinsic(
7173 CalleePtr->getType(), llvm::Intrinsic::ptrmask,
7174 {CalleePtr, llvm::ConstantInt::getSigned(IntPtrTy, ~1)});
7176 AlignedCalleePtr = CalleePtr;
7179 llvm::Value *CalleePrefixStruct = AlignedCalleePtr;
7180 llvm::Value *CalleeSigPtr =
7181 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 0);
7182 llvm::Value *CalleeSig =
7184 llvm::Value *CalleeSigMatch =
Builder.CreateICmpEQ(CalleeSig, PrefixSig);
7188 Builder.CreateCondBr(CalleeSigMatch, TypeCheck, Cont);
7191 llvm::Value *CalleeTypeHash =
Builder.CreateAlignedLoad(
7193 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 1),
7195 llvm::Value *CalleeTypeHashMatch =
7196 Builder.CreateICmpEQ(CalleeTypeHash, TypeHash);
7199 EmitCheck(std::make_pair(CalleeTypeHashMatch, CheckOrdinal), CheckHandler,
7200 StaticData, {CalleePtr});
7209 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
7210 FD && DeviceKernelAttr::isOpenCLSpelling(FD->getAttr<DeviceKernelAttr>()))
7211 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FnType);
7215 if (
SanOpts.has(SanitizerKind::CFIICall) &&
7217 auto CheckOrdinal = SanitizerKind::SO_CFIICall;
7218 auto CheckHandler = SanitizerHandler::CFICheckFail;
7222 llvm::Metadata *MD =
7223 CGM.CreateMetadataIdentifierForFnType(
QualType(FnType, 0));
7225 llvm::Value *TypeId = llvm::MetadataAsValue::get(
getLLVMContext(), MD);
7227 llvm::Value *CalleePtr = Callee.getFunctionPointer();
7228 llvm::Value *TypeTest =
Builder.CreateCall(
7229 CGM.getIntrinsic(llvm::Intrinsic::type_test), {CalleePtr, TypeId});
7231 auto CrossDsoTypeId =
CGM.CreateCrossDsoCfiTypeId(MD);
7232 llvm::Constant *StaticData[] = {
7237 if (
CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
7241 EmitCheck(std::make_pair(TypeTest, CheckOrdinal), CheckHandler,
7242 StaticData, {CalleePtr, llvm::UndefValue::get(
IntPtrTy)});
7251 bool StaticOperator =
false;
7252 if (
auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
7253 if (
const auto *MD =
7254 dyn_cast_if_present<CXXMethodDecl>(OCE->getCalleeDecl());
7255 MD && MD->isStatic())
7256 StaticOperator =
true;
7260 if (StaticOperator) {
7264 Arguments = drop_begin(Arguments, 1);
7266 EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), Arguments,
7273 *ResolvedFnInfo = &FnInfo;
7278 if (
CGM.getLangOpts().HIP && !
CGM.getLangOpts().CUDAIsDevice &&
7281 llvm::Value *Handle = Callee.getFunctionPointer();
7283 Address(Handle, Handle->getType(),
CGM.getPointerAlign()));
7284 Callee.setFunctionPointer(
Stub);
7291 if (
getLangOpts().OpenMPIsTargetDevice &&
CGM.getTriple().isGPU() &&
7295 while (CalleeExpr) {
7296 if ((DRE = dyn_cast<DeclRefExpr>(CalleeExpr)))
7298 if (
const auto *ME = dyn_cast<MemberExpr>(CalleeExpr))
7300 else if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(CalleeExpr))
7306 const auto *VD = DRE ? dyn_cast<VarDecl>(DRE->
getDecl()) :
nullptr;
7307 if (VD && VD->hasAttr<OMPTargetIndirectCallAttr>()) {
7308 auto *FuncPtrTy = llvm::PointerType::get(
7309 CGM.getLLVMContext(),
CGM.getDataLayout().getProgramAddressSpace());
7310 llvm::Type *RtlFnArgs[] = {FuncPtrTy};
7311 llvm::FunctionCallee DeviceRtlFn =
CGM.CreateRuntimeFunction(
7312 llvm::FunctionType::get(FuncPtrTy, RtlFnArgs,
false),
7313 "__llvm_omp_indirect_call_lookup");
7314 llvm::Value *
Func = Callee.getFunctionPointer();
7315 llvm::Type *BackupTy =
Func->getType();
7319 Callee.setFunctionPointer(
Func);
7323 llvm::CallBase *LocalCallOrInvoke =
nullptr;
7327 if (
auto *CalleeDecl = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
7328 if (CalleeDecl->hasAttr<RestrictAttr>() ||
7329 CalleeDecl->hasAttr<MallocSpanAttr>() ||
7330 CalleeDecl->hasAttr<AllocSizeAttr>()) {
7332 if (
SanOpts.has(SanitizerKind::AllocToken)) {
7339 *CallOrInvoke = LocalCallOrInvoke;
7358 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
7361 E, BaseAddr, OffsetV, MPT, IsInBounds, &BaseInfo, &TBAAInfo);
7363 return MakeAddrLValue(MemberAddr, MPT->getPointeeType(), BaseInfo, TBAAInfo);
7380 llvm_unreachable(
"bad evaluation kind");
7384 assert(Val->getType()->isFPOrFPVectorTy());
7389 llvm::MDNode *Node = MDHelper.createFPMath(Accuracy);
7395 llvm::Type *EltTy = Val->getType()->getScalarType();
7396 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7400 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7402 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7417 llvm::Type *EltTy = Val->getType()->getScalarType();
7418 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7422 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7424 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7439 struct LValueOrRValue {
7453 LValueOrRValue result;
7457 const Expr *semantic = *i;
7461 if (
const auto *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
7463 if (ov->isUnique()) {
7464 assert(ov != resultExpr &&
7465 "A unique OVE cannot be used as the result expression");
7473 if (ov == resultExpr && ov->
isPRValue() && !forLValue &&
7478 opaqueData = OVMA::bind(CGF, ov, LV);
7483 opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
7486 if (ov == resultExpr) {
7494 opaques.push_back(opaqueData);
7498 }
else if (semantic == resultExpr) {
7530 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7532 llvm::IntegerType *IdxTy = llvm::IntegerType::get(
getLLVMContext(), 32);
7533 WorkList.push_back({Val, Val.
getType(), {llvm::ConstantInt::get(IdxTy, 0)}});
7535 while (!WorkList.empty()) {
7536 auto [LVal,
T, IdxList] = WorkList.pop_back_val();
7537 T =
T.getCanonicalType().getUnqualifiedType();
7538 if (
const auto *CAT = dyn_cast<ConstantArrayType>(
T)) {
7539 uint64_t Size = CAT->getZExtSize();
7540 for (int64_t I = Size - 1; I > -1; I--) {
7542 IdxListCopy.push_back(llvm::ConstantInt::get(IdxTy, I));
7543 WorkList.emplace_back(LVal, CAT->getElementType(), IdxListCopy);
7545 }
else if (
const auto *RT = dyn_cast<RecordType>(
T)) {
7547 assert(!
Record->isUnion() &&
"Union types not supported in flat cast.");
7552 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7561 "HLSL doesn't support multiple inheritance.");
7564 IdxListCopy.push_back(llvm::ConstantInt::get(
7566 ReverseList.emplace_back(LVal,
Base->getType(), IdxListCopy);
7575 bool createdGEP =
false;
7576 for (
auto *FD :
Record->fields()) {
7577 if (FD->isBitField()) {
7578 if (FD->isUnnamedBitField())
7582 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7583 LLVMT, Align,
"gep");
7587 ReverseList.push_back({FieldLVal, FD->
getType(), {}});
7590 IdxListCopy.push_back(
7592 ReverseList.emplace_back(LVal, FD->getType(), IdxListCopy);
7596 std::reverse(ReverseList.begin(), ReverseList.end());
7597 llvm::append_range(WorkList, ReverseList);
7598 }
else if (
const auto *VT = dyn_cast<VectorType>(
T)) {
7601 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7602 Align,
"vector.gep");
7604 for (
unsigned I = 0, E = VT->getNumElements(); I < E; I++) {
7605 llvm::Constant *Idx = llvm::ConstantInt::get(IdxTy, I);
7609 AccessList.emplace_back(LV);
7611 }
else if (
const auto *MT = dyn_cast<ConstantMatrixType>(
T)) {
7619 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7620 Align,
"matrix.gep");
7623 unsigned NumRows = MT->getNumRows();
7624 unsigned NumCols = MT->getNumColumns();
7626 llvm::MatrixBuilder MB(
Builder);
7627 for (
unsigned Row = 0; Row < MT->getNumRows(); Row++) {
7628 for (
unsigned Col = 0; Col < MT->getNumColumns(); Col++) {
7629 llvm::Value *RowIdx = llvm::ConstantInt::get(IdxTy, Row);
7630 llvm::Value *ColIdx = llvm::ConstantInt::get(IdxTy, Col);
7631 llvm::Value *Idx = MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols,
7636 AccessList.emplace_back(LV);
7640 if (!IdxList.empty()) {
7643 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7644 LLVMT, Align,
"gep");
7647 AccessList.emplace_back(LVal);
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
static SmallString< 64 > getAllocTokenFunctionName(const Decl *D, const ASTContext &Ctx)
Returns the qualified name of D for use as the function name in !alloc_token metadata,...
static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E, LValue &LV, bool IsMemberAccess=false)
static LValue EmitGlobalNamedRegister(const VarDecl *VD, CodeGenModule &CGM)
Named Registers are named metadata pointing to the register name which will be read from/written to a...
static bool getRangeForType(CodeGenFunction &CGF, QualType Ty, llvm::APInt &Min, llvm::APInt &End, bool StrictEnums, bool StrictBool, bool IsBool)
static llvm::Value * emitHashMix(CGBuilderTy &Builder, llvm::Value *Acc, llvm::Value *Ptr)
static const Expr * isSimpleArrayDecayOperand(const Expr *E)
isSimpleArrayDecayOperand - If the specified expr is a simple decay from an array to pointer,...
static bool getFieldOffsetInBits(CodeGenFunction &CGF, const RecordDecl *RD, const FieldDecl *Field, int64_t &Offset)
The offset of a field from the beginning of the record.
static bool hasBPFPreserveStaticOffset(const RecordDecl *D)
static Address emitRawAddrOfFieldStorage(CodeGenFunction &CGF, Address base, const FieldDecl *field, bool IsInBounds)
Drill down to the storage of a field without walking into reference types, and without respect for po...
static LValue EmitCapturedFieldLValue(CodeGenFunction &CGF, const FieldDecl *FD, llvm::Value *ThisValue)
static std::optional< LValue > EmitLValueOrThrowExpression(CodeGenFunction &CGF, const Expr *Operand)
Emit the operand of a glvalue conditional operator.
static llvm::Value * convertSizedByBoundToElementCount(CodeGenFunction &CGF, llvm::Value *BoundsVal, QualType PointeeTy, bool CountSigned)
Convert a '__sized_by' byte-count bound to an element-count bound so it can be compared against an el...
static CheckRecoverableKind getRecoverableKind(SanitizerKind::SanitizerOrdinal Ordinal)
static bool RecordContainsField(const RecordDecl *RD, const FieldDecl *Field)
Returns true if Field is reachable from RD either as a direct field or through a chain of nested reco...
static llvm::Value * emitArraySubscriptGEP(CodeGenFunction &CGF, llvm::Type *elemType, llvm::Value *ptr, ArrayRef< llvm::Value * > indices, bool inbounds, bool signedIndices, SourceLocation loc, const llvm::Twine &name="arrayidx")
static GlobalDecl getGlobalDeclForDirectCall(const FunctionDecl *FD)
static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF, const Expr *E, GlobalDecl GD)
static RawAddress MaybeConvertMatrixAddress(RawAddress Addr, CodeGenFunction &CGF, bool IsVector=true)
static LValueOrRValue emitPseudoObjectExpr(CodeGenFunction &CGF, const PseudoObjectExpr *E, bool forLValue, AggValueSlot slot)
static Address wrapWithBPFPreserveStaticOffset(CodeGenFunction &CGF, Address &Addr)
static llvm::StringRef GetUBSanTrapForHandler(SanitizerHandler ID)
static llvm::Value * getArrayIndexingBound(CodeGenFunction &CGF, const Expr *Base, QualType &IndexedType, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel)
If Base is known to point to the start of an array, return the length of that array.
static RValue EmitLoadOfMatrixLValue(LValue LV, SourceLocation Loc, CodeGenFunction &CGF)
static Address emitAddrOfFieldStorage(CodeGenFunction &CGF, Address base, const FieldDecl *field, bool IsInBounds)
Drill down to the storage of a field without walking into reference types, wrapping the address in an...
static std::optional< int64_t > getOffsetDifferenceInBits(CodeGenFunction &CGF, const FieldDecl *FD1, const FieldDecl *FD2)
Returns the relative offset difference between FD1 and FD2.
static CGCallee EmitDirectCallee(CodeGenFunction &CGF, GlobalDecl GD)
static LValue EmitThreadPrivateVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD, QualType T, Address Addr, llvm::Type *RealVarTy, SourceLocation Loc)
static LValue EmitGlobalVarDeclLValue(CodeGenFunction &CGF, const Expr *E, const VarDecl *VD)
static bool hasAnyVptr(const QualType Type, const ASTContext &Context)
static bool IsPreserveAIArrayBase(CodeGenFunction &CGF, const Expr *ArrayBase)
Given an array base, check whether its member access belongs to a record with preserve_access_index a...
static Address emitDeclTargetVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD, QualType T)
VariableTypeDescriptorKind
@ TK_Float
A floating-point type.
@ TK_Unknown
Any other type. The value representation is unspecified.
@ TK_Integer
An integer type.
@ TK_BitInt
An _BitInt(N) type.
static void EmitStoreOfMatrixScalar(llvm::Value *value, LValue lvalue, bool isInit, CodeGenFunction &CGF)
static Address EmitPointerWithAlignment(const Expr *E, LValueBaseInfo *BaseInfo, TBAAAccessInfo *TBAAInfo, KnownNonNull_t IsKnownNonNull, CodeGenFunction &CGF)
static Address emitPreserveStructAccess(CodeGenFunction &CGF, LValue base, Address addr, const FieldDecl *field)
const SanitizerHandlerInfo SanitizerHandlers[]
static void emitCheckHandlerCall(CodeGenFunction &CGF, llvm::FunctionType *FnType, ArrayRef< llvm::Value * > FnArgs, SanitizerHandler CheckHandler, CheckRecoverableKind RecoverKind, bool IsFatal, llvm::BasicBlock *ContBB, bool NoMerge)
static Address emitOMPArraySectionBase(CodeGenFunction &CGF, const Expr *Base, LValueBaseInfo &BaseInfo, TBAAAccessInfo &TBAAInfo, QualType BaseTy, QualType ElTy, bool IsLowerBound)
static mlir::Value emitPointerArithmetic(CIRGenFunction &cgf, const BinOpInfo &op, bool isSubtraction)
Emit pointer + index arithmetic.
static Address createReferenceTemporary(CIRGenFunction &cgf, const MaterializeTemporaryExpr *m, const Expr *inner)
static CharUnits getArrayElementAlign(CharUnits arrayAlign, mlir::Value idx, CharUnits eltSize)
static void pushTemporaryCleanup(CIRGenFunction &cgf, const MaterializeTemporaryExpr *m, const Expr *e, Address referenceTemporary)
static bool canEmitSpuriousReferenceToVariable(CIRGenFunction &cgf, const DeclRefExpr *e, const VarDecl *vd)
Determine whether we can emit a reference to vd from the current context, despite not necessarily hav...
static DeclRefExpr * tryToConvertMemberExprToDeclRefExpr(CIRGenFunction &cgf, const MemberExpr *me)
static Address emitAddrOfZeroSizeField(CIRGenFunction &cgf, Address base, const FieldDecl *field)
Get the address of a zero-sized field within a record.
static unsigned getCharWidth(tok::TokenKind kind, const TargetInfo &Target)
llvm::MachO::Record Record
Defines AST-level helper utilities for matrix types.
Defines the clang::Module class, which describes a module in the source code.
static const SanitizerMask AlwaysRecoverable
static const SanitizerMask Unrecoverable
#define LIST_SANITIZER_CHECKS
Defines the SourceManager interface.
static QualType getPointeeType(const MemRegion *R)
a trap message and trap category.
const LValueBase getLValueBase() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
SourceManager & getSourceManager()
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
uint64_t getFieldOffset(const ValueDecl *FD) const
Get the offset of a FieldDecl or IndirectFieldDecl, in bits.
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
Builtin::Context & BuiltinInfo
const LangOptions & getLangOpts() const
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
llvm::DenseMap< const CXXMethodDecl *, CXXCastPath > LambdaCastPaths
For capturing lambdas with an explicit object parameter whose type is derived from the lambda type,...
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
static bool isPFPField(const FieldDecl *Field)
const VariableArrayType * getAsVariableArrayType(QualType T) const
QualType getExtVectorType(QualType VectorType, unsigned NumElts) const
Return the unique reference to an extended vector type of the specified element type and size.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
CanQualType getCanonicalTagType(const TagDecl *TD) const
unsigned getTargetAddressSpace(LangAS AS) const
bool isSentinelNullExpr(const Expr *E)
uint64_t getCharWidth() const
Return the size of the character type, in bits.
ASTRecordLayout - This class contains layout information for one RecordDecl, which is a struct/union/...
uint64_t getFieldOffset(unsigned FieldNo) const
getFieldOffset - Get the offset of the given field index, in bits.
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression representing the value of the expression if the condition eval...
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression representing the value of the expression if the condition eva...
This class represents BOTH the OpenMP Array Section and OpenACC 'subarray', with a boolean differenti...
Expr * getBase()
Get base of the array section.
Expr * getLength()
Get length of array section.
static QualType getBaseOriginalType(const Expr *Base)
Return original type of the base expression for array section.
SourceLocation getExprLoc() const LLVM_READONLY
Expr * getLowerBound()
Get lower bound of array section.
bool isOpenACCArraySection() const
SourceLocation getColonLocFirst() const
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
SourceLocation getExprLoc() const LLVM_READONLY
Expr * getLHS()
An array access can be written A[4] or 4[A] (both are equivalent).
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
A builtin binary operation expression such as "x + y" or "x <= y".
SourceLocation getExprLoc() const
static bool isAdditiveOp(Opcode Opc)
A binding in a decomposition declaration.
Expr * getBinding() const
Get the expression to which this declaration is bound.
DecompositionDecl * getDecomposedDecl() const
Get the decomposition declaration that this binding represents a decomposition of.
A fixed int type of a specified bitwidth.
unsigned getNumBits() const
bool isPredefinedLibFunction(unsigned ID) const
Determines whether this builtin is a predefined libc/libm function, such as "malloc",...
Represents binding an expression to a temporary.
CXXTemporary * getTemporary()
const Expr * getSubExpr() const
Represents a call to a C++ constructor.
Represents a C++ destructor within a class.
Represents a C++ struct/union/class.
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
bool isStandardLayout() const
Determine whether this class is standard-layout per C++ [class]p7.
unsigned getNumBases() const
Retrieves the number of base classes of this class.
base_class_iterator bases_begin()
bool isDynamicClass() const
bool hasDefinition() const
const CXXRecordDecl * getStandardLayoutBaseWithFields() const
If this is a standard-layout class or union, any and all data members will be declared in the same ty...
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
MSGuidDecl * getGuidDecl() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
SourceLocation getBeginLoc() const
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
bool isCoroElideSafe() const
QualType getCallReturnType(const ASTContext &Ctx) const
getCallReturnType - Get the return type of the call expr.
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
path_iterator path_begin()
CastKind getCastKind() const
bool changesVolatileQualification() const
Return.
This is an opaque type for sizes expressed in character units.
CharUnits alignmentAtOffset(CharUnits offset) const
Given that this is a non-zero alignment value, what is the alignment at the given offset?
llvm::MaybeAlign getAsMaybeAlign() const
Returns Quantity as a valid llvm::Align or std::nullopt, Beware llvm::MaybeAlign assumes power of two...
llvm::Align getAsAlign() const
Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit bytes.
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
static CharUnits One()
Construct a CharUnits quantity of one.
CharUnits alignmentOfArrayElement(CharUnits elementSize) const
Given that this is the alignment of the first element of an array, return the minimum alignment of an...
static CharUnits fromQuantity(QuantityType Quantity)
Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
Construct a CharUnits quantity of zero.
@ None
Trap Messages are omitted.
@ Detailed
Trap Message includes more context (e.g.
@ Strict
In-memory bool values are assumed to be 0 or 1, and any other value is UB.
bool isOptimizedBuild() const
Are we building at -O1 or higher?
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
llvm::Value * getBasePointer() const
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
Return the pointer contained in this class after authenticating it and adding offset to it if necessa...
CharUnits getAlignment() const
llvm::Type * getElementType() const
Return the type of the values stored in this address.
Address withPointer(llvm::Value *NewPointer, KnownNonNull_t IsKnownNonNull) const
Return address with different pointer, but same element type and alignment.
Address withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
Address withAlignment(CharUnits NewAlignment) const
Return address with different alignment, but same pointer and element type.
llvm::PointerType * getType() const
Return the type of the pointer value.
static AggValueSlot ignored()
ignored - Returns an aggregate value slot indicating that the aggregate value is being ignored.
Address getAddress() const
void setExternallyDestructed(bool destructed=true)
static AggValueSlot forLValue(const LValue &LV, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
static AggValueSlot forAddr(Address addr, Qualifiers quals, IsDestructed_t isDestructed, NeedsGCBarriers_t needsGC, IsAliased_t isAliased, Overlap_t mayOverlap, IsZeroed_t isZeroed=IsNotZeroed, IsSanitizerChecked_t isChecked=IsNotSanitizerChecked)
forAddr - Make a slot for an aggregate value.
A scoped helper to set the current source atom group for CGDebugInfo::addInstToCurrentSourceAtom.
A scoped helper to set the current debug location to the specified location or preferred location of ...
static ApplyDebugLocation CreateArtificial(CodeGenFunction &CGF)
Apply TemporaryLocation if it is valid.
Address CreateConstInBoundsByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Given a pointer to i8, adjust it by a given constant offset.
Address CreateGEP(CodeGenFunction &CGF, Address Addr, llvm::Value *Index, const llvm::Twine &Name="")
Address CreateConstGEP2_32(Address Addr, unsigned Idx0, unsigned Idx1, const llvm::Twine &Name="")
Address CreateConstArrayGEP(Address Addr, uint64_t Index, const llvm::Twine &Name="")
Given addr = [n x T]* ... produce name = getelementptr inbounds addr, i64 0, i64 index where i64 is a...
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
llvm::LoadInst * CreateLoad(Address Addr, const llvm::Twine &Name="")
Address CreateConstByteGEP(Address Addr, CharUnits Offset, const llvm::Twine &Name="")
Address CreatePreserveStructAccessIndex(Address Addr, unsigned Index, unsigned FieldIndex, llvm::MDNode *DbgInfo)
Address CreateAddrSpaceCast(Address Addr, llvm::Type *Ty, llvm::Type *ElementTy, const llvm::Twine &Name="")
virtual llvm::Function * getKernelStub(llvm::GlobalValue *Handle)=0
Get kernel stub by kernel handle.
virtual bool HasThisReturn(GlobalDecl GD) const
Returns true if the given constructor or destructor is one of the kinds that the ABI says returns 'th...
virtual void registerGlobalDtor(CodeGenFunction &CGF, const VarDecl &D, llvm::FunctionCallee Dtor, llvm::Constant *Addr)=0
Emit code to force the execution of a destructor during global teardown.
virtual LValue EmitThreadLocalVarDeclLValue(CodeGenFunction &CGF, const VarDecl *VD, QualType LValType)=0
Emit a reference to a non-local thread_local variable (including triggering the initialization of all...
virtual bool canCallMismatchedFunctionType() const
Returns true if the target allows calling a function through a pointer with a different signature tha...
virtual bool usesThreadWrapperFunction(const VarDecl *VD) const =0
Abstract information about a function or function prototype.
const GlobalDecl getCalleeDecl() const
All available information about a concrete callee.
CGCalleeInfo getAbstractInfo() const
const CXXPseudoDestructorExpr * getPseudoDestructorExpr() const
bool isPseudoDestructor() const
static CGCallee forBuiltin(unsigned builtinID, const FunctionDecl *builtinDecl)
unsigned getBuiltinID() const
static CGCallee forDirect(llvm::Constant *functionPtr, const CGCalleeInfo &abstractInfo=CGCalleeInfo())
const FunctionDecl * getBuiltinDecl() const
static CGCallee forPseudoDestructor(const CXXPseudoDestructorExpr *E)
This class gathers all debug information during compilation and is responsible for emitting to llvm g...
llvm::DIType * getOrCreateStandaloneType(QualType Ty, SourceLocation Loc)
Emit standalone debug info for a type.
std::pair< llvm::DIType *, unsigned > getOrCreatePreserveAccessInfo(QualType Ty, const FieldDecl *Field)
Return the complete record type and field index for preserve-access intrinsics.
llvm::DILocation * CreateTrapFailureMessageFor(llvm::DebugLoc TrapLocation, StringRef Category, StringRef FailureMsg)
Create a debug location from TrapLocation that adds an artificial inline frame where the frame name i...
CGFunctionInfo - Class to encapsulate the information about a function definition.
std::optional< LValue > emitGlobalResourceArrayAsLValue(CodeGenFunction &CGF, const VarDecl *ArrayDecl)
RawAddress createBufferMatrixTempAddress(const LValue &LV, CodeGenFunction &CGF)
virtual Address getAddrOfThreadPrivate(CodeGenFunction &CGF, const VarDecl *VD, Address VDAddr, SourceLocation Loc)
Returns address of the threadprivate variable for the current thread.
virtual ConstantAddress getAddrOfDeclareTargetVar(const VarDecl *VD)
Returns the address of the variable marked as declare target with link clause OR as declare target wi...
bool hasRequiresUnifiedSharedMemory() const
Return whether the unified_shared_memory has been specified.
CGRecordLayout - This class handles struct and union layout info while lowering AST types to LLVM typ...
llvm::StructType * getLLVMType() const
Return the "complete object" LLVM type associated with this record.
const CGBitFieldInfo & getBitFieldInfo(const FieldDecl *FD) const
Return the BitFieldInfo that corresponds to the field FD.
unsigned getLLVMFieldNo(const FieldDecl *FD) const
Return llvm::StructType element number that corresponds to the field FD.
CallArgList - Type for representing both the value and type of arguments in a call.
void addWriteback(LValue srcLV, Address temporary, llvm::Value *toUse, const Expr *writebackExpr=nullptr)
void add(RValue rvalue, QualType type)
The scope of a CXXDefaultInitExpr.
An object to manage conditionally-evaluated expressions.
llvm::BasicBlock * getStartingBlock() const
Returns a block which will be executed prior to each evaluation of the conditional code.
static ConstantEmission forValue(llvm::Constant *C)
static ConstantEmission forReference(llvm::Constant *C)
A non-RAII class containing all the information about a bound opaque value.
static bool shouldBindAsLValue(const Expr *expr)
static OpaqueValueMappingData bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const Expr *e)
An RAII object to set (and then clear) a mapping for an OpaqueValueExpr.
static bool shouldBindAsLValue(const Expr *expr)
RAII object to set/unset CodeGenFunction::IsSanitizerScope.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
LValue EmitMatrixSubscriptExpr(const MatrixSubscriptExpr *E)
LValue EmitCoawaitLValue(const CoawaitExpr *E)
llvm::Value * GetVTablePtr(Address This, llvm::Type *VTableTy, const CXXRecordDecl *VTableClass, VTableAuthMode AuthMode=VTableAuthMode::Authenticate)
GetVTablePtr - Return the Value of the vtable pointer member pointed to by This.
llvm::Value * EmitObjCConsumeObject(QualType T, llvm::Value *Ptr)
Produce the code for a CK_ARCConsumeObject.
void EmitBoundsCheckImpl(const Expr *ArrayExpr, QualType ArrayBaseType, llvm::Value *IndexVal, QualType IndexType, llvm::Value *BoundsVal, QualType BoundsType, bool Accessed)
LValue EmitLoadOfReferenceLValue(LValue RefLVal)
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount, Stmt::Likelihood LH=Stmt::LH_None, const Expr *ConditionalOp=nullptr, const VarDecl *ConditionalDecl=nullptr)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID, bool EnsureInsertPoint=true)
Emit a call to trap or debugtrap.
RValue EmitObjCMessageExpr(const ObjCMessageExpr *E, ReturnValueSlot Return=ReturnValueSlot())
llvm::Value * emitBoolVecConversion(llvm::Value *SrcVec, unsigned NumElementsDst, const llvm::Twine &Name="")
void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)
LValue EmitCXXConstructLValue(const CXXConstructExpr *E)
llvm::Value * performAddrSpaceCast(llvm::Value *Src, llvm::Type *DestTy)
LValue EmitConditionalOperatorLValue(const AbstractConditionalOperator *E)
std::pair< LValue, llvm::Value * > EmitARCStoreAutoreleasing(const BinaryOperator *e)
ComplexPairTy EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
void SetDivFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
SanitizerSet SanOpts
Sanitizers enabled for this function.
CodeGenUtils::EvaluationOrder EvaluationOrder
@ UseSkipPath
Skip (false)
LValue EmitInitListLValue(const InitListExpr *E)
bool isUnderlyingBasePointerConstantNull(const Expr *E)
Check whether the underlying base pointer is a constant null.
void EmitARCInitWeak(Address addr, llvm::Value *value)
i8* @objc_initWeak(i8** addr, i8* value) Returns value.
LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E, bool Accessed=false)
Address LoadCXXThisAddress()
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)
ContainsLabel - Return true if the statement contains a label in it.
LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E)
llvm::Value * GetCountedByFieldExprGEP(const Expr *Base, const FieldDecl *FD, const FieldDecl *CountDecl)
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)
EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...
const CastExpr * CurCast
If a cast expression is being visited, this holds the current cast's expression.
llvm::Type * ConvertType(QualType T)
Address EmitCXXUuidofExpr(const CXXUuidofExpr *E)
void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK)
static Destroyer destroyARCWeak
CGCapturedStmtInfo * CapturedStmtInfo
RValue EmitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E)
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc)
EmitLoadOfComplex - Load a complex number from the specified l-value.
bool inSuspendBlock() const
llvm::Value * EmitARCRetain(QualType type, llvm::Value *value)
Produce the code to do a retain.
llvm::Value * EmitPointerAuthQualify(PointerAuthQualifier Qualifier, llvm::Value *Pointer, QualType ValueType, Address StorageAddress, bool IsKnownNonNull)
CleanupKind getARCCleanupKind()
Retrieves the default cleanup kind for an ARC cleanup.
void EmitAggFinalDestCopy(QualType Type, AggValueSlot Dest, const LValue &Src, ExprValueKind SrcKind)
EmitAggFinalDestCopy - Emit copy of the specified aggregate into destination address.
Address GetAddressOfBaseClass(Address Value, const CXXRecordDecl *Derived, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd, bool NullCheckValue, SourceLocation Loc)
GetAddressOfBaseClass - This function will add the necessary delta to the load of 'this' and returns ...
LValue MakeNaturalAlignPointeeAddrLValue(llvm::Value *V, QualType T)
Given a value of type T* that may not be to a complete object, construct an l-value with the natural ...
void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst)
RValue EmitBlockCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
LValue EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E)
void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint=true)
LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E)
RValue convertTempToRValue(Address addr, QualType type, SourceLocation Loc)
Given the address of a temporary variable, produce an r-value of its type.
LValue EmitObjCIsaExpr(const ObjCIsaExpr *E)
void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, llvm::Value **Result=nullptr)
EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints as EmitStoreThroughLValue.
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
LValue EmitCXXUuidofLValue(const CXXUuidofExpr *E)
llvm::Value * EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
void SetSqrtFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
RValue EmitSimpleCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
Emit a CallExpr without considering whether it might be a subclass.
static bool isNullPointerAllowed(TypeCheckKind TCK)
Determine whether the pointer type check TCK permits null pointers.
RValue EmitPseudoObjectRValue(const PseudoObjectExpr *e, AggValueSlot slot=AggValueSlot::ignored())
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
See CGDebugInfo::addInstToCurrentSourceAtom.
const LangOptions & getLangOpts() const
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
llvm::Value * EmitARCStoreStrong(LValue lvalue, llvm::Value *value, bool resultIgnored)
Store into a strong object.
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E)
LValue EmitLValueForIvar(QualType ObjectTy, llvm::Value *Base, const ObjCIvarDecl *Ivar, unsigned CVRQualifiers)
Address GetAddressOfDerivedClass(Address Value, const CXXRecordDecl *Derived, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd, bool NullCheckValue)
void EmitIgnoredConditionalOperator(const AbstractConditionalOperator *E)
void EmitCountedByBoundsChecking(const Expr *ArrayExpr, QualType ArrayType, Address ArrayInst, QualType IndexType, llvm::Value *IndexVal, bool Accessed, bool FlexibleArray)
EmitCountedByBoundsChecking - If the array being accessed has a "counted_by" attribute,...
Address EmitFieldAnnotations(const FieldDecl *D, Address V)
Emit field annotations for the given field & value.
bool IsInPreserveFieldInfo
True if CodeGen currently emits the argument of __builtin_preserve_field_info.
void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
pushDestroy - Push the standard destructor for the given type as at least a normal cleanup.
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
void EmitNullabilityCheck(LValue LHS, llvm::Value *RHS, SourceLocation Loc)
Given an assignment *LHS = RHS, emit a test that checks if RHS is nonnull, if LHS is marked _Nonnull.
llvm::Value * EmitPointerAuthUnqualify(PointerAuthQualifier Qualifier, llvm::Value *Pointer, QualType PointerType, Address StorageAddress, bool IsKnownNonNull)
void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &Init)
Address makeNaturalAddressForPointer(llvm::Value *Ptr, QualType T, CharUnits Alignment=CharUnits::Zero(), bool ForPointeeType=false, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
Construct an address with the natural alignment of T.
static Destroyer destroyCXXObject
Address EmitLoadOfPointer(Address Ptr, const PointerType *PtrTy, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Load a pointer with type PtrTy stored at address Ptr.
RValue EmitLoadOfGlobalRegLValue(LValue LV)
Load of global named registers are always calls to intrinsics.
void EmitVTablePtrCheckForCast(QualType T, Address Derived, bool MayBeNull, CFITypeCheckKind TCK, SourceLocation Loc)
Derived is the presumed address of an object of type T after a cast.
TypeCheckKind
Situations in which we might emit a check for the suitability of a pointer or glvalue.
@ TCK_DowncastPointer
Checking the operand of a static_cast to a derived pointer type.
@ TCK_DowncastReference
Checking the operand of a static_cast to a derived reference type.
@ TCK_MemberAccess
Checking the object expression in a non-static data member access.
@ TCK_Store
Checking the destination of a store. Must be suitably sized and aligned.
@ TCK_UpcastToVirtualBase
Checking the operand of a cast to a virtual base object.
@ TCK_MemberCall
Checking the 'this' pointer for a call to a non-static member function.
@ TCK_DynamicOperation
Checking the operand of a dynamic_cast or a typeid expression.
@ TCK_ReferenceBinding
Checking the bound value in a reference binding.
@ TCK_Upcast
Checking the operand of a cast to a base object.
LValue EmitBinaryOperatorLValue(const BinaryOperator *E)
bool InNoMergeAttributedStmt
True if the current statement has nomerge attribute.
LValue EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E)
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
llvm::AssertingVH< llvm::Instruction > AllocaInsertPt
AllocaInsertPoint - This is an instruction in the entry block before which we prefer to insert alloca...
void maybeAttachRangeForLoad(llvm::LoadInst *Load, QualType Ty, SourceLocation Loc)
void EmitBitfieldConversionCheck(llvm::Value *Src, QualType SrcType, llvm::Value *Dst, QualType DstType, const CGBitFieldInfo &Info, SourceLocation Loc)
Emit a check that an [implicit] conversion of a bitfield.
LValue EmitPseudoObjectLValue(const PseudoObjectExpr *e)
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e)
llvm::Value * LoadPassedObjectSize(const Expr *E, QualType EltTy)
If E references a parameter with pass_object_size info or a constant array size modifier,...
llvm::Value * EmitIvarOffsetAsPointerDiff(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
RValue EmitCUDAKernelCallExpr(const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
RValue EmitLoadOfAnyValue(LValue V, AggValueSlot Slot=AggValueSlot::ignored(), SourceLocation Loc={})
Like EmitLoadOfLValue but also handles complex and aggregate types.
LValue EmitLValueForField(LValue Base, const FieldDecl *Field, bool IsInBounds=true)
RawAddress CreateDefaultAlignTempAlloca(llvm::Type *Ty, const Twine &Name="tmp")
CreateDefaultAlignedTempAlloca - This creates an alloca with the default ABI alignment of the given L...
const TargetInfo & getTarget() const
LValue EmitCompoundAssignmentLValue(const CompoundAssignOperator *E)
bool isInConditionalBranch() const
isInConditionalBranch - Return true if we're currently emitting one branch or the other of a conditio...
Address EmitCXXMemberDataPointerAddress(const Expr *E, Address base, llvm::Value *memberPtr, const MemberPointerType *memberPtrType, bool IsInBounds, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Emit the address of a field using a member data pointer.
static bool isVptrCheckRequired(TypeCheckKind TCK, QualType Ty)
Determine whether the pointer type check TCK requires a vptr check.
CGCallee EmitCallee(const Expr *E)
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
RValue EmitCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue=ReturnValueSlot(), llvm::CallBase **CallOrInvoke=nullptr)
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc)
EmitLoadOfLValue - Given an expression that represents a value lvalue, this method emits the address ...
LValue EmitMatrixSingleSubscriptExpr(const MatrixSingleSubscriptExpr *E)
LValue EmitArraySectionExpr(const ArraySectionExpr *E, bool IsLowerBound=true)
Address GetAddrOfBlockDecl(const VarDecl *var)
llvm::Value * EmitComplexToScalarConversion(ComplexPairTy Src, QualType SrcTy, QualType DstTy, SourceLocation Loc)
Emit a conversion from the specified complex type to the specified destination type,...
void pushCleanupAfterFullExpr(CleanupKind Kind, As... A)
Queue a cleanup to be pushed after finishing the current full-expression, potentially with an active ...
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
RawAddress CreateIRTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateIRTempWithoutCast - Create a temporary IR object of the given type, with appropriate alignment.
void pushFullExprCleanup(CleanupKind kind, As... A)
pushFullExprCleanup - Push a cleanup to be run at the end of the current full-expression.
static Destroyer destroyARCStrongImprecise
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
LValue EmitAggExprToLValue(const Expr *E)
EmitAggExprToLValue - Emit the computation of the specified expression of aggregate type into a tempo...
void SetFPAccuracy(llvm::Value *Val, float Accuracy)
SetFPAccuracy - Set the minimum required accuracy of the given floating point operation,...
Address mergeAddressesInConditionalExpr(Address LHS, Address RHS, llvm::BasicBlock *LHSBlock, llvm::BasicBlock *RHSBlock, llvm::BasicBlock *MergeBlock, QualType MergedType)
Address emitAddrOfImagComponent(Address complex, QualType complexType)
void EmitBoundsCheck(const Expr *ArrayExpr, const Expr *ArrayExprBase, llvm::Value *Index, QualType IndexType, bool Accessed)
Emit a check that Base points into an array object, which we can access at index Index.
llvm::Value * EvaluateExprAsBool(const Expr *E)
EvaluateExprAsBool - Perform the usual unary conversions on the specified expression and compare the ...
LValue EmitPredefinedLValue(const PredefinedExpr *E)
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs, const TrapReason *TR=nullptr)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
LValue EmitDeclRefLValue(const DeclRefExpr *E)
LValue EmitStringLiteralLValue(const StringLiteral *E)
AggValueSlot CreateAggTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateAggTemp - Create a temporary memory object for the given aggregate type.
RValue getOrCreateOpaqueRValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its RValue mapping if it exists, otherwise create one.
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
RValue EmitAtomicLoad(LValue LV, SourceLocation SL, AggValueSlot Slot=AggValueSlot::ignored())
CGDebugInfo * getDebugInfo()
llvm::Value * emitScalarConstant(const ConstantEmission &Constant, Expr *E)
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
bool EmitLifetimeStart(llvm::Value *Addr)
Emit a lifetime.begin marker if some criteria are satisfied.
LValue EmitUnsupportedLValue(const Expr *E, const char *Name)
EmitUnsupportedLValue - Emit a dummy l-value using the type of E and issue an ErrorUnsupported style ...
LValue MakeRawAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment, AlignmentSource Source=AlignmentSource::Type)
Same as MakeAddrLValue above except that the pointer is known to be unsigned.
llvm::MDNode * buildAllocToken(QualType AllocType)
Build metadata used by the AllocToken instrumentation.
RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
LValue EmitLValueForFieldInitialization(LValue Base, const FieldDecl *Field)
EmitLValueForFieldInitialization - Like EmitLValueForField, except that if the Field is a reference,...
llvm::Value * EmitToMemory(llvm::Value *Value, QualType Ty)
EmitToMemory - Change a scalar value from its value representation to its in-memory representation.
Address emitBlockByrefAddress(Address baseAddr, const VarDecl *V, bool followForward=true)
BuildBlockByrefAddress - Computes the location of the data in a variable which is declared as __block...
llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...
LValue getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its LValue mapping if it exists, otherwise create one.
bool EmitScalarRangeCheck(llvm::Value *Value, QualType Ty, SourceLocation Loc)
Check if the scalar Value is within the valid range for the given type Ty.
ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal=false, bool IgnoreImag=false)
EmitComplexExpr - Emit the computation of the specified expression of complex type,...
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
llvm::ConstantInt * getUBSanFunctionTypeHash(QualType T) const
Return a type hash constant for a function instrumented by -fsanitize=function.
LValue EmitHLSLArrayAssignLValue(const BinaryOperator *E)
RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen without...
LValue EmitVAArgExprLValue(const VAArgExpr *E)
bool IsInPreservedAIRegion
True if CodeGen currently emits code inside presereved access index region.
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
VlaSizePair getVLASize(const VariableArrayType *vla)
Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...
LValue EmitStmtExprLValue(const StmtExpr *E)
llvm::Value * EmitARCLoadWeakRetained(Address addr)
i8* @objc_loadWeakRetained(i8** addr)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
ASTContext & getContext() const
RawAddress CreateTempAllocaWithoutCast(llvm::Type *Ty, CharUnits align, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates a alloca and inserts it into the entry block.
llvm::Value * EmitWithOriginalRHSBitfieldAssignment(const BinaryOperator *E, llvm::Value **Previous, QualType *SrcType)
Retrieve the implicit cast expression of the rhs in a binary operator expression by passing pointers ...
llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, AlignmentSource Source=AlignmentSource::Type, bool isNontemporal=false)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
LValue EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args, QualType Ty, bool IsImplicitObject=false)
void Destroyer(CodeGenFunction &CGF, Address addr, QualType ty)
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit)
EmitStoreOfComplex - Store a complex number into the specified l-value.
const Decl * CurFuncDecl
CurFuncDecl - Holds the Decl for the current outermost non-closure context.
LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E)
Address EmitAddressOfPFPField(Address RecordPtr, const PFPField &Field)
void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false)
EmitStoreThroughLValue - Store the specified rvalue into the specified lvalue, where both are guarant...
Address EmitArrayToPointerDecay(const Expr *Array, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
RValue EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
RValue GetUndefRValue(QualType Ty)
GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
llvm::Instruction * getPostAllocaInsertPoint()
Return PostAllocaInsertPt.
void EmitAllocToken(llvm::CallBase *CB, QualType AllocType)
Emit and set additional metadata used by the AllocToken instrumentation.
LValue EmitComplexAssignmentLValue(const BinaryOperator *E)
Emit an l-value for an assignment (simple or compound) of complex type.
LValue EmitCastLValue(const CastExpr *E)
EmitCastLValue - Casts are never lvalues unless that cast is to a reference type.
llvm::Value * EmitPointerArithmetic(const BinaryOperator *BO, Expr *pointerOperand, llvm::Value *pointer, Expr *indexOperand, llvm::Value *index, bool isSubtraction)
Emit pointer + index arithmetic.
LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E)
LValue EmitLoadOfPointerLValue(Address Ptr, const PointerType *PtrTy)
LValue EmitOMPCapturedBindingLValue(const BindingDecl *BD)
Emit an LValue for a structured binding captured in an OpenMP region.
llvm::Value * EmitCheckValue(llvm::Value *V)
Convert a value into a format suitable for passing to a runtime sanitizer handler.
void EmitAnyExprToMem(const Expr *E, Address Location, Qualifiers Quals, bool IsInitializer)
EmitAnyExprToMem - Emits the code necessary to evaluate an arbitrary expression into the given memory...
RValue EmitAnyExpr(const Expr *E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
EmitAnyExpr - Emit code to compute the specified expression which can have any type.
LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E)
llvm::DenseMap< const ValueDecl *, FieldDecl * > LambdaCaptureFields
RValue EmitUnsupportedRValue(const Expr *E, const char *Name)
EmitUnsupportedRValue - Emit a dummy r-value using the type of E and issue an ErrorUnsupported style ...
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
std::pair< LValue, LValue > EmitHLSLOutArgLValues(const HLSLOutArgExpr *E, QualType Ty)
LValue EmitObjCSelectorLValue(const ObjCSelectorExpr *E)
llvm::Type * ConvertTypeForMem(QualType T)
LValue EmitCallExprLValue(const CallExpr *E, llvm::CallBase **CallOrInvoke=nullptr)
RValue EmitLoadOfBitfieldLValue(LValue LV, SourceLocation Loc)
llvm::Value * EmitARCLoadWeak(Address addr)
i8* @objc_loadWeak(i8** addr) Essentially objc_autorelease(objc_loadWeakRetained(addr)).
LValue EmitLValueForLambdaField(const FieldDecl *Field)
void markStmtMaybeUsed(const Stmt *S)
CodeGenTypes & getTypes() const
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
llvm::Value * EmitIvarOffset(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
bool IsSanitizerScope
True if CodeGen currently emits code implementing sanitizer checks.
void FlattenAccessAndTypeLValue(LValue LVal, SmallVectorImpl< LValue > &AccessList)
LValue EmitCoyieldLValue(const CoyieldExpr *E)
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
void EmitCfiSlowPathCheck(SanitizerKind::SanitizerOrdinal Ordinal, llvm::Value *Cond, llvm::ConstantInt *TypeId, llvm::Value *Ptr, ArrayRef< llvm::Constant * > StaticArgs)
Emit a slow path cross-DSO CFI check which calls __cfi_slowpath if Cond if false.
llvm::SmallVector< const ParmVarDecl *, 4 > FnArgs
Save Parameter Decl for coroutine.
void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType, Address Ptr)
Emits all the code to cause the given temporary to be cleaned up.
llvm::Value * authPointerToPointerCast(llvm::Value *ResultPtr, QualType SourceType, QualType DestType)
LValue EmitUnaryOpLValue(const UnaryOperator *E)
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
bool LValueIsSuitableForInlineAtomic(LValue Src)
An LValue is a candidate for having its loads and stores be made atomic if we are operating under /vo...
LValue EmitCheckedLValue(const Expr *E, TypeCheckKind TCK)
Same as EmitLValue but additionally we generate checking code to guard against undefined behavior.
RawAddress CreateMemTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen and cas...
Address EmitLoadOfReference(LValue RefLVal, LValueBaseInfo *PointeeBaseInfo=nullptr, TBAAAccessInfo *PointeeTBAAInfo=nullptr)
RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation Loc)
llvm::Value * EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr)
LValue EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E)
llvm::Type * convertTypeForLoadStore(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
bool sanitizePerformTypeCheck() const
Whether any type-checking sanitizers are enabled.
Address EmitExtVectorElementLValue(LValue V)
Generates lvalue for partial ext_vector access.
llvm::Value * EmitCheckedInBoundsGEP(llvm::Type *ElemTy, llvm::Value *Ptr, ArrayRef< llvm::Value * > IdxList, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, const Twine &Name="")
Same as IRBuilder::CreateInBoundsGEP, but additionally emits a check to detect undefined behavior whe...
void EmitInitializationToLValue(const Expr *E, LValue LV, AggValueSlot::IsZeroed_t IsZeroed=AggValueSlot::IsNotZeroed)
EmitInitializationToLValue - Emit an initializer to an LValue.
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
Address emitAddrOfRealComponent(Address complex, QualType complexType)
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
const FunctionDecl * getCurrentFunctionDecl() const
RValue EmitLoadOfExtVectorElementLValue(LValue V)
static bool hasAggregateEvaluationKind(QualType T)
static bool IsWrappedCXXThis(const Expr *E)
Check if E is a C++ "this" pointer wrapped in value-preserving casts.
void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)
EmitCallArgs - Emit call arguments for a function.
llvm::Value * EmitMatrixIndexExpr(const Expr *E)
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID, bool NoMerge=false, const TrapReason *TR=nullptr)
Create a basic block that will call the trap intrinsic, and emit a conditional branch to it,...
void EmitTrapCallAndMakeUnreachable()
Emit a call to '@llvm.trap()' and clear the current insert point.
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit)
llvm::Value * EmitFromMemory(llvm::Value *Value, QualType Ty)
EmitFromMemory - Change a scalar value from its memory representation to its value representation.
const CallExpr * MustTailCall
uint64_t getProfileCount(const Stmt *S)
Get the profiler's count for the given statement.
llvm::Value * EmitLoadOfCountedByField(const Expr *Base, const FieldDecl *FD, const FieldDecl *CountDecl)
Build an expression accessing the "counted_by" field.
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
void EmitUnreachable(SourceLocation Loc)
Emit a reached-unreachable diagnostic if Loc is valid and runtime checking is enabled.
bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result, bool AllowLabels=false)
ConstantFoldsToSimpleInteger - If the specified expression does not fold to a constant,...
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
LValue EmitCXXTypeidLValue(const CXXTypeidExpr *E)
llvm::Function * generateDestroyHelper(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray, const VarDecl *VD)
generateDestroyHelper - Generates a helper function which, when invoked, destroys the given object.
LValue EmitMemberExpr(const MemberExpr *E)
std::pair< llvm::Value *, llvm::Value * > ComplexPairTy
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
ConstantEmission tryEmitAsConstant(const DeclRefExpr *RefExpr)
Try to emit a reference to the given value without producing it as an l-value.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
void EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst)
Store of global named registers are always calls to intrinsics.
bool isOpaqueValueEmitted(const OpaqueValueExpr *E)
isOpaqueValueEmitted - Return true if the opaque value expression has already been emitted.
std::pair< llvm::Value *, CGPointerAuthInfo > EmitOrigPointerRValue(const Expr *E)
Retrieve a pointer rvalue and its ptrauth info.
llvm::Value * EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored)
i8* @objc_storeWeak(i8** addr, i8* value) Returns value.
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
llvm::LLVMContext & getLLVMContext()
RValue EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
static Destroyer destroyARCStrongPrecise
LValue EmitMatrixElementExpr(const MatrixElementExpr *E)
void incrementProfileCounter(const Stmt *S, llvm::Value *StepV=nullptr)
Increment the profiler's counter for the given statement by StepV.
static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts)
getAccessedFieldNo - Given an encoded value and a result number, return the input field number being ...
llvm::Value * EmitScalarConversion(llvm::Value *Src, QualType SrcTy, QualType DstTy, SourceLocation Loc)
Emit a conversion from the specified type to the specified destination type, both of which are LLVM s...
LoadedLValueCapture * CurLoadedLValueCapture
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
static bool ShouldNullCheckClassCastValue(const CastExpr *Cast)
llvm::Value * EmitNonNullRValueCheck(RValue RV, QualType T)
Create a check that a scalar RValue is non-null.
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
bool hasLabelBeenSeenInCurrentScope() const
Return true if a label was seen in the current scope.
llvm::Value * EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE)
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
llvm::Value * EmitCXXTypeidExpr(const CXXTypeidExpr *E)
This class organizes the cross-function state that is used while generating LLVM code.
void EmitExplicitCastExprType(const ExplicitCastExpr *E, CodeGenFunction *CGF=nullptr)
Emit type info if type of an expression is a variably modified type.
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Module & getModule() const
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
CGDebugInfo * getModuleDebugInfo()
llvm::Constant * performAddrSpaceCast(llvm::Constant *Src, llvm::Type *DestTy)
llvm::Constant * getRawFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return a function pointer for a reference to the given function.
llvm::FunctionCallee getAddrAndTypeOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
llvm::Constant * getFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return the ABI-correct function pointer value for a reference to the given function.
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
CGPointerAuthInfo getPointerAuthInfoForPointeeType(QualType type)
llvm::GlobalValue::LinkageTypes getLLVMLinkageVarDefinition(const VarDecl *VD)
Returns LLVM linkage for a declarator.
CGCXXABI & getCXXABI() const
ConstantAddress GetWeakRefReference(const ValueDecl *VD)
Get a reference to the target of VD.
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
TBAAAccessInfo getTBAAAccessInfo(QualType AccessType)
getTBAAAccessInfo - Get TBAA information that describes an access to an object of the given type.
ASTContext & getContext() const
TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, TBAAAccessInfo TargetInfo)
mergeTBAAInfoForCast - Get merged TBAA information for the purposes of type casts.
llvm::Constant * GetAddrOfGlobalVar(const VarDecl *D, llvm::Type *Ty=nullptr, ForDefinition_t IsForDefinition=NotForDefinition)
Return the llvm::Constant for the address of the given global variable.
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
llvm::LLVMContext & getLLVMContext()
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
ConstantAddress GetAddrOfGlobalTemporary(const MaterializeTemporaryExpr *E, const Expr *Inner)
Returns a pointer to a global variable representing a temporary with static or thread storage duratio...
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
const CGRecordLayout & getCGRecordLayout(const RecordDecl *)
getCGRecordLayout - Return record layout info for the given record decl.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
A specialization of Address that requires the address to be an LLVM Constant.
llvm::Constant * getPointer() const
llvm::Constant * emitAbstract(const Expr *E, QualType T)
Emit the result of the given expression as an abstract constant, asserting that it succeeded.
llvm::Constant * tryEmitConstantExpr(const ConstantExpr *CE)
FunctionArgList - Type for representing both the decl and type of parameters to a function.
AlignmentSource getAlignmentSource() const
LValue - This represents an lvalue references.
llvm::Value * getMatrixRowIdx() const
static LValue MakeMatrixRow(Address Addr, llvm::Value *RowIdx, QualType MatrixTy, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Expr * getBaseIvarExp() const
llvm::Constant * getExtVectorElts() const
static LValue MakeGlobalReg(llvm::Value *V, CharUnits alignment, QualType type)
llvm::Constant * getMatrixRowElts() const
bool isObjCStrong() const
bool isMatrixRowSwizzle() const
bool isGlobalObjCRef() const
bool isVolatileQualified() const
RValue asAggregateRValue() const
llvm::Value * getPointer(CodeGenFunction &CGF) const
llvm::Value * getMatrixIdx() const
llvm::Value * getGlobalReg() const
static LValue MakeAddr(Address Addr, QualType type, ASTContext &Context, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
const Qualifiers & getQuals() const
static LValue MakeExtVectorElt(Address Addr, llvm::Constant *Elts, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getAddress() const
unsigned getVRQualifiers() const
bool isExtVectorElt() const
llvm::Value * getVectorIdx() const
void setNontemporal(bool Value)
LValueBaseInfo getBaseInfo() const
void setARCPreciseLifetime(ARCPreciseLifetime_t value)
const CGBitFieldInfo & getBitFieldInfo() const
bool isThreadLocalRef() const
KnownNonNull_t isKnownNonNull() const
TBAAAccessInfo getTBAAInfo() const
void setNonGC(bool Value)
static LValue MakeMatrixRowSwizzle(Address MatAddr, llvm::Value *RowIdx, llvm::Constant *Cols, QualType MatrixTy, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getVectorAddress() const
bool isNontemporal() const
static LValue MakeBitfield(Address Addr, const CGBitFieldInfo &Info, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Create a new object to represent a bit-field access.
static LValue MakeVectorElt(Address vecAddress, llvm::Value *Idx, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
void setAddress(Address address)
Address getExtVectorAddress() const
static LValue MakeMatrixElt(Address matAddress, llvm::Value *Idx, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getMatrixAddress() const
Address getBitFieldAddress() const
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
static RValue get(llvm::Value *V)
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
static RValue getComplex(llvm::Value *V1, llvm::Value *V2)
Address getAggregateAddress() const
getAggregateAddr() - Return the Value* of the address of the aggregate.
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
An abstract representation of an aligned address.
CharUnits getAlignment() const
Return the alignment of this pointer.
llvm::Type * getElementType() const
Return the type of the values stored in this address.
llvm::Value * getPointer() const
unsigned getAddressSpace() const
Return the address space that this address resides in.
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
StringRef getCategory() const
StringRef getMessage() const
Complex values, per C99 6.2.5p11.
QualType getElementType() const
CompoundLiteralExpr - [C99 6.5.2.5].
const Expr * getInitializer() const
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
Represents a sugar type with __counted_by or __sized_by annotations, including their _or_null variant...
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
A reference to a declared variable, function, enum, etc.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
SourceLocation getLocation() const
Decl - This represents one declaration (or definition), e.g.
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
const Expr * getBase() const
ExplicitCastExpr - An explicit cast written in the source code.
This represents one expression.
const Expr * skipRValueSubobjectAdjustments(SmallVectorImpl< const Expr * > &CommaLHS, SmallVectorImpl< SubobjectAdjustment > &Adjustments) const
Walk outwards from an expression we want to bind a reference to and find the expression whose lifetim...
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
Decl * getReferencedDeclOfCallee()
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
bool isOBJCGCCandidate(ASTContext &Ctx) const
isOBJCGCCandidate - Return true if this expression may be used in a read/ write barrier.
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
bool isArrow() const
isArrow - Return true if the base expression is a pointer to vector, return false if the base express...
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
ExtVectorType - Extended vector type.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
const FieldDecl * findCountedByField() const
Find the FieldDecl specified in a FAM's "counted_by" attribute.
const Expr * getSubExpr() const
Represents a function declaration or definition.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
FunctionType - C99 6.7.5.3 - Function Declarators.
GlobalDecl - represents a global declaration.
const Decl * getDecl() const
This class represents temporary values used to represent inout and out arguments in HLSL.
const OpaqueValueExpr * getCastedTemporary() const
const OpaqueValueExpr * getOpaqueArgLValue() const
bool isInOut() const
returns true if the parameter is inout and false if the parameter is out.
const Expr * getWritebackCast() const
const Expr * getArgLValue() const
Return the l-value expression that was written as the argument in source.
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Describes an C or C++ initializer list.
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
const Expr * getInit(unsigned Init) const
StrictFlexArraysLevelKind
std::optional< llvm::AllocTokenMode > AllocTokenMode
The allocation token mode.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
StorageDuration getStorageDuration() const
Retrieve the storage duration for the materialized temporary.
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
ValueDecl * getExtendingDecl()
Get the declaration which triggered the lifetime-extension of this temporary, if any.
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
MatrixSingleSubscriptExpr - Matrix single subscript expression for the MatrixType extension when you ...
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
bool isIncomplete() const
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
SourceLocation getExprLoc() const LLVM_READONLY
A pointer to member type per C++ 8.3.3 - Pointers to members.
bool isObjCBOOLType(QualType T) const
Returns true if.
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
A C++ nested-name-specifier augmented with source location information.
ObjCEncodeExpr, used for @encode in Objective-C.
Represents an ObjC class declaration.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
const Expr * getBase() const
An expression that sends a message to the given Objective-C object or class.
const ObjCMethodDecl * getMethodDecl() const
QualType getReturnType() const
ObjCSelectorExpr used for @selector in Objective-C.
Selector getSelector() const
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
const Expr * getSubExpr() const
Pointer-authentication qualifiers.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
[C99 6.4.2.2] - A predefined identifier such as func.
StringRef getIdentKindName() const
PredefinedIdentKind getIdentKind() const
StringLiteral * getFunctionName()
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
semantics_iterator semantics_end()
semantics_iterator semantics_begin()
const Expr *const * const_semantics_iterator
Expr * getResultExpr()
Return the result-bearing expression, or null if there is none.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
PointerAuthQualifier getPointerAuth() const
QualType withoutLocalFastQualifiers() const
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType withCVRQualifiers(unsigned CVR) const
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
@ 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 addCVRQualifiers(unsigned mask)
void addQualifiers(Qualifiers Q)
Add the qualifiers from the given set to this set.
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
ObjCLifetime getObjCLifetime() const
Represents a struct/union/class.
field_range fields() const
Scope - A scope is a transient data structure that is used while parsing the program.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
StmtClass getStmtClass() const
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool isPackedVectorBoolType(const ASTContext &ctx) const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
CXXRecordDecl * castAsCXXRecordDecl() const
bool isArithmeticType() const
bool isConstantMatrixType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isVariableArrayType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isExtVectorBoolType() const
bool isBitIntType() const
bool isConstantMatrixBoolType() const
bool isAnyComplexType() const
bool hasPointeeToCFIUncheckedCalleeFunctionType() const
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isAtomicType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjectType() const
Determine whether this type is an object type.
bool isHLSLResourceRecord() const
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isAnyPointerType() const
bool isSubscriptableVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isRecordType() const
bool isHLSLResourceRecordArray() const
bool hasBooleanRepresentation() const
Determine whether this type has a boolean representation – i.e., it is a boolean type,...
bool isCFIUncheckedCalleeFunctionType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getExprLoc() const
Expr * getSubExpr() const
Represents a call to the builtin function __builtin_va_arg.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
TLSKind getTLSKind() const
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ TLS_None
Not a TLS variable.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
unsigned getNumElements() const
bool isAAPCS(const TargetInfo &TargetInfo)
Helper method to check if the underlying ABI is AAPCS.
QualType getFixedSizeElementType(const ASTContext &Ctx, const VariableArrayType *VLA)
Strip off the variably-modified array types wrapping VLA and return the first element type that has a...
bool onlyHasInlineBuiltinDeclaration(const FunctionDecl *FD)
Detect the unusual situation where an inline version of a builtin is shadowed by a non-inline version...
EvaluationOrder getCallArgEvaluationOrder(const CallExpr *E)
Returns the argument evaluation order the language requires for the given call.
ConstantEmissionKind checkVarTypeForConstantEmission(QualType Type)
Can we constant-emit a load of a reference to a variable of the given type?
bool isEmptyFieldForLayout(const ASTContext &Ctx, const FieldDecl *FD)
Return true iff the field is "empty", that is, either a zero-width bit-field or an isEmptyRecordForLa...
ConstantEmissionKind
How a reference to a variable can be emitted as a constant.
AlignmentSource
The source of the alignment of an l-value; an expression of confidence in the alignment actually matc...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
static AlignmentSource getFieldAlignmentSource(AlignmentSource Source)
Given that the base address has the given alignment source, what's our confidence in the alignment of...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const AstTypeMatcher< FunctionType > functionType
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
std::optional< llvm::AllocTokenMetadata > getAllocTokenMetadata(QualType T, const ASTContext &Ctx)
Get the information required for construction of an allocation token ID.
QualType inferPossibleType(const CallExpr *E, const ASTContext &Ctx, const CastExpr *CastE)
Infer the possible allocated type from an allocation call expression.
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
bool isMatrixRowMajor(const LangOptions &LangOpts, QualType T)
Returns true if matrices of T should be laid out in row-major order.
@ Asm
Assembly: we accept this only so that we can preprocess it.
StorageDuration
The storage duration for an object (per C++ [basic.stc]).
@ SD_Thread
Thread storage duration.
@ SD_Static
Static storage duration.
@ SD_FullExpression
Full-expression storage duration (for temporaries).
@ SD_Automatic
Automatic storage duration (most local variables).
@ SD_Dynamic
Dynamic storage duration.
@ Result
The result type of a method or function.
const FunctionProtoType * T
@ Dtor_Complete
Complete object dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
llvm::cl::opt< bool > ClSanitizeGuardChecks
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
U cast(CodeGen::Address addr)
LangAS getLangASFromTargetAS(unsigned TargetAS)
@ Interface
The "__interface" keyword introduces the elaborated-type-specifier.
bool isLambdaMethod(const DeclContext *DC)
@ Other
Other implicit parameter.
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
@ NOUR_Constant
This name appears as a potential result of an lvalue-to-rvalue conversion that is a constant expressi...
__INTPTR_TYPE__ intptr_t
A signed integer type with the property that any valid pointer to void can be converted to this type,...
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __packed_splat4 uint16_t
Structure with information about how a bitfield should be accessed.
CharUnits VolatileStorageOffset
The offset of the bitfield storage from the start of the struct.
unsigned VolatileOffset
The offset within a contiguous run of bitfields that are represented as a single "field" within the L...
unsigned Offset
The offset within a contiguous run of bitfields that are represented as a single "field" within the L...
unsigned VolatileStorageSize
The storage size in bits which should be used when accessing this bitfield.
unsigned Size
The total size of the bit-field, in bits.
unsigned StorageSize
The storage size in bits which should be used when accessing this bitfield.
unsigned IsSigned
Whether the bit-field is signed.
Records the l-value that ScalarExprEmitter loads from when it emits a specific expression.
std::optional< LValue > LV
The recorded l-value, set if E was loaded by ScalarExprEmitter.
static Address getAddrOfThreadPrivate(CodeGenFunction &CGF, const VarDecl *VD, Address VDAddr, SourceLocation Loc)
Returns address of the threadprivate variable for the current thread.
llvm::PointerType * VoidPtrTy
llvm::IntegerType * Int64Ty
CharUnits getIntAlign() const
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
unsigned char PointerWidthInBits
The width of a pointer into the generic address space.
llvm::IntegerType * SizeTy
llvm::IntegerType * Int32Ty
llvm::IntegerType * IntPtrTy
llvm::PointerType * Int8PtrTy
CharUnits getPointerAlign() const
llvm::PointerType * DefaultPtrTy
llvm::MDNode * AccessType
AccessType - The final access type.
uint64_t Offset
Offset - The byte offset of the final access within the base one.
static TBAAAccessInfo getMayAliasInfo()
uint64_t Size
Size - The size of access, in bytes.
llvm::MDNode * BaseType
BaseType - The base/leading access type.
bool isIncomplete() const
EvalResult is a struct with detailed info about an evaluated expression.
APValue Val
Val - This is the value the expression can be folded to.
bool HasSideEffects
Whether the evaluated expression has side effects.
Describes how types, statements, expressions, and declarations should be printed.
unsigned SuppressInlineNamespace
Suppress printing parts of scope specifiers that correspond to inline namespaces.
@ Plain
E.g., (anonymous enum)/(unnamed struct)/etc.
unsigned AnonymousTagNameStyle
void set(SanitizerMask K, bool Value)
Enable or disable a certain (single) sanitizer.
bool has(SanitizerMask K) const
Check if a certain (single) sanitizer is enabled.
An adjustment to be made to the temporary created when emitting a reference binding,...
@ DerivedToBaseAdjustment
@ MemberPointerAdjustment