================ @@ -326,13 +326,61 @@ mlir::Value CIRGenFunction::emitStoreThroughBitfieldLValue(RValue src, return {}; } +RValue CIRGenFunction::emitLoadOfBitfieldLValue(LValue lv, SourceLocation loc) { + const CIRGenBitFieldInfo &info = lv.getBitFieldInfo(); + + // Get the output type. + mlir::Type resLTy = convertType(lv.getType()); + Address ptr = lv.getBitFieldAddress(); + + assert(!cir::MissingFeatures::armComputeVolatileBitfields()); + + mlir::Value field = builder.createGetBitfield(getLoc(loc), resLTy, ptr.getPointer(), + ptr.getElementType(), info, + lv.isVolatile(), false); + assert(!cir::MissingFeatures::opLoadEmitScalarRangeCheck() && "NYI"); + return RValue::get(field); +} + +Address CIRGenFunction::getAddrOfBitFieldStorage(LValue base, + const FieldDecl *field, + mlir::Type fieldType, + unsigned index) { + mlir::Location loc = getLoc(field->getLocation()); + cir::PointerType fieldPtr = cir::PointerType::get(fieldType); + cir::GetMemberOp sea = getBuilder().createGetMember( + loc, fieldPtr, base.getPointer(), field->getName(), index); + return Address(sea, CharUnits::One()); +} + +LValue CIRGenFunction::emitLValueForBitField(LValue base, + const FieldDecl *field) { + LValueBaseInfo baseInfo = base.getBaseInfo(); + const CIRGenRecordLayout &layout = + cgm.getTypes().getCIRGenRecordLayout(field->getParent()); + const CIRGenBitFieldInfo &info = layout.getBitFieldInfo(field); + assert(!cir::MissingFeatures::armComputeVolatileBitfields()); + unsigned idx = layout.getCIRFieldNo(field); + ---------------- andykaylor wrote:
Can you add a missing feature marker here for `preservedAccessIndexRegion`? It's not in the incubator code, but classic codegen has something here that we're missing. https://github.com/llvm/llvm-project/pull/145971 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits