diff options
author | Reid Kleckner <reid@kleckner.net> | 2015-07-01 22:33:45 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2015-07-01 22:33:45 +0000 |
commit | 698310b004f83e9b4300c1d1bbd53ead0bc7f77d (patch) | |
tree | 998505f6034bd551b619c7d9dc0f9b5f10be4638 /clang/test/CodeGen/exceptions-seh.c | |
parent | 489759672814aab8af90985efef1d4812266e9a5 (diff) | |
download | bcm5719-llvm-698310b004f83e9b4300c1d1bbd53ead0bc7f77d.tar.gz bcm5719-llvm-698310b004f83e9b4300c1d1bbd53ead0bc7f77d.zip |
[SEH] Update EmitCapturedLocals to match r241187
It was still using frameaddress(1) to get the parent FP, even though it
had the value it wanted as a parameter.
llvm-svn: 241199
Diffstat (limited to 'clang/test/CodeGen/exceptions-seh.c')
-rw-r--r-- | clang/test/CodeGen/exceptions-seh.c | 27 |
1 files changed, 14 insertions, 13 deletions
diff --git a/clang/test/CodeGen/exceptions-seh.c b/clang/test/CodeGen/exceptions-seh.c index 772fe547ba5..3eba3a412fe 100644 --- a/clang/test/CodeGen/exceptions-seh.c +++ b/clang/test/CodeGen/exceptions-seh.c @@ -168,21 +168,20 @@ int nested_try(void) { // CHECK: load i32, i32* // CHECK: icmp eq i32 %{{.*}}, 123 -static unsigned g = 0; -void basic_finally(void) { - ++g; +int basic_finally(int g) { __try { j(); } __finally { - --g; + ++g; } + return g; } -// CHECK-LABEL: define void @basic_finally() +// CHECK-LABEL: define i32 @basic_finally(i32 %g) // X64-SAME: personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) // X86-SAME: personality i8* bitcast (i32 (...)* @_except_handler3 to i8*) -// CHECK: load i32, i32* @g -// CHECK: add i32 %{{.*}}, 1 -// CHECK: store i32 %{{.*}}, i32* @g +// CHECK: %[[g_addr:[^ ]*]] = alloca i32, align 4 +// CHECK: call void (...) @llvm.frameescape(i32* %[[g_addr]]) +// CHECK: store i32 %g, i32* %[[g_addr]] // // CHECK: invoke void @j() // CHECK: to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]] @@ -190,7 +189,8 @@ void basic_finally(void) { // CHECK: [[cont]] // CHECK: %[[fp:[^ ]*]] = call i8* @llvm.frameaddress(i32 0) // CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 0, i8* %[[fp]]) -// CHECK: ret void +// CHECK: load i32, i32* %[[g_addr]], align 4 +// CHECK: ret i32 // // CHECK: [[lpad]] // CHECK: landingpad { i8*, i32 } @@ -199,10 +199,11 @@ void basic_finally(void) { // CHECK: call void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} 1, i8* %[[fp]]) // CHECK: resume -// CHECK: define internal void @"\01?fin$0@0@basic_finally@@"({{.*}}) -// CHECK: load i32, i32* @g, align 4 -// CHECK: add i32 %{{.*}}, -1 -// CHECK: store i32 %{{.*}}, i32* @g, align 4 +// CHECK: define internal void @"\01?fin$0@0@basic_finally@@"({{i8( zeroext)?}} %abnormal_termination, i8* %frame_pointer) +// CHECK: call i8* @llvm.framerecover(i8* bitcast (i32 (i32)* @basic_finally to i8*), i8* %frame_pointer, i32 0) +// CHECK: load i32, i32* %{{.*}}, align 4 +// CHECK: add nsw i32 %{{.*}}, 1 +// CHECK: store i32 %{{.*}}, i32* %{{.*}}, align 4 // CHECK: ret void int returns_int(void); |