Skip to content

Commit f032622

Browse files
k-kashapovKamil Kashapov
andauthored
[MSan] Copy tests for 32-bit architectures (#111835)
As discussed in #109284 Copied msan tests from 64-bit platforms to following 32-bit platforms: * MIPS * ARM * RISCV * PowerPC * i386 Most of the tests have been copied form mips64. Target triple and test contents have not been changed: to be done in next PR. --------- Co-authored-by: Kamil Kashapov <[email protected]>
1 parent d8de239 commit f032622

19 files changed

+11950
-0
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
; RUN: opt < %s -S -passes=msan 2>&1 | FileCheck %s
2+
3+
target datalayout = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128"
4+
target triple = "mips64--linux"
5+
6+
define i32 @foo(i32 %guard, ...) {
7+
%vl = alloca ptr, align 8
8+
call void @llvm.lifetime.start.p0(i64 32, ptr %vl)
9+
call void @llvm.va_start(ptr %vl)
10+
call void @llvm.va_end(ptr %vl)
11+
call void @llvm.lifetime.end.p0(i64 32, ptr %vl)
12+
ret i32 0
13+
}
14+
15+
; First, check allocation of the save area.
16+
17+
; CHECK-LABEL: @foo
18+
; CHECK: [[A:%.*]] = load {{.*}} @__msan_va_arg_overflow_size_tls
19+
; CHECK: [[B:%.*]] = add i64 0, [[A]]
20+
; CHECK: [[C:%.*]] = alloca {{.*}} [[B]]
21+
22+
; CHECK: call void @llvm.memset.p0.i64(ptr align 8 [[C]], i8 0, i64 [[B]], i1 false)
23+
24+
; CHECK: [[D:%.*]] = call i64 @llvm.umin.i64(i64 [[B]], i64 800)
25+
; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[C]], ptr align 8 @__msan_va_arg_tls, i64 [[D]], i1 false)
26+
27+
declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #1
28+
declare void @llvm.va_start(ptr) #2
29+
declare void @llvm.va_end(ptr) #2
30+
declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #1
31+
32+
define i32 @bar() {
33+
%1 = call i32 (i32, ...) @foo(i32 0, i32 1, i64 2, double 3.000000e+00)
34+
ret i32 %1
35+
}
36+
37+
; Save the incoming shadow value from the arguments in the __msan_va_arg_tls
38+
; array. The first argument is stored at position 4, since it's right
39+
; justified.
40+
; CHECK-LABEL: @bar
41+
; CHECK: store i32 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 4) to ptr), align 8
42+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 8) to ptr), align 8
43+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 16) to ptr), align 8
44+
; CHECK: store {{.*}} 24, {{.*}} @__msan_va_arg_overflow_size_tls
45+
46+
; Check multiple fixed arguments.
47+
declare i32 @foo2(i32 %g1, i32 %g2, ...)
48+
define i32 @bar2() {
49+
%1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)
50+
ret i32 %1
51+
}
52+
53+
; CHECK-LABEL: @bar2
54+
; CHECK: store i64 0, ptr @__msan_va_arg_tls, align 8
55+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 8) to ptr), align 8
56+
; CHECK: store {{.*}} 16, {{.*}} @__msan_va_arg_overflow_size_tls
57+
58+
; Test that MSan doesn't generate code overflowing __msan_va_arg_tls when too many arguments are
59+
; passed to a variadic function.
60+
define dso_local i64 @many_args() {
61+
entry:
62+
%ret = call i64 (i64, ...) @sum(i64 120,
63+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
64+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
65+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
66+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
67+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
68+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
69+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
70+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
71+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
72+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
73+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
74+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1
75+
)
76+
ret i64 %ret
77+
}
78+
79+
; If the size of __msan_va_arg_tls changes the second argument of `add` must also be changed.
80+
; CHECK-LABEL: @many_args
81+
; CHECK: i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 792)
82+
; CHECK-NOT: i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 800)
83+
declare i64 @sum(i64 %n, ...)
84+
85+
; CHECK: declare void @__msan_maybe_warning_1(i8 signext, i32 signext)
86+
; CHECK: declare void @__msan_maybe_store_origin_1(i8 signext, ptr, i32 signext)
87+
; CHECK: declare void @__msan_maybe_warning_2(i16 signext, i32 signext)
88+
; CHECK: declare void @__msan_maybe_store_origin_2(i16 signext, ptr, i32 signext)
89+
; CHECK: declare void @__msan_maybe_warning_4(i32 signext, i32 signext)
90+
; CHECK: declare void @__msan_maybe_store_origin_4(i32 signext, ptr, i32 signext)
91+
; CHECK: declare void @__msan_maybe_warning_8(i64 signext, i32 signext)
92+
; CHECK: declare void @__msan_maybe_store_origin_8(i64 signext, ptr, i32 signext)
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
; RUN: opt < %s -S -passes=msan 2>&1 | FileCheck %s
2+
3+
target datalayout = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128"
4+
target triple = "mips64--linux"
5+
6+
define i32 @foo(i32 %guard, ...) {
7+
%vl = alloca ptr, align 8
8+
call void @llvm.lifetime.start.p0(i64 32, ptr %vl)
9+
call void @llvm.va_start(ptr %vl)
10+
call void @llvm.va_end(ptr %vl)
11+
call void @llvm.lifetime.end.p0(i64 32, ptr %vl)
12+
ret i32 0
13+
}
14+
15+
; First, check allocation of the save area.
16+
17+
; CHECK-LABEL: @foo
18+
; CHECK: [[A:%.*]] = load {{.*}} @__msan_va_arg_overflow_size_tls
19+
; CHECK: [[B:%.*]] = add i64 0, [[A]]
20+
; CHECK: [[C:%.*]] = alloca {{.*}} [[B]]
21+
22+
; CHECK: call void @llvm.memset.p0.i64(ptr align 8 [[C]], i8 0, i64 [[B]], i1 false)
23+
24+
; CHECK: [[D:%.*]] = call i64 @llvm.umin.i64(i64 [[B]], i64 800)
25+
; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[C]], ptr align 8 @__msan_va_arg_tls, i64 [[D]], i1 false)
26+
27+
declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #1
28+
declare void @llvm.va_start(ptr) #2
29+
declare void @llvm.va_end(ptr) #2
30+
declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #1
31+
32+
define i32 @bar() {
33+
%1 = call i32 (i32, ...) @foo(i32 0, i32 1, i64 2, double 3.000000e+00)
34+
ret i32 %1
35+
}
36+
37+
; Save the incoming shadow value from the arguments in the __msan_va_arg_tls
38+
; array. The first argument is stored at position 4, since it's right
39+
; justified.
40+
; CHECK-LABEL: @bar
41+
; CHECK: store i32 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 4) to ptr), align 8
42+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 8) to ptr), align 8
43+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 16) to ptr), align 8
44+
; CHECK: store {{.*}} 24, {{.*}} @__msan_va_arg_overflow_size_tls
45+
46+
; Check multiple fixed arguments.
47+
declare i32 @foo2(i32 %g1, i32 %g2, ...)
48+
define i32 @bar2() {
49+
%1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)
50+
ret i32 %1
51+
}
52+
53+
; CHECK-LABEL: @bar2
54+
; CHECK: store i64 0, ptr @__msan_va_arg_tls, align 8
55+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 8) to ptr), align 8
56+
; CHECK: store {{.*}} 16, {{.*}} @__msan_va_arg_overflow_size_tls
57+
58+
; Test that MSan doesn't generate code overflowing __msan_va_arg_tls when too many arguments are
59+
; passed to a variadic function.
60+
define dso_local i64 @many_args() {
61+
entry:
62+
%ret = call i64 (i64, ...) @sum(i64 120,
63+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
64+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
65+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
66+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
67+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
68+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
69+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
70+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
71+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
72+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
73+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
74+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1
75+
)
76+
ret i64 %ret
77+
}
78+
79+
; If the size of __msan_va_arg_tls changes the second argument of `add` must also be changed.
80+
; CHECK-LABEL: @many_args
81+
; CHECK: i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 792)
82+
; CHECK-NOT: i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 800)
83+
declare i64 @sum(i64 %n, ...)
84+
85+
; CHECK: declare void @__msan_maybe_warning_1(i8 signext, i32 signext)
86+
; CHECK: declare void @__msan_maybe_store_origin_1(i8 signext, ptr, i32 signext)
87+
; CHECK: declare void @__msan_maybe_warning_2(i16 signext, i32 signext)
88+
; CHECK: declare void @__msan_maybe_store_origin_2(i16 signext, ptr, i32 signext)
89+
; CHECK: declare void @__msan_maybe_warning_4(i32 signext, i32 signext)
90+
; CHECK: declare void @__msan_maybe_store_origin_4(i32 signext, ptr, i32 signext)
91+
; CHECK: declare void @__msan_maybe_warning_8(i64 signext, i32 signext)
92+
; CHECK: declare void @__msan_maybe_store_origin_8(i64 signext, ptr, i32 signext)
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
; RUN: opt < %s -S -passes=msan 2>&1 | FileCheck %s
2+
3+
target datalayout = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128"
4+
target triple = "mips64el--linux"
5+
6+
define i32 @foo(i32 %guard, ...) {
7+
%vl = alloca ptr, align 8
8+
call void @llvm.lifetime.start.p0(i64 32, ptr %vl)
9+
call void @llvm.va_start(ptr %vl)
10+
call void @llvm.va_end(ptr %vl)
11+
call void @llvm.lifetime.end.p0(i64 32, ptr %vl)
12+
ret i32 0
13+
}
14+
15+
; First, check allocation of the save area.
16+
17+
; CHECK-LABEL: @foo
18+
; CHECK: [[A:%.*]] = load {{.*}} @__msan_va_arg_overflow_size_tls
19+
; CHECK: [[B:%.*]] = add i64 0, [[A]]
20+
; CHECK: [[C:%.*]] = alloca {{.*}} [[B]]
21+
22+
; CHECK: call void @llvm.memset.p0.i64(ptr align 8 [[C]], i8 0, i64 [[B]], i1 false)
23+
24+
; CHECK: [[D:%.*]] = call i64 @llvm.umin.i64(i64 [[B]], i64 800)
25+
; CHECK: call void @llvm.memcpy.p0.p0.i64(ptr align 8 [[C]], ptr align 8 @__msan_va_arg_tls, i64 [[D]], i1 false)
26+
27+
declare void @llvm.lifetime.start.p0(i64, ptr nocapture) #1
28+
declare void @llvm.va_start(ptr) #2
29+
declare void @llvm.va_end(ptr) #2
30+
declare void @llvm.lifetime.end.p0(i64, ptr nocapture) #1
31+
32+
define i32 @bar() {
33+
%1 = call i32 (i32, ...) @foo(i32 0, i32 1, i64 2, double 3.000000e+00)
34+
ret i32 %1
35+
}
36+
37+
; Save the incoming shadow value from the arguments in the __msan_va_arg_tls
38+
; array.
39+
; CHECK-LABEL: @bar
40+
; CHECK: store i32 0, ptr @__msan_va_arg_tls, align 8
41+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 8) to ptr), align 8
42+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 16) to ptr), align 8
43+
; CHECK: store {{.*}} 24, {{.*}} @__msan_va_arg_overflow_size_tls
44+
45+
; Check multiple fixed arguments.
46+
declare i32 @foo2(i32 %g1, i32 %g2, ...)
47+
define i32 @bar2() {
48+
%1 = call i32 (i32, i32, ...) @foo2(i32 0, i32 1, i64 2, double 3.000000e+00)
49+
ret i32 %1
50+
}
51+
52+
; CHECK-LABEL: @bar2
53+
; CHECK: store i64 0, ptr @__msan_va_arg_tls, align 8
54+
; CHECK: store i64 0, ptr inttoptr (i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 8) to ptr), align 8
55+
; CHECK: store {{.*}} 16, {{.*}} @__msan_va_arg_overflow_size_tls
56+
57+
; Test that MSan doesn't generate code overflowing __msan_va_arg_tls when too many arguments are
58+
; passed to a variadic function.
59+
define dso_local i64 @many_args() {
60+
entry:
61+
%ret = call i64 (i64, ...) @sum(i64 120,
62+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
63+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
64+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
65+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
66+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
67+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
68+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
69+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
70+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
71+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
72+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1,
73+
i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1
74+
)
75+
ret i64 %ret
76+
}
77+
78+
; If the size of __msan_va_arg_tls changes the second argument of `add` must also be changed.
79+
; CHECK-LABEL: @many_args
80+
; CHECK: i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 792)
81+
; CHECK-NOT: i64 add (i64 ptrtoint (ptr @__msan_va_arg_tls to i64), i64 800)
82+
declare i64 @sum(i64 %n, ...)

0 commit comments

Comments
 (0)