r199160 - [ms-abi] Always generate complete constructors in the Microsoft C++ ABI
Timur Iskhodzhanov
timurrrr at google.com
Mon Jan 27 13:09:02 PST 2014
2014-01-13 Reid Kleckner <reid at kleckner.net>:
> Author: rnk
> Date: Mon Jan 13 16:57:31 2014
> New Revision: 199160
>
> URL: http://llvm.org/viewvc/llvm-project?rev=199160&view=rev
> Log:
> [ms-abi] Always generate complete constructors in the Microsoft C++ ABI
>
> Fixes PR18435, where we generated a base ctor instead of a complete
> ctor, and so failed to construct virtual bases when constructing the
> complete object.
>
> Modified:
> cfe/trunk/lib/CodeGen/CGCXX.cpp
> cfe/trunk/lib/CodeGen/CGClass.cpp
> cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCXX.cpp?rev=199160&r1=199159&r2=199160&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGCXX.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGCXX.cpp Mon Jan 13 16:57:31 2014
> @@ -190,11 +190,13 @@ bool CodeGenModule::TryEmitDefinitionAsA
>
> void CodeGenModule::EmitCXXConstructor(const CXXConstructorDecl *ctor,
> CXXCtorType ctorType) {
> - // The complete constructor is equivalent to the base constructor
> - // for classes with no virtual bases. Try to emit it as an alias.
> - if (getTarget().getCXXABI().hasConstructorVariants() &&
> - !ctor->getParent()->getNumVBases() &&
> - (ctorType == Ctor_Complete || ctorType == Ctor_Base)) {
> + if (!getTarget().getCXXABI().hasConstructorVariants()) {
> + // If there are no constructor variants, always emit the complete destructor.
Constructor?
> + ctorType = Ctor_Complete;
> + } else if (!ctor->getParent()->getNumVBases() &&
> + (ctorType == Ctor_Complete || ctorType == Ctor_Base)) {
> + // The complete constructor is equivalent to the base constructor
> + // for classes with no virtual bases. Try to emit it as an alias.
> bool ProducedAlias =
> !TryEmitDefinitionAsAlias(GlobalDecl(ctor, Ctor_Complete),
> GlobalDecl(ctor, Ctor_Base), true);
>
> Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=199160&r1=199159&r2=199160&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGClass.cpp Mon Jan 13 16:57:31 2014
> @@ -699,6 +699,10 @@ void CodeGenFunction::EmitConstructorBod
> const CXXConstructorDecl *Ctor = cast<CXXConstructorDecl>(CurGD.getDecl());
> CXXCtorType CtorType = CurGD.getCtorType();
>
> + assert((CGM.getTarget().getCXXABI().hasConstructorVariants() ||
> + CtorType == Ctor_Complete) &&
> + "can only generate complete ctor for this ABI");
> +
> // Before we go any further, try the complete->base constructor
> // delegation optimization.
> if (CtorType == Ctor_Complete && IsConstructorDelegationValid(Ctor) &&
>
> Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp?rev=199160&r1=199159&r2=199160&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-virtual-inheritance.cpp Mon Jan 13 16:57:31 2014
> @@ -312,3 +312,30 @@ D::~D() {
> }
>
> }
> +
> +namespace test2 {
> +struct A { A(); };
> +struct B : virtual A { B() {} };
> +struct C : B, A { C() {} };
> +
> +// PR18435: Order mattered here. We were generating code for the delegating
> +// call to B() from C().
> +void callC() { C x; }
> +
> +// CHECK-LABEL: define linkonce_odr x86_thiscallcc %"struct.test2::C"* @"\01??0C at test2@@QAE at XZ"
> +// CHECK: (%"struct.test2::C"* returned %this, i32 %is_most_derived)
> +// CHECK: br i1
> +// Virtual bases
> +// CHECK: call x86_thiscallcc %"struct.test2::A"* @"\01??0A at test2@@QAE at XZ"(%"struct.test2::A"* %{{.*}})
> +// CHECK: br label
> +// Non-virtual bases
> +// CHECK: call x86_thiscallcc %"struct.test2::B"* @"\01??0B at test2@@QAE at XZ"(%"struct.test2::B"* %{{.*}}, i32 0)
> +// CHECK: call x86_thiscallcc %"struct.test2::A"* @"\01??0A at test2@@QAE at XZ"(%"struct.test2::A"* %{{.*}})
> +// CHECK: ret
> +
> +// CHECK2-LABEL: define linkonce_odr x86_thiscallcc %"struct.test2::B"* @"\01??0B at test2@@QAE at XZ"
> +// CHECK2: (%"struct.test2::B"* returned %this, i32 %is_most_derived)
> +// CHECK2: call x86_thiscallcc %"struct.test2::A"* @"\01??0A at test2@@QAE at XZ"(%"struct.test2::A"* %{{.*}})
> +// CHECK2: ret
> +
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list