blob: 2fe61ea6758916b810d15a3c0cab338c47496eb6 [file] [log] [blame]
Richard Smith2c9f87c2012-08-24 00:54:33 +00001// RUN: %clang_cc1 -fcatch-undefined-behavior -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s
Chris Lattnerc24b9c42010-04-10 18:34:14 +00002
Richard Smith0a940682012-10-10 01:02:07 +00003// CHECK: @[[INT:.*]] = private unnamed_addr constant { i16, i16, [6 x i8] } { i16 0, i16 11, [6 x i8] c"'int'\00" }
Richard Smith4def70d2012-10-09 19:52:38 +00004
5// FIXME: When we only emit each type once, use [[INT]] more below.
6// CHECK: @[[LINE_100:.*]] = private unnamed_addr constant {{.*}}, i32 100, i32 5 {{.*}} @[[INT]], i64 4, i8 1
7// CHECK: @[[LINE_200:.*]] = {{.*}}, i32 200, i32 10 {{.*}}, i64 4, i8 0
8// CHECK: @[[LINE_300_A:.*]] = {{.*}}, i32 300, i32 12 {{.*}} @{{.*}}, {{.*}} @{{.*}}
9// CHECK: @[[LINE_300_B:.*]] = {{.*}}, i32 300, i32 12 {{.*}} @{{.*}}, {{.*}} @{{.*}}
10// CHECK: @[[LINE_400:.*]] = {{.*}}, i32 400, i32 12 {{.*}} @{{.*}}, {{.*}} @{{.*}}
11// CHECK: @[[LINE_500:.*]] = {{.*}}, i32 500, i32 10 {{.*}} @{{.*}}, i64 4, i8 0 }
12// CHECK: @[[LINE_600:.*]] = {{.*}}, i32 600, i32 3 {{.*}} @{{.*}}, i64 4, i8 1 }
13
Richard Smith0a940682012-10-10 01:02:07 +000014// CHECK: @[[STRUCT_S:.*]] = private unnamed_addr constant { i16, i16, [11 x i8] } { i16 -1, i16 0, [11 x i8] c"'struct S'\00" }
Richard Smith4def70d2012-10-09 19:52:38 +000015
16// CHECK: @[[LINE_700:.*]] = {{.*}}, i32 700, i32 14 {{.*}} @[[STRUCT_S]], i64 4, i8 3 }
17// CHECK: @[[LINE_800:.*]] = {{.*}}, i32 800, i32 12 {{.*}} @{{.*}} }
18
Chris Lattnerc24b9c42010-04-10 18:34:14 +000019// PR6805
Nuno Lopes9eecef12012-05-07 20:23:03 +000020// CHECK: @foo
Chris Lattnerc24b9c42010-04-10 18:34:14 +000021void foo() {
22 union { int i; } u;
Richard Smith4def70d2012-10-09 19:52:38 +000023 // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64({{.*}} %[[PTR:.*]], i1 false)
24 // CHECK-NEXT: %[[CHECK1:.*]] = icmp uge i64 %[[SIZE]], 4
25
26 // CHECK: %[[PTRTOINT:.*]] = ptrtoint {{.*}} %[[PTR]] to i64
27 // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRTOINT]], 3
28 // CHECK-NEXT: %[[CHECK2:.*]] = icmp eq i64 %[[MISALIGN]], 0
29
30 // CHECK: %[[OK:.*]] = and i1 %[[CHECK1]], %[[CHECK2]]
31 // CHECK-NEXT: br i1 %[[OK]]
32
33 // CHECK: %[[ARG:.*]] = ptrtoint {{.*}} %[[PTR]] to i64
34 // CHECK-NEXT: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_100]] to i8*), i64 %[[ARG]]) noreturn nounwind
35#line 100
Chris Lattnerc24b9c42010-04-10 18:34:14 +000036 u.i=1;
37}
Nuno Lopes9eecef12012-05-07 20:23:03 +000038
39// CHECK: @bar
40int bar(int *a) {
Richard Smith4def70d2012-10-09 19:52:38 +000041 // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64
Richard Smith2c9f87c2012-08-24 00:54:33 +000042 // CHECK-NEXT: icmp uge i64 %[[SIZE]], 4
43
Richard Smith4def70d2012-10-09 19:52:38 +000044 // CHECK: %[[PTRINT:.*]] = ptrtoint
Richard Smith2c9f87c2012-08-24 00:54:33 +000045 // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 3
46 // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0
Richard Smith4def70d2012-10-09 19:52:38 +000047
48 // CHECK: %[[ARG:.*]] = ptrtoint
49 // CHECK-NEXT: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_200]] to i8*), i64 %[[ARG]]) noreturn nounwind
50#line 200
Nuno Lopes9eecef12012-05-07 20:23:03 +000051 return *a;
52}
Richard Smith9d3e2262012-08-25 00:32:28 +000053
54// CHECK: @lsh_overflow
55int lsh_overflow(int a, int b) {
Richard Smith4def70d2012-10-09 19:52:38 +000056 // CHECK: %[[INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31
Richard Smith9d3e2262012-08-25 00:32:28 +000057 // CHECK-NEXT: br i1 %[[INBOUNDS]]
58
Richard Smith4def70d2012-10-09 19:52:38 +000059 // FIXME: Only emit one trap block here.
60 // CHECK: %[[ARG1:.*]] = zext
61 // CHECK-NEXT: %[[ARG2:.*]] = zext
62 // CHECK-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_300_A]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]]) noreturn nounwind
63
64 // CHECK: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]]
Richard Smith9d3e2262012-08-25 00:32:28 +000065 // CHECK-NEXT: %[[SHIFTED_OUT:.*]] = lshr i32 %[[LHS:.*]], %[[SHIFTED_OUT_WIDTH]]
66 // CHECK-NEXT: %[[NO_OVERFLOW:.*]] = icmp eq i32 %[[SHIFTED_OUT]], 0
67 // CHECK-NEXT: br i1 %[[NO_OVERFLOW]]
68
Richard Smith4def70d2012-10-09 19:52:38 +000069 // CHECK: %[[ARG1:.*]] = zext
70 // CHECK-NEXT: %[[ARG2:.*]] = zext
71 // CHECK-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_300_B]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]]) noreturn nounwind
72
73 // CHECK: %[[RET:.*]] = shl i32 %[[LHS]], %[[RHS]]
Richard Smith9d3e2262012-08-25 00:32:28 +000074 // CHECK-NEXT: ret i32 %[[RET]]
Richard Smith4def70d2012-10-09 19:52:38 +000075#line 300
Richard Smith9d3e2262012-08-25 00:32:28 +000076 return a << b;
77}
78
79// CHECK: @rsh_inbounds
80int rsh_inbounds(int a, int b) {
Richard Smith4def70d2012-10-09 19:52:38 +000081 // CHECK: %[[INBOUNDS:.*]] = icmp ult i32 %[[RHS:.*]], 32
82 // CHECK: br i1 %[[INBOUNDS]]
Richard Smith9d3e2262012-08-25 00:32:28 +000083
Richard Smith4def70d2012-10-09 19:52:38 +000084 // CHECK: %[[ARG1:.*]] = zext
85 // CHECK-NEXT: %[[ARG2:.*]] = zext
86 // CHECK-NEXT: call void @__ubsan_handle_shift_out_of_bounds(i8* bitcast ({{.*}} @[[LINE_400]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]]) noreturn nounwind
87
88 // CHECK: %[[RET:.*]] = ashr i32 %[[LHS]], %[[RHS]]
Richard Smith9d3e2262012-08-25 00:32:28 +000089 // CHECK-NEXT: ret i32 %[[RET]]
Richard Smith4def70d2012-10-09 19:52:38 +000090#line 400
Richard Smith9d3e2262012-08-25 00:32:28 +000091 return a >> b;
92}
Richard Smith36ef0d52012-10-04 23:52:29 +000093
Richard Smith4def70d2012-10-09 19:52:38 +000094// CHECK: @load
95int load(int *p) {
96 // CHECK: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_500]] to i8*), i64 %{{.*}}) noreturn nounwind
97#line 500
98 return *p;
99}
100
101// CHECK: @store
102void store(int *p, int q) {
103 // CHECK: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_600]] to i8*), i64 %{{.*}}) noreturn nounwind
104#line 600
105 *p = q;
106}
107
108struct S { int k; };
109
110// CHECK: @member_access
111int *member_access(struct S *p) {
112 // CHECK: call void @__ubsan_handle_type_mismatch(i8* bitcast ({{.*}} @[[LINE_700]] to i8*), i64 %{{.*}}) noreturn nounwind
113#line 700
114 return &p->k;
115}
116
117// CHECK: @signed_overflow
118int signed_overflow(int a, int b) {
119 // CHECK: %[[ARG1:.*]] = zext
120 // CHECK-NEXT: %[[ARG2:.*]] = zext
121 // CHECK-NEXT: call void @__ubsan_handle_add_overflow(i8* bitcast ({{.*}} @[[LINE_800]] to i8*), i64 %[[ARG1]], i64 %[[ARG2]]) noreturn nounwind
122#line 800
123 return a + b;
124}
125
Richard Smith36ef0d52012-10-04 23:52:29 +0000126// CHECK: @no_return
127int no_return() {
128 // Reaching the end of a noreturn function is fine in C.
129 // CHECK-NOT: call
130 // CHECK-NOT: unreachable
131 // CHECK: ret i32
132}