[clang] [llvm] Explicit types in cbuffer layouts (PR #156919)
Justin Bogner via llvm-commits
llvm-commits at lists.llvm.org
Mon Oct 6 08:52:09 PDT 2025
================
@@ -4678,6 +4678,26 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E,
emitArraySubscriptGEP(*this, Int8Ty, Addr.emitRawPointer(*this),
ScaledIdx, false, SignedIndices, E->getExprLoc());
Addr = Address(EltPtr, OrigBaseElemTy, EltAlign);
+ } else if (E->getType().getAddressSpace() == LangAS::hlsl_constant) {
+ // This is an array inside of a cbuffer.
+ Addr = EmitPointerWithAlignment(E->getBase(), &EltBaseInfo, &EltTBAAInfo);
+ auto *Idx = EmitIdxAfterBase(/*Promote*/true);
+
+ // ...
+ CharUnits RowAlignedSize = getContext()
+ .getTypeSizeInChars(E->getType())
+ .alignTo(CharUnits::fromQuantity(16));
+
+ llvm::Value *RowAlignedSizeVal =
+ llvm::ConstantInt::get(Idx->getType(), RowAlignedSize.getQuantity());
+ llvm::Value *ScaledIdx = Builder.CreateMul(Idx, RowAlignedSizeVal);
+
+ CharUnits EltAlign =
+ getArrayElementAlign(Addr.getAlignment(), Idx, RowAlignedSize);
+ llvm::Value *EltPtr =
+ emitArraySubscriptGEP(*this, Int8Ty, Addr.emitRawPointer(*this),
+ ScaledIdx, false, SignedIndices, E->getExprLoc());
----------------
bogner wrote:
I've tried this out in https://github.com/llvm/llvm-project/pull/156919/commits/92bd225443368a88319e97305b6d8a5f997ad37b (which still needs test updates). This looks mostly reasonable with the caveat that we do need a bit of a fictional type for this to work (the array with padding on all elements including the last one). Since we don't actually read the padding this is probably fine.
https://github.com/llvm/llvm-project/pull/156919
More information about the llvm-commits
mailing list