76 lines · plain
1; RUN: opt -mtriple=i686-pc-windows-msvc -S -x86-winehstate < %s | FileCheck %s2target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"3target triple = "i686-pc-windows-msvc"4 5@jb = external global i86 7define i32 @test1() personality ptr @__CxxFrameHandler3 {8entry:9; CHECK-LABEL: define i32 @test1(10; CHECK: %[[eh_reg:.*]] = alloca11; CHECK: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}} %[[eh_reg]], i32 0, i32 212; CHECK: store i32 -1, ptr %[[gep]]13; CHECK: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}} %[[eh_reg]], i32 0, i32 214; CHECK: store i32 0, ptr %[[gep]]15; CHECK: %[[lsda:.*]] = call ptr @llvm.x86.seh.lsda(ptr @test1)16; CHECK: invoke i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 3, ptr @__CxxLongjmpUnwind, i32 0, ptr %[[lsda]])17 %inv = invoke i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 0) #218 to label %invoke.cont unwind label %ehcleanup19 20invoke.cont:21; CHECK: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}} %[[eh_reg]], i32 0, i32 222; CHECK: store i32 -1, ptr %[[gep]]23; CHECK: %[[lsda:.*]] = call ptr @llvm.x86.seh.lsda(ptr @test1)24; CHECK: call i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 3, ptr @__CxxLongjmpUnwind, i32 -1, ptr %[[lsda]])25 call i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 0)26 call void @cleanup()27 ret i32 %inv28 29ehcleanup:30 %cp = cleanuppad within none []31; CHECK: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}} %[[eh_reg]], i32 0, i32 232; CHECK: %[[load:.*]] = load i32, ptr %[[gep]]33; CHECK: %[[lsda:.*]] = call ptr @llvm.x86.seh.lsda(ptr @test1)34; CHECK: call i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 3, ptr @__CxxLongjmpUnwind, i32 %[[load]], ptr %[[lsda]]) [ "funclet"(token %cp) ]35 %cal = call i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 0) [ "funclet"(token %cp) ]36 call void @cleanup() [ "funclet"(token %cp) ]37 cleanupret from %cp unwind to caller38}39 40define i32 @test2() personality ptr @_except_handler3 {41entry:42; CHECK-LABEL: define i32 @test2(43; CHECK: %[[eh_reg:.*]] = alloca44; CHECK: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}} %[[eh_reg]], i32 0, i32 445; CHECK: store i32 -1, ptr %[[gep]]46; CHECK: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}} %[[eh_reg]], i32 0, i32 447; CHECK: store i32 0, ptr %[[gep]]48; CHECK: invoke i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 2, ptr @_seh_longjmp_unwind, i32 0)49 %inv = invoke i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 0) #250 to label %invoke.cont unwind label %ehcleanup51 52invoke.cont:53; CHECK: %[[gep:.*]] = getelementptr inbounds {{.*}}, {{.*}} %[[eh_reg]], i32 0, i32 454; CHECK: store i32 -1, ptr %[[gep]]55; CHECK: call i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 2, ptr @_seh_longjmp_unwind, i32 -1)56 call i32 (ptr, i32, ...) @_setjmp3(ptr @jb, i32 0)57 call void @cleanup()58 ret i32 %inv59 60ehcleanup:61 %cp = cleanuppad within none []62 call void @cleanup() [ "funclet"(token %cp) ]63 cleanupret from %cp unwind to caller64}65 66; Function Attrs: returns_twice67declare i32 @_setjmp3(ptr, i32, ...) #268 69declare i32 @__CxxFrameHandler3(...)70 71declare i32 @_except_handler3(...)72 73declare void @cleanup()74 75attributes #2 = { returns_twice }76