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