18fe99a0eSAlexander Potapenko; KMSAN instrumentation tests
2b39a97c8SPhilip Pfaffe; RUN: opt < %s -msan-kernel=1 -S -passes=msan 2>&1 | FileCheck %s             \
3b39a97c8SPhilip Pfaffe; RUN: -check-prefixes=CHECK
48fe99a0eSAlexander Potapenko
58fe99a0eSAlexander Potapenkotarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
68fe99a0eSAlexander Potapenkotarget triple = "x86_64-unknown-linux-gnu"
78fe99a0eSAlexander Potapenko
88fe99a0eSAlexander Potapenko; Check the instrumentation prologue.
98fe99a0eSAlexander Potapenkodefine void @Empty() nounwind uwtable sanitize_memory {
108fe99a0eSAlexander Potapenkoentry:
118fe99a0eSAlexander Potapenko  ret void
128fe99a0eSAlexander Potapenko}
138fe99a0eSAlexander Potapenko
148fe99a0eSAlexander Potapenko; CHECK-LABEL: @Empty
158fe99a0eSAlexander Potapenko; CHECK: entry:
168fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
178fe99a0eSAlexander Potapenko; %param_shadow:
188fe99a0eSAlexander Potapenko; CHECK: getelementptr {{.*}} i32 0, i32 0
198fe99a0eSAlexander Potapenko; %retval_shadow:
208fe99a0eSAlexander Potapenko; CHECK: getelementptr {{.*}} i32 0, i32 1
218fe99a0eSAlexander Potapenko; %va_arg_shadow:
228fe99a0eSAlexander Potapenko; CHECK: getelementptr {{.*}} i32 0, i32 2
238fe99a0eSAlexander Potapenko; %va_arg_origin:
248fe99a0eSAlexander Potapenko; CHECK: getelementptr {{.*}} i32 0, i32 3
258fe99a0eSAlexander Potapenko; %va_arg_overflow_size:
268fe99a0eSAlexander Potapenko; CHECK: getelementptr {{.*}} i32 0, i32 4
278fe99a0eSAlexander Potapenko; %param_origin:
288fe99a0eSAlexander Potapenko; CHECK: getelementptr {{.*}} i32 0, i32 5
298fe99a0eSAlexander Potapenko; %retval_origin:
308fe99a0eSAlexander Potapenko; CHECK: getelementptr {{.*}} i32 0, i32 6
318fe99a0eSAlexander Potapenko
328fe99a0eSAlexander Potapenko; Check instrumentation of stores
338fe99a0eSAlexander Potapenko
348fe99a0eSAlexander Potapenkodefine void @Store1(i8* nocapture %p, i8 %x) nounwind uwtable sanitize_memory {
358fe99a0eSAlexander Potapenkoentry:
368fe99a0eSAlexander Potapenko  store i8 %x, i8* %p
378fe99a0eSAlexander Potapenko  ret void
388fe99a0eSAlexander Potapenko}
398fe99a0eSAlexander Potapenko
408fe99a0eSAlexander Potapenko; CHECK-LABEL: @Store1
41c0e6b8acSJames Y Knight; CHECK: entry:
428fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
438fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
448fe99a0eSAlexander Potapenko; CHECK: [[BASE:%[0-9]+]] = ptrtoint {{.*}} [[PARAM_SHADOW]]
4536ebabc1SGui Andrade; CHECK: [[SHADOW_PTR:%[a-z0-9_]+]] = inttoptr {{.*}} [[BASE]]
4636ebabc1SGui Andrade; CHECK: [[SHADOW:%[a-z0-9]+]] = load i64, i64* [[SHADOW_PTR]]
4705e3ab41SGui Andrade; CHECK: [[BASE2:%[0-9]+]] = ptrtoint {{.*}} [[PARAM_SHADOW]]
488fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
4936ebabc1SGui Andrade; CHECK: icmp ne i64 [[SHADOW]]
508fe99a0eSAlexander Potapenko; CHECK: br i1
51c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
528fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_store_1(i8* %p)
538fe99a0eSAlexander Potapenko; CHECK: store i8
548fe99a0eSAlexander Potapenko; If the new shadow is non-zero, jump to __msan_chain_origin()
558fe99a0eSAlexander Potapenko; CHECK: icmp
568fe99a0eSAlexander Potapenko; CHECK: br i1
57c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
588fe99a0eSAlexander Potapenko; CHECK: @__msan_chain_origin
598fe99a0eSAlexander Potapenko; Storing origin here:
608fe99a0eSAlexander Potapenko; CHECK: store i32
618fe99a0eSAlexander Potapenko; CHECK: br label
62c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
638fe99a0eSAlexander Potapenko; CHECK: store i8
648fe99a0eSAlexander Potapenko; CHECK: ret void
658fe99a0eSAlexander Potapenko
668fe99a0eSAlexander Potapenkodefine void @Store2(i16* nocapture %p, i16 %x) nounwind uwtable sanitize_memory {
678fe99a0eSAlexander Potapenkoentry:
688fe99a0eSAlexander Potapenko  store i16 %x, i16* %p
698fe99a0eSAlexander Potapenko  ret void
708fe99a0eSAlexander Potapenko}
718fe99a0eSAlexander Potapenko
728fe99a0eSAlexander Potapenko; CHECK-LABEL: @Store2
73c0e6b8acSJames Y Knight; CHECK: entry:
748fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
758fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
768fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
778fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
788fe99a0eSAlexander Potapenko; CHECK: load i64
798fe99a0eSAlexander Potapenko; CHECK: icmp
808fe99a0eSAlexander Potapenko; CHECK: br i1
81c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
828fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i16* %p to i8*
838fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_store_2(i8* [[REG]])
848fe99a0eSAlexander Potapenko; CHECK: store i16
858fe99a0eSAlexander Potapenko; If the new shadow is non-zero, jump to __msan_chain_origin()
868fe99a0eSAlexander Potapenko; CHECK: icmp
878fe99a0eSAlexander Potapenko; CHECK: br i1
88c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
898fe99a0eSAlexander Potapenko; CHECK: @__msan_chain_origin
908fe99a0eSAlexander Potapenko; Storing origin here:
918fe99a0eSAlexander Potapenko; CHECK: store i32
928fe99a0eSAlexander Potapenko; CHECK: br label
93c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
948fe99a0eSAlexander Potapenko; CHECK: store i16
958fe99a0eSAlexander Potapenko; CHECK: ret void
968fe99a0eSAlexander Potapenko
978fe99a0eSAlexander Potapenko
988fe99a0eSAlexander Potapenkodefine void @Store4(i32* nocapture %p, i32 %x) nounwind uwtable sanitize_memory {
998fe99a0eSAlexander Potapenkoentry:
1008fe99a0eSAlexander Potapenko  store i32 %x, i32* %p
1018fe99a0eSAlexander Potapenko  ret void
1028fe99a0eSAlexander Potapenko}
1038fe99a0eSAlexander Potapenko
1048fe99a0eSAlexander Potapenko; CHECK-LABEL: @Store4
105c0e6b8acSJames Y Knight; CHECK: entry:
1068fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
1078fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
1088fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
1098fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
1108fe99a0eSAlexander Potapenko; CHECK: load i32
1118fe99a0eSAlexander Potapenko; CHECK: icmp
1128fe99a0eSAlexander Potapenko; CHECK: br i1
113c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1148fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i32* %p to i8*
1158fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_store_4(i8* [[REG]])
1168fe99a0eSAlexander Potapenko; CHECK: store i32
1178fe99a0eSAlexander Potapenko; If the new shadow is non-zero, jump to __msan_chain_origin()
1188fe99a0eSAlexander Potapenko; CHECK: icmp
1198fe99a0eSAlexander Potapenko; CHECK: br i1
120c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1218fe99a0eSAlexander Potapenko; CHECK: @__msan_chain_origin
1228fe99a0eSAlexander Potapenko; Storing origin here:
1238fe99a0eSAlexander Potapenko; CHECK: store i32
1248fe99a0eSAlexander Potapenko; CHECK: br label
125c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1268fe99a0eSAlexander Potapenko; CHECK: store i32
1278fe99a0eSAlexander Potapenko; CHECK: ret void
1288fe99a0eSAlexander Potapenko
1298fe99a0eSAlexander Potapenkodefine void @Store8(i64* nocapture %p, i64 %x) nounwind uwtable sanitize_memory {
1308fe99a0eSAlexander Potapenkoentry:
1318fe99a0eSAlexander Potapenko  store i64 %x, i64* %p
1328fe99a0eSAlexander Potapenko  ret void
1338fe99a0eSAlexander Potapenko}
1348fe99a0eSAlexander Potapenko
1358fe99a0eSAlexander Potapenko; CHECK-LABEL: @Store8
136c0e6b8acSJames Y Knight; CHECK: entry:
1378fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
1388fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
1398fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
1408fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
1418fe99a0eSAlexander Potapenko; CHECK: load i64
1428fe99a0eSAlexander Potapenko; CHECK: icmp
1438fe99a0eSAlexander Potapenko; CHECK: br i1
144c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1458fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i64* %p to i8*
1468fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_store_8(i8* [[REG]])
1478fe99a0eSAlexander Potapenko; CHECK: store i64
1488fe99a0eSAlexander Potapenko; If the new shadow is non-zero, jump to __msan_chain_origin()
1498fe99a0eSAlexander Potapenko; CHECK: icmp
1508fe99a0eSAlexander Potapenko; CHECK: br i1
151c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1528fe99a0eSAlexander Potapenko; CHECK: @__msan_chain_origin
1538fe99a0eSAlexander Potapenko; Storing origin here:
15411aa3707SEli Friedman; CHECK: store i64
1558fe99a0eSAlexander Potapenko; CHECK: br label
156c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1578fe99a0eSAlexander Potapenko; CHECK: store i64
1588fe99a0eSAlexander Potapenko; CHECK: ret void
1598fe99a0eSAlexander Potapenko
1608fe99a0eSAlexander Potapenkodefine void @Store16(i128* nocapture %p, i128 %x) nounwind uwtable sanitize_memory {
1618fe99a0eSAlexander Potapenkoentry:
1628fe99a0eSAlexander Potapenko  store i128 %x, i128* %p
1638fe99a0eSAlexander Potapenko  ret void
1648fe99a0eSAlexander Potapenko}
1658fe99a0eSAlexander Potapenko
1668fe99a0eSAlexander Potapenko; CHECK-LABEL: @Store16
167c0e6b8acSJames Y Knight; CHECK: entry:
1688fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
1698fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
1708fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
1718fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
1728fe99a0eSAlexander Potapenko; CHECK: load i64
1738fe99a0eSAlexander Potapenko; CHECK: icmp
1748fe99a0eSAlexander Potapenko; CHECK: br i1
175c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1768fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i128* %p to i8*
1778fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_store_n(i8* [[REG]], i64 16)
1788fe99a0eSAlexander Potapenko; CHECK: store i128
1798fe99a0eSAlexander Potapenko; If the new shadow is non-zero, jump to __msan_chain_origin()
1808fe99a0eSAlexander Potapenko; CHECK: icmp
1818fe99a0eSAlexander Potapenko; CHECK: br i1
182c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1838fe99a0eSAlexander Potapenko; CHECK: @__msan_chain_origin
1848fe99a0eSAlexander Potapenko; Storing origin here:
18511aa3707SEli Friedman; CHECK: store i64
1868fe99a0eSAlexander Potapenko; CHECK: br label
187c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
1888fe99a0eSAlexander Potapenko; CHECK: store i128
1898fe99a0eSAlexander Potapenko; CHECK: ret void
1908fe99a0eSAlexander Potapenko
1918fe99a0eSAlexander Potapenko
1928fe99a0eSAlexander Potapenko; Check instrumentation of loads
1938fe99a0eSAlexander Potapenko
1948fe99a0eSAlexander Potapenkodefine i8 @Load1(i8* nocapture %p) nounwind uwtable sanitize_memory {
1958fe99a0eSAlexander Potapenkoentry:
1968fe99a0eSAlexander Potapenko  %0 = load i8, i8* %p
1978fe99a0eSAlexander Potapenko  ret i8 %0
1988fe99a0eSAlexander Potapenko}
1998fe99a0eSAlexander Potapenko
2008fe99a0eSAlexander Potapenko; CHECK-LABEL: @Load1
201c0e6b8acSJames Y Knight; CHECK: entry:
2028fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
2038fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
2048fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
2058fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
2068fe99a0eSAlexander Potapenko; CHECK: load i64
2078fe99a0eSAlexander Potapenko; CHECK: icmp
2088fe99a0eSAlexander Potapenko; CHECK: br i1
209c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
2108fe99a0eSAlexander Potapenko; Load the value from %p. This is done before accessing the shadow
2118fe99a0eSAlexander Potapenko; to ease atomic handling.
2128fe99a0eSAlexander Potapenko; CHECK: load i8
2138fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_load_1(i8* %p)
2148fe99a0eSAlexander Potapenko; Load the shadow and origin.
2158fe99a0eSAlexander Potapenko; CHECK: load i8
2168fe99a0eSAlexander Potapenko; CHECK: load i32
2178fe99a0eSAlexander Potapenko
2188fe99a0eSAlexander Potapenko
2198fe99a0eSAlexander Potapenkodefine i16 @Load2(i16* nocapture %p) nounwind uwtable sanitize_memory {
2208fe99a0eSAlexander Potapenkoentry:
2218fe99a0eSAlexander Potapenko  %0 = load i16, i16* %p
2228fe99a0eSAlexander Potapenko  ret i16 %0
2238fe99a0eSAlexander Potapenko}
2248fe99a0eSAlexander Potapenko
2258fe99a0eSAlexander Potapenko; CHECK-LABEL: @Load2
226c0e6b8acSJames Y Knight; CHECK: entry:
2278fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
2288fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
2298fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
2308fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
2318fe99a0eSAlexander Potapenko; CHECK: load i64
2328fe99a0eSAlexander Potapenko; CHECK: icmp
2338fe99a0eSAlexander Potapenko; CHECK: br i1
234c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
2358fe99a0eSAlexander Potapenko; Load the value from %p. This is done before accessing the shadow
2368fe99a0eSAlexander Potapenko; to ease atomic handling.
2378fe99a0eSAlexander Potapenko; CHECK: load i16
2388fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i16* %p to i8*
2398fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_load_2(i8* [[REG]])
2408fe99a0eSAlexander Potapenko; Load the shadow and origin.
2418fe99a0eSAlexander Potapenko; CHECK: load i16
2428fe99a0eSAlexander Potapenko; CHECK: load i32
2438fe99a0eSAlexander Potapenko
2448fe99a0eSAlexander Potapenko
2458fe99a0eSAlexander Potapenkodefine i32 @Load4(i32* nocapture %p) nounwind uwtable sanitize_memory {
2468fe99a0eSAlexander Potapenkoentry:
2478fe99a0eSAlexander Potapenko  %0 = load i32, i32* %p
2488fe99a0eSAlexander Potapenko  ret i32 %0
2498fe99a0eSAlexander Potapenko}
2508fe99a0eSAlexander Potapenko
2518fe99a0eSAlexander Potapenko; CHECK-LABEL: @Load4
252c0e6b8acSJames Y Knight; CHECK: entry:
2538fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
2548fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
2558fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
2568fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
2578fe99a0eSAlexander Potapenko; CHECK: load i64
2588fe99a0eSAlexander Potapenko; CHECK: icmp
2598fe99a0eSAlexander Potapenko; CHECK: br i1
260c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
2618fe99a0eSAlexander Potapenko; Load the value from %p. This is done before accessing the shadow
2628fe99a0eSAlexander Potapenko; to ease atomic handling.
2638fe99a0eSAlexander Potapenko; CHECK: load i32
2648fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i32* %p to i8*
2658fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_load_4(i8* [[REG]])
2668fe99a0eSAlexander Potapenko; Load the shadow and origin.
2678fe99a0eSAlexander Potapenko; CHECK: load i32
2688fe99a0eSAlexander Potapenko; CHECK: load i32
2698fe99a0eSAlexander Potapenko
2708fe99a0eSAlexander Potapenkodefine i64 @Load8(i64* nocapture %p) nounwind uwtable sanitize_memory {
2718fe99a0eSAlexander Potapenkoentry:
2728fe99a0eSAlexander Potapenko  %0 = load i64, i64* %p
2738fe99a0eSAlexander Potapenko  ret i64 %0
2748fe99a0eSAlexander Potapenko}
2758fe99a0eSAlexander Potapenko
2768fe99a0eSAlexander Potapenko; CHECK-LABEL: @Load8
277c0e6b8acSJames Y Knight; CHECK: entry:
2788fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
2798fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
2808fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
2818fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
2828fe99a0eSAlexander Potapenko; CHECK: load i64
2838fe99a0eSAlexander Potapenko; CHECK: icmp
2848fe99a0eSAlexander Potapenko; CHECK: br i1
285c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
2868fe99a0eSAlexander Potapenko; Load the value from %p. This is done before accessing the shadow
2878fe99a0eSAlexander Potapenko; to ease atomic handling.
2888fe99a0eSAlexander Potapenko; CHECK: load i64
2898fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i64* %p to i8*
2908fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_load_8(i8* [[REG]])
2918fe99a0eSAlexander Potapenko; Load the shadow and origin.
2928fe99a0eSAlexander Potapenko; CHECK: load i64
2938fe99a0eSAlexander Potapenko; CHECK: load i32
2948fe99a0eSAlexander Potapenko
2958fe99a0eSAlexander Potapenkodefine i128 @Load16(i128* nocapture %p) nounwind uwtable sanitize_memory {
2968fe99a0eSAlexander Potapenkoentry:
2978fe99a0eSAlexander Potapenko  %0 = load i128, i128* %p
2988fe99a0eSAlexander Potapenko  ret i128 %0
2998fe99a0eSAlexander Potapenko}
3008fe99a0eSAlexander Potapenko
3018fe99a0eSAlexander Potapenko; CHECK-LABEL: @Load16
302c0e6b8acSJames Y Knight; CHECK: entry:
3038fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
3048fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
3058fe99a0eSAlexander Potapenko; CHECK: ptrtoint {{.*}} [[PARAM_SHADOW]]
3068fe99a0eSAlexander Potapenko; Load the shadow of %p and check it
3078fe99a0eSAlexander Potapenko; CHECK: load i64
3088fe99a0eSAlexander Potapenko; CHECK: icmp
3098fe99a0eSAlexander Potapenko; CHECK: br i1
310c0e6b8acSJames Y Knight; CHECK: {{^[0-9]+}}:
3118fe99a0eSAlexander Potapenko; Load the value from %p. This is done before accessing the shadow
3128fe99a0eSAlexander Potapenko; to ease atomic handling.
3138fe99a0eSAlexander Potapenko; CHECK: load i128
3148fe99a0eSAlexander Potapenko; CHECK: [[REG:%[0-9]+]] = bitcast i128* %p to i8*
3158fe99a0eSAlexander Potapenko; CHECK: @__msan_metadata_ptr_for_load_n(i8* [[REG]], i64 16)
3168fe99a0eSAlexander Potapenko; Load the shadow and origin.
3178fe99a0eSAlexander Potapenko; CHECK: load i128
3188fe99a0eSAlexander Potapenko; CHECK: load i32
3198fe99a0eSAlexander Potapenko
3208fe99a0eSAlexander Potapenko
3218fe99a0eSAlexander Potapenko; Test kernel-specific va_list instrumentation
3228fe99a0eSAlexander Potapenko
3238fe99a0eSAlexander Potapenko%struct.__va_list_tag = type { i32, i32, i8*, i8* }
3248fe99a0eSAlexander Potapenkodeclare void @llvm.va_start(i8*) nounwind
3258fe99a0eSAlexander Potapenkodeclare void @llvm.va_end(i8*)
3268fe99a0eSAlexander Potapenko@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1
3278fe99a0eSAlexander Potapenkodeclare dso_local i32 @VAListFn(i8*, %struct.__va_list_tag*) local_unnamed_addr
3288fe99a0eSAlexander Potapenko
3298fe99a0eSAlexander Potapenko; Function Attrs: nounwind uwtable
3308fe99a0eSAlexander Potapenkodefine dso_local i32 @VarArgFn(i8* %fmt, ...) local_unnamed_addr sanitize_memory #0 {
3318fe99a0eSAlexander Potapenkoentry:
3328fe99a0eSAlexander Potapenko  %args = alloca [1 x %struct.__va_list_tag], align 16
3338fe99a0eSAlexander Potapenko  %0 = bitcast [1 x %struct.__va_list_tag]* %args to i8*
3348fe99a0eSAlexander Potapenko  %arraydecay = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %args, i64 0, i64 0
3358fe99a0eSAlexander Potapenko  call void @llvm.va_start(i8* nonnull %0)
3368fe99a0eSAlexander Potapenko  %call = call i32 @VAListFn(i8* %fmt, %struct.__va_list_tag* nonnull %arraydecay)
3378fe99a0eSAlexander Potapenko  call void @llvm.va_end(i8* nonnull %0)
3388fe99a0eSAlexander Potapenko  ret i32 %call
3398fe99a0eSAlexander Potapenko}
3408fe99a0eSAlexander Potapenko
3418fe99a0eSAlexander Potapenko; Kernel is built without SSE support.
3428fe99a0eSAlexander Potapenkoattributes #0 = { "target-features"="+fxsr,+x87,-sse" }
3438fe99a0eSAlexander Potapenko
3448fe99a0eSAlexander Potapenko; CHECK-LABEL: @VarArgFn
3458fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
3468fe99a0eSAlexander Potapenko; CHECK: [[VA_ARG_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 2
3478fe99a0eSAlexander Potapenko; CHECK: [[VA_ARG_ORIGIN:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 3
3488fe99a0eSAlexander Potapenko; CHECK: [[VA_ARG_OVERFLOW_SIZE:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 4
3498fe99a0eSAlexander Potapenko
3508fe99a0eSAlexander Potapenko; CHECK: [[OSIZE:%[0-9]+]] = load i64, i64* [[VA_ARG_OVERFLOW_SIZE]]
3518fe99a0eSAlexander Potapenko; Register save area is 48 bytes for non-SSE builds.
352*101aaf62SRoman Lebedev; CHECK: [[SIZE:%[0-9]+]] = add i64 48, [[OSIZE]]
3538fe99a0eSAlexander Potapenko; CHECK: [[SHADOWS:%[0-9]+]] = alloca i8, i64 [[SIZE]]
3548fe99a0eSAlexander Potapenko; CHECK: [[VA_ARG_SHADOW]]
3558fe99a0eSAlexander Potapenko; CHECK: call void @llvm.memcpy{{.*}}(i8* align 8 [[SHADOWS]], {{.*}}, i64 [[SIZE]]
3568fe99a0eSAlexander Potapenko; CHECK: [[ORIGINS:%[0-9]+]] = alloca i8, i64 [[SIZE]]
3578fe99a0eSAlexander Potapenko; CHECK: [[VA_ARG_ORIGIN]]
3588fe99a0eSAlexander Potapenko; CHECK: call void @llvm.memcpy{{.*}}(i8* align 8 [[ORIGINS]], {{.*}}, i64 [[SIZE]]
3598fe99a0eSAlexander Potapenko; CHECK: call i32 @VAListFn
3608fe99a0eSAlexander Potapenko
3618fe99a0eSAlexander Potapenko; Function Attrs: nounwind uwtable
3628fe99a0eSAlexander Potapenkodefine dso_local void @VarArgCaller() local_unnamed_addr sanitize_memory {
3638fe99a0eSAlexander Potapenkoentry:
3648fe99a0eSAlexander Potapenko  %call = tail call i32 (i8*, ...) @VarArgFn(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 123)
3658fe99a0eSAlexander Potapenko  ret void
3668fe99a0eSAlexander Potapenko}
3678fe99a0eSAlexander Potapenko
3688fe99a0eSAlexander Potapenko; CHECK-LABEL: @VarArgCaller
3698fe99a0eSAlexander Potapenko
370c0e6b8acSJames Y Knight; CHECK: entry:
3718fe99a0eSAlexander Potapenko; CHECK: @__msan_get_context_state()
3728fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 0
3738fe99a0eSAlexander Potapenko; CHECK: [[VA_ARG_SHADOW:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 2
3748fe99a0eSAlexander Potapenko; CHECK: [[VA_ARG_OVERFLOW_SIZE:%[a-z0-9_]+]] = getelementptr {{.*}} i32 0, i32 4
3758fe99a0eSAlexander Potapenko
3768fe99a0eSAlexander Potapenko; CHECK: [[PARAM_SI:%[_a-z0-9]+]] = ptrtoint {{.*}} [[PARAM_SHADOW]]
3778fe99a0eSAlexander Potapenko; CHECK: [[ARG1_S:%[_a-z0-9]+]] = inttoptr i64 [[PARAM_SI]] to i64*
3788fe99a0eSAlexander Potapenko; First argument is initialized
3798fe99a0eSAlexander Potapenko; CHECK: store i64 0, i64* [[ARG1_S]]
3808fe99a0eSAlexander Potapenko
3818fe99a0eSAlexander Potapenko; Dangling cast of va_arg_shadow[0], unused because the first argument is fixed.
3828fe99a0eSAlexander Potapenko; CHECK: [[VA_CAST0:%[_a-z0-9]+]] = ptrtoint {{.*}} [[VA_ARG_SHADOW]] to i64
3838fe99a0eSAlexander Potapenko
3848fe99a0eSAlexander Potapenko; CHECK: [[VA_CAST1:%[_a-z0-9]+]] = ptrtoint {{.*}} [[VA_ARG_SHADOW]] to i64
3858fe99a0eSAlexander Potapenko; CHECK: [[ARG1_SI:%[_a-z0-9]+]] = add i64 [[VA_CAST1]], 8
3868fe99a0eSAlexander Potapenko; CHECK: [[PARG1_S:%[_a-z0-9]+]] = inttoptr i64 [[ARG1_SI]] to i32*
3878fe99a0eSAlexander Potapenko
3888fe99a0eSAlexander Potapenko; Shadow for 123 is 0.
3898fe99a0eSAlexander Potapenko; CHECK: store i32 0, i32* [[ARG1_S]]
3908fe99a0eSAlexander Potapenko
3918fe99a0eSAlexander Potapenko; CHECK: store i64 0, i64* [[VA_ARG_OVERFLOW_SIZE]]
3928fe99a0eSAlexander Potapenko; CHECK: call i32 (i8*, ...) @VarArgFn({{.*}} @.str{{.*}} i32 123)
393