6060#include "llvm/Support/ScopedPrinter.h"
6161#include "llvm/TargetParser/AArch64TargetParser.h"
6262#include "llvm/TargetParser/X86TargetParser.h"
63+ #include <algorithm>
6364#include <optional>
6465#include <sstream>
6566
@@ -2468,7 +2469,12 @@ void ClearPaddingStruct(CodeGenFunction &CGF, Value *Ptr, QualType Ty, StructTyp
24682469 size_t CurrentStartOffset, size_t &RunningOffset, T&& WriteZeroAtOffset) {
24692470 std::cerr << "\n struct! " << ST->getName().data() << std::endl;
24702471 auto SL = CGF.CGM.getModule().getDataLayout().getStructLayout(ST);
2471- auto R = cast<CXXRecordDecl>(Ty->getAsRecordDecl());
2472+
2473+ auto R = dyn_cast<CXXRecordDecl>(Ty->getAsRecordDecl());
2474+ if(!R) {
2475+ std::cerr << "\n not a CXXRecordDecl" << std::endl;
2476+
2477+ }
24722478 const ASTRecordLayout &ASTLayout = CGF.getContext().getASTRecordLayout(R);
24732479 for (auto Base : R->bases()) {
24742480 std::cerr << "\n\n base!" << std::endl;
@@ -2546,16 +2552,18 @@ void RecursivelyClearPaddingImpl(CodeGenFunction &CGF, Value *Ptr, QualType Ty,
25462552 if (auto *AT = dyn_cast<ConstantArrayType>(Ty)) {
25472553 ClearPaddingConstantArray(CGF, Ptr, Type, AT, CurrentStartOffset, RunningOffset, WriteZeroAtOffset);
25482554 }
2549- else if (auto *ST = dyn_cast<StructType>(Type)) {
2555+ else if (auto *ST = dyn_cast<StructType>(Type); ST && Ty->isRecordType() ) {
25502556 ClearPaddingStruct(CGF, Ptr, Ty, ST, CurrentStartOffset, RunningOffset, WriteZeroAtOffset);
2557+ } else if (Ty->isAtomicType()) {
2558+ RecursivelyClearPaddingImpl(CGF, Ptr, Ty.getAtomicUnqualifiedType(), CurrentStartOffset, RunningOffset, WriteZeroAtOffset);
25512559 } else {
25522560 std::cerr << "\n\n increment running offset from: " << RunningOffset << " to " << RunningOffset + Size << std::endl;
2553- RunningOffset += Size;
2561+ RunningOffset = std::max(RunningOffset, CurrentStartOffset + static_cast<size_t>( Size)) ;
25542562 }
25552563
25562564}
25572565
2558- static void RecursivelyZeroNonValueBits (CodeGenFunction &CGF, Value *Ptr,
2566+ static void RecursivelyClearPadding (CodeGenFunction &CGF, Value *Ptr,
25592567 QualType Ty) {
25602568 auto *I8Ptr = CGF.Builder.CreateBitCast(Ptr, CGF.Int8PtrTy);
25612569 auto *Zero = ConstantInt::get(CGF.Int8Ty, 0);
@@ -2577,8 +2585,8 @@ static void RecursivelyZeroNonValueBits(CodeGenFunction &CGF, Value *Ptr,
25772585
25782586 auto Size = CGF.CGM.getModule()
25792587 .getDataLayout()
2580- .getTypeSizeInBits (Type)
2581- .getKnownMinValue() / 8 ;
2588+ .getTypeAllocSize (Type)
2589+ .getKnownMinValue();
25822590
25832591 std::cerr << "\n\n zero tail padding ["<< RunningOffset << ", " << Size << ")"<< std::endl;
25842592 for (; RunningOffset < Size; ++RunningOffset) {
@@ -4445,11 +4453,11 @@ RValue CodeGenFunction::EmitBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
44454453
44464454 return RValue::get(Ptr);
44474455 }
4448- case Builtin::BI__builtin_zero_non_value_bits : {
4456+ case Builtin::BI__builtin_clear_padding : {
44494457 const Expr *Op = E->getArg(0);
44504458 Value *Address = EmitScalarExpr(Op);
44514459 auto PointeeTy = Op->getType()->getPointeeType();
4452- RecursivelyZeroNonValueBits (*this, Address, PointeeTy);
4460+ RecursivelyClearPadding (*this, Address, PointeeTy);
44534461 return RValue::get(nullptr);
44544462 }
44554463 case Builtin::BI__sync_fetch_and_add:
0 commit comments