forked from OSchip/llvm-project
Don't produce an alias between destructors with different calling conventions.
Fixes pr19007. llvm-svn: 203007
This commit is contained in:
parent
7bea1d42d8
commit
191b95125a
|
@ -92,7 +92,13 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(const CXXDestructorDecl *D) {
|
||||||
if (!ClassLayout.getBaseClassOffset(UniqueBase).isZero())
|
if (!ClassLayout.getBaseClassOffset(UniqueBase).isZero())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
// Give up if the calling conventions don't match. We could update the call,
|
||||||
|
// but it is probably not worth it.
|
||||||
const CXXDestructorDecl *BaseD = UniqueBase->getDestructor();
|
const CXXDestructorDecl *BaseD = UniqueBase->getDestructor();
|
||||||
|
if (BaseD->getType()->getAs<FunctionType>()->getCallConv() !=
|
||||||
|
D->getType()->getAs<FunctionType>()->getCallConv())
|
||||||
|
return true;
|
||||||
|
|
||||||
return TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Base),
|
return TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Base),
|
||||||
GlobalDecl(BaseD, Dtor_Base),
|
GlobalDecl(BaseD, Dtor_Base),
|
||||||
false);
|
false);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// RUN: %clang_cc1 %s -triple x86_64-linux -emit-llvm -o - -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s
|
// RUN: %clang_cc1 %s -triple i686-linux -emit-llvm -o - -mconstructor-aliases -O1 -disable-llvm-optzns | FileCheck %s
|
||||||
// RUN: %clang_cc1 %s -triple x86_64-linux -emit-llvm -o - -mconstructor-aliases | FileCheck --check-prefix=NOOPT %s
|
// RUN: %clang_cc1 %s -triple i686-linux -emit-llvm -o - -mconstructor-aliases | FileCheck --check-prefix=NOOPT %s
|
||||||
|
|
||||||
// RUN: %clang_cc1 -triple x86_64--netbsd -emit-llvm \
|
// RUN: %clang_cc1 -triple x86_64--netbsd -emit-llvm \
|
||||||
// RUN: -mconstructor-aliases -O2 %s -o - | FileCheck --check-prefix=CHECK-RAUW %s
|
// RUN: -mconstructor-aliases -O2 %s -o - | FileCheck --check-prefix=CHECK-RAUW %s
|
||||||
|
@ -133,6 +133,22 @@ namespace test8 {
|
||||||
zed foo;
|
zed foo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace test9 {
|
||||||
|
struct foo {
|
||||||
|
__attribute__((stdcall)) ~foo() {
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct bar : public foo {};
|
||||||
|
|
||||||
|
void zed() {
|
||||||
|
// Test that we produce a call to bar's destructor. We used to call foo's, but
|
||||||
|
// it has a different calling conversion.
|
||||||
|
// CHECK-DAG: call void @_ZN5test93barD2Ev
|
||||||
|
bar ptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// CHECK-RAUW: @_ZTV1C = linkonce_odr unnamed_addr constant [4 x i8*] [{{[^@]*}}@_ZTI1C {{[^@]*}}@_ZN1CD2Ev {{[^@]*}}@_ZN1CD0Ev {{[^@]*}}]
|
// CHECK-RAUW: @_ZTV1C = linkonce_odr unnamed_addr constant [4 x i8*] [{{[^@]*}}@_ZTI1C {{[^@]*}}@_ZN1CD2Ev {{[^@]*}}@_ZN1CD0Ev {{[^@]*}}]
|
||||||
// r194296 replaced C::~C with B::~B without emitting the later.
|
// r194296 replaced C::~C with B::~B without emitting the later.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue