diff options
author | John McCall <rjmccall@apple.com> | 2010-09-03 00:40:45 +0000 |
---|---|---|
committer | John McCall <rjmccall@apple.com> | 2010-09-03 00:40:45 +0000 |
commit | 2b8d60dfdfbbf19f6e2dcfb5c438f8eda8a7ecb4 (patch) | |
tree | 2e3c042131de8a9a865aa0f3746768ce4afcbe73 | |
parent | 3e7cf38810ec39be938b635ddd41e3cefde86883 (diff) |
Revert r112916, it's breaking selfhost pretty badly.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@112925 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGCall.cpp | 3 | ||||
-rw-r--r-- | lib/CodeGen/CGExprCXX.cpp | 41 | ||||
-rw-r--r-- | test/CodeGenCXX/arm.cpp | 17 |
3 files changed, 17 insertions, 44 deletions
diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index f698d146f1..6072c1c499 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -117,9 +117,6 @@ const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXRecordDecl *RD, const CGFunctionInfo &CodeGenTypes::getFunctionInfo(const CXXMethodDecl *MD) { llvm::SmallVector<CanQualType, 16> ArgTys; - assert(!isa<CXXConstructorDecl>(MD) && "wrong method for contructors!"); - assert(!isa<CXXDestructorDecl>(MD) && "wrong method for destructors!"); - // Add the 'this' pointer unless this is a static method. if (MD->isInstance()) ArgTys.push_back(GetThisType(Context, MD->getParent())); diff --git a/lib/CodeGen/CGExprCXX.cpp b/lib/CodeGen/CGExprCXX.cpp index ab6547fb7e..a5c1691307 100644 --- a/lib/CodeGen/CGExprCXX.cpp +++ b/lib/CodeGen/CGExprCXX.cpp @@ -93,9 +93,14 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, return EmitCall(getContext().getPointerType(MD->getType()), Callee, ReturnValue, CE->arg_begin(), CE->arg_end()); } + + const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); - // Compute the object pointer. + const llvm::Type *Ty = + CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), + FPT->isVariadic()); llvm::Value *This; + if (ME->isArrow()) This = EmitScalarExpr(ME->getBase()); else { @@ -103,10 +108,7 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, This = BaseLV.getAddress(); } - if (MD->isTrivial()) { - if (isa<CXXDestructorDecl>(MD)) return RValue::get(0); - - assert(MD->isCopyAssignment() && "unknown trivial member function"); + if (MD->isCopyAssignment() && MD->isTrivial()) { // We don't like to generate the trivial copy assignment operator when // it isn't necessary; just produce the proper effect here. llvm::Value *RHS = EmitLValue(*CE->arg_begin()).getAddress(); @@ -114,34 +116,25 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE, return RValue::get(This); } - // Compute the function type we're calling. - const CGFunctionInfo &FInfo = - (isa<CXXDestructorDecl>(MD) - ? CGM.getTypes().getFunctionInfo(cast<CXXDestructorDecl>(MD), - Dtor_Complete) - : CGM.getTypes().getFunctionInfo(MD)); - - const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); - const llvm::Type *Ty - = CGM.getTypes().GetFunctionType(FInfo, FPT->isVariadic()); - // C++ [class.virtual]p12: // Explicit qualification with the scope operator (5.1) suppresses the // virtual call mechanism. // // We also don't emit a virtual call if the base expression has a record type // because then we know what the type is. - bool UseVirtualCall = MD->isVirtual() && !ME->hasQualifier() - && !canDevirtualizeMemberFunctionCalls(ME->getBase()); - llvm::Value *Callee; - if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(MD)) { - if (UseVirtualCall) { - Callee = BuildVirtualCall(Dtor, Dtor_Complete, This, Ty); + if (const CXXDestructorDecl *Destructor + = dyn_cast<CXXDestructorDecl>(MD)) { + if (Destructor->isTrivial()) + return RValue::get(0); + if (MD->isVirtual() && !ME->hasQualifier() && + !canDevirtualizeMemberFunctionCalls(ME->getBase())) { + Callee = BuildVirtualCall(Destructor, Dtor_Complete, This, Ty); } else { - Callee = CGM.GetAddrOfFunction(GlobalDecl(Dtor, Dtor_Complete), Ty); + Callee = CGM.GetAddrOfFunction(GlobalDecl(Destructor, Dtor_Complete), Ty); } - } else if (UseVirtualCall) { + } else if (MD->isVirtual() && !ME->hasQualifier() && + !canDevirtualizeMemberFunctionCalls(ME->getBase())) { Callee = BuildVirtualCall(MD, This, Ty); } else { Callee = CGM.GetAddrOfFunction(MD, Ty); diff --git a/test/CodeGenCXX/arm.cpp b/test/CodeGenCXX/arm.cpp index bb8306472c..05ed603acf 100644 --- a/test/CodeGenCXX/arm.cpp +++ b/test/CodeGenCXX/arm.cpp @@ -237,23 +237,6 @@ namespace test4 { } } -// <rdar://problem/8386802>: don't crash -namespace test5 { - struct A { - ~A(); - }; - - // CHECK: define void @_ZN5test54testEPNS_1AE - void test(A *a) { - // CHECK: [[PTR:%.*]] = alloca [[A:%.*]]*, align 4 - // CHECK-NEXT: store [[A]]* {{.*}}, [[A]]** [[PTR]], align 4 - // CHECK-NEXT: [[TMP:%.*]] = load [[A]]** [[PTR]], align 4 - // CHECK-NEXT: call [[A]]* @_ZN5test51AD1Ev([[A]]* [[TMP]]) - // CHECK-NEXT: ret void - a->~A(); - } -} - // CHECK: define linkonce_odr [[C:%.*]]* @_ZTv0_n12_N5test21CD1Ev( // CHECK: call [[C]]* @_ZN5test21CD1Ev( // CHECK: ret [[C]]* undef |