brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · a0dcefd Raw
127 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:e-p:64:64-i64:64-i128:128-n64-S128"5target triple = "loongarch64-unknown-linux-gnu"6 7;; First, check allocation of the save area.8declare void @llvm.lifetime.start.p0(ptr nocapture) #19declare void @llvm.va_start(ptr) #210declare void @llvm.va_end(ptr) #211declare void @llvm.lifetime.end.p0(ptr nocapture) #112define i32 @foo(i32 %guard, ...) {13; CHECK-LABEL: define i32 @foo(14; CHECK-SAME: i32 [[GUARD:%.*]], ...) {15; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 816; CHECK-NEXT:    [[TMP2:%.*]] = alloca i8, i64 [[TMP1]], align 817; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP2]], i8 0, i64 [[TMP1]], i1 false)18; CHECK-NEXT:    [[TMP3:%.*]] = call i64 @llvm.umin.i64(i64 [[TMP1]], i64 800)19; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP2]], ptr align 8 @__msan_va_arg_tls, i64 [[TMP3]], i1 false)20; CHECK-NEXT:    call void @llvm.donothing()21; CHECK-NEXT:    [[VL:%.*]] = alloca ptr, align 822; CHECK-NEXT:    [[TMP4:%.*]] = ptrtoint ptr [[VL]] to i6423; CHECK-NEXT:    [[TMP5:%.*]] = xor i64 [[TMP4]], 8796093022208024; CHECK-NEXT:    [[TMP6:%.*]] = inttoptr i64 [[TMP5]] to ptr25; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP6]], i8 0, i64 8, i1 false)26; CHECK-NEXT:    call void @llvm.lifetime.start.p0(ptr [[VL]])27; CHECK-NEXT:    [[TMP7:%.*]] = ptrtoint ptr [[VL]] to i6428; CHECK-NEXT:    [[TMP8:%.*]] = xor i64 [[TMP7]], 8796093022208029; CHECK-NEXT:    [[TMP9:%.*]] = inttoptr i64 [[TMP8]] to ptr30; CHECK-NEXT:    call void @llvm.memset.p0.i64(ptr align 8 [[TMP9]], i8 0, i64 8, i1 false)31; CHECK-NEXT:    call void @llvm.va_start.p0(ptr [[VL]])32; CHECK-NEXT:    [[TMP10:%.*]] = ptrtoint ptr [[VL]] to i6433; CHECK-NEXT:    [[TMP11:%.*]] = inttoptr i64 [[TMP10]] to ptr34; CHECK-NEXT:    [[TMP12:%.*]] = load ptr, ptr [[TMP11]], align 835; CHECK-NEXT:    [[TMP13:%.*]] = ptrtoint ptr [[TMP12]] to i6436; CHECK-NEXT:    [[TMP14:%.*]] = xor i64 [[TMP13]], 8796093022208037; CHECK-NEXT:    [[TMP15:%.*]] = inttoptr i64 [[TMP14]] to ptr38; CHECK-NEXT:    call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[TMP15]], ptr align 8 [[TMP2]], i64 [[TMP1]], i1 false)39; CHECK-NEXT:    call void @llvm.va_end.p0(ptr [[VL]])40; CHECK-NEXT:    call void @llvm.lifetime.end.p0(ptr [[VL]])41; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 842; CHECK-NEXT:    ret i32 043;44  %vl = alloca ptr, align 845  call void @llvm.lifetime.start.p0(ptr %vl)46  call void @llvm.va_start(ptr %vl)47  call void @llvm.va_end(ptr %vl)48  call void @llvm.lifetime.end.p0(ptr %vl)49  ret i32 050}51 52;; Save the incoming shadow value from the arguments in the __msan_va_arg_tls53;; array.54define i32 @bar() {55; CHECK-LABEL: define i32 @bar() {56; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 857; CHECK-NEXT:    call void @llvm.donothing()58; CHECK-NEXT:    store i32 0, ptr @__msan_param_tls, align 859; CHECK-NEXT:    store i32 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 860; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 861; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 862; CHECK-NEXT:    store i32 0, ptr @__msan_va_arg_tls, align 863; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 8), align 864; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 16), align 865; CHECK-NEXT:    store i64 24, ptr @__msan_va_arg_overflow_size_tls, align 866; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 867; CHECK-NEXT:    [[TMP2:%.*]] = call i32 (i32, ...) @foo(i32 0, i32 1, i64 2, double 3.000000e+00)68; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 869; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 870; CHECK-NEXT:    ret i32 [[TMP2]]71;72  %1 = call i32 (i32, ...) @foo(i32 0, i32 1, i64 2, double 3.000000e+00)73  ret i32 %174}75 76;; Check multiple fixed arguments.77declare i32 @foo2(i32 %g1, i32 %g2, ...)78define i32 @bar2() {79; CHECK-LABEL: define i32 @bar2() {80; CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr @__msan_va_arg_overflow_size_tls, align 881; CHECK-NEXT:    call void @llvm.donothing()82; CHECK-NEXT:    store i32 0, ptr @__msan_param_tls, align 883; CHECK-NEXT:    store i32 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 8), align 884; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 16), align 885; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_param_tls, i64 24), align 886; CHECK-NEXT:    store i64 0, ptr @__msan_va_arg_tls, align 887; CHECK-NEXT:    store i64 0, ptr getelementptr (i8, ptr @__msan_va_arg_tls, i64 8), align 888; CHECK-NEXT:    store i64 16, ptr @__msan_va_arg_overflow_size_tls, align 889; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 890; CHECK-NEXT:    [[TMP2:%.*]] = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)91; CHECK-NEXT:    [[_MSRET:%.*]] = load i32, ptr @__msan_retval_tls, align 892; CHECK-NEXT:    store i32 0, ptr @__msan_retval_tls, align 893; CHECK-NEXT:    ret i32 [[TMP2]]94;95  %1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)96  ret i32 %197}98 99; UTC_ARGS: --disable100 101;; Test that MSan doesn't generate code overflowing __msan_va_arg_tls when too many arguments are102;; passed to a variadic function.103declare i64 @sum(i64 %n, ...)104define dso_local i64 @many_args() {105;; If the size of __msan_va_arg_tls changes the second argument of `add` must also be changed.106; CHECK-LABEL: @many_args107; CHECK:    getelementptr (i8, ptr @__msan_va_arg_tls, i64 792)108; CHECK-NOT: getelementptr (i8, ptr @__msan_va_arg_tls, i64 800)109;110entry:111  %ret = call i64 (i64, ...) @sum(i64 120,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 1,121  i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,122  i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,123  i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1124  )125  ret i64 %ret126}127