diff options
Diffstat (limited to 'contrib/llvm/patches/patch-r262809-clang-r203007-destructor-calling-conv.diff')
-rw-r--r-- | contrib/llvm/patches/patch-r262809-clang-r203007-destructor-calling-conv.diff | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/contrib/llvm/patches/patch-r262809-clang-r203007-destructor-calling-conv.diff b/contrib/llvm/patches/patch-r262809-clang-r203007-destructor-calling-conv.diff new file mode 100644 index 0000000..5341b8b --- /dev/null +++ b/contrib/llvm/patches/patch-r262809-clang-r203007-destructor-calling-conv.diff @@ -0,0 +1,61 @@ +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. + |