brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.1 KiB · 950e4c9 Raw
137 lines · plain
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -emit-llvm -fobjc-arc -fexceptions -fobjc-exceptions -fcxx-exceptions -fobjc-runtime-has-weak -o - -fobjc-arc-exceptions %s | FileCheck %s2 3@class Ety;4 5// These first four tests are all PR11732.6 7void test0_helper(void);8void test0(void) {9  @try {10    test0_helper();11  } @catch (Ety *e) {12  }13}14// CHECK-LABEL: define{{.*}} void @_Z5test0v()15// CHECK:      [[E:%e]] = alloca ptr, align 816// CHECK-NEXT: invoke void @_Z12test0_helperv()17// CHECK:      [[T0:%.*]] = call ptr @objc_begin_catch(18// CHECK-NEXT: [[T3:%.*]] = call ptr @llvm.objc.retain(ptr [[T0]]) [[NUW:#[0-9]+]]19// CHECK-NEXT: store ptr [[T3]], ptr [[E]]20// CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[E]], ptr null) [[NUW]]21// CHECK-NEXT: call void @objc_end_catch() [[NUW]]22 23void test1_helper(void);24void test1(void) {25  @try {26    test1_helper();27  } @catch (__weak Ety *e) {28  }29}30// CHECK-LABEL: define{{.*}} void @_Z5test1v()31// CHECK:      [[E:%e]] = alloca ptr, align 832// CHECK-NEXT: invoke void @_Z12test1_helperv()33// CHECK:      [[T0:%.*]] = call ptr @objc_begin_catch(34// CHECK-NEXT: call ptr @llvm.objc.initWeak(ptr [[E]], ptr [[T0]]) [[NUW]]35// CHECK-NEXT: call void @llvm.objc.destroyWeak(ptr [[E]]) [[NUW]]36// CHECK-NEXT: call void @objc_end_catch() [[NUW]]37 38void test2_helper(void);39void test2(void) {40  try {41    test2_helper();42  } catch (Ety *e) {43  }44}45// CHECK-LABEL: define{{.*}} void @_Z5test2v()46// CHECK:      [[E:%e]] = alloca ptr, align 847// CHECK-NEXT: invoke void @_Z12test2_helperv()48// CHECK:      [[T0:%.*]] = call ptr @__cxa_begin_catch(49// CHECK-NEXT: [[T3:%.*]] = call ptr @llvm.objc.retain(ptr [[T0]]) [[NUW]]50// CHECK-NEXT: store ptr [[T3]], ptr [[E]]51// CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[E]], ptr null) [[NUW]]52// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]53 54void test3_helper(void);55void test3(void) {56  try {57    test3_helper();58  } catch (Ety * __weak e) {59  }60}61// CHECK-LABEL: define{{.*}} void @_Z5test3v()62// CHECK:      [[E:%e]] = alloca ptr, align 863// CHECK-NEXT: invoke void @_Z12test3_helperv()64// CHECK:      [[T0:%.*]] = call ptr @__cxa_begin_catch(65// CHECK-NEXT: call ptr @llvm.objc.initWeak(ptr [[E]], ptr [[T0]]) [[NUW]]66// CHECK-NEXT: call void @llvm.objc.destroyWeak(ptr [[E]]) [[NUW]]67// CHECK-NEXT: call void @__cxa_end_catch() [[NUW]]68 69namespace test4 {70  struct A {71    id single;72    id array[2][3];73 74    A();75  };76 77  A::A() {78    throw 0;79  }80  // CHECK-LABEL:    define{{.*}} void @_ZN5test41AC2Ev(81  // CHECK:      [[THIS:%.*]] = load ptr, ptr {{%.*}}82  //   Construct single.83  // CHECK-NEXT: [[SINGLE:%.*]] = getelementptr inbounds nuw [[A:%.*]], ptr [[THIS]], i32 0, i32 084  // CHECK-NEXT: store ptr null, ptr [[SINGLE]], align 885  //   Construct array.86  // CHECK-NEXT: [[ARRAY:%.*]] = getelementptr inbounds nuw [[A:%.*]], ptr [[THIS]], i32 0, i32 187  // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[ARRAY]], i8 0, i64 48, i1 false)88  //   throw 0;89  // CHECK:      invoke void @__cxa_throw(90  //   Landing pad from throw site:91  // CHECK:      landingpad92  //     - First, destroy all of array.93  // CHECK:      [[ARRAYBEGIN:%.*]] = getelementptr inbounds [2 x [3 x ptr]], ptr [[ARRAY]], i32 0, i32 0, i32 094  // CHECK-NEXT: [[ARRAYEND:%.*]] = getelementptr inbounds ptr, ptr [[ARRAYBEGIN]], i64 695  // CHECK-NEXT: br label96  // CHECK:      [[AFTER:%.*]] = phi ptr [ [[ARRAYEND]], {{%.*}} ], [ [[ELT:%.*]], {{%.*}} ]97  // CHECK-NEXT: [[ELT]] = getelementptr inbounds ptr, ptr [[AFTER]], i64 -198  // CHECK-NEXT: call void @llvm.objc.storeStrong(ptr [[ELT]], ptr null) [[NUW]]99  // CHECK-NEXT: [[DONE:%.*]] = icmp eq ptr [[ELT]], [[ARRAYBEGIN]]100  // CHECK-NEXT: br i1 [[DONE]],101  //     - Next, destroy single.102  // CHECK:      call void @llvm.objc.storeStrong(ptr [[SINGLE]], ptr null) [[NUW]]103  // CHECK:      br label104  // CHECK:      resume105}106 107__attribute__((ns_returns_retained)) id test5_helper(unsigned);108void test5(void) {109  id array[][2] = {110    test5_helper(0),111    test5_helper(1),112    test5_helper(2),113    test5_helper(3)114  };115}116// CHECK-LABEL: define{{.*}} void @_Z5test5v()117// CHECK:       [[ARRAY:%.*]] = alloca [2 x [2 x ptr]], align118// CHECK:       store ptr [[ARRAY]],119// CHECK-NEXT:  store ptr [[ARRAY]],120// CHECK-NEXT:  [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 0)121// CHECK:       store ptr [[T0]], ptr [[ARRAY]], align122// CHECK-NEXT:  [[A01:%.*]] = getelementptr inbounds ptr, ptr [[ARRAY]], i64 1123// CHECK-NEXT:  store ptr [[A01]],124// CHECK-NEXT:  [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 1)125// CHECK:       store ptr [[T0]], ptr [[A01]], align126// CHECK-NEXT:  [[A1:%.*]] = getelementptr inbounds [2 x ptr], ptr [[ARRAY]], i64 1127// CHECK-NEXT:  store ptr [[A1]],128// CHECK-NEXT:  store ptr [[A1]],129// CHECK-NEXT:  [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 2)130// CHECK:       store ptr [[T0]], ptr [[A1]], align131// CHECK-NEXT:  [[A11:%.*]] = getelementptr inbounds ptr, ptr [[A1]], i64 1132// CHECK-NEXT:  store ptr [[A11]],133// CHECK-NEXT:  [[T0:%.*]] = invoke noundef ptr @_Z12test5_helperj(i32 noundef 3)134// CHECK:       store ptr [[T0]], ptr [[A11]], align135 136// CHECK: attributes [[NUW]] = { nounwind }137