brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · a78285a Raw
128 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 = "mips64el--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 @__msan_va_arg_tls, 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.76 77; Check multiple fixed arguments.78declare i32 @foo2(i32 %g1, i32 %g2, ...)79define i32 @bar2() {80; CHECK-LABEL: define i32 @bar2() {81; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 882; CHECK-NEXT:    call void @llvm.donothing()83; CHECK-NEXT:    store i32 0, ptr @__msan_param_tls, align 884; CHECK-NEXT:    store i32 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 885; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 886; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 887; CHECK-NEXT:    store i64 0, ptr @__msan_va_arg_tls, align 888; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 8), align 889; CHECK-NEXT:    store i64 16, ptr @__msan_va_arg_overflow_size_tls, align 890; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 891; CHECK-NEXT:    [[TMP2:%.*]] = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)92; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 893; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 894; CHECK-NEXT:    ret i32 [[TMP2]]95;96  %1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)97  ret i32 %198}99 100; UTC_ARGS: --disable101 102; Test that MSan doesn't generate code overflowing __msan_va_arg_tls when too many arguments are103; passed to a variadic function.104define dso_local i64 @many_args() {105entry:106  %ret = call i64 (i64, ...) @sum(i64 120,107    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,108    i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,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 1119  )120  ret i64 %ret121}122 123; If the size of __msan_va_arg_tls changes the second argument of `add` must also be changed.124; CHECK-LABEL: @many_args125; CHECK: getelementptr (i8, ptr @__msan_va_arg_tls, i64 792)126; CHECK-NOT: getelementptr (i8, ptr @__msan_va_arg_tls, i64 800)127declare i64 @sum(i64 %n, ...)128