brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.3 KiB · 14cb770 Raw
474 lines · c
1// RUN: %clang_cc1 -Wno-error=return-type -fsanitize=alignment,null,object-size,shift-base,shift-exponent,return,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize-recover=alignment,null,object-size,shift-base,shift-exponent,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-UBSAN2// RUN: %clang_cc1 -Wno-error=return-type -fsanitize-trap=alignment,null,object-size,shift-base,shift-exponent,return,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize-recover=alignment,null,object-size,shift-base,shift-exponent,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize=alignment,null,object-size,shift-base,shift-exponent,return,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -fsanitize-recover=alignment,null,object-size,shift-base,shift-exponent,signed-integer-overflow,vla-bound,float-cast-overflow,integer-divide-by-zero,bool,returns-nonnull-attribute,nonnull-attribute -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-COMMON --check-prefix=CHECK-TRAP3// RUN: %clang_cc1 -Wno-error=return-type -fsanitize=signed-integer-overflow -emit-llvm %s -o - -triple x86_64-linux-gnu | FileCheck %s --check-prefix=CHECK-OVERFLOW4 5// CHECK-UBSAN: @[[INT:.*]] = private unnamed_addr constant { i16, i16, [6 x i8] } { i16 0, i16 11, [6 x i8] c"'int'\00" }6 7// FIXME: When we only emit each type once, use [[INT]] more below.8// CHECK-UBSAN: @[[LINE_100:.*]] = private unnamed_addr global {{.*}}, i32 100, i32 5 {{.*}} @[[INT]], i8 2, i8 19// CHECK-UBSAN: @[[LINE_200:.*]] = {{.*}}, i32 200, i32 10 {{.*}}, i8 2, i8 010// CHECK-UBSAN: @[[LINE_300:.*]] = {{.*}}, i32 300, i32 12 {{.*}} @{{.*}}, {{.*}} @{{.*}}11// CHECK-UBSAN: @[[LINE_400:.*]] = {{.*}}, i32 400, i32 12 {{.*}} @{{.*}}, {{.*}} @{{.*}}12// CHECK-UBSAN: @[[LINE_500:.*]] = {{.*}}, i32 500, i32 10 {{.*}} @{{.*}}, i8 2, i8 0 }13// CHECK-UBSAN: @[[LINE_600:.*]] = {{.*}}, i32 600, i32 3 {{.*}} @{{.*}}, i8 2, i8 1 }14 15// CHECK-UBSAN: @[[STRUCT_S:.*]] = private unnamed_addr constant { i16, i16, [11 x i8] } { i16 -1, i16 0, [11 x i8] c"'struct S'\00" }16 17// CHECK-UBSAN: @[[LINE_700:.*]] = {{.*}}, i32 700, i32 14 {{.*}} @[[STRUCT_S]], i8 2, i8 3 }18// CHECK-UBSAN: @[[LINE_800:.*]] = {{.*}}, i32 800, i32 12 {{.*}} @{{.*}} }19// CHECK-UBSAN: @[[LINE_900:.*]] = {{.*}}, i32 900, i32 11 {{.*}} @{{.*}} }20// CHECK-UBSAN: @[[LINE_1000:.*]] = {{.*}}, i32 1000, i32 11 {{.*}} @{{.*}} }21// CHECK-UBSAN: @[[FP16:.*]] = private unnamed_addr constant { i16, i16, [9 x i8] } { i16 1, i16 16, [9 x i8] c"'__fp16'\00" }22// CHECK-UBSAN: @[[LINE_1200:.*]] = {{.*}}, i32 1200, i32 10 {{.*}} @{{.*}} }23// CHECK-UBSAN: @[[LINE_1300:.*]] = {{.*}}, i32 1300, i32 10 {{.*}} @{{.*}} }24// CHECK-UBSAN: @[[LINE_1400:.*]] = {{.*}}, i32 1400, i32 10 {{.*}} @{{.*}} }25// Make sure we check the fp16 type_mismatch data so we can easily match the signed char float_cast_overflow26// CHECK-UBSAN: @[[LINE_1500:.*]] = {{.*}}, i32 1500, i32 10 {{.*}} @[[FP16]], {{.*}} }27// CHECK-UBSAN: @[[SCHAR:.*]] = private unnamed_addr constant { i16, i16, [14 x i8] } { i16 0, i16 7, [14 x i8] c"'signed char'\00" }28// CHECK-UBSAN: @[[LINE_1500:.*]] = {{.*}}, i32 1500, i32 10 {{.*}} @[[FP16]], {{.*}} }29 30// CHECK-UBSAN: @[[PLONG:.*]] = private unnamed_addr constant { i16, i16, [9 x i8] } { i16 -1, i16 0, [9 x i8] c"'long *'\00" }31// CHECK-UBSAN: @[[LINE_1600:.*]] = {{.*}}, i32 1600, i32 10 {{.*}} @[[PLONG]], {{.*}} }32 33// PR680534// CHECK-COMMON-LABEL: @foo35void foo(void) {36  union { int i; } u;37 38  // CHECK-COMMON: %[[SIZE:.*]] = call i64 @llvm.objectsize.i64.p0(ptr %[[PTR:.*]], i1 false, i1 false, i1 false)39  // CHECK-COMMON-NEXT: %[[OK:.*]] = icmp uge i64 %[[SIZE]], 440 41  // CHECK-UBSAN: br i1 %[[OK]], {{.*}} !prof ![[WEIGHT_MD:.*]], !nosanitize42  // CHECK-TRAP:  br i1 %[[OK]], {{.*}}43 44  // CHECK-UBSAN:      %[[ARG:.*]] = ptrtoint {{.*}} %[[PTR]] to i6445  // CHECK-UBSAN-NEXT: call void @__ubsan_handle_type_mismatch_v1(ptr @[[LINE_100]], i64 %[[ARG]])46 47  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 22) [[NR_NUW:#[0-9]+]]48  // CHECK-TRAP-NEXT: unreachable49#line 10050  u.i=1;51}52 53// CHECK-COMMON-LABEL: @bar54int bar(int *a) {55  // CHECK-COMMON:      %[[SIZE:.*]] = call i64 @llvm.objectsize.i6456  // CHECK-COMMON-NEXT: icmp uge i64 %[[SIZE]], 457 58  // CHECK-COMMON:      %[[PTRINT:.*]] = ptrtoint59  // CHECK-COMMON-NEXT: %[[MISALIGN:.*]] = and i64 %[[PTRINT]], 360  // CHECK-COMMON-NEXT: icmp eq i64 %[[MISALIGN]], 061 62  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(ptr @[[LINE_200]], i64 %[[PTRINT]])63 64  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 22) [[NR_NUW]]65  // CHECK-TRAP-NEXT: unreachable66 67#line 20068  return *a;69}70 71// CHECK-UBSAN-LABEL: @addr_space72int addr_space(int __attribute__((address_space(256))) *a) {73  // CHECK-UBSAN-NOT: __ubsan74  return *a;75}76 77// CHECK-COMMON-LABEL: @lsh_overflow78int lsh_overflow(int a, int b) {79  // CHECK-COMMON:      %[[RHS_INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 3180  // CHECK-COMMON-NEXT: br i1 %[[RHS_INBOUNDS]], label %[[CHECK_BB:.*]], label %[[CONT_BB:.*]],81 82  // CHECK-COMMON:      [[CHECK_BB]]:83  // CHECK-COMMON-NEXT: %[[SHIFTED_OUT_WIDTH:.*]] = sub nuw nsw i32 31, %[[RHS]]84  // CHECK-COMMON-NEXT: %[[SHIFTED_OUT:.*]] = lshr i32 %[[LHS:.*]], %[[SHIFTED_OUT_WIDTH]]85  // CHECK-COMMON-NEXT: %[[NO_OVERFLOW:.*]] = icmp eq i32 %[[SHIFTED_OUT]], 086  // CHECK-COMMON-NEXT: br label %[[CONT_BB]]87 88  // CHECK-COMMON:      [[CONT_BB]]:89  // CHECK-COMMON-NEXT: %[[VALID_BASE:.*]] = phi i1 [ true, {{.*}} ], [ %[[NO_OVERFLOW]], %[[CHECK_BB]] ]90  // CHECK-COMMON-NEXT: %[[VALID:.*]] = and i1 %[[RHS_INBOUNDS]], %[[VALID_BASE]]91 92  // CHECK-UBSAN: br i1 %[[VALID]], {{.*}} !prof ![[WEIGHT_MD]]93  // CHECK-TRAP:  br i1 %[[VALID]]94 95  // CHECK-UBSAN:      %[[ARG1:.*]] = zext96  // CHECK-UBSAN-NEXT: %[[ARG2:.*]] = zext97  // CHECK-UBSAN-NEXT: call void @__ubsan_handle_shift_out_of_bounds(ptr @[[LINE_300]], i64 %[[ARG1]], i64 %[[ARG2]])98  // CHECK-UBSAN-NOT:  call void @__ubsan_handle_shift_out_of_bounds99 100  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 20) [[NR_NUW]]101  // CHECK-TRAP:      unreachable102  // CHECK-TRAP-NOT:  call void @llvm.ubsantrap103 104  // CHECK-COMMON:      %[[RET:.*]] = shl i32 %[[LHS]], %[[RHS]]105  // CHECK-COMMON-NEXT: ret i32 %[[RET]]106#line 300107  return a << b;108}109 110// CHECK-COMMON-LABEL: @rsh_inbounds111int rsh_inbounds(int a, int b) {112  // CHECK-COMMON:      %[[INBOUNDS:.*]] = icmp ule i32 %[[RHS:.*]], 31113  // CHECK-COMMON:      br i1 %[[INBOUNDS]]114 115  // CHECK-UBSAN:      %[[ARG1:.*]] = zext116  // CHECK-UBSAN-NEXT: %[[ARG2:.*]] = zext117  // CHECK-UBSAN-NEXT: call void @__ubsan_handle_shift_out_of_bounds(ptr @[[LINE_400]], i64 %[[ARG1]], i64 %[[ARG2]])118 119  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 20) [[NR_NUW]]120  // CHECK-TRAP-NEXT: unreachable121 122  // CHECK-COMMON:      %[[RET:.*]] = ashr i32 {{.*}}, %[[RHS]]123  // CHECK-COMMON-NEXT: ret i32 %[[RET]]124#line 400125  return a >> b;126}127 128// CHECK-COMMON-LABEL: @load129int load(int *p) {130  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(ptr @[[LINE_500]], i64 %{{.*}})131 132  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 22) [[NR_NUW]]133  // CHECK-TRAP-NEXT: unreachable134#line 500135  return *p;136}137 138// CHECK-COMMON-LABEL: @store139void store(int *p, int q) {140  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(ptr @[[LINE_600]], i64 %{{.*}})141 142  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 22) [[NR_NUW]]143  // CHECK-TRAP-NEXT: unreachable144#line 600145  *p = q;146}147 148struct S { int k; };149 150// CHECK-COMMON-LABEL: @member_access151int *member_access(struct S *p) {152  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(ptr @[[LINE_700]], i64 %{{.*}})153 154  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 22) [[NR_NUW]]155  // CHECK-TRAP-NEXT: unreachable156#line 700157  return &p->k;158}159 160// CHECK-COMMON-LABEL: @signed_overflow161int signed_overflow(int a, int b) {162  // CHECK-UBSAN:      %[[ARG1:.*]] = zext163  // CHECK-UBSAN-NEXT: %[[ARG2:.*]] = zext164  // CHECK-UBSAN-NEXT: call void @__ubsan_handle_add_overflow(ptr @[[LINE_800]], i64 %[[ARG1]], i64 %[[ARG2]])165 166  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 0) [[NR_NUW]]167  // CHECK-TRAP-NEXT: unreachable168#line 800169  return a + b;170}171 172// CHECK-COMMON-LABEL: @no_return173int no_return(void) {174  // Reaching the end of a noreturn function is fine in C.175  // FIXME: If the user explicitly requests -fsanitize=return, we should catch176  //        that here even though it's not undefined behavior.177  // CHECK-COMMON-NOT: call178  // CHECK-COMMON-NOT: unreachable179  // CHECK-COMMON: ret i32180}181 182// CHECK-UBSAN-LABEL: @vla_bound183void vla_bound(int n) {184  // CHECK-UBSAN:      icmp sgt i32 %[[PARAM:.*]], 0185  //186  // CHECK-UBSAN:      %[[ARG:.*]] = zext i32 %[[PARAM]] to i64187  // CHECK-UBSAN-NEXT: call void @__ubsan_handle_vla_bound_not_positive(ptr @[[LINE_900]], i64 %[[ARG]])188#line 900189  int arr[n * 3];190}191 192// CHECK-UBSAN-LABEL: @vla_bound_unsigned193void vla_bound_unsigned(unsigned int n) {194  // CHECK-UBSAN:      icmp ugt i32 %[[PARAM:.*]], 0195  //196  // CHECK-UBSAN:      %[[ARG:.*]] = zext i32 %[[PARAM]] to i64197  // CHECK-UBSAN-NEXT: call void @__ubsan_handle_vla_bound_not_positive(ptr @[[LINE_1000]], i64 %[[ARG]])198#line 1000199  int arr[n * 3];200}201 202// CHECK-UBSAN-LABEL: @int_float_no_overflow203float int_float_no_overflow(__int128 n) {204  // CHECK-UBSAN-NOT: call void @__ubsan_handle205  return n;206}207 208// CHECK-COMMON-LABEL: @int_float_overflow209float int_float_overflow(unsigned __int128 n) {210  // CHECK-UBSAN-NOT: call {{.*}} @__ubsan_handle_float_cast_overflow(211  // CHECK-TRAP-NOT:  call {{.*}} @llvm.trap(212  // CHECK-COMMON: }213  return n;214}215 216// CHECK-COMMON-LABEL: @int_fp16_overflow217void int_fp16_overflow(int n, __fp16 *p) {218  // CHECK-UBSAN-NOT: call {{.*}} @__ubsan_handle_float_cast_overflow(219  // CHECK-COMMON: }220  *p = n;221}222 223// CHECK-COMMON-LABEL: @float_int_overflow224int float_int_overflow(float f) {225  // CHECK-COMMON: %[[GE:.*]] = fcmp ogt float %[[F:.*]], 0xC1E0000020000000226  // CHECK-COMMON: %[[LE:.*]] = fcmp olt float %[[F]], 0x41E0000000000000227  // CHECK-COMMON: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]228  // CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]229 230  // CHECK-UBSAN: %[[CAST:.*]] = bitcast float %[[F]] to i32231  // CHECK-UBSAN: %[[ARG:.*]] = zext i32 %[[CAST]] to i64232  // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(ptr @[[LINE_1200]], i64 %[[ARG]]233 234  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 5) [[NR_NUW]]235  // CHECK-TRAP-NEXT: unreachable236#line 1200237  return f;238}239 240// CHECK-COMMON-LABEL: @long_double_int_overflow241int long_double_int_overflow(long double ld) {242  // CHECK-UBSAN: alloca x86_fp80243 244  // CHECK-COMMON: %[[GE:.*]] = fcmp ogt x86_fp80 %[[F:.*]], 0xKC01E800000010000000245  // CHECK-COMMON: %[[LE:.*]] = fcmp olt x86_fp80 %[[F]], 0xK401E800000000000000246  // CHECK-COMMON: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]247  // CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]248 249  // CHECK-UBSAN: store x86_fp80 %[[F]], ptr %[[ALLOCA:.*]], align 16, !nosanitize250  // CHECK-UBSAN: %[[ARG:.*]] = ptrtoint ptr %[[ALLOCA]] to i64251  // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(ptr @[[LINE_1300]], i64 %[[ARG]]252 253  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 5) [[NR_NUW]]254  // CHECK-TRAP-NEXT: unreachable255#line 1300256  return ld;257}258 259// CHECK-COMMON-LABEL: @float_uint_overflow260unsigned float_uint_overflow(float f) {261  // CHECK-COMMON: %[[GE:.*]] = fcmp ogt float %[[F:.*]], -1.{{0*}}e+00262  // CHECK-COMMON: %[[LE:.*]] = fcmp olt float %[[F]], 0x41F0000000000000263  // CHECK-COMMON: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]264  // CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]265 266  // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(ptr @[[LINE_1400]],267 268  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 5) [[NR_NUW]]269  // CHECK-TRAP-NEXT: unreachable270#line 1400271  return f;272}273 274// CHECK-COMMON-LABEL: @fp16_char_overflow275signed char fp16_char_overflow(__fp16 *p) {276  // CHECK-COMMON: %[[GE:.*]] = fcmp ogt float %[[F:.*]], -1.29{{0*}}e+02277  // CHECK-COMMON: %[[LE:.*]] = fcmp olt float %[[F]], 1.28{{0*}}e+02278  // CHECK-COMMON: %[[INBOUNDS:.*]] = and i1 %[[GE]], %[[LE]]279  // CHECK-COMMON-NEXT: br i1 %[[INBOUNDS]]280 281  // CHECK-UBSAN: call void @__ubsan_handle_float_cast_overflow(ptr @[[LINE_1500]],282 283  // CHECK-TRAP:      call void @llvm.ubsantrap(i8 5) [[NR_NUW]]284  // CHECK-TRAP-NEXT: unreachable285#line 1500286  return *p;287}288 289// CHECK-COMMON-LABEL: @float_float_overflow290float float_float_overflow(double f) {291  // CHECK-UBSAN-NOT: call {{.*}} @__ubsan_handle_float_cast_overflow(292  // CHECK-TRAP-NOT:  call {{.*}} @llvm.ubsantrap(i8 19) [[NR_NUW]]293  // CHECK-COMMON: }294  return f;295}296 297// CHECK-COMMON-LABEL:   @int_divide_overflow298// CHECK-OVERFLOW-LABEL: @int_divide_overflow299int int_divide_overflow(int a, int b) {300  // CHECK-COMMON:         %[[ZERO:.*]] = icmp ne i32 %[[B:.*]], 0301  // CHECK-OVERFLOW-NOT:  icmp ne i32 %{{.*}}, 0302 303  // CHECK-COMMON:               %[[AOK:.*]] = icmp ne i32 %[[A:.*]], -2147483648304  // CHECK-COMMON-NEXT:          %[[BOK:.*]] = icmp ne i32 %[[B]], -1305  // CHECK-COMMON-NEXT:          %[[OVER:.*]] = or i1 %[[AOK]], %[[BOK]]306  // CHECK-COMMON:         %[[OK:.*]] = and i1 %[[ZERO]], %[[OVER]]307  // CHECK-COMMON:         br i1 %[[OK]]308 309  // CHECK-OVERFLOW:      %[[AOK:.*]] = icmp ne i32 %[[A:.*]], -2147483648310  // CHECK-OVERFLOW-NEXT: %[[BOK:.*]] = icmp ne i32 %[[B:.*]], -1311  // CHECK-OVERFLOW-NEXT: %[[OK:.*]] = or i1 %[[AOK]], %[[BOK]]312  // CHECK-OVERFLOW:      br i1 %[[OK]]313 314  // CHECK-TRAP: call void @llvm.ubsantrap(i8 3) [[NR_NUW]]315  // CHECK-TRAP: unreachable316  return a / b;317 318  // CHECK-COMMON:          }319  // CHECK-OVERFLOW: }320}321 322// CHECK-COMMON-LABEL: @sour_bool323_Bool sour_bool(_Bool *p) {324  // CHECK-COMMON: %[[OK:.*]] = icmp ule i8 {{.*}}, 1325  // CHECK-COMMON: br i1 %[[OK]]326 327  // CHECK-UBSAN: call void @__ubsan_handle_load_invalid_value(ptr {{.*}}, i64 {{.*}})328 329  // CHECK-TRAP: call void @llvm.ubsantrap(i8 10) [[NR_NUW]]330  // CHECK-TRAP: unreachable331  return *p;332}333 334// CHECK-COMMON-LABEL: @ret_nonnull335__attribute__((returns_nonnull))336int *ret_nonnull(int *a) {337  // CHECK-COMMON: [[OK:%.*]] = icmp ne ptr {{.*}}, null338  // CHECK-COMMON: br i1 [[OK]]339 340  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_return341 342  // CHECK-TRAP: call void @llvm.ubsantrap(i8 17) [[NR_NUW]]343  // CHECK-TRAP: unreachable344  return a;345}346 347// CHECK-COMMON-LABEL: @call_decl_nonnull348__attribute__((nonnull)) void decl_nonnull(int *a);349void call_decl_nonnull(int *a) {350  // CHECK-COMMON: [[OK:%.*]] = icmp ne ptr {{.*}}, null351  // CHECK-COMMON: br i1 [[OK]]352 353  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg354 355  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16) [[NR_NUW]]356  // CHECK-TRAP: unreachable357  decl_nonnull(a);358}359 360extern void *memcpy(void *, const void *, unsigned long) __attribute__((nonnull(1, 2)));361 362// CHECK-COMMON-LABEL: @call_memcpy_nonnull363void call_memcpy_nonnull(void *p, void *q, int sz) {364  // CHECK-COMMON: icmp ne ptr {{.*}}, null365  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg366  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)367  // CHECK-COMMON-NOT: call368 369  // CHECK-COMMON: icmp ne ptr {{.*}}, null370  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg371  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)372  // CHECK-COMMON-NOT: call373 374  // CHECK-COMMON: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %0, ptr align 1 %1, i64 %conv, i1 false)375  memcpy(p, q, sz);376}377 378// CHECK-COMMON-LABEL: define{{.*}} void @call_memcpy(379void call_memcpy(long *p, short *q, int sz) {380  // CHECK-COMMON: icmp ne ptr {{.*}}, null381  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg(382  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)383  // CHECK-COMMON: and i64 %[[#]], 7, !nosanitize384  // CHECK-COMMON: icmp eq i64 %[[#]], 0, !nosanitize385  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(ptr @[[LINE_1600]]386  // CHECK-TRAP: call void @llvm.ubsantrap(i8 22)387 388  // CHECK-COMMON: icmp ne ptr {{.*}}, null389  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg(390  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)391  // CHECK-COMMON: and i64 %[[#]], 1, !nosanitize392  // CHECK-COMMON: icmp eq i64 %[[#]], 0, !nosanitize393  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(394  // CHECK-TRAP: call void @llvm.ubsantrap(i8 22)395 396  // CHECK-COMMON: call void @llvm.memcpy.p0.p0.i64(ptr align 8 %0, ptr align 2 %1, i64 %conv, i1 false)397 398  // CHECK-UBSAN-NOT: call void @__ubsan_handle_type_mismatch_v1(399  // CHECK-COMMON: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %[[#]], ptr align 1 %[[#]], i64 %{{.*}}, i1 false)400#line 1600401  memcpy(p, q, sz);402  /// Casting to void * or char * drops the alignment requirement.403  memcpy((void *)p, (char *)q, sz);404}405 406// CHECK-COMMON-LABEL: define{{.*}} void @call_memcpy_inline(407void call_memcpy_inline(long *p, short *q) {408  // CHECK-COMMON: and i64 %[[#]], 7, !nosanitize409  // CHECK-COMMON: icmp eq i64 %[[#]], 0, !nosanitize410  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(411  // CHECK-TRAP: call void @llvm.ubsantrap(i8 22)412 413  // CHECK-COMMON: and i64 %[[#]], 1, !nosanitize414  // CHECK-COMMON: icmp eq i64 %[[#]], 0, !nosanitize415  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(416  // CHECK-TRAP: call void @llvm.ubsantrap(i8 22)417 418  // CHECK-COMMON: call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %0, ptr align 2 %1, i64 2, i1 false)419  __builtin_memcpy_inline(p, q, 2);420}421 422extern void *memmove(void *, const void *, unsigned long) __attribute__((nonnull(1, 2)));423 424// CHECK-COMMON-LABEL: @call_memmove_nonnull425void call_memmove_nonnull(void *p, void *q, int sz) {426  // CHECK-COMMON: icmp ne ptr {{.*}}, null427  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg428  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)429 430  // CHECK-COMMON: icmp ne ptr {{.*}}, null431  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg432  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)433  memmove(p, q, sz);434}435 436// CHECK-COMMON-LABEL: define{{.*}} void @call_memmove(437void call_memmove(long *p, short *q, int sz) {438  // CHECK-COMMON: icmp ne ptr {{.*}}, null439  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg(440  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)441  // CHECK-COMMON: and i64 %[[#]], 7, !nosanitize442  // CHECK-COMMON: icmp eq i64 %[[#]], 0, !nosanitize443  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(444  // CHECK-TRAP: call void @llvm.ubsantrap(i8 22)445 446  // CHECK-COMMON: icmp ne ptr {{.*}}, null447  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg(448  // CHECK-TRAP: call void @llvm.ubsantrap(i8 16)449  // CHECK-COMMON: and i64 %[[#]], 1, !nosanitize450  // CHECK-COMMON: icmp eq i64 %[[#]], 0, !nosanitize451  // CHECK-UBSAN: call void @__ubsan_handle_type_mismatch_v1(452  // CHECK-TRAP: call void @llvm.ubsantrap(i8 22)453 454  // CHECK-COMMON: call void @llvm.memmove.p0.p0.i64(ptr align 8 %0, ptr align 2 %1, i64 %conv, i1 false)455  memmove(p, q, sz);456}457 458// CHECK-COMMON-LABEL: @call_nonnull_variadic459__attribute__((nonnull)) void nonnull_variadic(int a, ...);460void call_nonnull_variadic(int a, int *b) {461  // CHECK-COMMON: [[OK:%.*]] = icmp ne ptr {{.*}}, null462  // CHECK-COMMON: br i1 [[OK]]463 464  // CHECK-UBSAN: call void @__ubsan_handle_nonnull_arg465  // CHECK-UBSAN-NOT: __ubsan_handle_nonnull_arg466 467  // CHECK-COMMON: call void (i32, ...) @nonnull_variadic468  nonnull_variadic(a, b);469}470 471// CHECK-UBSAN: ![[WEIGHT_MD]] = !{!"branch_weights", i32 1048575, i32 1}472 473// CHECK-TRAP: attributes [[NR_NUW]] = { nomerge noreturn nounwind }474