108 lines · c
1// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - | FileCheck %s --check-prefix=DEFAULT2// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fwrapv | FileCheck %s --check-prefix=WRAPV3// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv | FileCheck %s --check-prefix=TRAPV4// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=signed-integer-overflow | FileCheck %s --check-prefixes=CATCH_UB,NOCATCH_UB_POINTER5// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -fsanitize=signed-integer-overflow -fwrapv | FileCheck %s --check-prefixes=CATCH_UB,NOCATCH_UB_POINTER6// RUN: %clang_cc1 -triple x86_64-apple-darwin %s -emit-llvm -o - -ftrapv -ftrapv-handler foo | FileCheck %s --check-prefix=TRAPV_HANDLER7 8 9// Tests for signed integer overflow stuff.10void test1(void) {11 // DEFAULT-LABEL: define{{.*}} void @test112 // WRAPV-LABEL: define{{.*}} void @test113 // TRAPV-LABEL: define{{.*}} void @test114 extern volatile int f11G, a, b;15 16 // DEFAULT: add nsw i3217 // WRAPV: add i3218 // TRAPV: llvm.sadd.with.overflow.i3219 // CATCH_UB: llvm.sadd.with.overflow.i3220 // TRAPV_HANDLER: foo(21 f11G = a + b;22 23 // DEFAULT: sub nsw i3224 // WRAPV: sub i3225 // TRAPV: llvm.ssub.with.overflow.i3226 // CATCH_UB: llvm.ssub.with.overflow.i3227 // TRAPV_HANDLER: foo(28 f11G = a - b;29 30 // DEFAULT: mul nsw i3231 // WRAPV: mul i3232 // TRAPV: llvm.smul.with.overflow.i3233 // CATCH_UB: llvm.smul.with.overflow.i3234 // TRAPV_HANDLER: foo(35 f11G = a * b;36 37 // DEFAULT: sub nsw i32 0, 38 // WRAPV: sub i32 0, 39 // TRAPV: llvm.ssub.with.overflow.i32(i32 040 // CATCH_UB: llvm.ssub.with.overflow.i32(i32 041 // TRAPV_HANDLER: foo(42 f11G = -a;43 44 // PR7426 - Overflow checking for increments.45 46 // DEFAULT: add nsw i32 {{.*}}, 147 // WRAPV: add i32 {{.*}}, 148 // TRAPV: llvm.sadd.with.overflow.i32({{.*}}, i32 1)49 // CATCH_UB: llvm.sadd.with.overflow.i32({{.*}}, i32 1)50 // TRAPV_HANDLER: foo(51 ++a;52 53 // DEFAULT: add nsw i32 {{.*}}, -154 // WRAPV: add i32 {{.*}}, -155 // TRAPV: llvm.ssub.with.overflow.i32({{.*}}, i32 1)56 // CATCH_UB: llvm.ssub.with.overflow.i32({{.*}}, i32 1)57 // TRAPV_HANDLER: foo(58 --a;59 60 // -fwrapv does not affect inbounds for GEP's.61 // This is controlled by -fwrapv-pointer instead.62 extern int* P;63 ++P;64 // DEFAULT: getelementptr inbounds nuw i32, ptr65 // WRAPV: getelementptr inbounds nuw i32, ptr66 // TRAPV: getelementptr inbounds nuw i32, ptr67 // NOCATCH_UB_POINTER: getelementptr inbounds nuw i32, ptr68 69 // PR9350: char pre-increment never overflows.70 extern volatile signed char PR9350_char_inc;71 // DEFAULT: add i8 {{.*}}, 172 // WRAPV: add i8 {{.*}}, 173 // TRAPV: add i8 {{.*}}, 174 // CATCH_UB: add i8 {{.*}}, 175 ++PR9350_char_inc;76 77 // PR9350: char pre-decrement never overflows.78 extern volatile signed char PR9350_char_dec;79 // DEFAULT: add i8 {{.*}}, -180 // WRAPV: add i8 {{.*}}, -181 // TRAPV: add i8 {{.*}}, -182 // CATCH_UB: add i8 {{.*}}, -183 --PR9350_char_dec;84 85 // PR9350: short pre-increment never overflows.86 extern volatile signed short PR9350_short_inc;87 // DEFAULT: add i16 {{.*}}, 188 // WRAPV: add i16 {{.*}}, 189 // TRAPV: add i16 {{.*}}, 190 // CATCH_UB: add i16 {{.*}}, 191 ++PR9350_short_inc;92 93 // PR9350: short pre-decrement never overflows.94 extern volatile signed short PR9350_short_dec;95 // DEFAULT: add i16 {{.*}}, -196 // WRAPV: add i16 {{.*}}, -197 // TRAPV: add i16 {{.*}}, -198 // CATCH_UB: add i16 {{.*}}, -199 --PR9350_short_dec;100 101 // PR24256: don't instrument __builtin_frame_address.102 __builtin_frame_address(0 + 0);103 // DEFAULT: call ptr @llvm.frameaddress.p0(i32 0)104 // WRAPV: call ptr @llvm.frameaddress.p0(i32 0)105 // TRAPV: call ptr @llvm.frameaddress.p0(i32 0)106 // CATCH_UB: call ptr @llvm.frameaddress.p0(i32 0)107}108