1 // RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s 2 3 // FIXME: Rewrite CHECKs for unnamed BBs and Insts. 4 // REQUIRES: asserts 5 6 void g(); 7 8 ////////////////////////////////////////////////////////////////////////////// 9 // __leave with __except 10 11 // Nothing in the __try block can trap, so __try.cont isn't created. 12 int __leave_with___except_simple() { 13 int myres = 0; 14 __try { 15 myres = 15; 16 __leave; 17 myres = 23; 18 } __except (1) { 19 return 0; 20 } 21 return 1; 22 } 23 // CHECK-LABEL: define i32 @__leave_with___except_simple() 24 // CHECK: store i32 15, i32* %myres 25 // CHECK-NEXT: br label %__try.__leave 26 // CHECK-NOT: store i32 23 27 // CHECK: __try.__leave: 28 // CHECK-NEXT: ret i32 1 29 30 31 // The "normal" case. 32 int __leave_with___except() { 33 int myres = 0; 34 __try { 35 g(); 36 __leave; 37 myres = 23; 38 } __except (1) { 39 return 0; 40 } 41 return 1; 42 } 43 // CHECK-LABEL: define i32 @__leave_with___except() 44 // CHECK: invoke void bitcast (void (...)* @g to void ()*)() 45 // CHECK-NEXT: to label %[[cont:.*]] unwind label %{{.*}} 46 // For __excepts, instead of an explicit __try.__leave label, we could use 47 // use invoke.cont as __leave jump target instead. However, not doing this 48 // keeps the CodeGen code simpler, __leave is very rare, and SimplifyCFG will 49 // simplify this anyways. 50 // CHECK: [[cont]] 51 // CHECK-NEXT: br label %__try.__leave 52 // CHECK-NOT: store i32 23 53 // CHECK: __try.__leave: 54 // CHECK-NEXT: br label %__try.cont 55 56 57 ////////////////////////////////////////////////////////////////////////////// 58 // __leave with __finally 59 60 void abort(void) __attribute__((noreturn)); 61 62 // Nothing in the __try block can trap, so __finally.cont and friends aren't 63 // created. 64 int __leave_with___finally_simple() { 65 int myres = 0; 66 __try { 67 myres = 15; 68 __leave; 69 myres = 23; 70 } __finally { 71 return 0; 72 } 73 return 1; 74 } 75 // CHECK-LABEL: define i32 @__leave_with___finally_simple() 76 // CHECK: store i32 15, i32* %myres 77 // CHECK-NEXT: br label %__try.__leave 78 // CHECK-NOT: store i32 23 79 // CHECK: __try.__leave: 80 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot 81 // CHECK-NEXT: br label %__finally 82 83 // __finally block doesn't return, __finally.cont doesn't exist. 84 int __leave_with___finally_noreturn() { 85 int myres = 0; 86 __try { 87 myres = 15; 88 __leave; 89 myres = 23; 90 } __finally { 91 abort(); 92 } 93 return 1; 94 } 95 // CHECK-LABEL: define i32 @__leave_with___finally_noreturn() 96 // CHECK: store i32 15, i32* %myres 97 // CHECK-NEXT: br label %__try.__leave 98 // CHECK-NOT: store i32 23 99 // CHECK: __try.__leave: 100 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot 101 // CHECK-NEXT: br label %__finally 102 103 // The "normal" case. 104 int __leave_with___finally() { 105 int myres = 0; 106 __try { 107 g(); 108 __leave; 109 myres = 23; 110 } __finally { 111 return 0; 112 } 113 return 1; 114 } 115 // CHECK-LABEL: define i32 @__leave_with___finally() 116 // CHECK: invoke void bitcast (void (...)* @g to void ()*)() 117 // CHECK-NEXT: to label %[[cont:.*]] unwind label %{{.*}} 118 // For __finally, there needs to be an explicit __try.__leave, because 119 // abnormal.termination.slot needs to be set there. 120 // CHECK: [[cont]] 121 // CHECK-NEXT: br label %__try.__leave 122 // CHECK-NOT: store i32 23 123 // CHECK: __try.__leave: 124 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot 125 // CHECK-NEXT: br label %__finally 126 127 128 ////////////////////////////////////////////////////////////////////////////// 129 // Mixed, nested cases. 130 131 // FIXME: Test with outer __finally once PR22553 is fixed. 132 133 int nested___except___finally() { 134 int myres = 0; 135 __try { 136 __try { 137 g(); 138 } __finally { 139 g(); 140 __leave; // Refers to the outer __try, not the __finally! 141 myres = 23; 142 return 0; 143 } 144 145 myres = 51; 146 } __except (1) { 147 } 148 return 1; 149 } 150 // The order of basic blocks in the below doesn't matter. 151 // CHECK-LABEL: define i32 @nested___except___finally() 152 153 // CHECK-LABEL: invoke void bitcast (void (...)* @g to void ()*)() 154 // CHECK-NEXT: to label %[[g1_cont:.*]] unwind label %[[g1_lpad:.*]] 155 156 // CHECK: [[g1_cont]]: 157 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot 158 // CHECK-NEXT: br label %__finally 159 160 // CHECK-LABEL: __finally: 161 // CHECK-NEXT: invoke void bitcast (void (...)* @g to void ()*)() #3 162 // CHECK-NEXT: to label %[[g2_cont:.*]] unwind label %[[g2_lpad:.*]] 163 164 // CHECK: [[g2_cont]]: 165 // CHECK-NOT: store i32 23 166 // CHECK: br label %__try.__leave 167 168 // CHECK: [[g1_lpad]]: 169 // CHECK: store i8 1, i8* %abnormal.termination.slot 170 // CHECK-NEXT: br label %__finally 171 172 // CHECK: [[g2_lpad]]: 173 // CHECK-NOT: %abnormal.termination.slot 174 // CHECK: br label %__except 175 176 // CHECK-LABEL: __except: 177 // CHECK-NEXT: br label %__try.cont 178 179 // CHECK-LABEL: __try.__leave: 180 // CHECK-NEXT: br label %__try.cont 181 182 int nested___except___except() { 183 int myres = 0; 184 __try { 185 __try { 186 g(); 187 myres = 16; 188 } __except (1) { 189 g(); 190 __leave; // Refers to the outer __try, not the __except we're in! 191 myres = 23; 192 return 0; 193 } 194 195 myres = 51; 196 } __except (1) { 197 } 198 return 1; 199 } 200 // The order of basic blocks in the below doesn't matter. 201 // CHECK-LABEL: define i32 @nested___except___except() 202 203 // CHECK-LABEL: invoke void bitcast (void (...)* @g to void ()*)() 204 // CHECK-NEXT: to label %[[g1_cont:.*]] unwind label %[[g1_lpad:.*]] 205 206 // CHECK: [[g1_cont]]: 207 // CHECK: store i32 16, i32* %myres 208 // CHECK-NEXT: br label %__try.cont 209 210 // CHECK: [[g1_lpad]]: 211 // CHECK: br label %__except 212 213 // CHECK-LABEL: __except: 214 // CHECK-NEXT: invoke void bitcast (void (...)* @g to void ()*)() #3 215 // CHECK-NEXT: to label %[[g2_cont:.*]] unwind label %[[g2_lpad:.*]] 216 217 // CHECK: [[g2_cont]]: 218 // CHECK-NOT: store i32 23 219 // CHECK: br label %__try.__leave 220 221 // CHECK: [[g2_lpad]]: 222 // CHECK: br label %__except3 223 224 // CHECK-LABEL: __except3: 225 // CHECK-NEXT: br label %__try.cont4 226 227 // CHECK-LABEL: __try.cont: 228 // CHECK-NEXT: store i32 51, i32* %myres 229 // CHECK-NEXT: br label %__try.__leave 230 231 // CHECK-LABEL: __try.__leave: 232 // CHECK-NEXT: br label %__try.cont4 233