zoecarver created this revision. zoecarver added reviewers: rjmccall, mboehme. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Adds `CodeGen::emitCXXDestructorCall`, a function that creates a CodeGenFunction using the arguments provided, then invokes CodeGenFunction::EmitCXXDestructorCall. This will allow other frontends (Swift, for example) to easily emit calls to object destructors with correct ABI semantics and calling convetions. This is needed for Swift C++ interop. Here's the corresponding Swift change: https://github.com/apple/swift/pull/32291 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D82392 Files: clang/include/clang/CodeGen/CodeGenABITypes.h clang/lib/CodeGen/ABIInfo.h clang/lib/CodeGen/CGCall.cpp clang/lib/CodeGen/CodeGenABITypes.cpp
Index: clang/lib/CodeGen/CodeGenABITypes.cpp =================================================================== --- clang/lib/CodeGen/CodeGenABITypes.cpp +++ clang/lib/CodeGen/CodeGenABITypes.cpp @@ -115,3 +115,20 @@ const FieldDecl *FD) { return CGM.getTypes().getCGRecordLayout(RD).getLLVMFieldNo(FD); } + +void CodeGen::emitCXXDestructorCall(CodeGenModule &CGM, + llvm::BasicBlock *InsertBlock, + llvm::BasicBlock::iterator InsertPoint, + const CXXDestructorDecl *D, + CXXDtorType Type, bool ForVirtualBase, + bool Delegating, llvm::Value *This, + CharUnits ThisAlign, QualType ThisTy) { + Address ThisAddr(This, ThisAlign); + CodeGenFunction CGF(CGM); + CGF.CurCodeDecl = D; + CGF.CurFuncDecl = D; + CGF.CurFn = InsertBlock->getParent(); + CGF.Builder.SetInsertPoint(InsertBlock, InsertPoint); + CGF.EmitCXXDestructorCall(D, Type, ForVirtualBase, Delegating, ThisAddr, + ThisTy); +} Index: clang/lib/CodeGen/CGCall.cpp =================================================================== --- clang/lib/CodeGen/CGCall.cpp +++ clang/lib/CodeGen/CGCall.cpp @@ -1462,9 +1462,10 @@ case ABIArgInfo::Extend: case ABIArgInfo::Direct: { // FIXME: handle sseregparm someday... - llvm::StructType *STy = dyn_cast<llvm::StructType>(AI.getCoerceToType()); - if (AI.isDirect() && AI.getCanBeFlattened() && STy) { - IRArgs.NumberOfArgs = STy->getNumElements(); + llvm::Type *Ty = AI.getCoerceToType(); + if (AI.isDirect() && AI.getCanBeFlattened() && + isa<llvm::StructType>(Ty)) { + IRArgs.NumberOfArgs = cast<llvm::StructType>(Ty)->getNumElements(); } else { IRArgs.NumberOfArgs = 1; } @@ -1644,8 +1645,9 @@ // Fast-isel and the optimizer generally like scalar values better than // FCAs, so we flatten them if this is safe to do for this argument. llvm::Type *argType = ArgInfo.getCoerceToType(); - llvm::StructType *st = dyn_cast<llvm::StructType>(argType); - if (st && ArgInfo.isDirect() && ArgInfo.getCanBeFlattened()) { + if (ArgInfo.isDirect() && ArgInfo.getCanBeFlattened() && + isa<llvm::StructType>(argType)) { + llvm::StructType *st = cast<llvm::StructType>(argType); assert(NumIRArgs == st->getNumElements()); for (unsigned i = 0, e = st->getNumElements(); i != e; ++i) ArgTypes[FirstIRArg + i] = st->getElementType(i); Index: clang/lib/CodeGen/ABIInfo.h =================================================================== --- clang/lib/CodeGen/ABIInfo.h +++ clang/lib/CodeGen/ABIInfo.h @@ -28,7 +28,6 @@ namespace CodeGen { class ABIArgInfo; - class Address; class CGCXXABI; class CGFunctionInfo; class CodeGenFunction; Index: clang/include/clang/CodeGen/CodeGenABITypes.h =================================================================== --- clang/include/clang/CodeGen/CodeGenABITypes.h +++ clang/include/clang/CodeGen/CodeGenABITypes.h @@ -25,7 +25,9 @@ #include "clang/AST/CanonicalType.h" #include "clang/AST/Type.h" +#include "clang/Basic/ABI.h" #include "clang/CodeGen/CGFunctionInfo.h" +#include "llvm/IR/BasicBlock.h" namespace llvm { class AttrBuilder; @@ -40,6 +42,7 @@ namespace clang { class ASTContext; class CXXConstructorDecl; +class CXXDestructorDecl; class CXXRecordDecl; class CXXMethodDecl; class CodeGenOptions; @@ -49,6 +52,7 @@ class ObjCMethodDecl; class ObjCProtocolDecl; class PreprocessorOptions; +class QualType; namespace CodeGen { class CGFunctionInfo; @@ -90,6 +94,13 @@ ImplicitCXXConstructorArgs getImplicitCXXConstructorArgs(CodeGenModule &CGM, const CXXConstructorDecl *D); +void emitCXXDestructorCall(CodeGenModule &CGM, llvm::BasicBlock *InsertBlock, + llvm::BasicBlock::iterator InsertPoint, + const CXXDestructorDecl *D, CXXDtorType Type, + bool ForVirtualBase, bool Delegating, + llvm::Value *This, CharUnits ThisAlign, + QualType ThisTy); + /// Returns null if the function type is incomplete and can't be lowered. llvm::FunctionType *convertFreeFunctionType(CodeGenModule &CGM, const FunctionDecl *FD);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits