[cfe-commits] r72792 - in /cfe/trunk: clang.xcodeproj/project.pbxproj lib/CodeGen/CGCXX.cpp lib/CodeGen/CGCXXTemp.cpp

Anders Carlsson andersca at mac.com
Wed Jun 3 11:40:22 PDT 2009


Author: andersca
Date: Wed Jun  3 13:40:21 2009
New Revision: 72792

URL: http://llvm.org/viewvc/llvm-project?rev=72792&view=rev
Log:
Move code generation of C++ temporaries into a new file.

Added:
    cfe/trunk/lib/CodeGen/CGCXXTemp.cpp
      - copied, changed from r72787, cfe/trunk/lib/CodeGen/CGCXX.cpp
Modified:
    cfe/trunk/clang.xcodeproj/project.pbxproj
    cfe/trunk/lib/CodeGen/CGCXX.cpp

Modified: cfe/trunk/clang.xcodeproj/project.pbxproj
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/clang.xcodeproj/project.pbxproj?rev=72792&r1=72791&r2=72792&view=diff

==============================================================================
--- cfe/trunk/clang.xcodeproj/project.pbxproj (original)
+++ cfe/trunk/clang.xcodeproj/project.pbxproj Wed Jun  3 13:40:21 2009
@@ -33,6 +33,7 @@
 		1A471AB50F437BC500753CE8 /* CGBlocks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A471AB40F437BC500753CE8 /* CGBlocks.cpp */; };
 		1A5119C40FBDF71000A1FF22 /* SemaTemplateInstantiateStmt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5119C30FBDF71000A1FF22 /* SemaTemplateInstantiateStmt.cpp */; };
 		1A5D5E580E5E81010023C059 /* CGCXX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A5D5E570E5E81010023C059 /* CGCXX.cpp */; };
+		1A6FE7090FD6F85800E00CA9 /* CGCXXTemp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6FE7080FD6F85800E00CA9 /* CGCXXTemp.cpp */; };
 		1A701B640F7C8FE400FEC4D1 /* SemaAccess.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A701B630F7C8FE400FEC4D1 /* SemaAccess.cpp */; };
 		1A7342480C7B57D500122F56 /* CGObjC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A7342470C7B57D500122F56 /* CGObjC.cpp */; };
 		1A869A700BA2164C008DA07A /* LiteralSupport.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 1A869A6E0BA2164C008DA07A /* LiteralSupport.h */; };
@@ -352,6 +353,7 @@
 		1A68BC110D0CADDD001A28C8 /* PPCBuiltins.def */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = text; name = PPCBuiltins.def; path = clang/AST/PPCBuiltins.def; sourceTree = "<group>"; tabWidth = 2; };
 		1A68BC120D0CADDD001A28C8 /* TargetBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = TargetBuiltins.h; path = clang/AST/TargetBuiltins.h; sourceTree = "<group>"; tabWidth = 2; };
 		1A68BC130D0CADDD001A28C8 /* X86Builtins.def */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = text; name = X86Builtins.def; path = clang/AST/X86Builtins.def; sourceTree = "<group>"; tabWidth = 2; };
+		1A6FE7080FD6F85800E00CA9 /* CGCXXTemp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CGCXXTemp.cpp; path = lib/CodeGen/CGCXXTemp.cpp; sourceTree = "<group>"; };
 		1A7019E90F79BC1100FEC4D1 /* DiagnosticAnalysisKinds.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DiagnosticAnalysisKinds.td; sourceTree = "<group>"; };
 		1A7019EA0F79BC1100FEC4D1 /* DiagnosticASTKinds.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DiagnosticASTKinds.td; sourceTree = "<group>"; };
 		1A7019EB0F79BC1100FEC4D1 /* DiagnosticCommonKinds.td */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DiagnosticCommonKinds.td; sourceTree = "<group>"; };
@@ -1093,6 +1095,7 @@
 				35475B220E7997680000BFE4 /* CGCall.h */,
 				1A5D5E570E5E81010023C059 /* CGCXX.cpp */,
 				1A649E1E0F9599DA005B965E /* CGCXX.h */,
+				1A6FE7080FD6F85800E00CA9 /* CGCXXTemp.cpp */,
 				35A3E7000DD3874400757F74 /* CGDebugInfo.cpp */,
 				35A3E7010DD3874400757F74 /* CGDebugInfo.h */,
 				DE4264FB0C113592005A861D /* CGDecl.cpp */,
@@ -1687,6 +1690,7 @@
 				1A2A54C30FD1DD1C00F4CE45 /* RewriteTest.cpp in Sources */,
 				1A2A54C40FD1DD1C00F4CE45 /* StmtXML.cpp in Sources */,
 				1A2A54C50FD1DD1C00F4CE45 /* Warnings.cpp in Sources */,
+				1A6FE7090FD6F85800E00CA9 /* CGCXXTemp.cpp in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};

Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=72792&r1=72791&r2=72792&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXX.cpp Wed Jun  3 13:40:21 2009
@@ -189,43 +189,6 @@
                          E->arg_begin(), E->arg_end());
 }
 
-void CodeGenFunction::PushCXXTemporary(const CXXTemporary *Temporary, 
-                                       llvm::Value *Ptr) {
-  LiveTemporaries.push_back(Temporary);
-  
-  // Make a cleanup scope and emit the destructor.
-  {
-    CleanupScope Scope(*this);
-   
-    EmitCXXDestructorCall(Temporary->getDestructor(), Dtor_Complete, Ptr);
-  }
-}
-
-RValue 
-CodeGenFunction::EmitCXXExprWithTemporaries(const CXXExprWithTemporaries *E,
-                                            llvm::Value *AggLoc,
-                                            bool isAggLocVolatile) {
-  // Keep track of the current cleanup stack depth.
-  size_t CleanupStackDepth = CleanupEntries.size();
-
-  unsigned OldNumLiveTemporaries = LiveTemporaries.size();
-  
-  RValue RV = EmitAnyExpr(E->getSubExpr(), AggLoc, isAggLocVolatile);
-  
-  // Go through the temporaries backwards.
-  for (unsigned i = E->getNumTemporaries(); i != 0; --i) {
-    assert(LiveTemporaries.back() == E->getTemporary(i - 1));
-    LiveTemporaries.pop_back();
-  }
-
-  assert(OldNumLiveTemporaries == LiveTemporaries.size() &&
-         "Live temporary stack mismatch!");
-  
-  EmitCleanupBlocks(CleanupStackDepth);
-
-  return RV;
-}
-
 llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
   if (E->isArray()) {
     ErrorUnsupported(E, "new[] expression");

Copied: cfe/trunk/lib/CodeGen/CGCXXTemp.cpp (from r72787, cfe/trunk/lib/CodeGen/CGCXX.cpp)
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXXTemp.cpp?p2=cfe/trunk/lib/CodeGen/CGCXXTemp.cpp&p1=cfe/trunk/lib/CodeGen/CGCXX.cpp&r1=72787&r2=72792&rev=72792&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCXXTemp.cpp Wed Jun  3 13:40:21 2009
@@ -1,4 +1,4 @@
-//===--- CGDecl.cpp - Emit LLVM Code for declarations ---------------------===//
+//===--- CGCXXTemp.cpp - Emit LLVM Code for C++ temporaries ---------------===//
 //
 //                     The LLVM Compiler Infrastructure
 //
@@ -7,188 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 //
-// This contains code dealing with C++ code generation.
+// This contains code dealing with C++ code generation of temporaries
 //
 //===----------------------------------------------------------------------===//
 
-// We might split this into multiple files if it gets too unwieldy 
-
 #include "CodeGenFunction.h"
-#include "CodeGenModule.h"
-#include "Mangle.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/Decl.h"
-#include "clang/AST/DeclCXX.h"
-#include "clang/AST/DeclObjC.h"
-#include "llvm/ADT/StringExtras.h"
 using namespace clang;
 using namespace CodeGen;
 
-void 
-CodeGenFunction::GenerateStaticCXXBlockVarDeclInit(const VarDecl &D, 
-                                                   llvm::GlobalVariable *GV) {
-  // FIXME: This should use __cxa_guard_{acquire,release}?
-
-  assert(!getContext().getLangOptions().ThreadsafeStatics &&
-         "thread safe statics are currently not supported!");
-
-  llvm::SmallString<256> GuardVName;
-  llvm::raw_svector_ostream GuardVOut(GuardVName);
-  mangleGuardVariable(&D, getContext(), GuardVOut);
-  
-  // Create the guard variable.
-  llvm::GlobalValue *GuardV = 
-    new llvm::GlobalVariable(llvm::Type::Int64Ty, false,
-                             GV->getLinkage(),
-                             llvm::Constant::getNullValue(llvm::Type::Int64Ty),
-                             GuardVName.c_str(),
-                             &CGM.getModule());
-  
-  // Load the first byte of the guard variable.
-  const llvm::Type *PtrTy = llvm::PointerType::get(llvm::Type::Int8Ty, 0);
-  llvm::Value *V = Builder.CreateLoad(Builder.CreateBitCast(GuardV, PtrTy), 
-                                      "tmp");
-  
-  // Compare it against 0.
-  llvm::Value *nullValue = llvm::Constant::getNullValue(llvm::Type::Int8Ty);
-  llvm::Value *ICmp = Builder.CreateICmpEQ(V, nullValue , "tobool");
-  
-  llvm::BasicBlock *InitBlock = createBasicBlock("init");
-  llvm::BasicBlock *EndBlock = createBasicBlock("init.end");
-
-  // If the guard variable is 0, jump to the initializer code.
-  Builder.CreateCondBr(ICmp, InitBlock, EndBlock);
-                         
-  EmitBlock(InitBlock);
-
-  const Expr *Init = D.getInit();
-  if (!hasAggregateLLVMType(Init->getType())) {
-    llvm::Value *V = EmitScalarExpr(Init);
-    Builder.CreateStore(V, GV, D.getType().isVolatileQualified());
-  } else if (Init->getType()->isAnyComplexType()) {
-    EmitComplexExprIntoAddr(Init, GV, D.getType().isVolatileQualified());
-  } else {
-    EmitAggExpr(Init, GV, D.getType().isVolatileQualified());
-  }
-    
-  Builder.CreateStore(llvm::ConstantInt::get(llvm::Type::Int8Ty, 1),
-                      Builder.CreateBitCast(GuardV, PtrTy));
-                      
-  EmitBlock(EndBlock);
-}
-
-RValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD,
-                                          llvm::Value *Callee,
-                                          llvm::Value *This,
-                                          CallExpr::const_arg_iterator ArgBeg,
-                                          CallExpr::const_arg_iterator ArgEnd) {
-  assert(MD->isInstance() && 
-         "Trying to emit a member call expr on a static method!");
-
-  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
-  
-  CallArgList Args;
-  
-  // Push the this ptr.
-  Args.push_back(std::make_pair(RValue::get(This),
-                                MD->getThisType(getContext())));
-  
-  // And the rest of the call args
-  EmitCallArgs(Args, FPT, ArgBeg, ArgEnd);
-  
-  QualType ResultType = MD->getType()->getAsFunctionType()->getResultType();
-  return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args),
-                  Callee, Args, MD);
-}
-
-RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
-  const MemberExpr *ME = cast<MemberExpr>(CE->getCallee());
-  const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
-
-  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
-  const llvm::Type *Ty = 
-    CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), 
-                                   FPT->isVariadic());
-  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
-  
-  llvm::Value *This;
-  
-  if (ME->isArrow())
-    This = EmitScalarExpr(ME->getBase());
-  else {
-    LValue BaseLV = EmitLValue(ME->getBase());
-    This = BaseLV.getAddress();
-  }
-  
-  return EmitCXXMemberCall(MD, Callee, This, 
-                           CE->arg_begin(), CE->arg_end());
-}
-
-RValue 
-CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
-                                               const CXXMethodDecl *MD) {
-  assert(MD->isInstance() && 
-         "Trying to emit a member call expr on a static method!");
-  
-  
-  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
-  const llvm::Type *Ty = 
-  CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), 
-                                 FPT->isVariadic());
-  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
-  
-  llvm::Value *This = EmitLValue(E->getArg(0)).getAddress();
-  
-  return EmitCXXMemberCall(MD, Callee, This,
-                           E->arg_begin() + 1, E->arg_end());
-}
-
-llvm::Value *CodeGenFunction::LoadCXXThis() {
-  assert(isa<CXXMethodDecl>(CurFuncDecl) && 
-         "Must be in a C++ member function decl to load 'this'");
-  assert(cast<CXXMethodDecl>(CurFuncDecl)->isInstance() &&
-         "Must be in a C++ member function decl to load 'this'");
-  
-  // FIXME: What if we're inside a block?
-  // ans: See how CodeGenFunction::LoadObjCSelf() uses
-  // CodeGenFunction::BlockForwardSelf() for how to do this.
-  return Builder.CreateLoad(LocalDeclMap[CXXThisDecl], "this");
-}
-
-void
-CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D, 
-                                        CXXCtorType Type, 
-                                        llvm::Value *This,
-                                        CallExpr::const_arg_iterator ArgBeg,
-                                        CallExpr::const_arg_iterator ArgEnd) {
-  llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type);
-
-  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) {
-  assert(Dest && "Must have a destination!");
-  
-  const CXXRecordDecl *RD = 
-  cast<CXXRecordDecl>(E->getType()->getAsRecordType()->getDecl());
-  if (RD->hasTrivialConstructor())
-    return;
-  
-  // Call the constructor.
-  EmitCXXConstructorCall(E->getConstructor(), Ctor_Complete, Dest, 
-                         E->arg_begin(), E->arg_end());
-}
-
 void CodeGenFunction::PushCXXTemporary(const CXXTemporary *Temporary, 
                                        llvm::Value *Ptr) {
   LiveTemporaries.push_back(Temporary);
@@ -225,230 +51,3 @@
 
   return RV;
 }
-
-llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
-  if (E->isArray()) {
-    ErrorUnsupported(E, "new[] expression");
-    return llvm::UndefValue::get(ConvertType(E->getType()));
-  }
-  
-  QualType AllocType = E->getAllocatedType();
-  FunctionDecl *NewFD = E->getOperatorNew();
-  const FunctionProtoType *NewFTy = NewFD->getType()->getAsFunctionProtoType();
-  
-  CallArgList NewArgs;
-
-  // The allocation size is the first argument.
-  QualType SizeTy = getContext().getSizeType();
-  llvm::Value *AllocSize = 
-    llvm::ConstantInt::get(ConvertType(SizeTy), 
-                           getContext().getTypeSize(AllocType) / 8);
-
-  NewArgs.push_back(std::make_pair(RValue::get(AllocSize), SizeTy));
-  
-  // Emit the rest of the arguments.
-  // FIXME: Ideally, this should just use EmitCallArgs.
-  CXXNewExpr::const_arg_iterator NewArg = E->placement_arg_begin();
-
-  // First, use the types from the function type.
-  // We start at 1 here because the first argument (the allocation size)
-  // has already been emitted.
-  for (unsigned i = 1, e = NewFTy->getNumArgs(); i != e; ++i, ++NewArg) {
-    QualType ArgType = NewFTy->getArgType(i);
-    
-    assert(getContext().getCanonicalType(ArgType.getNonReferenceType()).
-           getTypePtr() == 
-           getContext().getCanonicalType(NewArg->getType()).getTypePtr() && 
-           "type mismatch in call argument!");
-    
-    NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType), 
-                                     ArgType));
-    
-  }
-  
-  // Either we've emitted all the call args, or we have a call to a 
-  // variadic function.
-  assert((NewArg == E->placement_arg_end() || NewFTy->isVariadic()) && 
-         "Extra arguments in non-variadic function!");
-  
-  // If we still have any arguments, emit them using the type of the argument.
-  for (CXXNewExpr::const_arg_iterator NewArgEnd = E->placement_arg_end(); 
-       NewArg != NewArgEnd; ++NewArg) {
-    QualType ArgType = NewArg->getType();
-    NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType),
-                                     ArgType));
-  }
-
-  // Emit the call to new.
-  RValue RV = 
-    EmitCall(CGM.getTypes().getFunctionInfo(NewFTy->getResultType(), NewArgs),
-             CGM.GetAddrOfFunction(GlobalDecl(NewFD)),
-             NewArgs, NewFD);
-
-  // If an allocation function is declared with an empty exception specification
-  // it returns null to indicate failure to allocate storage. [expr.new]p13.
-  // (We don't need to check for null when there's no new initializer and
-  // we're allocating a POD type).
-  bool NullCheckResult = NewFTy->hasEmptyExceptionSpec() &&
-    !(AllocType->isPODType() && !E->hasInitializer());
-
-  llvm::BasicBlock *NewNull = 0;
-  llvm::BasicBlock *NewNotNull = 0;
-  llvm::BasicBlock *NewEnd = 0;
-
-  llvm::Value *NewPtr = RV.getScalarVal();
-
-  if (NullCheckResult) {
-    NewNull = createBasicBlock("new.null");
-    NewNotNull = createBasicBlock("new.notnull");
-    NewEnd = createBasicBlock("new.end");
-    
-    llvm::Value *IsNull = 
-      Builder.CreateICmpEQ(NewPtr, 
-                           llvm::Constant::getNullValue(NewPtr->getType()),
-                           "isnull");
-    
-    Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
-    EmitBlock(NewNotNull);
-  }
-  
-  NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
-  
-  if (AllocType->isPODType()) {
-    if (E->getNumConstructorArgs() > 0) {
-      assert(E->getNumConstructorArgs() == 1 && 
-             "Can only have one argument to initializer of POD type.");
-
-      const Expr *Init = E->getConstructorArg(0);
-    
-      if (!hasAggregateLLVMType(AllocType)) 
-        Builder.CreateStore(EmitScalarExpr(Init), NewPtr);
-      else if (AllocType->isAnyComplexType())
-        EmitComplexExprIntoAddr(Init, NewPtr, AllocType.isVolatileQualified());
-      else
-        EmitAggExpr(Init, NewPtr, AllocType.isVolatileQualified());
-    }
-  } else {
-    // Call the constructor.    
-    CXXConstructorDecl *Ctor = E->getConstructor();
-    
-    EmitCXXConstructorCall(Ctor, Ctor_Complete, NewPtr, 
-                           E->constructor_arg_begin(), 
-                           E->constructor_arg_end());
-  }
-
-  if (NullCheckResult) {
-    Builder.CreateBr(NewEnd);
-    EmitBlock(NewNull);
-    Builder.CreateBr(NewEnd);
-    EmitBlock(NewEnd);
-  
-    llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
-    PHI->reserveOperandSpace(2);
-    PHI->addIncoming(NewPtr, NewNotNull);
-    PHI->addIncoming(llvm::Constant::getNullValue(NewPtr->getType()), NewNull);
-    
-    NewPtr = PHI;
-  }
-    
-  return NewPtr;
-}
-
-static bool canGenerateCXXstructor(const CXXRecordDecl *RD, 
-                                   ASTContext &Context) {
-  // The class has base classes - we don't support that right now.
-  if (RD->getNumBases() > 0)
-    return false;
-  
-  for (CXXRecordDecl::field_iterator I = RD->field_begin(Context), 
-       E = RD->field_end(Context); I != E; ++I) {
-    // We don't support ctors for fields that aren't POD.
-    if (!I->getType()->isPODType())
-      return false;
-  }
-  
-  return true;
-}
-
-void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
-  if (!canGenerateCXXstructor(D->getParent(), getContext())) {
-    ErrorUnsupported(D, "C++ constructor", true);
-    return;
-  }
-
-  EmitGlobal(GlobalDecl(D, Ctor_Complete));
-  EmitGlobal(GlobalDecl(D, Ctor_Base));
-}
-
-void CodeGenModule::EmitCXXConstructor(const CXXConstructorDecl *D, 
-                                       CXXCtorType Type) {
-  
-  llvm::Function *Fn = GetAddrOfCXXConstructor(D, Type);
-  
-  CodeGenFunction(*this).GenerateCode(D, Fn);
-  
-  SetFunctionDefinitionAttributes(D, Fn);
-  SetLLVMFunctionAttributesForDefinition(D, Fn);
-}
-
-llvm::Function *
-CodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D, 
-                                       CXXCtorType Type) {
-  const llvm::FunctionType *FTy =
-    getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
-  
-  const char *Name = getMangledCXXCtorName(D, Type);
-  return cast<llvm::Function>(
-                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
-}
-
-const char *CodeGenModule::getMangledCXXCtorName(const CXXConstructorDecl *D, 
-                                                 CXXCtorType Type) {
-  llvm::SmallString<256> Name;
-  llvm::raw_svector_ostream Out(Name);
-  mangleCXXCtor(D, Type, Context, Out);
-  
-  Name += '\0';
-  return UniqueMangledName(Name.begin(), Name.end());
-}
-
-void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
-  if (!canGenerateCXXstructor(D->getParent(), getContext())) {
-    ErrorUnsupported(D, "C++ destructor", true);
-    return;
-  }
-  
-  EmitCXXDestructor(D, Dtor_Complete);
-  EmitCXXDestructor(D, Dtor_Base);
-}
-
-void CodeGenModule::EmitCXXDestructor(const CXXDestructorDecl *D, 
-                                      CXXDtorType Type) {
-  llvm::Function *Fn = GetAddrOfCXXDestructor(D, Type);
-  
-  CodeGenFunction(*this).GenerateCode(D, Fn);
-  
-  SetFunctionDefinitionAttributes(D, Fn);
-  SetLLVMFunctionAttributesForDefinition(D, Fn);
-}
-
-llvm::Function *
-CodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D, 
-                                      CXXDtorType Type) {
-  const llvm::FunctionType *FTy =
-    getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
-  
-  const char *Name = getMangledCXXDtorName(D, Type);
-  return cast<llvm::Function>(
-                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
-}
-
-const char *CodeGenModule::getMangledCXXDtorName(const CXXDestructorDecl *D, 
-                                                 CXXDtorType Type) {
-  llvm::SmallString<256> Name;
-  llvm::raw_svector_ostream Out(Name);
-  mangleCXXDtor(D, Type, Context, Out);
-  
-  Name += '\0';
-  return UniqueMangledName(Name.begin(), Name.end());
-}





More information about the cfe-commits mailing list