[clang] [CIR] Upstream get_bitfield operation to load bit-field members from structs (PR #145971)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Jun 28 16:06:51 PDT 2025
================
@@ -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);
+
----------------
Andres-Salamanca wrote:
Done
https://github.com/llvm/llvm-project/pull/145971
More information about the cfe-commits
mailing list