================ @@ -6358,3 +6359,89 @@ RValue CodeGenFunction::EmitPseudoObjectRValue(const PseudoObjectExpr *E, LValue CodeGenFunction::EmitPseudoObjectLValue(const PseudoObjectExpr *E) { return emitPseudoObjectExpr(*this, E, true, AggValueSlot::ignored()).LV; } + +void CodeGenFunction::FlattenAccessAndType( + Address Addr, QualType AddrType, + SmallVectorImpl<std::pair<Address, llvm::Value *>> &AccessList, + SmallVectorImpl<QualType> &FlatTypes) { + // WorkList is list of type we are processing + the Index List to access + // the field of that type in Addr for use in a GEP + llvm::SmallVector<std::pair<QualType, llvm::SmallVector<llvm::Value *, 4>>, + 16> + WorkList; + llvm::IntegerType *IdxTy = llvm::IntegerType::get(getLLVMContext(), 32); + WorkList.push_back( + {AddrType, + {llvm::ConstantInt::get( + IdxTy, + 0)}}); // Addr should be a pointer so we need to 'dereference' it + + while (!WorkList.empty()) { + std::pair<QualType, llvm::SmallVector<llvm::Value *, 4>> P = + WorkList.pop_back_val(); + QualType T = P.first; + llvm::SmallVector<llvm::Value *, 4> IdxList = P.second; + T = T.getCanonicalType().getUnqualifiedType(); + assert(!isa<MatrixType>(T) && "Matrix types not yet supported in HLSL"); + if (const auto *CAT = dyn_cast<ConstantArrayType>(T)) { + uint64_t Size = CAT->getZExtSize(); + for (int64_t i = Size - 1; i > -1; i--) { ---------------- V-FEXrt wrote:
nit: `i` should be `I` https://llvm.org/docs/CodingStandards.html#name-types-functions-variables-and-enumerators-properly aside: At least for my setup, using a lower case, even in loops, raises a warning https://github.com/llvm/llvm-project/pull/118842 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits