================
@@ -2698,6 +2700,326 @@ RValue CodeGenFunction::emitStdcFirstBit(const CallExpr
*E, Intrinsic::ID IntID,
return RValue::get(Result);
}
+namespace {
+
+// PaddingClearer is a utility class that clears padding bits in a
+// c/c++ type. It traverses the type recursively, collecting occupied
+// bit intervals, and then compute the padding intervals.
+// In the end, it clears the padding bits by writing zeros
+// to the padding intervals bytes-by-bytes. If a byte only contains
+// some padding bits, it writes zeros to only those bits. This is
+// the case for bit-fields.
+struct PaddingClearer {
+ PaddingClearer(CodeGenFunction &F)
+ : CGF(F), CharWidth(CGF.getContext().getCharWidth()) {}
+
+ void run(Address Src, QualType Ty) {
+ OccuppiedIntervals.clear();
+ Stack.clear();
+
+ Stack.push_back(Data{0, Ty, true});
+ while (!Stack.empty()) {
+ auto Current = Stack.back();
+ Stack.pop_back();
+ Visit(Current);
+ }
+
+ MergeOccuppiedIntervals();
+ auto PaddingIntervals =
+ GetPaddingIntervals(CGF.getContext().getTypeSize(Ty));
+ for (const auto &Interval : PaddingIntervals) {
+ ClearPadding(Src, Interval);
+ }
+ }
+
+private:
+ struct BitInterval {
+ // [First, Last)
+ uint64_t First;
+ uint64_t Last;
+ };
+
+ struct Data {
+ uint64_t StartBitOffset;
+ QualType Ty;
+ bool VisitVirtualBase;
+ };
+
+ uint64_t getScalarOccupiedSizeInBits(QualType Ty) const {
+ if (const auto *BIT = Ty->getAs<BitIntType>())
+ return BIT->getNumBits();
+
+ if (const auto *BT = Ty->getAs<BuiltinType>()) {
+ if (BT->getKind() == BuiltinType::LongDouble &&
+ &CGF.getTarget().getLongDoubleFormat() ==
+ &APFloat::x87DoubleExtended())
+ return APFloat::getSizeInBits(CGF.getTarget().getLongDoubleFormat());
----------------
huixie90 wrote:
@shafik
Previously I was using `getTypeSizeInBits` to get the value representation bits
of a type. And this review comment
https://github.com/llvm/llvm-project/pull/75371#discussion_r3174583429
suggested that it is not trustable and we should explicit list all the builtin
scalar types that we know have paddings. and the only thing we know is _BitInt
and x87 long double
https://github.com/llvm/llvm-project/pull/75371
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits