41#include "llvm/ADT/STLExtras.h"
42#include "llvm/ADT/ScopeExit.h"
43#include "llvm/ADT/StringExtras.h"
44#include "llvm/IR/Constants.h"
45#include "llvm/IR/DataLayout.h"
46#include "llvm/IR/Intrinsics.h"
47#include "llvm/IR/LLVMContext.h"
48#include "llvm/IR/MDBuilder.h"
49#include "llvm/IR/MatrixBuilder.h"
50#include "llvm/Support/ConvertUTF.h"
51#include "llvm/Support/Endian.h"
52#include "llvm/Support/MathExtras.h"
53#include "llvm/Support/Path.h"
54#include "llvm/Support/xxhash.h"
55#include "llvm/Transforms/Utils/SanitizerStats.h"
68 "ubsan-guard-checks", llvm::cl::Optional,
69 llvm::cl::desc(
"Guard UBSAN checks with `llvm.allow.ubsan.check()`."));
95#define SANITIZER_CHECK(Enum, Name, Version, Msg) \
96 case SanitizerHandler::Enum: \
101 llvm_unreachable(
"unhandled switch case");
109 llvm::Value *ArraySize) {
117 llvm::Value *ArraySize) {
127 llvm::IRBuilderBase::InsertPointGuard IPG(Builder);
142 llvm::Value *ArraySize,
146 *AllocaAddr = Alloca;
147 return MaybeCastStackAddressSpace(Alloca, DestLangAS, ArraySize);
155 llvm::Value *ArraySize) {
156 llvm::AllocaInst *Alloca;
158 Alloca =
Builder.CreateAlloca(Ty, ArraySize, Name);
161 new llvm::AllocaInst(Ty,
CGM.getDataLayout().getAllocaAddrSpace(),
163 if (
SanOpts.Mask & SanitizerKind::Address) {
164 Alloca->addAnnotationMetadata({
"alloca_name_altered", Name.str()});
167 Allocas->Add(Alloca);
203 auto *ArrayElementTy = ArrayTy->getElementType();
204 auto ArrayElements = ArrayTy->getNumElements();
207 ArrayElementTy = VectorTy->getElementType();
208 ArrayElements *= VectorTy->getNumElements();
210 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
233 PGO->setCurrentStmt(E);
236 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this, MemPtr, MPT);
259 if (
const auto *CondOp = dyn_cast<AbstractConditionalOperator>(
282 if (!ignoreResult && aggSlot.
isIgnored())
287 llvm_unreachable(
"bad evaluation kind");
329 llvm_unreachable(
"bad evaluation kind");
352 llvm_unreachable(
"bad evaluation kind");
392 bool Precise = isa_and_nonnull<VarDecl>(VD) &&
393 VD->
hasAttr<ObjCPreciseLifetimeAttr>();
414 llvm_unreachable(
"temporary cannot have dynamic storage duration");
416 llvm_unreachable(
"unknown storage duration");
426 if (
const auto *ClassDecl =
430 ReferenceTemporaryDtor = ClassDecl->getDestructor();
432 if (!ReferenceTemporaryDtor)
435 llvm::FunctionCallee CleanupFn;
436 llvm::Constant *CleanupArg;
442 CleanupArg = llvm::Constant::getNullValue(CGF.
Int8PtrTy);
459 llvm_unreachable(
"temporary cannot have dynamic storage duration");
481 auto *GV =
new llvm::GlobalVariable(
483 llvm::GlobalValue::PrivateLinkage,
Init,
".ref.tmp",
nullptr,
484 llvm::GlobalValue::NotThreadLocal,
488 llvm::Constant *
C = GV;
491 GV, llvm::PointerType::get(
495 return RawAddress(
C, GV->getValueType(), alignment);
504 llvm_unreachable(
"temporary can't have dynamic storage duration");
506 llvm_unreachable(
"unknown storage duration");
520 "Reference should never be pseudo-strong!");
528 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(Object.getPointer())) {
530 Object = Object.withElementType(Ty);
538 if (Var->hasInitializer())
541 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
547 default: llvm_unreachable(
"expected scalar or aggregate expression");
570 for (
const auto &Ignored : CommaLHSs)
573 if (
const auto *opaque = dyn_cast<OpaqueValueExpr>(E)) {
574 if (opaque->getType()->isRecordType()) {
575 assert(Adjustments.empty());
583 if (
auto *Var = dyn_cast<llvm::GlobalVariable>(
584 Object.getPointer()->stripPointerCasts())) {
586 Object = Object.withElementType(TemporaryType);
590 if (!Var->hasInitializer()) {
591 Var->setInitializer(
CGM.EmitNullConstant(E->
getType()));
596 Object.getAlignment());
612 if (!ShouldEmitLifetimeMarkers)
623 CGBuilderTy::InsertPoint OldIP;
625 ((!
SanOpts.has(SanitizerKind::HWAddress) &&
626 !
SanOpts.has(SanitizerKind::Memory) &&
627 !
SanOpts.has(SanitizerKind::MemtagStack) &&
628 !
CGM.getCodeGenOpts().SanitizeAddressUseAfterScope) ||
630 OldConditional = OutermostConditional;
631 OutermostConditional =
nullptr;
635 Builder.restoreIP(CGBuilderTy::InsertPoint(
636 Block, llvm::BasicBlock::iterator(
Block->back())));
643 if (OldConditional) {
644 OutermostConditional = OldConditional;
661 switch (Adjustment.Kind) {
665 Adjustment.DerivedToBase.BasePath->path_begin(),
666 Adjustment.DerivedToBase.BasePath->path_end(),
674 "materialized temporary field is not a simple lvalue");
682 E, Object, Ptr, Adjustment.Ptr.MPT,
true);
715 const llvm::Constant *Elts) {
723 Builder.CreateMul(Ptr, Builder.getInt64(0xbf58476d1ce4e5b9u));
725 Builder.CreateXor(A0, Builder.CreateLShr(A0, Builder.getInt64(31)));
726 return Builder.CreateXor(Acc, A1);
743 return SanOpts.has(SanitizerKind::Null) ||
744 SanOpts.has(SanitizerKind::Alignment) ||
745 SanOpts.has(SanitizerKind::ObjectSize) ||
746 SanOpts.has(SanitizerKind::Vptr);
753 llvm::Value *ArraySize) {
760 if (Ptr->getType()->getPointerAddressSpace())
771 auto PtrToAlloca = dyn_cast<llvm::AllocaInst>(Ptr->stripPointerCasts());
773 llvm::Value *IsNonNull =
nullptr;
774 bool IsGuaranteedNonNull =
775 SkippedChecks.
has(SanitizerKind::Null) || PtrToAlloca;
777 llvm::BasicBlock *Done =
nullptr;
778 bool DoneViaNullSanitize =
false;
781 auto CheckHandler = SanitizerHandler::TypeMismatch;
783 {SanitizerKind::SO_Null,
784 SanitizerKind::SO_ObjectSize,
785 SanitizerKind::SO_Alignment},
793 if ((
SanOpts.has(SanitizerKind::Null) || AllowNullPointers) &&
794 !IsGuaranteedNonNull) {
796 IsNonNull =
Builder.CreateIsNotNull(Ptr);
800 IsGuaranteedNonNull = IsNonNull ==
True;
803 if (!IsGuaranteedNonNull) {
804 if (AllowNullPointers) {
808 DoneViaNullSanitize =
true;
810 Builder.CreateCondBr(IsNonNull, Rest, Done);
813 Checks.push_back(std::make_pair(IsNonNull, SanitizerKind::SO_Null));
818 if (
SanOpts.has(SanitizerKind::ObjectSize) &&
819 !SkippedChecks.
has(SanitizerKind::ObjectSize) &&
821 uint64_t TySize =
CGM.getMinimumObjectSize(Ty).getQuantity();
822 llvm::Value *Size = llvm::ConstantInt::get(
IntPtrTy, TySize);
824 Size =
Builder.CreateMul(Size, ArraySize);
827 llvm::Constant *ConstantSize = dyn_cast<llvm::Constant>(Size);
828 if (!ConstantSize || !ConstantSize->isNullValue()) {
835 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::objectsize, Tys);
837 llvm::Value *NullIsUnknown =
Builder.getFalse();
838 llvm::Value *Dynamic =
Builder.getFalse();
839 llvm::Value *LargeEnough =
Builder.CreateICmpUGE(
840 Builder.CreateCall(F, {Ptr, Min, NullIsUnknown, Dynamic}), Size);
842 std::make_pair(LargeEnough, SanitizerKind::SO_ObjectSize));
846 llvm::MaybeAlign AlignVal;
847 llvm::Value *PtrAsInt =
nullptr;
849 if (
SanOpts.has(SanitizerKind::Alignment) &&
850 !SkippedChecks.
has(SanitizerKind::Alignment)) {
853 AlignVal =
CGM.getNaturalTypeAlignment(Ty,
nullptr,
nullptr,
858 if (AlignVal && *AlignVal > llvm::Align(1) &&
859 (!PtrToAlloca || PtrToAlloca->getAlign() < *AlignVal)) {
861 llvm::Value *Align =
Builder.CreateAnd(
862 PtrAsInt, llvm::ConstantInt::get(
IntPtrTy, AlignVal->value() - 1));
863 llvm::Value *Aligned =
867 std::make_pair(Aligned, SanitizerKind::SO_Alignment));
871 if (Checks.size() > 0) {
872 llvm::Constant *StaticData[] = {
874 llvm::ConstantInt::get(
Int8Ty, AlignVal ? llvm::Log2(*AlignVal) : 1),
875 llvm::ConstantInt::get(
Int8Ty, TCK)};
876 EmitCheck(Checks, CheckHandler, StaticData, PtrAsInt ? PtrAsInt : Ptr);
888 if (
SanOpts.has(SanitizerKind::Vptr) &&
891 SanitizerHandler::DynamicTypeCacheMiss);
895 if (!IsGuaranteedNonNull) {
897 IsNonNull =
Builder.CreateIsNotNull(Ptr);
901 Builder.CreateCondBr(IsNonNull, VptrNotNull, Done);
907 llvm::raw_svector_ostream Out(MangledName);
912 if (!
CGM.getContext().getNoSanitizeList().containsType(SanitizerKind::Vptr,
915 llvm::Value *TypeHash =
916 llvm::ConstantInt::get(
Int64Ty, xxh3_64bits(Out.str()));
930 const int CacheSize = 128;
931 llvm::Type *HashTable = llvm::ArrayType::get(
IntPtrTy, CacheSize);
932 llvm::Value *
Cache =
CGM.CreateRuntimeVariable(HashTable,
933 "__ubsan_vptr_type_cache");
934 llvm::Value *Slot =
Builder.CreateAnd(Hash,
937 llvm::Value *Indices[] = {
Builder.getInt32(0), Slot };
938 llvm::Value *CacheVal =
Builder.CreateAlignedLoad(
946 llvm::Value *EqualHash =
Builder.CreateICmpEQ(CacheVal, Hash);
947 llvm::Constant *StaticData[] = {
951 llvm::ConstantInt::get(
Int8Ty, TCK)
953 llvm::Value *DynamicData[] = { Ptr, Hash };
954 EmitCheck(std::make_pair(EqualHash, SanitizerKind::SO_Vptr),
955 SanitizerHandler::DynamicTypeCacheMiss, StaticData,
963 {DoneViaNullSanitize ? SanitizerKind::SO_Null : SanitizerKind::SO_Vptr},
964 DoneViaNullSanitize ? SanitizerHandler::TypeMismatch
965 : SanitizerHandler::DynamicTypeCacheMiss);
974 uint64_t EltSize =
C.getTypeSizeInChars(EltTy).getQuantity();
982 auto *ParamDecl = dyn_cast<ParmVarDecl>(ArrayDeclRef->getDecl());
986 auto *POSAttr = ParamDecl->getAttr<PassObjectSizeAttr>();
991 int POSType = POSAttr->getType();
992 if (POSType != 0 && POSType != 1)
996 auto PassedSizeIt = SizeArguments.find(ParamDecl);
997 if (PassedSizeIt == SizeArguments.end())
1001 assert(LocalDeclMap.count(PassedSizeDecl) &&
"Passed size not loadable");
1002 Address AddrOfSize = LocalDeclMap.find(PassedSizeDecl)->second;
1005 llvm::Value *SizeOfElement =
1006 llvm::ConstantInt::get(SizeInBytes->getType(), EltSize);
1007 return Builder.CreateUDiv(SizeInBytes, SizeOfElement);
1016 StrictFlexArraysLevel) {
1019 IndexedType =
Base->getType();
1020 return CGF.
Builder.getInt32(VT->getNumElements());
1025 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1026 if (CE->getCastKind() == CK_ArrayToPointerDecay &&
1027 !CE->getSubExpr()->isFlexibleArrayMemberLike(CGF.
getContext(),
1028 StrictFlexArraysLevel)) {
1031 IndexedType = CE->getSubExpr()->getType();
1033 if (
const auto *CAT = dyn_cast<ConstantArrayType>(AT))
1034 return CGF.
Builder.getInt(CAT->getSize());
1036 if (
const auto *VAT = dyn_cast<VariableArrayType>(AT))
1044 QualType EltTy{
Base->getType()->getPointeeOrArrayElementType(), 0};
1046 IndexedType =
Base->getType();
1071class StructAccessBase
1072 :
public ConstStmtVisitor<StructAccessBase, const Expr *> {
1073 const RecordDecl *ExpectedRD;
1075 bool IsExpectedRecordDecl(
const Expr *E)
const {
1083 StructAccessBase(
const RecordDecl *ExpectedRD) : ExpectedRD(ExpectedRD) {}
1102 const Expr *Visit(
const Expr *E) {
1103 return ConstStmtVisitor<StructAccessBase, const Expr *>::Visit(E);
1106 const Expr *VisitStmt(
const Stmt *S) {
return nullptr; }
1121 const Expr *VisitDeclRefExpr(
const DeclRefExpr *E) {
1122 return IsExpectedRecordDecl(E) ? E :
nullptr;
1124 const Expr *VisitMemberExpr(
const MemberExpr *E) {
1125 if (IsExpectedRecordDecl(E) && E->
isArrow())
1127 const Expr *Res = Visit(E->
getBase());
1128 return !Res && IsExpectedRecordDecl(E) ? E : Res;
1130 const Expr *VisitCompoundLiteralExpr(
const CompoundLiteralExpr *E) {
1131 return IsExpectedRecordDecl(E) ? E :
nullptr;
1133 const Expr *VisitCallExpr(
const CallExpr *E) {
1134 return IsExpectedRecordDecl(E) ? E :
nullptr;
1137 const Expr *VisitArraySubscriptExpr(
const ArraySubscriptExpr *E) {
1138 if (IsExpectedRecordDecl(E))
1142 const Expr *VisitCastExpr(
const CastExpr *E) {
1144 return IsExpectedRecordDecl(E) ? E :
nullptr;
1147 const Expr *VisitParenExpr(
const ParenExpr *E) {
1150 const Expr *VisitUnaryAddrOf(
const UnaryOperator *E) {
1153 const Expr *VisitUnaryDeref(
const UnaryOperator *E) {
1166 int64_t FieldNo = -1;
1175 Indices.emplace_back(CGF.
Builder.getInt32(FieldNo));
1184 Indices.emplace_back(CGF.
Builder.getInt32(FieldNo));
1209 const Expr *StructBase = StructAccessBase(RD).Visit(
Base);
1213 llvm::Value *Res =
nullptr;
1218 Res =
Addr.emitRawPointer(*
this);
1219 }
else if (StructBase->
isLValue()) {
1222 Res =
Addr.emitRawPointer(*
this);
1229 if (Indices.empty())
1232 Indices.push_back(
Builder.getInt32(0));
1256 const Expr *ArrayExprBase,
1257 llvm::Value *IndexVal,
QualType IndexType,
1259 assert(
SanOpts.has(SanitizerKind::ArrayBounds) &&
1260 "should not be called unless adding bounds checks");
1265 *
this, ArrayExprBase, ArrayExprBaseType, StrictFlexArraysLevel);
1268 BoundsVal,
getContext().getSizeType(), Accessed);
1273 llvm::Value *IndexVal,
1275 llvm::Value *BoundsVal,
1276 QualType BoundsType,
bool Accessed) {
1280 auto CheckKind = SanitizerKind::SO_ArrayBounds;
1281 auto CheckHandler = SanitizerHandler::OutOfBounds;
1293 llvm::Value *IndexInst =
Builder.CreateIntCast(IndexVal, Ty, IndexSigned);
1294 llvm::Value *BoundsInst =
Builder.CreateIntCast(BoundsVal, Ty,
false);
1296 llvm::Constant *StaticData[] = {
1302 llvm::Value *Check = Accessed ?
Builder.CreateICmpULT(IndexInst, BoundsInst)
1303 :
Builder.CreateICmpULE(IndexInst, BoundsInst);
1308 BoundsVal, llvm::ConstantInt::get(BoundsVal->getType(), 0));
1312 EmitCheck(std::make_pair(Check, CheckKind), CheckHandler, StaticData,
1322 auto *TypeNameMD = MDB.createString(ATMD->TypeName);
1323 auto *ContainsPtrC =
Builder.getInt1(ATMD->ContainsPointer);
1324 auto *ContainsPtrMD = MDB.createConstant(ContainsPtrC);
1327 return llvm::MDNode::get(
CGM.getLLVMContext(), {TypeNameMD, ContainsPtrMD});
1331 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1332 "Only needed with -fsanitize=alloc-token");
1333 CB->setMetadata(llvm::LLVMContext::MD_alloc_token,
1345 assert(
SanOpts.has(SanitizerKind::AllocToken) &&
1346 "Only needed with -fsanitize=alloc-token");
1348 CB->setMetadata(llvm::LLVMContext::MD_alloc_token, MDN);
1353 bool isInc,
bool isPre) {
1356 llvm::Value *NextVal;
1358 uint64_t AmountVal = isInc ? 1 : -1;
1359 NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal,
true);
1362 NextVal =
Builder.CreateAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1365 llvm::APFloat FVal(
getContext().getFloatTypeSemantics(ElemTy), 1);
1371 NextVal =
Builder.CreateFAdd(InVal.first, NextVal, isInc ?
"inc" :
"dec");
1379 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
1384 return isPre ? IncVal : InVal;
1394 DI->EmitExplicitCastType(E->
getType());
1405 if (
auto *constantIdx = dyn_cast<llvm::ConstantInt>(idx)) {
1406 CharUnits offset = constantIdx->getZExtValue() * eltSize;
1420 assert(BO->
isAdditiveOp() &&
"Expect an addition or subtraction.");
1423 bool isSubtraction = BO->
getOpcode() == BO_Sub;
1426 llvm::Value *
index =
nullptr;
1430 std::swap(pointerOperand, indexOperand);
1442 BO, pointerOperand, pointer, indexOperand,
index, isSubtraction);
1449 nullptr, IsKnownNonNull);
1462 if (
const CastExpr *CE = dyn_cast<CastExpr>(E)) {
1463 if (
const auto *ECE = dyn_cast<ExplicitCastExpr>(CE))
1466 switch (CE->getCastKind()) {
1470 case CK_AddressSpaceConversion:
1471 if (
auto PtrTy = CE->getSubExpr()->getType()->getAs<
PointerType>()) {
1472 if (PtrTy->getPointeeType()->isVoidType())
1478 CE->getSubExpr(), &InnerBaseInfo, &InnerTBAAInfo, IsKnownNonNull);
1479 if (BaseInfo) *BaseInfo = InnerBaseInfo;
1480 if (TBAAInfo) *TBAAInfo = InnerTBAAInfo;
1486 E->
getType(), &TargetTypeBaseInfo, &TargetTypeTBAAInfo);
1494 BaseInfo->mergeForCast(TargetTypeBaseInfo);
1495 Addr.setAlignment(Align);
1499 if (CGF.
SanOpts.
has(SanitizerKind::CFIUnrelatedCast) &&
1500 CE->getCastKind() == CK_BitCast) {
1508 llvm::Type *ElemTy =
1510 Addr =
Addr.withElementType(ElemTy);
1511 if (CE->getCastKind() == CK_AddressSpaceConversion)
1521 case CK_ArrayToPointerDecay:
1525 case CK_UncheckedDerivedToBase:
1526 case CK_DerivedToBase: {
1533 CE->getSubExpr(), BaseInfo,
nullptr,
1535 CE->getCastKind() == CK_UncheckedDerivedToBase));
1536 auto Derived = CE->getSubExpr()->
getType()->getPointeeCXXRecordDecl();
1538 Addr, Derived, CE->path_begin(), CE->path_end(),
1551 if (UO->getOpcode() == UO_AddrOf) {
1552 LValue LV = CGF.
EmitLValue(UO->getSubExpr(), IsKnownNonNull);
1553 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1554 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1555 return LV.getAddress();
1560 if (
auto *
Call = dyn_cast<CallExpr>(E)) {
1561 switch (
Call->getBuiltinCallee()) {
1564 case Builtin::BIaddressof:
1565 case Builtin::BI__addressof:
1566 case Builtin::BI__builtin_addressof: {
1568 if (BaseInfo) *BaseInfo = LV.getBaseInfo();
1569 if (TBAAInfo) *TBAAInfo = LV.getTBAAInfo();
1570 return LV.getAddress();
1576 if (
auto *BO = dyn_cast<BinaryOperator>(E)) {
1577 if (BO->isAdditiveOp())
1586 true, BaseInfo, TBAAInfo, IsKnownNonNull);
1596 if (IsKnownNonNull && !
Addr.isKnownNonNull())
1597 Addr.setKnownNonNull();
1604 return CGM.getCXXABI().EmitMemberPointerIsNotNull(*
this,
V, MPT);
1605 return Builder.CreateICmpNE(
V, llvm::Constant::getNullValue(
V->getType()));
1616 llvm::Value *
U = llvm::UndefValue::get(EltTy);
1631 llvm_unreachable(
"bad evaluation kind");
1656 if (
const auto *CE = dyn_cast<CastExpr>(
Base)) {
1657 Base = CE->getSubExpr();
1658 }
else if (
const auto *PE = dyn_cast<ParenExpr>(
Base)) {
1659 Base = PE->getSubExpr();
1660 }
else if (
const auto *UO = dyn_cast<UnaryOperator>(
Base)) {
1661 if (UO->getOpcode() == UO_Extension)
1662 Base = UO->getSubExpr();
1680 if (
const auto *ME = dyn_cast<MemberExpr>(E)) {
1683 SkippedChecks.
set(SanitizerKind::Alignment,
true);
1685 SkippedChecks.
set(SanitizerKind::Null,
true);
1712 CGM.runWithSufficientStackSpace(
1713 E->
getExprLoc(), [&] { LV = EmitLValueHelper(E, IsKnownNonNull); });
1720LValue CodeGenFunction::EmitLValueHelper(
const Expr *E,
1726 case Expr::ObjCPropertyRefExprClass:
1727 llvm_unreachable(
"cannot emit a property reference directly");
1729 case Expr::ObjCSelectorExprClass:
1731 case Expr::ObjCIsaExprClass:
1733 case Expr::BinaryOperatorClass:
1735 case Expr::CompoundAssignOperatorClass: {
1738 Ty = AT->getValueType();
1743 case Expr::CallExprClass:
1744 case Expr::CXXMemberCallExprClass:
1745 case Expr::CXXOperatorCallExprClass:
1746 case Expr::UserDefinedLiteralClass:
1748 case Expr::CXXRewrittenBinaryOperatorClass:
1751 case Expr::VAArgExprClass:
1753 case Expr::DeclRefExprClass:
1755 case Expr::ConstantExprClass: {
1761 case Expr::ParenExprClass:
1763 case Expr::GenericSelectionExprClass:
1766 case Expr::PredefinedExprClass:
1768 case Expr::StringLiteralClass:
1770 case Expr::ObjCEncodeExprClass:
1772 case Expr::PseudoObjectExprClass:
1774 case Expr::InitListExprClass:
1776 case Expr::CXXTemporaryObjectExprClass:
1777 case Expr::CXXConstructExprClass:
1779 case Expr::CXXBindTemporaryExprClass:
1781 case Expr::CXXUuidofExprClass:
1783 case Expr::LambdaExprClass:
1786 case Expr::ExprWithCleanupsClass: {
1788 RunCleanupsScope
Scope(*
this);
1789 LValue LV =
EmitLValue(cleanups->getSubExpr(), IsKnownNonNull);
1790 if (LV.isSimple()) {
1794 llvm::Value *
V =
Addr.getBasePointer();
1795 Scope.ForceCleanup({&
V});
1796 Addr.replaceBasePointer(
V);
1798 LV.getBaseInfo(), LV.getTBAAInfo());
1805 case Expr::CXXDefaultArgExprClass: {
1808 return EmitLValue(DAE->getExpr(), IsKnownNonNull);
1810 case Expr::CXXDefaultInitExprClass: {
1813 return EmitLValue(DIE->getExpr(), IsKnownNonNull);
1815 case Expr::CXXTypeidExprClass:
1818 case Expr::ObjCMessageExprClass:
1820 case Expr::ObjCIvarRefExprClass:
1822 case Expr::StmtExprClass:
1824 case Expr::UnaryOperatorClass:
1826 case Expr::ArraySubscriptExprClass:
1828 case Expr::MatrixSingleSubscriptExprClass:
1830 case Expr::MatrixSubscriptExprClass:
1832 case Expr::ArraySectionExprClass:
1834 case Expr::ExtVectorElementExprClass:
1836 case Expr::MatrixElementExprClass:
1838 case Expr::CXXThisExprClass:
1840 case Expr::MemberExprClass:
1842 case Expr::CompoundLiteralExprClass:
1844 case Expr::ConditionalOperatorClass:
1846 case Expr::BinaryConditionalOperatorClass:
1848 case Expr::ChooseExprClass:
1850 case Expr::OpaqueValueExprClass:
1852 case Expr::SubstNonTypeTemplateParmExprClass:
1855 case Expr::ImplicitCastExprClass:
1856 case Expr::CStyleCastExprClass:
1857 case Expr::CXXFunctionalCastExprClass:
1858 case Expr::CXXStaticCastExprClass:
1859 case Expr::CXXDynamicCastExprClass:
1860 case Expr::CXXReinterpretCastExprClass:
1861 case Expr::CXXConstCastExprClass:
1862 case Expr::CXXAddrspaceCastExprClass:
1863 case Expr::ObjCBridgedCastExprClass:
1866 case Expr::MaterializeTemporaryExprClass:
1869 case Expr::CoawaitExprClass:
1871 case Expr::CoyieldExprClass:
1873 case Expr::PackIndexingExprClass:
1875 case Expr::HLSLOutArgExprClass:
1876 llvm_unreachable(
"cannot emit a HLSL out argument directly");
1883 assert(
type.isCanonical());
1884 assert(!
type->isReferenceType());
1892 if (
const auto *RT = dyn_cast<RecordType>(
type))
1893 if (
const auto *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
1894 RD = RD->getDefinitionOrSelf();
1895 if (RD->hasMutableFields() || !RD->isTrivial())
1917 if (
const auto *ref = dyn_cast<ReferenceType>(
type)) {
1941 }
else if (
const auto *var = dyn_cast<VarDecl>(
Value)) {
1951 bool resultIsReference;
1957 resultIsReference =
false;
1963 resultIsReference =
true;
1984 auto *MD = dyn_cast_or_null<CXXMethodDecl>(
CurCodeDecl);
1985 if (
isLambdaMethod(MD) && MD->getOverloadedOperator() == OO_Call) {
1988 if (
const VarDecl *VD = dyn_cast<const VarDecl>(D)) {
1989 if (!VD->hasAttr<CUDADeviceAttr>()) {
2012 if (resultIsReference)
2039 assert(Constant &&
"not a constant");
2055 llvm::APInt &
Min, llvm::APInt &End,
2056 bool StrictEnums,
bool IsBool) {
2058 bool IsRegularCPlusPlusEnum =
2059 CGF.
getLangOpts().CPlusPlus && StrictEnums && ED && !ED->isFixed();
2060 if (!IsBool && !IsRegularCPlusPlusEnum)
2067 ED->getValueRange(End,
Min);
2072llvm::MDNode *CodeGenFunction::getRangeForLoadFromType(QualType Ty) {
2073 llvm::APInt
Min, End;
2079 return MDHelper.createRange(
Min, End);
2087 }
else if (
CGM.getCodeGenOpts().OptimizationLevel > 0) {
2088 if (llvm::MDNode *RangeInfo = getRangeForLoadFromType(Ty)) {
2089 Load->setMetadata(llvm::LLVMContext::MD_range, RangeInfo);
2090 Load->setMetadata(llvm::LLVMContext::MD_noundef,
2091 llvm::MDNode::get(
CGM.getLLVMContext(), {}));
2098 bool HasBoolCheck =
SanOpts.has(SanitizerKind::Bool);
2099 bool HasEnumCheck =
SanOpts.has(SanitizerKind::Enum);
2100 if (!HasBoolCheck && !HasEnumCheck)
2105 bool NeedsBoolCheck = HasBoolCheck && IsBool;
2107 if (!NeedsBoolCheck && !NeedsEnumCheck)
2117 if (NeedsEnumCheck &&
2118 getContext().isTypeIgnoredBySanitizer(SanitizerKind::Enum, Ty))
2121 llvm::APInt
Min, End;
2126 NeedsEnumCheck ? SanitizerKind::SO_Enum : SanitizerKind::SO_Bool;
2129 auto CheckHandler = SanitizerHandler::LoadInvalidValue;
2134 Check =
Builder.CreateICmpULE(
Value, llvm::ConstantInt::get(Ctx, End));
2136 llvm::Value *Upper =
2137 Builder.CreateICmpSLE(
Value, llvm::ConstantInt::get(Ctx, End));
2138 llvm::Value *Lower =
2140 Check =
Builder.CreateAnd(Upper, Lower);
2144 EmitCheck(std::make_pair(Check, Kind), CheckHandler, StaticArgs,
Value);
2153 bool isNontemporal) {
2154 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2155 if (GV->isThreadLocal())
2161 if (ClangVecTy->isPackedVectorBoolType(
getContext())) {
2163 unsigned ValNumElems =
2166 auto *RawIntV =
Builder.CreateLoad(
Addr, Volatile,
"load_bits");
2167 const auto *RawIntTy = RawIntV->getType();
2168 assert(RawIntTy->isIntegerTy() &&
"compressed iN storage for bitvectors");
2170 auto *PaddedVecTy = llvm::FixedVectorType::get(
2171 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2172 llvm::Value *
V =
Builder.CreateBitCast(RawIntV, PaddedVecTy);
2185 if (VTy != NewVecTy) {
2187 llvm::Value *
V =
Builder.CreateLoad(Cast, Volatile,
"loadVecN");
2188 unsigned OldNumElements = VTy->getNumElements();
2190 std::iota(Mask.begin(), Mask.end(), 0);
2191 V =
Builder.CreateShuffleVector(
V, Mask,
"extractVec");
2206 llvm::LoadInst *Load =
Builder.CreateLoad(
Addr, Volatile);
2207 if (isNontemporal) {
2208 llvm::MDNode *Node = llvm::MDNode::get(
2209 Load->getContext(), llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2210 Load->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2213 CGM.DecorateInstructionWithTBAA(Load, TBAAInfo);
2225 Ty = AtomicTy->getValueType();
2233 if (StoreTy->isVectorTy() && StoreTy->getScalarSizeInBits() >
2238 unsigned MemNumElems = StoreTy->getPrimitiveSizeInBits();
2259 Ty = AtomicTy->getValueType();
2265 auto *PaddedVecTy = llvm::FixedVectorType::get(
2266 Builder.getInt1Ty(), RawIntTy->getPrimitiveSizeInBits());
2286 bool IsVector =
true) {
2287 auto *ArrayTy = dyn_cast<llvm::ArrayType>(
Addr.getElementType());
2288 if (ArrayTy && IsVector) {
2289 auto ArrayElements = ArrayTy->getNumElements();
2290 auto *ArrayElementTy = ArrayTy->getElementType();
2293 ArrayElementTy = VectorTy->getElementType();
2294 ArrayElements *= VectorTy->getNumElements();
2296 auto *VectorTy = llvm::FixedVectorType::get(ArrayElementTy, ArrayElements);
2298 return Addr.withElementType(VectorTy);
2300 auto *VectorTy = dyn_cast<llvm::VectorType>(
Addr.getElementType());
2301 if (VectorTy && !IsVector) {
2302 auto *ArrayTy = llvm::ArrayType::get(
2303 VectorTy->getElementType(),
2306 return Addr.withElementType(ArrayTy);
2318 "Result must be a Constant Matrix");
2323 if (LTy->getScalarSizeInBits() > Mat->getType()->getScalarSizeInBits())
2324 Mat =
Builder.CreateZExt(Mat, LTy);
2325 Builder.CreateStore(Mat, MatMem);
2339 bool IsColMajor =
getLangOpts().getDefaultMatrixMemoryLayout() ==
2344 for (uint32_t &Idx : Indices) {
2346 unsigned Row = Idx / NumCols;
2347 unsigned Col = Idx % NumCols;
2349 Idx = MT->getColumnMajorFlattenedIndex(Row, Col);
2353 if (
Base.isSimple()) {
2357 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
2360 llvm::Constant *CV =
2363 CV, ResultType,
Base.getBaseInfo(),
2366 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
2368 llvm::Constant *BaseElts =
Base.getExtVectorElts();
2371 for (
unsigned Index : Indices)
2372 CElts.push_back(BaseElts->getAggregateElement(Index));
2373 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
2386 value->getType()->isVectorTy());
2388 lvalue.getBaseInfo(), lvalue.getTBAAInfo(), isInit,
2389 lvalue.isNontemporal());
2396 bool isInit,
bool isNontemporal) {
2397 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
Addr.getBasePointer()))
2398 if (GV->isThreadLocal())
2406 if (
auto *VecTy = dyn_cast<llvm::FixedVectorType>(SrcTy)) {
2408 CGM.getABIInfo().getOptimalVectorMemoryType(VecTy,
getLangOpts());
2409 if (!ClangVecTy->isPackedVectorBoolType(
getContext()) &&
2410 VecTy != NewVecTy) {
2412 VecTy->getNumElements());
2413 std::iota(Mask.begin(), Mask.begin() + VecTy->getNumElements(), 0);
2417 Mask,
"extractVec");
2420 if (
Addr.getElementType() != SrcTy)
2421 Addr =
Addr.withElementType(SrcTy);
2438 if (isNontemporal) {
2439 llvm::MDNode *Node =
2440 llvm::MDNode::get(Store->getContext(),
2441 llvm::ConstantAsMetadata::get(
Builder.getInt32(1)));
2442 Store->setMetadata(llvm::LLVMContext::MD_nontemporal, Node);
2445 CGM.DecorateInstructionWithTBAA(Store, TBAAInfo);
2464 assert(LV.getType()->isConstantMatrixType());
2475 LV.setAddress(
Addr);
2491 llvm_unreachable(
"bad evaluation kind");
2557 EltTy = MatTy->getElementType();
2558 if (
CGM.getCodeGenOpts().OptimizationLevel > 0) {
2559 llvm::MatrixBuilder MB(
Builder);
2560 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2563 llvm::LoadInst *Load =
2565 llvm::Value *Elt =
Builder.CreateExtractElement(Load, Idx,
"matrixext");
2574 unsigned NumLanes = NumCols;
2578 llvm::Constant *ColConstsIndices =
nullptr;
2579 llvm::MatrixBuilder MB(
Builder);
2583 NumLanes = llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2587 llvm::Type *RowTy = llvm::FixedVectorType::get(ElemTy, NumLanes);
2588 llvm::Value *
Result = llvm::PoisonValue::get(RowTy);
2590 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2591 llvm::Value *ColIdx;
2592 if (ColConstsIndices)
2593 ColIdx = ColConstsIndices->getAggregateElement(Col);
2595 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2596 bool IsMatrixRowMajor =
getLangOpts().getDefaultMatrixMemoryLayout() ==
2598 llvm::Value *EltIndex =
2599 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2600 llvm::Value *Elt =
Builder.CreateExtractElement(MatrixVec, EltIndex);
2601 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2608 assert(LV.
isBitField() &&
"Unknown LValue type!");
2626 const unsigned StorageSize =
2629 assert(
static_cast<unsigned>(Offset + Info.
Size) <= StorageSize);
2630 unsigned HighBits = StorageSize - Offset - Info.
Size;
2632 Val =
Builder.CreateShl(Val, HighBits,
"bf.shl");
2633 if (Offset + HighBits)
2634 Val =
Builder.CreateAShr(Val, Offset + HighBits,
"bf.ashr");
2637 Val =
Builder.CreateLShr(Val, Offset,
"bf.lshr");
2638 if (
static_cast<unsigned>(Offset) + Info.
Size < StorageSize)
2640 Val, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
"bf.clear");
2656 llvm::Type *DstTy = llvm::FixedVectorType::get(Vec->getType(), 1);
2657 llvm::Value *
Zero = llvm::Constant::getNullValue(
CGM.Int64Ty);
2658 Vec =
Builder.CreateInsertElement(DstTy, Vec,
Zero,
"cast.splat");
2668 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
2670 llvm::Value *Element =
Builder.CreateExtractElement(Vec, Elt);
2673 if (Element->getType()->getPrimitiveSizeInBits() >
2674 LVTy->getPrimitiveSizeInBits())
2675 Element =
Builder.CreateTrunc(Element, LVTy);
2684 for (
unsigned i = 0; i != NumResultElts; ++i)
2687 Vec =
Builder.CreateShuffleVector(Vec, Mask);
2699 llvm::Type *VectorElementTy =
CGM.getTypes().ConvertType(EQT);
2707 Builder.CreateConstInBoundsGEP(CastToPointerElement, ix,
2710 return VectorBasePtrPlusIx;
2716 "Bad type for register variable");
2721 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(LV.
getType());
2722 llvm::Type *Ty = OrigTy;
2723 if (OrigTy->isPointerTy())
2724 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
2725 llvm::Type *Types[] = { Ty };
2727 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::read_register, Types);
2729 F, llvm::MetadataAsValue::get(Ty->getContext(), RegName));
2730 if (OrigTy->isPointerTy())
2748 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2750 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2752 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2753 "vector element type must be at least byte-sized");
2756 if (Val->getType()->getPrimitiveSizeInBits() <
2757 ElemTy->getScalarSizeInBits())
2758 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2761 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2763 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2771 llvm::Type *VecTy = Vec->getType();
2774 if (SrcVal->getType()->getPrimitiveSizeInBits() <
2775 VecTy->getScalarSizeInBits())
2776 SrcVal =
Builder.CreateZExt(SrcVal, VecTy->getScalarType());
2778 auto *IRStoreTy = dyn_cast<llvm::IntegerType>(Vec->getType());
2780 auto *IRVecTy = llvm::FixedVectorType::get(
2781 Builder.getInt1Ty(), IRStoreTy->getPrimitiveSizeInBits());
2782 Vec =
Builder.CreateBitCast(Vec, IRVecTy);
2789 if (
auto *EltTy = dyn_cast<llvm::FixedVectorType>(SrcVal->getType());
2790 EltTy && EltTy->getNumElements() == 1)
2791 SrcVal =
Builder.CreateBitCast(SrcVal, EltTy->getElementType());
2797 Vec =
Builder.CreateBitCast(Vec, IRStoreTy);
2821 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2823 CGM.getDataLayout().getPrefTypeAlign(ElemTy));
2825 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2826 "matrix element type must be at least byte-sized");
2829 if (Val->getType()->getPrimitiveSizeInBits() <
2830 ElemTy->getScalarSizeInBits())
2831 Val =
Builder.CreateZExt(Val, ElemTy->getScalarType());
2834 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2836 Builder.CreateGEP(DstAddr, {
Zero, Idx}, DestAddrTy, ElemAlign);
2842 if (
CGM.getCodeGenOpts().OptimizationLevel > 0) {
2844 llvm::MatrixBuilder MB(
Builder);
2845 MB.CreateIndexAssumption(Idx, MatTy->getNumElementsFlattened());
2850 Builder.CreateInsertElement(Load, InsertVal, Idx,
"matins");
2861 "Store through matrix row LValues is only implemented for HLSL!");
2867 unsigned NumLanes = NumCols;
2871 llvm::Type *ElemTy = DestAddrTy->getScalarType();
2875 assert(ElemTy->getScalarSizeInBits() >= 8 &&
2876 "matrix element type must be at least byte-sized");
2879 if (RowVal->getType()->getScalarType()->getPrimitiveSizeInBits() <
2880 ElemTy->getScalarSizeInBits()) {
2882 llvm::Type *StorageElmTy = llvm::FixedVectorType::get(
2883 ElemTy->getScalarType(), RowValVecTy->getNumElements());
2884 RowVal =
Builder.CreateZExt(RowVal, StorageElmTy);
2887 llvm::MatrixBuilder MB(
Builder);
2889 llvm::Constant *ColConstsIndices =
nullptr;
2893 llvm::cast<llvm::FixedVectorType>(ColConstsIndices->getType())
2898 for (
unsigned Col = 0; Col < NumLanes; ++Col) {
2899 llvm::Value *ColIdx;
2900 if (ColConstsIndices)
2901 ColIdx = ColConstsIndices->getAggregateElement(Col);
2903 ColIdx = llvm::ConstantInt::get(Row->getType(), Col);
2904 bool IsMatrixRowMajor =
getLangOpts().getDefaultMatrixMemoryLayout() ==
2906 llvm::Value *EltIndex =
2907 MB.CreateIndex(Row, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
2908 llvm::Value *Lane = llvm::ConstantInt::get(
Builder.getInt32Ty(), Col);
2909 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
2910 llvm::Value *NewElt =
Builder.CreateExtractElement(RowVal, Lane);
2912 Builder.CreateGEP(DstAddr, {
Zero, EltIndex}, DestAddrTy, ElemAlign);
2919 assert(Dst.
isBitField() &&
"Unknown LValue type");
2934 llvm_unreachable(
"present but none");
2969 CGM.getObjCRuntime().EmitObjCWeakAssign(*
this, src, LvalueDst);
2981 llvm::Value *RHS = dst.emitRawPointer(*
this);
2982 RHS =
Builder.CreatePtrToInt(RHS, ResultType,
"sub.ptr.rhs.cast");
2984 ResultType,
"sub.ptr.lhs.cast");
2985 llvm::Value *BytesBetween =
Builder.CreateSub(LHS, RHS,
"ivar.offset");
2986 CGM.getObjCRuntime().EmitObjCIvarAssign(*
this, src, dst, BytesBetween);
2988 CGM.getObjCRuntime().EmitObjCGlobalAssign(*
this, src, LvalueDst,
2992 CGM.getObjCRuntime().EmitObjCStrongCastAssign(*
this, src, LvalueDst);
2996 assert(Src.
isScalar() &&
"Can't emit an agg store with this method");
3012 llvm::Value *MaskedVal = SrcVal;
3014 const bool UseVolatile =
3017 const unsigned StorageSize =
3022 if (StorageSize != Info.
Size) {
3023 assert(StorageSize > Info.
Size &&
"Invalid bitfield size.");
3030 SrcVal, llvm::APInt::getLowBitsSet(StorageSize, Info.
Size),
3034 SrcVal =
Builder.CreateShl(SrcVal, Offset,
"bf.shl");
3038 Val, ~llvm::APInt::getBitsSet(StorageSize, Offset, Offset + Info.
Size),
3042 SrcVal =
Builder.CreateOr(Val, SrcVal,
"bf.set");
3044 assert(Offset == 0);
3051 CGM.getCodeGenOpts().ForceAAPCSBitfieldLoad)
3052 Builder.CreateLoad(Ptr,
true,
"bf.load");
3061 llvm::Value *ResultVal = MaskedVal;
3065 assert(Info.
Size <= StorageSize);
3066 unsigned HighBits = StorageSize - Info.
Size;
3068 ResultVal =
Builder.CreateShl(ResultVal, HighBits,
"bf.result.shl");
3069 ResultVal =
Builder.CreateAShr(ResultVal, HighBits,
"bf.result.ashr");
3085 SrcVal->getType()->getScalarSizeInBits())
3094 if (!DestAddrTy->isVectorTy()) {
3096 "this should only occur for non-vector l-values");
3109 CGM.getDataLayout().getPrefTypeAlign(DestAddrTy->getScalarType()));
3110 llvm::Value *
Zero = llvm::ConstantInt::get(
Int32Ty, 0);
3112 for (
unsigned I = 0; I != NumSrcElts; ++I) {
3113 llvm::Value *Val = VTy ?
Builder.CreateExtractElement(
3114 SrcVal, llvm::ConstantInt::get(
Int32Ty, I))
3121 DstElemAddr =
Builder.CreateGEP(
3122 DstAddr, {
Zero, llvm::ConstantInt::get(
Int32Ty, FieldNo)},
3123 DestAddrTy, ElemAlign);
3132 llvm::Type *VecTy = Vec->getType();
3135 unsigned NumSrcElts = VTy->getNumElements();
3137 if (NumDstElts == NumSrcElts) {
3142 for (
unsigned i = 0; i != NumSrcElts; ++i)
3145 Vec =
Builder.CreateShuffleVector(SrcVal, Mask);
3146 }
else if (NumDstElts > NumSrcElts) {
3152 for (
unsigned i = 0; i != NumSrcElts; ++i)
3153 ExtMask.push_back(i);
3154 ExtMask.resize(NumDstElts, -1);
3155 llvm::Value *ExtSrcVal =
Builder.CreateShuffleVector(SrcVal, ExtMask);
3158 for (
unsigned i = 0; i != NumDstElts; ++i)
3168 for (
unsigned i = 0; i != NumSrcElts; ++i)
3170 Vec =
Builder.CreateShuffleVector(Vec, ExtSrcVal, Mask);
3173 llvm_unreachable(
"unexpected shorten vector length");
3179 llvm::Value *Elt = llvm::ConstantInt::get(
SizeTy, InIdx);
3181 Vec =
Builder.CreateInsertElement(Vec, SrcVal, Elt);
3191 "Bad type for register variable");
3194 assert(RegName &&
"Register LValue is not metadata");
3197 llvm::Type *OrigTy =
CGM.getTypes().ConvertType(Dst.
getType());
3198 llvm::Type *Ty = OrigTy;
3199 if (OrigTy->isPointerTy())
3200 Ty =
CGM.getTypes().getDataLayout().getIntPtrType(OrigTy);
3201 llvm::Type *Types[] = { Ty };
3203 llvm::Function *F =
CGM.getIntrinsic(llvm::Intrinsic::write_register, Types);
3205 if (OrigTy->isPointerTy())
3208 F, {llvm::MetadataAsValue::get(Ty->getContext(), RegName),
Value});
3216 bool IsMemberAccess=
false) {
3228 LV.setObjCIvar(
false);
3232 LV.setObjCIvar(
true);
3234 LV.setBaseIvarExp(Exp->getBase());
3239 if (
const auto *Exp = dyn_cast<DeclRefExpr>(E)) {
3240 if (
const auto *VD = dyn_cast<VarDecl>(Exp->getDecl())) {
3241 if (VD->hasGlobalStorage()) {
3242 LV.setGlobalObjCRef(
true);
3250 if (
const auto *Exp = dyn_cast<UnaryOperator>(E)) {
3255 if (
const auto *Exp = dyn_cast<ParenExpr>(E)) {
3257 if (LV.isObjCIvar()) {
3264 LV.setObjCIvar(
false);
3269 if (
const auto *Exp = dyn_cast<GenericSelectionExpr>(E)) {
3274 if (
const auto *Exp = dyn_cast<ImplicitCastExpr>(E)) {
3279 if (
const auto *Exp = dyn_cast<CStyleCastExpr>(E)) {
3284 if (
const auto *Exp = dyn_cast<ObjCBridgedCastExpr>(E)) {
3289 if (
const auto *Exp = dyn_cast<ArraySubscriptExpr>(E)) {
3291 if (LV.isObjCIvar() && !LV.isObjCArray())
3294 LV.setObjCIvar(
false);
3295 else if (LV.isGlobalObjCRef() && !LV.isObjCArray())
3298 LV.setGlobalObjCRef(
false);
3302 if (
const auto *Exp = dyn_cast<MemberExpr>(E)) {
3316 CGF, VD,
Addr, Loc);
3321 Addr =
Addr.withElementType(RealVarTy);
3327 std::optional<OMPDeclareTargetDeclAttr::MapTypeTy> Res =
3328 OMPDeclareTargetDeclAttr::isDeclareTargetDeclaration(VD);
3333 if (!Res || ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3334 *Res == OMPDeclareTargetDeclAttr::MT_Enter ||
3335 *Res == OMPDeclareTargetDeclAttr::MT_Local) &&
3338 assert(((*Res == OMPDeclareTargetDeclAttr::MT_Link) ||
3339 ((*Res == OMPDeclareTargetDeclAttr::MT_To ||
3340 *Res == OMPDeclareTargetDeclAttr::MT_Enter ||
3341 *Res == OMPDeclareTargetDeclAttr::MT_Local) &&
3343 "Expected link clause OR to clause with unified memory enabled.");
3353 llvm::LoadInst *Load =
3358 PTy, PointeeBaseInfo, PointeeTBAAInfo,
true);
3361 llvm::MDBuilder MDB(Ctx);
3363 if (
CGM.getTypes().getTargetAddressSpace(PTy) == 0 &&
3364 !
CGM.getCodeGenOpts().NullPointerIsValid)
3365 Load->setMetadata(llvm::LLVMContext::MD_nonnull,
3366 llvm::MDNode::get(Ctx, {}));
3372 llvm::LLVMContext::MD_align,
3373 llvm::MDNode::get(Ctx, MDB.createConstant(llvm::ConstantInt::get(
3374 Builder.getInt64Ty(), AlignVal))));
3379 true, PointeeBaseInfo,
3389 PointeeBaseInfo, PointeeTBAAInfo);
3399 BaseInfo, TBAAInfo);
3429 V = CGF.
Builder.CreateThreadLocalAddress(
V);
3437 VD->
hasAttr<OMPThreadPrivateDeclAttr>()) {
3452 if (FD->
hasAttr<WeakRefAttr>()) {
3467 if (
auto *GV = dyn_cast<llvm::GlobalValue>(
V))
3468 V = llvm::NoCFIValue::get(GV);
3475 llvm::Value *ThisValue) {
3488 AsmLabelAttr *
Asm = VD->
getAttr<AsmLabelAttr>();
3489 assert(
Asm->getLabel().size() < 64-Name.size() &&
3490 "Register name too big");
3491 Name.append(
Asm->getLabel());
3492 llvm::NamedMDNode *M =
3493 CGM.
getModule().getOrInsertNamedMetadata(Name);
3494 if (M->getNumOperands() == 0) {
3497 llvm::Metadata *Ops[] = {Str};
3504 llvm::MetadataAsValue::get(CGM.
getLLVMContext(), M->getOperand(0));
3547 case llvm::GlobalValue::ExternalLinkage:
3548 case llvm::GlobalValue::LinkOnceODRLinkage:
3549 case llvm::GlobalValue::WeakODRLinkage:
3550 case llvm::GlobalValue::InternalLinkage:
3551 case llvm::GlobalValue::PrivateLinkage:
3563 "should not emit an unevaluated operand");
3565 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3568 VD->hasAttr<AsmLabelAttr>() && !VD->isLocalVarDecl())
3576 (VD->getType()->isReferenceType() ||
3578 VD->getAnyInitializer(VD);
3580 E->
getLocation(), *VD->evaluateValue(), VD->getType());
3581 assert(Val &&
"failed to emit constant expression");
3584 if (!VD->getType()->isReferenceType()) {
3586 Addr =
CGM.createUnnamedGlobalFrom(*VD, Val,
3589 auto *PTy = llvm::PointerType::get(
3608 VD = VD->getCanonicalDecl();
3612 auto I = LocalDeclMap.find(VD);
3613 if (I != LocalDeclMap.end()) {
3615 if (VD->getType()->isReferenceType())
3623 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3640 CGM.getOpenMPRuntime().isNontemporalDecl(VD))
3656 "Should not use decl without marking it used!");
3658 if (ND->
hasAttr<WeakRefAttr>()) {
3664 if (
const auto *VD = dyn_cast<VarDecl>(ND)) {
3666 if (VD->hasLinkage() || VD->isStaticDataMember())
3672 auto iter = LocalDeclMap.find(VD);
3673 if (iter != LocalDeclMap.end()) {
3674 addr = iter->second;
3678 }
else if (VD->isStaticLocal()) {
3679 llvm::Constant *var =
CGM.getOrCreateStaticVarDecl(
3680 *VD,
CGM.getLLVMLinkageVarDefinition(VD));
3686 llvm_unreachable(
"DeclRefExpr for Decl not entered in LocalDeclMap?");
3697 VD->hasAttr<OMPThreadPrivateDeclAttr>()) {
3704 bool isBlockByref = VD->isEscapingByref();
3710 LValue LV = VD->getType()->isReferenceType() ?
3714 bool isLocalStorage = VD->hasLocalStorage();
3716 bool NonGCable = isLocalStorage &&
3717 !VD->getType()->isReferenceType() &&
3724 bool isImpreciseLifetime =
3725 (isLocalStorage && !VD->hasAttr<ObjCPreciseLifetimeAttr>());
3726 if (isImpreciseLifetime)
3732 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
3738 if (
const auto *BD = dyn_cast<BindingDecl>(ND)) {
3755 if (
const auto *GD = dyn_cast<MSGuidDecl>(ND))
3759 if (
const auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
3763 if (AS != T.getAddressSpace()) {
3766 llvm::PointerType::get(
CGM.getLLVMContext(), TargetAS);
3767 llvm::Constant *ASC =
CGM.performAddrSpaceCast(ATPO.
getPointer(), PtrTy);
3774 llvm_unreachable(
"Unhandled DeclRefExpr");
3784 default: llvm_unreachable(
"Unknown unary operator lvalue!");
3787 assert(!T.isNull() &&
"CodeGenFunction::EmitUnaryOpLValue: Illegal type");
3809 assert(LV.
isSimple() &&
"real/imag on non-ordinary l-value");
3826 CGM.getTBAAInfoForSubobject(LV, T));
3833 bool isInc = E->
getOpcode() == UO_PreInc;
3856 assert(SL !=
nullptr &&
"No StringLiteral name in PredefinedExpr");
3857 StringRef FnName =
CurFn->getName();
3858 FnName.consume_front(
"\01");
3859 StringRef NameItems[] = {
3861 std::string GVName = llvm::join(NameItems, NameItems + 2,
".");
3862 if (
auto *BD = dyn_cast_or_null<BlockDecl>(
CurCodeDecl)) {
3863 std::string Name = std::string(SL->getString());
3864 if (!Name.empty()) {
3865 unsigned Discriminator =
3866 CGM.getCXXABI().getMangleContext().getBlockId(BD,
true);
3868 Name +=
"_" + Twine(Discriminator + 1).str();
3869 auto C =
CGM.GetAddrOfConstantCString(Name, GVName);
3872 auto C =
CGM.GetAddrOfConstantCString(std::string(FnName), GVName);
3876 auto C =
CGM.GetAddrOfConstantStringFromLiteral(SL, GVName);
3893 if (llvm::Constant *
C =
CGM.getTypeDescriptorFromMap(T))
3898 bool IsBitInt =
false;
3900 if (T->isIntegerType()) {
3903 (T->isSignedIntegerType() ? 1 : 0);
3907 if (T->isSignedIntegerType() && T->getAs<
BitIntType>()) {
3910 " non positive amount of bits in __BitInt type");
3912 " too many bits in __BitInt type");
3919 }
else if (T->isFloatingType()) {
3928 (
intptr_t)T.getAsOpaquePtr(), StringRef(),
3929 StringRef(), {}, Buffer, {});
3934 char S[6] = {
'\0',
'\0',
'\0',
'\0',
'\0',
'\0'};
3937 llvm::support::endian::write32(S + 1, Bits,
3939 ? llvm::endianness::big
3940 : llvm::endianness::little);
3941 StringRef Str = StringRef(S,
sizeof(S) /
sizeof(
decltype(S[0])));
3945 llvm::Constant *Components[] = {
3949 llvm::Constant *Descriptor = llvm::ConstantStruct::getAnon(Components);
3951 auto *GV =
new llvm::GlobalVariable(
3952 CGM.getModule(), Descriptor->getType(),
3953 true, llvm::GlobalVariable::PrivateLinkage, Descriptor);
3954 GV->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
3955 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(GV);
3958 CGM.setTypeDescriptorInMap(T, GV);
3966 if (
V->getType() == TargetTy)
3971 if (
V->getType()->isFloatingPointTy()) {
3972 unsigned Bits =
V->getType()->getPrimitiveSizeInBits().getFixedValue();
3973 if (Bits <= TargetTy->getIntegerBitWidth())
3979 if (
V->getType()->isIntegerTy() &&
3980 V->getType()->getIntegerBitWidth() <= TargetTy->getIntegerBitWidth())
3981 return Builder.CreateZExt(
V, TargetTy);
3984 if (!
V->getType()->isPointerTy()) {
3989 return Builder.CreatePtrToInt(
V, TargetTy);
4002 llvm::Constant *Filename;
4009 int PathComponentsToStrip =
4010 CGM.getCodeGenOpts().EmitCheckPathComponentsToStrip;
4011 if (PathComponentsToStrip < 0) {
4012 assert(PathComponentsToStrip !=
INT_MIN);
4013 int PathComponentsToKeep = -PathComponentsToStrip;
4014 auto I = llvm::sys::path::rbegin(FilenameString);
4015 auto E = llvm::sys::path::rend(FilenameString);
4016 while (I != E && --PathComponentsToKeep)
4019 FilenameString = FilenameString.substr(I - E);
4020 }
else if (PathComponentsToStrip > 0) {
4021 auto I = llvm::sys::path::begin(FilenameString);
4022 auto E = llvm::sys::path::end(FilenameString);
4023 while (I != E && PathComponentsToStrip--)
4028 FilenameString.substr(I - llvm::sys::path::begin(FilenameString));
4030 FilenameString = llvm::sys::path::filename(FilenameString);
4034 CGM.GetAddrOfConstantCString(std::string(FilenameString),
".src");
4035 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(
4037 FilenameGV.getPointer()->stripPointerCasts()));
4038 Filename = FilenameGV.getPointer();
4042 Filename = llvm::Constant::getNullValue(
Int8PtrTy);
4049 return llvm::ConstantStruct::getAnon(
Data);
4054enum class CheckRecoverableKind {
4065static CheckRecoverableKind
4067 if (Ordinal == SanitizerKind::SO_Vptr)
4068 return CheckRecoverableKind::AlwaysRecoverable;
4069 else if (Ordinal == SanitizerKind::SO_Return ||
4070 Ordinal == SanitizerKind::SO_Unreachable)
4071 return CheckRecoverableKind::Unrecoverable;
4073 return CheckRecoverableKind::Recoverable;
4077struct SanitizerHandlerInfo {
4078 char const *
const Name;
4084#define SANITIZER_CHECK(Enum, Name, Version, Msg) {#Name, Version},
4086#undef SANITIZER_CHECK
4090 llvm::FunctionType *FnType,
4093 CheckRecoverableKind RecoverKind,
bool IsFatal,
4094 llvm::BasicBlock *ContBB,
bool NoMerge) {
4095 assert(IsFatal || RecoverKind != CheckRecoverableKind::Unrecoverable);
4096 std::optional<ApplyDebugLocation> DL;
4097 if (!CGF.
Builder.getCurrentDebugLocation()) {
4101 bool NeedsAbortSuffix =
4102 IsFatal && RecoverKind != CheckRecoverableKind::Unrecoverable;
4104 bool HandlerPreserveAllRegs =
4107 const StringRef CheckName = CheckInfo.Name;
4108 std::string FnName =
"__ubsan_handle_" + CheckName.str();
4109 if (CheckInfo.Version && !MinimalRuntime)
4110 FnName +=
"_v" + llvm::utostr(CheckInfo.Version);
4112 FnName +=
"_minimal";
4113 if (NeedsAbortSuffix)
4115 if (HandlerPreserveAllRegs && !NeedsAbortSuffix)
4116 FnName +=
"_preserve";
4118 !IsFatal || RecoverKind == CheckRecoverableKind::AlwaysRecoverable;
4122 B.addAttribute(llvm::Attribute::NoReturn)
4123 .addAttribute(llvm::Attribute::NoUnwind);
4125 B.addUWTableAttr(llvm::UWTableKind::Default);
4130 llvm::AttributeList::FunctionIndex, B),
4136 HandlerCall->addFnAttr(llvm::Attribute::NoMerge);
4137 if (HandlerPreserveAllRegs && !NeedsAbortSuffix) {
4139 HandlerCall->setCallingConv(llvm::CallingConv::PreserveAll);
4142 HandlerCall->setDoesNotReturn();
4143 CGF.
Builder.CreateUnreachable();
4150 ArrayRef<std::pair<llvm::Value *, SanitizerKind::SanitizerOrdinal>> Checked,
4154 assert(Checked.size() > 0);
4155 assert(CheckHandler >= 0 &&
4159 llvm::Value *FatalCond =
nullptr;
4160 llvm::Value *RecoverableCond =
nullptr;
4161 llvm::Value *TrapCond =
nullptr;
4162 bool NoMerge =
false;
4169 for (
auto &[Check, Ord] : Checked) {
4170 llvm::Value *GuardedCheck = Check;
4172 (
CGM.getCodeGenOpts().SanitizeSkipHotCutoffs[Ord] > 0)) {
4174 CGM.getIntrinsic(llvm::Intrinsic::allow_ubsan_check),
4175 llvm::ConstantInt::get(
CGM.Int8Ty, Ord));
4180 llvm::Value *&
Cond =
CGM.getCodeGenOpts().SanitizeTrap.has(Ord) ? TrapCond
4181 :
CGM.getCodeGenOpts().SanitizeRecover.has(Ord)
4186 if (!
CGM.getCodeGenOpts().SanitizeMergeHandlers.has(Ord))
4192 if (!FatalCond && !RecoverableCond)
4195 llvm::Value *JointCond;
4196 if (FatalCond && RecoverableCond)
4197 JointCond =
Builder.CreateAnd(FatalCond, RecoverableCond);
4199 JointCond = FatalCond ? FatalCond : RecoverableCond;
4203 assert(
SanOpts.has(Checked[0].second));
4205 for (
int i = 1, n = Checked.size(); i < n; ++i) {
4207 "All recoverable kinds in a single check must be same!");
4208 assert(
SanOpts.has(Checked[i].second));
4214 llvm::Instruction *Branch =
Builder.CreateCondBr(JointCond, Cont, Handlers);
4217 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4218 Branch->setMetadata(llvm::LLVMContext::MD_prof, Node);
4222 if (
CGM.getCodeGenOpts().SanitizeMinimalRuntime) {
4233 Args.reserve(DynamicArgs.size() + 1);
4234 ArgTypes.reserve(DynamicArgs.size() + 1);
4237 if (!StaticArgs.empty()) {
4238 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4239 auto *InfoPtr =
new llvm::GlobalVariable(
4240 CGM.getModule(), Info->getType(),
4243 false, llvm::GlobalVariable::PrivateLinkage, Info,
"",
4244 nullptr, llvm::GlobalVariable::NotThreadLocal,
4245 CGM.getDataLayout().getDefaultGlobalsAddressSpace());
4246 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4247 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4248 Args.push_back(InfoPtr);
4249 ArgTypes.push_back(Args.back()->getType());
4252 for (llvm::Value *DynamicArg : DynamicArgs) {
4257 llvm::FunctionType *FnType =
4258 llvm::FunctionType::get(
CGM.VoidTy, ArgTypes,
false);
4260 if (!FatalCond || !RecoverableCond) {
4264 (FatalCond !=
nullptr), Cont, NoMerge);
4268 llvm::BasicBlock *NonFatalHandlerBB =
4271 Builder.CreateCondBr(FatalCond, NonFatalHandlerBB, FatalHandlerBB);
4274 NonFatalHandlerBB, NoMerge);
4285 llvm::ConstantInt *TypeId, llvm::Value *Ptr,
4290 llvm::CondBrInst *BI =
Builder.CreateCondBr(
Cond, Cont, CheckBB);
4293 llvm::MDNode *Node = MDHelper.createLikelyBranchWeights();
4294 BI->setMetadata(llvm::LLVMContext::MD_prof, Node);
4298 bool WithDiag = !
CGM.getCodeGenOpts().SanitizeTrap.has(Ordinal);
4300 llvm::CallInst *CheckCall;
4301 llvm::FunctionCallee SlowPathFn;
4303 llvm::Constant *Info = llvm::ConstantStruct::getAnon(StaticArgs);
4305 new llvm::GlobalVariable(
CGM.getModule(), Info->getType(),
false,
4306 llvm::GlobalVariable::PrivateLinkage, Info);
4307 InfoPtr->setUnnamedAddr(llvm::GlobalValue::UnnamedAddr::Global);
4308 CGM.getSanitizerMetadata()->disableSanitizerForGlobal(InfoPtr);
4310 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4311 "__cfi_slowpath_diag",
4314 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr, InfoPtr});
4316 SlowPathFn =
CGM.getModule().getOrInsertFunction(
4319 CheckCall =
Builder.CreateCall(SlowPathFn, {TypeId, Ptr});
4324 CheckCall->setDoesNotThrow();
4332 llvm::Module *M = &
CGM.getModule();
4334 QualType QInt64Ty =
C.getIntTypeForBitwidth(64,
false);
4341 FnArgs.push_back(&ArgCallsiteTypeId);
4342 FnArgs.push_back(&ArgAddr);
4343 FnArgs.push_back(&ArgCFICheckFailData);
4345 CGM.getTypes().arrangeBuiltinFunctionDeclaration(
C.VoidTy,
FnArgs);
4347 llvm::Function *F = llvm::Function::Create(
4349 llvm::GlobalValue::WeakAnyLinkage,
"__cfi_check", M);
4351 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4352 F->setAlignment(llvm::Align(4096));
4355 llvm::LLVMContext &Ctx = M->getContext();
4356 llvm::BasicBlock *BB = llvm::BasicBlock::Create(Ctx,
"entry", F);
4359 llvm::CallInst::Create(M->getFunction(
"__cfi_check_fail"), Args,
"", BB);
4360 llvm::ReturnInst::Create(Ctx,
nullptr, BB);
4371 auto CheckHandler = SanitizerHandler::CFICheckFail;
4378 {SanitizerKind::SO_CFIVCall, SanitizerKind::SO_CFINVCall,
4379 SanitizerKind::SO_CFIDerivedCast, SanitizerKind::SO_CFIUnrelatedCast,
4380 SanitizerKind::SO_CFIICall},
4387 Args.push_back(&ArgData);
4388 Args.push_back(&ArgAddr);
4393 llvm::Function *F = llvm::Function::Create(
4395 llvm::GlobalValue::WeakODRLinkage,
"__cfi_check_fail", &
CGM.getModule());
4398 CGM.SetLLVMFunctionAttributesForDefinition(
nullptr, F);
4399 F->setVisibility(llvm::GlobalValue::HiddenVisibility);
4419 llvm::Value *DataIsNotNullPtr =
4424 EmitTrapCheck(DataIsNotNullPtr, SanitizerHandler::CFICheckFail,
4427 llvm::StructType *SourceLocationTy =
4429 llvm::StructType *CfiCheckFailDataTy =
4432 llvm::Value *
V =
Builder.CreateConstGEP2_32(
4436 llvm::Value *CheckKind =
Builder.CreateLoad(CheckKindAddr);
4438 llvm::Value *AllVtables = llvm::MetadataAsValue::get(
4439 CGM.getLLVMContext(),
4440 llvm::MDString::get(
CGM.getLLVMContext(),
"all-vtables"));
4441 llvm::Value *ValidVtable =
Builder.CreateZExt(
4442 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::type_test),
4443 {Addr, AllVtables}),
4446 const std::pair<int, SanitizerKind::SanitizerOrdinal> CheckKinds[] = {
4453 for (
auto CheckKindOrdinalPair : CheckKinds) {
4454 int Kind = CheckKindOrdinalPair.first;
4461 Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(
Int8Ty, Kind));
4462 if (
CGM.getLangOpts().Sanitize.has(Ordinal))
4463 EmitCheck(std::make_pair(
Cond, Ordinal), SanitizerHandler::CFICheckFail,
4476 CGM.addUsedGlobal(F);
4480 if (
SanOpts.has(SanitizerKind::Unreachable)) {
4481 auto CheckOrdinal = SanitizerKind::SO_Unreachable;
4482 auto CheckHandler = SanitizerHandler::BuiltinUnreachable;
4498 if ((
int)TrapBBs.size() <= CheckHandlerID)
4499 TrapBBs.resize(CheckHandlerID + 1);
4501 llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
4503 llvm::DILocation *TrapLocation =
Builder.getCurrentDebugLocation();
4504 llvm::StringRef TrapMessage;
4505 llvm::StringRef TrapCategory;
4506 auto DebugTrapReasonKind =
CGM.getCodeGenOpts().getSanitizeDebugTrapReasons();
4508 DebugTrapReasonKind ==
4514 TrapCategory =
"Undefined Behavior Sanitizer";
4518 DebugTrapReasonKind !=
4522 TrapLocation, TrapCategory, TrapMessage);
4525 NoMerge = NoMerge || !
CGM.getCodeGenOpts().OptimizationLevel ||
4529 if (TrapBB && !NoMerge) {
4530 auto Call = TrapBB->begin();
4533 Call->applyMergedLocation(
Call->getDebugLoc(), TrapLocation);
4535 Builder.CreateCondBr(Checked, Cont, TrapBB,
4536 MDHelper.createLikelyBranchWeights());
4539 Builder.CreateCondBr(Checked, Cont, TrapBB,
4540 MDHelper.createLikelyBranchWeights());
4545 llvm::CallInst *TrapCall;
4546 if (
CGM.getCodeGenOpts().SanitizeTrapLoop)
4548 Builder.CreateCall(
CGM.getIntrinsic(llvm::Intrinsic::looptrap));
4550 TrapCall =
Builder.CreateCall(
4551 CGM.getIntrinsic(llvm::Intrinsic::ubsantrap),
4552 llvm::ConstantInt::get(
CGM.Int8Ty, CheckHandlerID));
4554 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4555 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4556 CGM.getCodeGenOpts().TrapFuncName);
4557 TrapCall->addFnAttr(A);
4560 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4561 TrapCall->setDoesNotReturn();
4562 TrapCall->setDoesNotThrow();
4570 llvm::CallInst *TrapCall =
4571 Builder.CreateCall(
CGM.getIntrinsic(IntrID));
4573 if (!
CGM.getCodeGenOpts().TrapFuncName.empty()) {
4574 auto A = llvm::Attribute::get(
getLLVMContext(),
"trap-func-name",
4575 CGM.getCodeGenOpts().TrapFuncName);
4576 TrapCall->addFnAttr(A);
4580 TrapCall->addFnAttr(llvm::Attribute::NoMerge);
4588 "Array to pointer decay must have array source type!");
4597 Addr =
Addr.withElementType(NewTy);
4603 "Expected pointer to array");
4609 Builder.CreateStructuredGEP(NewTy,
Addr.emitRawPointer(*
this), {});
4623 if (TBAAInfo) *TBAAInfo =
CGM.getTBAAAccessInfo(EltType);
4632 const auto *CE = dyn_cast<CastExpr>(E);
4633 if (!CE || CE->getCastKind() != CK_ArrayToPointerDecay)
4645 llvm::Type *elemType,
4651 const llvm::Twine &name =
"arrayidx") {
4652 if (inbounds && CGF.
getLangOpts().EmitStructuredGEP)
4653 return CGF.
Builder.CreateStructuredGEP(elemType, ptr, indices);
4667 llvm::Type *elementType,
bool inbounds,
4670 const llvm::Twine &name =
"arrayidx") {
4671 if (inbounds && CGF.
getLangOpts().EmitStructuredGEP)
4674 indices.drop_front()),
4675 elementType, align);
4696 return D && D->
hasAttr<BPFPreserveStaticOffsetAttr>();
4703 if (PointeeType.
isNull())
4716 llvm::Function *Fn =
4718 llvm::CallInst *
Call = CGF.
Builder.CreateCall(Fn, {
Addr.emitRawPointer(CGF)});
4736 if (
const auto *ME = dyn_cast<MemberExpr>(E))
4737 return ME->getMemberDecl()->hasAttr<BPFPreserveAccessIndexAttr>();
4739 if (
const auto *DRE = dyn_cast<DeclRefExpr>(E)) {
4740 const auto *VarDef = dyn_cast<VarDecl>(DRE->getDecl());
4744 const auto *PtrT = VarDef->getType()->getAs<
PointerType>();
4750 if (
const auto *RecT = dyn_cast<RecordType>(PointeeT))
4751 return RecT->getDecl()
4752 ->getMostRecentDecl()
4753 ->
hasAttr<BPFPreserveAccessIndexAttr>();
4766 const llvm::Twine &name =
"arrayidx") {
4769 for (
auto *idx : indices.drop_back())
4788 llvm::Value *eltPtr;
4789 auto LastIndex = dyn_cast<llvm::ConstantInt>(indices.back());
4796 signedIndices, loc, eltAlign, name);
4800 unsigned idx = LastIndex->getZExtValue();
4801 llvm::DIType *DbgInfo =
nullptr;
4804 eltPtr = CGF.
Builder.CreatePreserveArrayAccessIndex(
4816struct StructFieldAccess
4817 :
public ConstStmtVisitor<StructFieldAccess, const Expr *> {
4818 const Expr *VisitCastExpr(
const CastExpr *E) {
4823 const Expr *VisitParenExpr(
const ParenExpr *E) {
4832 const FieldDecl *Field, int64_t &Offset) {
4835 unsigned FieldNo = 0;
4870 if (FD1OuterRec != FD2OuterRec)
4872 return std::optional<int64_t>();
4874 int64_t FD1Offset = 0;
4876 return std::optional<int64_t>();
4878 int64_t FD2Offset = 0;
4880 return std::optional<int64_t>();
4882 return std::make_optional<int64_t>(FD1Offset - FD2Offset);
4894 QualType IndexType, llvm::Value *IndexVal,
bool Accessed,
4895 bool FlexibleArray) {
4896 const auto *ME = dyn_cast<MemberExpr>(ArrayExpr->
IgnoreImpCasts());
4897 if (!ME || !ME->getMemberDecl()->getType()->isCountAttributedType())
4902 if (FlexibleArray &&
4903 !ME->isFlexibleArrayMemberLike(
getContext(), StrictFlexArraysLevel))
4911 if (std::optional<int64_t> Diff =
4926 ArrayInst =
Builder.CreatePointerBitCastOrAddrSpaceCast(ArrayInst,
4930 llvm::Value *BoundsVal =
4932 Builder.getInt32(*Diff),
".counted_by.gep");
4934 ".counted_by.load");
4938 CountFD->
getType(), Accessed);
4946 llvm::Value *IdxPre =
4948 bool SignedIndices =
false;
4949 auto EmitIdxAfterBase = [&, IdxPre](
bool Promote) -> llvm::Value * {
4952 assert(E->
getRHS() == E->
getIdx() &&
"index was neither LHS nor RHS");
4958 SignedIndices |= IdxSigned;
4960 if (
SanOpts.has(SanitizerKind::ArrayBounds))
4964 if (Promote && Idx->getType() !=
IntPtrTy)
4977 auto *Idx = EmitIdxAfterBase(
false);
4978 assert(LHS.
isSimple() &&
"Can only subscript lvalue vectors here!");
4986 std::optional<LValue> LV;
4989 LV =
CGM.getHLSLRuntime().emitResourceArraySubscriptExpr(E, *
this);
4991 LV =
CGM.getHLSLRuntime().emitBufferArraySubscriptExpr(E, *
this,
5003 auto *Idx = EmitIdxAfterBase(
true);
5010 CGM.getTBAAInfoForSubobject(LV, EltType));
5022 auto *Idx = EmitIdxAfterBase(
true);
5032 Idx =
Builder.CreateMul(Idx, numElements);
5034 Idx =
Builder.CreateNSWMul(Idx, numElements);
5046 auto *Idx = EmitIdxAfterBase(
true);
5049 llvm::Value *InterfaceSizeVal =
5050 llvm::ConstantInt::get(Idx->getType(), InterfaceSize.
getQuantity());
5052 llvm::Value *ScaledIdx =
Builder.CreateMul(Idx, InterfaceSizeVal);
5058 llvm::Type *OrigBaseElemTy =
Addr.getElementType();
5063 llvm::Value *EltPtr =
5065 ScaledIdx,
false, SignedIndices, E->
getExprLoc());
5072 assert(Array->getType()->isArrayType() &&
5073 "Array to pointer decay must have array source type!");
5077 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5081 auto *Idx = EmitIdxAfterBase(
true);
5083 if (
SanOpts.has(SanitizerKind::ArrayBounds))
5091 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5095 if (!
CGM.getCodeGenOpts().NewStructPathTBAA) {
5098 EltTBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, E->
getType());
5103 EltTBAAInfo =
CGM.getTBAAAccessInfo(E->
getType());
5125 auto *Idx = EmitIdxAfterBase(
true);
5132 if (
SanOpts.has(SanitizerKind::ArrayBounds)) {
5133 StructFieldAccess Visitor;
5136 if (
const auto *CE = dyn_cast_if_present<CastExpr>(
Base);
5137 CE && CE->getCastKind() == CK_LValueToRValue)
5170 MatAddr =
CGM.getHLSLRuntime().createBufferMatrixTempAddress(
5181 "incomplete matrix subscript expressions should be rejected during Sema");
5187 llvm::MatrixBuilder MB(
Builder);
5190 unsigned NumRows = MatrixTy->getNumRows();
5191 bool IsMatrixRowMajor =
getLangOpts().getDefaultMatrixMemoryLayout() ==
5193 llvm::Value *FinalIdx =
5194 MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols, IsMatrixRowMajor);
5205 bool IsLowerBound) {
5207 if (
auto *ASE = dyn_cast<ArraySectionExpr>(
Base->IgnoreParenImpCasts())) {
5211 BaseInfo = BaseLVal.getBaseInfo();
5216 Addr =
Addr.withElementType(NewTy);
5222 "Expected pointer to array");
5232 BaseInfo.mergeForCast(TypeBaseInfo);
5241 bool IsLowerBound) {
5244 "OpenACC Array section codegen not implemented");
5248 if (
auto *AT =
getContext().getAsArrayType(BaseTy))
5249 ResultExprTy = AT->getElementType();
5252 llvm::Value *Idx =
nullptr;
5260 LowerBound->getType()->hasSignedIntegerRepresentation());
5262 Idx = llvm::ConstantInt::getNullValue(
IntPtrTy);
5267 auto &
C =
CGM.getContext();
5269 llvm::APSInt ConstLength;
5272 if (std::optional<llvm::APSInt>
CL = Length->getIntegerConstantExpr(
C)) {
5279 if (std::optional<llvm::APSInt> LB =
5280 LowerBound->getIntegerConstantExpr(
C)) {
5282 LowerBound =
nullptr;
5287 else if (!LowerBound)
5290 if (Length || LowerBound) {
5291 auto *LowerBoundVal =
5295 LowerBound->getType()->hasSignedIntegerRepresentation())
5296 : llvm::ConstantInt::get(
IntPtrTy, ConstLowerBound);
5301 Length->getType()->hasSignedIntegerRepresentation())
5302 : llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5303 Idx =
Builder.CreateAdd(LowerBoundVal, LengthVal,
"lb_add_len",
5306 if (Length && LowerBound) {
5308 Idx, llvm::ConstantInt::get(
IntPtrTy, 1),
"idx_sub_1",
5312 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength + ConstLowerBound);
5318 if (
auto *VAT =
C.getAsVariableArrayType(ArrayTy)) {
5319 Length = VAT->getSizeExpr();
5320 if (std::optional<llvm::APSInt> L = Length->getIntegerConstantExpr(
C)) {
5325 auto *CAT =
C.getAsConstantArrayType(ArrayTy);
5326 assert(CAT &&
"unexpected type for array initializer");
5327 ConstLength = CAT->getSize();
5330 auto *LengthVal =
Builder.CreateIntCast(
5332 Length->getType()->hasSignedIntegerRepresentation());
5334 LengthVal, llvm::ConstantInt::get(
IntPtrTy, 1),
"len_sub_1",
5339 Idx = llvm::ConstantInt::get(
IntPtrTy, ConstLength);
5348 if (
auto *VLA =
getContext().getAsVariableArrayType(ResultExprTy)) {
5354 BaseTy, VLA->getElementType(), IsLowerBound);
5363 Idx =
Builder.CreateMul(Idx, NumElements);
5365 Idx =
Builder.CreateNSWMul(Idx, NumElements);
5374 assert(Array->getType()->isArrayType() &&
5375 "Array to pointer decay must have array source type!");
5379 if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(Array))
5386 *
this, ArrayLV.
getAddress(), {CGM.getSize(CharUnits::Zero()), Idx},
5387 ResultExprTy, !
getLangOpts().PointerOverflowDefined,
5390 TBAAInfo =
CGM.getTBAAInfoForSubobject(ArrayLV, ResultExprTy);
5394 ResultExprTy, IsLowerBound);
5417 Base.getQuals().removeObjCGCAttr();
5426 "Result must be a vector");
5434 if (LTy->getScalarSizeInBits() > Vec->getType()->getScalarSizeInBits())
5435 Vec =
Builder.CreateZExt(Vec, LTy);
5436 Builder.CreateStore(Vec, VecMem);
5447 if (
Base.isSimple()) {
5448 llvm::Constant *CV =
5454 if (
Base.isMatrixRow()) {
5456 llvm::dyn_cast<llvm::ConstantInt>(
Base.getMatrixRowIdx())) {
5460 unsigned NumCols = Indices.size();
5462 unsigned Row = RowIdx->getZExtValue();
5466 QualType ElemQT = EVT->getElementType();
5469 for (
unsigned C = 0;
C < NumCols; ++
C) {
5470 unsigned Col = Indices[
C];
5471 unsigned Linear = Col * NumRows + Row;
5472 MatIndices.push_back(llvm::ConstantInt::get(
Int32Ty, Linear));
5475 llvm::Constant *ConstIdxs = llvm::ConstantVector::get(MatIndices);
5479 llvm::Constant *Cols =
5486 Base.getMatrixAddress(),
Base.getMatrixRowIdx(), Cols,
Base.getType(),
5490 assert(
Base.isExtVectorElt() &&
"Can only subscript lvalue vec elts here!");
5492 llvm::Constant *BaseElts =
Base.getExtVectorElts();
5495 for (
unsigned Index : Indices)
5496 CElts.push_back(BaseElts->getAggregateElement(Index));
5497 llvm::Constant *CV = llvm::ConstantVector::get(CElts);
5504 while (
auto *BaseMemberExpr = dyn_cast<MemberExpr>(UnderlyingBaseExpr))
5505 UnderlyingBaseExpr = BaseMemberExpr->getBase()->
IgnoreParens();
5517 return CGM.getHLSLRuntime().emitBufferMemberExpr(*
this, E);
5524 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
5536 SkippedChecks.
set(SanitizerKind::Alignment,
true);
5538 SkippedChecks.
set(SanitizerKind::Null,
true);
5546 if (
auto *Field = dyn_cast<FieldDecl>(ND)) {
5554 CGM.getOpenMPRuntime().isNontemporalDecl(Field)) ||
5561 if (
const auto *FD = dyn_cast<FunctionDecl>(ND))
5564 llvm_unreachable(
"Unhandled member declaration!");
5571 llvm::Value *ThisValue) {
5572 bool HasExplicitObjectParameter =
false;
5573 const auto *MD = dyn_cast_if_present<CXXMethodDecl>(
CurCodeDecl);
5575 HasExplicitObjectParameter = MD->isExplicitObjectMemberFunction();
5576 assert(MD->getParent()->isLambda());
5577 assert(MD->getParent() == Field->getParent());
5580 if (HasExplicitObjectParameter) {
5582 auto It = LocalDeclMap.find(D);
5583 assert(It != LocalDeclMap.end() &&
"explicit parameter not loaded?");
5584 Address AddrOfExplicitObject = It->getSecond();
5595 if (ThisTy != LambdaTy) {
5598 LambdaLV.
getAddress(), ThisTy, BasePathArray.begin(),
5618 unsigned FieldIndex) {
5619 unsigned I = 0, Skipped = 0;
5622 if (I == FieldIndex)
5624 if (F->isUnnamedBitField())
5629 return FieldIndex - Skipped;
5639 if (Offset.isZero())
5661 llvm::Type *StructType =
5667 {CGF.Builder.getSize(idx)}),
5682 const FieldDecl *field,
bool IsInBounds) {
5709 if (RD->isDynamicClass())
5712 for (
const auto &
Base : RD->bases())
5716 for (
const FieldDecl *Field : RD->fields())
5731 const bool UseVolatile =
isAAPCS(
CGM.getTarget()) &&
5732 CGM.getCodeGenOpts().AAPCSBitfieldWidth &&
5763 llvm::Type *FieldIntTy = llvm::Type::getIntNTy(
getLLVMContext(), SS);
5764 Addr =
Addr.withElementType(FieldIntTy);
5799 assert(!FieldTBAAInfo.
Offset &&
5800 "Nonzero offset for an access with no base type!");
5813 FieldTBAAInfo.
Size =
5820 if (
auto *ClassDef = dyn_cast<CXXRecordDecl>(rec)) {
5821 if (
CGM.getCodeGenOpts().StrictVTablePointers &&
5822 ClassDef->isDynamicClass()) {
5836 if (
CGM.getCodeGenOpts().StrictVTablePointers &&
5840 addr =
Builder.CreateLaunderInvariantGroup(addr);
5883 if (field->
hasAttr<AnnotateAttr>())
5899 QualType FieldType = Field->getType();
5905 *
this,
Base.getAddress(), Field,
5910 V =
V.withElementType(llvmType);
5919 CGM.getTBAAInfoForSubobject(
Base, FieldType));
5955 assert(E->
isTransparent() &&
"non-transparent glvalue init list");
5963 const Expr *Operand) {
5964 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Operand->IgnoreParens())) {
5966 return std::nullopt;
5975std::optional<LValue> HandleConditionalOperatorLValueSimpleCase(
5977 const Expr *condExpr = E->
getCond();
5982 std::swap(Live, Dead);
5992 if (
auto *ThrowExpr = dyn_cast<CXXThrowExpr>(Live->
IgnoreParens())) {
6003 return std::nullopt;
6005struct ConditionalInfo {
6006 llvm::BasicBlock *lhsBlock, *rhsBlock;
6007 std::optional<LValue> LHS, RHS;
6012template<
typename FuncTy>
6014 const AbstractConditionalOperator *E,
6015 const FuncTy &BranchGenFunc) {
6031 Info.lhsBlock = CGF.
Builder.GetInsertBlock();
6034 CGF.
Builder.CreateBr(endBlock);
6042 Info.rhsBlock = CGF.
Builder.GetInsertBlock();
6054 "Unexpected conditional operator!");
6059 if (HandleConditionalOperatorLValueSimpleCase(*
this, E))
6062 EmitConditionalBlocks(*
this, E, [](CodeGenFunction &CGF,
const Expr *E) {
6069 if (!
expr->isGLValue()) {
6072 "Unexpected conditional operator!");
6077 if (std::optional<LValue> Res =
6078 HandleConditionalOperatorLValueSimpleCase(*
this,
expr))
6081 ConditionalInfo Info = EmitConditionalBlocks(
6082 *
this,
expr, [](CodeGenFunction &CGF,
const Expr *E) {
6086 if ((Info.LHS && !Info.LHS->isSimple()) ||
6087 (Info.RHS && !Info.RHS->isSimple()))
6090 if (Info.LHS && Info.RHS) {
6091 Address lhsAddr = Info.LHS->getAddress();
6092 Address rhsAddr = Info.RHS->getAddress();
6094 lhsAddr, rhsAddr, Info.lhsBlock, Info.rhsBlock,
6097 std::max(Info.LHS->getBaseInfo().getAlignmentSource(),
6098 Info.RHS->getBaseInfo().getAlignmentSource());
6100 Info.LHS->getTBAAInfo(), Info.RHS->getTBAAInfo());
6104 assert((Info.LHS || Info.RHS) &&
6105 "both operands of glvalue conditional are throw-expressions?");
6106 return Info.LHS ? *Info.LHS : *Info.RHS;
6118 llvm::scope_exit RestoreCurCast([
this, Prev =
CurCast] {
CurCast = Prev; });
6123 case CK_LValueToRValueBitCast:
6124 case CK_ArrayToPointerDecay:
6125 case CK_FunctionToPointerDecay:
6126 case CK_NullToMemberPointer:
6127 case CK_NullToPointer:
6128 case CK_IntegralToPointer:
6129 case CK_PointerToIntegral:
6130 case CK_PointerToBoolean:
6131 case CK_IntegralCast:
6132 case CK_BooleanToSignedIntegral:
6133 case CK_IntegralToBoolean:
6134 case CK_IntegralToFloating:
6135 case CK_FloatingToIntegral:
6136 case CK_FloatingToBoolean:
6137 case CK_FloatingCast:
6138 case CK_FloatingRealToComplex:
6139 case CK_FloatingComplexToReal:
6140 case CK_FloatingComplexToBoolean:
6141 case CK_FloatingComplexCast:
6142 case CK_FloatingComplexToIntegralComplex:
6143 case CK_IntegralRealToComplex:
6144 case CK_IntegralComplexToReal:
6145 case CK_IntegralComplexToBoolean:
6146 case CK_IntegralComplexCast:
6147 case CK_IntegralComplexToFloatingComplex:
6148 case CK_DerivedToBaseMemberPointer:
6149 case CK_BaseToDerivedMemberPointer:
6150 case CK_MemberPointerToBoolean:
6151 case CK_ReinterpretMemberPointer:
6152 case CK_AnyPointerToBlockPointerCast:
6153 case CK_ARCProduceObject:
6154 case CK_ARCConsumeObject:
6155 case CK_ARCReclaimReturnedObject:
6156 case CK_ARCExtendBlockObject:
6157 case CK_CopyAndAutoreleaseBlockObject:
6158 case CK_IntToOCLSampler:
6159 case CK_FloatingToFixedPoint:
6160 case CK_FixedPointToFloating:
6161 case CK_FixedPointCast:
6162 case CK_FixedPointToBoolean:
6163 case CK_FixedPointToIntegral:
6164 case CK_IntegralToFixedPoint:
6166 case CK_HLSLVectorTruncation:
6167 case CK_HLSLMatrixTruncation:
6168 case CK_HLSLArrayRValue:
6169 case CK_HLSLElementwiseCast:
6170 case CK_HLSLAggregateSplatCast:
6174 llvm_unreachable(
"dependent cast kind in IR gen!");
6176 case CK_BuiltinFnToFnPtr:
6177 llvm_unreachable(
"builtin functions are handled elsewhere");
6180 case CK_NonAtomicToAtomic:
6181 case CK_AtomicToNonAtomic:
6191 case CK_ConstructorConversion:
6192 case CK_UserDefinedConversion:
6193 case CK_CPointerToObjCPointerCast:
6194 case CK_BlockPointerToObjCPointerCast:
6195 case CK_LValueToRValue:
6210 if (
V.getElementType() != T)
6217 case CK_UncheckedDerivedToBase:
6218 case CK_DerivedToBase: {
6232 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6236 case CK_BaseToDerived: {
6251 if (
SanOpts.has(SanitizerKind::CFIDerivedCast))
6257 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6259 case CK_LValueBitCast: {
6263 CGM.EmitExplicitCastExprType(CE,
this);
6268 if (
SanOpts.has(SanitizerKind::CFIUnrelatedCast))
6274 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6276 case CK_AddressSpaceConversion: {
6285 case CK_ObjCObjectLValueCast: {
6289 CGM.getTBAAInfoForSubobject(LV, E->
getType()));
6291 case CK_ZeroToOCLOpaqueType:
6292 llvm_unreachable(
"NULL to OpenCL opaque type lvalue cast is not valid");
6294 case CK_VectorSplat: {
6302 llvm_unreachable(
"Unhandled lvalue cast kind?");
6310std::pair<LValue, LValue>
6325 return std::make_pair(BaseLV, TempLV);
6333 llvm::Value *
Addr = TempLV.getAddress().getBasePointer();
6338 Address TmpAddr(
Addr, ElTy, TempLV.getAlignment());
6348 llvm::DenseMap<const OpaqueValueExpr*,LValue>::iterator
6349 it = OpaqueLValues.find(e);
6351 if (it != OpaqueLValues.end())
6354 assert(e->
isUnique() &&
"LValue for a nonunique OVE hasn't been emitted");
6362 llvm::DenseMap<const OpaqueValueExpr*,RValue>::iterator
6363 it = OpaqueRValues.find(e);
6365 if (it != OpaqueRValues.end())
6368 assert(e->
isUnique() &&
"RValue for a nonunique OVE hasn't been emitted");
6374 return OpaqueLValues.contains(E);
6375 return OpaqueRValues.contains(E);
6399 llvm_unreachable(
"bad evaluation kind");
6408 llvm::CallBase **CallOrInvoke) {
6409 llvm::CallBase *CallOrInvokeStorage;
6410 if (!CallOrInvoke) {
6411 CallOrInvoke = &CallOrInvokeStorage;
6414 llvm::scope_exit AddCoroElideSafeOnExit([&] {
6416 auto *I = *CallOrInvoke;
6418 I->addFnAttr(llvm::Attribute::CoroElideSafe);
6426 if (
const auto *CE = dyn_cast<CXXMemberCallExpr>(E))
6429 if (
const auto *CE = dyn_cast<CUDAKernelCallExpr>(E))
6434 if (
const auto *CE = dyn_cast<CXXOperatorCallExpr>(E))
6435 if (
const auto *MD =
6436 dyn_cast_if_present<CXXMethodDecl>(CE->getCalleeDecl());
6437 MD && MD->isImplicitObjectMemberFunction())
6452 nullptr, CallOrInvoke);
6458 llvm::CallBase **CallOrInvoke) {
6461 nullptr, CallOrInvoke);
6469 if (!PD->isInlineBuiltinDeclaration())
6478 std::string NoBuiltinFD = (
"no-builtin-" + FD->
getName()).str();
6479 std::string NoBuiltins =
"no-builtins";
6482 std::string FDInlineName = (Ident +
".inline").str();
6484 bool IsPredefinedLibFunction =
6486 bool HasAttributeNoBuiltin =
6487 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltinFD) ||
6488 CGF.
CurFn->getAttributes().hasFnAttr(NoBuiltins);
6492 if (CGF.
CurFn->getName() != FDInlineName &&
6495 llvm::Function *Fn = llvm::cast<llvm::Function>(CalleePtr);
6496 llvm::Module *M = Fn->getParent();
6497 llvm::Function *Clone = M->getFunction(FDInlineName);
6499 Clone = llvm::Function::Create(Fn->getFunctionType(),
6500 llvm::GlobalValue::InternalLinkage,
6501 Fn->getAddressSpace(), FDInlineName, M);
6502 Clone->addFnAttr(llvm::Attribute::AlwaysInline);
6513 else if (!IsPredefinedLibFunction || !HasAttributeNoBuiltin)
6519 FD->
hasAttr<CUDAGlobalAttr>())
6527 if (DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()))
6536 if (
auto ICE = dyn_cast<ImplicitCastExpr>(E)) {
6537 if (ICE->getCastKind() == CK_FunctionToPointerDecay ||
6538 ICE->getCastKind() == CK_BuiltinFnToFnPtr) {
6544 if (ICE->getCastKind() == CK_LValueToRValue) {
6545 const Expr *SubExpr = ICE->getSubExpr();
6547 std::pair<llvm::Value *, CGPointerAuthInfo>
Result =
6554 if (
const auto *VD =
6565 }
else if (
auto DRE = dyn_cast<DeclRefExpr>(E)) {
6566 if (
auto FD = dyn_cast<FunctionDecl>(DRE->getDecl())) {
6569 }
else if (
auto ME = dyn_cast<MemberExpr>(E)) {
6570 if (
auto FD = dyn_cast<FunctionDecl>(ME->getMemberDecl())) {
6576 }
else if (
auto NTTP = dyn_cast<SubstNonTypeTemplateParmExpr>(E)) {
6580 }
else if (
auto PDE = dyn_cast<CXXPseudoDestructorExpr>(E)) {
6585 llvm::Value *calleePtr;
6597 if (
const auto *VD =
6603 CGCallee callee(calleeInfo, calleePtr, pointerAuth);
6619 assert(E->
getOpcode() == BO_Assign &&
"unexpected binary l-value");
6682 llvm::Value *
Result =
nullptr;
6685 if (
SanOpts.has(SanitizerKind::ImplicitBitfieldConversion))
6700 CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*
this,
6717 llvm_unreachable(
"bad evaluation kind");
6729 if (
CGM.getHLSLRuntime().emitResourceArrayCopy(LHS, E->
getRHS(), *
this))
6740 llvm::CallBase **CallOrInvoke) {
6748 "Can't have a scalar return unless the return type is a "
6761 &&
"binding l-value to type which needs a temporary");
6799 "Can't have a scalar return unless the return type is a "
6813 return CGM.getObjCRuntime().EmitIvarOffset(*
this,
Interface, Ivar);
6821 return Builder.CreateZExtOrTrunc(OffsetValue,
6826 llvm::Value *BaseValue,
6828 unsigned CVRQualifiers) {
6829 return CGM.getObjCRuntime().EmitObjCValueForIvar(*
this, ObjectTy, BaseValue,
6830 Ivar, CVRQualifiers);
6835 llvm::Value *BaseValue =
nullptr;
6846 ObjectTy = BaseExpr->
getType();
6868 llvm::CallBase **CallOrInvoke,
6873 "Call must have function pointer type!");
6875 const Decl *TargetDecl =
6878 assert((!isa_and_present<FunctionDecl>(TargetDecl) ||
6880 "trying to emit a call to an immediate function");
6890 if (
SanOpts.has(SanitizerKind::Function) &&
6893 if (llvm::Constant *PrefixSig =
6894 CGM.getTargetCodeGenInfo().getUBSanFunctionSignature(
CGM)) {
6895 auto CheckOrdinal = SanitizerKind::SO_Function;
6896 auto CheckHandler = SanitizerHandler::FunctionTypeMismatch;
6900 llvm::Type *PrefixSigType = PrefixSig->getType();
6901 llvm::StructType *PrefixStructTy = llvm::StructType::get(
6902 CGM.getLLVMContext(), {PrefixSigType, Int32Ty},
true);
6904 llvm::Value *CalleePtr = Callee.getFunctionPointer();
6905 if (
CGM.getCodeGenOpts().PointerAuth.FunctionPointers) {
6908 Address(CalleePtr, CalleePtr->getType(),
6910 CalleePtr->getPointerAlignment(
CGM.getDataLayout())),
6911 Callee.getPointerAuthInfo(),
nullptr);
6912 CalleePtr =
Addr.emitRawPointer(*
this);
6924 llvm::Value *AlignedCalleePtr;
6925 if (
CGM.getTriple().isARM() ||
CGM.getTriple().isThumb()) {
6926 AlignedCalleePtr =
Builder.CreateIntrinsic(
6927 CalleePtr->getType(), llvm::Intrinsic::ptrmask,
6928 {CalleePtr, llvm::ConstantInt::getSigned(IntPtrTy, ~1)});
6930 AlignedCalleePtr = CalleePtr;
6933 llvm::Value *CalleePrefixStruct = AlignedCalleePtr;
6934 llvm::Value *CalleeSigPtr =
6935 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 0);
6936 llvm::Value *CalleeSig =
6938 llvm::Value *CalleeSigMatch =
Builder.CreateICmpEQ(CalleeSig, PrefixSig);
6942 Builder.CreateCondBr(CalleeSigMatch, TypeCheck, Cont);
6945 llvm::Value *CalleeTypeHash =
Builder.CreateAlignedLoad(
6947 Builder.CreateConstGEP2_32(PrefixStructTy, CalleePrefixStruct, -1, 1),
6949 llvm::Value *CalleeTypeHashMatch =
6950 Builder.CreateICmpEQ(CalleeTypeHash, TypeHash);
6953 EmitCheck(std::make_pair(CalleeTypeHashMatch, CheckOrdinal), CheckHandler,
6954 StaticData, {CalleePtr});
6963 if (
const auto *FD = dyn_cast_or_null<FunctionDecl>(TargetDecl);
6964 FD && DeviceKernelAttr::isOpenCLSpelling(FD->getAttr<DeviceKernelAttr>()))
6965 CGM.getTargetCodeGenInfo().setOCLKernelStubCallingConvention(FnType);
6969 if (
SanOpts.has(SanitizerKind::CFIICall) &&
6971 auto CheckOrdinal = SanitizerKind::SO_CFIICall;
6972 auto CheckHandler = SanitizerHandler::CFICheckFail;
6976 llvm::Metadata *MD =
6977 CGM.CreateMetadataIdentifierForFnType(
QualType(FnType, 0));
6979 llvm::Value *TypeId = llvm::MetadataAsValue::get(
getLLVMContext(), MD);
6981 llvm::Value *CalleePtr = Callee.getFunctionPointer();
6982 llvm::Value *TypeTest =
Builder.CreateCall(
6983 CGM.getIntrinsic(llvm::Intrinsic::type_test), {CalleePtr, TypeId});
6985 auto CrossDsoTypeId =
CGM.CreateCrossDsoCfiTypeId(MD);
6986 llvm::Constant *StaticData[] = {
6991 if (
CGM.getCodeGenOpts().SanitizeCfiCrossDso && CrossDsoTypeId) {
6995 EmitCheck(std::make_pair(TypeTest, CheckOrdinal), CheckHandler,
6996 StaticData, {CalleePtr, llvm::UndefValue::get(
IntPtrTy)});
7011 bool StaticOperator =
false;
7012 if (
auto *OCE = dyn_cast<CXXOperatorCallExpr>(E)) {
7013 if (OCE->isAssignmentOp())
7016 switch (OCE->getOperator()) {
7018 case OO_GreaterGreater:
7030 if (
const auto *MD =
7031 dyn_cast_if_present<CXXMethodDecl>(OCE->getCalleeDecl());
7032 MD && MD->isStatic())
7033 StaticOperator =
true;
7037 if (StaticOperator) {
7041 Arguments = drop_begin(Arguments, 1);
7043 EmitCallArgs(Args, dyn_cast<FunctionProtoType>(FnType), Arguments,
7047 Args, FnType, Chain);
7050 *ResolvedFnInfo = &FnInfo;
7055 if (
CGM.getLangOpts().HIP && !
CGM.getLangOpts().CUDAIsDevice &&
7058 llvm::Value *Handle = Callee.getFunctionPointer();
7060 Address(Handle, Handle->getType(),
CGM.getPointerAlign()));
7061 Callee.setFunctionPointer(
Stub);
7068 if (
getLangOpts().OpenMPIsTargetDevice &&
CGM.getTriple().isGPU() &&
7072 while (CalleeExpr) {
7073 if ((DRE = dyn_cast<DeclRefExpr>(CalleeExpr)))
7075 if (
const auto *ME = dyn_cast<MemberExpr>(CalleeExpr))
7077 else if (
const auto *ASE = dyn_cast<ArraySubscriptExpr>(CalleeExpr))
7083 const auto *VD = DRE ? dyn_cast<VarDecl>(DRE->
getDecl()) :
nullptr;
7084 if (VD && VD->hasAttr<OMPTargetIndirectCallAttr>()) {
7085 auto *PtrTy =
CGM.VoidPtrTy;
7086 llvm::Type *RtlFnArgs[] = {PtrTy};
7087 llvm::FunctionCallee DeviceRtlFn =
CGM.CreateRuntimeFunction(
7088 llvm::FunctionType::get(PtrTy, RtlFnArgs,
false),
7089 "__llvm_omp_indirect_call_lookup");
7090 llvm::Value *
Func = Callee.getFunctionPointer();
7091 llvm::Type *BackupTy =
Func->getType();
7095 Callee.setFunctionPointer(
Func);
7099 llvm::CallBase *LocalCallOrInvoke =
nullptr;
7103 if (
auto *CalleeDecl = dyn_cast_or_null<FunctionDecl>(TargetDecl)) {
7104 if (CalleeDecl->hasAttr<RestrictAttr>() ||
7105 CalleeDecl->hasAttr<MallocSpanAttr>() ||
7106 CalleeDecl->hasAttr<AllocSizeAttr>()) {
7108 if (
SanOpts.has(SanitizerKind::AllocToken)) {
7115 *CallOrInvoke = LocalCallOrInvoke;
7134 bool IsInBounds = !
getLangOpts().PointerOverflowDefined &&
7137 E, BaseAddr, OffsetV, MPT, IsInBounds, &BaseInfo, &TBAAInfo);
7139 return MakeAddrLValue(MemberAddr, MPT->getPointeeType(), BaseInfo, TBAAInfo);
7156 llvm_unreachable(
"bad evaluation kind");
7160 assert(Val->getType()->isFPOrFPVectorTy());
7165 llvm::MDNode *Node = MDHelper.createFPMath(Accuracy);
7171 llvm::Type *EltTy = Val->getType()->getScalarType();
7172 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7176 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7178 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7193 llvm::Type *EltTy = Val->getType()->getScalarType();
7194 if (!EltTy->isFloatTy() && !EltTy->isHalfTy())
7198 !
CGM.getCodeGenOpts().OpenCLCorrectlyRoundedDivSqrt) ||
7200 !
CGM.getCodeGenOpts().HIPCorrectlyRoundedDivSqrt)) {
7215 struct LValueOrRValue {
7229 LValueOrRValue result;
7233 const Expr *semantic = *i;
7237 if (
const auto *ov = dyn_cast<OpaqueValueExpr>(semantic)) {
7239 if (ov->isUnique()) {
7240 assert(ov != resultExpr &&
7241 "A unique OVE cannot be used as the result expression");
7249 if (ov == resultExpr && ov->
isPRValue() && !forLValue &&
7254 opaqueData = OVMA::bind(CGF, ov, LV);
7259 opaqueData = OVMA::bind(CGF, ov, ov->getSourceExpr());
7262 if (ov == resultExpr) {
7270 opaques.push_back(opaqueData);
7274 }
else if (semantic == resultExpr) {
7306 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7308 llvm::IntegerType *IdxTy = llvm::IntegerType::get(
getLLVMContext(), 32);
7309 WorkList.push_back({Val, Val.
getType(), {llvm::ConstantInt::get(IdxTy, 0)}});
7311 while (!WorkList.empty()) {
7312 auto [LVal, T, IdxList] = WorkList.pop_back_val();
7313 T = T.getCanonicalType().getUnqualifiedType();
7314 if (
const auto *CAT = dyn_cast<ConstantArrayType>(T)) {
7315 uint64_t Size = CAT->getZExtSize();
7316 for (int64_t I = Size - 1; I > -1; I--) {
7318 IdxListCopy.push_back(llvm::ConstantInt::get(IdxTy, I));
7319 WorkList.emplace_back(LVal, CAT->getElementType(), IdxListCopy);
7321 }
else if (
const auto *RT = dyn_cast<RecordType>(T)) {
7323 assert(!
Record->isUnion() &&
"Union types not supported in flat cast.");
7328 std::tuple<LValue, QualType, llvm::SmallVector<llvm::Value *, 4>>, 16>
7337 "HLSL doesn't support multiple inheritance.");
7340 IdxListCopy.push_back(llvm::ConstantInt::get(
7342 ReverseList.emplace_back(LVal,
Base->getType(), IdxListCopy);
7351 bool createdGEP =
false;
7352 for (
auto *FD :
Record->fields()) {
7353 if (FD->isBitField()) {
7354 if (FD->isUnnamedBitField())
7358 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7359 LLVMT, Align,
"gep");
7363 ReverseList.push_back({FieldLVal, FD->
getType(), {}});
7366 IdxListCopy.push_back(
7368 ReverseList.emplace_back(LVal, FD->getType(), IdxListCopy);
7372 std::reverse(ReverseList.begin(), ReverseList.end());
7373 llvm::append_range(WorkList, ReverseList);
7374 }
else if (
const auto *VT = dyn_cast<VectorType>(T)) {
7377 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7378 Align,
"vector.gep");
7380 for (
unsigned I = 0, E = VT->getNumElements(); I < E; I++) {
7381 llvm::Constant *Idx = llvm::ConstantInt::get(IdxTy, I);
7385 AccessList.emplace_back(LV);
7387 }
else if (
const auto *MT = dyn_cast<ConstantMatrixType>(T)) {
7395 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList, LLVMT,
7396 Align,
"matrix.gep");
7399 unsigned NumRows = MT->getNumRows();
7400 unsigned NumCols = MT->getNumColumns();
7401 bool IsMatrixRowMajor =
getLangOpts().getDefaultMatrixMemoryLayout() ==
7403 llvm::MatrixBuilder MB(
Builder);
7404 for (
unsigned Row = 0; Row < MT->getNumRows(); Row++) {
7405 for (
unsigned Col = 0; Col < MT->getNumColumns(); Col++) {
7406 llvm::Value *RowIdx = llvm::ConstantInt::get(IdxTy, Row);
7407 llvm::Value *ColIdx = llvm::ConstantInt::get(IdxTy, Col);
7408 llvm::Value *Idx = MB.CreateIndex(RowIdx, ColIdx, NumRows, NumCols,
7413 AccessList.emplace_back(LV);
7417 if (!IdxList.empty()) {
7420 Address GEP =
Builder.CreateInBoundsGEP(LVal.getAddress(), IdxList,
7421 LLVMT, Align,
"gep");
7424 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 llvm::Value * emitHashMix(CGBuilderTy &Builder, llvm::Value *Acc, llvm::Value *Ptr)
static const Expr * isSimpleArrayDecayOperand(const Expr *E)
isSimpleArrayDecayOperand - If the specified expr is a simple decay from an array to pointer,...
static bool getFieldOffsetInBits(CodeGenFunction &CGF, const RecordDecl *RD, const FieldDecl *Field, int64_t &Offset)
The offset of a field from the beginning of the record.
static bool hasBPFPreserveStaticOffset(const RecordDecl *D)
ConstantEmissionKind
Can we constant-emit a load of a reference to a variable of the given type?
static Address emitRawAddrOfFieldStorage(CodeGenFunction &CGF, Address base, const FieldDecl *field, bool IsInBounds)
Drill down to the storage of a field without walking into reference types, and without respect for po...
static bool isConstantEmittableObjectType(QualType type)
Given an object of the given canonical type, can we safely copy a value out of it based on its initia...
static LValue EmitCapturedFieldLValue(CodeGenFunction &CGF, const FieldDecl *FD, llvm::Value *ThisValue)
static std::optional< LValue > EmitLValueOrThrowExpression(CodeGenFunction &CGF, const Expr *Operand)
Emit the operand of a glvalue conditional operator.
static CheckRecoverableKind getRecoverableKind(SanitizerKind::SanitizerOrdinal Ordinal)
static llvm::Value * emitArraySubscriptGEP(CodeGenFunction &CGF, llvm::Type *elemType, llvm::Value *ptr, ArrayRef< llvm::Value * > indices, bool inbounds, bool signedIndices, SourceLocation loc, const llvm::Twine &name="arrayidx")
SmallVector< llvm::Value *, 8 > RecIndicesTy
static GlobalDecl getGlobalDeclForDirectCall(const FunctionDecl *FD)
static LValue EmitFunctionDeclLValue(CodeGenFunction &CGF, const Expr *E, GlobalDecl GD)
static RawAddress MaybeConvertMatrixAddress(RawAddress Addr, CodeGenFunction &CGF, bool IsVector=true)
static LValueOrRValue emitPseudoObjectExpr(CodeGenFunction &CGF, const PseudoObjectExpr *E, bool forLValue, AggValueSlot slot)
static Address wrapWithBPFPreserveStaticOffset(CodeGenFunction &CGF, Address &Addr)
static llvm::StringRef GetUBSanTrapForHandler(SanitizerHandler ID)
static llvm::Value * getArrayIndexingBound(CodeGenFunction &CGF, const Expr *Base, QualType &IndexedType, LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel)
If Base is known to point to the start of an array, return the length of that array.
static RValue EmitLoadOfMatrixLValue(LValue LV, SourceLocation Loc, CodeGenFunction &CGF)
static ConstantEmissionKind checkVarTypeForConstantEmission(QualType type)
static Address emitAddrOfZeroSizeField(CodeGenFunction &CGF, Address Base, const FieldDecl *Field, bool IsInBounds)
Get the address of a zero-sized field within a record.
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 bool getRangeForType(CodeGenFunction &CGF, QualType Ty, llvm::APInt &Min, llvm::APInt &End, bool StrictEnums, bool IsBool)
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 unsigned getCharWidth(tok::TokenKind kind, const TargetInfo &Target)
llvm::MachO::Record Record
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.
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.
RawAddress createBufferMatrixTempAddress(const LValue &LV, SourceLocation Loc, 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)
LValue getReferenceLValue(CodeGenFunction &CGF, const Expr *RefExpr) const
llvm::Constant * getValue() const
A non-RAII class containing all the information about a bound opaque value.
static bool shouldBindAsLValue(const Expr *expr)
static OpaqueValueMappingData bind(CodeGenFunction &CGF, const OpaqueValueExpr *ov, const Expr *e)
An RAII object to set (and then clear) a mapping for an OpaqueValueExpr.
static bool shouldBindAsLValue(const Expr *expr)
RAII object to set/unset CodeGenFunction::IsSanitizerScope.
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
LValue EmitMatrixSubscriptExpr(const MatrixSubscriptExpr *E)
LValue EmitCoawaitLValue(const CoawaitExpr *E)
llvm::Value * GetVTablePtr(Address This, llvm::Type *VTableTy, const CXXRecordDecl *VTableClass, VTableAuthMode AuthMode=VTableAuthMode::Authenticate)
GetVTablePtr - Return the Value of the vtable pointer member pointed to by This.
llvm::Value * EmitObjCConsumeObject(QualType T, llvm::Value *Ptr)
Produce the code for a CK_ARCConsumeObject.
void EmitBoundsCheckImpl(const Expr *ArrayExpr, QualType ArrayBaseType, llvm::Value *IndexVal, QualType IndexType, llvm::Value *BoundsVal, QualType BoundsType, bool Accessed)
LValue EmitLoadOfReferenceLValue(LValue RefLVal)
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount, Stmt::Likelihood LH=Stmt::LH_None, const Expr *ConditionalOp=nullptr, const VarDecl *ConditionalDecl=nullptr)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
RValue EmitObjCMessageExpr(const ObjCMessageExpr *E, ReturnValueSlot Return=ReturnValueSlot())
llvm::Value * emitBoolVecConversion(llvm::Value *SrcVec, unsigned NumElementsDst, const llvm::Twine &Name="")
void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)
LValue EmitCXXConstructLValue(const CXXConstructExpr *E)
llvm::Value * performAddrSpaceCast(llvm::Value *Src, llvm::Type *DestTy)
LValue EmitConditionalOperatorLValue(const AbstractConditionalOperator *E)
std::pair< LValue, llvm::Value * > EmitARCStoreAutoreleasing(const BinaryOperator *e)
ComplexPairTy EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
void SetDivFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
SanitizerSet SanOpts
Sanitizers enabled for this function.
@ UseSkipPath
Skip (false)
LValue EmitInitListLValue(const InitListExpr *E)
bool isUnderlyingBasePointerConstantNull(const Expr *E)
Check whether the underlying base pointer is a constant null.
void EmitARCInitWeak(Address addr, llvm::Value *value)
i8* @objc_initWeak(i8** addr, i8* value) Returns value.
LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E, bool Accessed=false)
Address LoadCXXThisAddress()
static bool ContainsLabel(const Stmt *S, bool IgnoreCaseStmts=false)
ContainsLabel - Return true if the statement contains a label in it.
LValue EmitObjCMessageExprLValue(const ObjCMessageExpr *E)
llvm::Value * GetCountedByFieldExprGEP(const Expr *Base, const FieldDecl *FD, const FieldDecl *CountDecl)
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)
EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...
const CastExpr * CurCast
If a cast expression is being visited, this holds the current cast's expression.
llvm::Type * ConvertType(QualType T)
Address EmitCXXUuidofExpr(const CXXUuidofExpr *E)
void EmitSanitizerStatReport(llvm::SanitizerStatKind SSK)
static Destroyer destroyARCWeak
CGCapturedStmtInfo * CapturedStmtInfo
RValue EmitCXXPseudoDestructorExpr(const CXXPseudoDestructorExpr *E)
ComplexPairTy EmitLoadOfComplex(LValue src, SourceLocation loc)
EmitLoadOfComplex - Load a complex number from the specified l-value.
bool inSuspendBlock() const
llvm::Value * EmitARCRetain(QualType type, llvm::Value *value)
Produce the code to do a retain.
llvm::Value * EmitPointerAuthQualify(PointerAuthQualifier Qualifier, llvm::Value *Pointer, QualType ValueType, Address StorageAddress, bool IsKnownNonNull)
CleanupKind getARCCleanupKind()
Retrieves the default cleanup kind for an ARC cleanup.
void EmitAggFinalDestCopy(QualType Type, AggValueSlot Dest, const LValue &Src, ExprValueKind SrcKind)
EmitAggFinalDestCopy - Emit copy of the specified aggregate into destination address.
Address GetAddressOfBaseClass(Address Value, const CXXRecordDecl *Derived, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd, bool NullCheckValue, SourceLocation Loc)
GetAddressOfBaseClass - This function will add the necessary delta to the load of 'this' and returns ...
LValue MakeNaturalAlignPointeeAddrLValue(llvm::Value *V, QualType T)
Given a value of type T* that may not be to a complete object, construct an l-value with the natural ...
void EmitStoreThroughExtVectorComponentLValue(RValue Src, LValue Dst)
RValue EmitBlockCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
LValue EmitObjCEncodeExprLValue(const ObjCEncodeExpr *E)
void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint=true)
LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E)
RValue convertTempToRValue(Address addr, QualType type, SourceLocation Loc)
Given the address of a temporary variable, produce an r-value of its type.
LValue EmitObjCIsaExpr(const ObjCIsaExpr *E)
void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, llvm::Value **Result=nullptr)
EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints as EmitStoreThroughLValue.
llvm::Constant * EmitCheckSourceLocation(SourceLocation Loc)
Emit a description of a source location in a format suitable for passing to a runtime sanitizer handl...
LValue EmitCXXUuidofLValue(const CXXUuidofExpr *E)
llvm::Value * EmitScalarPrePostIncDec(const UnaryOperator *E, LValue LV, bool isInc, bool isPre)
void SetSqrtFPAccuracy(llvm::Value *Val)
Set the minimum required accuracy of the given sqrt operation based on CodeGenOpts.
RValue EmitSimpleCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
Emit a CallExpr without considering whether it might be a subclass.
static bool isNullPointerAllowed(TypeCheckKind TCK)
Determine whether the pointer type check TCK permits null pointers.
RValue EmitPseudoObjectRValue(const PseudoObjectExpr *e, AggValueSlot slot=AggValueSlot::ignored())
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
void addInstToCurrentSourceAtom(llvm::Instruction *KeyInstruction, llvm::Value *Backup)
See CGDebugInfo::addInstToCurrentSourceAtom.
unsigned getDebugInfoFIndex(const RecordDecl *Rec, unsigned FieldIndex)
Get the record field index as represented in debug info.
const LangOptions & getLangOpts() const
void EmitCfiCheckFail()
Emit a cross-DSO CFI failure handling function.
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
llvm::Value * EmitARCStoreStrong(LValue lvalue, llvm::Value *value, bool resultIgnored)
Store into a strong object.
LValue MakeNaturalAlignAddrLValue(llvm::Value *V, QualType T, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *E)
LValue EmitLValueForIvar(QualType ObjectTy, llvm::Value *Base, const ObjCIvarDecl *Ivar, unsigned CVRQualifiers)
Address GetAddressOfDerivedClass(Address Value, const CXXRecordDecl *Derived, CastExpr::path_const_iterator PathBegin, CastExpr::path_const_iterator PathEnd, bool NullCheckValue)
void EmitIgnoredConditionalOperator(const AbstractConditionalOperator *E)
void EmitCountedByBoundsChecking(const Expr *ArrayExpr, QualType ArrayType, Address ArrayInst, QualType IndexType, llvm::Value *IndexVal, bool Accessed, bool FlexibleArray)
EmitCountedByBoundsChecking - If the array being accessed has a "counted_by" attribute,...
Address EmitFieldAnnotations(const FieldDecl *D, Address V)
Emit field annotations for the given field & value.
void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
pushDestroy - Push the standard destructor for the given type as at least a normal cleanup.
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
void EmitNullabilityCheck(LValue LHS, llvm::Value *RHS, SourceLocation Loc)
Given an assignment *LHS = RHS, emit a test that checks if RHS is nonnull, if LHS is marked _Nonnull.
llvm::Value * EmitPointerAuthUnqualify(PointerAuthQualifier Qualifier, llvm::Value *Pointer, QualType PointerType, Address StorageAddress, bool IsKnownNonNull)
void EmitDeclRefExprDbgValue(const DeclRefExpr *E, const APValue &Init)
Address makeNaturalAddressForPointer(llvm::Value *Ptr, QualType T, CharUnits Alignment=CharUnits::Zero(), bool ForPointeeType=false, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
Construct an address with the natural alignment of T.
static Destroyer destroyCXXObject
Address EmitLoadOfPointer(Address Ptr, const PointerType *PtrTy, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Load a pointer with type PtrTy stored at address Ptr.
RValue EmitLoadOfGlobalRegLValue(LValue LV)
Load of global named registers are always calls to intrinsics.
void EmitVTablePtrCheckForCast(QualType T, Address Derived, bool MayBeNull, CFITypeCheckKind TCK, SourceLocation Loc)
Derived is the presumed address of an object of type T after a cast.
TypeCheckKind
Situations in which we might emit a check for the suitability of a pointer or glvalue.
@ TCK_DowncastPointer
Checking the operand of a static_cast to a derived pointer type.
@ TCK_DowncastReference
Checking the operand of a static_cast to a derived reference type.
@ TCK_MemberAccess
Checking the object expression in a non-static data member access.
@ TCK_Store
Checking the destination of a store. Must be suitably sized and aligned.
@ TCK_UpcastToVirtualBase
Checking the operand of a cast to a virtual base object.
@ TCK_MemberCall
Checking the 'this' pointer for a call to a non-static member function.
@ TCK_DynamicOperation
Checking the operand of a dynamic_cast or a typeid expression.
@ TCK_ReferenceBinding
Checking the bound value in a reference binding.
@ TCK_Upcast
Checking the operand of a cast to a base object.
LValue EmitBinaryOperatorLValue(const BinaryOperator *E)
bool InNoMergeAttributedStmt
True if the current statement has nomerge attribute.
LValue EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E)
const Decl * CurCodeDecl
CurCodeDecl - This is the inner-most code context, which includes blocks.
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
llvm::AssertingVH< llvm::Instruction > AllocaInsertPt
AllocaInsertPoint - This is an instruction in the entry block before which we prefer to insert alloca...
void maybeAttachRangeForLoad(llvm::LoadInst *Load, QualType Ty, SourceLocation Loc)
void EmitBitfieldConversionCheck(llvm::Value *Src, QualType SrcType, llvm::Value *Dst, QualType DstType, const CGBitFieldInfo &Info, SourceLocation Loc)
Emit a check that an [implicit] conversion of a bitfield.
LValue EmitPseudoObjectLValue(const PseudoObjectExpr *e)
llvm::Constant * EmitCheckTypeDescriptor(QualType T)
Emit a description of a type in a format suitable for passing to a runtime sanitizer handler.
LValue EmitOpaqueValueLValue(const OpaqueValueExpr *e)
llvm::Value * LoadPassedObjectSize(const Expr *E, QualType EltTy)
If E references a parameter with pass_object_size info or a constant array size modifier,...
@ ForceLeftToRight
! Language semantics require left-to-right evaluation.
@ Default
! No language constraints on evaluation order.
@ ForceRightToLeft
! Language semantics require right-to-left evaluation.
llvm::Value * EmitIvarOffsetAsPointerDiff(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
RValue EmitCUDAKernelCallExpr(const CUDAKernelCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
RValue EmitLoadOfAnyValue(LValue V, AggValueSlot Slot=AggValueSlot::ignored(), SourceLocation Loc={})
Like EmitLoadOfLValue but also handles complex and aggregate types.
LValue EmitLValueForField(LValue Base, const FieldDecl *Field, bool IsInBounds=true)
RawAddress CreateDefaultAlignTempAlloca(llvm::Type *Ty, const Twine &Name="tmp")
CreateDefaultAlignedTempAlloca - This creates an alloca with the default ABI alignment of the given L...
const TargetInfo & getTarget() const
LValue EmitCompoundAssignmentLValue(const CompoundAssignOperator *E)
bool isInConditionalBranch() const
isInConditionalBranch - Return true if we're currently emitting one branch or the other of a conditio...
Address EmitCXXMemberDataPointerAddress(const Expr *E, Address base, llvm::Value *memberPtr, const MemberPointerType *memberPtrType, bool IsInBounds, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
Emit the address of a field using a member data pointer.
LValue EmitHLSLOutArgExpr(const HLSLOutArgExpr *E, CallArgList &Args, QualType Ty)
static bool isVptrCheckRequired(TypeCheckKind TCK, QualType Ty)
Determine whether the pointer type check TCK requires a vptr check.
CGCallee EmitCallee(const Expr *E)
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
RValue EmitCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue=ReturnValueSlot(), llvm::CallBase **CallOrInvoke=nullptr)
RValue EmitLoadOfLValue(LValue V, SourceLocation Loc)
EmitLoadOfLValue - Given an expression that represents a value lvalue, this method emits the address ...
LValue EmitMatrixSingleSubscriptExpr(const MatrixSingleSubscriptExpr *E)
LValue EmitArraySectionExpr(const ArraySectionExpr *E, bool IsLowerBound=true)
Address GetAddrOfBlockDecl(const VarDecl *var)
llvm::Value * EmitComplexToScalarConversion(ComplexPairTy Src, QualType SrcTy, QualType DstTy, SourceLocation Loc)
Emit a conversion from the specified complex type to the specified destination type,...
void pushCleanupAfterFullExpr(CleanupKind Kind, As... A)
Queue a cleanup to be pushed after finishing the current full-expression, potentially with an active ...
void EmitCfiCheckStub()
Emit a stub for the cross-DSO CFI check function.
RawAddress CreateIRTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateIRTempWithoutCast - Create a temporary IR object of the given type, with appropriate alignment.
void pushFullExprCleanup(CleanupKind kind, As... A)
pushFullExprCleanup - Push a cleanup to be run at the end of the current full-expression.
static Destroyer destroyARCStrongImprecise
void StartFunction(GlobalDecl GD, QualType RetTy, llvm::Function *Fn, const CGFunctionInfo &FnInfo, const FunctionArgList &Args, SourceLocation Loc=SourceLocation(), SourceLocation StartLoc=SourceLocation())
Emit code for the start of a function.
LValue EmitAggExprToLValue(const Expr *E)
EmitAggExprToLValue - Emit the computation of the specified expression of aggregate type into a tempo...
void SetFPAccuracy(llvm::Value *Val, float Accuracy)
SetFPAccuracy - Set the minimum required accuracy of the given floating point operation,...
Address mergeAddressesInConditionalExpr(Address LHS, Address RHS, llvm::BasicBlock *LHSBlock, llvm::BasicBlock *RHSBlock, llvm::BasicBlock *MergeBlock, QualType MergedType)
Address emitAddrOfImagComponent(Address complex, QualType complexType)
void EmitBoundsCheck(const Expr *ArrayExpr, const Expr *ArrayExprBase, llvm::Value *Index, QualType IndexType, bool Accessed)
Emit a check that Base points into an array object, which we can access at index Index.
llvm::Value * EvaluateExprAsBool(const Expr *E)
EvaluateExprAsBool - Perform the usual unary conversions on the specified expression and compare the ...
LValue EmitPredefinedLValue(const PredefinedExpr *E)
void EmitCheck(ArrayRef< std::pair< llvm::Value *, SanitizerKind::SanitizerOrdinal > > Checked, SanitizerHandler Check, ArrayRef< llvm::Constant * > StaticArgs, ArrayRef< llvm::Value * > DynamicArgs, const TrapReason *TR=nullptr)
Create a basic block that will either trap or call a handler function in the UBSan runtime with the p...
LValue EmitDeclRefLValue(const DeclRefExpr *E)
LValue EmitStringLiteralLValue(const StringLiteral *E)
AggValueSlot CreateAggTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateAggTemp - Create a temporary memory object for the given aggregate type.
RValue getOrCreateOpaqueRValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its RValue mapping if it exists, otherwise create one.
RValue EmitAtomicLoad(LValue LV, SourceLocation SL, AggValueSlot Slot=AggValueSlot::ignored())
CGDebugInfo * getDebugInfo()
llvm::Value * emitScalarConstant(const ConstantEmission &Constant, Expr *E)
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
bool EmitLifetimeStart(llvm::Value *Addr)
Emit a lifetime.begin marker if some criteria are satisfied.
LValue EmitUnsupportedLValue(const Expr *E, const char *Name)
EmitUnsupportedLValue - Emit a dummy l-value using the type of E and issue an ErrorUnsupported style ...
LValue MakeRawAddrLValue(llvm::Value *V, QualType T, CharUnits Alignment, AlignmentSource Source=AlignmentSource::Type)
Same as MakeAddrLValue above except that the pointer is known to be unsigned.
llvm::MDNode * buildAllocToken(QualType AllocType)
Build metadata used by the AllocToken instrumentation.
RValue EmitCXXMemberCallExpr(const CXXMemberCallExpr *E, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke=nullptr)
LValue EmitLValueForFieldInitialization(LValue Base, const FieldDecl *Field)
EmitLValueForFieldInitialization - Like EmitLValueForField, except that if the Field is a reference,...
llvm::Value * EmitToMemory(llvm::Value *Value, QualType Ty)
EmitToMemory - Change a scalar value from its value representation to its in-memory representation.
Address emitBlockByrefAddress(Address baseAddr, const VarDecl *V, bool followForward=true)
BuildBlockByrefAddress - Computes the location of the data in a variable which is declared as __block...
llvm::AllocaInst * CreateTempAlloca(llvm::Type *Ty, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates an alloca and inserts it into the entry block if ArraySize is nullptr...
LValue getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its LValue mapping if it exists, otherwise create one.
bool EmitScalarRangeCheck(llvm::Value *Value, QualType Ty, SourceLocation Loc)
Check if the scalar Value is within the valid range for the given type Ty.
ComplexPairTy EmitComplexExpr(const Expr *E, bool IgnoreReal=false, bool IgnoreImag=false)
EmitComplexExpr - Emit the computation of the specified expression of complex type,...
RValue EmitCall(const CGFunctionInfo &CallInfo, const CGCallee &Callee, ReturnValueSlot ReturnValue, const CallArgList &Args, llvm::CallBase **CallOrInvoke, bool IsMustTail, SourceLocation Loc, bool IsVirtualFunctionPointerThunk=false)
EmitCall - Generate a call of the given function, expecting the given result type,...
llvm::ConstantInt * getUBSanFunctionTypeHash(QualType T) const
Return a type hash constant for a function instrumented by -fsanitize=function.
LValue EmitHLSLArrayAssignLValue(const BinaryOperator *E)
RawAddress CreateMemTempWithoutCast(QualType T, const Twine &Name="tmp")
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen without...
LValue EmitVAArgExprLValue(const VAArgExpr *E)
bool IsInPreservedAIRegion
True if CodeGen currently emits code inside presereved access index region.
RValue EmitAnyExprToTemp(const Expr *E)
EmitAnyExprToTemp - Similarly to EmitAnyExpr(), however, the result will always be accessible even if...
VlaSizePair getVLASize(const VariableArrayType *vla)
Returns an LLVM value that corresponds to the size, in non-variably-sized elements,...
LValue EmitStmtExprLValue(const StmtExpr *E)
llvm::Value * EmitARCLoadWeakRetained(Address addr)
i8* @objc_loadWeakRetained(i8** addr)
llvm::CallInst * EmitNounwindRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
ASTContext & getContext() const
RawAddress CreateTempAllocaWithoutCast(llvm::Type *Ty, CharUnits align, const Twine &Name="tmp", llvm::Value *ArraySize=nullptr)
CreateTempAlloca - This creates a alloca and inserts it into the entry block.
llvm::Value * EmitWithOriginalRHSBitfieldAssignment(const BinaryOperator *E, llvm::Value **Previous, QualType *SrcType)
Retrieve the implicit cast expression of the rhs in a binary operator expression by passing pointers ...
llvm::Value * EmitLoadOfScalar(Address Addr, bool Volatile, QualType Ty, SourceLocation Loc, AlignmentSource Source=AlignmentSource::Type, bool isNontemporal=false)
EmitLoadOfScalar - Load a scalar value from an address, taking care to appropriately convert from the...
void Destroyer(CodeGenFunction &CGF, Address addr, QualType ty)
void EmitStoreOfComplex(ComplexPairTy V, LValue dest, bool isInit)
EmitStoreOfComplex - Store a complex number into the specified l-value.
LValue EmitObjCIvarRefLValue(const ObjCIvarRefExpr *E)
Address EmitAddressOfPFPField(Address RecordPtr, const PFPField &Field)
void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false)
EmitStoreThroughLValue - Store the specified rvalue into the specified lvalue, where both are guarant...
Address EmitArrayToPointerDecay(const Expr *Array, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
RValue EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, const CallExpr *E, ReturnValueSlot ReturnValue)
RValue GetUndefRValue(QualType Ty)
GetUndefRValue - Get an appropriate 'undef' rvalue for the given type.
llvm::Instruction * getPostAllocaInsertPoint()
Return PostAllocaInsertPt.
void EmitAllocToken(llvm::CallBase *CB, QualType AllocType)
Emit and set additional metadata used by the AllocToken instrumentation.
LValue EmitComplexAssignmentLValue(const BinaryOperator *E)
Emit an l-value for an assignment (simple or compound) of complex type.
LValue EmitCastLValue(const CastExpr *E)
EmitCastLValue - Casts are never lvalues unless that cast is to a reference type.
llvm::Value * EmitPointerArithmetic(const BinaryOperator *BO, Expr *pointerOperand, llvm::Value *pointer, Expr *indexOperand, llvm::Value *index, bool isSubtraction)
Emit pointer + index arithmetic.
LValue EmitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *E)
LValue EmitLoadOfPointerLValue(Address Ptr, const PointerType *PtrTy)
llvm::Value * EmitCheckValue(llvm::Value *V)
Convert a value into a format suitable for passing to a runtime sanitizer handler.
void EmitAnyExprToMem(const Expr *E, Address Location, Qualifiers Quals, bool IsInitializer)
EmitAnyExprToMem - Emits the code necessary to evaluate an arbitrary expression into the given memory...
RValue EmitAnyExpr(const Expr *E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
EmitAnyExpr - Emit code to compute the specified expression which can have any type.
LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E)
llvm::DenseMap< const ValueDecl *, FieldDecl * > LambdaCaptureFields
RValue EmitUnsupportedRValue(const Expr *E, const char *Name)
EmitUnsupportedRValue - Emit a dummy r-value using the type of E and issue an ErrorUnsupported style ...
CleanupKind getCleanupKind(QualType::DestructionKind kind)
llvm::CallInst * EmitRuntimeCall(llvm::FunctionCallee callee, const Twine &name="")
std::pair< LValue, LValue > EmitHLSLOutArgLValues(const HLSLOutArgExpr *E, QualType Ty)
LValue EmitObjCSelectorLValue(const ObjCSelectorExpr *E)
llvm::Type * ConvertTypeForMem(QualType T)
LValue EmitCallExprLValue(const CallExpr *E, llvm::CallBase **CallOrInvoke=nullptr)
RValue EmitLoadOfBitfieldLValue(LValue LV, SourceLocation Loc)
llvm::Value * EmitARCLoadWeak(Address addr)
i8* @objc_loadWeak(i8** addr) Essentially objc_autorelease(objc_loadWeakRetained(addr)).
LValue EmitLValueForLambdaField(const FieldDecl *Field)
void markStmtMaybeUsed(const Stmt *S)
CodeGenTypes & getTypes() const
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
llvm::Value * EmitIvarOffset(const ObjCInterfaceDecl *Interface, const ObjCIvarDecl *Ivar)
bool IsSanitizerScope
True if CodeGen currently emits code implementing sanitizer checks.
void FlattenAccessAndTypeLValue(LValue LVal, SmallVectorImpl< LValue > &AccessList)
LValue EmitCoyieldLValue(const CoyieldExpr *E)
void EmitTypeCheck(TypeCheckKind TCK, SourceLocation Loc, LValue LV, QualType Type, SanitizerSet SkippedChecks=SanitizerSet(), llvm::Value *ArraySize=nullptr)
void EmitCfiSlowPathCheck(SanitizerKind::SanitizerOrdinal Ordinal, llvm::Value *Cond, llvm::ConstantInt *TypeId, llvm::Value *Ptr, ArrayRef< llvm::Constant * > StaticArgs)
Emit a slow path cross-DSO CFI check which calls __cfi_slowpath if Cond if false.
llvm::SmallVector< const ParmVarDecl *, 4 > FnArgs
Save Parameter Decl for coroutine.
void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType, Address Ptr)
Emits all the code to cause the given temporary to be cleaned up.
llvm::Value * authPointerToPointerCast(llvm::Value *ResultPtr, QualType SourceType, QualType DestType)
LValue EmitUnaryOpLValue(const UnaryOperator *E)
Address EmitPointerWithAlignment(const Expr *Addr, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitPointerWithAlignment - Given an expression with a pointer type, emit the value and compute our be...
bool LValueIsSuitableForInlineAtomic(LValue Src)
An LValue is a candidate for having its loads and stores be made atomic if we are operating under /vo...
LValue EmitCheckedLValue(const Expr *E, TypeCheckKind TCK)
Same as EmitLValue but additionally we generate checking code to guard against undefined behavior.
RawAddress CreateMemTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateMemTemp - Create a temporary memory object of the given type, with appropriate alignmen and cas...
Address EmitLoadOfReference(LValue RefLVal, LValueBaseInfo *PointeeBaseInfo=nullptr, TBAAAccessInfo *PointeeTBAAInfo=nullptr)
RValue EmitRValueForField(LValue LV, const FieldDecl *FD, SourceLocation Loc)
llvm::Value * EmitObjCExtendObjectLifetime(QualType T, llvm::Value *Ptr)
LValue EmitCXXBindTemporaryLValue(const CXXBindTemporaryExpr *E)
llvm::Type * convertTypeForLoadStore(QualType ASTTy, llvm::Type *LLVMTy=nullptr)
bool sanitizePerformTypeCheck() const
Whether any type-checking sanitizers are enabled.
Address EmitExtVectorElementLValue(LValue V)
Generates lvalue for partial ext_vector access.
llvm::Value * EmitCheckedInBoundsGEP(llvm::Type *ElemTy, llvm::Value *Ptr, ArrayRef< llvm::Value * > IdxList, bool SignedIndices, bool IsSubtraction, SourceLocation Loc, const Twine &Name="")
Same as IRBuilder::CreateInBoundsGEP, but additionally emits a check to detect undefined behavior whe...
void EmitInitializationToLValue(const Expr *E, LValue LV, AggValueSlot::IsZeroed_t IsZeroed=AggValueSlot::IsNotZeroed)
EmitInitializationToLValue - Emit an initializer to an LValue.
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
Address emitAddrOfRealComponent(Address complex, QualType complexType)
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
RValue EmitLoadOfExtVectorElementLValue(LValue V)
static bool hasAggregateEvaluationKind(QualType T)
static bool IsWrappedCXXThis(const Expr *E)
Check if E is a C++ "this" pointer wrapped in value-preserving casts.
void EmitCallArgs(CallArgList &Args, PrototypeWrapper Prototype, llvm::iterator_range< CallExpr::const_arg_iterator > ArgRange, AbstractCallee AC=AbstractCallee(), unsigned ParamsToSkip=0, EvaluationOrder Order=EvaluationOrder::Default)
EmitCallArgs - Emit call arguments for a function.
llvm::Value * EmitMatrixIndexExpr(const Expr *E)
llvm::CallInst * EmitTrapCall(llvm::Intrinsic::ID IntrID)
Emit a call to trap or debugtrap and attach function attribute "trap-func-name" if specified.
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitTrapCheck(llvm::Value *Checked, SanitizerHandler CheckHandlerID, bool NoMerge=false, const TrapReason *TR=nullptr)
Create a basic block that will call the trap intrinsic, and emit a conditional branch to it,...
void FinishFunction(SourceLocation EndLoc=SourceLocation())
FinishFunction - Complete IR generation of the current function.
void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit)
llvm::Value * EmitFromMemory(llvm::Value *Value, QualType Ty)
EmitFromMemory - Change a scalar value from its memory representation to its value representation.
const CallExpr * MustTailCall
uint64_t getProfileCount(const Stmt *S)
Get the profiler's count for the given statement.
llvm::Value * EmitLoadOfCountedByField(const Expr *Base, const FieldDecl *FD, const FieldDecl *CountDecl)
Build an expression accessing the "counted_by" field.
Address GetAddrOfLocalVar(const VarDecl *VD)
GetAddrOfLocalVar - Return the address of a local variable.
void EmitUnreachable(SourceLocation Loc)
Emit a reached-unreachable diagnostic if Loc is valid and runtime checking is enabled.
bool ConstantFoldsToSimpleInteger(const Expr *Cond, bool &Result, bool AllowLabels=false)
ConstantFoldsToSimpleInteger - If the specified expression does not fold to a constant,...
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
LValue EmitCXXTypeidLValue(const CXXTypeidExpr *E)
llvm::Function * generateDestroyHelper(Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray, const VarDecl *VD)
generateDestroyHelper - Generates a helper function which, when invoked, destroys the given object.
LValue EmitMemberExpr(const MemberExpr *E)
std::pair< llvm::Value *, llvm::Value * > ComplexPairTy
Address ReturnValue
ReturnValue - The temporary alloca to hold the return value.
ConstantEmission tryEmitAsConstant(const DeclRefExpr *RefExpr)
Try to emit a reference to the given value without producing it as an l-value.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
void EmitStoreThroughGlobalRegLValue(RValue Src, LValue Dst)
Store of global named registers are always calls to intrinsics.
bool isOpaqueValueEmitted(const OpaqueValueExpr *E)
isOpaqueValueEmitted - Return true if the opaque value expression has already been emitted.
std::pair< llvm::Value *, CGPointerAuthInfo > EmitOrigPointerRValue(const Expr *E)
Retrieve a pointer rvalue and its ptrauth info.
llvm::Value * EmitARCStoreWeak(Address addr, llvm::Value *value, bool ignored)
i8* @objc_storeWeak(i8** addr, i8* value) Returns value.
void EnsureInsertPoint()
EnsureInsertPoint - Ensure that an insertion point is defined so that emitted IR has a place to go.
llvm::LLVMContext & getLLVMContext()
RValue EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E, const CXXMethodDecl *MD, ReturnValueSlot ReturnValue, llvm::CallBase **CallOrInvoke)
static Destroyer destroyARCStrongPrecise
LValue EmitMatrixElementExpr(const MatrixElementExpr *E)
void incrementProfileCounter(const Stmt *S, llvm::Value *StepV=nullptr)
Increment the profiler's counter for the given statement by StepV.
static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts)
getAccessedFieldNo - Given an encoded value and a result number, return the input field number being ...
llvm::Value * EmitScalarConversion(llvm::Value *Src, QualType SrcTy, QualType DstTy, SourceLocation Loc)
Emit a conversion from the specified type to the specified destination type, both of which are LLVM s...
void EmitVariablyModifiedType(QualType Ty)
EmitVLASize - Capture all the sizes for the VLA expressions in the given variably-modified type and s...
static bool ShouldNullCheckClassCastValue(const CastExpr *Cast)
llvm::Value * EmitNonNullRValueCheck(RValue RV, QualType T)
Create a check that a scalar RValue is non-null.
void EmitStoreOfScalar(llvm::Value *Value, Address Addr, bool Volatile, QualType Ty, AlignmentSource Source=AlignmentSource::Type, bool isInit=false, bool isNontemporal=false)
EmitStoreOfScalar - Store a scalar value to an address, taking care to appropriately convert from the...
llvm::Value * EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE)
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
LValue MakeNaturalAlignRawAddrLValue(llvm::Value *V, QualType T)
llvm::Value * EmitCXXTypeidExpr(const CXXTypeidExpr *E)
This class organizes the cross-function state that is used while generating LLVM code.
void EmitExplicitCastExprType(const ExplicitCastExpr *E, CodeGenFunction *CGF=nullptr)
Emit type info if type of an expression is a variably modified type.
CGHLSLRuntime & getHLSLRuntime()
Return a reference to the configured HLSL runtime.
llvm::Module & getModule() const
llvm::FunctionCallee CreateRuntimeFunction(llvm::FunctionType *Ty, StringRef Name, llvm::AttributeList ExtraAttrs=llvm::AttributeList(), bool Local=false, bool AssumeConvergent=false)
Create or return a runtime function declaration with the specified type and name.
CGDebugInfo * getModuleDebugInfo()
llvm::Constant * performAddrSpaceCast(llvm::Constant *Src, llvm::Type *DestTy)
llvm::Constant * getRawFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return a function pointer for a reference to the given function.
llvm::FunctionCallee getAddrAndTypeOfCXXStructor(GlobalDecl GD, const CGFunctionInfo *FnInfo=nullptr, llvm::FunctionType *FnType=nullptr, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
llvm::Constant * GetAddrOfFunction(GlobalDecl GD, llvm::Type *Ty=nullptr, bool ForVTable=false, bool DontDefer=false, ForDefinition_t IsForDefinition=NotForDefinition)
Return the address of the given function.
llvm::Constant * getFunctionPointer(GlobalDecl GD, llvm::Type *Ty=nullptr)
Return the ABI-correct function pointer value for a reference to the given function.
const LangOptions & getLangOpts() const
CGCUDARuntime & getCUDARuntime()
Return a reference to the configured CUDA runtime.
CharUnits getNaturalTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr, bool forPointeeType=false)
CodeGenTypes & getTypes()
CGPointerAuthInfo getPointerAuthInfoForPointeeType(QualType type)
llvm::GlobalValue::LinkageTypes getLLVMLinkageVarDefinition(const VarDecl *VD)
Returns LLVM linkage for a declarator.
CGCXXABI & getCXXABI() const
ConstantAddress GetWeakRefReference(const ValueDecl *VD)
Get a reference to the target of VD.
CGOpenMPRuntime & getOpenMPRuntime()
Return a reference to the configured OpenMP runtime.
TBAAAccessInfo getTBAAAccessInfo(QualType AccessType)
getTBAAAccessInfo - Get TBAA information that describes an access to an object of the given type.
ASTContext & getContext() const
TBAAAccessInfo mergeTBAAInfoForCast(TBAAAccessInfo SourceInfo, TBAAAccessInfo TargetInfo)
mergeTBAAInfoForCast - Get merged TBAA information for the purposes of type casts.
llvm::Constant * GetAddrOfGlobalVar(const VarDecl *D, llvm::Type *Ty=nullptr, ForDefinition_t IsForDefinition=NotForDefinition)
Return the llvm::Constant for the address of the given global variable.
const CodeGenOptions & getCodeGenOpts() const
StringRef getMangledName(GlobalDecl GD)
CharUnits getNaturalPointeeTypeAlignment(QualType T, LValueBaseInfo *BaseInfo=nullptr, TBAAAccessInfo *TBAAInfo=nullptr)
llvm::LLVMContext & getLLVMContext()
llvm::Function * getIntrinsic(unsigned IID, ArrayRef< llvm::Type * > Tys={})
ConstantAddress GetAddrOfGlobalTemporary(const MaterializeTemporaryExpr *E, const Expr *Inner)
Returns a pointer to a global variable representing a temporary with static or thread storage duratio...
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
const CGRecordLayout & getCGRecordLayout(const RecordDecl *)
getCGRecordLayout - Return record layout info for the given record decl.
llvm::Type * ConvertTypeForMem(QualType T)
ConvertTypeForMem - Convert type T into a llvm::Type.
A specialization of Address that requires the address to be an LLVM Constant.
llvm::Constant * getPointer() const
llvm::Constant * emitAbstract(const Expr *E, QualType T)
Emit the result of the given expression as an abstract constant, asserting that it succeeded.
llvm::Constant * tryEmitConstantExpr(const ConstantExpr *CE)
FunctionArgList - Type for representing both the decl and type of parameters to a function.
AlignmentSource getAlignmentSource() const
LValue - This represents an lvalue references.
llvm::Value * getMatrixRowIdx() const
static LValue MakeMatrixRow(Address Addr, llvm::Value *RowIdx, QualType MatrixTy, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Expr * getBaseIvarExp() const
llvm::Constant * getExtVectorElts() const
static LValue MakeGlobalReg(llvm::Value *V, CharUnits alignment, QualType type)
llvm::Constant * getMatrixRowElts() const
bool isObjCStrong() const
bool isMatrixRowSwizzle() const
bool isGlobalObjCRef() const
bool isVolatileQualified() const
RValue asAggregateRValue() const
llvm::Value * getPointer(CodeGenFunction &CGF) const
llvm::Value * getMatrixIdx() const
llvm::Value * getGlobalReg() const
static LValue MakeAddr(Address Addr, QualType type, ASTContext &Context, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
const Qualifiers & getQuals() const
static LValue MakeExtVectorElt(Address Addr, llvm::Constant *Elts, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getAddress() const
unsigned getVRQualifiers() const
bool isExtVectorElt() const
llvm::Value * getVectorIdx() const
void setNontemporal(bool Value)
LValueBaseInfo getBaseInfo() const
void setARCPreciseLifetime(ARCPreciseLifetime_t value)
const CGBitFieldInfo & getBitFieldInfo() const
bool isThreadLocalRef() const
KnownNonNull_t isKnownNonNull() const
TBAAAccessInfo getTBAAInfo() const
void setNonGC(bool Value)
static LValue MakeMatrixRowSwizzle(Address MatAddr, llvm::Value *RowIdx, llvm::Constant *Cols, QualType MatrixTy, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getVectorAddress() const
bool isNontemporal() const
static LValue MakeBitfield(Address Addr, const CGBitFieldInfo &Info, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Create a new object to represent a bit-field access.
static LValue MakeVectorElt(Address vecAddress, llvm::Value *Idx, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
void setAddress(Address address)
Address getExtVectorAddress() const
static LValue MakeMatrixElt(Address matAddress, llvm::Value *Idx, QualType type, LValueBaseInfo BaseInfo, TBAAAccessInfo TBAAInfo)
Address getMatrixAddress() const
Address getBitFieldAddress() const
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
static RValue get(llvm::Value *V)
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
static RValue getComplex(llvm::Value *V1, llvm::Value *V2)
Address getAggregateAddress() const
getAggregateAddr() - Return the Value* of the address of the aggregate.
llvm::Value * getScalarVal() const
getScalarVal() - Return the Value* of this scalar value.
An abstract representation of an aligned address.
CharUnits getAlignment() const
Return the alignment of this pointer.
llvm::Type * getElementType() const
Return the type of the values stored in this address.
llvm::Value * getPointer() const
unsigned getAddressSpace() const
Return the address space that this address resides in.
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
StringRef getCategory() const
StringRef getMessage() const
Complex values, per C99 6.2.5p11.
QualType getElementType() const
CompoundLiteralExpr - [C99 6.5.2.5].
const Expr * getInitializer() const
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Represents a concrete matrix type with constant number of rows and columns.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
DeclContext * getLexicalParent()
getLexicalParent - Returns the containing lexical DeclContext.
RecordDecl * getOuterLexicalRecordContext()
Retrieve the outermost lexically enclosing record context.
A reference to a declared variable, function, enum, etc.
bool refersToEnclosingVariableOrCapture() const
Does this DeclRefExpr refer to an enclosing local or a captured variable?
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
SourceLocation getLocation() const
SourceLocation getLocation() const
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
DeclContext * getDeclContext()
const Expr * getBase() const
ExplicitCastExpr - An explicit cast written in the source code.
This represents one expression.
const Expr * skipRValueSubobjectAdjustments(SmallVectorImpl< const Expr * > &CommaLHS, SmallVectorImpl< SubobjectAdjustment > &Adjustments) const
Walk outwards from an expression we want to bind a reference to and find the expression whose lifetim...
Expr * IgnoreParenNoopCasts(const ASTContext &Ctx) LLVM_READONLY
Skip past any parentheses and casts which do not change the value (including ptr->int casts of the sa...
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool EvaluateAsLValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsLValue - Evaluate an expression to see if we can fold it to an lvalue with link time known ...
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
Decl * getReferencedDeclOfCallee()
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
bool isOBJCGCCandidate(ASTContext &Ctx) const
isOBJCGCCandidate - Return true if this expression may be used in a read/ write barrier.
ExtVectorElementExpr - This represents access to specific elements of a vector, and may occur on the ...
bool isArrow() const
isArrow - Return true if the base expression is a pointer to vector, return false if the base express...
void getEncodedElementAccess(SmallVectorImpl< uint32_t > &Elts) const
getEncodedElementAccess - Encode the elements accessed into an llvm aggregate Constant of ConstantInt...
ExtVectorType - Extended vector type.
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
const FieldDecl * findCountedByField() const
Find the FieldDecl specified in a FAM's "counted_by" attribute.
const Expr * getSubExpr() const
Represents a function declaration or definition.
unsigned getBuiltinID(bool ConsiderWrapperFunctions=false) const
Returns a value indicating whether this function corresponds to a builtin function.
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Represents a prototype with parameter type info, e.g.
FunctionType - C99 6.7.5.3 - Function Declarators.
GlobalDecl - represents a global declaration.
const Decl * getDecl() const
This class represents temporary values used to represent inout and out arguments in HLSL.
const OpaqueValueExpr * getCastedTemporary() const
const OpaqueValueExpr * getOpaqueArgLValue() const
bool isInOut() const
returns true if the parameter is inout and false if the parameter is out.
const Expr * getWritebackCast() const
const Expr * getArgLValue() const
Return the l-value expression that was written as the argument in source.
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 ...
SourceLocation getExprLoc() const LLVM_READONLY
MatrixSubscriptExpr - Matrix subscript expression for the MatrixType extension.
bool isIncomplete() const
QualType getElementType() const
Returns type of the elements being stored in the matrix.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
SourceLocation getExprLoc() const LLVM_READONLY
A pointer to member type per C++ 8.3.3 - Pointers to members.
bool isObjCBOOLType(QualType T) const
Returns true if.
This represents a decl that may have a name.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
A C++ nested-name-specifier augmented with source location information.
ObjCEncodeExpr, used for @encode in Objective-C.
Represents an ObjC class declaration.
ObjCIvarDecl - Represents an ObjC instance variable.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
const Expr * getBase() const
An expression that sends a message to the given Objective-C object or class.
const ObjCMethodDecl * getMethodDecl() const
QualType getReturnType() const
ObjCSelectorExpr used for @selector in Objective-C.
Selector getSelector() const
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
const Expr * getSubExpr() const
Pointer-authentication qualifiers.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
[C99 6.4.2.2] - A predefined identifier such as func.
StringRef getIdentKindName() const
PredefinedIdentKind getIdentKind() const
StringLiteral * getFunctionName()
Represents an unpacked "presumed" location which can be presented to the user.
unsigned getColumn() const
Return the presumed column number of this location.
const char * getFilename() const
Return the presumed filename of this location.
unsigned getLine() const
Return the presumed line number of this location.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
semantics_iterator semantics_end()
semantics_iterator semantics_begin()
const Expr *const * const_semantics_iterator
Expr * getResultExpr()
Return the result-bearing expression, or null if there is none.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
PointerAuthQualifier getPointerAuth() const
QualType withoutLocalFastQualifiers() const
bool isNull() const
Return true if this QualType doesn't point to a type yet.
LangAS getAddressSpace() const
Return the address space of this type.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
QualType withCVRQualifiers(unsigned CVR) const
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
bool isConstantStorage(const ASTContext &Ctx, bool ExcludeCtor, bool ExcludeDtor)
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void addCVRQualifiers(unsigned mask)
void addQualifiers(Qualifiers Q)
Add the qualifiers from the given set to this set.
void setAddressSpace(LangAS space)
PointerAuthQualifier getPointerAuth() const
ObjCLifetime getObjCLifetime() const
Represents a struct/union/class.
field_range fields() const
RecordDecl * getDefinition() const
Returns the RecordDecl that actually defines this struct/union/class.
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Scope - A scope is a transient data structure that is used while parsing the program.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
PresumedLoc getPresumedLoc(SourceLocation Loc, bool UseLineDirectives=true) const
Returns the "presumed" location of a SourceLocation specifies.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
StmtClass getStmtClass() const
SourceLocation getBeginLoc() const LLVM_READONLY
StringLiteral - This represents a string literal expression, e.g.
Exposes information about the current target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
virtual StringRef getABI() const
Get the ABI currently in use.
The base class of the type hierarchy.
bool isBlockPointerType() const
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
bool isPackedVectorBoolType(const ASTContext &ctx) const
bool hasAttr(attr::Kind AK) const
Determine whether this type had the specified attribute applied to it (looking through top-level type...
const ArrayType * castAsArrayTypeUnsafe() const
A variant of castAs<> for array type which silently discards qualifiers from the outermost type.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isFunctionPointerType() const
CXXRecordDecl * castAsCXXRecordDecl() const
bool isArithmeticType() const
bool isConstantMatrixType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isEnumeralType() const
bool isVariableArrayType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isExtVectorBoolType() const
bool isBitIntType() const
bool isConstantMatrixBoolType() const
bool isAnyComplexType() const
bool hasPointeeToCFIUncheckedCalleeFunctionType() const
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
bool isAtomicType() const
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
bool isObjectType() const
Determine whether this type is an object type.
bool isHLSLResourceRecord() const
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
bool isFunctionType() const
bool isObjCObjectPointerType() const
bool isVectorType() const
bool isAnyPointerType() const
bool isSubscriptableVectorType() const
const T * getAs() const
Member-template getAs<specific type>'.
const Type * getUnqualifiedDesugaredType() const
Return the specified type with any "sugar" removed from the type, removing any typedefs,...
bool isRecordType() const
bool isHLSLResourceRecordArray() const
bool hasBooleanRepresentation() const
Determine whether this type has a boolean representation – i.e., it is a boolean type,...
bool isCFIUncheckedCalleeFunctionType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
SourceLocation getExprLoc() const
Expr * getSubExpr() const
Represents a call to the builtin function __builtin_va_arg.
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Represents a variable declaration or definition.
TLSKind getTLSKind() const
VarDecl * getDefinition(ASTContext &)
Get the real (not just tentative) definition for this declaration.
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
@ TLS_Dynamic
TLS with a dynamic initializer.
@ TLS_None
Not a TLS variable.
Represents a C array with a specified size that is not an integer-constant-expression.
Represents a GCC generic vector type.
unsigned getNumElements() const
AlignmentSource
The source of the alignment of an l-value; an expression of confidence in the alignment actually matc...
@ Type
The l-value was considered opaque, so the alignment was determined from a type.
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
bool isEmptyFieldForLayout(const ASTContext &Context, const FieldDecl *FD)
isEmptyFieldForLayout - Return true iff the field is "empty", that is, either a zero-width bit-field ...
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
static AlignmentSource getFieldAlignmentSource(AlignmentSource Source)
Given that the base address has the given alignment source, what's our confidence in the alignment of...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< ArrayType > arrayType
const AstTypeMatcher< FunctionType > functionType
const internal::VariadicDynCastAllOfMatcher< Stmt, Expr > expr
Matches expressions.
std::optional< llvm::AllocTokenMetadata > getAllocTokenMetadata(QualType T, const ASTContext &Ctx)
Get the information required for construction of an allocation token ID.
QualType inferPossibleType(const CallExpr *E, const ASTContext &Ctx, const CastExpr *CastE)
Infer the possible allocated type from an allocation call expression.
The JSON file list parser is used to communicate input to InstallAPI.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
@ 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,...
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