From f47928ddd97f248ef991d78efb3322dc49910bd7 Mon Sep 17 00:00:00 2001 From: Reid Kleckner <rnk@google.com> Date: Wed, 29 Nov 2017 21:35:34 +0000 Subject: [PATCH] [EH] Use __CxxFrameHandler3 for C++ EH in MS environments Fixes regression introduced by r319297. MSVC environments still use SEH unwind opcodes but they should use the Microsoft C++ EH personality, not the mingw one. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@319363 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGException.cpp | 5 +---- test/CodeGenCXX/ms-eh-personality.cpp | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 test/CodeGenCXX/ms-eh-personality.cpp diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index d6a9538bc1f..6c9d9f170ac 100644 --- a/lib/CodeGen/CGException.cpp +++ b/lib/CodeGen/CGException.cpp @@ -205,12 +205,9 @@ const EHPersonality &EHPersonality::get(CodeGenModule &CGM, if (T.isWindowsMSVCEnvironment() && !L.ObjC1) { if (L.SjLjExceptions) return EHPersonality::GNU_CPlusPlus_SJLJ; - if (L.SEHExceptions) - return EHPersonality::GNU_CPlusPlus_SEH; if (L.DWARFExceptions) return EHPersonality::GNU_CPlusPlus; - else - return EHPersonality::MSVC_CxxFrameHandler3; + return EHPersonality::MSVC_CxxFrameHandler3; } if (L.CPlusPlus && L.ObjC1) diff --git a/test/CodeGenCXX/ms-eh-personality.cpp b/test/CodeGenCXX/ms-eh-personality.cpp new file mode 100644 index 00000000000..592ab69efaf --- /dev/null +++ b/test/CodeGenCXX/ms-eh-personality.cpp @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 -triple x86_64-windows-msvc -fexceptions -fcxx-exceptions %s -emit-llvm -o - | FileCheck %s --check-prefix=MSVC +// RUN: %clang_cc1 -triple x86_64-windows-msvc -fexceptions -fcxx-exceptions -fsjlj-exceptions %s -emit-llvm -o - | FileCheck %s --check-prefix=SJLJ +// RUN: %clang_cc1 -triple x86_64-windows-msvc -fexceptions -fcxx-exceptions -fseh-exceptions %s -emit-llvm -o - | FileCheck %s --check-prefix=MSVC +// RUN: %clang_cc1 -triple x86_64-windows-msvc -fexceptions -fcxx-exceptions -fdwarf-exceptions %s -emit-llvm -o - | FileCheck %s --check-prefix=DWARF + +// MSVC: define void @f(){{.*}}@__CxxFrameHandler3 +// SJLJ: define void @f(){{.*}}@__gxx_personality_sj0 +// DWARF: define void @f(){{.*}}@__gxx_personality_v0 + +struct Cleanup { + Cleanup(); + ~Cleanup(); + int x = 0; +}; + +void g(); +extern "C" void f() { + Cleanup c; + g(); +} -- GitLab