diff options
| author | Reid Kleckner <rnk@google.com> | 2017-05-31 22:35:52 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2017-05-31 22:35:52 +0000 |
| commit | fc7ba565ed32b972a58e62ddd864e7e84eeb2977 (patch) | |
| tree | ebaab40a5fd1b110dfad3b57e79d8e8ab0455742 | |
| parent | 605f779516f93df9ae3c976cc00d94f4dafdaf21 (diff) | |
| download | bcm5719-llvm-fc7ba565ed32b972a58e62ddd864e7e84eeb2977.tar.gz bcm5719-llvm-fc7ba565ed32b972a58e62ddd864e7e84eeb2977.zip | |
[EH] Recognize __(gxx|gcc)_personality_seh0 as the GNU EH personalities
These are no-ops when there are no invokes. We don't need to emit LSDAs
for them.
Fixes PR33220.
llvm-svn: 304367
| -rw-r--r-- | llvm/lib/Analysis/EHPersonalities.cpp | 2 | ||||
| -rw-r--r-- | llvm/test/CodeGen/X86/gnu-seh-nolpads.ll | 34 |
2 files changed, 36 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/EHPersonalities.cpp b/llvm/lib/Analysis/EHPersonalities.cpp index ebf0a370b0b..b12ae9884e3 100644 --- a/llvm/lib/Analysis/EHPersonalities.cpp +++ b/llvm/lib/Analysis/EHPersonalities.cpp @@ -27,8 +27,10 @@ EHPersonality llvm::classifyEHPersonality(const Value *Pers) { return StringSwitch<EHPersonality>(F->getName()) .Case("__gnat_eh_personality", EHPersonality::GNU_Ada) .Case("__gxx_personality_v0", EHPersonality::GNU_CXX) + .Case("__gxx_personality_seh0",EHPersonality::GNU_CXX) .Case("__gxx_personality_sj0", EHPersonality::GNU_CXX_SjLj) .Case("__gcc_personality_v0", EHPersonality::GNU_C) + .Case("__gcc_personality_seh0",EHPersonality::GNU_C) .Case("__gcc_personality_sj0", EHPersonality::GNU_C_SjLj) .Case("__objc_personality_v0", EHPersonality::GNU_ObjC) .Case("_except_handler3", EHPersonality::MSVC_X86SEH) diff --git a/llvm/test/CodeGen/X86/gnu-seh-nolpads.ll b/llvm/test/CodeGen/X86/gnu-seh-nolpads.ll new file mode 100644 index 00000000000..311f4d522b1 --- /dev/null +++ b/llvm/test/CodeGen/X86/gnu-seh-nolpads.ll @@ -0,0 +1,34 @@ +; RUN: llc -mtriple=x86_64-windows-gnu < %s | FileCheck %s + +declare void @throwit() +declare void @__gxx_personality_seh0(...) +declare void @__gcc_personality_seh0(...) + +define void @use_gxx_seh() + personality void (...)* @__gxx_personality_seh0 { +entry: + call void @throwit() + unreachable +} + +; CHECK-LABEL: use_gxx_seh: +; CHECK: .seh_proc use_gxx_seh +; CHECK-NOT: .seh_handler __gxx_personality_seh0 +; CHECK: callq throwit +; CHECK: .seh_handlerdata +; CHECK: .seh_endproc + +define void @use_gcc_seh() + personality void (...)* @__gcc_personality_seh0 { +entry: + call void @throwit() + unreachable +} + +; CHECK-LABEL: use_gcc_seh: +; CHECK: .seh_proc use_gcc_seh +; CHECK-NOT: .seh_handler __gcc_personality_seh0 +; CHECK: callq throwit +; CHECK: .seh_handlerdata +; CHECK: .seh_endproc + |

