Author: rafael Date: Mon Sep 15 14:34:18 2014 New Revision: 217811 URL: http://llvm.org/viewvc/llvm-project?rev=217811&view=rev Log: Reduce code duplication a bit more. NFC.
Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp cfe/trunk/lib/CodeGen/CodeGenModule.h cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=217811&r1=217810&r2=217811&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGCXX.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCXX.cpp Mon Sep 15 14:34:18 2014 @@ -196,6 +196,28 @@ bool CodeGenModule::TryEmitDefinitionAsA return false; } +llvm::Function *CodeGenModule::codegenCXXStructor(const CXXMethodDecl *MD, + StructorType Type) { + const CGFunctionInfo &FnInfo = + getTypes().arrangeCXXStructorDeclaration(MD, Type); + auto *Fn = cast<llvm::Function>( + getAddrOfCXXStructor(MD, Type, &FnInfo, nullptr, true)); + + GlobalDecl GD; + if (const auto *DD = dyn_cast<CXXDestructorDecl>(MD)) { + GD = GlobalDecl(DD, toCXXDtorType(Type)); + } else { + const auto *CD = cast<CXXConstructorDecl>(MD); + GD = GlobalDecl(CD, toCXXCtorType(Type)); + } + + setFunctionLinkage(GD, Fn); + CodeGenFunction(*this).GenerateCode(GD, Fn, FnInfo); + setFunctionDefinitionAttributes(MD, Fn); + SetLLVMFunctionAttributesForDefinition(MD, Fn); + return Fn; +} + llvm::GlobalValue *CodeGenModule::getAddrOfCXXStructor( const CXXMethodDecl *MD, StructorType Type, const CGFunctionInfo *FnInfo, llvm::FunctionType *FnType, bool DontDefer) { Modified: cfe/trunk/lib/CodeGen/CodeGenModule.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.h?rev=217811&r1=217810&r2=217811&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CodeGenModule.h (original) +++ cfe/trunk/lib/CodeGen/CodeGenModule.h Mon Sep 15 14:34:18 2014 @@ -802,6 +802,12 @@ public: /// Objective-C fast enumeration loop (for..in). QualType getObjCFastEnumerationStateType(); + // Produce code for this constructor/destructor. This method doesn't try + // to apply any ABI rules about which other constructors/destructors + // are needed or if they are alias to each other. + llvm::Function *codegenCXXStructor(const CXXMethodDecl *MD, + StructorType Type); + /// Return the address of the constructor/destructor of the given type. llvm::GlobalValue * getAddrOfCXXStructor(const CXXMethodDecl *MD, StructorType Type, Modified: cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp?rev=217811&r1=217810&r2=217811&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp (original) +++ cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp Mon Sep 15 14:34:18 2014 @@ -3012,17 +3012,7 @@ static void emitCXXConstructor(CodeGenMo return; } - const CGFunctionInfo &fnInfo = - CGM.getTypes().arrangeCXXStructorDeclaration(ctor, ctorType); - - auto *fn = cast<llvm::Function>( - CGM.getAddrOfCXXStructor(ctor, ctorType, &fnInfo, nullptr, true)); - GlobalDecl GD(ctor, toCXXCtorType(ctorType)); - CGM.setFunctionLinkage(GD, fn); - CodeGenFunction(CGM).GenerateCode(GD, fn, fnInfo); - - CGM.setFunctionDefinitionAttributes(ctor, fn); - CGM.SetLLVMFunctionAttributesForDefinition(ctor, fn); + CGM.codegenCXXStructor(ctor, ctorType); } static void emitCXXDestructor(CodeGenModule &CGM, const CXXDestructorDecl *dtor, Modified: cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp?rev=217811&r1=217810&r2=217811&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp (original) +++ cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp Mon Sep 15 14:34:18 2014 @@ -2877,19 +2877,7 @@ static void emitCXXConstructor(CodeGenMo const CXXConstructorDecl *ctor, StructorType ctorType) { // There are no constructor variants, always emit the complete destructor. - ctorType = StructorType::Complete; - - const CGFunctionInfo &fnInfo = - CGM.getTypes().arrangeCXXStructorDeclaration(ctor, ctorType); - - auto *fn = cast<llvm::Function>( - CGM.getAddrOfCXXStructor(ctor, ctorType, &fnInfo, nullptr, true)); - GlobalDecl GD(ctor, toCXXCtorType(ctorType)); - CGM.setFunctionLinkage(GD, fn); - CodeGenFunction(CGM).GenerateCode(GD, fn, fnInfo); - - CGM.setFunctionDefinitionAttributes(ctor, fn); - CGM.SetLLVMFunctionAttributesForDefinition(ctor, fn); + CGM.codegenCXXStructor(ctor, StructorType::Complete); } static void emitCXXDestructor(CodeGenModule &CGM, const CXXDestructorDecl *dtor, _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits