X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=test%2FCodeGen%2FX86%2Fseh-except-finally.ll;h=c15ecfcd77b261e8cdd39e381dba98e0524c7716;hb=b46bb541f5f78520b08c1b50463c3517041d26de;hp=42f7d729c1b38e8d666bae6e911901153ccc7f23;hpb=405cc64eace384f436e7ea7cf6a3e1491cdc4093;p=oota-llvm.git diff --git a/test/CodeGen/X86/seh-except-finally.ll b/test/CodeGen/X86/seh-except-finally.ll index 42f7d729c1b..c15ecfcd77b 100644 --- a/test/CodeGen/X86/seh-except-finally.ll +++ b/test/CodeGen/X86/seh-except-finally.ll @@ -1,4 +1,4 @@ -; RUN: llc -sehprepare < %s | FileCheck %s +; RUN: llc < %s | FileCheck %s ; Test case based on this source: ; int puts(const char*); @@ -33,89 +33,67 @@ declare void @crash() declare i32 @filt() ; Function Attrs: nounwind uwtable -define void @use_both() #1 { +define void @use_both() #1 personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) { entry: %exn.slot = alloca i8* %ehselector.slot = alloca i32 invoke void @crash() #5 - to label %invoke.cont unwind label %lpad + to label %invoke.cont unwind label %__finally invoke.cont: ; preds = %entry - %0 = call i8* @llvm.frameaddress(i32 0) + %0 = call i8* @llvm.localaddress() invoke void @"\01?fin$0@0@use_both@@"(i1 zeroext false, i8* %0) #5 - to label %invoke.cont2 unwind label %lpad1 + to label %invoke.cont2 unwind label %catch.dispatch invoke.cont2: ; preds = %invoke.cont br label %__try.cont -lpad: ; preds = %entry - %1 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) - cleanup - catch i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@use_both@@" to i8*) - %2 = extractvalue { i8*, i32 } %1, 0 - store i8* %2, i8** %exn.slot - %3 = extractvalue { i8*, i32 } %1, 1 - store i32 %3, i32* %ehselector.slot - %4 = call i8* @llvm.frameaddress(i32 0) - invoke void @"\01?fin$0@0@use_both@@"(i1 zeroext true, i8* %4) #5 - to label %invoke.cont3 unwind label %lpad1 - -lpad1: ; preds = %lpad, %invoke.cont - %5 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__C_specific_handler to i8*) - catch i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@use_both@@" to i8*) - %6 = extractvalue { i8*, i32 } %5, 0 - store i8* %6, i8** %exn.slot - %7 = extractvalue { i8*, i32 } %5, 1 - store i32 %7, i32* %ehselector.slot - br label %catch.dispatch +__finally: ; preds = %entry + %cleanuppad = cleanuppad within none [] + %locals = call i8* @llvm.localaddress() + invoke void @"\01?fin$0@0@use_both@@"(i1 zeroext true, i8* %locals) #5 [ "funclet"(token %cleanuppad) ] + to label %invoke.cont3 unwind label %catch.dispatch -invoke.cont3: ; preds = %lpad - br label %catch.dispatch +invoke.cont3: ; preds = %__finally + cleanupret from %cleanuppad unwind label %catch.dispatch catch.dispatch: ; preds = %invoke.cont3, %lpad1 - %sel = load i32, i32* %ehselector.slot - %8 = call i32 @llvm.eh.typeid.for(i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@use_both@@" to i8*)) #6 - %matches = icmp eq i32 %sel, %8 - br i1 %matches, label %__except, label %eh.resume + %cs1 = catchswitch within none [label %__except] unwind to caller __except: ; preds = %catch.dispatch - %call = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @"\01??_C@_08MLCMLGHM@__except?$AA@", i32 0, i32 0)) - br label %__try.cont + %catchpad = catchpad within %cs1 [i8* bitcast (i32 (i8*, i8*)* @"\01?filt$0@0@use_both@@" to i8*)] + %call = call i32 @puts(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @"\01??_C@_08MLCMLGHM@__except?$AA@", i32 0, i32 0)) [ "funclet"(token %catchpad) ] + catchret from %catchpad to label %__try.cont __try.cont: ; preds = %__except, %invoke.cont2 ret void - -eh.resume: ; preds = %catch.dispatch - %exn = load i8*, i8** %exn.slot - %sel4 = load i32, i32* %ehselector.slot - %lpad.val = insertvalue { i8*, i32 } undef, i8* %exn, 0 - %lpad.val5 = insertvalue { i8*, i32 } %lpad.val, i32 %sel4, 1 - resume { i8*, i32 } %lpad.val5 } ; CHECK-LABEL: use_both: ; CHECK: .Ltmp0 ; CHECK: callq crash ; CHECK: .Ltmp1 -; CHECK: .Ltmp3 -; CHECK: callq "?fin$0@0@use_both@@" ; CHECK: .Ltmp4 +; CHECK: callq "?fin$0@0@use_both@@" +; CHECK: .Ltmp5 ; CHECK: retq ; ; CHECK: .seh_handlerdata -; CHECK-NEXT: .long 3 -; CHECK-NEXT: .long .Ltmp0@IMGREL +; CHECK-NEXT: .long (.Llsda_end0-.Llsda_begin0)/16 +; CHECK-NEXT: .Llsda_begin0: +; CHECK-NEXT: .long .Ltmp0@IMGREL+1 ; CHECK-NEXT: .long .Ltmp1@IMGREL+1 -; CHECK-NEXT: .long "?fin$0@0@use_both@@"@IMGREL +; CHECK-NEXT: .long "?dtor$2@?0?use_both@4HA"@IMGREL ; CHECK-NEXT: .long 0 -; CHECK-NEXT: .long .Ltmp0@IMGREL +; CHECK-NEXT: .long .Ltmp0@IMGREL+1 ; CHECK-NEXT: .long .Ltmp1@IMGREL+1 ; CHECK-NEXT: .long "?filt$0@0@use_both@@"@IMGREL -; CHECK-NEXT: .long .Ltmp{{[0-9]+}}@IMGREL -; CHECK-NEXT: .long .Ltmp3@IMGREL +; CHECK-NEXT: .long .LBB0_{{[0-9]+}}@IMGREL ; CHECK-NEXT: .long .Ltmp4@IMGREL+1 +; CHECK-NEXT: .long .Ltmp5@IMGREL+1 ; CHECK-NEXT: .long "?filt$0@0@use_both@@"@IMGREL -; CHECK-NEXT: .long .Ltmp{{[0-9]+}}@IMGREL +; CHECK-NEXT: .long .LBB0_{{[0-9]+}}@IMGREL +; CHECK-NEXT: .Llsda_end0: ; Function Attrs: noinline nounwind define internal i32 @"\01?filt$0@0@use_both@@"(i8* %exception_pointers, i8* %frame_pointer) #2 { @@ -153,7 +131,7 @@ declare i32 @puts(i8*) #3 declare i32 @__C_specific_handler(...) ; Function Attrs: nounwind readnone -declare i8* @llvm.frameaddress(i32) #4 +declare i8* @llvm.localaddress() #4 ; Function Attrs: nounwind readnone declare i32 @llvm.eh.typeid.for(i8*) #4