summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86FrameLowering.cpp
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2015-09-10 00:25:23 +0000
committerReid Kleckner <rnk@google.com>2015-09-10 00:25:23 +0000
commit787839120885519d4cbff64ad59e179bdf3744fa (patch)
treedd894b990329961d9452bd1f672fe38c263c7100 /llvm/lib/Target/X86/X86FrameLowering.cpp
parent60f3e1f466c9dfa834ab9e71ae4fe0589a42774f (diff)
downloadbcm5719-llvm-787839120885519d4cbff64ad59e179bdf3744fa.tar.gz
bcm5719-llvm-787839120885519d4cbff64ad59e179bdf3744fa.zip
[WinEH] Add codegen support for cleanuppad and cleanupret
All of the complexity is in cleanupret, and it mostly follows the same codepaths as catchret, except it doesn't take a return value in RAX. This small example now compiles and executes successfully on win32: extern "C" int printf(const char *, ...) noexcept; struct Dtor { ~Dtor() { printf("~Dtor\n"); } }; void has_cleanup() { Dtor o; throw 42; } int main() { try { has_cleanup(); } catch (int) { printf("caught it\n"); } } Don't try to put the cleanup in the same function as the catch, or Bad Things will happen. llvm-svn: 247219
Diffstat (limited to 'llvm/lib/Target/X86/X86FrameLowering.cpp')
-rw-r--r--llvm/lib/Target/X86/X86FrameLowering.cpp2
1 files changed, 2 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86FrameLowering.cpp b/llvm/lib/Target/X86/X86FrameLowering.cpp
index e6c62b8dd6b..032e003fe47 100644
--- a/llvm/lib/Target/X86/X86FrameLowering.cpp
+++ b/llvm/lib/Target/X86/X86FrameLowering.cpp
@@ -1030,6 +1030,8 @@ static bool isFuncletReturnInstr(MachineInstr *MI) {
switch (MI->getOpcode()) {
case X86::CATCHRET:
case X86::CATCHRET64:
+ case X86::CLEANUPRET:
+ case X86::CLEANUPRET64:
return true;
default:
return false;
OpenPOWER on IntegriCloud