a1f8ad145e
applied to our copy of llvm/clang. These can be applied in alphabetical order to a pristine llvm/clang 3.4 release source tree, to result in the same version used in FreeBSD. This is intended to clearly document all the changes until now, which mostly consist of cherry pickings from the respective upstream trunks, plus a number of hand-written FreeBSD-specific ones. Hopefully those can eventually be cleaned up and sent upstream too. MFC after: 1 week X-MFC-With: r263313
62 lines
2.5 KiB
Diff
62 lines
2.5 KiB
Diff
Pull in r203007 from upstream clang trunk (by Rafael Espindola):
|
|
|
|
Don't produce an alias between destructors with different calling conventions.
|
|
|
|
Fixes pr19007.
|
|
|
|
Introduced here: http://svn.freebsd.org/changeset/base/262809
|
|
|
|
Index: tools/clang/lib/CodeGen/CGCXX.cpp
|
|
===================================================================
|
|
--- tools/clang/lib/CodeGen/CGCXX.cpp
|
|
+++ tools/clang/lib/CodeGen/CGCXX.cpp
|
|
@@ -92,7 +92,13 @@ bool CodeGenModule::TryEmitBaseDestructorAsAlias(c
|
|
if (!ClassLayout.getBaseClassOffset(UniqueBase).isZero())
|
|
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();
|
|
+ if (BaseD->getType()->getAs<FunctionType>()->getCallConv() !=
|
|
+ D->getType()->getAs<FunctionType>()->getCallConv())
|
|
+ return true;
|
|
+
|
|
return TryEmitDefinitionAsAlias(GlobalDecl(D, Dtor_Base),
|
|
GlobalDecl(BaseD, Dtor_Base),
|
|
false);
|
|
Index: tools/clang/test/CodeGenCXX/ctor-dtor-alias.cpp
|
|
===================================================================
|
|
--- tools/clang/test/CodeGenCXX/ctor-dtor-alias.cpp
|
|
+++ tools/clang/test/CodeGenCXX/ctor-dtor-alias.cpp
|
|
@@ -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 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 -O1 -disable-llvm-optzns | FileCheck %s
|
|
+// RUN: %clang_cc1 %s -triple i686-linux -emit-llvm -o - -mconstructor-aliases | FileCheck --check-prefix=NOOPT %s
|
|
|
|
// RUN: %clang_cc1 -cc1 -triple x86_64--netbsd -emit-llvm \
|
|
// RUN: -mconstructor-aliases -O2 %s -o - | FileCheck --check-prefix=CHECK-RAUW %s
|
|
@@ -133,6 +133,22 @@ namespace test8 {
|
|
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 {{[^@]*}}]
|
|
// r194296 replaced C::~C with B::~B without emitting the later.
|
|
|