42#include "llvm/ADT/STLExtras.h"
43#include "llvm/ADT/ScopeExit.h"
44#include "llvm/ADT/StringExtras.h"
45#include "llvm/IR/Constants.h"
46#include "llvm/IR/DataLayout.h"
47#include "llvm/IR/Intrinsics.h"
48#include "llvm/IR/LLVMContext.h"
49#include "llvm/IR/MDBuilder.h"
50#include "llvm/IR/MatrixBuilder.h"
51#include "llvm/Support/ConvertUTF.h"
52#include "llvm/Support/Endian.h"
53#include "llvm/Support/MathExtras.h"
54#include "llvm/Support/Path.h"
55#include "llvm/Support/xxhash.h"
56#include "llvm/Transforms/Utils/SanitizerStats.h"
69 "ubsan-guard-checks", llvm::cl::Optional,
70 llvm::cl::desc(
"Guard UBSAN checks with `llvm.allow.ubsan.check()`."));
96#define SANITIZER_CHECK(Enum, Name, Version, Msg) \
97 case SanitizerHandler::Enum: \
100#undef SANITIZER_CHECK
102 llvm_unreachable(
"unhandled switch case");
110 llvm::Value *ArraySize) {
112 auto Alloca =
Builder.CreateStructuredAlloca(Ty, Name);
123 llvm::Value *ArraySize) {
133 llvm::IRBuilderBase::InsertPointGuard IPG(Builder);
148 llvm::Value *ArraySize,
152 *AllocaAddr = Alloca;
153 return MaybeCastStackAddressSpace(Alloca, DestLangAS, ArraySize);
161 llvm::Value *ArraySize) {
162 llvm::AllocaInst *Alloca;
164 Alloca =
Builder.CreateAlloca(Ty, ArraySize, Name);
167 new llvm::AllocaInst(Ty,
CGM.getDataLayout().getAllocaAddrSpace(),
169 if (
SanOpts.Mask & SanitizerKind::Address) {
170 Alloca->addAnnotationMetadata({
"alloca_name_altered", Name.str()});
173 Allocas->Add(Alloca);
210 auto *ArrayElementTy = ArrayTy->getElementType();
211 auto ArrayElements = ArrayTy->getNumElements();
214 ArrayElementTy = VectorTy->getElementType();
215 ArrayElements *= VectorTy->getNumElements();
217 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
240 PGO->setCurrentStmt(E);
243 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this, MemPtr, MPT);
266 if (
const auto *CondOp = dyn_cast<AbstractConditionalOperator>(
289 if (!ignoreResult && aggSlot.
isIgnored())
294 llvm_unreachable(
"bad evaluation kind");
336 llvm_unreachable(
"bad evaluation kind");
359 llvm_unreachable(
"bad evaluation kind");
399 bool Precise = isa_and_nonnull<VarDecl>(VD) &&
400 VD->
hasAttr<ObjCPreciseLifetimeAttr>();
421 llvm_unreachable(
"temporary cannot have dynamic storage duration");
423 llvm_unreachable(
"unknown storage duration");
433 if (
const auto *ClassDecl =
437 ReferenceTemporaryDtor = ClassDecl->getDestructor();
439 if (!ReferenceTemporaryDtor)
442 llvm::FunctionCallee CleanupFn;
443 llvm::Constant *CleanupArg;
449 CleanupArg = llvm::Constant::getNullValue(CGF.
Int8PtrTy);
466 llvm_unreachable(
"temporary cannot have dynamic storage duration");
488 auto *GV =
new llvm::GlobalVariable(
490 llvm::GlobalValue::PrivateLinkage,
Init,
".ref.tmp",
nullptr,
491 llvm::GlobalValue::NotThreadLocal,
495 llvm::Constant *
C = GV;
502 return RawAddress(
C, GV->getValueType(), alignment);
511 llvm_unreachable(
"temporary can't have dynamic storage duration");
513 llvm_unreachable(
"unknown storage duration");
527 "Reference should never be pseudo-strong!");
535 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(
Object.getPointer())) {
545 if (Var->hasInitializer())
548 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
554 default: llvm_unreachable(
"expected scalar or aggregate expression");
577 for (
const auto &Ignored : CommaLHSs)
580 if (
const auto *opaque = dyn_cast<OpaqueValueExpr>(E)) {
581 if (opaque->getType()->isRecordType()) {
582 assert(Adjustments.empty());
590 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(
591 Object.getPointer()->stripPointerCasts())) {
597 if (!Var->hasInitializer()) {
598 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
619 if (!ShouldEmitLifetimeMarkers)
630 CGBuilderTy::InsertPoint OldIP;
632 ((!
SanOpts.has(SanitizerKind::HWAddress) &&
633 !
SanOpts.has(SanitizerKind::Memory) &&
634 !
SanOpts.has(SanitizerKind::MemtagStack) &&
635 !
CGM.getCodeGenOpts().SanitizeAddressUseAfterScope) ||
637 OldConditional = OutermostConditional;
638 OutermostConditional =
nullptr;
642 Builder.restoreIP(CGBuilderTy::InsertPoint(
643 Block, llvm::BasicBlock::iterator(
Block->back())));
650 if (OldConditional) {
651 OutermostConditional = OldConditional;
668 switch (Adjustment.Kind) {
672 Adjustment.DerivedToBase.BasePath->path_begin(),
673 Adjustment.DerivedToBase.BasePath->path_end(),
681 "materialized temporary field is not a simple lvalue");
689 E,
Object, Ptr, Adjustment.Ptr.MPT,
true);
722 const llvm::Constant *Elts) {
730 Builder.CreateMul(Ptr, Builder.getInt64(0xbf58476d1ce4e5b9u));
732 Builder.CreateXor(A0, Builder.CreateLShr(A0, Builder.getInt64(31)));
733 return Builder.CreateXor(Acc, A1);
750 return SanOpts.has(SanitizerKind::Null) ||
751 SanOpts.has(SanitizerKind::Alignment) ||
752 SanOpts.has(SanitizerKind::ObjectSize) ||
753 SanOpts.has(SanitizerKind::Vptr);
760 llvm::Value *ArraySize) {
767 if (Ptr->getType()->getPointerAddressSpace())
778 auto PtrToAlloca = dyn_cast<llvm::AllocaInst>(Ptr->stripPointerCasts());
780 llvm::Value *IsNonNull =
nullptr;
781 bool IsGuaranteedNonNull =
782 SkippedChecks.
has(SanitizerKind::Null) || PtrToAlloca;
784 llvm::BasicBlock *Done =
nullptr;
785 bool DoneViaNullSanitize =
false;
788 auto CheckHandler = SanitizerHandler::TypeMismatch;
790 {SanitizerKind::SO_Null,
791 SanitizerKind::SO_ObjectSize,
792 SanitizerKind::SO_Alignment},
800 if ((
SanOpts.has(SanitizerKind::Null) || AllowNullPointers) &&
801 !IsGuaranteedNonNull) {
803 IsNonNull =
Builder.CreateIsNotNull(Ptr);
807 IsGuaranteedNonNull = IsNonNull ==
True;
810 if (!IsGuaranteedNonNull) {
811 if (AllowNullPointers) {
815 DoneViaNullSanitize =
true;
817 Builder.CreateCondBr(IsNonNull, Rest, Done);
820 Checks.push_back(std::make_pair(IsNonNull, SanitizerKind::SO_Null));
825 if (
SanOpts.has(SanitizerKind::ObjectSize) &&
826 !SkippedChecks.
has(SanitizerKind::ObjectSize) &&
828 uint64_t TySize =
CGM.getMinimumObjectSize(Ty).getQuantity();
829 llvm::Value *Size = llvm::ConstantInt::get(
IntPtrTy, TySize);
831 Size =
Builder.CreateMul(Size, ArraySize);
834 llvm::Constant *ConstantSize = dyn_cast<llvm::Constant>(Size);
835 if (!ConstantSize || !ConstantSize->isNullValue()) {
842 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::objectsize, Tys);
844 llvm::Value *NullIsUnknown =
Builder.getFalse();
845 llvm::Value *Dynamic =
Builder.getFalse();
846 llvm::Value *LargeEnough =
Builder.CreateICmpUGE(
847 Builder.CreateCall(F, {Ptr, Min, NullIsUnknown, Dynamic}), Size);
849 std::make_pair(LargeEnough, SanitizerKind::SO_ObjectSize));
853 llvm::MaybeAlign AlignVal;
854 llvm::Value *PtrAsInt =
nullptr;
856 if (
SanOpts.has(SanitizerKind::Alignment) &&
857 !SkippedChecks.
has(SanitizerKind::Alignment)) {
860 AlignVal =
CGM.getNaturalTypeAlignment(Ty,
nullptr,
nullptr,
865 if (AlignVal && *AlignVal > llvm::Align(1) &&
866 (!PtrToAlloca || PtrToAlloca->getAlign() < *AlignVal)) {
868 llvm::Value *Align =
Builder.CreateAnd(
869 PtrAsInt, llvm::ConstantInt::get(
IntPtrTy, AlignVal->value() - 1));
870 llvm::Value *Aligned =
874 std::make_pair(Aligned, SanitizerKind::SO_Alignment));
878 if (Checks.size() > 0) {
879 llvm::Constant *StaticData[] = {
881 llvm::ConstantInt::get(
Int8Ty, AlignVal ? llvm::Log2(*AlignVal) : 1),
882 llvm::ConstantInt::get(
Int8Ty, TCK)};
883 EmitCheck(Checks, CheckHandler, StaticData, PtrAsInt ? PtrAsInt : Ptr);
895 if (
SanOpts.has(SanitizerKind::Vptr) &&
898 SanitizerHandler::DynamicTypeCacheMiss);
902 if (!IsGuaranteedNonNull) {
904 IsNonNull =
Builder.CreateIsNotNull(Ptr);
908 Builder.CreateCondBr(IsNonNull, VptrNotNull, Done);
914 llvm::raw_svector_ostream Out(MangledName);
919 if (!
CGM.getContext().getNoSanitizeList().containsType(SanitizerKind::Vptr,
922 llvm::Value *TypeHash =
923 llvm::ConstantInt::get(
Int64Ty, xxh3_64bits(Out.str()));
937 const int CacheSize = 128;
938 llvm::Type *HashTable = llvm::ArrayType::get(
IntPtrTy, CacheSize);
939 llvm::Value *
Cache =
CGM.CreateRuntimeVariable(HashTable,
940 "__ubsan_vptr_type_cache");
941 llvm::Value *Slot =
Builder.CreateAnd(Hash,
944 llvm::Value *Indices[] = {
Builder.getInt32(0), Slot };
945 llvm::Value *CacheVal =
Builder.CreateAlignedLoad(
953 llvm::Value *EqualHash =
Builder.CreateICmpEQ(CacheVal, Hash);
954 llvm::Constant *StaticData[] = {
958 llvm::ConstantInt::get(
Int8Ty, TCK)
960 llvm::Value *DynamicData[] = { Ptr, Hash };
961 EmitCheck(std::make_pair(EqualHash, SanitizerKind::SO_Vptr),
962 SanitizerHandler::DynamicTypeCacheMiss, StaticData,
970 {DoneViaNullSanitize ? SanitizerKind::SO_Null : SanitizerKind::SO_Vptr},
971 DoneViaNullSanitize ? SanitizerHandler::TypeMismatch
972 : SanitizerHandler::DynamicTypeCacheMiss);
981 uint64_t EltSize =
C.getTypeSizeInChars(EltTy).getQuantity();
989 auto *ParamDecl = dyn_cast<ParmVarDecl>(ArrayDeclRef->getDecl());
993 auto *POSAttr = ParamDecl->getAttr<PassObjectSizeAttr>();
998 int POSType = POSAttr->getType();
999 if (POSType != 0 && POSType != 1)
1003 auto PassedSizeIt = SizeArguments.find(ParamDecl);
1004 if (PassedSizeIt == SizeArguments.end())
1008 assert(LocalDeclMap.count(PassedSizeDecl) &&
"Passed size not loadable");
1009 Address AddrOfSize = LocalDeclMap.find(PassedSizeDecl)->second;
1012 llvm::Value *SizeOfElement =
1013 llvm::ConstantInt::get(SizeInBytes->getType(), EltSize);
1014 return Builder.CreateUDiv(SizeInBytes, SizeOfElement);
1023 StrictFlexArraysLevel) {
1026 IndexedType =
Base->getType();
1027 return CGF.
Builder.getInt32(VT->getNumElements());
1032 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1033 if (CE->getCastKind() == CK_ArrayToPointerDecay &&
1034 !CE->getSubExpr()->isFlexibleArrayMemberLike(CGF.
getContext(),
1035 StrictFlexArraysLevel)) {
1038 IndexedType = CE->getSubExpr()->getType();
1040 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
1041 return CGF.
Builder.getInt(CAT->getSize());
1043 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT))
1051 QualType EltTy{
Base->getType()->getPointeeOrArrayElementType(), 0};
1053 IndexedType =
Base->getType();
1078class StructAccessBase
1079 :
public ConstStmtVisitor<StructAccessBase, const Expr *> {
1080 const RecordDecl *ExpectedRD;
1082 bool IsExpectedRecordDecl(
const Expr *E)
const {
1090 StructAccessBase(
const RecordDecl *ExpectedRD) : ExpectedRD(ExpectedRD) {}
1109 const Expr *Visit(
const Expr *E) {
1110 return ConstStmtVisitor<StructAccessBase, const Expr *>::Visit(E);
1113 const Expr *VisitStmt(
const Stmt *S) {
return nullptr; }
1128 const Expr *VisitDeclRefExpr(
const DeclRefExpr *E) {
1129 return IsExpectedRecordDecl(E) ? E :
nullptr;
1131 const Expr *VisitMemberExpr(
const MemberExpr *E) {
1132 if (IsExpectedRecordDecl(E) && E->
isArrow())
1134 const Expr *Res = Visit(E->
getBase());
1135 return !Res && IsExpectedRecordDecl(E) ? E : Res;
1137 const Expr *VisitCompoundLiteralExpr(
const CompoundLiteralExpr *E) {
1138 return IsExpectedRecordDecl(E) ? E :
nullptr;
1140 const Expr *VisitCallExpr(
const CallExpr *E) {
1141 return IsExpectedRecordDecl(E) ? E :
nullptr;
1144 const Expr *VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
1145 if (IsExpectedRecordDecl(E))
1149 const Expr *VisitCastExpr(
const CastExpr *E) {
1151 return IsExpectedRecordDecl(E) ? E :
nullptr;
1154 const Expr *VisitParenExpr(
const ParenExpr *E) {
1157 const Expr *VisitUnaryAddrOf(
const UnaryOperator *E) {
1160 const Expr *VisitUnaryDeref(
const UnaryOperator *E) {
1173 int64_t FieldNo = -1;
1182 Indices.emplace_back(CGF.
Builder.getInt32(FieldNo));
1191 Indices.emplace_back(CGF.
Builder.getInt32(FieldNo));
1216 const Expr *StructBase = StructAccessBase(RD).Visit(
Base);
1220 llvm::Value *Res =
nullptr;
1225 Res =
Addr.emitRawPointer(*
this);
1226 }
else if (StructBase->
isLValue()) {
1229 Res =
Addr.emitRawPointer(*
this);
1236 if (Indices.empty())
1239 Indices.push_back(
Builder.getInt32(0));
1263 const Expr *ArrayExprBase,
1264 llvm::Value *IndexVal,
QualType IndexType,
1266 assert(
SanOpts.has(SanitizerKind::ArrayBounds) &&
1267 "should not be called unless adding bounds checks");
1272 *
this, ArrayExprBase, ArrayExprBaseType, StrictFlexArraysLevel);
1275 BoundsVal,
getContext().getSizeType(), Accessed);
1280 llvm::Value *IndexVal,
1282 llvm::Value *BoundsVal,
1283 QualType BoundsType,
bool Accessed) {
1287 auto CheckKind = SanitizerKind::SO_ArrayBounds;
1288 auto CheckHandler = SanitizerHandler::OutOfBounds;
1300 llvm::Value *IndexInst =
Builder.CreateIntCast(IndexVal, Ty, IndexSigned);
1301 llvm::Value *BoundsInst =
Builder.CreateIntCast(BoundsVal, Ty,
false);
1303 llvm::Constant *StaticData[] = {
1309 llvm::Value *Check = Accessed ?
Builder.CreateICmpULT(IndexInst, BoundsInst)
1310 :
Builder.CreateICmpULE(IndexInst, BoundsInst);
1315 BoundsVal, llvm::ConstantInt::get(BoundsVal->getType(), 0));
1319 EmitCheck(std::make_pair(Check, CheckKind), CheckHandler, StaticData,
1329 auto *TypeNameMD = MDB.createString(ATMD->TypeName);
1330 auto *ContainsPtrC =
Builder.getInt1(ATMD->ContainsPointer);
1331 auto *ContainsPtrMD = MDB.createConstant(ContainsPtrC);
1334 return llvm::MDNode::get(
CGM.getLLVMContext(), {TypeNameMD, ContainsPtrMD});
1338 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1339 "Only needed with -fsanitize=alloc-token");
1340 CB->setMetadata(llvm::LLVMContext::MD_alloc_token,
1352 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1353 "Only needed with -fsanitize=alloc-token");
1355 CB->setMetadata(llvm::LLVMContext::MD_alloc_token, MDN);
1360 bool isInc,
bool isPre) {
1363 llvm::Value *NextVal;
1365 uint64_t AmountVal = isInc ? 1 : -1;
1366 NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal,
true);
1369 NextVal =
Builder.CreateAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1372 llvm::APFloat FVal(
getContext().getFloatTypeSemantics(ElemTy), 1);
1378 NextVal =
Builder.CreateFAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1386 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
1391 return isPre ? IncVal : InVal;
1401 DI->EmitExplicitCastType(E->
getType());
1412 if (
auto *constantIdx = dyn_cast<llvm::ConstantInt>(idx)) {
1413 CharUnits offset = constantIdx->getZExtValue() * eltSize;
1427 assert(BO->
isAdditiveOp() &&
"Expect an addition or subtraction.");
1430 bool isSubtraction = BO->
getOpcode() == BO_Sub;
1433 llvm::Value *
index =
nullptr;
1437 std::swap(pointerOperand, indexOperand);
1449 BO, pointerOperand, pointer, indexOperand,
index, isSubtraction);
1456 nullptr, IsKnownNonNull);
1469 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
1470 if (
const auto *ECE = dyn_cast<ExplicitCastExpr>(CE))
1473 switch (CE->getCastKind()) {
1477 case CK_AddressSpaceConversion:
1478 if (
auto PtrTy = CE->getSubExpr()->getType()->getAs<
PointerType>()) {
1479 if (PtrTy->getPointeeType()->isVoidType())
1485 CE->getSubExpr(), &InnerBaseInfo, &InnerTBAAInfo, IsKnownNonNull);
1486 if (BaseInfo) *BaseInfo = InnerBaseInfo;
1487 if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
1493 E->
getType(), &TargetTypeBaseInfo, &TargetTypeTBAAInfo);
1501 BaseInfo->mergeForCast(TargetTypeBaseInfo);
1502 Addr.setAlignment(Align);
1506 if (CGF.
SanOpts.
has(SanitizerKind::CFIUnrelatedCast) &&
1507 CE->getCastKind() == CK_BitCast) {
1515 llvm::Type *ElemTy =
1517 Addr =
Addr.withElementType(ElemTy);
1518 if (CE->getCastKind() == CK_AddressSpaceConversion)
1528 case CK_ArrayToPointerDecay:
1532 case CK_UncheckedDerivedToBase:
1533 case CK_DerivedToBase: {
1540 CE->getSubExpr(), BaseInfo,
nullptr,
1542 CE->getCastKind() == CK_UncheckedDerivedToBase));
1543 auto Derived = CE->getSubExpr()->
getType()->getPointeeCXXRecordDecl();
1545 Addr, Derived, CE->path_begin(), CE->path_end(),
1558 if (UO->getOpcode() == UO_AddrOf) {
1559 LValue LV = CGF.
EmitLValue(UO->getSubExpr(), IsKnownNonNull);
1560 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1561 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1562 return LV.getAddress();
1567 if (
auto *
Call = dyn_cast<CallExpr>(E)) {
1568 switch (
Call->getBuiltinCallee()) {
1571 case Builtin::BIaddressof:
1572 case Builtin::BI__addressof:
1573 case Builtin::BI__builtin_addressof: {
1575 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1576 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1577 return LV.getAddress();
1583 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
1584 if (BO->isAdditiveOp())
1593 true, BaseInfo, TBAAInfo, IsKnownNonNull);
1603 if (IsKnownNonNull && !
Addr.isKnownNonNull())
1604 Addr.setKnownNonNull();
1611 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this,
V, MPT);
1612 return Builder.CreateICmpNE(
V, llvm::Constant::getNullValue(
V->getType()));
1623 llvm::Value *
U = llvm::UndefValue::get(EltTy);
1638 llvm_unreachable(
"bad evaluation kind");
1663 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1664 Base = CE->getSubExpr();
1665 }
else if (
const auto *PE = dyn_cast<ParenExpr>(
Base)) {
1666 Base = PE->getSubExpr();
1667 }
else if (
const auto *UO = dyn_cast<UnaryOperator>(
Base)) {
1668 if (UO->getOpcode() == UO_Extension)
1669 Base = UO->getSubExpr();
1687 if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
1690 SkippedChecks.
set(SanitizerKind::Alignment,
true);
1692 SkippedChecks.
set(SanitizerKind::Null,
true);
1719 CGM.runWithSufficientStackSpace(
1720 E->
getExprLoc(), [&] { LV = EmitLValueHelper(E, IsKnownNonNull); });
1727LValue CodeGenFunction::EmitLValueHelper(
const Expr *E,
1733 case Expr::ObjCPropertyRefExprClass:
1734 llvm_unreachable(
"cannot emit a property reference directly");
1736 case Expr::ObjCSelectorExprClass:
1738 case Expr::ObjCIsaExprClass:
1740 case Expr::BinaryOperatorClass:
1742 case Expr::CompoundAssignOperatorClass: {
1745 Ty = AT->getValueType();
1750 case Expr::CallExprClass:
1751 case Expr::CXXMemberCallExprClass:
1752 case Expr::CXXOperatorCallExprClass:
1753 case Expr::UserDefinedLiteralClass:
1755 case Expr::CXXRewrittenBinaryOperatorClass:
1758 case Expr::VAArgExprClass:
1760 case Expr::DeclRefExprClass:
1762 case Expr::ConstantExprClass: {
1768 case Expr::ParenExprClass:
1770 case Expr::GenericSelectionExprClass:
1773 case Expr::PredefinedExprClass:
1775 case Expr::StringLiteralClass:
1777 case Expr::ObjCEncodeExprClass:
1779 case Expr::PseudoObjectExprClass:
1781 case Expr::InitListExprClass:
1783 case Expr::CXXTemporaryObjectExprClass:
1784 case Expr::CXXConstructExprClass:
1786 case Expr::CXXBindTemporaryExprClass:
1788 case Expr::CXXUuidofExprClass:
1790 case Expr::LambdaExprClass:
1793 case Expr::ExprWithCleanupsClass: {
1795 RunCleanupsScope
Scope(*
this);
1796 LValue LV =
EmitLValue(cleanups->getSubExpr(), IsKnownNonNull);
1797 if (LV.isSimple()) {
1801 llvm::Value *
V =
Addr.getBasePointer();
1802 Scope.ForceCleanup({&
V});
1803 Addr.replaceBasePointer(
V);
1805 LV.getBaseInfo(), LV.getTBAAInfo());
1812 case Expr::CXXDefaultArgExprClass: {
1815 return EmitLValue(DAE->getExpr(), IsKnownNonNull);
1817 case Expr::CXXDefaultInitExprClass: {
1820 return EmitLValue(DIE->getExpr(), IsKnownNonNull);
1822 case Expr::CXXTypeidExprClass:
1825 case Expr::ObjCMessageExprClass:
1827 case Expr::ObjCIvarRefExprClass:
1829 case Expr::StmtExprClass:
1831 case Expr::UnaryOperatorClass:
1833 case Expr::ArraySubscriptExprClass:
1835 case Expr::MatrixSingleSubscriptExprClass:
1837 case Expr::MatrixSubscriptExprClass:
1839 case Expr::ArraySectionExprClass:
1841 case Expr::ExtVectorElementExprClass:
1843 case Expr::MatrixElementExprClass:
1845 case Expr::CXXThisExprClass:
1847 case Expr::MemberExprClass:
1849 case Expr::CompoundLiteralExprClass:
1851 case Expr::ConditionalOperatorClass:
1853 case Expr::BinaryConditionalOperatorClass:
1855 case Expr::ChooseExprClass:
1857 case Expr::OpaqueValueExprClass:
1859 case Expr::SubstNonTypeTemplateParmExprClass:
1862 case Expr::ImplicitCastExprClass:
1863 case Expr::CStyleCastExprClass:
1864 case Expr::CXXFunctionalCastExprClass:
1865 case Expr::CXXStaticCastExprClass:
1866 case Expr::CXXDynamicCastExprClass:
1867 case Expr::CXXReinterpretCastExprClass:
1868 case Expr::CXXConstCastExprClass:
1869 case Expr::CXXAddrspaceCastExprClass:
1870 case Expr::ObjCBridgedCastExprClass:
1873 case Expr::MaterializeTemporaryExprClass:
1876 case Expr::CoawaitExprClass:
1878 case Expr::CoyieldExprClass:
1880 case Expr::PackIndexingExprClass:
1882 case Expr::HLSLOutArgExprClass:
1883 llvm_unreachable(
"cannot emit a HLSL out argument directly");
1890 assert(
type.isCanonical());
1891 assert(!
type->isReferenceType());
1899 if (
const auto *RT = dyn_cast<RecordType>(
type))
1900 if (
const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
1901 RD = RD->getDefinitionOrSelf();
1902 if (RD->hasMutableFields() || !RD->isTrivial())
1924 if (
const auto *ref = dyn_cast<ReferenceType>(
type)) {
1948 }
else if (
const auto *var = dyn_cast<VarDecl>(
Value)) {
1958 bool resultIsReference;
1964 resultIsReference =
false;
1970 resultIsReference =
true;
1991 auto *MD = dyn_cast_or_null<CXXMethodDecl>(
CurCodeDecl);
1992 if (
isLambdaMethod(MD) && MD->getOverloadedOperator() == OO_Call) {
1995 if (
const VarDecl *VD = dyn_cast<const VarDecl>(D)) {
1996 if (!VD->hasAttr<CUDADeviceAttr>()) {
2019 if (resultIsReference)
2046 assert(
Constant &&
"not a constant");
2069 llvm::APInt &End,
bool StrictEnums,
bool StrictBool,
2072 bool IsRegularCPlusPlusEnum =
2073 CGF.
getLangOpts().CPlusPlus && StrictEnums && ED && !ED->isFixed();
2074 if (!IsBool && !IsRegularCPlusPlusEnum)
2083 ED->getValueRange(End,
Min);
2088llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
2089 llvm::APInt
Min, End;
2091 bool StrictBoolEnabled =
CGM.getCodeGenOpts().getLoadBoolFromMem() ==
2094 CGM.getCodeGenOpts().StrictEnums,
2095 StrictBoolEnabled, IsBool))
2099 return MDHelper.createRange(
Min, End);
2107 }
else if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2108 if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty)) {
2109 Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
2110 Load->setMetadata(llvm::LLVMContext::MD_noundef,
2111 llvm::MDNode::get(
CGM.getLLVMContext(), {}));
2118 bool HasBoolCheck =
SanOpts.has(SanitizerKind::Bool);
2119 bool HasEnumCheck =
SanOpts.has(SanitizerKind::Enum);
2120 if (!HasBoolCheck && !HasEnumCheck)
2125 bool NeedsBoolCheck = HasBoolCheck && IsBool;
2127 if (!NeedsBoolCheck && !NeedsEnumCheck)
2137 if (NeedsEnumCheck &&
2138 getContext().isTypeIgnoredBySanitizer(SanitizerKind::Enum, Ty))
2141 llvm::APInt
Min, End;
2147 NeedsEnumCheck ? SanitizerKind::SO_Enum : SanitizerKind::SO_Bool;
2150 auto CheckHandler = SanitizerHandler::LoadInvalidValue;
2155 Check =
Builder.CreateICmpULE(
Value, llvm::ConstantInt::get(Ctx, End));
2157 llvm::Value *Upper =
2158 Builder.CreateICmpSLE(
Value, llvm::ConstantInt::get(Ctx, End));
2159 llvm::Value *Lower =
2161 Check =
Builder.CreateAnd(Upper, Lower);
2165 EmitCheck(std::make_pair(Check, Kind), CheckHandler, StaticArgs,
Value);
2174 bool isNontemporal) {
2175 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2176 if (GV->isThreadLocal())
2182 if (ClangVecTy->isPackedVectorBoolType(
getContext())) {
2184 unsigned ValNumElems =
2187 auto *RawIntV =
Builder.CreateLoad(
Addr, Volatile,
"load_bits");
2188 const auto *RawIntTy = RawIntV->getType();
2189 assert(RawIntTy->isIntegerTy() &&
"compressed iN storage for bitvectors");
2191 auto *PaddedVecTy = llvm::FixedVectorType::get(
2192 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2193 llvm::Value *
V =
Builder.CreateBitCast(RawIntV, PaddedVecTy);
2206 if (VTy != NewVecTy) {
2208 llvm::Value *
V =
Builder.CreateLoad(Cast, Volatile,
"loadVecN");
2209 unsigned OldNumElements = VTy->getNumElements();
2211 std::iota(Mask.begin(), Mask.end(), 0);
2212 V =
Builder.CreateShuffleVector(
V, Mask,
"extractVec");
2227 llvm::LoadInst *Load =
Builder.CreateLoad(
Addr, Volatile);
2228 if (isNontemporal) {
2229 llvm::MDNode *Node = llvm::MDNode::get(
2230 Load->getContext(), llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2231 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2234 CGM.DecorateInstructionWithTBAA(Load, TBAAInfo);
2246 Ty = AtomicTy->getValueType();
2254 if (StoreTy->isVectorTy() && StoreTy->getScalarSizeInBits() >
2259 unsigned MemNumElems = StoreTy->getPrimitiveSizeInBits();
2280 Ty = AtomicTy->getValueType();
2286 auto *PaddedVecTy = llvm::FixedVectorType::get(
2287 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2297 if (HasBoolRep &&
CGM.getCodeGenOpts().isConvertingBoolWithCmp0()) {
2311 bool IsVector =
true) {
2312 auto *ArrayTy = dyn_cast<llvm::ArrayType>(
Addr.getElementType());
2313 if (ArrayTy && IsVector) {
2314 auto ArrayElements = ArrayTy->getNumElements();
2315 auto *ArrayElementTy = ArrayTy->getElementType();
2318 ArrayElementTy = VectorTy->getElementType();
2319 ArrayElements *= VectorTy->getNumElements();
2321 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
2323 return Addr.withElementType(VectorTy);
2325 auto *VectorTy = dyn_cast<llvm::VectorType>(
Addr.getElementType());
2326 if (VectorTy && !IsVector) {
2327 auto *ArrayTy = llvm::ArrayType::get(
2328 VectorTy->getElementType(),
2331 return Addr.withElementType(ArrayTy);
2343 "Result must be a Constant Matrix");
2348 if (LTy->getScalarSizeInBits() > Mat->getType()->getScalarSizeInBits())
2349 Mat =
Builder.CreateZExt(Mat, LTy);
2350 Builder.CreateStore(Mat, MatMem);
2368 for (uint32_t &Idx : Indices) {
2370 unsigned Row = Idx / NumCols;
2371 unsigned Col = Idx % NumCols;
2373 Idx = MT->getColumnMajorFlattenedIndex(Row, Col);
2377 if (
Base.isSimple()) {
2381 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
Base, *
this);
2383 llvm::Constant *CV =
2386 CV, ResultType,
Base.getBaseInfo(),
2389 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
2391 llvm::Constant *BaseElts =
Base.getExtVectorElts();
2394 for (
unsigned Index : Indices)
2395 CElts.push_back(BaseElts->getAggregateElement(Index));
2396 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
2409 value->getType()->isVectorTy());
2411 lvalue.getBaseInfo(), lvalue.getTBAAInfo(), isInit,
2412 lvalue.isNontemporal());
2419 bool isInit,
bool isNontemporal) {
2420 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2421 if (GV->isThreadLocal())
2429 if (
auto *VecTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
2431 CGM.getABIInfo().getOptimalVectorMemoryType(VecTy,
getLangOpts());
2432 if (!ClangVecTy->isPackedVectorBoolType(
getContext()) &&
2433 VecTy != NewVecTy) {
2435 VecTy->getNumElements());
2436 std::iota(Mask.begin(), Mask.begin() + VecTy->getNumElements(), 0);
2440 Mask,
"extractVec");
2443 if (
Addr.getElementType() != SrcTy)
2444 Addr =
Addr.withElementType(SrcTy);
2461 if (isNontemporal) {
2462 llvm::MDNode *Node =
2463 llvm::MDNode::get(Store->getContext(),
2464 llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2465 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2468 CGM.DecorateInstructionWithTBAA(Store, TBAAInfo);
2487 assert(LV.getType()->isConstantMatrixType());
2497 LV.setAddress(
Addr);
2513 llvm_unreachable(
"bad evaluation kind");
2579 EltTy = MatTy->getElementType();
2580 if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2581 llvm::MatrixBuilder MB(
Builder);
2582 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2585 llvm::LoadInst *Load =
2587 llvm::Value *Elt =
Builder.CreateExtractElement(Load, Idx,
"matrixext");
2596 unsigned NumLanes = NumCols;
2600 llvm::Constant *ColConstsIndices =
nullptr;
2601 llvm::MatrixBuilder MB(
Builder);
2605 NumLanes = llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2609 llvm::Type *RowTy = llvm::FixedVectorType::get(ElemTy, NumLanes);
2610 llvm::Value *
Result = llvm::PoisonValue::get(RowTy);
2612 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2613 llvm::Value *ColIdx;
2614 if (ColConstsIndices)
2615 ColIdx = ColConstsIndices->getAggregateElement(Col);
2617 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2619 llvm::Value *EltIndex =
2620 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2621 llvm::Value *Elt =
Builder.CreateExtractElement(MatrixVec, EltIndex);
2622 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2629 assert(LV.
isBitField() &&
"Unknown LValue type!");
2647 const unsigned StorageSize =
2650 assert(
static_cast<unsigned>(Offset + Info.
Size) <= StorageSize);
2651 unsigned HighBits = StorageSize - Offset - Info.
Size;
2653 Val =
Builder.CreateShl(Val, HighBits,
"bf.shl");
2654 if (Offset + HighBits)
2655 Val =
Builder.CreateAShr(Val, Offset + HighBits,
"bf.ashr");
2658 Val =
Builder.CreateLShr(Val, Offset,
"bf.lshr");
2659 if (
static_cast<unsigned>(Offset) + Info.
Size < StorageSize)
2661 Val, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
"bf.clear");
2677 llvm::Type *DstTy = llvm::FixedVectorType::get(Vec->getType(), 1);
2678 llvm::Value *
Zero = llvm::Constant::getNullValue(
CGM.Int64Ty);
2679 Vec =
Builder.CreateInsertElement(DstTy, Vec,
Zero,
"cast.splat");
2689 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
2691 llvm::Value *Element =
Builder.CreateExtractElement(Vec, Elt);
2694 if (Element->getType()->getPrimitiveSizeInBits() >
2695 LVTy->getPrimitiveSizeInBits()) {
2697 CGM.getCodeGenOpts().isConvertingBoolWithCmp0())
2698 Element =
Builder.CreateICmpNE(
2699 Element, llvm::Constant::getNullValue(Element->getType()));
2701 Element =
Builder.CreateTrunc(Element, LVTy);
2711 for (
unsigned i = 0; i != NumResultElts; ++i)
2714 Vec =
Builder.CreateShuffleVector(Vec, Mask);
2717 if (
CGM.getCodeGenOpts().isConvertingBoolWithCmp0())
2718 Vec =
Builder.CreateICmpNE(Vec,
2719 llvm::Constant::getNullValue(Vec->getType()));
2731 llvm::Type *VectorElementTy =
CGM.getTypes().ConvertType(EQT);
2739 Builder.CreateConstInBoundsGEP(CastToPointerElement, ix,
2742 return VectorBasePtrPlusIx;
2748 "Bad type for register variable");
2753 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(LV.
getType());
2754 llvm::Type *Ty = OrigTy;
2755 if (OrigTy->isPointerTy())
2756 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
2757 llvm::Type *Types[] = { Ty };
2759 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
2761 F, llvm::MetadataAsValue::get(Ty->getContext(), RegName));
2762 if (OrigTy->isPointerTy())
2780 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2782 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2784 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2785 "vector element type must be at least byte-sized");
2788 if (Val->getType()->getPrimitiveSizeInBits() <
2789 ElemTy->getScalarSizeInBits())
2790 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2793 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2795 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2803 llvm::Type *VecTy = Vec->getType();
2806 if (VecTy->isVectorTy() && SrcVal->getType()->getPrimitiveSizeInBits() <
2807 VecTy->getScalarSizeInBits())
2808 SrcVal =
Builder.CreateZExt(SrcVal, VecTy->getScalarType());
2810 auto *IRStoreTy = dyn_cast<llvm::IntegerType>(Vec->getType());
2812 auto *IRVecTy = llvm::FixedVectorType::get(
2813 Builder.getInt1Ty(), IRStoreTy->getPrimitiveSizeInBits());
2814 Vec =
Builder.CreateBitCast(Vec, IRVecTy);
2821 if (
auto *EltTy = dyn_cast<llvm::FixedVectorType>(SrcVal->getType());
2822 EltTy && EltTy->getNumElements() == 1)
2823 SrcVal =
Builder.CreateBitCast(SrcVal, EltTy->getElementType());
2829 Vec =
Builder.CreateBitCast(Vec, IRStoreTy);
2853 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2855 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2857 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2858 "matrix element type must be at least byte-sized");
2861 if (Val->getType()->getPrimitiveSizeInBits() <
2862 ElemTy->getScalarSizeInBits())
2863 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2866 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2868 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2874 if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2876 llvm::MatrixBuilder MB(
Builder);
2877 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2882 Builder.CreateInsertElement(Load, InsertVal, Idx,
"matins");
2893 "Store through matrix row LValues is only implemented for HLSL!");
2899 unsigned NumLanes = NumCols;
2903 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2907 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2908 "matrix element type must be at least byte-sized");
2911 if (RowVal->getType()->getScalarType()->getPrimitiveSizeInBits() <
2912 ElemTy->getScalarSizeInBits()) {
2914 llvm::Type *StorageElmTy = llvm::FixedVectorType::get(
2915 ElemTy->getScalarType(), RowValVecTy->getNumElements());
2916 RowVal =
Builder.CreateZExt(RowVal, StorageElmTy);
2919 llvm::MatrixBuilder MB(
Builder);
2921 llvm::Constant *ColConstsIndices =
nullptr;
2925 llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2930 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2931 llvm::Value *ColIdx;
2932 if (ColConstsIndices)
2933 ColIdx = ColConstsIndices->getAggregateElement(Col);
2935 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2937 llvm::Value *EltIndex =
2938 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2939 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2940 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2941 llvm::Value *NewElt =
Builder.CreateExtractElement(RowVal, Lane);
2943 Builder.CreateGEP(DstAddr, {
Zero, EltIndex}, DestAddrTy, ElemAlign);
2950 assert(Dst.
isBitField() &&
"Unknown LValue type");
2965 llvm_unreachable(
"present but none");
3000 CGM.getObjCRuntime().EmitObjCWeakAssign(*
this, src, LvalueDst);
3013 RHS =
Builder.CreatePtrToInt(RHS, ResultType,
"sub.ptr.rhs.cast");
3015 ResultType,
"sub.ptr.lhs.cast");
3016 llvm::Value *BytesBetween =
Builder.CreateSub(LHS, RHS,
"ivar.offset");
3017 CGM.getObjCRuntime().EmitObjCIvarAssign(*
this, src, dst, BytesBetween);
3019 CGM.getObjCRuntime().EmitObjCGlobalAssign(*
this, src, LvalueDst,
3023 CGM.getObjCRuntime().EmitObjCStrongCastAssign(*
this, src, LvalueDst);
3027 assert(Src.
isScalar() &&
"Can't emit an agg store with this method");
3043 llvm::Value *MaskedVal = SrcVal;
3045 const bool UseVolatile =
3048 const unsigned StorageSize =
3053 if (StorageSize != Info.
Size) {
3054 assert(StorageSize > Info.
Size &&
"Invalid bitfield size.");
3061 SrcVal, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
3065 SrcVal =
Builder.CreateShl(SrcVal, Offset,
"bf.shl");
3069 Val, ~llvm::APInt::getBitsSet(StorageSize, Offset, Offset + Info.
Size),
3073 SrcVal =
Builder.CreateOr(Val, SrcVal,
"bf.set");
3075 assert(Offset == 0);
3082 CGM.getCodeGenOpts().ForceAAPCSBitfieldLoad)
3083 Builder.CreateLoad(Ptr,
true,
"bf.load");
3092 llvm::Value *ResultVal = MaskedVal;
3096 assert(Info.
Size <= StorageSize);
3097 unsigned HighBits = StorageSize - Info.
Size;
3099 ResultVal =
Builder.CreateShl(ResultVal, HighBits,
"bf.result.shl");
3100 ResultVal =
Builder.CreateAShr(ResultVal, HighBits,
"bf.result.ashr");
3116 SrcVal->getType()->getScalarSizeInBits())
3125 if (!DestAddrTy->isVectorTy()) {
3127 "this should only occur for non-vector l-values");
3140 CGM.getDataLayout().getPrefTypeAlign(DestAddrTy->getScalarType()));
3141 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
3143 for (
unsigned I = 0; I != NumSrcElts; ++I) {
3144 llvm::Value *Val = VTy ?
Builder.CreateExtractElement(
3145 SrcVal, llvm::ConstantInt::get(
Int32Ty, I))
3152 DstElemAddr =
Builder.CreateGEP(
3153 DstAddr, {
Zero, llvm::ConstantInt::get(
Int32Ty, FieldNo)},
3154 DestAddrTy, ElemAlign);
3163 llvm::Type *VecTy = Vec->getType();
3166 unsigned NumSrcElts = VTy->getNumElements();
3168 if (NumDstElts == NumSrcElts) {
3173 for (
unsigned i = 0; i != NumSrcElts; ++i)
3176 Vec =
Builder.CreateShuffleVector(SrcVal, Mask);
3177 }
else if (NumDstElts > NumSrcElts) {
3183 for (
unsigned i = 0; i != NumSrcElts; ++i)
3184 ExtMask.push_back(i);
3185 ExtMask.resize(NumDstElts, -1);
3186 llvm::Value *ExtSrcVal =
Builder.CreateShuffleVector(SrcVal, ExtMask);
3189 for (
unsigned i = 0; i != NumDstElts; ++i)
3199 for (
unsigned i = 0; i != NumSrcElts; ++i)
3201 Vec =
Builder.CreateShuffleVector(Vec, ExtSrcVal, Mask);
3204 llvm_unreachable(
"unexpected shorten vector length");
3210 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
3212 Vec =
Builder.CreateInsertElement(Vec, SrcVal, Elt);
3222 "Bad type for register variable");
3225 assert(RegName &&
"Register LValue is not metadata");
3228 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(Dst.
getType());
3229 llvm::Type *Ty = OrigTy;
3230 if (OrigTy->isPointerTy())
3231 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
3232 llvm::Type *Types[] = { Ty };
3234 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::write_register, Types);
3236 if (OrigTy->isPointerTy())
3239 F, {llvm::MetadataAsValue::get(Ty->getContext(), RegName),
Value});
3247 bool IsMemberAccess=
false) {
3259 LV.setObjCIvar(
false);
3263 LV.setObjCIvar(
true);
3265 LV.setBaseIvarExp(Exp->getBase());
3270 if (
const auto *Exp = dyn_cast<DeclRefExpr>(E)) {
3271 if (
const auto *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
3272 if (VD->hasGlobalStorage()) {
3273 LV.setGlobalObjCRef(
true);
3281 if (
const auto *Exp = dyn_cast<UnaryOperator>(E)) {
3286 if (
const auto *Exp = dyn_cast<ParenExpr>(E)) {
3288 if (LV.isObjCIvar()) {
3295 LV.setObjCIvar(
false);
3300 if (
const auto *Exp = dyn_cast<GenericSelectionExpr>(E)) {
3305 if (
const auto *Exp = dyn_cast<ImplicitCastExpr>(E)) {
3310 if (
const auto *Exp = dyn_cast<CStyleCastExpr>(E)) {
3315 if (
const auto *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
3320 if (
const auto *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
3322 if (LV.isObjCIvar() && !LV.isObjCArray())
3325 LV.setObjCIvar(
false);
3326 else if (LV.isGlobalObjCRef() && !LV.isObjCArray())
3329 LV.setGlobalObjCRef(
false);
3333 if (
const auto *Exp = dyn_cast<MemberExpr>(E)) {
3347 CGF, VD,
Addr, Loc);
3352 Addr =
Addr.withElementType(RealVarTy);
3358 std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
3359 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
3364 if (!Res || *Res == OMPDeclareTargetDeclAttr::MT_Local ||
3365 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3366 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3369 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3370 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3371 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3373 "Expected link clause OR to clause with unified memory enabled.");
3383 llvm::LoadInst *Load =
3388 PTy, PointeeBaseInfo, PointeeTBAAInfo,
true);
3391 llvm::MDBuilder MDB(Ctx);
3393 if (
CGM.getTypes().getTargetAddressSpace(PTy) == 0 &&
3394 !
CGM.getCodeGenOpts().NullPointerIsValid)
3395 Load->setMetadata(llvm::LLVMContext::MD_nonnull,
3396 llvm::MDNode::get(Ctx, {}));
3402 llvm::LLVMContext::MD_align,
3403 llvm::MDNode::get(Ctx, MDB.createConstant(llvm::ConstantInt::get(
3404 Builder.getInt64Ty(), AlignVal))));
3409 true, PointeeBaseInfo,
3419 PointeeBaseInfo, PointeeTBAAInfo);
3429 BaseInfo, TBAAInfo);
3459 std::optional<LValue> LV =
3468 V = CGF.
Builder.CreateThreadLocalAddress(
V);
3476 VD->
hasAttr<OMPThreadPrivateDeclAttr>()) {
3491 if (FD->
hasAttr<WeakRefAttr>()) {
3506 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
V))
3507 V = llvm::NoCFIValue::get(GV);
3514 llvm::Value *ThisValue) {
3527 AsmLabelAttr *
Asm = VD->
getAttr<AsmLabelAttr>();
3528 assert(
Asm->getLabel().size() < 64-Name.size() &&
3529 "Register name too big");
3530 Name.append(
Asm->getLabel());
3531 llvm::NamedMDNode *M =
3532 CGM.
getModule().getOrInsertNamedMetadata(Name);
3533 if (M->getNumOperands() == 0) {
3536 llvm::Metadata *Ops[] = {Str};
3543 llvm::MetadataAsValue::get(CGM.
getLLVMContext(), M->getOperand(0));
3586 case llvm::GlobalValue::ExternalLinkage:
3587 case llvm::GlobalValue::LinkOnceODRLinkage:
3588 case llvm::GlobalValue::WeakODRLinkage:
3589 case llvm::GlobalValue::InternalLinkage:
3590 case llvm::GlobalValue::PrivateLinkage:
3602 "should not emit an unevaluated operand");
3604 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3607 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
3615 (VD->getType()->isReferenceType() ||
3617 VD->getAnyInitializer(VD);
3619 E->
getLocation(), *VD->evaluateValue(), VD->getType());
3620 assert(Val &&
"failed to emit constant expression");
3623 if (!VD->getType()->isReferenceType()) {
3625 Addr =
CGM.createUnnamedGlobalFrom(*VD, Val,
3628 auto *PTy = llvm::PointerType::get(
3647 VD = VD->getCanonicalDecl();
3651 auto I = LocalDeclMap.find(VD);
3652 if (I != LocalDeclMap.end()) {
3654 if (VD->getType()->isReferenceType())
3662 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3679 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3695 "Should not use decl without marking it used!");
3697 if (ND->
hasAttr<WeakRefAttr>()) {
3703 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3705 if (VD->hasLinkage() || VD->isStaticDataMember())
3711 auto iter = LocalDeclMap.find(VD);
3712 if (iter != LocalDeclMap.end()) {
3713 addr = iter->second;
3717 }
else if (VD->isStaticLocal()) {
3718 llvm::Constant *var =
CGM.getOrCreateStaticVarDecl(
3719 *VD,
CGM.getLLVMLinkageVarDefinition(VD));
3725 llvm_unreachable(
"DeclRefExpr for Decl not entered in LocalDeclMap?");
3736 VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
3743 bool isBlockByref = VD->isEscapingByref();
3749 LValue LV = VD->getType()->isReferenceType() ?
3753 bool isLocalStorage = VD->hasLocalStorage();
3755 bool NonGCable = isLocalStorage &&
3756 !VD->getType()->isReferenceType() &&
3763 bool isImpreciseLifetime =
3764 (isLocalStorage && !VD->hasAttr<ObjCPreciseLifetimeAttr>());
3765 if (isImpreciseLifetime)
3771 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
3777 if (
const auto *BD = dyn_cast<BindingDecl>(ND)) {
3794 if (
const auto *GD = dyn_cast<MSGuidDecl>(ND))
3798 if (
const auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
3802 if (AS != T.getAddressSpace()) {
3805 llvm::PointerType::get(
CGM.getLLVMContext(), TargetAS);
3806 llvm::Constant *ASC =
CGM.performAddrSpaceCast(ATPO.
getPointer(), PtrTy);
3813 llvm_unreachable(
"Unhandled DeclRefExpr");
3823 default: llvm_unreachable(
"Unknown unary operator lvalue!");
3826 assert(!T.isNull() &&
"CodeGenFunction::EmitUnaryOpLValue: Illegal type");
3848 assert(LV.
isSimple() &&
"real/imag on non-ordinary l-value");
3865 CGM.getTBAAInfoForSubobject(LV, T));
3872 bool isInc = E->
getOpcode() == UO_PreInc;
3895 assert(SL !=
nullptr &&
"No StringLiteral name in PredefinedExpr");
3896 StringRef FnName =
CurFn->getName();
3897 FnName.consume_front(
"\01");
3898 StringRef NameItems[] = {
3900 std::string GVName = llvm::join(NameItems, NameItems + 2,
".");
3901 if (
auto *BD = dyn_cast_or_null<BlockDecl>(
CurCodeDecl)) {
3902 std::string Name = std::string(SL->getString());
3903 if (!Name.empty()) {
3904 unsigned Discriminator =
3905 CGM.getCXXABI().getMangleContext().getBlockId(BD,
true);
3907 Name +=
"_" + Twine(Discriminator + 1).str();
3908 auto C =
CGM.GetAddrOfConstantCString(Name, GVName);
3911 auto C =
CGM.GetAddrOfConstantCString(std::string(FnName), GVName);
3915 auto C =
CGM.GetAddrOfConstantStringFromLiteral(SL, GVName);
3932 if (llvm::Constant *
C =
CGM.getTypeDescriptorFromMap(T))
3937 bool IsBitInt =
false;
3939 if (T->isIntegerType()) {
3942 (T->isSignedIntegerType() ? 1 : 0);
3946 if (T->isSignedIntegerType() && T->getAs<
BitIntType>()) {
3949 " non positive amount of bits in __BitInt type");
3951 " too many bits in __BitInt type");
3958 }
else if (T->isFloatingType()) {
3967 (
intptr_t)T.getAsOpaquePtr(), StringRef(),
3968 StringRef(), {}, Buffer, {});
3973 char S[6] = {
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'};
3976 llvm::support::endian::write32(S + 1, Bits,
3978 ? llvm::endianness::big
3979 : llvm::endianness::little);
3980 StringRef Str = StringRef(S,
sizeof(S) /
sizeof(
decltype(S[0])));
3984 llvm::Constant *Components[] = {
3988 llvm::Constant *Descriptor = llvm::ConstantStruct::getAnon(Components);
3990 auto *GV =
new llvm::GlobalVariable(
3991 CGM.getModule(), Descriptor->getType(),
3992 true, llvm::GlobalVariable::PrivateLinkage, Descriptor);
3993 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3994 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(GV);
3997 CGM.setTypeDescriptorInMap(T, GV);
4005 if (
V->getType() == TargetTy)
4010 if (
V->getType()->isFloatingPointTy()) {
4011 unsigned Bits =
V->getType()->getPrimitiveSizeInBits().getFixedValue();
4012 if (Bits <= TargetTy->getIntegerBitWidth())
4018 if (
V->getType()->isIntegerTy() &&
4019 V->getType()->getIntegerBitWidth() <= TargetTy->getIntegerBitWidth())
4020 return Builder.CreateZExt(
V, TargetTy);
4023 if (!
V->getType()->isPointerTy()) {
4028 return Builder.CreatePtrToInt(
V, TargetTy);
4041 llvm::Constant *Filename;
4048 int PathComponentsToStrip =
4049 CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;
4050 if (PathComponentsToStrip < 0) {
4051 assert(PathComponentsToStrip !=
INT_MIN);
4052 int PathComponentsToKeep = -PathComponentsToStrip;
4053 auto I = llvm::sys::path::rbegin(FilenameString);
4054 auto E = llvm::sys::path::rend(FilenameString);
4055 while (I != E && --PathComponentsToKeep)
4058 FilenameString = FilenameString.substr(I - E);
4059 }
else if (PathComponentsToStrip > 0) {
4060 auto I = llvm::sys::path::begin(FilenameString);
4061 auto E = llvm::sys::path::end(FilenameString);
4062 while (I != E && PathComponentsToStrip--)
4067 FilenameString.substr(I - llvm::sys::path::begin(FilenameString));
4069 FilenameString = llvm::sys::path::filename(FilenameString);
4073 CGM.GetAddrOfConstantCString(std::string(FilenameString),
".src");
4074 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(
4076 FilenameGV.getPointer()->stripPointerCasts()));
4077 Filename = FilenameGV.getPointer();
4081 Filename = llvm::Constant::getNullValue(
Int8PtrTy);
4088 return llvm::ConstantStruct::getAnon(
Data);
4093enum class CheckRecoverableKind {
4104static CheckRecoverableKind
4106 if (Ordinal == SanitizerKind::SO_Vptr)
4107 return CheckRecoverableKind::AlwaysRecoverable;
4108 else if (Ordinal == SanitizerKind::SO_Return ||
4109 Ordinal == SanitizerKind::SO_Unreachable)
4110 return CheckRecoverableKind::Unrecoverable;
4112 return CheckRecoverableKind::Recoverable;
4116struct SanitizerHandlerInfo {
4117 char const *
const Name;
4123#define SANITIZER_CHECK(Enum, Name, Version, Msg) {#Name, Version},
4125#undef SANITIZER_CHECK
4129 llvm::FunctionType *FnType,
4132 CheckRecoverableKind RecoverKind,
bool IsFatal,
4133 llvm::BasicBlock *ContBB,
bool NoMerge) {
4134 assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
4135 std::optional<ApplyDebugLocation> DL;
4136 if (!CGF.
Builder.getCurrentDebugLocation()) {
4140 bool NeedsAbortSuffix =
4141 IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
4143 bool HandlerPreserveAllRegs =
4146 const StringRef CheckName = CheckInfo.Name;
4147 std::string FnName =
"__ubsan_handle_" + CheckName.str();
4148 if (CheckInfo.Version && !MinimalRuntime)
4149 FnName +=
"_v" + llvm::utostr(CheckInfo.Version);
4151 FnName +=
"_minimal";
4152 if (NeedsAbortSuffix)
4154 if (HandlerPreserveAllRegs && !NeedsAbortSuffix)
4155 FnName +=
"_preserve";
4157 !IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
4161 B.addAttribute(llvm::Attribute::NoReturn)
4162 .addAttribute(llvm::Attribute::NoUnwind);
4164 B.addUWTableAttr(llvm::UWTableKind::Default);
4169 llvm::AttributeList::FunctionIndex, B),
4175 HandlerCall->addFnAttr(llvm::Attribute::NoMerge);
4176 if (HandlerPreserveAllRegs && !NeedsAbortSuffix) {
4178 HandlerCall->setCallingConv(llvm::CallingConv::PreserveAll);
4181 HandlerCall->setDoesNotReturn();
4182 CGF.
Builder.CreateUnreachable();
4189 ArrayRef<std::pair<llvm::Value *, SanitizerKind::SanitizerOrdinal>> Checked,
4193 assert(Checked.size() > 0);
4194 assert(CheckHandler >= 0 &&
4198 llvm::Value *FatalCond =
nullptr;
4199 llvm::Value *RecoverableCond =
nullptr;
4200 llvm::Value *TrapCond =
nullptr;
4201 bool NoMerge =
false;
4208 for (
auto &[Check, Ord] : Checked) {
4209 llvm::Value *GuardedCheck = Check;
4211 (
CGM.getCodeGenOpts().SanitizeSkipHotCutoffs[Ord] > 0)) {
4213 CGM.getIntrinsic(llvm::Intrinsic::allow_ubsan_check),
4214 llvm::ConstantInt::get(
CGM.Int8Ty, Ord));
4219 llvm::Value *&
Cond =
CGM.getCodeGenOpts().SanitizeTrap.has(Ord) ? TrapCond
4220 :
CGM.getCodeGenOpts().SanitizeRecover.has(Ord)
4225 if (!
CGM.getCodeGenOpts().SanitizeMergeHandlers.has(Ord))
4231 if (!FatalCond && !RecoverableCond)
4234 llvm::Value *JointCond;
4235 if (FatalCond && RecoverableCond)
4236 JointCond =
Builder.CreateAnd(FatalCond, RecoverableCond);
4238 JointCond = FatalCond ? FatalCond : RecoverableCond;
4242 assert(
SanOpts.has(Checked[0].second));
4244 for (
int i = 1, n = Checked.size(); i < n; ++i) {
4246 "All recoverable kinds in a single check must be same!");
4247 assert(
SanOpts.has(Checked[i].second));
4253 llvm::Instruction *Branch =
Builder.CreateCondBr(JointCond, Cont, Handlers);
4256 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4257 Branch->setMetadata(llvm::LLVMContext::MD_prof, Node);
4261 if (
CGM.getCodeGenOpts().SanitizeMinimalRuntime) {
4272 Args.reserve(DynamicArgs.size() + 1);
4273 ArgTypes.reserve(DynamicArgs.size() + 1);
4276 if (!StaticArgs.empty()) {
4277 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4278 auto *InfoPtr =
new llvm::GlobalVariable(
4279 CGM.getModule(), Info->getType(),
4282 false, llvm::GlobalVariable::PrivateLinkage, Info,
"",
4283 nullptr, llvm::GlobalVariable::NotThreadLocal,
4284 CGM.getDataLayout().getDefaultGlobalsAddressSpace());
4285 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4286 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4287 Args.push_back(InfoPtr);
4288 ArgTypes.push_back(Args.back()->getType());
4291 for (llvm::Value *DynamicArg : DynamicArgs) {
4296 llvm::FunctionType *FnType =
4297 llvm::FunctionType::get(
CGM.VoidTy, ArgTypes,
false);
4299 if (!FatalCond || !RecoverableCond) {
4303 (FatalCond !=
nullptr), Cont, NoMerge);
4307 llvm::BasicBlock *NonFatalHandlerBB =
4310 Builder.CreateCondBr(FatalCond, NonFatalHandlerBB, FatalHandlerBB);
4313 NonFatalHandlerBB, NoMerge);
4324 llvm::ConstantInt *TypeId, llvm::Value *Ptr,
4329 llvm::CondBrInst *BI =
Builder.CreateCondBr(
Cond, Cont, CheckBB);
4332 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4333 BI->setMetadata(llvm::LLVMContext::MD_prof, Node);
4337 bool WithDiag = !
CGM.getCodeGenOpts().SanitizeTrap.has(Ordinal);
4339 llvm::CallInst *CheckCall;
4340 llvm::FunctionCallee SlowPathFn;
4342 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4344 new llvm::GlobalVariable(
CGM.getModule(), Info->getType(),
false,
4345 llvm::GlobalVariable::PrivateLinkage, Info);
4346 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4347 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4349 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4350 "__cfi_slowpath_diag",
4353 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr, InfoPtr});
4355 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4358 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr});
4363 CheckCall->setDoesNotThrow();
4371 llvm::Module *M = &
CGM.getModule();
4373 QualType QInt64Ty =
C.getIntTypeForBitwidth(64,
false);
4375 auto *ArgCallsiteTypeId =
4379 auto *ArgCFICheckFailData =
4383 CGM.getTypes().arrangeBuiltinFunctionDeclaration(
C.VoidTy,
FnArgs);
4385 llvm::Function *F = llvm::Function::Create(
4387 llvm::GlobalValue::WeakAnyLinkage,
"__cfi_check", M);
4389 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4390 F->setAlignment(llvm::Align(4096));
4393 llvm::LLVMContext &Ctx = M->getContext();
4394 llvm::BasicBlock *BB = llvm::BasicBlock::Create(Ctx,
"entry", F);
4397 llvm::CallInst::Create(M->getFunction(
"__cfi_check_fail"), Args,
"", BB);
4398 llvm::ReturnInst::Create(Ctx,
nullptr, BB);
4409 auto CheckHandler = SanitizerHandler::CFICheckFail;
4416 {SanitizerKind::SO_CFIVCall, SanitizerKind::SO_CFINVCall,
4417 SanitizerKind::SO_CFIDerivedCast, SanitizerKind::SO_CFIUnrelatedCast,
4418 SanitizerKind::SO_CFIICall},
4429 llvm::Function *F = llvm::Function::Create(
4431 llvm::GlobalValue::WeakODRLinkage,
"__cfi_check_fail", &
CGM.getModule());
4434 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4435 F->setVisibility(llvm::GlobalValue::HiddenVisibility);
4449 CGM.getContext().VoidPtrTy, ArgData->getLocation());
4452 CGM.getContext().VoidPtrTy, ArgAddr->getLocation());
4455 llvm::Value *DataIsNotNullPtr =
4460 EmitTrapCheck(DataIsNotNullPtr, SanitizerHandler::CFICheckFail,
4463 llvm::StructType *SourceLocationTy =
4465 llvm::StructType *CfiCheckFailDataTy =
4468 llvm::Value *
V =
Builder.CreateConstGEP2_32(
4472 llvm::Value *CheckKind =
Builder.CreateLoad(CheckKindAddr);
4474 llvm::Value *AllVtables = llvm::MetadataAsValue::get(
4475 CGM.getLLVMContext(),
4476 llvm::MDString::get(
CGM.getLLVMContext(),
"all-vtables"));
4477 llvm::Value *ValidVtable =
Builder.CreateZExt(
4478 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::type_test),
4479 {Addr, AllVtables}),
4482 const std::pair<int, SanitizerKind::SanitizerOrdinal> CheckKinds[] = {
4489 for (
auto CheckKindOrdinalPair : CheckKinds) {
4490 int Kind = CheckKindOrdinalPair.first;
4497 Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(
Int8Ty, Kind));
4498 if (
CGM.getLangOpts().Sanitize.has(Ordinal))
4499 EmitCheck(std::make_pair(
Cond, Ordinal), SanitizerHandler::CFICheckFail,
4512 CGM.addUsedGlobal(F);
4516 if (
SanOpts.has(SanitizerKind::Unreachable)) {
4517 auto CheckOrdinal = SanitizerKind::SO_Unreachable;
4518 auto CheckHandler = SanitizerHandler::BuiltinUnreachable;
4534 if ((
int)TrapBBs.size() <= CheckHandlerID)
4535 TrapBBs.resize(CheckHandlerID + 1);
4537 llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
4539 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
4540 llvm::StringRef TrapMessage;
4541 llvm::StringRef TrapCategory;
4542 auto DebugTrapReasonKind =
CGM.getCodeGenOpts().getSanitizeDebugTrapReasons();
4544 DebugTrapReasonKind ==
4550 TrapCategory =
"Undefined Behavior Sanitizer";
4554 DebugTrapReasonKind !=
4558 TrapLocation, TrapCategory, TrapMessage);
4561 NoMerge = NoMerge || !
CGM.getCodeGenOpts().isOptimizedBuild() ||
4565 if (TrapBB && !NoMerge) {
4566 auto Call = TrapBB->begin();
4569 Call->applyMergedLocation(
Call->getDebugLoc(), TrapLocation);
4571 Builder.CreateCondBr(Checked, Cont, TrapBB,
4572 MDHelper.createLikelyBranchWeights());
4575 Builder.CreateCondBr(Checked, Cont, TrapBB,
4576 MDHelper.createLikelyBranchWeights());
4581 llvm::CallInst *TrapCall;
4582 if (
CGM.getCodeGenOpts().SanitizeTrapLoop)
4584 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::looptrap));
4586 TrapCall =
Builder.CreateCall(
4587 CGM.getIntrinsic(llvm::Intrinsic::ubsantrap),
4588 llvm::ConstantInt::get(
CGM.Int8Ty, CheckHandlerID));
4590 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4591 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4592 CGM.getCodeGenOpts().TrapFuncName);
4593 TrapCall->addFnAttr(A);
4596 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4597 TrapCall->setDoesNotReturn();
4598 TrapCall->setDoesNotThrow();
4606 llvm::CallInst *TrapCall =
4607 Builder.CreateCall(
CGM.getIntrinsic(IntrID));
4609 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4610 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4611 CGM.getCodeGenOpts().TrapFuncName);
4612 TrapCall->addFnAttr(A);
4616 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4624 "Array to pointer decay must have array source type!");
4633 Addr =
Addr.withElementType(NewTy);
4639 "Expected pointer to array");
4645 Builder.CreateStructuredGEP(NewTy,
Addr.emitRawPointer(*
this), {});
4659 if (TBAAInfo) *TBAAInfo =
CGM.getTBAAAccessInfo(EltType);
4668 const auto *CE = dyn_cast<CastExpr>(E);
4669 if (!CE || CE->getCastKind() != CK_ArrayToPointerDecay)
4681 llvm::Type *elemType,
4687 const llvm::Twine &name =
"arrayidx") {
4688 if (inbounds && CGF.
getLangOpts().EmitLogicalPointer)
4689 return CGF.
Builder.CreateStructuredGEP(elemType, ptr, indices);
4703 llvm::Type *elementType,
bool inbounds,
4706 const llvm::Twine &name =
"arrayidx") {
4707 if (inbounds && CGF.
getLangOpts().EmitLogicalPointer)
4710 indices.drop_front()),
4711 elementType, align);
4732 return D && D->
hasAttr<BPFPreserveStaticOffsetAttr>();
4739 if (PointeeType.
isNull())
4752 llvm::Function *Fn =
4754 llvm::CallInst *
Call = CGF.
Builder.CreateCall(Fn, {
Addr.emitRawPointer(CGF)});
4772 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4773 return ME->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>();
4775 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
4776 const auto *VarDef = dyn_cast<VarDecl>(DRE->getDecl());
4780 const auto *PtrT = VarDef->getType()->getAs<
PointerType>();
4786 if (
const auto *RecT = dyn_cast<RecordType>(PointeeT))
4787 return RecT->getDecl()
4788 ->getMostRecentDecl()
4789 ->
hasAttr<BPFPreserveAccessIndexAttr>();
4802 const llvm::Twine &name =
"arrayidx") {
4805 for (
auto *idx : indices.drop_back())
4824 llvm::Value *eltPtr;
4825 auto LastIndex = dyn_cast<llvm::ConstantInt>(indices.back());
4832 signedIndices, loc, eltAlign, name);
4836 unsigned idx = LastIndex->getZExtValue();
4837 llvm::DIType *DbgInfo =
nullptr;
4840 eltPtr = CGF.
Builder.CreatePreserveArrayAccessIndex(
4852struct StructFieldAccess
4853 :
public ConstStmtVisitor<StructFieldAccess, const Expr *> {
4854 const Expr *VisitCastExpr(
const CastExpr *E) {
4859 const Expr *VisitParenExpr(
const ParenExpr *E) {
4868 const FieldDecl *Field, int64_t &Offset) {
4871 unsigned FieldNo = 0;
4906 if (FD1OuterRec != FD2OuterRec)
4908 return std::optional<int64_t>();
4910 int64_t FD1Offset = 0;
4912 return std::optional<int64_t>();
4914 int64_t FD2Offset = 0;
4916 return std::optional<int64_t>();
4918 return std::make_optional<int64_t>(FD1Offset - FD2Offset);
4930 QualType IndexType, llvm::Value *IndexVal,
bool Accessed,
4931 bool FlexibleArray) {
4932 const auto *ME = dyn_cast<MemberExpr>(ArrayExpr->
IgnoreImpCasts());
4933 if (!ME || !ME->getMemberDecl()->getType()->isCountAttributedType())
4938 if (FlexibleArray &&
4939 !ME->isFlexibleArrayMemberLike(
getContext(), StrictFlexArraysLevel))
4947 if (std::optional<int64_t> Diff =
4962 ArrayInst =
Builder.CreatePointerBitCastOrAddrSpaceCast(ArrayInst,
4966 llvm::Value *BoundsVal =
4968 Builder.getInt32(*Diff),
".counted_by.gep");
4970 ".counted_by.load");
4974 CountFD->
getType(), Accessed);
4982 llvm::Value *IdxPre =
4984 bool SignedIndices =
false;
4985 auto EmitIdxAfterBase = [&, IdxPre](
bool Promote) -> llvm::Value * {
4988 assert(E->
getRHS() == E->
getIdx() &&
"index was neither LHS nor RHS");
4994 SignedIndices |= IdxSigned;
4996 if (
SanOpts.has(SanitizerKind::ArrayBounds))
5000 if (Promote && Idx->getType() !=
IntPtrTy)
5013 auto *Idx = EmitIdxAfterBase(
false);
5014 assert(LHS.
isSimple() &&
"Can only subscript lvalue vectors here!");
5022 std::optional<LValue> LV;
5025 LV =
CGM.getHLSLRuntime().emitResourceArraySubscriptExpr(E, *
this);
5027 LV =
CGM.getHLSLRuntime().emitBufferArraySubscriptExpr(E, *
this,
5039 auto *Idx = EmitIdxAfterBase(
true);
5046 CGM.getTBAAInfoForSubobject(LV, EltType));
5058 auto *Idx = EmitIdxAfterBase(
true);
5068 Idx =
Builder.CreateMul(Idx, numElements);
5070 Idx =
Builder.CreateNSWMul(Idx, numElements);
5082 auto *Idx = EmitIdxAfterBase(
true);
5085 llvm::Value *InterfaceSizeVal =
5086 llvm::ConstantInt::get(Idx->getType(), InterfaceSize.
getQuantity());
5088 llvm::Value *ScaledIdx =
Builder.CreateMul(Idx, InterfaceSizeVal);
5094 llvm::Type *OrigBaseElemTy =
Addr.getElementType();
5099 llvm::Value *EltPtr =
5101 ScaledIdx,
false, SignedIndices, E->
getExprLoc());
5108 assert(Array->getType()->isArrayType() &&
5109 "Array to pointer decay must have array source type!");
5113 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5117 auto *Idx = EmitIdxAfterBase(
true);
5119 if (
SanOpts.has(SanitizerKind::ArrayBounds))
5127 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5131 if (!
CGM.getCodeGenOpts().NewStructPathTBAA) {
5134 EltTBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, E->
getType());
5139 EltTBAAInfo =
CGM.getTBAAAccessInfo(E->
getType());
5161 auto *Idx = EmitIdxAfterBase(
true);
5168 if (
SanOpts.has(SanitizerKind::ArrayBounds)) {
5169 StructFieldAccess Visitor;
5172 if (
const auto *CE = dyn_cast_if_present<CastExpr>(
Base);
5173 CE && CE->getCastKind() == CK_LValueToRValue)
5206 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
Base, *
this);
5216 "incomplete matrix subscript expressions should be rejected during Sema");
5222 llvm::MatrixBuilder MB(
Builder);
5225 unsigned NumRows = MatrixTy->getNumRows();
5226 bool IsMatrixRowMajor =
5228 llvm::Value *FinalIdx =
5229 MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
5240 bool IsLowerBound) {
5242 if (
auto *ASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParenImpCasts())) {
5246 BaseInfo = BaseLVal.getBaseInfo();
5251 Addr =
Addr.withElementType(NewTy);
5257 "Expected pointer to array");
5267 BaseInfo.mergeForCast(TypeBaseInfo);
5276 bool IsLowerBound) {
5279 "OpenACC Array section codegen not implemented");
5283 if (
auto *AT =
getContext().getAsArrayType(BaseTy))
5284 ResultExprTy = AT->getElementType();
5287 llvm::Value *Idx =
nullptr;
5295 LowerBound->getType()->hasSignedIntegerRepresentation());
5297 Idx = llvm::ConstantInt::getNullValue(
IntPtrTy);
5302 auto &
C =
CGM.getContext();
5304 llvm::APSInt ConstLength;
5307 if (std::optional<llvm::APSInt>
CL = Length->getIntegerConstantExpr(
C)) {
5314 if (std::optional<llvm::APSInt> LB =
5315 LowerBound->getIntegerConstantExpr(
C)) {
5317 LowerBound =
nullptr;
5322 else if (!LowerBound)
5325 if (Length || LowerBound) {
5326 auto *LowerBoundVal =
5330 LowerBound->getType()->hasSignedIntegerRepresentation())
5331 : llvm::ConstantInt::get(
IntPtrTy, ConstLowerBound);
5336 Length->getType()->hasSignedIntegerRepresentation())
5337 : llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5338 Idx =
Builder.CreateAdd(LowerBoundVal, LengthVal,
"lb_add_len",
5341 if (Length && LowerBound) {
5343 Idx, llvm::ConstantInt::get(
IntPtrTy, 1),
"idx_sub_1",
5347 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength + ConstLowerBound);
5353 if (
auto *VAT =
C.getAsVariableArrayType(ArrayTy)) {
5354 Length = VAT->getSizeExpr();
5355 if (std::optional<llvm::APSInt> L = Length->getIntegerConstantExpr(
C)) {
5360 auto *CAT =
C.getAsConstantArrayType(ArrayTy);
5361 assert(CAT &&
"unexpected type for array initializer");
5362 ConstLength = CAT->getSize();
5365 auto *LengthVal =
Builder.CreateIntCast(
5367 Length->getType()->hasSignedIntegerRepresentation());
5369 LengthVal, llvm::ConstantInt::get(
IntPtrTy, 1),
"len_sub_1",
5374 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5383 if (
auto *VLA =
getContext().getAsVariableArrayType(ResultExprTy)) {
5389 BaseTy, VLA->getElementType(), IsLowerBound);
5398 Idx =
Builder.CreateMul(Idx, NumElements);
5400 Idx =
Builder.CreateNSWMul(Idx, NumElements);
5409 assert(Array->getType()->isArrayType() &&
5410 "Array to pointer decay must have array source type!");
5414 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5421 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5422 ResultExprTy, !
getLangOpts().PointerOverflowDefined,
5425 TBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, ResultExprTy);
5429 ResultExprTy, IsLowerBound);
5452 Base.getQuals().removeObjCGCAttr();
5461 "Result must be a vector");
5469 if (LTy->getScalarSizeInBits() > Vec->getType()->getScalarSizeInBits())
5470 Vec =
Builder.CreateZExt(Vec, LTy);
5471 Builder.CreateStore(Vec, VecMem);
5482 if (
Base.isSimple()) {
5483 llvm::Constant *CV =
5489 if (
Base.isMatrixRow()) {
5491 llvm::dyn_cast<llvm::ConstantInt>(
Base.getMatrixRowIdx())) {
5495 unsigned NumCols = Indices.size();
5497 unsigned Row = RowIdx->getZExtValue();
5501 QualType ElemQT = EVT->getElementType();
5504 for (
unsigned C = 0;
C < NumCols; ++
C) {
5505 unsigned Col = Indices[
C];
5506 unsigned Linear = Col * NumRows + Row;
5507 MatIndices.push_back(llvm::ConstantInt::get(
Int32Ty, Linear));
5510 llvm::Constant *ConstIdxs = llvm::ConstantVector::get(MatIndices);
5514 llvm::Constant *Cols =
5521 Base.getMatrixAddress(),
Base.getMatrixRowIdx(), Cols,
Base.getType(),
5525 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
5527 llvm::Constant *BaseElts =
Base.getExtVectorElts();
5530 for (
unsigned Index : Indices)
5531 CElts.push_back(BaseElts->getAggregateElement(Index));
5532 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
5539 while (
auto *BaseMemberExpr = dyn_cast<MemberExpr>(UnderlyingBaseExpr))
5540 UnderlyingBaseExpr = BaseMemberExpr->getBase()->
IgnoreParens();
5553 return CGM.getHLSLRuntime().emitBufferMemberExpr(*
this, E);
5556 std::optional<LValue> LV;
5557 LV =
CGM.getHLSLRuntime().emitResourceMemberExpr(*
this, E);
5567 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
5579 SkippedChecks.
set(SanitizerKind::Alignment,
true);
5581 SkippedChecks.
set(SanitizerKind::Null,
true);
5589 if (
auto *Field = dyn_cast<FieldDecl>(ND)) {
5597 CGM.getOpenMPRuntime().isNontemporalDecl(Field)) ||
5604 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
5607 llvm_unreachable(
"Unhandled member declaration!");
5614 llvm::Value *ThisValue) {
5615 bool HasExplicitObjectParameter =
false;
5616 const auto *MD = dyn_cast_if_present<CXXMethodDecl>(
CurCodeDecl);
5618 HasExplicitObjectParameter = MD->isExplicitObjectMemberFunction();
5619 assert(MD->getParent()->isLambda());
5620 assert(MD->getParent() == Field->getParent());
5623 if (HasExplicitObjectParameter) {
5625 auto It = LocalDeclMap.find(D);
5626 assert(It != LocalDeclMap.end() &&
"explicit parameter not loaded?");
5627 Address AddrOfExplicitObject = It->getSecond();
5638 if (ThisTy != LambdaTy) {
5641 LambdaLV.
getAddress(), ThisTy, BasePathArray.begin(),
5661 unsigned FieldIndex) {
5662 unsigned I = 0, Skipped = 0;
5665 if (I == FieldIndex)
5667 if (F->isUnnamedBitField())
5672 return FieldIndex - Skipped;
5682 if (Offset.isZero())
5704 llvm::Type *StructType =
5710 {CGF.Builder.getSize(idx)}),
5725 const FieldDecl *field,
bool IsInBounds) {
5752 if (RD->isDynamicClass())
5755 for (
const auto &
Base : RD->bases())
5759 for (
const FieldDecl *Field : RD->fields())
5774 const bool UseVolatile =
isAAPCS(
CGM.getTarget()) &&
5775 CGM.getCodeGenOpts().AAPCSBitfieldWidth &&
5806 llvm::Type *FieldIntTy = llvm::Type::getIntNTy(
getLLVMContext(), SS);
5807 Addr =
Addr.withElementType(FieldIntTy);
5842 assert(!FieldTBAAInfo.
Offset &&
5843 "Nonzero offset for an access with no base type!");
5856 FieldTBAAInfo.
Size =
5863 if (
auto *ClassDef = dyn_cast<CXXRecordDecl>(rec)) {
5864 if (
CGM.getCodeGenOpts().StrictVTablePointers &&
5865 ClassDef->isDynamicClass()) {
5879 if (
CGM.getCodeGenOpts().StrictVTablePointers &&
5883 addr =
Builder.CreateLaunderInvariantGroup(addr);
5926 if (field->
hasAttr<AnnotateAttr>())
5942 QualType FieldType = Field->getType();
5948 *
this,
Base.getAddress(), Field,
5953 V =
V.withElementType(llvmType);
5962 CGM.getTBAAInfoForSubobject(
Base, FieldType));
5998 assert(E->
isTransparent() &&
"non-transparent glvalue init list");
6006 const Expr *Operand) {
6007 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Operand->IgnoreParens())) {
6009 return std::nullopt;
6018std::optional<LValue> HandleConditionalOperatorLValueSimpleCase(
6020 const Expr *condExpr = E->
getCond();
6025 std::swap(Live, Dead);
6035 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Live->
IgnoreParens())) {
6046 return std::nullopt;
6048struct ConditionalInfo {
6049 llvm::BasicBlock *lhsBlock, *rhsBlock;
6050 std::optional<LValue> LHS, RHS;
6055template<
typename FuncTy>
6057 const AbstractConditionalOperator *E,
6058 const FuncTy &BranchGenFunc) {
6074 Info.lhsBlock = CGF.
Builder.GetInsertBlock();
6077 CGF.
Builder.CreateBr(endBlock);
6085 Info.rhsBlock = CGF.
Builder.GetInsertBlock();
6097 "Unexpected conditional operator!");
6102 if (HandleConditionalOperatorLValueSimpleCase(*
this, E))
6105 EmitConditionalBlocks(*
this, E, [](CodeGenFunction &CGF,
const Expr *E) {
6112 if (!
expr->isGLValue()) {
6115 "Unexpected conditional operator!");
6120 if (std::optional<LValue> Res =
6121 HandleConditionalOperatorLValueSimpleCase(*
this,
expr))
6124 ConditionalInfo Info = EmitConditionalBlocks(
6125 *
this,
expr, [](CodeGenFunction &CGF,
const Expr *E) {
6129 if ((Info.LHS && !Info.LHS->isSimple()) ||
6130 (Info.RHS && !Info.RHS->isSimple()))
6133 if (Info.LHS && Info.RHS) {
6134 Address lhsAddr = Info.LHS->getAddress();
6135 Address rhsAddr = Info.RHS->getAddress();
6137 lhsAddr, rhsAddr, Info.lhsBlock, Info.rhsBlock,
6140 std::max(Info.LHS->getBaseInfo().getAlignmentSource(),
6141 Info.RHS->getBaseInfo().getAlignmentSource());
6143 Info.LHS->getTBAAInfo(), Info.RHS->getTBAAInfo());
6147 assert((Info.LHS || Info.RHS) &&
6148 "both operands of glvalue conditional are throw-expressions?");
6149 return Info.LHS ? *Info.LHS : *Info.RHS;
6161 llvm::scope_exit RestoreCurCast([
this, Prev =
CurCast] {
CurCast = Prev; });
6166 case CK_LValueToRValueBitCast:
6167 case CK_ArrayToPointerDecay:
6168 case CK_FunctionToPointerDecay:
6169 case CK_NullToMemberPointer:
6170 case CK_NullToPointer:
6171 case CK_IntegralToPointer:
6172 case CK_PointerToIntegral:
6173 case CK_PointerToBoolean:
6174 case CK_IntegralCast:
6175 case CK_BooleanToSignedIntegral:
6176 case CK_IntegralToBoolean:
6177 case CK_IntegralToFloating:
6178 case CK_FloatingToIntegral:
6179 case CK_FloatingToBoolean:
6180 case CK_FloatingCast:
6181 case CK_FloatingRealToComplex:
6182 case CK_FloatingComplexToReal:
6183 case CK_FloatingComplexToBoolean:
6184 case CK_FloatingComplexCast:
6185 case CK_FloatingComplexToIntegralComplex:
6186 case CK_IntegralRealToComplex:
6187 case CK_IntegralComplexToReal:
6188 case CK_IntegralComplexToBoolean:
6189 case CK_IntegralComplexCast:
6190 case CK_IntegralComplexToFloatingComplex:
6191 case CK_DerivedToBaseMemberPointer:
6192 case CK_BaseToDerivedMemberPointer:
6193 case CK_MemberPointerToBoolean:
6194 case CK_ReinterpretMemberPointer:
6195 case CK_AnyPointerToBlockPointerCast:
6196 case CK_ARCProduceObject:
6197 case CK_ARCConsumeObject:
6198 case CK_ARCReclaimReturnedObject:
6199 case CK_ARCExtendBlockObject:
6200 case CK_CopyAndAutoreleaseBlockObject:
6201 case CK_IntToOCLSampler:
6202 case CK_FloatingToFixedPoint:
6203 case CK_FixedPointToFloating:
6204 case CK_FixedPointCast:
6205 case CK_FixedPointToBoolean:
6206 case CK_FixedPointToIntegral:
6207 case CK_IntegralToFixedPoint:
6209 case CK_HLSLVectorTruncation:
6210 case CK_HLSLMatrixTruncation:
6211 case CK_HLSLArrayRValue:
6212 case CK_HLSLElementwiseCast:
6213 case CK_HLSLAggregateSplatCast:
6217 llvm_unreachable(
"dependent cast kind in IR gen!");
6219 case CK_BuiltinFnToFnPtr:
6220 llvm_unreachable(
"builtin functions are handled elsewhere");
6223 case CK_NonAtomicToAtomic:
6224 case CK_AtomicToNonAtomic:
6234 case CK_ConstructorConversion:
6235 case CK_UserDefinedConversion:
6236 case CK_CPointerToObjCPointerCast:
6237 case CK_BlockPointerToObjCPointerCast:
6238 case CK_LValueToRValue:
6253 if (
V.getElementType() != T)
6260 case CK_UncheckedDerivedToBase:
6261 case CK_DerivedToBase: {
6275 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6279 case CK_BaseToDerived: {
6294 if (
SanOpts.has(SanitizerKind::CFIDerivedCast))
6300 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6302 case CK_LValueBitCast: {
6306 CGM.EmitExplicitCastExprType(CE,
this);
6311 if (
SanOpts.has(SanitizerKind::CFIUnrelatedCast))
6317 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6319 case CK_AddressSpaceConversion: {
6328 case CK_ObjCObjectLValueCast: {
6332 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6334 case CK_ZeroToOCLOpaqueType:
6335 llvm_unreachable(
"NULL to OpenCL opaque type lvalue cast is not valid");
6337 case CK_VectorSplat: {
6345 llvm_unreachable(
"Unhandled lvalue cast kind?");
6353std::pair<LValue, LValue>
6373 return std::make_pair(BaseLV, TempLV);
6381 llvm::Value *
Addr = TempLV.getAddress().getBasePointer();
6384 Address TmpAddr(
Addr, ElTy, TempLV.getAlignment());
6394 llvm::DenseMap<const OpaqueValueExpr*,LValue>::iterator
6395 it = OpaqueLValues.find(e);
6397 if (it != OpaqueLValues.end())
6400 assert(e->
isUnique() &&
"LValue for a nonunique OVE hasn't been emitted");
6408 llvm::DenseMap<const OpaqueValueExpr*,RValue>::iterator
6409 it = OpaqueRValues.find(e);
6411 if (it != OpaqueRValues.end())
6414 assert(e->
isUnique() &&
"RValue for a nonunique OVE hasn't been emitted");
6420 return OpaqueLValues.contains(E);
6421 return OpaqueRValues.contains(E);
6445 llvm_unreachable(
"bad evaluation kind");
6454 llvm::CallBase **CallOrInvoke) {
6455 llvm::CallBase *CallOrInvokeStorage;
6456 if (!CallOrInvoke) {
6457 CallOrInvoke = &CallOrInvokeStorage;
6460 llvm::scope_exit AddCoroElideSafeOnExit([&] {
6462 auto *I = *CallOrInvoke;
6464 I->addFnAttr(llvm::Attribute::CoroElideSafe);
6472 if (
const auto *CE = dyn_cast<CXXMemberCallExpr>(E))
6475 if (
const auto *CE = dyn_cast<CUDAKernelCallExpr>(E))
6480 if (
const auto *CE = dyn_cast<CXXOperatorCallExpr>(E))
6481 if (
const auto *MD =
6482 dyn_cast_if_present<CXXMethodDecl>(CE->getCalleeDecl());
6483 MD && MD->isImplicitObjectMemberFunction())
6498 nullptr, CallOrInvoke);
6504 llvm::CallBase **CallOrInvoke) {
6507 nullptr, CallOrInvoke);
6515 if (!PD->isInlineBuiltinDeclaration())
6524 std::string NoBuiltinFD = (
"no-builtin-" + FD->
getName()).str();
6525 std::string NoBuiltins =
"no-builtins";
6528 std::string FDInlineName = (Ident +
".inline").str();
6530 bool IsPredefinedLibFunction =
6532 bool HasAttributeNoBuiltin =
6533 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltinFD) ||
6534 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltins);
6538 if (CGF.
CurFn->getName() != FDInlineName &&
6541 llvm::Function *Fn = llvm::cast<llvm::Function>(CalleePtr);
6542 llvm::Module *M = Fn->getParent();
6543 llvm::Function *Clone = M->getFunction(FDInlineName);
6545 Clone = llvm::Function::Create(Fn->getFunctionType(),
6546 llvm::GlobalValue::InternalLinkage,
6547 Fn->getAddressSpace(), FDInlineName, M);
6548 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
6559 else if (!IsPredefinedLibFunction || !HasAttributeNoBuiltin)
6565 FD->
hasAttr<CUDAGlobalAttr>())
6573 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()))
6582 if (
auto ICE = dyn_cast<ImplicitCastExpr>(E)) {
6583 if (ICE->getCastKind() == CK_FunctionToPointerDecay ||
6584 ICE->getCastKind() == CK_BuiltinFnToFnPtr) {
6590 if (ICE->getCastKind() == CK_LValueToRValue) {
6591 const Expr *SubExpr = ICE->getSubExpr();
6593 std::pair<llvm::Value *, CGPointerAuthInfo>
Result =
6600 if (
const auto *VD =
6611 }
else if (
auto DRE = dyn_cast<DeclRefExpr>(E)) {
6612 if (
auto FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
6615 }
else if (
auto ME = dyn_cast<MemberExpr>(E)) {
6616 if (
auto FD = dyn_cast<FunctionDecl>(ME->getMemberDecl())) {
6622 }
else if (
auto NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
6626 }
else if (
auto PDE = dyn_cast<CXXPseudoDestructorExpr>(E)) {
6631 llvm::Value *calleePtr;
6643 if (
const auto *VD =
6649 CGCallee callee(calleeInfo, calleePtr, pointerAuth);
6665 assert(E->
getOpcode() == BO_Assign &&
"unexpected binary l-value");
6728 llvm::Value *
Result =
nullptr;
6731 if (
SanOpts.has(SanitizerKind::ImplicitBitfieldConversion))
6746 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
6763 llvm_unreachable(
"bad evaluation kind");
6779 if (
CGM.getHLSLRuntime().emitGlobalResourceArray(*
this, E->
getRHS(), Slot))
6791 llvm::CallBase **CallOrInvoke) {
6799 "Can't have a scalar return unless the return type is a "
6812 &&
"binding l-value to type which needs a temporary");
6850 "Can't have a scalar return unless the return type is a "
6864 return CGM.getObjCRuntime().EmitIvarOffset(*
this,
Interface, Ivar);
6872 return Builder.CreateZExtOrTrunc(OffsetValue,
6877 llvm::Value *BaseValue,
6879 unsigned CVRQualifiers) {
6880 return CGM.getObjCRuntime().EmitObjCValueForIvar(*
this, ObjectTy, BaseValue,
6881 Ivar, CVRQualifiers);
6886 llvm::Value *BaseValue =
nullptr;
6897 ObjectTy = BaseExpr->
getType();
6919 llvm::CallBase **CallOrInvoke,
6924 "Call must have function pointer type!");
6926 const Decl *TargetDecl =
6929 assert((!isa_and_present<FunctionDecl>(TargetDecl) ||
6931 "trying to emit a call to an immediate function");
6941 if (
SanOpts.has(SanitizerKind::Function) &&
6944 if (llvm::Constant *PrefixSig =
6945 CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(
CGM)) {
6946 auto CheckOrdinal = SanitizerKind::SO_Function;
6947 auto CheckHandler = SanitizerHandler::FunctionTypeMismatch;
6951 llvm::Type *PrefixSigType = PrefixSig->getType();
6952 llvm::StructType *PrefixStructTy = llvm::StructType::get(
6953 CGM.getLLVMContext(), {PrefixSigType, Int32Ty},
true);
6955 llvm::Value *CalleePtr = Callee.getFunctionPointer();
6956 if (
CGM.getCodeGenOpts().PointerAuth.FunctionPointers) {
6959 Address(CalleePtr, CalleePtr->getType(),
6961 CalleePtr->getPointerAlignment(
CGM.getDataLayout())),
6962 Callee.getPointerAuthInfo(),
nullptr);
6963 CalleePtr =
Addr.emitRawPointer(*
this);
6975 llvm::Value *AlignedCalleePtr;
6976 if (
CGM.getTriple().isARM() ||
CGM.getTriple().isThumb()) {
6977 AlignedCalleePtr =
Builder.CreateIntrinsic(
6978 CalleePtr->getType(), llvm::Intrinsic::ptrmask,
6979 {CalleePtr, llvm::ConstantInt::getSigned(IntPtrTy, ~1)});
6981 AlignedCalleePtr = CalleePtr;
6984 llvm::Value *CalleePrefixStruct = AlignedCalleePtr;
6985 llvm::Value *CalleeSigPtr =
6986 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 0);
6987 llvm::Value *CalleeSig =
6989 llvm::Value *CalleeSigMatch =
Builder.CreateICmpEQ(CalleeSig, PrefixSig);
6993 Builder.CreateCondBr(CalleeSigMatch, TypeCheck, Cont);
6996 llvm::Value *CalleeTypeHash =
Builder.CreateAlignedLoad(
6998 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 1),
7000 llvm::Value *CalleeTypeHashMatch =
7001 Builder.CreateICmpEQ(CalleeTypeHash, TypeHash);
7004 EmitCheck(std::make_pair(CalleeTypeHashMatch, CheckOrdinal), CheckHandler,
7005 StaticData, {CalleePtr});
7014 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
7015 FD && DeviceKernelAttr::isOpenCLSpelling(FD->getAttr<DeviceKernelAttr>()))
7016 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FnType);
7020 if (
SanOpts.has(SanitizerKind::CFIICall) &&
7022 auto CheckOrdinal = SanitizerKind::SO_CFIICall;
7023 auto CheckHandler = SanitizerHandler::CFICheckFail;
7027 llvm::Metadata *MD =
7028 CGM.CreateMetadataIdentifierForFnType(
QualType(FnType, 0));
7030 llvm::Value *TypeId = llvm::MetadataAsValue::get(
getLLVMContext(), MD);
7032 llvm::Value *CalleePtr = Callee.getFunctionPointer();
7033 llvm::Value *TypeTest =
Builder.CreateCall(
7034 CGM.getIntrinsic(llvm::Intrinsic::type_test), {CalleePtr, TypeId});
7036 auto CrossDsoTypeId =
CGM.CreateCrossDsoCfiTypeId(MD);
7037 llvm::Constant *StaticData[] = {
7042 if (
CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
7046 EmitCheck(std::make_pair(TypeTest, CheckOrdinal), CheckHandler,
7047 StaticData, {CalleePtr, llvm::UndefValue::get(
IntPtrTy)});
7062 bool StaticOperator =
false;
7063 if (
auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
7064 if (OCE->isAssignmentOp())
7067 switch (OCE->getOperator()) {
7069 case OO_GreaterGreater:
7081 if (
const auto *MD =
7082 dyn_cast_if_present<CXXMethodDecl>(OCE->getCalleeDecl());
7083 MD && MD->isStatic())
7084 StaticOperator =
true;
7088 if (StaticOperator) {
7092 Arguments = drop_begin(Arguments, 1);
7094 EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), Arguments,
7098 Args, FnType, Chain);
7101 *ResolvedFnInfo = &FnInfo;
7106 if (
CGM.getLangOpts().HIP && !
CGM.getLangOpts().CUDAIsDevice &&
7109 llvm::Value *Handle = Callee.getFunctionPointer();
7111 Address(Handle, Handle->getType(),
CGM.getPointerAlign()));
7112 Callee.setFunctionPointer(
Stub);
7119 if (
getLangOpts().OpenMPIsTargetDevice &&
CGM.getTriple().isGPU() &&
7123 while (CalleeExpr) {
7124 if ((DRE = dyn_cast<DeclRefExpr>(CalleeExpr)))
7126 if (
const auto *ME = dyn_cast<MemberExpr>(CalleeExpr))
7128 else if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(CalleeExpr))
7134 const auto *VD = DRE ? dyn_cast<VarDecl>(DRE->
getDecl()) :
nullptr;
7135 if (VD && VD->hasAttr<OMPTargetIndirectCallAttr>()) {
7136 auto *FuncPtrTy = llvm::PointerType::get(
7137 CGM.getLLVMContext(),
CGM.getDataLayout().getProgramAddressSpace());
7138 llvm::Type *RtlFnArgs[] = {FuncPtrTy};
7139 llvm::FunctionCallee DeviceRtlFn =
CGM.CreateRuntimeFunction(
7140 llvm::FunctionType::get(FuncPtrTy, RtlFnArgs,
false),
7141 "__llvm_omp_indirect_call_lookup");
7142 llvm::Value *
Func = Callee.getFunctionPointer();
7143 llvm::Type *BackupTy =
Func->getType();
7147 Callee.setFunctionPointer(
Func);
7151 llvm::CallBase *LocalCallOrInvoke =
nullptr;
7155 if (
auto *CalleeDecl = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
7156 if (CalleeDecl->hasAttr<RestrictAttr>() ||
7157 CalleeDecl->hasAttr<MallocSpanAttr>() ||
7158 CalleeDecl->hasAttr<AllocSizeAttr>()) {
7160 if (
SanOpts.has(SanitizerKind::AllocToken)) {
7167 *CallOrInvoke = LocalCallOrInvoke;
7186 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
7189 E, BaseAddr, OffsetV, MPT, IsInBounds, &BaseInfo, &TBAAInfo);
7191 return MakeAddrLValue(MemberAddr, MPT->getPointeeType(), BaseInfo, TBAAInfo);
7208 llvm_unreachable(
"bad evaluation kind");
7212 assert(Val->getType()->isFPOrFPVectorTy());
7217 llvm::MDNode *Node = MDHelper.createFPMath(Accuracy);
7223 llvm::Type *EltTy = Val->getType()->getScalarType();
7224 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7228 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7230 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7245 llvm::Type *EltTy = Val->getType()->getScalarType();
7246 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7250 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7252 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7267 struct LValueOrRValue {
7281 LValueOrRValue result;
7285 const Expr *semantic = *i;
7289 if (
const auto *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
7291 if (ov->isUnique()) {
7292 assert(ov != resultExpr &&
7293 "A unique OVE cannot be used as the result expression");
7301 if (ov == resultExpr && ov->
isPRValue() && !forLValue &&
7306 opaqueData = OVMA::bind(CGF, ov, LV);
7311 opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
7314 if (ov == resultExpr) {
7322 opaques.push_back(opaqueData);
7326 }
else if (semantic == resultExpr) {
7358 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7360 llvm::IntegerType *IdxTy = llvm::IntegerType::get(
getLLVMContext(), 32);
7361 WorkList.push_back({Val, Val.
getType(), {llvm::ConstantInt::get(IdxTy, 0)}});
7363 while (!WorkList.empty()) {
7364 auto [LVal, T, IdxList] = WorkList.pop_back_val();
7365 T = T.getCanonicalType().getUnqualifiedType();
7366 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T)) {
7367 uint64_t Size = CAT->getZExtSize();
7368 for (int64_t I = Size - 1; I > -1; I--) {
7370 IdxListCopy.push_back(llvm::ConstantInt::get(IdxTy, I));
7371 WorkList.emplace_back(LVal, CAT->getElementType(), IdxListCopy);
7373 }
else if (
const auto *RT = dyn_cast<RecordType>(T)) {
7375 assert(!
Record->isUnion() &&
"Union types not supported in flat cast.");
7380 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7389 "HLSL doesn't support multiple inheritance.");
7392 IdxListCopy.push_back(llvm::ConstantInt::get(
7394 ReverseList.emplace_back(LVal,
Base->getType(), IdxListCopy);
7403 bool createdGEP =
false;
7404 for (
auto *FD :
Record->fields()) {
7405 if (FD->isBitField()) {
7406 if (FD->isUnnamedBitField())
7410 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7411 LLVMT, Align,
"gep");
7415 ReverseList.push_back({FieldLVal, FD->
getType(), {}});
7418 IdxListCopy.push_back(
7420 ReverseList.emplace_back(LVal, FD->getType(), IdxListCopy);
7424 std::reverse(ReverseList.begin(), ReverseList.end());
7425 llvm::append_range(WorkList, ReverseList);
7426 }
else if (
const auto *VT = dyn_cast<VectorType>(T)) {
7429 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7430 Align,
"vector.gep");
7432 for (
unsigned I = 0, E = VT->getNumElements(); I < E; I++) {
7433 llvm::Constant *Idx = llvm::ConstantInt::get(IdxTy, I);
7437 AccessList.emplace_back(LV);
7439 }
else if (
const auto *MT = dyn_cast<ConstantMatrixType>(T)) {
7447 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7448 Align,
"matrix.gep");
7451 unsigned NumRows = MT->getNumRows();
7452 unsigned NumCols = MT->getNumColumns();
7454 llvm::MatrixBuilder MB(
Builder);
7455 for (
unsigned Row = 0; Row < MT->getNumRows(); Row++) {
7456 for (
unsigned Col = 0; Col < MT->getNumColumns(); Col++) {
7457 llvm::Value *RowIdx = llvm::ConstantInt::get(IdxTy, Row);
7458 llvm::Value *ColIdx = llvm::ConstantInt::get(IdxTy, Col);
7459 llvm::Value *Idx = MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols,
7464 AccessList.emplace_back(LV);
7468 if (!IdxList.empty()) {
7471 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7472 LLVMT, Align,
"gep");
7475 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 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)
ConstantEmissionKind
Can we constant-emit a load of a reference to a variable of the given type?
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 bool isConstantEmittableObjectType(QualType type)
Given an object of the given canonical type, can we safely copy a value out of it based on its initia...
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 CheckRecoverableKind getRecoverableKind(SanitizerKind::SanitizerOrdinal Ordinal)
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")
SmallVector< llvm::Value *, 8 > RecIndicesTy
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 ConstantEmissionKind checkVarTypeForConstantEmission(QualType type)
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 bool getGEPIndicesToField(CodeGenFunction &CGF, const RecordDecl *RD, const FieldDecl *Field, RecIndicesTy &Indices)
static bool OnlyHasInlineBuiltinDeclaration(const FunctionDecl *FD)
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 bool isAAPCS(const TargetInfo &targetInfo)
Helper method to check if the underlying ABI is AAPCS.
static CharUnits getArrayElementAlign(CharUnits arrayAlign, mlir::Value idx, CharUnits eltSize)
static void pushTemporaryCleanup(CIRGenFunction &cgf, const MaterializeTemporaryExpr *m, const Expr *e, Address referenceTemporary)
static QualType getFixedSizeElementType(const ASTContext &astContext, const VariableArrayType *vla)
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.
bool isPFPField(const FieldDecl *Field) const
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.
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 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.
CharUnits - 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
getAsMaybeAlign - Returns Quantity as a valid llvm::Align or std::nullopt, Beware llvm::MaybeAlign as...
llvm::Align getAsAlign() const
getAsAlign - Returns Quantity as a valid llvm::Align, Beware llvm::Align assumes power of two 8-bit b...
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits One()
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)
fromQuantity - Construct a CharUnits quantity from a raw integer type.
static CharUnits Zero()
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 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 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.
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...
llvm::DIType * getOrCreateRecordType(QualType Ty, SourceLocation L)
Emit record type's standalone debug info.
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.
bool containsFieldDecl(const FieldDecl *FD) const
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.
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.
@ 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.
unsigned getDebugInfoFIndex(const RecordDecl *Rec, unsigned FieldIndex)
Get the record field index as represented in debug info.
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.
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.
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
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,...
@ ForceLeftToRight
! Language semantics require left-to-right evaluation.
@ Default
! No language constraints on evaluation order.
@ ForceRightToLeft
! Language semantics require right-to-left evaluation.
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.
LValue EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args, QualType Ty)
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.
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...
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.
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)
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 ...
CleanupKind getCleanupKind(QualType::DestructionKind kind)
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,...
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)
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID)
Emit a call to trap or debugtrap and attach function attribute "trap-func-name" if specified.
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 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...
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...
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.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
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
SourceLocation getLocation() const
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
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.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Represents a prototype with parameter type info, e.g.
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
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
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
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.
Exposes information about the current target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual StringRef getABI() const
Get the ABI currently in use.
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
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 ...
bool isEmptyFieldForLayout(const ASTContext &Context, const FieldDecl *FD)
isEmptyFieldForLayout - Return true iff the field is "empty", that is, either a zero-width bit-field ...
@ 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.
The JSON file list parser is used to communicate input to InstallAPI.
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.
@ Dtor_Complete
Complete object dtor.
LangAS
Defines the address space values used by the address space qualifier of QualType.
llvm::cl::opt< bool > ClSanitizeGuardChecks
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,...
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __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.
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.
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