25#include "llvm/IR/Constants.h"
26#include "llvm/IR/Function.h"
27#include "llvm/IR/GlobalVariable.h"
28#include "llvm/IR/Instruction.h"
29#include "llvm/IR/IntrinsicInst.h"
30#include "llvm/IR/Intrinsics.h"
32using namespace CodeGen;
43class AggExprEmitter :
public StmtVisitor<AggExprEmitter> {
64 void withReturnValueSlot(
const Expr *
E,
69 : CGF(cgf), Builder(CGF.Builder), Dest(Dest),
70 IsResultUnused(IsResultUnused) { }
79 void EmitAggLoadOfLValue(
const Expr *
E);
84 CodeGenFunction::ExprValueKind SrcValueKind =
85 CodeGenFunction::EVK_NonRValue);
90 void EmitArrayInit(
Address DestPtr, llvm::ArrayType *AType,
QualType ArrayQTy,
95 if (CGF.
getLangOpts().getGC() && TypeRequiresGCollection(
T))
100 bool TypeRequiresGCollection(
QualType T);
111 void VisitStmt(
Stmt *S) {
127 return Visit(
E->getReplacement());
136 llvm::TypeSize::getFixed(
142 return Visit(
E->getSubExpr());
146 void VisitDeclRefExpr(
DeclRefExpr *
E) { EmitAggLoadOfLValue(
E); }
147 void VisitMemberExpr(
MemberExpr *ME) { EmitAggLoadOfLValue(ME); }
152 EmitAggLoadOfLValue(
E);
155 EmitAggLoadOfLValue(
E);
163 void VisitPointerToDataMemberBinaryOperator(
const BinaryOperator *BO);
168 Visit(
E->getSemanticForm());
173 EmitAggLoadOfLValue(
E);
184 llvm::Value *outerBegin =
nullptr);
188 CodeGenFunction::CXXDefaultArgExprScope
Scope(CGF, DAE);
192 CodeGenFunction::CXXDefaultInitExprScope
Scope(CGF, DIE);
209 return EmitFinalDestCopy(
E->
getType(), LV);
213 bool NeedsDestruction =
216 if (NeedsDestruction)
219 if (NeedsDestruction)
235 EmitFinalDestCopy(
E->
getType(), Res);
238 Visit(
E->getSelectedExpr());
250void AggExprEmitter::EmitAggLoadOfLValue(
const Expr *
E) {
259 EmitFinalDestCopy(
E->
getType(), LV);
263bool AggExprEmitter::TypeRequiresGCollection(
QualType T) {
266 if (!RecordTy)
return false;
270 if (isa<CXXRecordDecl>(
Record) &&
271 (cast<CXXRecordDecl>(
Record)->hasNonTrivialCopyConstructor() ||
272 !cast<CXXRecordDecl>(
Record)->hasTrivialDestructor()))
279void AggExprEmitter::withReturnValueSlot(
282 bool RequiresDestruction =
292 (RequiresDestruction && Dest.
isIgnored());
298 llvm::Value *LifetimeSizePtr =
nullptr;
299 llvm::IntrinsicInst *LifetimeStartInst =
nullptr;
304 llvm::TypeSize
Size =
307 if (LifetimeSizePtr) {
309 cast<llvm::IntrinsicInst>(std::prev(Builder.GetInsertPoint()));
310 assert(LifetimeStartInst->getIntrinsicID() ==
311 llvm::Intrinsic::lifetime_start &&
312 "Last insertion wasn't a lifetime.start?");
329 EmitFinalDestCopy(
E->
getType(), Src);
331 if (!RequiresDestruction && LifetimeStartInst) {
342 assert(src.
isAggregate() &&
"value must be aggregate value!");
344 EmitFinalDestCopy(
type, srcLV, CodeGenFunction::EVK_RValue);
348void AggExprEmitter::EmitFinalDestCopy(
350 CodeGenFunction::ExprValueKind SrcValueKind) {
362 if (SrcValueKind == CodeGenFunction::EVK_RValue) {
383 EmitCopy(
type, Dest, srcAgg);
419 assert(Array.isSimple() &&
"initializer_list array not a simple lvalue");
420 Address ArrayPtr = Array.getAddress();
424 assert(
ArrayType &&
"std::initializer_list constructed from non-array");
428 assert(Field !=
Record->field_end() &&
431 "Expected std::initializer_list first field to be const E *");
440 assert(Field !=
Record->field_end() &&
441 "Expected std::initializer_list to have two fields");
451 assert(
Field->getType()->isPointerType() &&
454 "Expected std::initializer_list second field to be const E *");
455 llvm::Value *
Zero = llvm::ConstantInt::get(CGF.
PtrDiffTy, 0);
456 llvm::Value *IdxEnd[] = {
Zero,
Size };
457 llvm::Value *ArrayEnd = Builder.CreateInBoundsGEP(
463 assert(++Field ==
Record->field_end() &&
464 "Expected std::initializer_list to only have two fields");
473 if (isa<ImplicitValueInitExpr>(
E))
476 if (
auto *ILE = dyn_cast<InitListExpr>(
E)) {
477 if (ILE->getNumInits())
482 if (
auto *Cons = dyn_cast_or_null<CXXConstructExpr>(
E))
483 return Cons->getConstructor()->isDefaultConstructor() &&
484 Cons->getConstructor()->isTrivial();
492void AggExprEmitter::EmitArrayInit(
Address DestPtr, llvm::ArrayType *AType,
495 uint64_t NumInitElements = Args.size();
497 uint64_t NumArrayElements = AType->getNumElements();
498 for (
const auto *
Init : Args) {
499 if (
const auto *Embed = dyn_cast<EmbedExpr>(
Init->IgnoreParenImpCasts())) {
500 NumInitElements += Embed->getDataElementCount() - 1;
501 if (NumInitElements > NumArrayElements) {
502 NumInitElements = NumArrayElements;
508 assert(NumInitElements <= NumArrayElements);
520 if (NumInitElements * elementSize.
getQuantity() > 16 &&
528 if (llvm::Constant *
C =
529 Emitter.tryEmitForInitializer(ExprToVisit, AS, GVArrayQTy)) {
530 auto GV =
new llvm::GlobalVariable(
532 true, llvm::GlobalValue::PrivateLinkage,
C,
534 nullptr, llvm::GlobalVariable::NotThreadLocal,
539 Address GVAddr(GV, GV->getValueType(), Align);
540 EmitFinalDestCopy(ArrayQTy, CGF.
MakeAddrLValue(GVAddr, GVArrayQTy));
550 CodeGenFunction::CleanupDeactivationScope deactivation(CGF);
554 CodeGenFunction::AllocaTrackerRAII allocaTracker(CGF);
559 llvm::Instruction *dominatingIP =
560 Builder.CreateFlagLoad(llvm::ConstantInt::getNullValue(CGF.
Int8PtrTy));
562 "arrayinit.endOfInit");
563 Builder.CreateStore(begin, endOfInit);
568 .AddAuxAllocas(allocaTracker.Take());
574 llvm::Value *one = llvm::ConstantInt::get(CGF.
SizeTy, 1);
577 llvm::Value *element = begin;
578 if (ArrayIndex > 0) {
579 element = Builder.CreateInBoundsGEP(
580 llvmElementType, begin,
581 llvm::ConstantInt::get(CGF.
SizeTy, ArrayIndex),
"arrayinit.element");
587 Builder.CreateStore(element, endOfInit);
591 Address(element, llvmElementType, elementAlign), elementType);
592 EmitInitializationToLValue(
Init, elementLV);
596 unsigned ArrayIndex = 0;
598 for (uint64_t i = 0; i != NumInitElements; ++i) {
599 if (ArrayIndex >= NumInitElements)
601 if (
auto *EmbedS = dyn_cast<EmbedExpr>(Args[i]->IgnoreParenImpCasts())) {
602 EmbedS->doForEachDataElement(Emit, ArrayIndex);
604 Emit(Args[i], ArrayIndex);
615 if (NumInitElements != NumArrayElements &&
616 !(Dest.
isZeroed() && hasTrivialFiller &&
623 llvm::Value *element = begin;
624 if (NumInitElements) {
625 element = Builder.CreateInBoundsGEP(
626 llvmElementType, element,
627 llvm::ConstantInt::get(CGF.
SizeTy, NumInitElements),
629 if (endOfInit.
isValid()) Builder.CreateStore(element, endOfInit);
633 llvm::Value *end = Builder.CreateInBoundsGEP(
634 llvmElementType, begin,
635 llvm::ConstantInt::get(CGF.
SizeTy, NumArrayElements),
"arrayinit.end");
637 llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
642 llvm::PHINode *currentElement =
643 Builder.CreatePHI(element->getType(), 2,
"arrayinit.cur");
644 currentElement->addIncoming(element, entryBB);
653 CodeGenFunction::RunCleanupsScope CleanupsScope(CGF);
655 Address(currentElement, llvmElementType, elementAlign), elementType);
657 EmitInitializationToLValue(ArrayFiller, elementLV);
659 EmitNullInitializationToLValue(elementLV);
663 llvm::Value *nextElement = Builder.CreateInBoundsGEP(
664 llvmElementType, currentElement, one,
"arrayinit.next");
667 if (endOfInit.
isValid()) Builder.CreateStore(nextElement, endOfInit);
670 llvm::Value *done = Builder.CreateICmpEQ(nextElement, end,
673 Builder.CreateCondBr(done, endBB, bodyBB);
674 currentElement->addIncoming(nextElement, Builder.GetInsertBlock());
685 Visit(
E->getSubExpr());
702 EmitAggLoadOfLValue(
E);
728 if (
auto castE = dyn_cast<CastExpr>(op)) {
729 if (castE->getCastKind() == kind)
730 return castE->getSubExpr();
735void AggExprEmitter::VisitCastExpr(
CastExpr *
E) {
736 if (
const auto *ECE = dyn_cast<ExplicitCastExpr>(
E))
738 switch (
E->getCastKind()) {
741 assert(isa<CXXDynamicCastExpr>(
E) &&
"CK_Dynamic without a dynamic_cast?");
743 CodeGenFunction::TCK_Load);
766 EmitInitializationToLValue(
E->getSubExpr(),
771 case CK_LValueToRValueBitCast: {
781 llvm::Value *SizeVal = llvm::ConstantInt::get(
784 Builder.CreateMemCpy(DestAddress, SourceAddress, SizeVal);
788 case CK_DerivedToBase:
789 case CK_BaseToDerived:
790 case CK_UncheckedDerivedToBase: {
791 llvm_unreachable(
"cannot perform hierarchy conversion in EmitAggExpr: "
792 "should have been unpacked before we got here");
795 case CK_NonAtomicToAtomic:
796 case CK_AtomicToNonAtomic: {
797 bool isToAtomic = (
E->getCastKind() == CK_NonAtomicToAtomic);
802 if (isToAtomic) std::swap(
atomicType, valueType);
811 return Visit(
E->getSubExpr());
815 (isToAtomic ? CK_AtomicToNonAtomic : CK_NonAtomicToAtomic);
822 "peephole significantly changed types?");
860 return EmitFinalDestCopy(valueType, rvalue);
862 case CK_AddressSpaceConversion:
863 return Visit(
E->getSubExpr());
865 case CK_LValueToRValue:
875 Visit(
E->getSubExpr());
886 case CK_HLSLArrayRValue:
887 Visit(
E->getSubExpr());
891 case CK_UserDefinedConversion:
892 case CK_ConstructorConversion:
895 "Implicit cast types must be compatible");
896 Visit(
E->getSubExpr());
899 case CK_LValueBitCast:
900 llvm_unreachable(
"should not be emitting lvalue bitcast as rvalue");
904 case CK_ArrayToPointerDecay:
905 case CK_FunctionToPointerDecay:
906 case CK_NullToPointer:
907 case CK_NullToMemberPointer:
908 case CK_BaseToDerivedMemberPointer:
909 case CK_DerivedToBaseMemberPointer:
910 case CK_MemberPointerToBoolean:
911 case CK_ReinterpretMemberPointer:
912 case CK_IntegralToPointer:
913 case CK_PointerToIntegral:
914 case CK_PointerToBoolean:
917 case CK_IntegralCast:
918 case CK_BooleanToSignedIntegral:
919 case CK_IntegralToBoolean:
920 case CK_IntegralToFloating:
921 case CK_FloatingToIntegral:
922 case CK_FloatingToBoolean:
923 case CK_FloatingCast:
924 case CK_CPointerToObjCPointerCast:
925 case CK_BlockPointerToObjCPointerCast:
926 case CK_AnyPointerToBlockPointerCast:
927 case CK_ObjCObjectLValueCast:
928 case CK_FloatingRealToComplex:
929 case CK_FloatingComplexToReal:
930 case CK_FloatingComplexToBoolean:
931 case CK_FloatingComplexCast:
932 case CK_FloatingComplexToIntegralComplex:
933 case CK_IntegralRealToComplex:
934 case CK_IntegralComplexToReal:
935 case CK_IntegralComplexToBoolean:
936 case CK_IntegralComplexCast:
937 case CK_IntegralComplexToFloatingComplex:
938 case CK_ARCProduceObject:
939 case CK_ARCConsumeObject:
940 case CK_ARCReclaimReturnedObject:
941 case CK_ARCExtendBlockObject:
942 case CK_CopyAndAutoreleaseBlockObject:
943 case CK_BuiltinFnToFnPtr:
944 case CK_ZeroToOCLOpaqueType:
946 case CK_HLSLVectorTruncation:
948 case CK_IntToOCLSampler:
949 case CK_FloatingToFixedPoint:
950 case CK_FixedPointToFloating:
951 case CK_FixedPointCast:
952 case CK_FixedPointToBoolean:
953 case CK_FixedPointToIntegral:
954 case CK_IntegralToFixedPoint:
955 llvm_unreachable(
"cast kind invalid for aggregate types");
959void AggExprEmitter::VisitCallExpr(
const CallExpr *
E) {
960 if (
E->getCallReturnType(CGF.
getContext())->isReferenceType()) {
961 EmitAggLoadOfLValue(
E);
981void AggExprEmitter::VisitStmtExpr(
const StmtExpr *
E) {
982 CodeGenFunction::StmtExprEvaluation eval(CGF);
995 const char *NameSuffix =
"") {
998 ArgTy = CT->getElementType();
1002 "member pointers may only be compared for equality");
1004 CGF, LHS, RHS, MPT,
false);
1008 struct CmpInstInfo {
1010 llvm::CmpInst::Predicate FCmp;
1011 llvm::CmpInst::Predicate SCmp;
1012 llvm::CmpInst::Predicate UCmp;
1014 CmpInstInfo InstInfo = [&]() -> CmpInstInfo {
1015 using FI = llvm::FCmpInst;
1016 using II = llvm::ICmpInst;
1019 return {
"cmp.lt", FI::FCMP_OLT, II::ICMP_SLT, II::ICMP_ULT};
1021 return {
"cmp.gt", FI::FCMP_OGT, II::ICMP_SGT, II::ICMP_UGT};
1023 return {
"cmp.eq", FI::FCMP_OEQ, II::ICMP_EQ, II::ICMP_EQ};
1025 llvm_unreachable(
"Unrecognised CompareKind enum");
1029 return Builder.CreateFCmp(InstInfo.FCmp, LHS, RHS,
1030 llvm::Twine(InstInfo.Name) + NameSuffix);
1034 return Builder.CreateICmp(Inst, LHS, RHS,
1035 llvm::Twine(InstInfo.Name) + NameSuffix);
1038 llvm_unreachable(
"unsupported aggregate binary expression should have "
1039 "already been handled");
1043 using llvm::BasicBlock;
1044 using llvm::PHINode;
1051 "cannot copy non-trivially copyable aggregate");
1063 auto EmitOperand = [&](
Expr *
E) -> std::pair<Value *, Value *> {
1072 auto LHSValues = EmitOperand(
E->getLHS()),
1073 RHSValues = EmitOperand(
E->getRHS());
1077 K, IsComplex ?
".r" :
"");
1082 RHSValues.second, K,
".i");
1083 return Builder.CreateAnd(Cmp, CmpImag,
"and.eq");
1086 return Builder.getInt(VInfo->getIntValue());
1094 Builder.CreateSelect(EmitCmp(
CK_Less), EmitCmpRes(CmpInfo.
getLess()),
1096 Select = Builder.CreateSelect(EmitCmp(
CK_Equal),
1098 SelectOne,
"sel.eq");
1100 Value *SelectEq = Builder.CreateSelect(
1105 SelectEq,
"sel.gt");
1106 Select = Builder.CreateSelect(
1107 EmitCmp(
CK_Less), EmitCmpRes(CmpInfo.
getLess()), SelectGT,
"sel.lt");
1123 if (
E->getOpcode() == BO_PtrMemD ||
E->getOpcode() == BO_PtrMemI)
1124 VisitPointerToDataMemberBinaryOperator(
E);
1129void AggExprEmitter::VisitPointerToDataMemberBinaryOperator(
1132 EmitFinalDestCopy(
E->
getType(), LV);
1142 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(
E)) {
1143 const VarDecl *var = dyn_cast<VarDecl>(DRE->getDecl());
1144 return (var && var->hasAttr<BlocksAttr>());
1153 if (op->isAssignmentOp() || op->isPtrMemOp())
1157 if (op->getOpcode() == BO_Comma)
1165 = dyn_cast<AbstractConditionalOperator>(
E)) {
1171 = dyn_cast<OpaqueValueExpr>(
E)) {
1172 if (
const Expr *src = op->getSourceExpr())
1180 if (
cast->getCastKind() == CK_LValueToRValue)
1186 }
else if (
const UnaryOperator *uop = dyn_cast<UnaryOperator>(
E)) {
1190 }
else if (
const MemberExpr *mem = dyn_cast<MemberExpr>(
E)) {
1206 &&
"Invalid assignment");
1215 EnsureDest(
E->getRHS()->
getType());
1243 EnsureDest(
E->getRHS()->
getType());
1261 EmitFinalDestCopy(
E->
getType(), LHS);
1269void AggExprEmitter::
1276 CodeGenFunction::OpaqueValueMapping binding(CGF,
E);
1278 CodeGenFunction::ConditionalEvaluation eval(CGF);
1284 bool destructNonTrivialCStruct =
1285 !isExternallyDestructed &&
1287 isExternallyDestructed |= destructNonTrivialCStruct;
1296 Visit(
E->getTrueExpr());
1299 assert(CGF.
HaveInsertPoint() &&
"expression evaluation ended with no IP!");
1300 CGF.
Builder.CreateBr(ContBlock);
1312 Visit(
E->getFalseExpr());
1315 if (destructNonTrivialCStruct)
1324void AggExprEmitter::VisitChooseExpr(
const ChooseExpr *CE) {
1328void AggExprEmitter::VisitVAArgExpr(
VAArgExpr *VE) {
1348 Visit(
E->getSubExpr());
1351 if (!wasExternallyDestructed)
1361void AggExprEmitter::VisitCXXInheritedCtorInitExpr(
1365 E->getConstructor(),
E->constructsVBase(), Slot.
getAddress(),
1366 E->inheritedFromVBase(),
E);
1376 CodeGenFunction::CleanupDeactivationScope scope(CGF);
1380 e =
E->capture_init_end();
1381 i != e; ++i, ++CurField) {
1384 if (CurField->hasCapturedVLAType()) {
1389 EmitInitializationToLValue(*i, LV);
1393 CurField->getType().isDestructedType()) {
1397 CurField->getType(),
1404 CodeGenFunction::RunCleanupsScope cleanups(CGF);
1405 Visit(
E->getSubExpr());
1427 case CK_UserDefinedConversion:
1428 case CK_ConstructorConversion:
1434 case CK_BooleanToSignedIntegral:
1435 case CK_FloatingCast:
1436 case CK_FloatingComplexCast:
1437 case CK_FloatingComplexToBoolean:
1438 case CK_FloatingComplexToIntegralComplex:
1439 case CK_FloatingComplexToReal:
1440 case CK_FloatingRealToComplex:
1441 case CK_FloatingToBoolean:
1442 case CK_FloatingToIntegral:
1443 case CK_IntegralCast:
1444 case CK_IntegralComplexCast:
1445 case CK_IntegralComplexToBoolean:
1446 case CK_IntegralComplexToFloatingComplex:
1447 case CK_IntegralComplexToReal:
1448 case CK_IntegralRealToComplex:
1449 case CK_IntegralToBoolean:
1450 case CK_IntegralToFloating:
1452 case CK_IntegralToPointer:
1453 case CK_PointerToIntegral:
1455 case CK_VectorSplat:
1457 case CK_NonAtomicToAtomic:
1458 case CK_AtomicToNonAtomic:
1459 case CK_HLSLVectorTruncation:
1462 case CK_BaseToDerivedMemberPointer:
1463 case CK_DerivedToBaseMemberPointer:
1464 case CK_MemberPointerToBoolean:
1465 case CK_NullToMemberPointer:
1466 case CK_ReinterpretMemberPointer:
1470 case CK_AnyPointerToBlockPointerCast:
1471 case CK_BlockPointerToObjCPointerCast:
1472 case CK_CPointerToObjCPointerCast:
1473 case CK_ObjCObjectLValueCast:
1474 case CK_IntToOCLSampler:
1475 case CK_ZeroToOCLOpaqueType:
1479 case CK_FixedPointCast:
1480 case CK_FixedPointToBoolean:
1481 case CK_FixedPointToFloating:
1482 case CK_FixedPointToIntegral:
1483 case CK_FloatingToFixedPoint:
1484 case CK_IntegralToFixedPoint:
1488 case CK_AddressSpaceConversion:
1489 case CK_BaseToDerived:
1490 case CK_DerivedToBase:
1492 case CK_NullToPointer:
1493 case CK_PointerToBoolean:
1498 case CK_ARCConsumeObject:
1499 case CK_ARCExtendBlockObject:
1500 case CK_ARCProduceObject:
1501 case CK_ARCReclaimReturnedObject:
1502 case CK_CopyAndAutoreleaseBlockObject:
1503 case CK_ArrayToPointerDecay:
1504 case CK_FunctionToPointerDecay:
1505 case CK_BuiltinFnToFnPtr:
1507 case CK_LValueBitCast:
1508 case CK_LValueToRValue:
1509 case CK_LValueToRValueBitCast:
1510 case CK_UncheckedDerivedToBase:
1511 case CK_HLSLArrayRValue:
1514 llvm_unreachable(
"Unhandled clang::CastKind enum");
1522 while (
auto *CE = dyn_cast<CastExpr>(
E)) {
1530 return IL->getValue() == 0;
1533 return FL->getValue().isPosZero();
1535 if ((isa<ImplicitValueInitExpr>(
E) || isa<CXXScalarValueInitExpr>(
E)) &&
1539 if (
const CastExpr *ICE = dyn_cast<CastExpr>(
E))
1540 return ICE->getCastKind() == CK_NullToPointer &&
1545 return CL->getValue() == 0;
1553AggExprEmitter::EmitInitializationToLValue(
Expr *
E,
LValue LV) {
1560 }
else if (isa<ImplicitValueInitExpr>(
E) || isa<CXXScalarValueInitExpr>(
E)) {
1561 return EmitNullInitializationToLValue(LV);
1562 }
else if (isa<NoInitExpr>(
E)) {
1565 }
else if (
type->isReferenceType()) {
1589 llvm_unreachable(
"bad evaluation kind");
1592void AggExprEmitter::EmitNullInitializationToLValue(
LValue lv) {
1620 VisitCXXParenListOrInitListExpr(
E,
E->getInitExprs(),
1621 E->getInitializedFieldInUnion(),
1622 E->getArrayFiller());
1626 if (
E->hadArrayRangeDesignator())
1629 if (
E->isTransparent())
1630 return Visit(
E->getInit(0));
1632 VisitCXXParenListOrInitListExpr(
1633 E,
E->inits(),
E->getInitializedFieldInUnion(),
E->getArrayFiller());
1636void AggExprEmitter::VisitCXXParenListOrInitListExpr(
1645 if (llvm::Constant *
C =
1646 CGF.
CGM.EmitConstantExpr(ExprToVisit, ExprToVisit->
getType(), &CGF)) {
1647 llvm::GlobalVariable* GV =
1648 new llvm::GlobalVariable(CGF.
CGM.
getModule(),
C->getType(),
true,
1649 llvm::GlobalValue::InternalLinkage,
C,
"");
1650 EmitFinalDestCopy(ExprToVisit->
getType(),
1664 InitExprs, ArrayFiller);
1670 assert(InitExprs.size() == 0 &&
1671 "you can only use an empty initializer with VLAs");
1677 "Only support structs/unions here!");
1683 unsigned NumInitElements = InitExprs.size();
1689 CodeGenFunction::CleanupDeactivationScope DeactivateCleanups(CGF);
1691 unsigned curInitIndex = 0;
1694 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(record)) {
1695 assert(NumInitElements >= CXXRD->getNumBases() &&
1696 "missing initializer for base class");
1697 for (
auto &
Base : CXXRD->bases()) {
1698 assert(!
Base.isVirtual() &&
"should not see vbases here");
1699 auto *BaseRD =
Base.getType()->getAsCXXRecordDecl();
1709 CGF.
EmitAggExpr(InitExprs[curInitIndex++], AggSlot);
1712 Base.getType().isDestructedType())
1718 CodeGenFunction::FieldConstructionScope FCS(CGF, Dest.
getAddress());
1723 if (!InitializedFieldInUnion) {
1729 for (
const auto *Field : record->
fields())
1731 (
Field->isUnnamedBitField() ||
Field->isAnonymousStructOrUnion()) &&
1732 "Only unnamed bitfields or anonymous class allowed");
1741 if (NumInitElements) {
1743 EmitInitializationToLValue(InitExprs[0], FieldLoc);
1746 EmitNullInitializationToLValue(FieldLoc);
1754 for (
const auto *field : record->
fields()) {
1756 if (field->getType()->isIncompleteArrayType())
1760 if (field->isUnnamedBitField())
1766 if (curInitIndex == NumInitElements && Dest.
isZeroed() &&
1775 if (curInitIndex < NumInitElements) {
1777 EmitInitializationToLValue(InitExprs[curInitIndex++], LV);
1780 EmitNullInitializationToLValue(LV);
1787 = field->getType().isDestructedType()) {
1799 llvm::Value *outerBegin) {
1801 CodeGenFunction::OpaqueValueMapping binding(CGF,
E->getCommonExpr());
1804 uint64_t numElements =
E->getArraySize().getZExtValue();
1810 llvm::Value *zero = llvm::ConstantInt::get(CGF.
SizeTy, 0);
1811 llvm::Value *indices[] = {zero, zero};
1812 llvm::Value *begin = Builder.CreateInBoundsGEP(destPtr.
getElementType(),
1814 indices,
"arrayinit.begin");
1829 llvm::BasicBlock *entryBB = Builder.GetInsertBlock();
1834 llvm::PHINode *index =
1835 Builder.CreatePHI(zero->getType(), 2,
"arrayinit.index");
1836 index->addIncoming(zero, entryBB);
1837 llvm::Value *element =
1838 Builder.CreateInBoundsGEP(llvmElementType, begin, index);
1844 if (outerBegin->getType() != element->getType())
1845 outerBegin = Builder.CreateBitCast(outerBegin, element->getType());
1858 CodeGenFunction::RunCleanupsScope CleanupsScope(CGF);
1859 CodeGenFunction::ArrayInitLoopExprScope
Scope(CGF, index);
1861 Address(element, llvmElementType, elementAlign), elementType);
1869 AggExprEmitter(CGF, elementSlot,
false)
1870 .VisitArrayInitLoopExpr(InnerLoop, outerBegin);
1872 EmitInitializationToLValue(
E->getSubExpr(), elementLV);
1876 llvm::Value *nextIndex = Builder.CreateNUWAdd(
1877 index, llvm::ConstantInt::get(CGF.
SizeTy, 1),
"arrayinit.next");
1878 index->addIncoming(nextIndex, Builder.GetInsertBlock());
1881 llvm::Value *done = Builder.CreateICmpEQ(
1882 nextIndex, llvm::ConstantInt::get(CGF.
SizeTy, numElements),
1885 Builder.CreateCondBr(done, endBB, bodyBB);
1898 EmitInitializationToLValue(
E->getBase(), DestLV);
1899 VisitInitListExpr(
E->getUpdater());
1910 if (
auto *MTE = dyn_cast<MaterializeTemporaryExpr>(
E))
1911 E = MTE->getSubExpr();
1921 ILE = dyn_cast<InitListExpr>(ILE->
getInit(0));
1929 if (!RT->isUnionType()) {
1933 unsigned ILEElement = 0;
1934 if (
auto *CXXRD = dyn_cast<CXXRecordDecl>(SD))
1935 while (ILEElement != CXXRD->getNumBases())
1938 for (
const auto *Field : SD->
fields()) {
1941 if (Field->getType()->isIncompleteArrayType() ||
1944 if (Field->isUnnamedBitField())
1950 if (Field->getType()->isReferenceType())
1957 return NumNonZeroBytes;
1963 for (
unsigned i = 0, e = ILE->
getNumInits(); i != e; ++i)
1965 return NumNonZeroBytes;
1982 const CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
1995 if (NumNonZeroBytes*4 > Size)
1999 llvm::Constant *SizeVal = CGF.
Builder.getInt64(Size.getQuantity());
2017 "Invalid aggregate expression to emit");
2019 "slot has bits but no address");
2024 AggExprEmitter(*
this, Slot, Slot.
isIgnored()).Visit(
const_cast<Expr*
>(
E));
2041 return AggExprEmitter(*
this, Dest, Dest.
isIgnored())
2042 .EmitFinalDestCopy(
Type, Src, SrcKind);
2085 getContext().getASTRecordLayout(BaseRD).getSize() <=
2104 assert((
Record->hasTrivialCopyConstructor() ||
2105 Record->hasTrivialCopyAssignment() ||
2106 Record->hasTrivialMoveConstructor() ||
2107 Record->hasTrivialMoveAssignment() ||
2108 Record->hasAttr<TrivialABIAttr>() ||
Record->isUnion()) &&
2109 "Trying to aggregate-copy a type without a trivial copy/move "
2110 "constructor or assignment operator");
2119 if (
getTargetHooks().emitCUDADeviceBuiltinSurfaceDeviceCopy(*
this, Dest,
2123 if (
getTargetHooks().emitCUDADeviceBuiltinTextureDeviceCopy(*
this, Dest,
2149 llvm::Value *SizeVal =
nullptr;
2152 if (
auto *VAT = dyn_cast_or_null<VariableArrayType>(
2158 SizeVal =
Builder.CreateNUWMul(
2188 if (
Record->hasObjectMember()) {
2210 Inst->setMetadata(llvm::LLVMContext::MD_tbaa_struct, TBAAStructTag);
Defines the clang::ASTContext interface.
static CharUnits GetNumNonZeroBytesInInit(const Expr *E, CodeGenFunction &CGF)
GetNumNonZeroBytesInInit - Get an approximate count of the number of non-zero bytes that will be stor...
static Expr * findPeephole(Expr *op, CastKind kind, const ASTContext &ctx)
Attempt to look through various unimportant expressions to find a cast of the given kind.
static bool isBlockVarRef(const Expr *E)
Is the value of the given expression possibly a reference to or into a __block variable?
static bool isTrivialFiller(Expr *E)
Determine if E is a trivial array filler, that is, one that is equivalent to zero-initialization.
static bool isSimpleZero(const Expr *E, CodeGenFunction &CGF)
isSimpleZero - If emitting this value will obviously just cause a store of zero to memory,...
static llvm::Value * EmitCompare(CGBuilderTy &Builder, CodeGenFunction &CGF, const BinaryOperator *E, llvm::Value *LHS, llvm::Value *RHS, CompareKind Kind, const char *NameSuffix="")
static bool castPreservesZero(const CastExpr *CE)
Determine whether the given cast kind is known to always convert values with all zero bits in their v...
static void CheckAggExprForMemSetUse(AggValueSlot &Slot, const Expr *E, CodeGenFunction &CGF)
CheckAggExprForMemSetUse - If the initializer is large and has a lot of zeros in it,...
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Defines the C++ template declaration subclasses.
llvm::MachO::Record Record
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
const ConstantArrayType * getAsConstantArrayType(QualType T) const
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D,...
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
QualType removeAddrSpaceQualType(QualType T) const
Remove any existing address space on the type and returns the type with qualifiers intact (or that's ...
TypeInfoChars getTypeInfoDataSizeInChars(QualType T) const
TypeInfoChars getTypeInfoInChars(const Type *T) const
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
CharUnits toCharUnitsFromBits(int64_t BitSize) const
Convert a size in bits to a size in characters.
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
unsigned getTargetAddressSpace(LangAS AS) const
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.
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
CharUnits getNonVirtualSize() const
getNonVirtualSize - Get the non-virtual size (in chars) of an object, which is the size of the object...
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
Represents a loop initializing the elements of an array.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
AtomicExpr - Variadic atomic builtins: __atomic_exchange, __atomic_fetch_*, __atomic_load,...
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
A builtin binary operation expression such as "x + y" or "x <= y".
Represents binding an expression to a temporary.
Represents a call to a C++ constructor.
A default argument (C++ [dcl.fct.default]).
A use of a default initializer in a constructor or in aggregate initialization.
Expr * getExpr()
Get the initialization expression that will be used.
Represents a call to an inherited base class constructor from an inheriting constructor.
Represents a list-initialization with parenthesis.
Represents a C++ struct/union/class.
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
bool hasUserDeclaredConstructor() const
Determine whether this class has any user-declared constructors.
bool isEmpty() const
Determine whether this is an empty class in the sense of (C++11 [meta.unary.prop]).
A rewritten comparison expression that was originally written using operator syntax.
An expression "T()" which creates an rvalue of a non-class type T.
Implicit construction of a std::initializer_list<T> object from an array temporary within list-initia...
A C++ throw-expression (C++ [except.throw]).
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
CastKind getCastKind() const
CharUnits - This is an opaque type for sizes expressed in character units.
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.
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.
ChooseExpr - GNU builtin-in function __builtin_choose_expr.
Expr * getChosenSubExpr() const
getChosenSubExpr - Return the subexpression chosen according to the condition.
Represents a 'co_await' expression.
Like RawAddress, an abstract representation of an aligned address, but the pointer contained in this ...
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 withElementType(llvm::Type *ElemTy) const
Return address with different element type, but same pointer and alignment.
llvm::PointerType * getType() const
Return the type of the pointer value.
void setVolatile(bool flag)
static AggValueSlot ignored()
ignored - Returns an aggregate value slot indicating that the aggregate value is being ignored.
Address getAddress() const
CharUnits getPreferredSize(ASTContext &Ctx, QualType Type) const
Get the preferred size to use when storing a value to this slot.
NeedsGCBarriers_t requiresGCollection() const
void setExternallyDestructed(bool destructed=true)
void setZeroed(bool V=true)
IsZeroed_t isZeroed() const
Qualifiers getQualifiers() const
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)
IsAliased_t isPotentiallyAliased() const
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.
IsDestructed_t isExternallyDestructed() const
Overlap_t mayOverlap() const
llvm::Value * emitRawPointer(CodeGenFunction &CGF) const
A scoped helper to set the current debug location to the specified location or preferred location of ...
llvm::CallInst * CreateMemSet(Address Dest, llvm::Value *Value, llvm::Value *Size, bool IsVolatile=false)
Address CreateStructGEP(Address Addr, unsigned Index, const llvm::Twine &Name="")
llvm::CallInst * CreateMemCpy(Address Dest, Address Src, llvm::Value *Size, bool IsVolatile=false)
virtual llvm::Value * EmitMemberPointerComparison(CodeGenFunction &CGF, llvm::Value *L, llvm::Value *R, const MemberPointerType *MPT, bool Inequality)
Emit a comparison between two member pointers. Returns an i1.
virtual void EmitGCMemmoveCollectable(CodeGen::CodeGenFunction &CGF, Address DestPtr, Address SrcPtr, llvm::Value *Size)=0
CodeGenFunction - This class organizes the per-function state that is used while generating LLVM code...
void EmitNullInitialization(Address DestPtr, QualType Ty)
EmitNullInitialization - Generate code to set a value of the given type to null, If the type contains...
void CreateCoercedStore(llvm::Value *Src, Address Dst, llvm::TypeSize DstSize, bool DstIsVolatile)
Create a store to.
llvm::Value * EmitLifetimeStart(llvm::TypeSize Size, llvm::Value *Addr)
void DeactivateCleanupBlock(EHScopeStack::stable_iterator Cleanup, llvm::Instruction *DominatingIP)
DeactivateCleanupBlock - Deactivates the given cleanup block.
static TypeEvaluationKind getEvaluationKind(QualType T)
getEvaluationKind - Return the TypeEvaluationKind of QualType T.
void EmitBranchOnBoolExpr(const Expr *Cond, llvm::BasicBlock *TrueBlock, llvm::BasicBlock *FalseBlock, uint64_t TrueCount, Stmt::Likelihood LH=Stmt::LH_None, const Expr *ConditionalOp=nullptr)
EmitBranchOnBoolExpr - Emit a branch on a boolean condition (e.g.
LValue getOrCreateOpaqueLValueMapping(const OpaqueValueExpr *e)
Given an opaque value expression, return its LValue mapping if it exists, otherwise create one.
LValue EmitAggExprToLValue(const Expr *E)
EmitAggExprToLValue - Emit the computation of the specified expression of aggregate type into a tempo...
void EmitLifetimeEnd(llvm::Value *Size, llvm::Value *Addr)
void EmitStoreThroughLValue(RValue Src, LValue Dst, bool isInit=false)
EmitStoreThroughLValue - Store the specified rvalue into the specified lvalue, where both are guarant...
void pushLifetimeExtendedDestroy(CleanupKind kind, Address addr, QualType type, Destroyer *destroyer, bool useEHCleanupForArray)
static bool hasScalarEvaluationKind(QualType T)
void pushIrregularPartialArrayCleanup(llvm::Value *arrayBegin, Address arrayEndPointer, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
llvm::Value * emitArrayLength(const ArrayType *arrayType, QualType &baseType, Address &addr)
emitArrayLength - Compute the length of an array, even if it's a VLA, and drill down to the base elem...
AggValueSlot::Overlap_t getOverlapForBaseInit(const CXXRecordDecl *RD, const CXXRecordDecl *BaseRD, bool IsVirtual)
Determine whether a base class initialization may overlap some other object.
LValue EmitLValue(const Expr *E, KnownNonNull_t IsKnownNonNull=NotKnownNonNull)
EmitLValue - Emit code to compute a designator that specifies the location of the expression.
RValue EmitAtomicLoad(LValue LV, SourceLocation SL, AggValueSlot Slot=AggValueSlot::ignored())
bool hasVolatileMember(QualType T)
hasVolatileMember - returns true if aggregate type has a volatile member.
void callCStructCopyAssignmentOperator(LValue Dst, LValue Src)
void callCStructMoveConstructor(LValue Dst, LValue Src)
llvm::SmallVector< DeferredDeactivateCleanup > DeferredDeactivationCleanupStack
void callCStructCopyConstructor(LValue Dst, LValue Src)
llvm::BasicBlock * createBasicBlock(const Twine &name="", llvm::Function *parent=nullptr, llvm::BasicBlock *before=nullptr)
createBasicBlock - Create an LLVM basic block.
const LangOptions & getLangOpts() const
LValue EmitLValueForFieldInitialization(LValue Base, const FieldDecl *Field)
EmitLValueForFieldInitialization - Like EmitLValueForField, except that if the Field is a reference,...
void EmitBlock(llvm::BasicBlock *BB, bool IsFinished=false)
EmitBlock - Emit the given block.
void pushDestroyAndDeferDeactivation(QualType::DestructionKind dtorKind, Address addr, QualType type)
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...
void EmitInheritedCXXConstructorCall(const CXXConstructorDecl *D, bool ForVirtualBase, Address This, bool InheritedFromVBase, const CXXInheritedCtorInitExpr *E)
Emit a call to a constructor inherited from a base class, passing the current constructor's arguments...
RValue EmitObjCMessageExpr(const ObjCMessageExpr *E, ReturnValueSlot Return=ReturnValueSlot())
void EmitIgnoredExpr(const Expr *E)
EmitIgnoredExpr - Emit an expression in a context which ignores the result.
llvm::Type * ConvertTypeForMem(QualType T)
void EmitScalarInit(const Expr *init, const ValueDecl *D, LValue lvalue, bool capturedByInit)
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...
Destroyer * getDestroyer(QualType::DestructionKind destructionKind)
void EmitStoreThroughBitfieldLValue(RValue Src, LValue Dst, llvm::Value **Result=nullptr)
EmitStoreThroughBitfieldLValue - Store Src into Dst with same constraints as EmitStoreThroughLValue.
const TargetInfo & getTarget() const
llvm::Value * getTypeSize(QualType Ty)
Returns calculated size of the specified type.
void EmitComplexExprIntoLValue(const Expr *E, LValue dest, bool isInit)
EmitComplexExprIntoLValue - Emit the given expression of complex type and place its result into the s...
void pushFullExprCleanup(CleanupKind kind, As... A)
pushFullExprCleanup - Push a cleanup to be run at the end of the current full-expression.
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.
AggValueSlot CreateAggTemp(QualType T, const Twine &Name="tmp", RawAddress *Alloca=nullptr)
CreateAggTemp - Create a temporary memory object for the given aggregate type.
RValue EmitCoyieldExpr(const CoyieldExpr &E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
bool HaveInsertPoint() const
HaveInsertPoint - True if an insertion point is defined.
void ErrorUnsupported(const Stmt *S, const char *Type)
ErrorUnsupported - Print out an error that codegen doesn't support the specified stmt yet.
AggValueSlot::Overlap_t getOverlapForFieldInit(const FieldDecl *FD)
Determine whether a field initialization may overlap some other object.
void EmitAggregateCopy(LValue Dest, LValue Src, QualType EltTy, AggValueSlot::Overlap_t MayOverlap, bool isVolatile=false)
EmitAggregateCopy - Emit an aggregate copy.
const TargetCodeGenInfo & getTargetHooks() const
RValue EmitReferenceBindingToExpr(const Expr *E)
Emits a reference binding to the passed in expression.
void EmitAggExpr(const Expr *E, AggValueSlot AS)
EmitAggExpr - Emit the computation of the specified expression of aggregate type.
Address EmitCompoundStmt(const CompoundStmt &S, bool GetLast=false, AggValueSlot AVS=AggValueSlot::ignored())
void EmitCXXTemporary(const CXXTemporary *Temporary, QualType TempType, Address Ptr)
RValue EmitVAArg(VAArgExpr *VE, Address &VAListAddr, AggValueSlot Slot=AggValueSlot::ignored())
Generate code to get an argument from the passed in pointer and update it accordingly.
RValue EmitPseudoObjectRValue(const PseudoObjectExpr *e, AggValueSlot slot=AggValueSlot::ignored())
ASTContext & getContext() const
void EmitAggFinalDestCopy(QualType Type, AggValueSlot Dest, const LValue &Src, ExprValueKind SrcKind)
EmitAggFinalDestCopy - Emit copy of the specified aggregate into destination address.
void EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint=true)
void pushDestroy(QualType::DestructionKind dtorKind, Address addr, QualType type)
Address GetAddressOfDirectBaseInCompleteClass(Address Value, const CXXRecordDecl *Derived, const CXXRecordDecl *Base, bool BaseIsVirtual)
GetAddressOfBaseOfCompleteClass - Convert the given pointer to a complete class to the given direct b...
void callCStructMoveAssignmentOperator(LValue Dst, LValue Src)
bool needsEHCleanup(QualType::DestructionKind kind)
Determines whether an EH cleanup is required to destroy a type with the given destruction kind.
CleanupKind getCleanupKind(QualType::DestructionKind kind)
void EmitCXXConstructExpr(const CXXConstructExpr *E, AggValueSlot Dest)
llvm::Type * ConvertType(QualType T)
CodeGenTypes & getTypes() const
RValue EmitCoawaitExpr(const CoawaitExpr &E, AggValueSlot aggSlot=AggValueSlot::ignored(), bool ignoreResult=false)
llvm::Value * EmitDynamicCast(Address V, const CXXDynamicCastExpr *DCE)
uint64_t getProfileCount(const Stmt *S)
Get the profiler's count for the given statement.
LValue EmitPseudoObjectLValue(const PseudoObjectExpr *e)
static bool hasAggregateEvaluationKind(QualType T)
LValue MakeAddrLValue(Address Addr, QualType T, AlignmentSource Source=AlignmentSource::Type)
void EmitLambdaVLACapture(const VariableArrayType *VAT, LValue LV)
void EmitAtomicStore(RValue rvalue, LValue lvalue, bool isInit)
RValue EmitCallExpr(const CallExpr *E, ReturnValueSlot ReturnValue=ReturnValueSlot())
llvm::Value * EmitScalarExpr(const Expr *E, bool IgnoreResultAssign=false)
EmitScalarExpr - Emit the computation of the specified expression of LLVM scalar type,...
bool LValueIsSuitableForInlineAtomic(LValue Src)
void incrementProfileCounter(const Stmt *S, llvm::Value *StepV=nullptr)
Increment the profiler's counter for the given statement by StepV.
void pushRegularPartialArrayCleanup(llvm::Value *arrayBegin, llvm::Value *arrayEnd, QualType elementType, CharUnits elementAlignment, Destroyer *destroyer)
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...
RValue EmitAtomicExpr(AtomicExpr *E)
LValue EmitPointerToDataMemberBinaryExpr(const BinaryOperator *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.
llvm::MDNode * getTBAAStructInfo(QualType QTy)
llvm::Module & getModule() const
bool isPaddedAtomicType(QualType type)
void ErrorUnsupported(const Stmt *S, const char *Type)
Print out an error that codegen doesn't support the specified stmt yet.
TBAAAccessInfo mergeTBAAInfoForMemoryTransfer(TBAAAccessInfo DestInfo, TBAAAccessInfo SrcInfo)
mergeTBAAInfoForMemoryTransfer - Get merged TBAA information for the purposes of memory transfer call...
const LangOptions & getLangOpts() const
const llvm::DataLayout & getDataLayout() const
CGCXXABI & getCXXABI() const
void DecorateInstructionWithTBAA(llvm::Instruction *Inst, TBAAAccessInfo TBAAInfo)
DecorateInstructionWithTBAA - Decorate the instruction with a TBAA tag.
ASTContext & getContext() const
const CodeGenOptions & getCodeGenOpts() const
CGObjCRuntime & getObjCRuntime()
Return a reference to the configured Objective-C runtime.
llvm::Constant * EmitNullConstant(QualType T)
Return the result of value-initializing the given type, i.e.
LangAS GetGlobalConstantAddressSpace() const
Return the AST address space of constant literal, which is used to emit the constant literal as globa...
bool isPointerZeroInitializable(QualType T)
Check if the pointer type can be zero-initialized (in the C++ sense) with an LLVM zeroinitializer.
bool isZeroInitializable(QualType T)
IsZeroInitializable - Return whether a type can be zero-initialized (in the C++ sense) with an LLVM z...
A saved depth on the scope stack.
stable_iterator stable_begin() const
Create a stable reference to the top of the EH stack.
iterator find(stable_iterator save) const
Turn a stable reference to a scope depth into a unstable pointer to the EH stack.
LValue - This represents an lvalue references.
Address getAddress() const
TBAAAccessInfo getTBAAInfo() const
void setNonGC(bool Value)
RValue - This trivial value class is used to represent the result of an expression that is evaluated.
llvm::Value * getAggregatePointer(QualType PointeeType, CodeGenFunction &CGF) const
static RValue get(llvm::Value *V)
static RValue getAggregate(Address addr, bool isVolatile=false)
Convert an Address to an RValue.
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.
std::pair< llvm::Value *, llvm::Value * > getComplexVal() const
getComplexVal - Return the real/imag components of this complex value.
An abstract representation of an aligned address.
llvm::Value * getPointer() const
static RawAddress invalid()
ReturnValueSlot - Contains the address where the return value of a function can be stored,...
const ComparisonCategoryInfo & getInfoForType(QualType Ty) const
Return the comparison category information as specified by getCategoryForType(Ty).
bool isPartial() const
True iff the comparison is not totally ordered.
const ValueInfo * getLess() const
const ValueInfo * getUnordered() const
const CXXRecordDecl * Record
The declaration for the comparison category type from the standard library.
const ValueInfo * getGreater() const
const ValueInfo * getEqualOrEquiv() const
Complex values, per C99 6.2.5p11.
CompoundLiteralExpr - [C99 6.5.2.5].
Represents the canonical version of C arrays with a specified constant size.
ConstantExpr - An expression that occurs in a constant context and optionally the result of evaluatin...
Represents a 'co_yield' expression.
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
A reference to a declared variable, function, enum, etc.
Represents an expression – generally a full-expression – that introduces cleanups to be run at the en...
This represents one expression.
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...
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents a member of a struct/union/class.
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.
Represents a C11 generic selection.
Represents an implicitly-generated value initialization of an object of a given type.
Describes an C or C++ initializer list.
bool isTransparent() const
Is this a transparent initializer list (that is, an InitListExpr that is purely syntactic,...
unsigned getNumInits() const
const Expr * getInit(unsigned Init) const
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Expr *const * const_capture_init_iterator
Const iterator that walks over the capture initialization arguments.
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
A pointer to member type per C++ 8.3.3 - Pointers to members.
Represents a place-holder for an object not to be initialized by anything.
ObjCIvarRefExpr - A reference to an ObjC instance variable.
An expression that sends a message to the given Objective-C object or class.
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 ...
ParenExpr - This represents a parenthesized expression, e.g.
const Expr * getSubExpr() const
[C99 6.4.2.2] - A predefined identifier such as func.
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
A (possibly-)qualified type.
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
bool isTriviallyCopyableType(const ASTContext &Context) const
Return true if this is a trivially copyable type (C++0x [basic.types]p9)
LangAS getAddressSpace() const
Return the address space of this type.
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
@ PCK_Struct
The type is a struct containing a field whose type is neither PCK_Trivial nor PCK_VolatileTrivial.
The collection of all-type qualifiers we support.
Represents a struct/union/class.
bool hasObjectMember() const
field_range fields() const
field_iterator field_begin() const
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
RecordDecl * getDecl() const
Scope - A scope is a transient data structure that is used while parsing the program.
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
RetTy Visit(PTR(Stmt) S, ParamTys... P)
StmtVisitor - This class implements a simple visitor for Stmt subclasses.
Stmt - This represents one statement.
StringLiteral - This represents a string literal expression, e.g.
Represents a reference to a non-type template parameter that has been substituted with a template arg...
uint64_t getPointerWidth(LangAS AddrSpace) const
Return the width of pointers on this target, for the specified address space.
The base class of the type hierarchy.
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isConstantArrayType() const
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isVariableArrayType() const
bool isCUDADeviceBuiltinSurfaceType() const
Check if the type is the CUDA device builtin surface type.
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
bool isAnyComplexType() const
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
bool isMemberPointerType() const
bool isAtomicType() const
bool isCUDADeviceBuiltinTextureType() const
Check if the type is the CUDA device builtin texture type.
bool hasFloatingRepresentation() const
Determine whether this type has a floating-point representation of some sort, e.g....
bool isRealFloatingType() const
Floating point categories.
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
bool isRecordType() const
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Represents a call to the builtin function __builtin_va_arg.
Represents a variable declaration or definition.
@ EHCleanup
Denotes a cleanup that should run when a scope is exited using exceptional control flow (a throw stat...
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const AstTypeMatcher< AtomicType > atomicType
Matches atomic types.
bool Zero(InterpState &S, CodePtr OpPC)
bool GE(InterpState &S, CodePtr OpPC)
The JSON file list parser is used to communicate input to InstallAPI.
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
const FunctionProtoType * T
U cast(CodeGen::Address addr)
Diagnostic wrappers for TextAPI types for error reporting.
cl::opt< bool > EnableSingleByteCoverage
llvm::IntegerType * Int8Ty
i8, i16, i32, and i64
llvm::IntegerType * SizeTy
llvm::PointerType * Int8PtrTy
llvm::IntegerType * PtrDiffTy
CharUnits getPointerAlign() const