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/IntrinsicsWebAssembly.h"
49#include "llvm/IR/LLVMContext.h"
50#include "llvm/IR/MDBuilder.h"
51#include "llvm/IR/MatrixBuilder.h"
52#include "llvm/Support/ConvertUTF.h"
53#include "llvm/Support/Endian.h"
54#include "llvm/Support/MathExtras.h"
55#include "llvm/Support/Path.h"
56#include "llvm/Support/xxhash.h"
57#include "llvm/Transforms/Utils/SanitizerStats.h"
70 "ubsan-guard-checks", llvm::cl::Optional,
71 llvm::cl::desc(
"Guard UBSAN checks with `llvm.allow.ubsan.check()`."));
97#define SANITIZER_CHECK(Enum, Name, Version, Msg) \
98 case SanitizerHandler::Enum: \
101#undef SANITIZER_CHECK
103 llvm_unreachable(
"unhandled switch case");
111 llvm::Value *ArraySize) {
113 auto Alloca =
Builder.CreateStructuredAlloca(Ty, Name);
124 llvm::Value *ArraySize) {
134 llvm::IRBuilderBase::InsertPointGuard IPG(Builder);
149 llvm::Value *ArraySize,
153 *AllocaAddr = Alloca;
154 return MaybeCastStackAddressSpace(Alloca, DestLangAS, ArraySize);
162 llvm::Value *ArraySize) {
163 llvm::AllocaInst *Alloca;
165 Alloca =
Builder.CreateAlloca(Ty, ArraySize, Name);
168 new llvm::AllocaInst(Ty,
CGM.getDataLayout().getAllocaAddrSpace(),
170 if (
SanOpts.Mask & SanitizerKind::Address) {
171 Alloca->addAnnotationMetadata({
"alloca_name_altered", Name.str()});
174 Allocas->Add(Alloca);
211 auto *ArrayElementTy = ArrayTy->getElementType();
212 auto ArrayElements = ArrayTy->getNumElements();
215 ArrayElementTy = VectorTy->getElementType();
216 ArrayElements *= VectorTy->getNumElements();
218 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
241 PGO->setCurrentStmt(E);
244 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this, MemPtr, MPT);
267 if (
const auto *CondOp = dyn_cast<AbstractConditionalOperator>(
290 if (!ignoreResult && aggSlot.
isIgnored())
295 llvm_unreachable(
"bad evaluation kind");
337 llvm_unreachable(
"bad evaluation kind");
360 llvm_unreachable(
"bad evaluation kind");
400 bool Precise = isa_and_nonnull<VarDecl>(VD) &&
401 VD->
hasAttr<ObjCPreciseLifetimeAttr>();
422 llvm_unreachable(
"temporary cannot have dynamic storage duration");
424 llvm_unreachable(
"unknown storage duration");
434 if (
const auto *ClassDecl =
438 ReferenceTemporaryDtor = ClassDecl->getDestructor();
440 if (!ReferenceTemporaryDtor)
443 llvm::FunctionCallee CleanupFn;
444 llvm::Constant *CleanupArg;
450 CleanupArg = llvm::Constant::getNullValue(CGF.
Int8PtrTy);
467 llvm_unreachable(
"temporary cannot have dynamic storage duration");
489 auto *GV =
new llvm::GlobalVariable(
491 llvm::GlobalValue::PrivateLinkage,
Init,
".ref.tmp",
nullptr,
492 llvm::GlobalValue::NotThreadLocal,
496 llvm::Constant *
C = GV;
503 return RawAddress(
C, GV->getValueType(), alignment);
512 llvm_unreachable(
"temporary can't have dynamic storage duration");
514 llvm_unreachable(
"unknown storage duration");
528 "Reference should never be pseudo-strong!");
536 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(
Object.getPointer())) {
546 if (Var->hasInitializer())
549 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
555 default: llvm_unreachable(
"expected scalar or aggregate expression");
578 for (
const auto &Ignored : CommaLHSs)
581 if (
const auto *opaque = dyn_cast<OpaqueValueExpr>(E)) {
582 if (opaque->getType()->isRecordType()) {
583 assert(Adjustments.empty());
591 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(
592 Object.getPointer()->stripPointerCasts())) {
598 if (!Var->hasInitializer()) {
599 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
620 if (!ShouldEmitLifetimeMarkers)
631 CGBuilderTy::InsertPoint OldIP;
633 ((!
SanOpts.has(SanitizerKind::HWAddress) &&
634 !
SanOpts.has(SanitizerKind::Memory) &&
635 !
SanOpts.has(SanitizerKind::MemtagStack) &&
636 !
CGM.getCodeGenOpts().SanitizeAddressUseAfterScope) ||
638 OldConditional = OutermostConditional;
639 OutermostConditional =
nullptr;
643 Builder.restoreIP(CGBuilderTy::InsertPoint(
644 Block, llvm::BasicBlock::iterator(
Block->back())));
651 if (OldConditional) {
652 OutermostConditional = OldConditional;
669 switch (Adjustment.Kind) {
673 Adjustment.DerivedToBase.BasePath->path_begin(),
674 Adjustment.DerivedToBase.BasePath->path_end(),
682 "materialized temporary field is not a simple lvalue");
690 E,
Object, Ptr, Adjustment.Ptr.MPT,
true);
723 const llvm::Constant *Elts) {
731 Builder.CreateMul(Ptr, Builder.getInt64(0xbf58476d1ce4e5b9u));
733 Builder.CreateXor(A0, Builder.CreateLShr(A0, Builder.getInt64(31)));
734 return Builder.CreateXor(Acc, A1);
751 return SanOpts.has(SanitizerKind::Null) ||
752 SanOpts.has(SanitizerKind::Alignment) ||
753 SanOpts.has(SanitizerKind::ObjectSize) ||
754 SanOpts.has(SanitizerKind::Vptr);
761 llvm::Value *ArraySize) {
768 if (Ptr->getType()->getPointerAddressSpace())
779 auto PtrToAlloca = dyn_cast<llvm::AllocaInst>(Ptr->stripPointerCasts());
781 llvm::Value *IsNonNull =
nullptr;
782 bool IsGuaranteedNonNull =
783 SkippedChecks.
has(SanitizerKind::Null) || PtrToAlloca;
785 llvm::BasicBlock *Done =
nullptr;
786 bool DoneViaNullSanitize =
false;
789 auto CheckHandler = SanitizerHandler::TypeMismatch;
791 {SanitizerKind::SO_Null,
792 SanitizerKind::SO_ObjectSize,
793 SanitizerKind::SO_Alignment},
801 if ((
SanOpts.has(SanitizerKind::Null) || AllowNullPointers) &&
802 !IsGuaranteedNonNull) {
804 IsNonNull =
Builder.CreateIsNotNull(Ptr);
808 IsGuaranteedNonNull = IsNonNull ==
True;
811 if (!IsGuaranteedNonNull) {
812 if (AllowNullPointers) {
816 DoneViaNullSanitize =
true;
818 Builder.CreateCondBr(IsNonNull, Rest, Done);
821 Checks.push_back(std::make_pair(IsNonNull, SanitizerKind::SO_Null));
826 if (
SanOpts.has(SanitizerKind::ObjectSize) &&
827 !SkippedChecks.
has(SanitizerKind::ObjectSize) &&
829 uint64_t TySize =
CGM.getMinimumObjectSize(Ty).getQuantity();
830 llvm::Value *Size = llvm::ConstantInt::get(
IntPtrTy, TySize);
832 Size =
Builder.CreateMul(Size, ArraySize);
835 llvm::Constant *ConstantSize = dyn_cast<llvm::Constant>(Size);
836 if (!ConstantSize || !ConstantSize->isNullValue()) {
843 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::objectsize, Tys);
845 llvm::Value *NullIsUnknown =
Builder.getFalse();
846 llvm::Value *Dynamic =
Builder.getFalse();
847 llvm::Value *LargeEnough =
Builder.CreateICmpUGE(
848 Builder.CreateCall(F, {Ptr, Min, NullIsUnknown, Dynamic}), Size);
850 std::make_pair(LargeEnough, SanitizerKind::SO_ObjectSize));
854 llvm::MaybeAlign AlignVal;
855 llvm::Value *PtrAsInt =
nullptr;
857 if (
SanOpts.has(SanitizerKind::Alignment) &&
858 !SkippedChecks.
has(SanitizerKind::Alignment)) {
861 AlignVal =
CGM.getNaturalTypeAlignment(Ty,
nullptr,
nullptr,
866 if (AlignVal && *AlignVal > llvm::Align(1) &&
867 (!PtrToAlloca || PtrToAlloca->getAlign() < *AlignVal)) {
869 llvm::Value *Align =
Builder.CreateAnd(
870 PtrAsInt, llvm::ConstantInt::get(
IntPtrTy, AlignVal->value() - 1));
871 llvm::Value *Aligned =
875 std::make_pair(Aligned, SanitizerKind::SO_Alignment));
879 if (Checks.size() > 0) {
880 llvm::Constant *StaticData[] = {
882 llvm::ConstantInt::get(
Int8Ty, AlignVal ? llvm::Log2(*AlignVal) : 1),
883 llvm::ConstantInt::get(
Int8Ty, TCK)};
884 EmitCheck(Checks, CheckHandler, StaticData, PtrAsInt ? PtrAsInt : Ptr);
896 if (
SanOpts.has(SanitizerKind::Vptr) &&
899 SanitizerHandler::DynamicTypeCacheMiss);
903 if (!IsGuaranteedNonNull) {
905 IsNonNull =
Builder.CreateIsNotNull(Ptr);
909 Builder.CreateCondBr(IsNonNull, VptrNotNull, Done);
915 llvm::raw_svector_ostream Out(MangledName);
920 if (!
CGM.getContext().getNoSanitizeList().containsType(SanitizerKind::Vptr,
923 llvm::Value *TypeHash =
924 llvm::ConstantInt::get(
Int64Ty, xxh3_64bits(Out.str()));
938 const int CacheSize = 128;
939 llvm::Type *HashTable = llvm::ArrayType::get(
IntPtrTy, CacheSize);
940 llvm::Value *
Cache =
CGM.CreateRuntimeVariable(HashTable,
941 "__ubsan_vptr_type_cache");
942 llvm::Value *Slot =
Builder.CreateAnd(Hash,
945 llvm::Value *Indices[] = {
Builder.getInt32(0), Slot };
946 llvm::Value *CacheVal =
Builder.CreateAlignedLoad(
954 llvm::Value *EqualHash =
Builder.CreateICmpEQ(CacheVal, Hash);
955 llvm::Constant *StaticData[] = {
959 llvm::ConstantInt::get(
Int8Ty, TCK)
961 llvm::Value *DynamicData[] = { Ptr, Hash };
962 EmitCheck(std::make_pair(EqualHash, SanitizerKind::SO_Vptr),
963 SanitizerHandler::DynamicTypeCacheMiss, StaticData,
971 {DoneViaNullSanitize ? SanitizerKind::SO_Null : SanitizerKind::SO_Vptr},
972 DoneViaNullSanitize ? SanitizerHandler::TypeMismatch
973 : SanitizerHandler::DynamicTypeCacheMiss);
982 uint64_t EltSize =
C.getTypeSizeInChars(EltTy).getQuantity();
990 auto *ParamDecl = dyn_cast<ParmVarDecl>(ArrayDeclRef->getDecl());
994 auto *POSAttr = ParamDecl->getAttr<PassObjectSizeAttr>();
999 int POSType = POSAttr->getType();
1000 if (POSType != 0 && POSType != 1)
1004 auto PassedSizeIt = SizeArguments.find(ParamDecl);
1005 if (PassedSizeIt == SizeArguments.end())
1009 assert(LocalDeclMap.count(PassedSizeDecl) &&
"Passed size not loadable");
1010 Address AddrOfSize = LocalDeclMap.find(PassedSizeDecl)->second;
1013 llvm::Value *SizeOfElement =
1014 llvm::ConstantInt::get(SizeInBytes->getType(), EltSize);
1015 return Builder.CreateUDiv(SizeInBytes, SizeOfElement);
1024 StrictFlexArraysLevel) {
1027 IndexedType =
Base->getType();
1028 return CGF.
Builder.getInt32(VT->getNumElements());
1033 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1034 if (CE->getCastKind() == CK_ArrayToPointerDecay &&
1035 !CE->getSubExpr()->isFlexibleArrayMemberLike(CGF.
getContext(),
1036 StrictFlexArraysLevel)) {
1039 IndexedType = CE->getSubExpr()->getType();
1041 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
1042 return CGF.
Builder.getInt(CAT->getSize());
1044 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT))
1052 QualType EltTy{
Base->getType()->getPointeeOrArrayElementType(), 0};
1054 IndexedType =
Base->getType();
1095class StructAccessBase
1096 :
public ConstStmtVisitor<StructAccessBase, const Expr *> {
1100 const FieldDecl *CountDecl;
1105 bool IsExpectedRecordDecl(
const Expr *E)
const {
1114 StructAccessBase(
const FieldDecl *CountDecl) : CountDecl(CountDecl) {}
1133 const Expr *Visit(
const Expr *E) {
1134 return ConstStmtVisitor<StructAccessBase, const Expr *>::Visit(E);
1137 const Expr *VisitStmt(
const Stmt *S) {
return nullptr; }
1152 const Expr *VisitDeclRefExpr(
const DeclRefExpr *E) {
1153 return IsExpectedRecordDecl(E) ? E :
nullptr;
1155 const Expr *VisitMemberExpr(
const MemberExpr *E) {
1156 if (IsExpectedRecordDecl(E) && E->
isArrow())
1158 const Expr *Res = Visit(E->
getBase());
1159 return !Res && IsExpectedRecordDecl(E) ? E : Res;
1161 const Expr *VisitCompoundLiteralExpr(
const CompoundLiteralExpr *E) {
1162 return IsExpectedRecordDecl(E) ? E :
nullptr;
1164 const Expr *VisitCallExpr(
const CallExpr *E) {
1165 return IsExpectedRecordDecl(E) ? E :
nullptr;
1168 const Expr *VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
1169 if (IsExpectedRecordDecl(E))
1173 const Expr *VisitCastExpr(
const CastExpr *E) {
1175 return IsExpectedRecordDecl(E) ? E :
nullptr;
1178 const Expr *VisitParenExpr(
const ParenExpr *E) {
1181 const Expr *VisitUnaryAddrOf(
const UnaryOperator *E) {
1184 const Expr *VisitUnaryDeref(
const UnaryOperator *E) {
1197 int64_t FieldNo = -1;
1206 Indices.emplace_back(CGF.
Builder.getInt32(FieldNo));
1215 Indices.emplace_back(CGF.
Builder.getInt32(FieldNo));
1231 const Expr *StructBase = StructAccessBase(CountDecl).Visit(
Base);
1243 llvm::Value *Res =
nullptr;
1248 Res =
Addr.emitRawPointer(*
this);
1249 }
else if (StructBase->
isLValue()) {
1252 Res =
Addr.emitRawPointer(*
this);
1259 if (Indices.empty())
1262 Indices.push_back(
Builder.getInt32(0));
1286 const Expr *ArrayExprBase,
1287 llvm::Value *IndexVal,
QualType IndexType,
1289 assert(
SanOpts.has(SanitizerKind::ArrayBounds) &&
1290 "should not be called unless adding bounds checks");
1295 *
this, ArrayExprBase, ArrayExprBaseType, StrictFlexArraysLevel);
1298 BoundsVal,
getContext().getSizeType(), Accessed);
1303 llvm::Value *IndexVal,
1305 llvm::Value *BoundsVal,
1306 QualType BoundsType,
bool Accessed) {
1310 auto CheckKind = SanitizerKind::SO_ArrayBounds;
1311 auto CheckHandler = SanitizerHandler::OutOfBounds;
1323 llvm::Value *IndexInst =
Builder.CreateIntCast(IndexVal, Ty, IndexSigned);
1324 llvm::Value *BoundsInst =
Builder.CreateIntCast(BoundsVal, Ty,
false);
1326 llvm::Constant *StaticData[] = {
1332 llvm::Value *Check = Accessed ?
Builder.CreateICmpULT(IndexInst, BoundsInst)
1333 :
Builder.CreateICmpULE(IndexInst, BoundsInst);
1338 BoundsVal, llvm::ConstantInt::get(BoundsVal->getType(), 0));
1342 EmitCheck(std::make_pair(Check, CheckKind), CheckHandler, StaticData,
1352 auto *TypeNameMD = MDB.createString(ATMD->TypeName);
1353 auto *ContainsPtrC =
Builder.getInt1(ATMD->ContainsPointer);
1354 auto *ContainsPtrMD = MDB.createConstant(ContainsPtrC);
1357 return llvm::MDNode::get(
CGM.getLLVMContext(), {TypeNameMD, ContainsPtrMD});
1361 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1362 "Only needed with -fsanitize=alloc-token");
1363 CB->setMetadata(llvm::LLVMContext::MD_alloc_token,
1375 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1376 "Only needed with -fsanitize=alloc-token");
1378 CB->setMetadata(llvm::LLVMContext::MD_alloc_token, MDN);
1383 bool isInc,
bool isPre) {
1386 llvm::Value *NextVal;
1388 uint64_t AmountVal = isInc ? 1 : -1;
1389 NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal,
true);
1392 NextVal =
Builder.CreateAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1395 llvm::APFloat FVal(
getContext().getFloatTypeSemantics(ElemTy), 1);
1401 NextVal =
Builder.CreateFAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1409 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
1414 return isPre ? IncVal : InVal;
1424 DI->EmitExplicitCastType(E->
getType());
1435 if (
auto *constantIdx = dyn_cast<llvm::ConstantInt>(idx)) {
1436 CharUnits offset = constantIdx->getZExtValue() * eltSize;
1450 assert(BO->
isAdditiveOp() &&
"Expect an addition or subtraction.");
1453 bool isSubtraction = BO->
getOpcode() == BO_Sub;
1456 llvm::Value *
index =
nullptr;
1460 std::swap(pointerOperand, indexOperand);
1472 BO, pointerOperand, pointer, indexOperand,
index, isSubtraction);
1479 nullptr, IsKnownNonNull);
1492 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
1493 if (
const auto *ECE = dyn_cast<ExplicitCastExpr>(CE))
1496 switch (CE->getCastKind()) {
1500 case CK_AddressSpaceConversion:
1501 if (
auto PtrTy = CE->getSubExpr()->getType()->getAs<
PointerType>()) {
1502 if (PtrTy->getPointeeType()->isVoidType())
1508 CE->getSubExpr(), &InnerBaseInfo, &InnerTBAAInfo, IsKnownNonNull);
1509 if (BaseInfo) *BaseInfo = InnerBaseInfo;
1510 if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
1516 E->
getType(), &TargetTypeBaseInfo, &TargetTypeTBAAInfo);
1524 BaseInfo->mergeForCast(TargetTypeBaseInfo);
1525 Addr.setAlignment(Align);
1529 if (CGF.
SanOpts.
has(SanitizerKind::CFIUnrelatedCast) &&
1530 CE->getCastKind() == CK_BitCast) {
1538 llvm::Type *ElemTy =
1540 Addr =
Addr.withElementType(ElemTy);
1541 if (CE->getCastKind() == CK_AddressSpaceConversion)
1551 case CK_ArrayToPointerDecay:
1555 case CK_UncheckedDerivedToBase:
1556 case CK_DerivedToBase: {
1563 CE->getSubExpr(), BaseInfo,
nullptr,
1565 CE->getCastKind() == CK_UncheckedDerivedToBase));
1566 auto Derived = CE->getSubExpr()->
getType()->getPointeeCXXRecordDecl();
1568 Addr, Derived, CE->path_begin(), CE->path_end(),
1581 if (UO->getOpcode() == UO_AddrOf) {
1582 LValue LV = CGF.
EmitLValue(UO->getSubExpr(), IsKnownNonNull);
1583 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1584 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1585 return LV.getAddress();
1590 if (
auto *
Call = dyn_cast<CallExpr>(E)) {
1591 switch (
Call->getBuiltinCallee()) {
1594 case Builtin::BIaddressof:
1595 case Builtin::BI__addressof:
1596 case Builtin::BI__builtin_addressof: {
1598 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1599 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1600 return LV.getAddress();
1606 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
1607 if (BO->isAdditiveOp())
1616 true, BaseInfo, TBAAInfo, IsKnownNonNull);
1626 if (IsKnownNonNull && !
Addr.isKnownNonNull())
1627 Addr.setKnownNonNull();
1634 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this,
V, MPT);
1635 return Builder.CreateICmpNE(
V, llvm::Constant::getNullValue(
V->getType()));
1646 llvm::Value *
U = llvm::UndefValue::get(EltTy);
1661 llvm_unreachable(
"bad evaluation kind");
1686 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1687 Base = CE->getSubExpr();
1688 }
else if (
const auto *PE = dyn_cast<ParenExpr>(
Base)) {
1689 Base = PE->getSubExpr();
1690 }
else if (
const auto *UO = dyn_cast<UnaryOperator>(
Base)) {
1691 if (UO->getOpcode() == UO_Extension)
1692 Base = UO->getSubExpr();
1710 if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
1713 SkippedChecks.
set(SanitizerKind::Alignment,
true);
1715 SkippedChecks.
set(SanitizerKind::Null,
true);
1742 CGM.runWithSufficientStackSpace(
1743 E->
getExprLoc(), [&] { LV = EmitLValueHelper(E, IsKnownNonNull); });
1750LValue CodeGenFunction::EmitLValueHelper(
const Expr *E,
1756 case Expr::ObjCPropertyRefExprClass:
1757 llvm_unreachable(
"cannot emit a property reference directly");
1759 case Expr::ObjCSelectorExprClass:
1761 case Expr::ObjCIsaExprClass:
1763 case Expr::BinaryOperatorClass:
1765 case Expr::CompoundAssignOperatorClass: {
1768 Ty = AT->getValueType();
1773 case Expr::CallExprClass:
1774 case Expr::CXXMemberCallExprClass:
1775 case Expr::CXXOperatorCallExprClass:
1776 case Expr::UserDefinedLiteralClass:
1778 case Expr::CXXRewrittenBinaryOperatorClass:
1781 case Expr::VAArgExprClass:
1783 case Expr::DeclRefExprClass:
1785 case Expr::ConstantExprClass: {
1791 case Expr::ParenExprClass:
1793 case Expr::GenericSelectionExprClass:
1796 case Expr::PredefinedExprClass:
1798 case Expr::StringLiteralClass:
1800 case Expr::ObjCEncodeExprClass:
1802 case Expr::PseudoObjectExprClass:
1804 case Expr::InitListExprClass:
1806 case Expr::CXXTemporaryObjectExprClass:
1807 case Expr::CXXConstructExprClass:
1809 case Expr::CXXBindTemporaryExprClass:
1811 case Expr::CXXUuidofExprClass:
1813 case Expr::LambdaExprClass:
1816 case Expr::ExprWithCleanupsClass: {
1818 RunCleanupsScope
Scope(*
this);
1819 LValue LV =
EmitLValue(cleanups->getSubExpr(), IsKnownNonNull);
1820 if (LV.isSimple()) {
1824 llvm::Value *
V =
Addr.getBasePointer();
1825 Scope.ForceCleanup({&
V});
1826 Addr.replaceBasePointer(
V);
1828 LV.getBaseInfo(), LV.getTBAAInfo());
1835 case Expr::CXXDefaultArgExprClass: {
1838 return EmitLValue(DAE->getExpr(), IsKnownNonNull);
1840 case Expr::CXXDefaultInitExprClass: {
1843 return EmitLValue(DIE->getExpr(), IsKnownNonNull);
1845 case Expr::CXXTypeidExprClass:
1848 case Expr::ObjCMessageExprClass:
1850 case Expr::ObjCIvarRefExprClass:
1852 case Expr::StmtExprClass:
1854 case Expr::UnaryOperatorClass:
1856 case Expr::ArraySubscriptExprClass:
1858 case Expr::MatrixSingleSubscriptExprClass:
1860 case Expr::MatrixSubscriptExprClass:
1862 case Expr::ArraySectionExprClass:
1864 case Expr::ExtVectorElementExprClass:
1866 case Expr::MatrixElementExprClass:
1868 case Expr::CXXThisExprClass:
1870 case Expr::MemberExprClass:
1872 case Expr::CompoundLiteralExprClass:
1874 case Expr::ConditionalOperatorClass:
1876 case Expr::BinaryConditionalOperatorClass:
1878 case Expr::ChooseExprClass:
1880 case Expr::OpaqueValueExprClass:
1882 case Expr::SubstNonTypeTemplateParmExprClass:
1885 case Expr::ImplicitCastExprClass:
1886 case Expr::CStyleCastExprClass:
1887 case Expr::CXXFunctionalCastExprClass:
1888 case Expr::CXXStaticCastExprClass:
1889 case Expr::CXXDynamicCastExprClass:
1890 case Expr::CXXReinterpretCastExprClass:
1891 case Expr::CXXConstCastExprClass:
1892 case Expr::CXXAddrspaceCastExprClass:
1893 case Expr::ObjCBridgedCastExprClass:
1896 case Expr::MaterializeTemporaryExprClass:
1899 case Expr::CoawaitExprClass:
1901 case Expr::CoyieldExprClass:
1903 case Expr::PackIndexingExprClass:
1905 case Expr::HLSLOutArgExprClass:
1906 llvm_unreachable(
"cannot emit a HLSL out argument directly");
1913 assert(
type.isCanonical());
1914 assert(!
type->isReferenceType());
1922 if (
const auto *RT = dyn_cast<RecordType>(
type))
1923 if (
const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
1925 if (RD->hasMutableFields() || !RD->isTrivial())
1947 if (
const auto *ref = dyn_cast<ReferenceType>(
type)) {
1971 }
else if (
const auto *var = dyn_cast<VarDecl>(
Value)) {
1981 bool resultIsReference;
1987 resultIsReference =
false;
1993 resultIsReference =
true;
2014 auto *MD = dyn_cast_or_null<CXXMethodDecl>(
CurCodeDecl);
2015 if (
isLambdaMethod(MD) && MD->getOverloadedOperator() == OO_Call) {
2018 if (
const VarDecl *VD = dyn_cast<const VarDecl>(D)) {
2019 if (!VD->hasAttr<CUDADeviceAttr>()) {
2042 if (resultIsReference)
2069 assert(
Constant &&
"not a constant");
2092 llvm::APInt &End,
bool StrictEnums,
bool StrictBool,
2095 bool IsRegularCPlusPlusEnum =
2096 CGF.
getLangOpts().CPlusPlus && StrictEnums && ED && !ED->isFixed();
2097 if (!IsBool && !IsRegularCPlusPlusEnum)
2106 ED->getValueRange(End,
Min);
2111llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
2112 llvm::APInt
Min, End;
2114 bool StrictBoolEnabled =
CGM.getCodeGenOpts().getLoadBoolFromMem() ==
2117 CGM.getCodeGenOpts().StrictEnums,
2118 StrictBoolEnabled, IsBool))
2122 return MDHelper.createRange(
Min, End);
2130 }
else if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2131 if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty)) {
2132 Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
2133 Load->setMetadata(llvm::LLVMContext::MD_noundef,
2134 llvm::MDNode::get(
CGM.getLLVMContext(), {}));
2141 bool HasBoolCheck =
SanOpts.has(SanitizerKind::Bool);
2142 bool HasEnumCheck =
SanOpts.has(SanitizerKind::Enum);
2143 if (!HasBoolCheck && !HasEnumCheck)
2148 bool NeedsBoolCheck = HasBoolCheck && IsBool;
2150 if (!NeedsBoolCheck && !NeedsEnumCheck)
2160 if (NeedsEnumCheck &&
2161 getContext().isTypeIgnoredBySanitizer(SanitizerKind::Enum, Ty))
2164 llvm::APInt
Min, End;
2170 NeedsEnumCheck ? SanitizerKind::SO_Enum : SanitizerKind::SO_Bool;
2173 auto CheckHandler = SanitizerHandler::LoadInvalidValue;
2178 Check =
Builder.CreateICmpULE(
Value, llvm::ConstantInt::get(Ctx, End));
2180 llvm::Value *Upper =
2181 Builder.CreateICmpSLE(
Value, llvm::ConstantInt::get(Ctx, End));
2182 llvm::Value *Lower =
2184 Check =
Builder.CreateAnd(Upper, Lower);
2188 EmitCheck(std::make_pair(Check, Kind), CheckHandler, StaticArgs,
Value);
2197 bool isNontemporal) {
2198 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2199 if (GV->isThreadLocal())
2205 if (ClangVecTy->isPackedVectorBoolType(
getContext())) {
2207 unsigned ValNumElems =
2210 auto *RawIntV =
Builder.CreateLoad(
Addr, Volatile,
"load_bits");
2211 const auto *RawIntTy = RawIntV->getType();
2212 assert(RawIntTy->isIntegerTy() &&
"compressed iN storage for bitvectors");
2214 auto *PaddedVecTy = llvm::FixedVectorType::get(
2215 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2216 llvm::Value *
V =
Builder.CreateBitCast(RawIntV, PaddedVecTy);
2229 if (VTy != NewVecTy) {
2231 llvm::Value *
V =
Builder.CreateLoad(Cast, Volatile,
"loadVecN");
2232 unsigned OldNumElements = VTy->getNumElements();
2234 std::iota(Mask.begin(), Mask.end(), 0);
2235 V =
Builder.CreateShuffleVector(
V, Mask,
"extractVec");
2250 llvm::LoadInst *Load =
Builder.CreateLoad(
Addr, Volatile);
2251 if (isNontemporal) {
2252 llvm::MDNode *Node = llvm::MDNode::get(
2253 Load->getContext(), llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2254 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2257 CGM.DecorateInstructionWithTBAA(Load, TBAAInfo);
2269 Ty = AtomicTy->getValueType();
2277 if (StoreTy->isVectorTy() && StoreTy->getScalarSizeInBits() >
2282 unsigned MemNumElems = StoreTy->getPrimitiveSizeInBits();
2303 Ty = AtomicTy->getValueType();
2309 auto *PaddedVecTy = llvm::FixedVectorType::get(
2310 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2320 if (HasBoolRep &&
CGM.getCodeGenOpts().isConvertingBoolWithCmp0()) {
2334 bool IsVector =
true) {
2335 auto *ArrayTy = dyn_cast<llvm::ArrayType>(
Addr.getElementType());
2336 if (ArrayTy && IsVector) {
2337 auto ArrayElements = ArrayTy->getNumElements();
2338 auto *ArrayElementTy = ArrayTy->getElementType();
2341 ArrayElementTy = VectorTy->getElementType();
2342 ArrayElements *= VectorTy->getNumElements();
2344 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
2346 return Addr.withElementType(VectorTy);
2348 auto *VectorTy = dyn_cast<llvm::VectorType>(
Addr.getElementType());
2349 if (VectorTy && !IsVector) {
2350 auto *ArrayTy = llvm::ArrayType::get(
2351 VectorTy->getElementType(),
2354 return Addr.withElementType(ArrayTy);
2366 "Result must be a Constant Matrix");
2371 if (LTy->getScalarSizeInBits() > Mat->getType()->getScalarSizeInBits())
2372 Mat =
Builder.CreateZExt(Mat, LTy);
2373 Builder.CreateStore(Mat, MatMem);
2391 for (uint32_t &Idx : Indices) {
2393 unsigned Row = Idx / NumCols;
2394 unsigned Col = Idx % NumCols;
2396 Idx = MT->getColumnMajorFlattenedIndex(Row, Col);
2400 if (
Base.isSimple()) {
2404 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
Base, *
this);
2406 llvm::Constant *CV =
2409 CV, ResultType,
Base.getBaseInfo(),
2412 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
2414 llvm::Constant *BaseElts =
Base.getExtVectorElts();
2417 for (
unsigned Index : Indices)
2418 CElts.push_back(BaseElts->getAggregateElement(Index));
2419 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
2432 value->getType()->isVectorTy());
2434 lvalue.getBaseInfo(), lvalue.getTBAAInfo(), isInit,
2435 lvalue.isNontemporal());
2442 bool isInit,
bool isNontemporal) {
2443 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2444 if (GV->isThreadLocal())
2452 if (
auto *VecTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
2454 CGM.getABIInfo().getOptimalVectorMemoryType(VecTy,
getLangOpts());
2455 if (!ClangVecTy->isPackedVectorBoolType(
getContext()) &&
2456 VecTy != NewVecTy) {
2458 VecTy->getNumElements());
2459 std::iota(Mask.begin(), Mask.begin() + VecTy->getNumElements(), 0);
2463 Mask,
"extractVec");
2466 if (
Addr.getElementType() != SrcTy)
2467 Addr =
Addr.withElementType(SrcTy);
2484 if (isNontemporal) {
2485 llvm::MDNode *Node =
2486 llvm::MDNode::get(Store->getContext(),
2487 llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2488 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2491 CGM.DecorateInstructionWithTBAA(Store, TBAAInfo);
2510 assert(LV.getType()->isConstantMatrixType());
2520 LV.setAddress(
Addr);
2536 llvm_unreachable(
"bad evaluation kind");
2602 EltTy = MatTy->getElementType();
2603 if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2604 llvm::MatrixBuilder MB(
Builder);
2605 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2608 llvm::LoadInst *Load =
2610 llvm::Value *Elt =
Builder.CreateExtractElement(Load, Idx,
"matrixext");
2619 unsigned NumLanes = NumCols;
2623 llvm::Constant *ColConstsIndices =
nullptr;
2624 llvm::MatrixBuilder MB(
Builder);
2628 NumLanes = llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2632 llvm::Type *RowTy = llvm::FixedVectorType::get(ElemTy, NumLanes);
2633 llvm::Value *
Result = llvm::PoisonValue::get(RowTy);
2635 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2636 llvm::Value *ColIdx;
2637 if (ColConstsIndices)
2638 ColIdx = ColConstsIndices->getAggregateElement(Col);
2640 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2642 llvm::Value *EltIndex =
2643 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2644 llvm::Value *Elt =
Builder.CreateExtractElement(MatrixVec, EltIndex);
2645 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2652 assert(LV.
isBitField() &&
"Unknown LValue type!");
2670 const unsigned StorageSize =
2673 assert(
static_cast<unsigned>(Offset + Info.
Size) <= StorageSize);
2674 unsigned HighBits = StorageSize - Offset - Info.
Size;
2676 Val =
Builder.CreateShl(Val, HighBits,
"bf.shl");
2677 if (Offset + HighBits)
2678 Val =
Builder.CreateAShr(Val, Offset + HighBits,
"bf.ashr");
2681 Val =
Builder.CreateLShr(Val, Offset,
"bf.lshr");
2682 if (
static_cast<unsigned>(Offset) + Info.
Size < StorageSize)
2684 Val, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
"bf.clear");
2700 llvm::Type *DstTy = llvm::FixedVectorType::get(Vec->getType(), 1);
2701 llvm::Value *
Zero = llvm::Constant::getNullValue(
CGM.Int64Ty);
2702 Vec =
Builder.CreateInsertElement(DstTy, Vec,
Zero,
"cast.splat");
2712 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
2714 llvm::Value *Element =
Builder.CreateExtractElement(Vec, Elt);
2717 if (Element->getType()->getPrimitiveSizeInBits() >
2718 LVTy->getPrimitiveSizeInBits()) {
2720 CGM.getCodeGenOpts().isConvertingBoolWithCmp0())
2721 Element =
Builder.CreateICmpNE(
2722 Element, llvm::Constant::getNullValue(Element->getType()));
2724 Element =
Builder.CreateTrunc(Element, LVTy);
2734 for (
unsigned i = 0; i != NumResultElts; ++i)
2737 Vec =
Builder.CreateShuffleVector(Vec, Mask);
2740 if (
CGM.getCodeGenOpts().isConvertingBoolWithCmp0())
2741 Vec =
Builder.CreateICmpNE(Vec,
2742 llvm::Constant::getNullValue(Vec->getType()));
2754 llvm::Type *VectorElementTy =
CGM.getTypes().ConvertType(EQT);
2762 Builder.CreateConstInBoundsGEP(CastToPointerElement, ix,
2765 return VectorBasePtrPlusIx;
2771 "Bad type for register variable");
2776 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(LV.
getType());
2777 llvm::Type *Ty = OrigTy;
2778 if (OrigTy->isPointerTy())
2779 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
2780 llvm::Type *Types[] = { Ty };
2782 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
2784 F, llvm::MetadataAsValue::get(Ty->getContext(), RegName));
2785 if (OrigTy->isPointerTy())
2803 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2805 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2807 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2808 "vector element type must be at least byte-sized");
2811 if (Val->getType()->getPrimitiveSizeInBits() <
2812 ElemTy->getScalarSizeInBits())
2813 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2816 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2818 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2826 llvm::Type *VecTy = Vec->getType();
2829 if (VecTy->isVectorTy() && SrcVal->getType()->getPrimitiveSizeInBits() <
2830 VecTy->getScalarSizeInBits())
2831 SrcVal =
Builder.CreateZExt(SrcVal, VecTy->getScalarType());
2833 auto *IRStoreTy = dyn_cast<llvm::IntegerType>(Vec->getType());
2835 auto *IRVecTy = llvm::FixedVectorType::get(
2836 Builder.getInt1Ty(), IRStoreTy->getPrimitiveSizeInBits());
2837 Vec =
Builder.CreateBitCast(Vec, IRVecTy);
2844 if (
auto *EltTy = dyn_cast<llvm::FixedVectorType>(SrcVal->getType());
2845 EltTy && EltTy->getNumElements() == 1)
2846 SrcVal =
Builder.CreateBitCast(SrcVal, EltTy->getElementType());
2852 Vec =
Builder.CreateBitCast(Vec, IRStoreTy);
2876 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2878 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2880 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2881 "matrix element type must be at least byte-sized");
2884 if (Val->getType()->getPrimitiveSizeInBits() <
2885 ElemTy->getScalarSizeInBits())
2886 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2889 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2891 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2897 if (
CGM.getCodeGenOpts().isOptimizedBuild()) {
2899 llvm::MatrixBuilder MB(
Builder);
2900 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2905 Builder.CreateInsertElement(Load, InsertVal, Idx,
"matins");
2916 "Store through matrix row LValues is only implemented for HLSL!");
2922 unsigned NumLanes = NumCols;
2926 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2930 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2931 "matrix element type must be at least byte-sized");
2934 if (RowVal->getType()->getScalarType()->getPrimitiveSizeInBits() <
2935 ElemTy->getScalarSizeInBits()) {
2937 llvm::Type *StorageElmTy = llvm::FixedVectorType::get(
2938 ElemTy->getScalarType(), RowValVecTy->getNumElements());
2939 RowVal =
Builder.CreateZExt(RowVal, StorageElmTy);
2942 llvm::MatrixBuilder MB(
Builder);
2944 llvm::Constant *ColConstsIndices =
nullptr;
2948 llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2953 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2954 llvm::Value *ColIdx;
2955 if (ColConstsIndices)
2956 ColIdx = ColConstsIndices->getAggregateElement(Col);
2958 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2960 llvm::Value *EltIndex =
2961 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2962 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2963 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2964 llvm::Value *NewElt =
Builder.CreateExtractElement(RowVal, Lane);
2966 Builder.CreateGEP(DstAddr, {
Zero, EltIndex}, DestAddrTy, ElemAlign);
2973 assert(Dst.
isBitField() &&
"Unknown LValue type");
2988 llvm_unreachable(
"present but none");
3023 CGM.getObjCRuntime().EmitObjCWeakAssign(*
this, src, LvalueDst);
3036 RHS =
Builder.CreatePtrToInt(RHS, ResultType,
"sub.ptr.rhs.cast");
3038 ResultType,
"sub.ptr.lhs.cast");
3039 llvm::Value *BytesBetween =
Builder.CreateSub(LHS, RHS,
"ivar.offset");
3040 CGM.getObjCRuntime().EmitObjCIvarAssign(*
this, src, dst, BytesBetween);
3042 CGM.getObjCRuntime().EmitObjCGlobalAssign(*
this, src, LvalueDst,
3046 CGM.getObjCRuntime().EmitObjCStrongCastAssign(*
this, src, LvalueDst);
3050 assert(Src.
isScalar() &&
"Can't emit an agg store with this method");
3066 llvm::Value *MaskedVal = SrcVal;
3068 const bool UseVolatile =
3071 const unsigned StorageSize =
3076 if (StorageSize != Info.
Size) {
3077 assert(StorageSize > Info.
Size &&
"Invalid bitfield size.");
3084 SrcVal, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
3088 SrcVal =
Builder.CreateShl(SrcVal, Offset,
"bf.shl");
3092 Val, ~llvm::APInt::getBitsSet(StorageSize, Offset, Offset + Info.
Size),
3096 SrcVal =
Builder.CreateOr(Val, SrcVal,
"bf.set");
3098 assert(Offset == 0);
3105 CGM.getCodeGenOpts().ForceAAPCSBitfieldLoad)
3106 Builder.CreateLoad(Ptr,
true,
"bf.load");
3115 llvm::Value *ResultVal = MaskedVal;
3119 assert(Info.
Size <= StorageSize);
3120 unsigned HighBits = StorageSize - Info.
Size;
3122 ResultVal =
Builder.CreateShl(ResultVal, HighBits,
"bf.result.shl");
3123 ResultVal =
Builder.CreateAShr(ResultVal, HighBits,
"bf.result.ashr");
3139 SrcVal->getType()->getScalarSizeInBits())
3148 if (!DestAddrTy->isVectorTy()) {
3150 "this should only occur for non-vector l-values");
3163 CGM.getDataLayout().getPrefTypeAlign(DestAddrTy->getScalarType()));
3164 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
3166 for (
unsigned I = 0; I != NumSrcElts; ++I) {
3167 llvm::Value *Val = VTy ?
Builder.CreateExtractElement(
3168 SrcVal, llvm::ConstantInt::get(
Int32Ty, I))
3175 DstElemAddr =
Builder.CreateGEP(
3176 DstAddr, {
Zero, llvm::ConstantInt::get(
Int32Ty, FieldNo)},
3177 DestAddrTy, ElemAlign);
3186 llvm::Type *VecTy = Vec->getType();
3189 unsigned NumSrcElts = VTy->getNumElements();
3191 if (NumDstElts == NumSrcElts) {
3196 for (
unsigned i = 0; i != NumSrcElts; ++i)
3199 Vec =
Builder.CreateShuffleVector(SrcVal, Mask);
3200 }
else if (NumDstElts > NumSrcElts) {
3206 for (
unsigned i = 0; i != NumSrcElts; ++i)
3207 ExtMask.push_back(i);
3208 ExtMask.resize(NumDstElts, -1);
3209 llvm::Value *ExtSrcVal =
Builder.CreateShuffleVector(SrcVal, ExtMask);
3212 for (
unsigned i = 0; i != NumDstElts; ++i)
3222 for (
unsigned i = 0; i != NumSrcElts; ++i)
3224 Vec =
Builder.CreateShuffleVector(Vec, ExtSrcVal, Mask);
3227 llvm_unreachable(
"unexpected shorten vector length");
3233 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
3235 Vec =
Builder.CreateInsertElement(Vec, SrcVal, Elt);
3245 "Bad type for register variable");
3248 assert(RegName &&
"Register LValue is not metadata");
3251 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(Dst.
getType());
3252 llvm::Type *Ty = OrigTy;
3253 if (OrigTy->isPointerTy())
3254 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
3255 llvm::Type *Types[] = { Ty };
3257 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::write_register, Types);
3259 if (OrigTy->isPointerTy())
3262 F, {llvm::MetadataAsValue::get(Ty->getContext(), RegName),
Value});
3270 bool IsMemberAccess=
false) {
3282 LV.setObjCIvar(
false);
3286 LV.setObjCIvar(
true);
3288 LV.setBaseIvarExp(Exp->getBase());
3293 if (
const auto *Exp = dyn_cast<DeclRefExpr>(E)) {
3294 if (
const auto *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
3295 if (VD->hasGlobalStorage()) {
3296 LV.setGlobalObjCRef(
true);
3304 if (
const auto *Exp = dyn_cast<UnaryOperator>(E)) {
3309 if (
const auto *Exp = dyn_cast<ParenExpr>(E)) {
3311 if (LV.isObjCIvar()) {
3318 LV.setObjCIvar(
false);
3323 if (
const auto *Exp = dyn_cast<GenericSelectionExpr>(E)) {
3328 if (
const auto *Exp = dyn_cast<ImplicitCastExpr>(E)) {
3333 if (
const auto *Exp = dyn_cast<CStyleCastExpr>(E)) {
3338 if (
const auto *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
3343 if (
const auto *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
3345 if (LV.isObjCIvar() && !LV.isObjCArray())
3348 LV.setObjCIvar(
false);
3349 else if (LV.isGlobalObjCRef() && !LV.isObjCArray())
3352 LV.setGlobalObjCRef(
false);
3356 if (
const auto *Exp = dyn_cast<MemberExpr>(E)) {
3370 CGF, VD,
Addr, Loc);
3375 Addr =
Addr.withElementType(RealVarTy);
3381 std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
3382 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
3387 if (!Res || *Res == OMPDeclareTargetDeclAttr::MT_Local ||
3388 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3389 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3392 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3393 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3394 *Res == OMPDeclareTargetDeclAttr::MT_Enter) &&
3396 "Expected link clause OR to clause with unified memory enabled.");
3406 llvm::LoadInst *Load =
3411 PTy, PointeeBaseInfo, PointeeTBAAInfo,
true);
3414 llvm::MDBuilder MDB(Ctx);
3416 if (
CGM.getTypes().getTargetAddressSpace(PTy) == 0 &&
3417 !
CGM.getCodeGenOpts().NullPointerIsValid)
3418 Load->setMetadata(llvm::LLVMContext::MD_nonnull,
3419 llvm::MDNode::get(Ctx, {}));
3425 llvm::LLVMContext::MD_align,
3426 llvm::MDNode::get(Ctx, MDB.createConstant(llvm::ConstantInt::get(
3427 Builder.getInt64Ty(), AlignVal))));
3432 true, PointeeBaseInfo,
3442 PointeeBaseInfo, PointeeTBAAInfo);
3452 BaseInfo, TBAAInfo);
3482 std::optional<LValue> LV =
3491 V = CGF.
Builder.CreateThreadLocalAddress(
V);
3499 VD->
hasAttr<OMPThreadPrivateDeclAttr>()) {
3514 if (FD->
hasAttr<WeakRefAttr>()) {
3529 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
V))
3530 V = llvm::NoCFIValue::get(GV);
3537 llvm::Value *ThisValue) {
3550 AsmLabelAttr *
Asm = VD->
getAttr<AsmLabelAttr>();
3551 assert(
Asm->getLabel().size() < 64-Name.size() &&
3552 "Register name too big");
3553 Name.append(
Asm->getLabel());
3554 llvm::NamedMDNode *M =
3555 CGM.
getModule().getOrInsertNamedMetadata(Name);
3556 if (M->getNumOperands() == 0) {
3559 llvm::Metadata *Ops[] = {Str};
3566 llvm::MetadataAsValue::get(CGM.
getLLVMContext(), M->getOperand(0));
3609 case llvm::GlobalValue::ExternalLinkage:
3610 case llvm::GlobalValue::LinkOnceODRLinkage:
3611 case llvm::GlobalValue::WeakODRLinkage:
3612 case llvm::GlobalValue::InternalLinkage:
3613 case llvm::GlobalValue::PrivateLinkage:
3625 "should not emit an unevaluated operand");
3627 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3630 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
3638 (VD->getType()->isReferenceType() ||
3640 VD->getAnyInitializer(VD);
3642 E->
getLocation(), *VD->evaluateValue(), VD->getType());
3643 assert(Val &&
"failed to emit constant expression");
3646 if (!VD->getType()->isReferenceType()) {
3648 Addr =
CGM.createUnnamedGlobalFrom(*VD, Val,
3651 auto *PTy = llvm::PointerType::get(
3670 VD = VD->getCanonicalDecl();
3674 auto I = LocalDeclMap.find(VD);
3675 if (I != LocalDeclMap.end()) {
3677 if (VD->getType()->isReferenceType())
3685 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3702 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3718 "Should not use decl without marking it used!");
3720 if (ND->
hasAttr<WeakRefAttr>()) {
3726 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3728 if (VD->hasLinkage() || VD->isStaticDataMember())
3734 auto iter = LocalDeclMap.find(VD);
3735 if (iter != LocalDeclMap.end()) {
3736 addr = iter->second;
3740 }
else if (VD->isStaticLocal()) {
3741 llvm::Constant *var =
CGM.getOrCreateStaticVarDecl(
3742 *VD,
CGM.getLLVMLinkageVarDefinition(VD));
3748 llvm_unreachable(
"DeclRefExpr for Decl not entered in LocalDeclMap?");
3759 VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
3766 bool isBlockByref = VD->isEscapingByref();
3772 LValue LV = VD->getType()->isReferenceType() ?
3776 bool isLocalStorage = VD->hasLocalStorage();
3778 bool NonGCable = isLocalStorage &&
3779 !VD->getType()->isReferenceType() &&
3786 bool isImpreciseLifetime =
3787 (isLocalStorage && !VD->hasAttr<ObjCPreciseLifetimeAttr>());
3788 if (isImpreciseLifetime)
3794 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
3800 if (
const auto *BD = dyn_cast<BindingDecl>(ND)) {
3817 if (
const auto *GD = dyn_cast<MSGuidDecl>(ND))
3821 if (
const auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
3825 if (AS != T.getAddressSpace()) {
3828 llvm::PointerType::get(
CGM.getLLVMContext(), TargetAS);
3829 llvm::Constant *ASC =
CGM.performAddrSpaceCast(ATPO.
getPointer(), PtrTy);
3836 llvm_unreachable(
"Unhandled DeclRefExpr");
3846 default: llvm_unreachable(
"Unknown unary operator lvalue!");
3849 assert(!T.isNull() &&
"CodeGenFunction::EmitUnaryOpLValue: Illegal type");
3871 assert(LV.
isSimple() &&
"real/imag on non-ordinary l-value");
3888 CGM.getTBAAInfoForSubobject(LV, T));
3895 bool isInc = E->
getOpcode() == UO_PreInc;
3918 assert(SL !=
nullptr &&
"No StringLiteral name in PredefinedExpr");
3919 StringRef FnName =
CurFn->getName();
3920 FnName.consume_front(
"\01");
3921 StringRef NameItems[] = {
3923 std::string GVName = llvm::join(NameItems, NameItems + 2,
".");
3924 if (
auto *BD = dyn_cast_or_null<BlockDecl>(
CurCodeDecl)) {
3925 std::string Name = std::string(SL->getString());
3926 if (!Name.empty()) {
3927 unsigned Discriminator =
3928 CGM.getCXXABI().getMangleContext().getBlockId(BD,
true);
3930 Name +=
"_" + Twine(Discriminator + 1).str();
3931 auto C =
CGM.GetAddrOfConstantCString(Name, GVName);
3934 auto C =
CGM.GetAddrOfConstantCString(std::string(FnName), GVName);
3938 auto C =
CGM.GetAddrOfConstantStringFromLiteral(SL, GVName);
3955 if (llvm::Constant *
C =
CGM.getTypeDescriptorFromMap(T))
3960 bool IsBitInt =
false;
3962 if (T->isIntegerType()) {
3965 (T->isSignedIntegerType() ? 1 : 0);
3969 if (T->isSignedIntegerType() && T->getAs<
BitIntType>()) {
3972 " non positive amount of bits in __BitInt type");
3974 " too many bits in __BitInt type");
3981 }
else if (T->isFloatingType()) {
3990 (
intptr_t)T.getAsOpaquePtr(), StringRef(),
3991 StringRef(), {}, Buffer, {});
3996 char S[6] = {
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'};
3999 llvm::support::endian::write32(S + 1, Bits,
4001 ? llvm::endianness::big
4002 : llvm::endianness::little);
4003 StringRef Str = StringRef(S,
sizeof(S) /
sizeof(
decltype(S[0])));
4007 llvm::Constant *Components[] = {
4011 llvm::Constant *Descriptor = llvm::ConstantStruct::getAnon(Components);
4013 auto *GV =
new llvm::GlobalVariable(
4014 CGM.getModule(), Descriptor->getType(),
4015 true, llvm::GlobalVariable::PrivateLinkage, Descriptor);
4016 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4017 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(GV);
4020 CGM.setTypeDescriptorInMap(T, GV);
4028 if (
V->getType() == TargetTy)
4033 if (
V->getType()->isFloatingPointTy()) {
4034 unsigned Bits =
V->getType()->getPrimitiveSizeInBits().getFixedValue();
4035 if (Bits <= TargetTy->getIntegerBitWidth())
4041 if (
V->getType()->isIntegerTy() &&
4042 V->getType()->getIntegerBitWidth() <= TargetTy->getIntegerBitWidth())
4043 return Builder.CreateZExt(
V, TargetTy);
4046 if (!
V->getType()->isPointerTy()) {
4051 return Builder.CreatePtrToInt(
V, TargetTy);
4064 llvm::Constant *Filename;
4071 int PathComponentsToStrip =
4072 CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;
4073 if (PathComponentsToStrip < 0) {
4074 assert(PathComponentsToStrip !=
INT_MIN);
4075 int PathComponentsToKeep = -PathComponentsToStrip;
4076 auto I = llvm::sys::path::rbegin(FilenameString);
4077 auto E = llvm::sys::path::rend(FilenameString);
4078 while (I != E && --PathComponentsToKeep)
4081 FilenameString = FilenameString.substr(I - E);
4082 }
else if (PathComponentsToStrip > 0) {
4083 auto I = llvm::sys::path::begin(FilenameString);
4084 auto E = llvm::sys::path::end(FilenameString);
4085 while (I != E && PathComponentsToStrip--)
4090 FilenameString.substr(I - llvm::sys::path::begin(FilenameString));
4092 FilenameString = llvm::sys::path::filename(FilenameString);
4096 CGM.GetAddrOfConstantCString(std::string(FilenameString),
".src");
4097 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(
4099 FilenameGV.getPointer()->stripPointerCasts()));
4100 Filename = FilenameGV.getPointer();
4104 Filename = llvm::Constant::getNullValue(
Int8PtrTy);
4111 return llvm::ConstantStruct::getAnon(
Data);
4116enum class CheckRecoverableKind {
4127static CheckRecoverableKind
4129 if (Ordinal == SanitizerKind::SO_Vptr)
4130 return CheckRecoverableKind::AlwaysRecoverable;
4131 else if (Ordinal == SanitizerKind::SO_Return ||
4132 Ordinal == SanitizerKind::SO_Unreachable)
4133 return CheckRecoverableKind::Unrecoverable;
4135 return CheckRecoverableKind::Recoverable;
4139struct SanitizerHandlerInfo {
4140 char const *
const Name;
4146#define SANITIZER_CHECK(Enum, Name, Version, Msg) {#Name, Version},
4148#undef SANITIZER_CHECK
4152 llvm::FunctionType *FnType,
4155 CheckRecoverableKind RecoverKind,
bool IsFatal,
4156 llvm::BasicBlock *ContBB,
bool NoMerge) {
4157 assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
4158 std::optional<ApplyDebugLocation> DL;
4159 if (!CGF.
Builder.getCurrentDebugLocation()) {
4163 bool NeedsAbortSuffix =
4164 IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
4166 bool HandlerPreserveAllRegs =
4169 const StringRef CheckName = CheckInfo.Name;
4170 std::string FnName =
"__ubsan_handle_" + CheckName.str();
4171 if (CheckInfo.Version && !MinimalRuntime)
4172 FnName +=
"_v" + llvm::utostr(CheckInfo.Version);
4174 FnName +=
"_minimal";
4175 if (NeedsAbortSuffix)
4177 if (HandlerPreserveAllRegs && !NeedsAbortSuffix)
4178 FnName +=
"_preserve";
4180 !IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
4184 B.addAttribute(llvm::Attribute::NoReturn)
4185 .addAttribute(llvm::Attribute::NoUnwind);
4187 B.addUWTableAttr(llvm::UWTableKind::Default);
4192 llvm::AttributeList::FunctionIndex, B),
4198 HandlerCall->addFnAttr(llvm::Attribute::NoMerge);
4199 if (HandlerPreserveAllRegs && !NeedsAbortSuffix) {
4201 HandlerCall->setCallingConv(llvm::CallingConv::PreserveAll);
4204 HandlerCall->setDoesNotReturn();
4205 CGF.
Builder.CreateUnreachable();
4212 ArrayRef<std::pair<llvm::Value *, SanitizerKind::SanitizerOrdinal>> Checked,
4216 assert(Checked.size() > 0);
4217 assert(CheckHandler >= 0 &&
4221 llvm::Value *FatalCond =
nullptr;
4222 llvm::Value *RecoverableCond =
nullptr;
4223 llvm::Value *TrapCond =
nullptr;
4224 bool NoMerge =
false;
4231 for (
auto &[Check, Ord] : Checked) {
4232 llvm::Value *GuardedCheck = Check;
4234 (
CGM.getCodeGenOpts().SanitizeSkipHotCutoffs[Ord] > 0)) {
4236 CGM.getIntrinsic(llvm::Intrinsic::allow_ubsan_check),
4237 llvm::ConstantInt::get(
CGM.Int8Ty, Ord));
4242 llvm::Value *&
Cond =
CGM.getCodeGenOpts().SanitizeTrap.has(Ord) ? TrapCond
4243 :
CGM.getCodeGenOpts().SanitizeRecover.has(Ord)
4248 if (!
CGM.getCodeGenOpts().SanitizeMergeHandlers.has(Ord))
4254 if (!FatalCond && !RecoverableCond)
4257 llvm::Value *JointCond;
4258 if (FatalCond && RecoverableCond)
4259 JointCond =
Builder.CreateAnd(FatalCond, RecoverableCond);
4261 JointCond = FatalCond ? FatalCond : RecoverableCond;
4265 assert(
SanOpts.has(Checked[0].second));
4267 for (
int i = 1, n = Checked.size(); i < n; ++i) {
4269 "All recoverable kinds in a single check must be same!");
4270 assert(
SanOpts.has(Checked[i].second));
4276 llvm::Instruction *Branch =
Builder.CreateCondBr(JointCond, Cont, Handlers);
4279 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4280 Branch->setMetadata(llvm::LLVMContext::MD_prof, Node);
4284 if (
CGM.getCodeGenOpts().SanitizeMinimalRuntime) {
4295 Args.reserve(DynamicArgs.size() + 1);
4296 ArgTypes.reserve(DynamicArgs.size() + 1);
4299 if (!StaticArgs.empty()) {
4300 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4301 auto *InfoPtr =
new llvm::GlobalVariable(
4302 CGM.getModule(), Info->getType(),
4305 false, llvm::GlobalVariable::PrivateLinkage, Info,
"",
4306 nullptr, llvm::GlobalVariable::NotThreadLocal,
4307 CGM.getDataLayout().getDefaultGlobalsAddressSpace());
4308 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4309 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4310 Args.push_back(InfoPtr);
4311 ArgTypes.push_back(Args.back()->getType());
4314 for (llvm::Value *DynamicArg : DynamicArgs) {
4319 llvm::FunctionType *FnType =
4320 llvm::FunctionType::get(
CGM.VoidTy, ArgTypes,
false);
4322 if (!FatalCond || !RecoverableCond) {
4326 (FatalCond !=
nullptr), Cont, NoMerge);
4330 llvm::BasicBlock *NonFatalHandlerBB =
4333 Builder.CreateCondBr(FatalCond, NonFatalHandlerBB, FatalHandlerBB);
4336 NonFatalHandlerBB, NoMerge);
4347 llvm::ConstantInt *TypeId, llvm::Value *Ptr,
4352 llvm::CondBrInst *BI =
Builder.CreateCondBr(
Cond, Cont, CheckBB);
4355 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4356 BI->setMetadata(llvm::LLVMContext::MD_prof, Node);
4360 bool WithDiag = !
CGM.getCodeGenOpts().SanitizeTrap.has(Ordinal);
4362 llvm::CallInst *CheckCall;
4363 llvm::FunctionCallee SlowPathFn;
4365 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4367 new llvm::GlobalVariable(
CGM.getModule(), Info->getType(),
false,
4368 llvm::GlobalVariable::PrivateLinkage, Info);
4369 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4370 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4372 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4373 "__cfi_slowpath_diag",
4376 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr, InfoPtr});
4378 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4381 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr});
4386 CheckCall->setDoesNotThrow();
4394 llvm::Module *M = &
CGM.getModule();
4396 QualType QInt64Ty =
C.getIntTypeForBitwidth(64,
false);
4398 auto *ArgCallsiteTypeId =
4402 auto *ArgCFICheckFailData =
4406 CGM.getTypes().arrangeBuiltinFunctionDeclaration(
C.VoidTy,
FnArgs);
4408 llvm::Function *F = llvm::Function::Create(
4410 llvm::GlobalValue::WeakAnyLinkage,
"__cfi_check", M);
4412 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4413 F->setAlignment(llvm::Align(4096));
4416 llvm::LLVMContext &Ctx = M->getContext();
4417 llvm::BasicBlock *BB = llvm::BasicBlock::Create(Ctx,
"entry", F);
4420 llvm::CallInst::Create(M->getFunction(
"__cfi_check_fail"), Args,
"", BB);
4421 llvm::ReturnInst::Create(Ctx,
nullptr, BB);
4432 auto CheckHandler = SanitizerHandler::CFICheckFail;
4439 {SanitizerKind::SO_CFIVCall, SanitizerKind::SO_CFINVCall,
4440 SanitizerKind::SO_CFIDerivedCast, SanitizerKind::SO_CFIUnrelatedCast,
4441 SanitizerKind::SO_CFIICall},
4452 llvm::Function *F = llvm::Function::Create(
4454 llvm::GlobalValue::WeakODRLinkage,
"__cfi_check_fail", &
CGM.getModule());
4457 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4458 F->setVisibility(llvm::GlobalValue::HiddenVisibility);
4472 CGM.getContext().VoidPtrTy, ArgData->getLocation());
4475 CGM.getContext().VoidPtrTy, ArgAddr->getLocation());
4478 llvm::Value *DataIsNotNullPtr =
4483 EmitTrapCheck(DataIsNotNullPtr, SanitizerHandler::CFICheckFail,
4486 llvm::StructType *SourceLocationTy =
4488 llvm::StructType *CfiCheckFailDataTy =
4491 llvm::Value *
V =
Builder.CreateConstGEP2_32(
4495 llvm::Value *CheckKind =
Builder.CreateLoad(CheckKindAddr);
4497 llvm::Value *AllVtables = llvm::MetadataAsValue::get(
4498 CGM.getLLVMContext(),
4499 llvm::MDString::get(
CGM.getLLVMContext(),
"all-vtables"));
4500 llvm::Value *ValidVtable =
Builder.CreateZExt(
4501 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::type_test),
4502 {Addr, AllVtables}),
4505 const std::pair<int, SanitizerKind::SanitizerOrdinal> CheckKinds[] = {
4512 for (
auto CheckKindOrdinalPair : CheckKinds) {
4513 int Kind = CheckKindOrdinalPair.first;
4520 Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(
Int8Ty, Kind));
4521 if (
CGM.getLangOpts().Sanitize.has(Ordinal))
4522 EmitCheck(std::make_pair(
Cond, Ordinal), SanitizerHandler::CFICheckFail,
4535 CGM.addUsedGlobal(F);
4539 if (
SanOpts.has(SanitizerKind::Unreachable)) {
4540 auto CheckOrdinal = SanitizerKind::SO_Unreachable;
4541 auto CheckHandler = SanitizerHandler::BuiltinUnreachable;
4557 if ((
int)TrapBBs.size() <= CheckHandlerID)
4558 TrapBBs.resize(CheckHandlerID + 1);
4560 llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
4562 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
4563 llvm::StringRef TrapMessage;
4564 llvm::StringRef TrapCategory;
4565 auto DebugTrapReasonKind =
CGM.getCodeGenOpts().getSanitizeDebugTrapReasons();
4567 DebugTrapReasonKind ==
4573 TrapCategory =
"Undefined Behavior Sanitizer";
4577 DebugTrapReasonKind !=
4581 TrapLocation, TrapCategory, TrapMessage);
4584 NoMerge = NoMerge || !
CGM.getCodeGenOpts().isOptimizedBuild() ||
4588 if (TrapBB && !NoMerge) {
4589 auto Call = TrapBB->begin();
4592 Call->applyMergedLocation(
Call->getDebugLoc(), TrapLocation);
4594 Builder.CreateCondBr(Checked, Cont, TrapBB,
4595 MDHelper.createLikelyBranchWeights());
4598 Builder.CreateCondBr(Checked, Cont, TrapBB,
4599 MDHelper.createLikelyBranchWeights());
4604 llvm::CallInst *TrapCall;
4605 if (
CGM.getCodeGenOpts().SanitizeTrapLoop)
4607 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::looptrap));
4609 TrapCall =
Builder.CreateCall(
4610 CGM.getIntrinsic(llvm::Intrinsic::ubsantrap),
4611 llvm::ConstantInt::get(
CGM.Int8Ty, CheckHandlerID));
4613 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4614 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4615 CGM.getCodeGenOpts().TrapFuncName);
4616 TrapCall->addFnAttr(A);
4619 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4620 TrapCall->setDoesNotReturn();
4621 TrapCall->setDoesNotThrow();
4629 llvm::CallInst *TrapCall =
4630 Builder.CreateCall(
CGM.getIntrinsic(IntrID));
4632 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4633 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4634 CGM.getCodeGenOpts().TrapFuncName);
4635 TrapCall->addFnAttr(A);
4639 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4647 "Array to pointer decay must have array source type!");
4656 Addr =
Addr.withElementType(NewTy);
4662 "Expected pointer to array");
4668 Builder.CreateStructuredGEP(NewTy,
Addr.emitRawPointer(*
this), {});
4682 if (TBAAInfo) *TBAAInfo =
CGM.getTBAAAccessInfo(EltType);
4691 const auto *CE = dyn_cast<CastExpr>(E);
4692 if (!CE || CE->getCastKind() != CK_ArrayToPointerDecay)
4704 llvm::Type *elemType,
4710 const llvm::Twine &name =
"arrayidx") {
4711 if (inbounds && CGF.
getLangOpts().EmitLogicalPointer)
4712 return CGF.
Builder.CreateStructuredGEP(elemType, ptr, indices);
4726 llvm::Type *elementType,
bool inbounds,
4729 const llvm::Twine &name =
"arrayidx") {
4730 if (inbounds && CGF.
getLangOpts().EmitLogicalPointer)
4733 indices.drop_front()),
4734 elementType, align);
4755 return D && D->
hasAttr<BPFPreserveStaticOffsetAttr>();
4762 if (PointeeType.
isNull())
4775 llvm::Function *Fn =
4777 llvm::CallInst *
Call = CGF.
Builder.CreateCall(Fn, {
Addr.emitRawPointer(CGF)});
4795 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4796 return ME->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>();
4798 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
4799 const auto *VarDef = dyn_cast<VarDecl>(DRE->getDecl());
4803 const auto *PtrT = VarDef->getType()->getAs<
PointerType>();
4809 if (
const auto *RecT = dyn_cast<RecordType>(PointeeT))
4810 return RecT->getDecl()
4811 ->getMostRecentDecl()
4812 ->
hasAttr<BPFPreserveAccessIndexAttr>();
4825 const llvm::Twine &name =
"arrayidx") {
4828 for (
auto *idx : indices.drop_back())
4847 llvm::Value *eltPtr;
4848 auto LastIndex = dyn_cast<llvm::ConstantInt>(indices.back());
4855 signedIndices, loc, eltAlign, name);
4859 unsigned idx = LastIndex->getZExtValue();
4860 llvm::DIType *DbgInfo =
nullptr;
4863 eltPtr = CGF.
Builder.CreatePreserveArrayAccessIndex(
4875struct StructFieldAccess
4876 :
public ConstStmtVisitor<StructFieldAccess, const Expr *> {
4877 const Expr *VisitCastExpr(
const CastExpr *E) {
4882 const Expr *VisitParenExpr(
const ParenExpr *E) {
4891 const FieldDecl *Field, int64_t &Offset) {
4894 unsigned FieldNo = 0;
4929 if (FD1OuterRec != FD2OuterRec)
4931 return std::optional<int64_t>();
4933 int64_t FD1Offset = 0;
4935 return std::optional<int64_t>();
4937 int64_t FD2Offset = 0;
4939 return std::optional<int64_t>();
4941 return std::make_optional<int64_t>(FD1Offset - FD2Offset);
4953 QualType IndexType, llvm::Value *IndexVal,
bool Accessed,
4954 bool FlexibleArray) {
4955 const auto *ME = dyn_cast<MemberExpr>(ArrayExpr->
IgnoreImpCasts());
4956 if (!ME || !ME->getMemberDecl()->getType()->isCountAttributedType())
4961 if (FlexibleArray &&
4962 !ME->isFlexibleArrayMemberLike(
getContext(), StrictFlexArraysLevel))
4970 if (std::optional<int64_t> Diff =
4985 ArrayInst =
Builder.CreatePointerBitCastOrAddrSpaceCast(ArrayInst,
4989 llvm::Value *BoundsVal =
4991 Builder.getInt32(*Diff),
".counted_by.gep");
4993 ".counted_by.load");
4997 CountFD->
getType(), Accessed);
5005 llvm::Value *IdxPre =
5007 bool SignedIndices =
false;
5008 auto EmitIdxAfterBase = [&, IdxPre](
bool Promote) -> llvm::Value * {
5011 assert(E->
getRHS() == E->
getIdx() &&
"index was neither LHS nor RHS");
5017 SignedIndices |= IdxSigned;
5019 if (
SanOpts.has(SanitizerKind::ArrayBounds))
5023 if (Promote && Idx->getType() !=
IntPtrTy)
5036 auto *Idx = EmitIdxAfterBase(
false);
5037 assert(LHS.
isSimple() &&
"Can only subscript lvalue vectors here!");
5045 std::optional<LValue> LV;
5048 LV =
CGM.getHLSLRuntime().emitResourceArraySubscriptExpr(E, *
this);
5050 LV =
CGM.getHLSLRuntime().emitBufferArraySubscriptExpr(E, *
this,
5062 auto *Idx = EmitIdxAfterBase(
true);
5069 CGM.getTBAAInfoForSubobject(LV, EltType));
5081 auto *Idx = EmitIdxAfterBase(
true);
5091 Idx =
Builder.CreateMul(Idx, numElements);
5093 Idx =
Builder.CreateNSWMul(Idx, numElements);
5105 auto *Idx = EmitIdxAfterBase(
true);
5108 llvm::Value *InterfaceSizeVal =
5109 llvm::ConstantInt::get(Idx->getType(), InterfaceSize.
getQuantity());
5111 llvm::Value *ScaledIdx =
Builder.CreateMul(Idx, InterfaceSizeVal);
5117 llvm::Type *OrigBaseElemTy =
Addr.getElementType();
5122 llvm::Value *EltPtr =
5124 ScaledIdx,
false, SignedIndices, E->
getExprLoc());
5131 assert(Array->getType()->isArrayType() &&
5132 "Array to pointer decay must have array source type!");
5136 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5140 auto *Idx = EmitIdxAfterBase(
true);
5142 if (
SanOpts.has(SanitizerKind::ArrayBounds))
5150 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5154 if (!
CGM.getCodeGenOpts().NewStructPathTBAA) {
5157 EltTBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, E->
getType());
5162 EltTBAAInfo =
CGM.getTBAAAccessInfo(E->
getType());
5184 auto *Idx = EmitIdxAfterBase(
true);
5191 if (
SanOpts.has(SanitizerKind::ArrayBounds)) {
5192 StructFieldAccess Visitor;
5195 if (
const auto *CE = dyn_cast_if_present<CastExpr>(
Base);
5196 CE && CE->getCastKind() == CK_LValueToRValue)
5229 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
Base, *
this);
5239 "incomplete matrix subscript expressions should be rejected during Sema");
5245 llvm::MatrixBuilder MB(
Builder);
5248 unsigned NumRows = MatrixTy->getNumRows();
5249 bool IsMatrixRowMajor =
5251 llvm::Value *FinalIdx =
5252 MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
5263 bool IsLowerBound) {
5265 if (
auto *ASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParenImpCasts())) {
5269 BaseInfo = BaseLVal.getBaseInfo();
5274 Addr =
Addr.withElementType(NewTy);
5280 "Expected pointer to array");
5290 BaseInfo.mergeForCast(TypeBaseInfo);
5299 bool IsLowerBound) {
5302 "OpenACC Array section codegen not implemented");
5306 if (
auto *AT =
getContext().getAsArrayType(BaseTy))
5307 ResultExprTy = AT->getElementType();
5310 llvm::Value *Idx =
nullptr;
5318 LowerBound->getType()->hasSignedIntegerRepresentation());
5320 Idx = llvm::ConstantInt::getNullValue(
IntPtrTy);
5325 auto &
C =
CGM.getContext();
5327 llvm::APSInt ConstLength;
5330 if (std::optional<llvm::APSInt>
CL = Length->getIntegerConstantExpr(
C)) {
5337 if (std::optional<llvm::APSInt> LB =
5338 LowerBound->getIntegerConstantExpr(
C)) {
5340 LowerBound =
nullptr;
5345 else if (!LowerBound)
5348 if (Length || LowerBound) {
5349 auto *LowerBoundVal =
5353 LowerBound->getType()->hasSignedIntegerRepresentation())
5354 : llvm::ConstantInt::get(
IntPtrTy, ConstLowerBound);
5359 Length->getType()->hasSignedIntegerRepresentation())
5360 : llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5361 Idx =
Builder.CreateAdd(LowerBoundVal, LengthVal,
"lb_add_len",
5364 if (Length && LowerBound) {
5366 Idx, llvm::ConstantInt::get(
IntPtrTy, 1),
"idx_sub_1",
5370 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength + ConstLowerBound);
5376 if (
auto *VAT =
C.getAsVariableArrayType(ArrayTy)) {
5377 Length = VAT->getSizeExpr();
5378 if (std::optional<llvm::APSInt> L = Length->getIntegerConstantExpr(
C)) {
5383 auto *CAT =
C.getAsConstantArrayType(ArrayTy);
5384 assert(CAT &&
"unexpected type for array initializer");
5385 ConstLength = CAT->getSize();
5388 auto *LengthVal =
Builder.CreateIntCast(
5390 Length->getType()->hasSignedIntegerRepresentation());
5392 LengthVal, llvm::ConstantInt::get(
IntPtrTy, 1),
"len_sub_1",
5397 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5406 if (
auto *VLA =
getContext().getAsVariableArrayType(ResultExprTy)) {
5412 BaseTy, VLA->getElementType(), IsLowerBound);
5421 Idx =
Builder.CreateMul(Idx, NumElements);
5423 Idx =
Builder.CreateNSWMul(Idx, NumElements);
5432 assert(Array->getType()->isArrayType() &&
5433 "Array to pointer decay must have array source type!");
5437 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5444 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5445 ResultExprTy, !
getLangOpts().PointerOverflowDefined,
5448 TBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, ResultExprTy);
5452 ResultExprTy, IsLowerBound);
5475 Base.getQuals().removeObjCGCAttr();
5484 "Result must be a vector");
5492 if (LTy->getScalarSizeInBits() > Vec->getType()->getScalarSizeInBits())
5493 Vec =
Builder.CreateZExt(Vec, LTy);
5494 Builder.CreateStore(Vec, VecMem);
5505 if (
Base.isSimple()) {
5506 llvm::Constant *CV =
5512 if (
Base.isMatrixRow()) {
5514 llvm::dyn_cast<llvm::ConstantInt>(
Base.getMatrixRowIdx())) {
5518 unsigned NumCols = Indices.size();
5520 unsigned Row = RowIdx->getZExtValue();
5524 QualType ElemQT = EVT->getElementType();
5527 for (
unsigned C = 0;
C < NumCols; ++
C) {
5528 unsigned Col = Indices[
C];
5529 unsigned Linear = Col * NumRows + Row;
5530 MatIndices.push_back(llvm::ConstantInt::get(
Int32Ty, Linear));
5533 llvm::Constant *ConstIdxs = llvm::ConstantVector::get(MatIndices);
5537 llvm::Constant *Cols =
5544 Base.getMatrixAddress(),
Base.getMatrixRowIdx(), Cols,
Base.getType(),
5548 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
5550 llvm::Constant *BaseElts =
Base.getExtVectorElts();
5553 for (
unsigned Index : Indices)
5554 CElts.push_back(BaseElts->getAggregateElement(Index));
5555 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
5562 while (
auto *BaseMemberExpr = dyn_cast<MemberExpr>(UnderlyingBaseExpr))
5563 UnderlyingBaseExpr = BaseMemberExpr->getBase()->
IgnoreParens();
5576 return CGM.getHLSLRuntime().emitBufferMemberExpr(*
this, E);
5579 std::optional<LValue> LV;
5580 LV =
CGM.getHLSLRuntime().emitResourceMemberExpr(*
this, E);
5590 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
5602 SkippedChecks.
set(SanitizerKind::Alignment,
true);
5604 SkippedChecks.
set(SanitizerKind::Null,
true);
5612 if (
auto *Field = dyn_cast<FieldDecl>(ND)) {
5620 CGM.getOpenMPRuntime().isNontemporalDecl(Field)) ||
5627 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
5630 llvm_unreachable(
"Unhandled member declaration!");
5637 llvm::Value *ThisValue) {
5638 bool HasExplicitObjectParameter =
false;
5639 const auto *MD = dyn_cast_if_present<CXXMethodDecl>(
CurCodeDecl);
5641 HasExplicitObjectParameter = MD->isExplicitObjectMemberFunction();
5642 assert(MD->getParent()->isLambda());
5643 assert(MD->getParent() == Field->getParent());
5646 if (HasExplicitObjectParameter) {
5648 auto It = LocalDeclMap.find(D);
5649 assert(It != LocalDeclMap.end() &&
"explicit parameter not loaded?");
5650 Address AddrOfExplicitObject = It->getSecond();
5661 if (ThisTy != LambdaTy) {
5664 LambdaLV.
getAddress(), ThisTy, BasePathArray.begin(),
5684 unsigned FieldIndex) {
5685 unsigned I = 0, Skipped = 0;
5688 if (I == FieldIndex)
5690 if (F->isUnnamedBitField())
5695 return FieldIndex - Skipped;
5705 if (Offset.isZero())
5727 llvm::Type *StructType =
5733 {CGF.Builder.getSize(idx)}),
5748 const FieldDecl *field,
bool IsInBounds) {
5775 if (RD->isDynamicClass())
5778 for (
const auto &
Base : RD->bases())
5797 const bool UseVolatile =
isAAPCS(
CGM.getTarget()) &&
5798 CGM.getCodeGenOpts().AAPCSBitfieldWidth &&
5829 llvm::Type *FieldIntTy = llvm::Type::getIntNTy(
getLLVMContext(), SS);
5830 Addr =
Addr.withElementType(FieldIntTy);
5865 assert(!FieldTBAAInfo.
Offset &&
5866 "Nonzero offset for an access with no base type!");
5879 FieldTBAAInfo.
Size =
5886 if (
auto *ClassDef = dyn_cast<CXXRecordDecl>(rec)) {
5887 if (
CGM.getCodeGenOpts().StrictVTablePointers &&
5888 ClassDef->isDynamicClass()) {
5902 if (
CGM.getCodeGenOpts().StrictVTablePointers &&
5906 addr =
Builder.CreateLaunderInvariantGroup(addr);
5949 if (field->
hasAttr<AnnotateAttr>())
5965 QualType FieldType = Field->getType();
5971 *
this,
Base.getAddress(), Field,
5976 V =
V.withElementType(llvmType);
5985 CGM.getTBAAInfoForSubobject(
Base, FieldType));
6021 assert(E->
isTransparent() &&
"non-transparent glvalue init list");
6029 const Expr *Operand) {
6030 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Operand->IgnoreParens())) {
6032 return std::nullopt;
6041std::optional<LValue> HandleConditionalOperatorLValueSimpleCase(
6043 const Expr *condExpr = E->
getCond();
6048 std::swap(Live, Dead);
6058 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Live->
IgnoreParens())) {
6069 return std::nullopt;
6071struct ConditionalInfo {
6072 llvm::BasicBlock *lhsBlock, *rhsBlock;
6073 std::optional<LValue> LHS, RHS;
6078template<
typename FuncTy>
6080 const AbstractConditionalOperator *E,
6081 const FuncTy &BranchGenFunc) {
6097 Info.lhsBlock = CGF.
Builder.GetInsertBlock();
6100 CGF.
Builder.CreateBr(endBlock);
6108 Info.rhsBlock = CGF.
Builder.GetInsertBlock();
6120 "Unexpected conditional operator!");
6125 if (HandleConditionalOperatorLValueSimpleCase(*
this, E))
6128 EmitConditionalBlocks(*
this, E, [](CodeGenFunction &CGF,
const Expr *E) {
6135 if (!
expr->isGLValue()) {
6138 "Unexpected conditional operator!");
6143 if (std::optional<LValue> Res =
6144 HandleConditionalOperatorLValueSimpleCase(*
this,
expr))
6147 ConditionalInfo Info = EmitConditionalBlocks(
6148 *
this,
expr, [](CodeGenFunction &CGF,
const Expr *E) {
6152 if ((Info.LHS && !Info.LHS->isSimple()) ||
6153 (Info.RHS && !Info.RHS->isSimple()))
6156 if (Info.LHS && Info.RHS) {
6157 Address lhsAddr = Info.LHS->getAddress();
6158 Address rhsAddr = Info.RHS->getAddress();
6160 lhsAddr, rhsAddr, Info.lhsBlock, Info.rhsBlock,
6163 std::max(Info.LHS->getBaseInfo().getAlignmentSource(),
6164 Info.RHS->getBaseInfo().getAlignmentSource());
6166 Info.LHS->getTBAAInfo(), Info.RHS->getTBAAInfo());
6170 assert((Info.LHS || Info.RHS) &&
6171 "both operands of glvalue conditional are throw-expressions?");
6172 return Info.LHS ? *Info.LHS : *Info.RHS;
6184 llvm::scope_exit RestoreCurCast([
this, Prev =
CurCast] {
CurCast = Prev; });
6189 case CK_LValueToRValueBitCast:
6190 case CK_ArrayToPointerDecay:
6191 case CK_FunctionToPointerDecay:
6192 case CK_NullToMemberPointer:
6193 case CK_NullToPointer:
6194 case CK_IntegralToPointer:
6195 case CK_PointerToIntegral:
6196 case CK_PointerToBoolean:
6197 case CK_IntegralCast:
6198 case CK_BooleanToSignedIntegral:
6199 case CK_IntegralToBoolean:
6200 case CK_IntegralToFloating:
6201 case CK_FloatingToIntegral:
6202 case CK_FloatingToBoolean:
6203 case CK_FloatingCast:
6204 case CK_FloatingRealToComplex:
6205 case CK_FloatingComplexToReal:
6206 case CK_FloatingComplexToBoolean:
6207 case CK_FloatingComplexCast:
6208 case CK_FloatingComplexToIntegralComplex:
6209 case CK_IntegralRealToComplex:
6210 case CK_IntegralComplexToReal:
6211 case CK_IntegralComplexToBoolean:
6212 case CK_IntegralComplexCast:
6213 case CK_IntegralComplexToFloatingComplex:
6214 case CK_DerivedToBaseMemberPointer:
6215 case CK_BaseToDerivedMemberPointer:
6216 case CK_MemberPointerToBoolean:
6217 case CK_ReinterpretMemberPointer:
6218 case CK_AnyPointerToBlockPointerCast:
6219 case CK_ARCProduceObject:
6220 case CK_ARCConsumeObject:
6221 case CK_ARCReclaimReturnedObject:
6222 case CK_ARCExtendBlockObject:
6223 case CK_CopyAndAutoreleaseBlockObject:
6224 case CK_IntToOCLSampler:
6225 case CK_FloatingToFixedPoint:
6226 case CK_FixedPointToFloating:
6227 case CK_FixedPointCast:
6228 case CK_FixedPointToBoolean:
6229 case CK_FixedPointToIntegral:
6230 case CK_IntegralToFixedPoint:
6232 case CK_HLSLVectorTruncation:
6233 case CK_HLSLMatrixTruncation:
6234 case CK_HLSLArrayRValue:
6235 case CK_HLSLElementwiseCast:
6236 case CK_HLSLAggregateSplatCast:
6240 llvm_unreachable(
"dependent cast kind in IR gen!");
6242 case CK_BuiltinFnToFnPtr:
6243 llvm_unreachable(
"builtin functions are handled elsewhere");
6246 case CK_NonAtomicToAtomic:
6247 case CK_AtomicToNonAtomic:
6257 case CK_ConstructorConversion:
6258 case CK_UserDefinedConversion:
6259 case CK_CPointerToObjCPointerCast:
6260 case CK_BlockPointerToObjCPointerCast:
6261 case CK_LValueToRValue:
6276 if (
V.getElementType() != T)
6283 case CK_UncheckedDerivedToBase:
6284 case CK_DerivedToBase: {
6298 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6302 case CK_BaseToDerived: {
6317 if (
SanOpts.has(SanitizerKind::CFIDerivedCast))
6323 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6325 case CK_LValueBitCast: {
6329 CGM.EmitExplicitCastExprType(CE,
this);
6334 if (
SanOpts.has(SanitizerKind::CFIUnrelatedCast))
6340 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6342 case CK_AddressSpaceConversion: {
6351 case CK_ObjCObjectLValueCast: {
6355 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6357 case CK_ZeroToOCLOpaqueType:
6358 llvm_unreachable(
"NULL to OpenCL opaque type lvalue cast is not valid");
6360 case CK_VectorSplat: {
6368 llvm_unreachable(
"Unhandled lvalue cast kind?");
6376std::pair<LValue, LValue>
6396 return std::make_pair(BaseLV, TempLV);
6404 llvm::Value *
Addr = TempLV.getAddress().getBasePointer();
6407 Address TmpAddr(
Addr, ElTy, TempLV.getAlignment());
6417 llvm::DenseMap<const OpaqueValueExpr*,LValue>::iterator
6418 it = OpaqueLValues.find(e);
6420 if (it != OpaqueLValues.end())
6423 assert(e->
isUnique() &&
"LValue for a nonunique OVE hasn't been emitted");
6431 llvm::DenseMap<const OpaqueValueExpr*,RValue>::iterator
6432 it = OpaqueRValues.find(e);
6434 if (it != OpaqueRValues.end())
6437 assert(e->
isUnique() &&
"RValue for a nonunique OVE hasn't been emitted");
6443 return OpaqueLValues.contains(E);
6444 return OpaqueRValues.contains(E);
6468 llvm_unreachable(
"bad evaluation kind");
6477 llvm::CallBase **CallOrInvoke) {
6478 llvm::CallBase *CallOrInvokeStorage;
6479 if (!CallOrInvoke) {
6480 CallOrInvoke = &CallOrInvokeStorage;
6483 llvm::scope_exit AddCoroElideSafeOnExit([&] {
6485 auto *I = *CallOrInvoke;
6487 I->addFnAttr(llvm::Attribute::CoroElideSafe);
6495 if (
const auto *CE = dyn_cast<CXXMemberCallExpr>(E))
6498 if (
const auto *CE = dyn_cast<CUDAKernelCallExpr>(E))
6503 if (
const auto *CE = dyn_cast<CXXOperatorCallExpr>(E))
6504 if (
const auto *MD =
6505 dyn_cast_if_present<CXXMethodDecl>(CE->getCalleeDecl());
6506 MD && MD->isImplicitObjectMemberFunction())
6521 nullptr, CallOrInvoke);
6527 llvm::CallBase **CallOrInvoke) {
6530 nullptr, CallOrInvoke);
6538 if (!PD->isInlineBuiltinDeclaration())
6547 std::string NoBuiltinFD = (
"no-builtin-" + FD->
getName()).str();
6548 std::string NoBuiltins =
"no-builtins";
6551 std::string FDInlineName = (Ident +
".inline").str();
6553 bool IsPredefinedLibFunction =
6555 bool HasAttributeNoBuiltin =
6556 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltinFD) ||
6557 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltins);
6561 if (CGF.
CurFn->getName() != FDInlineName &&
6564 llvm::Function *Fn = llvm::cast<llvm::Function>(CalleePtr);
6565 llvm::Module *M = Fn->getParent();
6566 llvm::Function *Clone = M->getFunction(FDInlineName);
6568 Clone = llvm::Function::Create(Fn->getFunctionType(),
6569 llvm::GlobalValue::InternalLinkage,
6570 Fn->getAddressSpace(), FDInlineName, M);
6571 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
6582 else if (!IsPredefinedLibFunction || !HasAttributeNoBuiltin)
6588 FD->
hasAttr<CUDAGlobalAttr>())
6596 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()))
6609 auto ConvertFuncrefToPtr = [&](llvm::Value *CalleePtr) -> llvm::Value * {
6610 if (
auto *TET = dyn_cast<llvm::TargetExtType>(CalleePtr->getType());
6611 TET && TET->getName() ==
"wasm.funcref") {
6612 llvm::Function *ToPtr =
6613 CGM.getIntrinsic(llvm::Intrinsic::wasm_funcref_to_ptr);
6614 return Builder.CreateCall(ToPtr, {CalleePtr});
6620 if (
auto ICE = dyn_cast<ImplicitCastExpr>(E)) {
6621 if (ICE->getCastKind() == CK_FunctionToPointerDecay ||
6622 ICE->getCastKind() == CK_BuiltinFnToFnPtr) {
6628 if (ICE->getCastKind() == CK_LValueToRValue) {
6629 const Expr *SubExpr = ICE->getSubExpr();
6631 std::pair<llvm::Value *, CGPointerAuthInfo>
Result =
6638 if (
const auto *VD =
6650 }
else if (
auto DRE = dyn_cast<DeclRefExpr>(E)) {
6651 if (
auto FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
6654 }
else if (
auto ME = dyn_cast<MemberExpr>(E)) {
6655 if (
auto FD = dyn_cast<FunctionDecl>(ME->getMemberDecl())) {
6661 }
else if (
auto NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
6665 }
else if (
auto PDE = dyn_cast<CXXPseudoDestructorExpr>(E)) {
6670 llvm::Value *calleePtr;
6682 if (
const auto *VD =
6688 CGCallee callee(calleeInfo, ConvertFuncrefToPtr(calleePtr), pointerAuth);
6704 assert(E->
getOpcode() == BO_Assign &&
"unexpected binary l-value");
6767 llvm::Value *
Result =
nullptr;
6770 if (
SanOpts.has(SanitizerKind::ImplicitBitfieldConversion))
6785 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
6802 llvm_unreachable(
"bad evaluation kind");
6818 if (
CGM.getHLSLRuntime().emitGlobalResourceArray(*
this, E->
getRHS(), Slot))
6830 llvm::CallBase **CallOrInvoke) {
6838 "Can't have a scalar return unless the return type is a "
6851 &&
"binding l-value to type which needs a temporary");
6889 "Can't have a scalar return unless the return type is a "
6903 return CGM.getObjCRuntime().EmitIvarOffset(*
this,
Interface, Ivar);
6911 return Builder.CreateZExtOrTrunc(OffsetValue,
6916 llvm::Value *BaseValue,
6918 unsigned CVRQualifiers) {
6919 return CGM.getObjCRuntime().EmitObjCValueForIvar(*
this, ObjectTy, BaseValue,
6920 Ivar, CVRQualifiers);
6925 llvm::Value *BaseValue =
nullptr;
6936 ObjectTy = BaseExpr->
getType();
6958 llvm::CallBase **CallOrInvoke,
6963 "Call must have function pointer type!");
6965 const Decl *TargetDecl =
6968 assert((!isa_and_present<FunctionDecl>(TargetDecl) ||
6970 "trying to emit a call to an immediate function");
6980 if (
SanOpts.has(SanitizerKind::Function) &&
6983 if (llvm::Constant *PrefixSig =
6984 CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(
CGM)) {
6985 auto CheckOrdinal = SanitizerKind::SO_Function;
6986 auto CheckHandler = SanitizerHandler::FunctionTypeMismatch;
6990 llvm::Type *PrefixSigType = PrefixSig->getType();
6991 llvm::StructType *PrefixStructTy = llvm::StructType::get(
6992 CGM.getLLVMContext(), {PrefixSigType, Int32Ty},
true);
6994 llvm::Value *CalleePtr = Callee.getFunctionPointer();
6995 if (
CGM.getCodeGenOpts().PointerAuth.FunctionPointers) {
6998 Address(CalleePtr, CalleePtr->getType(),
7000 CalleePtr->getPointerAlignment(
CGM.getDataLayout())),
7001 Callee.getPointerAuthInfo(),
nullptr);
7002 CalleePtr =
Addr.emitRawPointer(*
this);
7014 llvm::Value *AlignedCalleePtr;
7015 if (
CGM.getTriple().isARM() ||
CGM.getTriple().isThumb()) {
7016 AlignedCalleePtr =
Builder.CreateIntrinsic(
7017 CalleePtr->getType(), llvm::Intrinsic::ptrmask,
7018 {CalleePtr, llvm::ConstantInt::getSigned(IntPtrTy, ~1)});
7020 AlignedCalleePtr = CalleePtr;
7023 llvm::Value *CalleePrefixStruct = AlignedCalleePtr;
7024 llvm::Value *CalleeSigPtr =
7025 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 0);
7026 llvm::Value *CalleeSig =
7028 llvm::Value *CalleeSigMatch =
Builder.CreateICmpEQ(CalleeSig, PrefixSig);
7032 Builder.CreateCondBr(CalleeSigMatch, TypeCheck, Cont);
7035 llvm::Value *CalleeTypeHash =
Builder.CreateAlignedLoad(
7037 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 1),
7039 llvm::Value *CalleeTypeHashMatch =
7040 Builder.CreateICmpEQ(CalleeTypeHash, TypeHash);
7043 EmitCheck(std::make_pair(CalleeTypeHashMatch, CheckOrdinal), CheckHandler,
7044 StaticData, {CalleePtr});
7053 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
7054 FD && DeviceKernelAttr::isOpenCLSpelling(FD->getAttr<DeviceKernelAttr>()))
7055 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FnType);
7059 if (
SanOpts.has(SanitizerKind::CFIICall) &&
7061 auto CheckOrdinal = SanitizerKind::SO_CFIICall;
7062 auto CheckHandler = SanitizerHandler::CFICheckFail;
7066 llvm::Metadata *MD =
7067 CGM.CreateMetadataIdentifierForFnType(
QualType(FnType, 0));
7069 llvm::Value *TypeId = llvm::MetadataAsValue::get(
getLLVMContext(), MD);
7071 llvm::Value *CalleePtr = Callee.getFunctionPointer();
7072 llvm::Value *TypeTest =
Builder.CreateCall(
7073 CGM.getIntrinsic(llvm::Intrinsic::type_test), {CalleePtr, TypeId});
7075 auto CrossDsoTypeId =
CGM.CreateCrossDsoCfiTypeId(MD);
7076 llvm::Constant *StaticData[] = {
7081 if (
CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
7085 EmitCheck(std::make_pair(TypeTest, CheckOrdinal), CheckHandler,
7086 StaticData, {CalleePtr, llvm::UndefValue::get(
IntPtrTy)});
7101 bool StaticOperator =
false;
7102 if (
auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
7103 if (OCE->isAssignmentOp())
7106 switch (OCE->getOperator()) {
7108 case OO_GreaterGreater:
7120 if (
const auto *MD =
7121 dyn_cast_if_present<CXXMethodDecl>(OCE->getCalleeDecl());
7122 MD && MD->isStatic())
7123 StaticOperator =
true;
7127 if (StaticOperator) {
7131 Arguments = drop_begin(Arguments, 1);
7133 EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), Arguments,
7137 Args, FnType, Chain);
7140 *ResolvedFnInfo = &FnInfo;
7145 if (
CGM.getLangOpts().HIP && !
CGM.getLangOpts().CUDAIsDevice &&
7148 llvm::Value *Handle = Callee.getFunctionPointer();
7150 Address(Handle, Handle->getType(),
CGM.getPointerAlign()));
7151 Callee.setFunctionPointer(
Stub);
7158 if (
getLangOpts().OpenMPIsTargetDevice &&
CGM.getTriple().isGPU() &&
7162 while (CalleeExpr) {
7163 if ((DRE = dyn_cast<DeclRefExpr>(CalleeExpr)))
7165 if (
const auto *ME = dyn_cast<MemberExpr>(CalleeExpr))
7167 else if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(CalleeExpr))
7173 const auto *VD = DRE ? dyn_cast<VarDecl>(DRE->
getDecl()) :
nullptr;
7174 if (VD && VD->hasAttr<OMPTargetIndirectCallAttr>()) {
7175 auto *FuncPtrTy = llvm::PointerType::get(
7176 CGM.getLLVMContext(),
CGM.getDataLayout().getProgramAddressSpace());
7177 llvm::Type *RtlFnArgs[] = {FuncPtrTy};
7178 llvm::FunctionCallee DeviceRtlFn =
CGM.CreateRuntimeFunction(
7179 llvm::FunctionType::get(FuncPtrTy, RtlFnArgs,
false),
7180 "__llvm_omp_indirect_call_lookup");
7181 llvm::Value *
Func = Callee.getFunctionPointer();
7182 llvm::Type *BackupTy =
Func->getType();
7186 Callee.setFunctionPointer(
Func);
7190 llvm::CallBase *LocalCallOrInvoke =
nullptr;
7194 if (
auto *CalleeDecl = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
7195 if (CalleeDecl->hasAttr<RestrictAttr>() ||
7196 CalleeDecl->hasAttr<MallocSpanAttr>() ||
7197 CalleeDecl->hasAttr<AllocSizeAttr>()) {
7199 if (
SanOpts.has(SanitizerKind::AllocToken)) {
7206 *CallOrInvoke = LocalCallOrInvoke;
7225 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
7228 E, BaseAddr, OffsetV, MPT, IsInBounds, &BaseInfo, &TBAAInfo);
7230 return MakeAddrLValue(MemberAddr, MPT->getPointeeType(), BaseInfo, TBAAInfo);
7247 llvm_unreachable(
"bad evaluation kind");
7251 assert(Val->getType()->isFPOrFPVectorTy());
7256 llvm::MDNode *Node = MDHelper.createFPMath(Accuracy);
7262 llvm::Type *EltTy = Val->getType()->getScalarType();
7263 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7267 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7269 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7284 llvm::Type *EltTy = Val->getType()->getScalarType();
7285 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7289 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7291 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7306 struct LValueOrRValue {
7320 LValueOrRValue result;
7324 const Expr *semantic = *i;
7328 if (
const auto *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
7330 if (ov->isUnique()) {
7331 assert(ov != resultExpr &&
7332 "A unique OVE cannot be used as the result expression");
7340 if (ov == resultExpr && ov->
isPRValue() && !forLValue &&
7345 opaqueData = OVMA::bind(CGF, ov, LV);
7350 opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
7353 if (ov == resultExpr) {
7361 opaques.push_back(opaqueData);
7365 }
else if (semantic == resultExpr) {
7397 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7399 llvm::IntegerType *IdxTy = llvm::IntegerType::get(
getLLVMContext(), 32);
7400 WorkList.push_back({Val, Val.
getType(), {llvm::ConstantInt::get(IdxTy, 0)}});
7402 while (!WorkList.empty()) {
7403 auto [LVal, T, IdxList] = WorkList.pop_back_val();
7404 T = T.getCanonicalType().getUnqualifiedType();
7405 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T)) {
7406 uint64_t Size = CAT->getZExtSize();
7407 for (int64_t I = Size - 1; I > -1; I--) {
7409 IdxListCopy.push_back(llvm::ConstantInt::get(IdxTy, I));
7410 WorkList.emplace_back(LVal, CAT->getElementType(), IdxListCopy);
7412 }
else if (
const auto *RT = dyn_cast<RecordType>(T)) {
7414 assert(!
Record->isUnion() &&
"Union types not supported in flat cast.");
7419 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7428 "HLSL doesn't support multiple inheritance.");
7431 IdxListCopy.push_back(llvm::ConstantInt::get(
7433 ReverseList.emplace_back(LVal,
Base->getType(), IdxListCopy);
7442 bool createdGEP =
false;
7443 for (
auto *FD :
Record->fields()) {
7444 if (FD->isBitField()) {
7445 if (FD->isUnnamedBitField())
7449 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7450 LLVMT, Align,
"gep");
7454 ReverseList.push_back({FieldLVal, FD->
getType(), {}});
7457 IdxListCopy.push_back(
7459 ReverseList.emplace_back(LVal, FD->getType(), IdxListCopy);
7463 std::reverse(ReverseList.begin(), ReverseList.end());
7464 llvm::append_range(WorkList, ReverseList);
7465 }
else if (
const auto *VT = dyn_cast<VectorType>(T)) {
7468 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7469 Align,
"vector.gep");
7471 for (
unsigned I = 0, E = VT->getNumElements(); I < E; I++) {
7472 llvm::Constant *Idx = llvm::ConstantInt::get(IdxTy, I);
7476 AccessList.emplace_back(LV);
7478 }
else if (
const auto *MT = dyn_cast<ConstantMatrixType>(T)) {
7486 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7487 Align,
"matrix.gep");
7490 unsigned NumRows = MT->getNumRows();
7491 unsigned NumCols = MT->getNumColumns();
7493 llvm::MatrixBuilder MB(
Builder);
7494 for (
unsigned Row = 0; Row < MT->getNumRows(); Row++) {
7495 for (
unsigned Col = 0; Col < MT->getNumColumns(); Col++) {
7496 llvm::Value *RowIdx = llvm::ConstantInt::get(IdxTy, Row);
7497 llvm::Value *ColIdx = llvm::ConstantInt::get(IdxTy, Col);
7498 llvm::Value *Idx = MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols,
7503 AccessList.emplace_back(LV);
7507 if (!IdxList.empty()) {
7510 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7511 LLVMT, Align,
"gep");
7514 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 bool RecordContainsField(const RecordDecl *RD, const FieldDecl *Field)
Returns true if Field is reachable from RD either as a direct field or through a chain of nested reco...
static llvm::Value * emitArraySubscriptGEP(CodeGenFunction &CGF, llvm::Type *elemType, llvm::Value *ptr, ArrayRef< llvm::Value * > indices, bool inbounds, bool signedIndices, SourceLocation loc, const llvm::Twine &name="arrayidx")
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.
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.
RecordDecl * getDefinitionOrSelf() const
Scope - A scope is a transient data structure that is used while parsing the program.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
StmtClass getStmtClass() const
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
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