]> granicus.if.org Git - clang/commitdiff
Add code for emitting C++ destructors. Not used yet.
authorAnders Carlsson <andersca@mac.com>
Fri, 29 May 2009 21:03:38 +0000 (21:03 +0000)
committerAnders Carlsson <andersca@mac.com>
Fri, 29 May 2009 21:03:38 +0000 (21:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72591 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/DeclCXX.h
lib/AST/DeclCXX.cpp
lib/CodeGen/CGCXX.cpp
lib/CodeGen/CodeGenFunction.h
lib/CodeGen/CodeGenModule.cpp

index 85ca2503d76502065f76af3baaccaf38b70e0958..19adc6d8294893621f8695c469ebfd4937c89d70 100644 (file)
@@ -439,6 +439,9 @@ public:
     TemplateOrInstantiation = Template;
   }
 
+  /// getDestructor - Returns the destructor decl for this class.
+  const CXXDestructorDecl *getDestructor(ASTContext &Context);
+  
   /// viewInheritance - Renders and displays an inheritance diagram
   /// for this C++ class and all of its base classes (transitively) using
   /// GraphViz.
index 30d76cb9e3d3c59980cda8960690269021744aef..5b806fae7b827725e999ee363925a406c319b16e 100644 (file)
@@ -187,6 +187,23 @@ void CXXRecordDecl::addConversionFunction(ASTContext &Context,
   Conversions.addOverload(ConvDecl);
 }
 
+const CXXDestructorDecl *
+CXXRecordDecl::getDestructor(ASTContext &Context) {
+  QualType ClassType = Context.getTypeDeclType(this);
+
+  DeclarationName Name 
+    = Context.DeclarationNames.getCXXDestructorName(ClassType);
+
+  DeclContext::lookup_iterator I, E;
+  llvm::tie(I, E) = lookup(Context, Name); 
+  assert(I != E && "Did not find a destructor!");
+  
+  const CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(*I);
+  assert(++I == E && "Found more than one destructor!");
+  
+  return Dtor;
+}
+
 CXXMethodDecl *
 CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD,
                       SourceLocation L, DeclarationName N,
index 94d69d846c6e201af40088d00ebb44a7060b588a..6ab59e11b6e4f439f27bdc482f32be1f997e9458 100644 (file)
@@ -166,6 +166,14 @@ CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
   EmitCXXMemberCall(D, Callee, This, ArgBeg, ArgEnd);
 }
 
+void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *D, 
+                                            CXXDtorType Type,
+                                            llvm::Value *This) {
+  llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(D, Type);
+  
+  EmitCXXMemberCall(D, Callee, This, 0, 0);
+}
+
 void 
 CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest, 
                                       const CXXConstructExpr *E) {
index 7c54a4da04a18497e446328aa10b5a25b642fa6a..d7d6c729adfd1ca0428244ecb53ea9ed1a55ca36 100644 (file)
@@ -37,6 +37,7 @@ namespace llvm {
 
 namespace clang {
   class ASTContext;
+  class CXXDestructorDecl;
   class Decl;
   class EnumConstantDecl;
   class FunctionDecl;
@@ -476,6 +477,9 @@ public:
                               CallExpr::const_arg_iterator ArgBeg,
                               CallExpr::const_arg_iterator ArgEnd);
 
+  void EmitCXXDestructorCall(const CXXDestructorDecl *D, CXXDtorType Type,
+                             llvm::Value *This);
+  
   //===--------------------------------------------------------------------===//
   //                            Declaration Emission
   //===--------------------------------------------------------------------===//
index 04693fd502e0c4255a475d5f539f874860e3d89e..b69301ed589361bc8a6af66f9a0efb88be859756 100644 (file)
@@ -576,6 +576,8 @@ void CodeGenModule::EmitGlobalDefinition(GlobalDecl GD) {
   
   if (const CXXConstructorDecl *CD = dyn_cast<CXXConstructorDecl>(D))
     EmitCXXConstructor(CD, GD.getCtorType());
+  else if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D))
+    EmitCXXDestructor(DD, GD.getDtorType());
   else if (isa<FunctionDecl>(D))
     EmitGlobalFunctionDefinition(GD);
   else if (const VarDecl *VD = dyn_cast<VarDecl>(D))