Lines Matching full:constant

1 //===--- CGExprConstant.cpp - Emit LLVM Code from Constant Expressions ----===//
9 // This contains code to emit Constant Expr nodes as LLVM code.
50 CharUnits getAlignment(const llvm::Constant *C) const { in getAlignment()
59 CharUnits getSize(const llvm::Constant *C) const { in getSize()
63 llvm::Constant *getPadding(CharUnits PadSize) const { in getPadding()
70 llvm::Constant *getZeroes(CharUnits ZeroSize) const { in getZeroes()
76 /// Incremental builder for an llvm::Constant* holding a struct or array
77 /// constant.
79 /// The elements of the constant. These two arrays must have the same size;
80 /// Offsets[i] describes the offset of Elems[i] within the constant. The
87 llvm::SmallVector<llvm::Constant*, 32> Elems;
90 /// The size of the constant (the maximum end offset of any added element).
102 static llvm::Constant *buildFrom(CodeGenModule &CGM,
103 ArrayRef<llvm::Constant *> Elems,
115 /// \param AllowOverwrite If \c true, this constant might overwrite (part of)
116 /// a constant that has already been added. This flag is only used to
118 bool add(llvm::Constant *C, CharUnits Offset, bool AllowOverwrite);
123 /// Attempt to condense the value starting at \p Offset to a constant of type
127 /// Produce a constant representing the entire accumulated value, ideally of
128 /// the specified type. If \p AllowOversized, the constant might be larger
130 /// Otherwise, the constant will be of exactly the same size as \p DesiredTy
132 llvm::Constant *build(llvm::Type *DesiredTy, bool AllowOversized) const { in build()
145 bool ConstantAggregateBuilder::add(llvm::Constant *C, CharUnits Offset, in add()
163 // Uncommon case: constant overlaps what we've already created. in add()
227 // these bits and fail the entire constant emission. in addBits()
254 llvm::Constant *&ToUpdate = Elems[*FirstElemToUpdate]; in addBits()
256 // value, which we can only extract for a constant int. in addBits()
260 // Because this is a 1-CharUnit range, the constant occupying it must in addBits()
315 /// Split the constant at index Index, if possible. Return true if we did.
320 llvm::Constant *C = Elems[Index]; in split()
395 static llvm::Constant *
398 SmallVectorImpl<llvm::Constant *> &Elements,
399 llvm::Constant *Filler);
401 llvm::Constant *ConstantAggregateBuilder::buildFrom( in buildFrom()
402 CodeGenModule &CGM, ArrayRef<llvm::Constant *> Elems, in buildFrom()
419 llvm::Constant *Filler = llvm::Constant::getNullValue(CommonType); in buildFrom()
421 SmallVector<llvm::Constant*, 32> ArrayElements; in buildFrom()
445 // The size of the constant we plan to generate. This is usually just in buildFrom()
456 for (llvm::Constant *C : Elems) in buildFrom()
463 ArrayRef<llvm::Constant*> UnpackedElems = Elems; in buildFrom()
464 llvm::SmallVector<llvm::Constant*, 32> UnpackedElemStorage; in buildFrom()
480 llvm::SmallVector<llvm::Constant*, 32> PackedElems; in buildFrom()
540 // element constant of the right size alone even if it has the wrong type. in condense()
548 llvm::Constant *Replacement = buildFrom( in condense()
567 static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,
570 static llvm::Constant *BuildStruct(ConstantEmitter &Emitter,
583 llvm::Constant *InitExpr, bool AllowOverwrite = false);
585 bool AppendBytes(CharUnits FieldOffsetInChars, llvm::Constant *InitCst,
589 llvm::Constant *InitExpr, bool AllowOverwrite = false);
594 llvm::Constant *Finalize(QualType Ty);
598 const FieldDecl *Field, uint64_t FieldOffset, llvm::Constant *InitCst, in AppendField()
608 llvm::Constant *InitCst, in AppendBytes()
614 uint64_t FieldOffset, llvm::Constant *C, in AppendBitField()
620 // bytes. Try to fold these back into an integer constant. If that doesn't in AppendBitField()
622 // constant, this must require run-time code. in AppendBitField()
625 llvm::Constant *FoldedConstant = llvm::ConstantFoldLoadFromConst( in AppendBitField()
667 llvm::Constant *FillC = nullptr; in EmitDesignatedInitUpdater()
692 // Attempt to reduce the array element to a single constant if necessary. in EmitDesignatedInitUpdater()
695 llvm::Constant *Val = Emitter.tryEmitPrivateForMemory(Init, ElemType); in EmitDesignatedInitUpdater()
712 // arise in C++1z where we will have already constant folded most interesting in Build()
739 // prevent emission of this struct as a constant. in Build()
747 // represents additional overwriting of our current constant value, and not in Build()
748 // a new constant to emit independently. in Build()
765 llvm::Constant *EltInit = in Build()
814 llvm::Constant *VTableAddressPoint = in Build()
868 llvm::Constant *EltInit = in Build()
893 llvm::Constant *ConstStructBuilder::Finalize(QualType Type) { in Finalize()
900 llvm::Constant *ConstStructBuilder::BuildStruct(ConstantEmitter &Emitter, in BuildStruct()
912 llvm::Constant *ConstStructBuilder::BuildStruct(ConstantEmitter &Emitter, in BuildStruct()
948 llvm::Constant *C = emitter.tryEmitForInitializer(E->getInitializer(), in tryEmitGlobalCompoundLiteral()
952 "file-scope compound literal did not have constant initializer!"); in tryEmitGlobalCompoundLiteral()
968 static llvm::Constant *
971 SmallVectorImpl<llvm::Constant *> &Elements, in EmitArrayConstant()
972 llvm::Constant *Filler) { in EmitArrayConstant()
994 llvm::Constant *Initial = llvm::ConstantArray::get( in EmitArrayConstant()
1015 // If all elements have the same type, just emit an array constant. in EmitArrayConstant()
1023 for (llvm::Constant *Elt : Elements) in EmitArrayConstant()
1031 // mode, we don't currently constant fold those types. All other types are
1032 // handled by constant folding.
1034 // Constant folding is currently missing support for a few features supported
1037 : public ConstStmtVisitor<ConstExprEmitter, llvm::Constant *, QualType> {
1050 llvm::Constant *VisitStmt(const Stmt *S, QualType T) { return nullptr; } in VisitStmt()
1052 llvm::Constant *VisitConstantExpr(const ConstantExpr *CE, QualType T) { in VisitConstantExpr()
1053 if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(CE)) in VisitConstantExpr()
1058 llvm::Constant *VisitParenExpr(const ParenExpr *PE, QualType T) { in VisitParenExpr()
1062 llvm::Constant *
1068 llvm::Constant *VisitGenericSelectionExpr(const GenericSelectionExpr *GE, in VisitGenericSelectionExpr()
1073 llvm::Constant *VisitChooseExpr(const ChooseExpr *CE, QualType T) { in VisitChooseExpr()
1077 llvm::Constant *VisitCompoundLiteralExpr(const CompoundLiteralExpr *E, in VisitCompoundLiteralExpr()
1082 llvm::Constant *ProduceIntToIntCast(const Expr *E, QualType DestType) { in ProduceIntToIntCast()
1086 if (llvm::Constant *C = Visit(E, FromType)) in ProduceIntToIntCast()
1100 llvm::Constant *VisitCastExpr(const CastExpr *E, QualType destType) { in VisitCastExpr()
1121 SmallVector<llvm::Constant*, 2> Elts; in VisitCastExpr()
1258 llvm::Constant *VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *DIE, in VisitCXXDefaultInitExpr()
1261 // constant expression. in VisitCXXDefaultInitExpr()
1265 llvm::Constant *VisitExprWithCleanups(const ExprWithCleanups *E, QualType T) { in VisitExprWithCleanups()
1269 llvm::Constant *VisitIntegerLiteral(const IntegerLiteral *I, QualType T) { in VisitIntegerLiteral()
1290 llvm::Constant *EmitArrayInitialization(const InitListExpr *ILE, QualType T) { in EmitArrayInitialization()
1292 assert(CAT && "can't emit array init for non-constant-bound array"); in EmitArrayInitialization()
1313 llvm::Constant *fillC = nullptr; in EmitArrayInitialization()
1321 SmallVector<llvm::Constant *, 16> Elts; in EmitArrayInitialization()
1329 llvm::Constant *C = nullptr; in EmitArrayInitialization()
1349 llvm::Constant *C; in EmitArrayInitialization()
1384 llvm::Constant *EmitRecordInitialization(const InitListExpr *ILE, in EmitRecordInitialization()
1389 llvm::Constant *VisitImplicitValueInitExpr(const ImplicitValueInitExpr *E, in VisitImplicitValueInitExpr()
1394 llvm::Constant *VisitInitListExpr(const InitListExpr *ILE, QualType T) { in VisitInitListExpr()
1407 llvm::Constant *
1428 llvm::Constant *VisitCXXConstructExpr(const CXXConstructExpr *E, in VisitCXXConstructExpr()
1454 llvm::Constant *VisitStringLiteral(const StringLiteral *E, QualType T) { in VisitStringLiteral()
1459 llvm::Constant *VisitObjCEncodeExpr(const ObjCEncodeExpr *E, QualType T) { in VisitObjCEncodeExpr()
1466 assert(CAT && "String data not of constant array type!"); in VisitObjCEncodeExpr()
1474 llvm::Constant *VisitUnaryExtension(const UnaryOperator *E, QualType T) { in VisitUnaryExtension()
1478 llvm::Constant *VisitUnaryMinus(const UnaryOperator *U, QualType T) { in VisitUnaryMinus()
1479 if (llvm::Constant *C = Visit(U->getSubExpr(), T)) in VisitUnaryMinus()
1485 llvm::Constant *VisitPackIndexingExpr(const PackIndexingExpr *E, QualType T) { in VisitPackIndexingExpr()
1497 llvm::Constant *ConstantEmitter::validateAndPopAbstract(llvm::Constant *C, in validateAndPopAbstract()
1509 llvm::Constant *
1516 llvm::Constant *
1523 llvm::Constant *
1530 llvm::Constant *ConstantEmitter::tryEmitConstantExpr(const ConstantExpr *CE) { in tryEmitConstantExpr()
1541 llvm::Constant *
1548 "internal error: could not emit constant value \"abstractly\""); in emitAbstract()
1554 llvm::Constant *
1564 "internal error: could not emit constant value \"abstractly\""); in emitAbstract()
1570 llvm::Constant *ConstantEmitter::tryEmitForInitializer(const VarDecl &D) { in tryEmitForInitializer()
1575 llvm::Constant *ConstantEmitter::tryEmitForInitializer(const Expr *E, in tryEmitForInitializer()
1582 llvm::Constant *ConstantEmitter::emitForInitializer(const APValue &value, in emitForInitializer()
1587 assert(C && "couldn't emit constant value non-abstractly?"); in emitForInitializer()
1592 assert(!Abstract && "cannot get current address for abstract constant"); in getCurrentAddrPrivate()
1611 void ConstantEmitter::registerCurrentAddrPrivate(llvm::Constant *signal, in registerCurrentAddrPrivate()
1624 llvm::Constant *Base;
1628 llvm::DenseMap<llvm::Constant*, llvm::GlobalVariable*> PlaceholderAddresses;
1631 llvm::DenseMap<llvm::GlobalVariable*, llvm::Constant*> Locations;
1637 llvm::SmallVector<llvm::Constant*, 8> IndexValues;
1639 ReplacePlaceholders(CodeGenModule &CGM, llvm::Constant *base, in ReplacePlaceholders()
1640 ArrayRef<std::pair<llvm::Constant*, in ReplacePlaceholders()
1646 void replaceInInitializer(llvm::Constant *init) { in replaceInInitializer()
1667 // messing around with llvm::Constant structures, which never itself in replaceInInitializer()
1677 void findLocations(llvm::Constant *init) { in findLocations()
1733 llvm::Constant *location = llvm::ConstantExpr::getInBoundsGetElementPtr( in setLocation()
1771 llvm::Constant *ConstantEmitter::tryEmitPrivateForVarInit(const VarDecl &D) { in tryEmitPrivateForVarInit()
1793 if (llvm::Constant *C = ConstExprEmitter(*this).Visit(E, nonMemoryDestType)) in tryEmitPrivateForVarInit()
1805 llvm::Constant *
1812 llvm::Constant *
1820 llvm::Constant *ConstantEmitter::tryEmitPrivateForMemory(const Expr *E, in tryEmitPrivateForMemory()
1823 llvm::Constant *C = tryEmitPrivate(E, nonMemoryDestType); in tryEmitPrivateForMemory()
1827 llvm::Constant *ConstantEmitter::tryEmitPrivateForMemory(const APValue &value, in tryEmitPrivateForMemory()
1834 /// Try to emit a constant signed pointer, given a raw pointer and the
1839 llvm::Constant *
1840 ConstantEmitter::tryEmitConstantSignedPointer(llvm::Constant *UnsignedPointer, in tryEmitConstantSignedPointer()
1862 llvm::Constant *SignedPointer = CGM.getConstantSignedPointer( in tryEmitConstantSignedPointer()
1871 llvm::Constant *ConstantEmitter::emitForMemory(CodeGenModule &CGM, in emitForMemory()
1872 llvm::Constant *C, in emitForMemory()
1874 // For an _Atomic-qualified constant, we may need to add tail padding. in emitForMemory()
1884 assert(innerSize < outerSize && "emitted over-large constant for atomic"); in emitForMemory()
1885 llvm::Constant *elts[] = { in emitForMemory()
1896 llvm::Constant *Res = llvm::ConstantFoldCastOperand( in emitForMemory()
1898 assert(Res && "Constant folding must succeed"); in emitForMemory()
1905 // ptrtoint/inttoptr should not involve _BitInt in constant expressions, so in emitForMemory()
1908 llvm::Constant *Res = llvm::ConstantFoldCastOperand( in emitForMemory()
1914 // So, split constant into individual bytes. in emitForMemory()
1926 llvm::Constant *ConstantEmitter::tryEmitPrivate(const Expr *E, in tryEmitPrivate()
1928 assert(!destType->isVoidType() && "can't emit a void constant"); in tryEmitPrivate()
1931 if (llvm::Constant *C = ConstExprEmitter(*this).Visit(E, destType)) in tryEmitPrivate()
1949 llvm::Constant *CodeGenModule::getNullPointer(llvm::PointerType *T, QualType QT) { in getNullPointer()
1957 llvm::Constant *Value;
1960 /*implicit*/ ConstantLValue(llvm::Constant *value, in ConstantLValue()
1968 /// A helper class for emitting constant l-values.
1988 llvm::Constant *tryEmit();
1991 llvm::Constant *tryEmitAbsolute(llvm::Type *destTy);
2010 llvm::Constant *emitPointerAuthPointer(const Expr *E);
2012 std::pair<llvm::Constant *, llvm::ConstantInt *>
2020 llvm::Constant *getOffset() { in getOffset()
2025 /// Apply the value offset to the given constant.
2026 llvm::Constant *applyOffset(llvm::Constant *C) { in applyOffset()
2036 llvm::Constant *ConstantLValueEmitter::tryEmit() { in tryEmit()
2059 llvm::Constant *value = result.Value; in tryEmit()
2077 llvm::Constant *
2090 llvm::Constant *C; in tryEmitAbsolute()
2102 // The constant always points to the canonical declaration. We want to look in tryEmitBase()
2109 auto PtrAuthSign = [&](llvm::Constant *C) { in tryEmitBase()
2167 if (llvm::Constant *Result = Emitter.tryEmitConstantExpr(E)) in VisitConstantExpr()
2204 "this boxed expression can't be emitted as a compile-time constant"); in VisitObjCBoxedExpr()
2217 llvm::Constant *Ptr = Emitter.CGF->GetAddrOfLabel(E->getLabel()); in VisitAddrLabelExpr()
2246 llvm::Constant *UnsignedPointer = emitPointerAuthPointer(E->getArg(0)); in emitPointerAuthSignConstant()
2251 llvm::Constant *SignedPointer = CGM.getConstantSignedPointer( in emitPointerAuthSignConstant()
2256 llvm::Constant *ConstantLValueEmitter::emitPointerAuthPointer(const Expr *E) { in emitPointerAuthPointer()
2274 std::pair<llvm::Constant *, llvm::ConstantInt *>
2281 llvm::Constant *Pointer = ConstantEmitter(CGM).emitAbstract( in emitPointerAuthDiscriminator()
2289 llvm::Constant *Result = ConstantEmitter(CGM).emitAbstract(E, E->getType()); in emitPointerAuthDiscriminator()
2324 llvm::Constant *
2342 llvm::Constant *Complex[2]; in tryEmitPrivate()
2365 llvm::Constant *Complex[2]; in tryEmitPrivate()
2379 SmallVector<llvm::Constant *, 4> Inits(NumElts); in tryEmitPrivate()
2398 llvm::Constant *LHS = tryEmitPrivate(LHSExpr, LHSExpr->getType()); in tryEmitPrivate()
2399 llvm::Constant *RHS = tryEmitPrivate(RHSExpr, RHSExpr->getType()); in tryEmitPrivate()
2406 llvm::Constant *AddrLabelDiff = llvm::ConstantExpr::getSub(LHS, RHS); in tryEmitPrivate()
2422 llvm::Constant *Filler = nullptr; in tryEmitPrivate()
2431 SmallVector<llvm::Constant*, 16> Elts; in tryEmitPrivate()
2439 llvm::Constant *C = tryEmitPrivateForMemory( in tryEmitPrivate()
2485 llvm::Constant *
2501 static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM,
2505 static llvm::Constant *EmitNullConstant(CodeGenModule &CGM, in EmitNullConstant()
2514 std::vector<llvm::Constant *> elements(numElements); in EmitNullConstant()
2586 elements[i] = llvm::Constant::getNullValue(structure->getElementType(i)); in EmitNullConstant()
2592 /// Emit the null constant for a base subobject.
2593 static llvm::Constant *EmitNullConstantForBase(CodeGenModule &CGM, in EmitNullConstantForBase()
2600 return llvm::Constant::getNullValue(baseType); in EmitNullConstantForBase()
2602 // Otherwise, we can just use its null constant. in EmitNullConstantForBase()
2606 llvm::Constant *ConstantEmitter::emitNullForMemory(CodeGenModule &CGM, in emitNullForMemory()
2611 llvm::Constant *CodeGenModule::EmitNullConstant(QualType T) { in EmitNullConstant()
2617 return llvm::Constant::getNullValue(getTypes().ConvertTypeForMem(T)); in EmitNullConstant()
2625 llvm::Constant *Element = in EmitNullConstant()
2628 SmallVector<llvm::Constant *, 8> Array(NumElements, Element); in EmitNullConstant()
2641 llvm::Constant *