~pali/+junk/llvm-toolchain-3.7

« back to all changes in this revision

Viewing changes to test/CodeGen/WinEH/cppeh-catch-all.ll

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2015-07-15 17:51:08 UTC
  • Revision ID: package-import@ubuntu.com-20150715175108-l8mynwovkx4zx697
Tags: upstream-3.7~+rc2
ImportĀ upstreamĀ versionĀ 3.7~+rc2

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
; RUN: opt -mtriple=x86_64-pc-windows-msvc -winehprepare -S -o - < %s | FileCheck %s
 
2
 
 
3
; This test is based on the following code:
 
4
;
 
5
; void test()
 
6
; {
 
7
;   try {
 
8
;     may_throw();
 
9
;   } catch (...) {
 
10
;     handle_exception();
 
11
;   }
 
12
; }
 
13
;
 
14
; Parts of the IR have been hand-edited to simplify the test case.
 
15
; The full IR will be restored when Windows C++ EH support is complete.
 
16
 
 
17
; ModuleID = 'catch-all.cpp'
 
18
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 
19
target triple = "x86_64-pc-windows-msvc"
 
20
 
 
21
; The function entry in this case remains unchanged.
 
22
; CHECK: define void @_Z4testv()
 
23
; CHECK: entry:
 
24
; CHECK:   invoke void @_Z9may_throwv()
 
25
; CHECK:           to label %invoke.cont unwind label %[[LPAD_LABEL:lpad[0-9]*]]
 
26
 
 
27
; Function Attrs: uwtable
 
28
define void @_Z4testv() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
 
29
entry:
 
30
  %exn.slot = alloca i8*
 
31
  %ehselector.slot = alloca i32
 
32
  invoke void @_Z9may_throwv()
 
33
          to label %invoke.cont unwind label %lpad
 
34
 
 
35
invoke.cont:                                      ; preds = %entry
 
36
  br label %try.cont
 
37
 
 
38
; CHECK: [[LPAD_LABEL]]:{{[ ]+}}; preds = %entry
 
39
; CHECK:   landingpad { i8*, i32 }
 
40
; CHECK-NEXT:           catch i8* null
 
41
; CHECK-NEXT:   [[RECOVER:\%.+]] = call i8* (...) @llvm.eh.actions(i32 1, i8* null, i32 -1, i8* (i8*, i8*)* @_Z4testv.catch)
 
42
; CHECK-NEXT:   indirectbr i8* [[RECOVER]], [label %try.cont]
 
43
 
 
44
lpad:                                             ; preds = %entry
 
45
  %tmp = landingpad { i8*, i32 }
 
46
          catch i8* null
 
47
  %tmp1 = extractvalue { i8*, i32 } %tmp, 0
 
48
  store i8* %tmp1, i8** %exn.slot
 
49
  %tmp2 = extractvalue { i8*, i32 } %tmp, 1
 
50
  store i32 %tmp2, i32* %ehselector.slot
 
51
  br label %catch
 
52
 
 
53
; CHECK-NOT: catch:
 
54
 
 
55
catch:                                            ; preds = %lpad
 
56
  %exn = load i8*, i8** %exn.slot
 
57
  call void @llvm.eh.begincatch(i8* %exn, i8* null) #2
 
58
  call void @_Z16handle_exceptionv()
 
59
  br label %invoke.cont2
 
60
 
 
61
; CHECK-NOT: invoke.cont2:
 
62
 
 
63
invoke.cont2:                                     ; preds = %catch
 
64
  call void @llvm.eh.endcatch()
 
65
  br label %try.cont
 
66
 
 
67
try.cont:                                         ; preds = %invoke.cont2, %invoke.cont
 
68
  ret void
 
69
 
 
70
; CHECK: }
 
71
}
 
72
 
 
73
; CHECK: define internal i8* @_Z4testv.catch(i8*, i8*)
 
74
; CHECK: entry:
 
75
; CHECK:   call void @_Z16handle_exceptionv()
 
76
; CHECK:   ret i8* blockaddress(@_Z4testv, %try.cont)
 
77
; CHECK: }
 
78
 
 
79
declare void @_Z9may_throwv() #1
 
80
 
 
81
declare i32 @__CxxFrameHandler3(...)
 
82
 
 
83
declare void @llvm.eh.begincatch(i8*, i8*)
 
84
 
 
85
declare void @_Z16handle_exceptionv() #1
 
86
 
 
87
declare void @llvm.eh.endcatch()
 
88
 
 
89
attributes #0 = { uwtable "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
 
90
attributes #1 = { "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
 
91
attributes #2 = { noinline noreturn nounwind }
 
92
attributes #3 = { nounwind }
 
93
attributes #4 = { noreturn nounwind }
 
94
 
 
95
!llvm.ident = !{!0}
 
96
 
 
97
!0 = !{!"clang version 3.7.0 (trunk 226027)"}