Skip to content

Commit caaaa16

Browse files
committed
union, rename, scalar types
1 parent ff8a6ca commit caaaa16

File tree

7 files changed

+347
-143
lines changed

7 files changed

+347
-143
lines changed

clang/include/clang/Basic/Builtins.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -633,7 +633,7 @@ BUILTIN(__builtin_vsscanf, "icC*RcC*Ra", "FS:1:")
633633
BUILTIN(__builtin_thread_pointer, "v*", "nc")
634634
BUILTIN(__builtin_launder, "v*v*", "ntE")
635635
LANGBUILTIN(__builtin_is_constant_evaluated, "b", "nE", CXX_LANG)
636-
LANGBUILTIN(__builtin_zero_non_value_bits, "v.", "n", CXX_LANG)
636+
LANGBUILTIN(__builtin_clear_padding, "v.", "n", CXX_LANG)
637637

638638
// GCC exception builtins
639639
BUILTIN(__builtin_eh_return, "vzv*", "r") // FIXME: Takes intptr_t, not size_t!

clang/lib/CodeGen/CGBuiltin.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
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:

clang/lib/Sema/SemaChecking.cpp

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2327,24 +2327,23 @@ Sema::CheckBuiltinFunctionCall(FunctionDecl *FDecl, unsigned BuiltinID,
23272327
}
23282328
case Builtin::BI__builtin_launder:
23292329
return SemaBuiltinLaunder(*this, TheCall);
2330-
case Builtin::BI__builtin_zero_non_value_bits: {
2331-
// const Expr *PtrArg = TheCall->getArg(0)->IgnoreParenImpCasts();
2332-
// const QualType PtrArgType = PtrArg->getType();
2333-
// if (!PtrArgType->isPointerType() ||
2334-
// !PtrArgType->getPointeeType()->isRecordType()) {
2335-
// Diag(PtrArg->getBeginLoc(), diag::err_typecheck_convert_incompatible)
2336-
// << PtrArgType << "structure pointer" << 1 << 0 << 3 << 1 << PtrArgType
2337-
// << "structure pointer";
2338-
// return ExprError();
2339-
// }
2340-
// if (PtrArgType->getPointeeType().isConstQualified()) {
2341-
// Diag(PtrArg->getBeginLoc(), diag::err_typecheck_assign_const)
2342-
// << TheCall->getSourceRange() << 5 /*ConstUnknown*/;
2343-
// return ExprError();
2344-
// }
2345-
// if (RequireCompleteType(PtrArg->getBeginLoc(), PtrArgType->getPointeeType(),
2346-
// diag::err_typecheck_decl_incomplete_type))
2347-
// return ExprError();
2330+
case Builtin::BI__builtin_clear_padding: {
2331+
const Expr *PtrArg = TheCall->getArg(0)->IgnoreParenImpCasts();
2332+
const QualType PtrArgType = PtrArg->getType();
2333+
if (!PtrArgType->isPointerType()) {
2334+
Diag(PtrArg->getBeginLoc(), diag::err_typecheck_convert_incompatible)
2335+
<< PtrArgType << "pointer" << 1 << 0 << 3 << 1 << PtrArgType
2336+
<< "pointer";
2337+
return ExprError();
2338+
}
2339+
if (PtrArgType->getPointeeType().isConstQualified()) {
2340+
Diag(PtrArg->getBeginLoc(), diag::err_typecheck_assign_const)
2341+
<< TheCall->getSourceRange() << 5 /*ConstUnknown*/;
2342+
return ExprError();
2343+
}
2344+
if (RequireCompleteType(PtrArg->getBeginLoc(), PtrArgType->getPointeeType(),
2345+
diag::err_typecheck_decl_incomplete_type))
2346+
return ExprError();
23482347
break;
23492348
}
23502349
case Builtin::BI__sync_fetch_and_add:

clang/test/CodeGenCXX/builtin-zero-non-value-bits-codegen.cpp renamed to clang/test/CodeGenCXX/builtin-clear-padding-codegen.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ struct alignas(4) Baz : Foo {
4949
// CHECK: store i8 0, i8* [[PAD_7]]
5050
// CHECK: ret void
5151
void testBaz(Baz *baz) {
52-
__builtin_zero_non_value_bits(baz);
52+
__builtin_clear_padding(baz);
5353
}
5454

5555
struct UnsizedTail {
@@ -78,7 +78,7 @@ struct UnsizedTail {
7878
// CHECK: store i8 0, i8* [[PAD_4]]
7979
// CHECK: ret void
8080
void testUnsizedTail(UnsizedTail *u) {
81-
__builtin_zero_non_value_bits(u);
81+
__builtin_clear_padding(u);
8282
}
8383

8484
struct ArrOfStructsWithPadding {
@@ -108,5 +108,5 @@ struct ArrOfStructsWithPadding {
108108
// CHECK: store i8 0, i8* [[PAD_4]]
109109
// CHECK: ret void
110110
void testArrOfStructsWithPadding(ArrOfStructsWithPadding *arr) {
111-
__builtin_zero_non_value_bits(arr);
111+
__builtin_clear_padding(arr);
112112
}

0 commit comments

Comments
 (0)