brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · bed65cc Raw
222 lines · plain
1; RUN: opt < %s -msan-check-access-address=0 -S -passes=msan 2>&1 | FileCheck %s --check-prefixes=CHECK,NOORIGINS --implicit-check-not="call void @__msan_warning"2; RUN: opt < %s -msan-check-access-address=0 -msan-track-origins=1 -S -passes=msan 2>&1 | FileCheck %s --check-prefixes=CHECK,ORIGINS --implicit-check-not="call void @__msan_warning"3; RUN: opt < %s -msan-check-access-address=0 -msan-track-origins=2 -S -passes=msan 2>&1 | FileCheck %s --check-prefixes=CHECK,ORIGINS --implicit-check-not="call void @__msan_warning"4; RUN: opt < %s -msan-check-access-address=0 -msan-track-origins=1 -S -passes=msan -mtriple=s390x-unknown-linux 2>&1 | FileCheck %s --check-prefix=EXT5; REQUIRES: x86-registered-target, systemz-registered-target6 7target 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"8target triple = "x86_64-unknown-linux-gnu"9 10; atomicrmw xchg: store clean shadow, return clean shadow11 12define i32 @AtomicRmwXchg(ptr %p, i32 %x) sanitize_memory {13entry:14  %0 = atomicrmw xchg ptr %p, i32 %x seq_cst15  ret i32 %016}17 18; CHECK-LABEL: @AtomicRmwXchg19; CHECK: store i32 0,20; CHECK: atomicrmw xchg {{.*}} seq_cst21; CHECK: store i32 0, {{.*}} @__msan_retval_tls22; CHECK: ret i3223 24; atomicrmw xchg ptr: exactly the same as above25 26define ptr @AtomicRmwXchgPtr(ptr %p, ptr %x) sanitize_memory {27entry:28  %0 = atomicrmw xchg ptr %p, ptr %x seq_cst29  ret ptr %030}31 32; CHECK-LABEL: @AtomicRmwXchgPtr33; CHECK: store i64 0,34; CHECK: atomicrmw xchg {{.*}} seq_cst35; CHECK: store i64 0, {{.*}} @__msan_retval_tls36; CHECK: ret ptr37 38 39; atomicrmw max: exactly the same as above40 41define i32 @AtomicRmwMax(ptr %p, i32 %x) sanitize_memory {42entry:43  %0 = atomicrmw max ptr %p, i32 %x seq_cst44  ret i32 %045}46 47; CHECK-LABEL: @AtomicRmwMax48; CHECK: store i32 0,49; CHECK: atomicrmw max {{.*}} seq_cst50; CHECK: store i32 0, {{.*}} @__msan_retval_tls51; CHECK: ret i3252 53 54; cmpxchg: the same as above, but also check %a shadow55 56define i32 @Cmpxchg(ptr %p, i32 %a, i32 %b) sanitize_memory {57entry:58  %pair = cmpxchg ptr %p, i32 %a, i32 %b seq_cst seq_cst59  %0 = extractvalue { i32, i1 } %pair, 060  ret i32 %061}62 63; CHECK-LABEL: @Cmpxchg64; CHECK: store i32 0,65; CHECK: icmp66; CHECK: br67; NOORIGINS: @__msan_warning_noreturn()68; ORIGINS: @__msan_warning_with_origin_noreturn(69; CHECK: cmpxchg {{.*}} seq_cst seq_cst70; CHECK: store i32 0, {{.*}} @__msan_retval_tls71; CHECK: ret i3272 73 74; relaxed cmpxchg: bump up to "release monotonic"75 76define i32 @CmpxchgMonotonic(ptr %p, i32 %a, i32 %b) sanitize_memory {77entry:78  %pair = cmpxchg ptr %p, i32 %a, i32 %b monotonic monotonic79  %0 = extractvalue { i32, i1 } %pair, 080  ret i32 %081}82 83; CHECK-LABEL: @CmpxchgMonotonic84; CHECK: store i32 0,85; CHECK: icmp86; CHECK: br87; NOORIGINS: @__msan_warning_noreturn()88; ORIGINS: @__msan_warning_with_origin_noreturn(89; CHECK: cmpxchg {{.*}} release monotonic90; CHECK: store i32 0, {{.*}} @__msan_retval_tls91; CHECK: ret i3292 93 94; atomic load: preserve alignment, load shadow value after app value95 96define i32 @AtomicLoad(ptr %p) sanitize_memory {97entry:98  %0 = load atomic i32, ptr %p seq_cst, align 1699  ret i32 %0100}101 102; CHECK-LABEL: @AtomicLoad103; CHECK: load atomic i32, ptr {{.*}} seq_cst, align 16104; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, ptr {{.*}}, align 16105; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls106; CHECK: ret i32107 108 109; atomic load: preserve alignment, load shadow value after app value110 111define i32 @AtomicLoadAcquire(ptr %p) sanitize_memory {112entry:113  %0 = load atomic i32, ptr %p acquire, align 16114  ret i32 %0115}116 117; CHECK-LABEL: @AtomicLoadAcquire118; CHECK: load atomic i32, ptr {{.*}} acquire, align 16119; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, ptr {{.*}}, align 16120; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls121; CHECK: ret i32122 123 124; atomic load monotonic: bump up to load acquire125 126define i32 @AtomicLoadMonotonic(ptr %p) sanitize_memory {127entry:128  %0 = load atomic i32, ptr %p monotonic, align 16129  ret i32 %0130}131 132; CHECK-LABEL: @AtomicLoadMonotonic133; CHECK: load atomic i32, ptr {{.*}} acquire, align 16134; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, ptr {{.*}}, align 16135; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls136; CHECK: ret i32137 138 139; atomic load unordered: bump up to load acquire140 141define i32 @AtomicLoadUnordered(ptr %p) sanitize_memory {142entry:143  %0 = load atomic i32, ptr %p unordered, align 16144  ret i32 %0145}146 147; CHECK-LABEL: @AtomicLoadUnordered148; CHECK: load atomic i32, ptr {{.*}} acquire, align 16149; CHECK: [[SHADOW:%[01-9a-z_]+]] = load i32, ptr {{.*}}, align 16150; CHECK: store i32 {{.*}}[[SHADOW]], {{.*}} @__msan_retval_tls151; CHECK: ret i32152 153 154; atomic store: preserve alignment, store clean shadow value before app value155 156define void @AtomicStore(ptr %p, i32 %x) sanitize_memory {157entry:158  store atomic i32 %x, ptr %p seq_cst, align 16159  ret void160}161 162; CHECK-LABEL: @AtomicStore163; CHECK-NOT: @__msan_param_tls164; CHECK: store i32 0, ptr {{.*}}, align 16165; CHECK: store atomic i32 %x, ptr %p seq_cst, align 16166; CHECK: ret void167 168 169; atomic store: preserve alignment, store clean shadow value before app value170 171define void @AtomicStoreRelease(ptr %p, i32 %x) sanitize_memory {172entry:173  store atomic i32 %x, ptr %p release, align 16174  ret void175}176 177; CHECK-LABEL: @AtomicStoreRelease178; CHECK-NOT: @__msan_param_tls179; CHECK: store i32 0, ptr {{.*}}, align 16180; CHECK: store atomic i32 %x, ptr %p release, align 16181; CHECK: ret void182 183 184; atomic store monotonic: bumped up to store release185 186define void @AtomicStoreMonotonic(ptr %p, i32 %x) sanitize_memory {187entry:188  store atomic i32 %x, ptr %p monotonic, align 16189  ret void190}191 192; CHECK-LABEL: @AtomicStoreMonotonic193; CHECK-NOT: @__msan_param_tls194; CHECK: store i32 0, ptr {{.*}}, align 16195; CHECK: store atomic i32 %x, ptr %p release, align 16196; CHECK: ret void197 198 199; atomic store unordered: bumped up to store release200 201define void @AtomicStoreUnordered(ptr %p, i32 %x) sanitize_memory {202entry:203  store atomic i32 %x, ptr %p unordered, align 16204  ret void205}206 207; CHECK-LABEL: @AtomicStoreUnordered208; CHECK-NOT: @__msan_param_tls209; CHECK: store i32 0, ptr {{.*}}, align 16210; CHECK: store atomic i32 %x, ptr %p release, align 16211; CHECK: ret void212 213 214; ORIGINS: declare i32 @__msan_chain_origin(i32)215; EXT:     declare zeroext i32 @__msan_chain_origin(i32 zeroext)216; ORIGINS: declare void @__msan_set_origin(ptr, i64, i32)217; EXT:     declare void @__msan_set_origin(ptr, i64, i32 zeroext)218; ORIGINS: declare ptr @__msan_memset(ptr, i32, i64)219; EXT:     declare ptr @__msan_memset(ptr, i32 signext, i64)220; ORIGINS: declare void @__msan_warning_with_origin_noreturn(i32)221; EXT:     declare void @__msan_warning_with_origin_noreturn(i32 zeroext)222