@@ -90,8 +90,100 @@ class ConstExprEmitter
9090 }
9191
9292 mlir::Attribute VisitCastExpr (CastExpr *e, QualType destType) {
93- cgm.errorNYI (e->getBeginLoc (), " ConstExprEmitter::VisitCastExpr" );
94- return {};
93+ if (const auto *ece = dyn_cast<ExplicitCastExpr>(e))
94+ cgm.errorNYI (e->getBeginLoc (),
95+ " ConstExprEmitter::VisitCastExpr explicit cast" );
96+ Expr *subExpr = e->getSubExpr ();
97+
98+ switch (e->getCastKind ()) {
99+ case CK_HLSLArrayRValue:
100+ case CK_HLSLVectorTruncation:
101+ case CK_HLSLElementwiseCast:
102+ case CK_HLSLAggregateSplatCast:
103+ case CK_ToUnion:
104+ case CK_AddressSpaceConversion:
105+ case CK_ReinterpretMemberPointer:
106+ case CK_DerivedToBaseMemberPointer:
107+ case CK_BaseToDerivedMemberPointer:
108+ cgm.errorNYI (e->getBeginLoc (), " ConstExprEmitter::VisitCastExpr" );
109+ return {};
110+
111+ case CK_LValueToRValue:
112+ case CK_AtomicToNonAtomic:
113+ case CK_NonAtomicToAtomic:
114+ case CK_NoOp:
115+ case CK_ConstructorConversion:
116+ return Visit (subExpr, destType);
117+
118+ case CK_IntToOCLSampler:
119+ llvm_unreachable (" global sampler variables are not generated" );
120+
121+ case CK_Dependent:
122+ llvm_unreachable (" saw dependent cast!" );
123+
124+ case CK_BuiltinFnToFnPtr:
125+ llvm_unreachable (" builtin functions are handled elsewhere" );
126+
127+ // These will never be supported.
128+ case CK_ObjCObjectLValueCast:
129+ case CK_ARCProduceObject:
130+ case CK_ARCConsumeObject:
131+ case CK_ARCReclaimReturnedObject:
132+ case CK_ARCExtendBlockObject:
133+ case CK_CopyAndAutoreleaseBlockObject:
134+ return {};
135+
136+ // These don't need to be handled here because Evaluate knows how to
137+ // evaluate them in the cases where they can be folded.
138+ case CK_BitCast:
139+ case CK_ToVoid:
140+ case CK_Dynamic:
141+ case CK_LValueBitCast:
142+ case CK_LValueToRValueBitCast:
143+ case CK_NullToMemberPointer:
144+ case CK_UserDefinedConversion:
145+ case CK_CPointerToObjCPointerCast:
146+ case CK_BlockPointerToObjCPointerCast:
147+ case CK_AnyPointerToBlockPointerCast:
148+ case CK_ArrayToPointerDecay:
149+ case CK_FunctionToPointerDecay:
150+ case CK_BaseToDerived:
151+ case CK_DerivedToBase:
152+ case CK_UncheckedDerivedToBase:
153+ case CK_MemberPointerToBoolean:
154+ case CK_VectorSplat:
155+ case CK_FloatingRealToComplex:
156+ case CK_FloatingComplexToReal:
157+ case CK_FloatingComplexToBoolean:
158+ case CK_FloatingComplexCast:
159+ case CK_FloatingComplexToIntegralComplex:
160+ case CK_IntegralRealToComplex:
161+ case CK_IntegralComplexToReal:
162+ case CK_IntegralComplexToBoolean:
163+ case CK_IntegralComplexCast:
164+ case CK_IntegralComplexToFloatingComplex:
165+ case CK_PointerToIntegral:
166+ case CK_PointerToBoolean:
167+ case CK_NullToPointer:
168+ case CK_IntegralCast:
169+ case CK_BooleanToSignedIntegral:
170+ case CK_IntegralToPointer:
171+ case CK_IntegralToBoolean:
172+ case CK_IntegralToFloating:
173+ case CK_FloatingToIntegral:
174+ case CK_FloatingToBoolean:
175+ case CK_FloatingCast:
176+ case CK_FloatingToFixedPoint:
177+ case CK_FixedPointToFloating:
178+ case CK_FixedPointCast:
179+ case CK_FixedPointToBoolean:
180+ case CK_FixedPointToIntegral:
181+ case CK_IntegralToFixedPoint:
182+ case CK_ZeroToOCLOpaqueType:
183+ case CK_MatrixCast:
184+ return {};
185+ }
186+ llvm_unreachable (" Invalid CastKind" );
95187 }
96188
97189 mlir::Attribute VisitCXXDefaultInitExpr (CXXDefaultInitExpr *die, QualType t) {
@@ -118,7 +210,26 @@ class ConstExprEmitter
118210 }
119211
120212 mlir::Attribute VisitInitListExpr (InitListExpr *ile, QualType t) {
121- cgm.errorNYI (ile->getBeginLoc (), " ConstExprEmitter::VisitInitListExpr" );
213+ if (ile->isTransparent ())
214+ return Visit (ile->getInit (0 ), t);
215+
216+ if (ile->getType ()->isArrayType ()) {
217+ // If we return null here, the non-constant initializer will take care of
218+ // it, but we would prefer to handle it here.
219+ assert (!cir::MissingFeatures::constEmitterArrayILE ());
220+ return {};
221+ }
222+
223+ if (ile->getType ()->isRecordType ())
224+ cgm.errorNYI (ile->getBeginLoc (), " ConstExprEmitter: record ILE" );
225+
226+ if (ile->getType ()->isVectorType ()) {
227+ // If we return null here, the non-constant initializer will take care of
228+ // it, but we would prefer to handle it here.
229+ assert (!cir::MissingFeatures::constEmitterVectorILE ());
230+ return {};
231+ }
232+
122233 return {};
123234 }
124235
@@ -218,12 +329,32 @@ emitArrayConstant(CIRGenModule &cgm, mlir::Type desiredType,
218329// ConstantEmitter
219330// ===----------------------------------------------------------------------===//
220331
332+ mlir::Attribute ConstantEmitter::tryEmitForInitializer (const VarDecl &d) {
333+ initializeNonAbstract ();
334+ return markIfFailed (tryEmitPrivateForVarInit (d));
335+ }
336+
337+ void ConstantEmitter::finalize (cir::GlobalOp gv) {
338+ assert (initializedNonAbstract &&
339+ " finalizing emitter that was used for abstract emission?" );
340+ assert (!finalized && " finalizing emitter multiple times" );
341+ assert (!gv.isDeclaration ());
342+
343+ // Note that we might also be Failed.
344+ finalized = true ;
345+ }
346+
221347mlir::Attribute
222348ConstantEmitter::tryEmitAbstractForInitializer (const VarDecl &d) {
223349 AbstractStateRAII state (*this , true );
224350 return tryEmitPrivateForVarInit (d);
225351}
226352
353+ ConstantEmitter::~ConstantEmitter () {
354+ assert ((!initializedNonAbstract || finalized || failed) &&
355+ " not finalized after being initialized for non-abstract emission" );
356+ }
357+
227358mlir::Attribute ConstantEmitter::tryEmitPrivateForVarInit (const VarDecl &d) {
228359 // Make a quick check if variable can be default NULL initialized
229360 // and avoid going through rest of code which may do, for c++11,
0 commit comments