brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.8 KiB · 6c2f0c1 Raw
126 lines · c
1// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsanitize=unsigned-integer-overflow %s -emit-llvm -o - | FileCheck %s2// Verify checked operations are emitted for integers and longs.3// unsigned short/char's tested in unsigned-promotion.c4 5unsigned long li, lj, lk;6unsigned int ii, ij, ik;7 8extern void opaquelong(unsigned long);9extern void opaqueint(unsigned int);10 11// CHECK-LABEL: define{{.*}} void @testlongadd()12void testlongadd(void) {13 14  // CHECK:      [[T1:%.*]] = load i64, ptr @lj15  // CHECK-NEXT: [[T2:%.*]] = load i64, ptr @lk16  // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 [[T2]])17  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 018  // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 119  // CHECK: call void @__ubsan_handle_add_overflow20  li = lj + lk;21}22 23// CHECK-LABEL: define{{.*}} void @testlongsub()24void testlongsub(void) {25 26  // CHECK:      [[T1:%.*]] = load i64, ptr @lj27  // CHECK-NEXT: [[T2:%.*]] = load i64, ptr @lk28  // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.usub.with.overflow.i64(i64 [[T1]], i64 [[T2]])29  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 030  // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 131  // CHECK: call void @__ubsan_handle_sub_overflow32  li = lj - lk;33}34 35// CHECK-LABEL: define{{.*}} void @testlongmul()36void testlongmul(void) {37 38  // CHECK:      [[T1:%.*]] = load i64, ptr @lj39  // CHECK-NEXT: [[T2:%.*]] = load i64, ptr @lk40  // CHECK-NEXT: [[T3:%.*]] = call { i64, i1 } @llvm.umul.with.overflow.i64(i64 [[T1]], i64 [[T2]])41  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T3]], 042  // CHECK-NEXT: [[T5:%.*]] = extractvalue { i64, i1 } [[T3]], 143  // CHECK: call void @__ubsan_handle_mul_overflow44  li = lj * lk;45}46 47// CHECK-LABEL: define{{.*}} void @testlongpostinc()48void testlongpostinc(void) {49  opaquelong(li++);50 51  // CHECK:      [[T1:%.*]] = load i64, ptr @li52  // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)53  // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 054  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 155  // CHECK:      call void @__ubsan_handle_add_overflow56}57 58// CHECK-LABEL: define{{.*}} void @testlongpreinc()59void testlongpreinc(void) {60  opaquelong(++li);61 62  // CHECK:      [[T1:%.*]] = load i64, ptr @li63  // CHECK-NEXT: [[T2:%.*]] = call { i64, i1 } @llvm.uadd.with.overflow.i64(i64 [[T1]], i64 1)64  // CHECK-NEXT: [[T3:%.*]] = extractvalue { i64, i1 } [[T2]], 065  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i64, i1 } [[T2]], 166  // CHECK:      call void @__ubsan_handle_add_overflow67}68 69// CHECK-LABEL: define{{.*}} void @testintadd()70void testintadd(void) {71 72  // CHECK:      [[T1:%.*]] = load i32, ptr @ij73  // CHECK-NEXT: [[T2:%.*]] = load i32, ptr @ik74  // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 [[T2]])75  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 076  // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 177  // CHECK:      call void @__ubsan_handle_add_overflow78  ii = ij + ik;79}80 81// CHECK-LABEL: define{{.*}} void @testintsub()82void testintsub(void) {83 84  // CHECK:      [[T1:%.*]] = load i32, ptr @ij85  // CHECK-NEXT: [[T2:%.*]] = load i32, ptr @ik86  // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 [[T1]], i32 [[T2]])87  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 088  // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 189  // CHECK:      call void @__ubsan_handle_sub_overflow90  ii = ij - ik;91}92 93// CHECK-LABEL: define{{.*}} void @testintmul()94void testintmul(void) {95 96  // CHECK:      [[T1:%.*]] = load i32, ptr @ij97  // CHECK-NEXT: [[T2:%.*]] = load i32, ptr @ik98  // CHECK-NEXT: [[T3:%.*]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 [[T1]], i32 [[T2]])99  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T3]], 0100  // CHECK-NEXT: [[T5:%.*]] = extractvalue { i32, i1 } [[T3]], 1101  // CHECK:      call void @__ubsan_handle_mul_overflow102  ii = ij * ik;103}104 105// CHECK-LABEL: define{{.*}} void @testintpostinc()106void testintpostinc(void) {107  opaqueint(ii++);108 109  // CHECK:      [[T1:%.*]] = load i32, ptr @ii110  // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)111  // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0112  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1113  // CHECK:      call void @__ubsan_handle_add_overflow114}115 116// CHECK-LABEL: define{{.*}} void @testintpreinc()117void testintpreinc(void) {118  opaqueint(++ii);119 120  // CHECK:      [[T1:%.*]] = load i32, ptr @ii121  // CHECK-NEXT: [[T2:%.*]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 [[T1]], i32 1)122  // CHECK-NEXT: [[T3:%.*]] = extractvalue { i32, i1 } [[T2]], 0123  // CHECK-NEXT: [[T4:%.*]] = extractvalue { i32, i1 } [[T2]], 1124  // CHECK:      call void @__ubsan_handle_add_overflow125}126