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