13ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// RUN: %clang_cc1 -std=c++11 -fsanitize=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift-base,shift-exponent,unreachable,return,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,float-divide-by-zero,shift-base,shift-exponent,vla-bound,alignment,null,vptr,object-size,float-cast-overflow,bool,enum,array-bounds,function -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s 20e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=vptr,address -fsanitize-recover=vptr,address -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-ASAN 30e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=vptr -fsanitize-recover=vptr -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=DOWNCAST-NULL 40e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=function -emit-llvm %s -o - -triple x86_64-linux-gnux32 | FileCheck %s --check-prefix=CHECK-X32 50e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// RUN: %clang_cc1 -std=c++11 -fsanitize=function -emit-llvm %s -o - -triple i386-linux-gnu | FileCheck %s --check-prefix=CHECK-X86 63ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar// REQUIRES: asserts 72c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 8073fec91b73f08ba86ad46573141be14c7a0d262Richard Smithstruct S { 9073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith double d; 10073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith int a, b; 11073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith virtual int f(); 12073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith}; 13073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith 14176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Check that type descriptor global is not modified by ASan. 15176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-ASAN: [[TYPE_DESCR:@[0-9]+]] = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'S'\00" } 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// Check that type mismatch handler is not modified by ASan. 18176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-ASAN: private unnamed_addr global { { [{{.*}} x i8]*, i32, i32 }, { i16, i16, [4 x i8] }*, i8*, i8 } { {{.*}}, { i16, i16, [4 x i8] }* [[TYPE_DESCR]], {{.*}} } 19176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 20c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithstruct T : S {}; 21c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 22176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z17reference_binding 23073fec91b73f08ba86ad46573141be14c7a0d262Richard Smithvoid reference_binding(int *p, S *q) { 242c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // C++ core issue 453: If an lvalue to which a reference is directly bound 252c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // designates neither an existing object or function of an appropriate type, 262c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // nor a region of storage of suitable size and alignment to contain an object 272c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // of the reference's type, the behavior is undefined. 282c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 292c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 302c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 312c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 322c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 4 332c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 342c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 352c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 3 362c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 372c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith int &r = *p; 382c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 39073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith // A reference is not required to refer to an object within its lifetime. 40073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith // CHECK-NOT: __ubsan_handle_dynamic_type_cache_miss 41073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith S &r2 = *q; 42073fec91b73f08ba86ad46573141be14c7a0d262Richard Smith} 432c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 44176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z13member_access 45176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-ASAN-LABEL: @_Z13member_access 462c9f87ca5cccbfdaad82762368af5b2323320653Richard Smithvoid member_access(S *p) { 470848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (1a) Check 'p' is appropriately sized and aligned for member access. 482c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 492c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 502c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 512c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 522c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 24 532c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 542c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 552c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 7 562c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 572c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 580848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (1b) Check that 'p' actually points to an 'S'. 590848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 600848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: %[[VPTRADDR:.*]] = bitcast {{.*}} to i64* 613ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: %[[VPTR:.*]] = load i64, i64* %[[VPTRADDR]] 620848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 630848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // hash_16_bytes: 640848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 650848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // If this number changes, it indicates that either the mangled name of ::S 660848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // has changed, or that LLVM's hashing function has changed. The latter case 670848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // is OK if the hashing function is still stable. 68ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // 69ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // The two hash values are for 64- and 32-bit Clang binaries, respectively. 70ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // FIXME: We should produce a 64-bit value either way. 71ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // 72ca53087029204abc02c95fa3cf953ed60b19a3cdRichard Smith // CHECK-NEXT: xor i64 {{-4030275160588942838|2562089159}}, %[[VPTR]] 730848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: mul i64 {{.*}}, -7070675565921424023 740848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: lshr i64 {{.*}}, 47 750848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 760848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 %[[VPTR]] 770848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: mul i64 {{.*}}, -7070675565921424023 780848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: lshr i64 {{.*}}, 47 790848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: xor i64 800848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[HASH:.*]] = mul i64 {{.*}}, -7070675565921424023 810848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 820848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // Check the hash against the table: 830848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // 840848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: %[[IDX:.*]] = and i64 %{{.*}}, 127 853ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: getelementptr inbounds [128 x i64], [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 %[[IDX]] 863ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: %[[CACHEVAL:.*]] = load i64, i64* 870848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: icmp eq i64 %[[CACHEVAL]], %[[HASH]] 880848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK-NEXT: br i1 890848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 902d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %[[HASH]]) 91ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK-NOT: unreachable 92ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK: {{.*}}: 930848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 942c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // (2) Check 'p->b' is appropriately sized and aligned for a load. 952c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 962c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // FIXME: Suppress this in the trivial case of a member access, because we 972c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // know we've just checked the member access expression itself. 982c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 992c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 1002c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 4 1012c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1022c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 1032c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 3 1042c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 1052c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith int k = p->b; 1062c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1070848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (3a) Check 'p' is appropriately sized and aligned for member function call. 1082c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1092c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: icmp ne {{.*}}, null 1102c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1112c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64 1122c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp uge i64 %[[SIZE]], 24 1132c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith 1142c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK: %[[PTRINT:.*]] = ptrtoint 1152c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 7 1162c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith // CHECK-NEXT: icmp eq i64 %[[MISALIGN]], 0 1170848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1180848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // (3b) Check that 'p' actually points to an 'S' 1190848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1203ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: load i64, i64* 121d6f833091fbacc73980b9c4018363455b6aa82a7Richard Smith // CHECK-NEXT: xor i64 {{-4030275160588942838|2562089159}}, 1220848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // [...] 1233ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: getelementptr inbounds [128 x i64], [128 x i64]* @__ubsan_vptr_type_cache, i32 0, i64 % 1240848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith // CHECK: br i1 1252d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss({{.*}}, i64 %{{.*}}, i64 %{{.*}}) 126ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK-NOT: unreachable 127ad95481b2769ad61f23afc5e2c31f11c66090657Will Dietz // CHECK: {{.*}}: 1280848333c398d1ddd9f4e3b60cccef6a1b2698f78Richard Smith 1292c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith k = p->f(); 1302c9f87ca5cccbfdaad82762368af5b2323320653Richard Smith} 1319d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 132176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z12lsh_overflow 1339d3e226acad5e23e562cde0a69362bb266f2a333Richard Smithint lsh_overflow(int a, int b) { 1343ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: %[[RHS_INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31 1353ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: br i1 %[[RHS_INBOUNDS]], label %[[CHECK_BB:.*]], label %[[CONT_BB:.*]], 1369d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1373ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[CHECK_BB]]: 1383ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]] 1399d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[SHIFTED_OUT:.*]] = lshr i32 %[[LHS:.*]], %[[SHIFTED_OUT_WIDTH]] 1409d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1419d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // This is present for C++11 but not for C: C++ core issue 1457 allows a '1' 1429d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // to be shifted into the sign bit, but not out of it. 1439d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[SHIFTED_OUT_NOT_SIGN:.*]] = lshr i32 %[[SHIFTED_OUT]], 1 1449d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1459d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: %[[NO_OVERFLOW:.*]] = icmp eq i32 %[[SHIFTED_OUT_NOT_SIGN]], 0 1463ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: br label %[[CONT_BB]] 147bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz 1483ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[CONT_BB]]: 1493ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: %[[VALID_BASE:.*]] = phi i1 [ true, {{.*}} ], [ %[[NO_OVERFLOW]], %[[CHECK_BB]] ] 1503ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: %[[VALID:.*]] = and i1 %[[RHS_INBOUNDS]], %[[VALID_BASE]] 151bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz // CHECK-NEXT: br i1 %[[VALID]] 152bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz 153bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz // CHECK: call void @__ubsan_handle_shift_out_of_bounds 154bb60fc6a71f280f8e19e7f1a784ef05c40f5aa39Will Dietz // CHECK-NOT: call void @__ubsan_handle_shift_out_of_bounds 1559d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith 1569d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK: %[[RET:.*]] = shl i32 %[[LHS]], %[[RHS]] 1579d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith // CHECK-NEXT: ret i32 %[[RET]] 1589d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith return a << b; 1599d3e226acad5e23e562cde0a69362bb266f2a333Richard Smith} 16036ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith 161176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z9no_return 16236ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smithint no_return() { 1634e1125f630e75a52209b928e9d43b638abf39987Bill Wendling // CHECK: call void @__ubsan_handle_missing_return(i8* bitcast ({{.*}}* @{{.*}} to i8*)) [[NR_NUW:#[0-9]+]] 1644def70d3040e73707c738f7c366737a986135edfRichard Smith // CHECK-NEXT: unreachable 16536ef0d54cfddf31cd48816e78ab4db73b31a6c1dRichard Smith} 166463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 167176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z9sour_bool 168463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithbool sour_bool(bool *p) { 169463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[OK:.*]] = icmp ule i8 {{.*}}, 1 170463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[OK]] 1712d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value(i8* bitcast ({{.*}}), i64 {{.*}}) 172463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith return *p; 173463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith} 174463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 175463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E1 { e1a = 0, e1b = 127 } e1; 176463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E2 { e2a = -1, e2b = 64 } e2; 177463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithenum E3 { e3a = (1u << 31) - 1 } e3; 178463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 179176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z14bad_enum_value 180463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smithint bad_enum_value() { 181463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E1:.*]] = icmp ule i32 {{.*}}, 127 182463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E1]] 1832d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 184463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int a = e1; 185463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 186463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2HI:.*]] = icmp sle i32 {{.*}}, 127 187463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2LO:.*]] = icmp sge i32 {{.*}}, -128 188463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E2:.*]] = and i1 %[[E2HI]], %[[E2LO]] 189463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E2]] 1902d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 191463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int b = e2; 192463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith 193463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: %[[E3:.*]] = icmp ule i32 {{.*}}, 2147483647 194463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith // CHECK: br i1 %[[E3]] 1952d382d149b442b928fd3fb8edcc8d82ea9325872Will Dietz // CHECK: call void @__ubsan_handle_load_invalid_value( 196463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith int c = e3; 197463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith return a + b + c; 198463b48ba7eab6d7c96d23b59caea7f25de548293Richard Smith} 199c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 200176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z20bad_downcast_pointer 201176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// DOWNCAST-NULL-LABEL: @_Z20bad_downcast_pointer 202c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithvoid bad_downcast_pointer(S *p) { 203c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[NONNULL:.*]] = icmp ne {{.*}}, null 204c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[NONNULL]], 205c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 206176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // A null poiner access is guarded without -fsanitize=null. 207176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // DOWNCAST-NULL: %[[NONNULL:.*]] = icmp ne {{.*}}, null 208176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // DOWNCAST-NULL: br i1 %[[NONNULL]], 209176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2108dd4baacf584b1fc7b0e2c79a0b8b197a4fb5fabMatt Arsenault // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64.p0i8( 211c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E1:.*]] = icmp uge i64 %[[SIZE]], 24 212c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 213c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E2:.*]] = icmp eq i64 %[[MISALIGN]], 0 214c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E12:.*]] = and i1 %[[E1]], %[[E2]] 215c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[E12]], 216c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 217c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_type_mismatch 218c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 219c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 220c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %{{.*}}, 221c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 222c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 223c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 224c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith (void) static_cast<T*>(p); 225c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith} 226c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 227176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z22bad_downcast_reference 228c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smithvoid bad_downcast_reference(S &p) { 229c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E1:.*]] = icmp ne {{.*}}, null 230c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK-NOT: br i1 231176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 2328dd4baacf584b1fc7b0e2c79a0b8b197a4fb5fabMatt Arsenault // CHECK: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64.p0i8( 233c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E2:.*]] = icmp uge i64 %[[SIZE]], 24 234176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 235c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 236c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E3:.*]] = icmp eq i64 %[[MISALIGN]], 0 237176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 238176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: %[[E12:.*]] = and i1 %[[E1]], %[[E2]] 239c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: %[[E123:.*]] = and i1 %[[E12]], %[[E3]] 240c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %[[E123]], 241c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 242c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_type_mismatch 243c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 244c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 245c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br i1 %{{.*}}, 246c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith 247c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 248c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith // CHECK: br label 249c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith (void) static_cast<T&>(p); 250c764830bdb6de82baed068889096bd3e52d4cbdaRichard Smith} 2514e1125f630e75a52209b928e9d43b638abf39987Bill Wendling 252176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z11array_index 253a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint array_index(const int (&a)[4], int n) { 254a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K1_OK:.*]] = icmp ult i64 %{{.*}}, 4 255a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K1_OK]] 256a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 257a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k1 = a[n]; 258a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 259a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[R1_OK:.*]] = icmp ule i64 %{{.*}}, 4 260a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[R1_OK]] 261a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 262a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *r1 = &a[n]; 263a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 264a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K2_OK:.*]] = icmp ult i64 %{{.*}}, 8 265a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K2_OK]] 266a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 267a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k2 = ((const int(&)[8])a)[n]; 268a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 269a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K3_OK:.*]] = icmp ult i64 %{{.*}}, 4 270a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K3_OK]] 271a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 272a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int k3 = n[a]; 273a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 274a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return k1 + *r1 + k2; 275a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 276a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 277176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z17multi_array_index 278a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint multi_array_index(int n, int m) { 279a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int arr[4][6]; 280a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 281a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX2_OK:.*]] = icmp ult i64 %{{.*}}, 6 282a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX2_OK]] 283a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 284a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 285a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX1_OK:.*]] = icmp ult i64 %{{.*}}, 4 286a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX1_OK]] 287a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 288a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return arr[n][m]; 289a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 290a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 291176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z11array_arith 292a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint array_arith(const int (&a)[4], int n) { 293a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K1_OK:.*]] = icmp ule i64 %{{.*}}, 4 294a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K1_OK]] 295a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 296a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *k1 = a + n; 297a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 298a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[K2_OK:.*]] = icmp ule i64 %{{.*}}, 8 299a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[K2_OK]] 300a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 301a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith const int *k2 = (const int(&)[8])a + n; 302a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 303a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return *k1 + *k2; 304a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 305a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 306a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithstruct ArrayMembers { 307a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int a1[5]; 308a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith int a2[1]; 309a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith}; 310176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z18struct_array_index 311a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint struct_array_index(ArrayMembers *p, int n) { 312a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 5 313a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 314a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 315a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return p->a1[n]; 316a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 317a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 318176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z16flex_array_index 319a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint flex_array_index(ArrayMembers *p, int n) { 320a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK-NOT: call void @__ubsan_handle_out_of_bounds( 321a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return p->a2[n]; 322a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 323a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 3245956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smithextern int incomplete[]; 325176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z22incomplete_array_index 3265956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smithint incomplete_array_index(int n) { 3275956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith // CHECK-NOT: call void @__ubsan_handle_out_of_bounds( 3285956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith return incomplete[n]; 3295956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith} 3305956bcc31ad0b1f570e04f7e19e817112f7274c5Richard Smith 331a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithtypedef __attribute__((ext_vector_type(4))) int V4I; 332176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z12vector_index 333a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithint vector_index(V4I v, int n) { 334a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 4 335a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 336a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 337a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return v[n]; 338a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 339a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 340176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: @_Z12string_index 341a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smithchar string_index(int n) { 342a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: %[[IDX_OK:.*]] = icmp ult i64 %{{.*}}, 6 343a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: br i1 %[[IDX_OK]] 344a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith // CHECK: call void @__ubsan_handle_out_of_bounds( 345a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith return "Hello"[n]; 346a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith} 347a0a628f839cf50844cc0f226bd9cb72485f98f91Richard Smith 3488593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasclass A // align=4 3498593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas{ 3508593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas int a1, a2, a3; 3518593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas}; 3528593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3538593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasclass B // align=8 3548593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas{ 3558593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas long b1, b2; 3568593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas}; 3578593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3588593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasclass C : public A, public B // align=16 3598593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas{ 3608593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas alignas(16) int c1; 3618593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas}; 3628593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3638593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas// Make sure we check the alignment of the pointer after subtracting any 3648593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas// offset. The pointer before subtraction doesn't need to be aligned for 3658593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas// the destination type. 3668593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 36762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky// CHECK-LABEL: define void @_Z16downcast_pointerP1B(%class.B* %b) 3688593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasvoid downcast_pointer(B *b) { 3698593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas (void) static_cast<C*>(b); 3708593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Alignment check from EmitTypeCheck(TCK_DowncastPointer, ...) 3713ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8, i8* {{.*}}, i64 -16 3728593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[C:%[0-9]*]] = bitcast i8* [[SUB]] to %class.C* 3738593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // null check goes here 3749793fe99de5ab92162cb70a7d2584c1de0952d73Filipe Cabecinhas // CHECK: [[FROM_PHI:%[0-9]*]] = phi %class.C* [ [[C]], {{.*}} ], {{.*}} 3758593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Objectsize check goes here 3768593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK: [[C_INT:%[0-9]*]] = ptrtoint %class.C* [[FROM_PHI]] to i64 3778593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[MASKED:%[0-9]*]] = and i64 [[C_INT]], 15 3788593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[TEST:%[0-9]*]] = icmp eq i64 [[MASKED]], 0 3798593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // AND the alignment test with the objectsize test. 3808593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[AND:%[0-9]*]] = and i1 {{.*}}, [[TEST]] 3819793fe99de5ab92162cb70a7d2584c1de0952d73Filipe Cabecinhas // CHECK-NEXT: br i1 [[AND]] 3828593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas} 3838593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 384176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: define void @_Z18downcast_referenceR1B(%class.B* dereferenceable({{[0-9]+}}) %b) 3858593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhasvoid downcast_reference(B &b) { 3868593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas (void) static_cast<C&>(b); 3878593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Alignment check from EmitTypeCheck(TCK_DowncastReference, ...) 3883ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[SUB:%[.a-z0-9]*]] = getelementptr i8, i8* {{.*}}, i64 -16 3898593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[C:%[0-9]*]] = bitcast i8* [[SUB]] to %class.C* 3908593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // Objectsize check goes here 3918593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK: [[C_INT:%[0-9]*]] = ptrtoint %class.C* [[C]] to i64 3928593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[MASKED:%[0-9]*]] = and i64 [[C_INT]], 15 3938593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // CHECK-NEXT: [[TEST:%[0-9]*]] = icmp eq i64 [[MASKED]], 0 3948593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas // AND the alignment test with the objectsize test. 395176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: [[AND:%[0-9]*]] = and i1 {{.*}}, [[TEST]] 3969793fe99de5ab92162cb70a7d2584c1de0952d73Filipe Cabecinhas // CHECK-NEXT: br i1 [[AND]] 3978593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas} 3988593e7821c02bd429964d2daf7a6acccb8040fb2Filipe Cabecinhas 3990e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-LABEL: @_Z22indirect_function_callPFviE({{.*}} prologue <{ i32, i8* }> <{ i32 1413876459, i8* bitcast ({ i8*, i8* }* @_ZTIFvPFviEE to i8*) }> 4000e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-X32: @_Z22indirect_function_callPFviE({{.*}} prologue <{ i32, i8* }> <{ i32 1413875435, i8* bitcast ({ i8*, i8* }* @_ZTIFvPFviEE to i8*) }> 4010e2c34f92f00628d48968dfea096d36381f494cbStephen Hines// CHECK-X86: @_Z22indirect_function_callPFviE({{.*}} prologue <{ i32, i8* }> <{ i32 1413875435, i8* bitcast ({ i8*, i8* }* @_ZTIFvPFviEE to i8*) }> 402b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbournevoid indirect_function_call(void (*p)(int)) { 403b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK: [[PTR:%[0-9]*]] = bitcast void (i32)* {{.*}} to <{ i32, i8* }>* 404b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne 405b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // Signature check 4063ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[SIGPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>, <{ i32, i8* }>* [[PTR]], i32 0, i32 0 4073ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[SIG:%[0-9]*]] = load i32, i32* [[SIGPTR]] 408b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: [[SIGCMP:%[0-9]*]] = icmp eq i32 [[SIG]], 1413876459 409b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: br i1 [[SIGCMP]] 410b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne 411b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // RTTI pointer check 4123ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK: [[RTTIPTR:%[0-9]*]] = getelementptr <{ i32, i8* }>, <{ i32, i8* }>* [[PTR]], i32 0, i32 1 4133ea9e33ea25e0c2b12db56418ba3f994eb662c04Pirama Arumuga Nainar // CHECK-NEXT: [[RTTI:%[0-9]*]] = load i8*, i8** [[RTTIPTR]] 414b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: [[RTTICMP:%[0-9]*]] = icmp eq i8* [[RTTI]], bitcast ({ i8*, i8* }* @_ZTIFviE to i8*) 415b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne // CHECK-NEXT: br i1 [[RTTICMP]] 416b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne p(42); 417b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne} 418b914e87377fd4d7642f544000a79f8648c6f06c9Peter Collingbourne 419176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesnamespace UpcastPointerTest { 420176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct S {}; 421176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct T : S { double d; }; 422176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesstruct V : virtual S {}; 423176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 424176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: upcast_pointer 425176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesS* upcast_pointer(T* t) { 426176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Check for null pointer 427176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: %[[NONNULL:.*]] = icmp ne {{.*}}, null 428176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: br i1 %[[NONNULL]] 429176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 430176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // Check alignment 431176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: %[[MISALIGN:.*]] = and i64 %{{.*}}, 7 432176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: icmp eq i64 %[[MISALIGN]], 0 433176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 434176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @__ubsan_handle_type_mismatch 435176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines return t; 436176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 437176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 438176edba5311f6eff0cad2631449885ddf4fbc9eaStephen HinesV getV(); 439176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 440176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines// CHECK-LABEL: upcast_to_vbase 441176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hinesvoid upcast_to_vbase() { 442176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // No need to check for null here, as we have a temporary here. 443176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 444176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK-NOT: br i1 445176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 446176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call i64 @llvm.objectsize 447176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @__ubsan_handle_type_mismatch 448176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines // CHECK: call void @__ubsan_handle_dynamic_type_cache_miss 449176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines const S& s = getV(); 450176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 451176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines} 452176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines 45362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewyckynamespace CopyValueRepresentation { 45462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S3aSERKS0_ 45562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value 45662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S4aSEOS0_ 45762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} @__ubsan_handle_load_invalid_value 4580e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S1C2ERKS0_ 45962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value 46062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S2C2ERKS0_ 46162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK: __ubsan_handle_load_invalid_value 4620e2c34f92f00628d48968dfea096d36381f494cbStephen Hines // CHECK-LABEL: define {{.*}} @_ZN23CopyValueRepresentation2S5C2ERKS0_ 46362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky // CHECK-NOT: call {{.*}} __ubsan_handle_load_invalid_value 46462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 46562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct CustomCopy { CustomCopy(); CustomCopy(const CustomCopy&); }; 46662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S1 { 46762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomCopy CC; 46862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 46962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 47062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void callee1(S1); 47162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test1() { 47262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S1 s11; 47362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky callee1(s11); 47462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S1 s12; 47562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky s12 = s11; 47662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 47762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 47862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky static bool some_global_bool; 47962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct ExprCopy { 48062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky ExprCopy(); 48162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky ExprCopy(const ExprCopy&, bool b = some_global_bool); 48262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 48362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S2 { 48462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky ExprCopy EC; 48562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 48662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 48762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void callee2(S2); 48862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test2(void) { 48962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S2 s21; 49062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky callee2(s21); 49162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S2 s22; 49262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky s22 = s21; 49362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 49462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 49562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct CustomAssign { CustomAssign &operator=(const CustomAssign&); }; 49662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S3 { 49762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomAssign CA; 49862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 49962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 50062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test3() { 50162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S3 x, y; 50262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky x = y; 50362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 50462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 50562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct CustomMove { 50662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove(); 50762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove(const CustomMove&&); 50862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove &operator=(const CustomMove&&); 50962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 51062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S4 { 51162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky CustomMove CM; 51262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 51362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 51462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test4() { 51562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S4 x, y; 51662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky x = static_cast<S4&&>(y); 51762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 51862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 51962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct EnumCustomCopy { 52062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky EnumCustomCopy(); 52162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky EnumCustomCopy(const EnumCustomCopy&); 52262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 52362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky struct S5 { 52462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky EnumCustomCopy ECC; 52562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky bool b; 52662a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky }; 52762a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void callee5(S5); 52862a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky void test5() { 52962a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S5 s51; 53062a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky callee5(s51); 53162a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky S5 s52; 53262a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky s52 = s51; 53362a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky } 53462a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky} 53562a3bbaac79f6e1b242ae3914e3ed4615f09302dNick Lewycky 5364e1125f630e75a52209b928e9d43b638abf39987Bill Wendling// CHECK: attributes [[NR_NUW]] = { noreturn nounwind } 537