================
@@ -1181,6 +1182,36 @@ CIRGenFunction::emitArraySubscriptExpr(const
clang::ArraySubscriptExpr *e) {
return makeAddrLValue(addr, elementType, lv.getBaseInfo());
}
+ if (const VariableArrayType *vla =
+ getContext().getAsVariableArrayType(e->getType())) {
+ // The base must be a pointer, which is not an aggregate. Emit
+ // it. It needs to be emitted first in case it's what captures
+ // the VLA bounds.
+ Address addr = emitPointerWithAlignment(e->getBase());
+
+ // The element count here is the total number of non-VLA elements.
+ mlir::Value numElements = getVLASize(vla).numElts;
+ idx = builder.createIntCast(idx, numElements.getType());
+
+ // Effectively, the multiply by the VLA size is part of the GEP.
+ // GEP indexes are signed, and scaling an index isn't permitted to
+ // signed-overflow, so we use the same semantics for our explicit
+ // multiply. We suppress this if overflow is not undefined behavior.
+ OverflowBehavior overflowBehavior = getLangOpts().PointerOverflowDefined
+ ? OverflowBehavior::None
+ : OverflowBehavior::NoSignedWrap;
+ idx = builder.createMul(cgm.getLoc(e->getExprLoc()), idx, numElements,
+ overflowBehavior);
+
+ assert(!cir::MissingFeatures::emitCheckedInBoundsGEP());
----------------
andykaylor wrote:
This is already marked inside `emitArraySubscriptPtr`. Is there anything else
needed here?
https://github.com/llvm/llvm-project/pull/175370
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits