Skip to content

Commit 5f87402

Browse files
committed
First round of cleanup after review feedback
1 parent f715d55 commit 5f87402

File tree

5 files changed

+54
-76
lines changed

5 files changed

+54
-76
lines changed

clang/lib/CodeGen/CGCXXABI.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,10 +251,9 @@ class CGCXXABI {
251251

252252
public:
253253
virtual void emitVirtualObjectDelete(CodeGenFunction &CGF,
254-
const CXXDeleteExpr *DE, Address Ptr,
255-
QualType ElementType,
256-
const CXXDestructorDecl *Dtor,
257-
bool ArrayDeletion) = 0;
254+
const CXXDeleteExpr *DE,
255+
Address Ptr, QualType ElementType,
256+
const CXXDestructorDecl *Dtor) = 0;
258257
virtual void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) = 0;
259258
virtual void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) = 0;
260259
virtual llvm::GlobalVariable *getThrowInfo(QualType T) { return nullptr; }
@@ -487,10 +486,11 @@ class CGCXXABI {
487486
llvm::PointerUnion<const CXXDeleteExpr *, const CXXMemberCallExpr *>;
488487

489488
/// Emit the ABI-specific virtual destructor call.
490-
virtual llvm::Value *EmitVirtualDestructorCall(
491-
CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
492-
Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke,
493-
bool ArrayDeletion = false) = 0;
489+
virtual llvm::Value *
490+
EmitVirtualDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *Dtor,
491+
CXXDtorType DtorType, Address This,
492+
DeleteOrMemberCallExpr E,
493+
llvm::CallBase **CallOrInvoke) = 0;
494494

495495
virtual void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF,
496496
GlobalDecl GD,

clang/lib/CodeGen/CGClass.cpp

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1433,28 +1433,17 @@ static bool CanSkipVTablePointerInitialization(CodeGenFunction &CGF,
14331433
return true;
14341434
}
14351435

1436-
namespace {
1437-
llvm::Value *LoadThisForDtorDelete(CodeGenFunction &CGF,
1438-
const CXXDestructorDecl *DD) {
1439-
if (Expr *ThisArg = DD->getOperatorDeleteThisArg())
1440-
return CGF.EmitScalarExpr(ThisArg);
1441-
return CGF.LoadCXXThis();
1442-
}
1443-
} // namespace
1444-
1445-
void EmitConditionalArrayDtorCall(const CXXDestructorDecl *DD,
1446-
CodeGenFunction &CGF,
1447-
llvm::Value *ShouldDeleteCondition) {
1436+
static void EmitConditionalArrayDtorCall(const CXXDestructorDecl *DD,
1437+
CodeGenFunction &CGF,
1438+
llvm::Value *ShouldDeleteCondition) {
14481439
Address ThisPtr = CGF.LoadCXXThisAddress();
14491440
llvm::BasicBlock *ScalarBB = CGF.createBasicBlock("dtor.scalar");
14501441
llvm::BasicBlock *callDeleteBB =
14511442
CGF.createBasicBlock("dtor.call_delete_after_array_destroy");
14521443
llvm::BasicBlock *VectorBB = CGF.createBasicBlock("dtor.vector");
14531444
auto *CondTy = cast<llvm::IntegerType>(ShouldDeleteCondition->getType());
14541445
llvm::Value *CheckTheBitForArrayDestroy = CGF.Builder.CreateAnd(
1455-
ShouldDeleteCondition,
1456-
llvm::Constant::getIntegerValue(CondTy, llvm::APInt(CondTy->getBitWidth(),
1457-
/*val=*/2)));
1446+
ShouldDeleteCondition, llvm::ConstantInt::get(CondTy, 2));
14581447
llvm::Value *ShouldDestroyArray =
14591448
CGF.Builder.CreateIsNull(CheckTheBitForArrayDestroy);
14601449
CGF.Builder.CreateCondBr(ShouldDestroyArray, ScalarBB, VectorBB);
@@ -1492,9 +1481,7 @@ void EmitConditionalArrayDtorCall(const CXXDestructorDecl *DD,
14921481
CGF.EmitBlock(VectorBBCont);
14931482

14941483
llvm::Value *CheckTheBitForDeleteCall = CGF.Builder.CreateAnd(
1495-
ShouldDeleteCondition,
1496-
llvm::Constant::getIntegerValue(CondTy, llvm::APInt(CondTy->getBitWidth(),
1497-
/*val=*/1)));
1484+
ShouldDeleteCondition, llvm::ConstantInt::get(CondTy, 1));
14981485

14991486
llvm::Value *ShouldCallDelete =
15001487
CGF.Builder.CreateIsNull(CheckTheBitForDeleteCall);
@@ -1648,6 +1635,12 @@ void CodeGenFunction::emitImplicitAssignmentOperatorBody(FunctionArgList &Args)
16481635
}
16491636

16501637
namespace {
1638+
llvm::Value *LoadThisForDtorDelete(CodeGenFunction &CGF,
1639+
const CXXDestructorDecl *DD) {
1640+
if (Expr *ThisArg = DD->getOperatorDeleteThisArg())
1641+
return CGF.EmitScalarExpr(ThisArg);
1642+
return CGF.LoadCXXThis();
1643+
}
16511644
/// Call the operator delete associated with the current destructor.
16521645
struct CallDtorDelete final : EHScopeStack::Cleanup {
16531646
CallDtorDelete() {}
@@ -1668,9 +1661,7 @@ namespace {
16681661
llvm::BasicBlock *continueBB = CGF.createBasicBlock("dtor.continue");
16691662
auto *CondTy = cast<llvm::IntegerType>(ShouldDeleteCondition->getType());
16701663
llvm::Value *CheckTheBit = CGF.Builder.CreateAnd(
1671-
ShouldDeleteCondition, llvm::Constant::getIntegerValue(
1672-
CondTy, llvm::APInt(CondTy->getBitWidth(),
1673-
/*val=*/1)));
1664+
ShouldDeleteCondition, llvm::ConstantInt::get(CondTy, 1));
16741665
llvm::Value *ShouldCallDelete = CGF.Builder.CreateIsNull(CheckTheBit);
16751666
CGF.Builder.CreateCondBr(ShouldCallDelete, continueBB, callDeleteBB);
16761667

clang/lib/CodeGen/CGExprCXX.cpp

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,8 +1904,8 @@ static void EmitDestroyingObjectDelete(CodeGenFunction &CGF,
19041904
QualType ElementType) {
19051905
auto *Dtor = ElementType->getAsCXXRecordDecl()->getDestructor();
19061906
if (Dtor && Dtor->isVirtual())
1907-
CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType, Dtor,
1908-
/*ArrayDeletion=*/false);
1907+
CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1908+
Dtor);
19091909
else
19101910
CGF.EmitDeleteCall(DE->getOperatorDelete(), Ptr.emitRawPointer(CGF),
19111911
ElementType);
@@ -1916,8 +1916,7 @@ static void EmitDestroyingObjectDelete(CodeGenFunction &CGF,
19161916
/// if not.
19171917
static bool EmitObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
19181918
Address Ptr, QualType ElementType,
1919-
llvm::BasicBlock *UnconditionalDeleteBlock,
1920-
bool ArrayDeletion) {
1919+
llvm::BasicBlock *UnconditionalDeleteBlock) {
19211920
// C++11 [expr.delete]p3:
19221921
// If the static type of the object to be deleted is different from its
19231922
// dynamic type, the static type shall be a base class of the dynamic type
@@ -1962,7 +1961,7 @@ static bool EmitObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
19621961
}
19631962
if (UseVirtualCall) {
19641963
CGF.CGM.getCXXABI().emitVirtualObjectDelete(CGF, DE, Ptr, ElementType,
1965-
Dtor, ArrayDeletion);
1964+
Dtor);
19661965
return false;
19671966
}
19681967
}
@@ -2148,9 +2147,7 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
21482147

21492148
auto *CondTy = cast<llvm::IntegerType>(NumElements->getType());
21502149
llvm::Value *isEmpty = Builder.CreateICmpEQ(
2151-
NumElements, llvm::Constant::getIntegerValue(
2152-
CondTy, llvm::APInt(CondTy->getBitWidth(),
2153-
/*val=*/0)));
2150+
NumElements, llvm::ConstantInt::get(CondTy, 0));
21542151
Builder.CreateCondBr(isEmpty, doneBB, bodyBB);
21552152

21562153
// Delete cookie for empty array.
@@ -2161,8 +2158,7 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
21612158
EmitBranch(DeleteEnd);
21622159

21632160
EmitBlock(bodyBB);
2164-
if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd,
2165-
/*ArrayDeletion*/ true))
2161+
if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd))
21662162
EmitBlock(DeleteEnd);
21672163
return;
21682164
}
@@ -2173,7 +2169,7 @@ void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
21732169
EmitArrayDelete(*this, E, Ptr, DeleteTy);
21742170
EmitBlock(DeleteEnd);
21752171
} else {
2176-
if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd, E->isArrayForm()))
2172+
if (!EmitObjectDelete(*this, E, Ptr, DeleteTy, DeleteEnd))
21772173
EmitBlock(DeleteEnd);
21782174
}
21792175
}

clang/lib/CodeGen/ItaniumCXXABI.cpp

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,7 @@ class ItaniumCXXABI : public CodeGen::CGCXXABI {
161161

162162
void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
163163
Address Ptr, QualType ElementType,
164-
const CXXDestructorDecl *Dtor,
165-
bool ArrayDeletion = false) override;
164+
const CXXDestructorDecl *Dtor) override;
166165

167166
void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
168167
void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
@@ -318,12 +317,11 @@ class ItaniumCXXABI : public CodeGen::CGCXXABI {
318317
Address This, llvm::Type *Ty,
319318
SourceLocation Loc) override;
320319

321-
llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
322-
const CXXDestructorDecl *Dtor,
323-
CXXDtorType DtorType, Address This,
324-
DeleteOrMemberCallExpr E,
325-
llvm::CallBase **CallOrInvoke,
326-
bool ArrayDeletion = false) override;
320+
llvm::Value *
321+
EmitVirtualDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *Dtor,
322+
CXXDtorType DtorType, Address This,
323+
DeleteOrMemberCallExpr E,
324+
llvm::CallBase **CallOrInvoke) override;
327325

328326
void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
329327

@@ -1374,9 +1372,9 @@ bool ItaniumCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
13741372
/// at entry -2 in the vtable.
13751373
void ItaniumCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
13761374
const CXXDeleteExpr *DE,
1377-
Address Ptr, QualType ElementType,
1378-
const CXXDestructorDecl *Dtor,
1379-
bool ArrayDeletion) {
1375+
Address Ptr,
1376+
QualType ElementType,
1377+
const CXXDestructorDecl *Dtor) {
13801378
bool UseGlobalDelete = DE->isGlobalDelete();
13811379
if (UseGlobalDelete) {
13821380
// Derive the complete-object pointer, which is what we need
@@ -2246,8 +2244,7 @@ CGCallee ItaniumCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
22462244

22472245
llvm::Value *ItaniumCXXABI::EmitVirtualDestructorCall(
22482246
CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
2249-
Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke,
2250-
bool ArrayDeletion) {
2247+
Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke) {
22512248
auto *CE = dyn_cast<const CXXMemberCallExpr *>(E);
22522249
auto *D = dyn_cast<const CXXDeleteExpr *>(E);
22532250
assert((CE != nullptr) ^ (D != nullptr));

clang/lib/CodeGen/MicrosoftCXXABI.cpp

Lines changed: 17 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,7 @@ class MicrosoftCXXABI : public CGCXXABI {
120120

121121
void emitVirtualObjectDelete(CodeGenFunction &CGF, const CXXDeleteExpr *DE,
122122
Address Ptr, QualType ElementType,
123-
const CXXDestructorDecl *Dtor,
124-
bool ArrayDeletion) override;
123+
const CXXDestructorDecl *Dtor) override;
125124

126125
void emitRethrow(CodeGenFunction &CGF, bool isNoReturn) override;
127126
void emitThrow(CodeGenFunction &CGF, const CXXThrowExpr *E) override;
@@ -336,12 +335,11 @@ class MicrosoftCXXABI : public CGCXXABI {
336335
Address This, llvm::Type *Ty,
337336
SourceLocation Loc) override;
338337

339-
llvm::Value *EmitVirtualDestructorCall(CodeGenFunction &CGF,
340-
const CXXDestructorDecl *Dtor,
341-
CXXDtorType DtorType, Address This,
342-
DeleteOrMemberCallExpr E,
343-
llvm::CallBase **CallOrInvoke,
344-
bool ArrayDeletion) override;
338+
llvm::Value *
339+
EmitVirtualDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *Dtor,
340+
CXXDtorType DtorType, Address This,
341+
DeleteOrMemberCallExpr E,
342+
llvm::CallBase **CallOrInvoke) override;
345343

346344
void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF, GlobalDecl GD,
347345
CallArgList &CallArgs) override {
@@ -891,16 +889,15 @@ MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const {
891889

892890
void MicrosoftCXXABI::emitVirtualObjectDelete(CodeGenFunction &CGF,
893891
const CXXDeleteExpr *DE,
894-
Address Ptr, QualType ElementType,
895-
const CXXDestructorDecl *Dtor,
896-
bool ArrayDeletion) {
892+
Address Ptr,
893+
QualType ElementType,
894+
const CXXDestructorDecl *Dtor) {
897895
// FIXME: Provide a source location here even though there's no
898896
// CXXMemberCallExpr for dtor call.
899897
bool UseGlobalDelete = DE->isGlobalDelete();
900898
CXXDtorType DtorType = UseGlobalDelete ? Dtor_Complete : Dtor_Deleting;
901-
llvm::Value *MDThis =
902-
EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE,
903-
/*CallOrInvoke=*/nullptr, ArrayDeletion);
899+
llvm::Value *MDThis = EmitVirtualDestructorCall(CGF, Dtor, DtorType, Ptr, DE,
900+
/*CallOrInvoke=*/nullptr);
904901
if (UseGlobalDelete)
905902
CGF.EmitDeleteCall(DE->getOperatorDelete(), MDThis, ElementType);
906903
}
@@ -2005,8 +2002,7 @@ CGCallee MicrosoftCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
20052002

20062003
llvm::Value *MicrosoftCXXABI::EmitVirtualDestructorCall(
20072004
CodeGenFunction &CGF, const CXXDestructorDecl *Dtor, CXXDtorType DtorType,
2008-
Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke,
2009-
bool ArrayDeletion) {
2005+
Address This, DeleteOrMemberCallExpr E, llvm::CallBase **CallOrInvoke) {
20102006
auto *CE = dyn_cast<const CXXMemberCallExpr *>(E);
20112007
auto *D = dyn_cast<const CXXDeleteExpr *>(E);
20122008
assert((CE != nullptr) ^ (D != nullptr));
@@ -2023,9 +2019,8 @@ llvm::Value *MicrosoftCXXABI::EmitVirtualDestructorCall(
20232019
CGCallee Callee = CGCallee::forVirtual(CE, GD, This, Ty);
20242020

20252021
ASTContext &Context = getContext();
2026-
llvm::Value *ImplicitParam = llvm::ConstantInt::get(
2027-
llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()),
2028-
2 * (ArrayDeletion) + (DtorType == Dtor_Deleting));
2022+
uint32_t Flags = ((D && D->isArrayForm()) << 1) | (DtorType == Dtor_Deleting);
2023+
llvm::Value *ImplicitParam = CGF.Builder.getInt32(Flags);
20292024

20302025
QualType ThisTy;
20312026
if (CE) {
@@ -4067,14 +4062,13 @@ void MicrosoftCXXABI::emitCXXStructor(GlobalDecl GD) {
40674062

40684063
if (GD.getDtorType() == Dtor_VectorDeleting &&
40694064
!CGM.classNeedsVectorDestructor(dtor->getParent())) {
4070-
// Create GlobalDecl objects with the correct type for the vector and scalar
4071-
// deleting destructors.
4072-
GlobalDecl VectorDtorGD(dtor, Dtor_VectorDeleting);
4065+
// Create GlobalDecl object with the correct type for the scalar
4066+
// deleting destructor.
40734067
GlobalDecl ScalarDtorGD(dtor, Dtor_Deleting);
40744068

40754069
// Emit an alias from the vector deleting destructor to the scalar deleting
40764070
// destructor.
4077-
CGM.EmitDefinitionAsAlias(VectorDtorGD, ScalarDtorGD);
4071+
CGM.EmitDefinitionAsAlias(GD, ScalarDtorGD);
40784072
return;
40794073
}
40804074

0 commit comments

Comments
 (0)