brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.3 KiB · 1187531 Raw
139 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 62; RUN: opt < %s -S -passes=msan 2>&1 | FileCheck %s3 4target datalayout = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128"5target triple = "mips64--linux"6 7define i32 @foo(i32 %guard, ...) {8; CHECK-LABEL: define i32 @foo(9; CHECK-SAME: i32 [[GUARD:%.*]], ...) {10; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 811; CHECK-NEXT:    [[TMP2:%.*]] = alloca i8, i64 [[TMP1]], align 812; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP2]], i8 0, i64 [[TMP1]], i1 false)13; CHECK-NEXT:    [[TMP3:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP1]], i64 800)14; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP2]], ptr align 8 @__msan_va_arg_tls, i64 [[TMP3]], i1 false)15; CHECK-NEXT:    call void @llvm.donothing()16; CHECK-NEXT:    [[VL:%.*]] = alloca ptr, align 817; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[VL]] to i6418; CHECK-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP4]], 54975581388819; CHECK-NEXT:    [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr20; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP6]], i8 0, i64 8, i1 false)21; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VL]])22; CHECK-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[VL]] to i6423; CHECK-NEXT:    [[TMP8:%.*]] = xor i64 [[TMP7]], 54975581388824; CHECK-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr25; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP9]], i8 0, i64 8, i1 false)26; CHECK-NEXT:    call void @llvm.va_start.p0(ptr [[VL]])27; CHECK-NEXT:    [[TMP10:%.*]] = ptrtoint ptr [[VL]] to i6428; CHECK-NEXT:    [[TMP11:%.*]] = inttoptr i64 [[TMP10]] to ptr29; CHECK-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 830; CHECK-NEXT:    [[TMP13:%.*]] = ptrtoint ptr [[TMP12]] to i6431; CHECK-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP13]], 54975581388832; CHECK-NEXT:    [[TMP15:%.*]] = inttoptr i64 [[TMP14]] to ptr33; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP15]], ptr align 8 [[TMP2]], i64 [[TMP1]], i1 false)34; CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VL]])35; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VL]])36; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 837; CHECK-NEXT:    ret i32 038;39  %vl = alloca ptr, align 840  call void @llvm.lifetime.start.p0(ptr %vl)41  call void @llvm.va_start(ptr %vl)42  call void @llvm.va_end(ptr %vl)43  call void @llvm.lifetime.end.p0(ptr %vl)44  ret i32 045}46 47declare void @llvm.lifetime.start.p0(ptr nocapture) #148declare void @llvm.va_start(ptr) #249declare void @llvm.va_end(ptr) #250declare void @llvm.lifetime.end.p0(ptr nocapture) #151 52define i32 @bar() {53; CHECK-LABEL: define i32 @bar() {54; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 855; CHECK-NEXT:    call void @llvm.donothing()56; CHECK-NEXT:    store i32 0, ptr @__msan_param_tls, align 857; CHECK-NEXT:    store i32 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 858; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 859; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 860; CHECK-NEXT:    store i32 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 4), align 861; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 8), align 862; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 16), align 863; CHECK-NEXT:    store i64 24, ptr @__msan_va_arg_overflow_size_tls, align 864; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 865; CHECK-NEXT:    [[TMP2:%.*]] = call i32 (i32, ...) @foo(i32 0, i32 1, i64 2, double 3.000000e+00)66; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 867; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 868; CHECK-NEXT:    ret i32 [[TMP2]]69;70  %1 = call i32 (i32, ...) @foo(i32 0, i32 1, i64 2, double 3.000000e+00)71  ret i32 %172}73 74; Save the incoming shadow value from the arguments in the __msan_va_arg_tls75; array.  The first argument is stored at position 4, since it's right76; justified.77 78; Check multiple fixed arguments.79declare i32 @foo2(i32 %g1, i32 %g2, ...)80define i32 @bar2() {81; CHECK-LABEL: define i32 @bar2() {82; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 883; CHECK-NEXT:    call void @llvm.donothing()84; CHECK-NEXT:    store i32 0, ptr @__msan_param_tls, align 885; CHECK-NEXT:    store i32 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 886; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 887; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 888; CHECK-NEXT:    store i64 0, ptr @__msan_va_arg_tls, align 889; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 8), align 890; CHECK-NEXT:    store i64 16, ptr @__msan_va_arg_overflow_size_tls, align 891; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 892; CHECK-NEXT:    [[TMP2:%.*]] = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)93; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 894; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 895; CHECK-NEXT:    ret i32 [[TMP2]]96;97  %1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)98  ret i32 %199}100 101 102; UTC_ARGS: --disable103 104; Test that MSan doesn't generate code overflowing __msan_va_arg_tls when too many arguments are105; passed to a variadic function.106define dso_local i64 @many_args() {107entry:108  %ret = call i64 (i64, ...) @sum(i64 120,109    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,110    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,111    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,112    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,113    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,114    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,115    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,116    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,117    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,118    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,119    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,120    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1121  )122  ret i64 %ret123}124 125; If the size of __msan_va_arg_tls changes the second argument of `add` must also be changed.126; CHECK-LABEL: @many_args127; CHECK: getelementptr (i8, ptr @__msan_va_arg_tls, i64 792)128; CHECK-NOT: getelementptr (i8, ptr @__msan_va_arg_tls, i64 800)129declare i64 @sum(i64 %n, ...)130 131; CHECK: declare void @__msan_maybe_warning_1(i8 signext, i32 signext)132; CHECK: declare void @__msan_maybe_store_origin_1(i8 signext, ptr, i32 signext)133; CHECK: declare void @__msan_maybe_warning_2(i16 signext, i32 signext)134; CHECK: declare void @__msan_maybe_store_origin_2(i16 signext, ptr, i32 signext)135; CHECK: declare void @__msan_maybe_warning_4(i32 signext, i32 signext)136; CHECK: declare void @__msan_maybe_store_origin_4(i32 signext, ptr, i32 signext)137; CHECK: declare void @__msan_maybe_warning_8(i64 signext, i32 signext)138; CHECK: declare void @__msan_maybe_store_origin_8(i64 signext, ptr, i32 signext)139