394 lines · plain
1; RUN: opt -pass-remarks-output=%t.pass-remarks -mtriple=aarch64-unknown-linux-gnu -passes=hwasan -hwasan-instrument-with-calls -hwasan-use-stack-safety=1 -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=SAFETY,CHECK2; RUN: cat %t.pass-remarks | FileCheck %s --check-prefixes=SAFETY-REMARKS3; RUN: opt -mtriple=aarch64-unknown-linux-gnu -passes=hwasan -hwasan-instrument-with-calls -hwasan-use-stack-safety=0 -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=NOSAFETY,CHECK4; RUN: opt -mtriple=aarch64-unknown-linux-gnu -passes=hwasan -hwasan-instrument-with-calls -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=SAFETY,CHECK5; RUN: opt -mtriple=aarch64-unknown-linux-gnu -passes=hwasan -hwasan-instrument-stack=0 -hwasan-instrument-with-calls -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=NOSTACK,CHECK6 7; RUN: opt -mtriple=riscv64-unknown-linux -passes=hwasan -hwasan-instrument-with-calls -hwasan-use-stack-safety=1 -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=SAFETY,CHECK8; RUN: opt -mtriple=riscv64-unknown-linux -passes=hwasan -hwasan-instrument-with-calls -hwasan-use-stack-safety=0 -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=NOSAFETY,CHECK9; RUN: opt -mtriple=riscv64-unknown-linux -passes=hwasan -hwasan-instrument-with-calls -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=SAFETY,CHECK10; RUN: opt -mtriple=riscv64-unknown-linux -passes=hwasan -hwasan-instrument-stack=0 -hwasan-instrument-with-calls -hwasan-generate-tags-with-calls -S < %s | FileCheck %s --check-prefixes=NOSTACK,CHECK11 12target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"13 14; Check a safe alloca to ensure it does not get a tag.15define i32 @test_simple(ptr %a) sanitize_hwaddress {16entry:17 ; CHECK-LABEL: @test_simple18 ; NOSAFETY: call {{.*}}__hwasan_generate_tag19 ; NOSAFETY: call {{.*}}__hwasan_store20 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag21 ; SAFETY-NOT: call {{.*}}__hwasan_store22 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag23 ; NOSTACK-NOT: call {{.*}}__hwasan_store24 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_simple25 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_simple26 %buf.sroa.0 = alloca i8, align 427 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)28 store volatile i8 0, ptr %buf.sroa.0, align 4, !tbaa !829 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)30 ret i32 031}32 33; Check a safe alloca to ensure it does not get a tag.34define i32 @test_cmpxchg(ptr %a) sanitize_hwaddress {35entry:36 ; CHECK-LABEL: @test_cmpxchg37 ; NOSAFETY: call {{.*}}__hwasan_generate_tag38 ; NOSAFETY: call {{.*}}__hwasan_store39 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag40 ; SAFETY-NOT: call {{.*}}__hwasan_store41 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag42 ; NOSTACK-NOT: call {{.*}}__hwasan_store43 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_cmpxchg44 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_cmpxchg45 %buf.sroa.0 = alloca i8, align 446 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)47 %0 = cmpxchg ptr %buf.sroa.0, i8 1, i8 2 monotonic monotonic, align 448 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)49 ret i32 050}51 52; Check a safe alloca to ensure it does not get a tag.53define i32 @test_atomicrwm(ptr %a) sanitize_hwaddress {54entry:55 ; CHECK-LABEL: @test_atomicrwm56 ; NOSAFETY: call {{.*}}__hwasan_generate_tag57 ; NOSAFETY: call {{.*}}__hwasan_store58 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag59 ; SAFETY-NOT: call {{.*}}__hwasan_store60 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag61 ; NOSTACK-NOT: call {{.*}}__hwasan_store62 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_atomicrwm63 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_atomicrwm64 %buf.sroa.0 = alloca i8, align 465 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)66 %0 = atomicrmw add ptr %buf.sroa.0, i8 1 monotonic, align 467 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)68 ret i32 069}70 71; Check a non-safe alloca to ensure it gets a tag.72define i32 @test_use(ptr %a) sanitize_hwaddress {73entry:74 ; CHECK-LABEL: @test_use75 ; NOSAFETY: call {{.*}}__hwasan_generate_tag76 ; NOSAFETY: call {{.*}}__hwasan_store77 ; SAFETY: call {{.*}}__hwasan_generate_tag78 ; SAFETY-NOT: call {{.*}}__hwasan_store79 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag80 ; NOSTACK-NOT: call {{.*}}__hwasan_store81 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_use82 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_use83 %buf.sroa.0 = alloca i8, align 484 call void @use(ptr nonnull %buf.sroa.0)85 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)86 store volatile i8 0, ptr %buf.sroa.0, align 4, !tbaa !887 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)88 ret i32 089}90 91; Check an alloca with in range GEP to ensure it does not get a tag or check.92define i32 @test_in_range(ptr %a) sanitize_hwaddress {93entry:94 ; CHECK-LABEL: @test_in_range95 ; NOSAFETY: call {{.*}}__hwasan_generate_tag96 ; NOSAFETY: call {{.*}}__hwasan_store97 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag98 ; SAFETY-NOT: call {{.*}}__hwasan_store99 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag100 ; NOSTACK-NOT: call {{.*}}__hwasan_store101 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_in_range102 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range103 %buf.sroa.0 = alloca [10 x i8], align 4104 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)105 store volatile i8 0, ptr %buf.sroa.0, align 4, !tbaa !8106 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)107 ret i32 0108}109 110; Check an alloca with in range GEP to ensure it does not get a tag or check.111define i32 @test_in_range2(ptr %a) sanitize_hwaddress {112entry:113 ; CHECK-LABEL: @test_in_range2114 ; NOSAFETY: call {{.*}}__hwasan_generate_tag115 ; NOSAFETY: call {{.*}}__hwasan_store116 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag117 ; SAFETY-NOT: call {{.*}}__hwasan_store118 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag119 ; NOSTACK-NOT: call {{.*}}__hwasan_store120 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_in_range2121 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range2122 %buf.sroa.0 = alloca [10 x i8], align 4123 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9124 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)125 store volatile i8 0, ptr %ptr, align 4, !tbaa !8126 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)127 ret i32 0128}129 130define i32 @test_in_range3(ptr %a) sanitize_hwaddress {131entry:132 ; CHECK-LABEL: @test_in_range3133 ; NOSAFETY: call {{.*}}__hwasan_generate_tag134 ; NOSAFETY: call {{.*}}__hwasan_memset135 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag136 ; SAFETY-NOT: call {{.*}}__hwasan_memset137 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag138 ; NOSTACK-NOT: call {{.*}}__hwasan_memset139 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_in_range3140 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range3141 %buf.sroa.0 = alloca [10 x i8], align 4142 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9143 call void @llvm.memset.p0.i32(ptr %ptr, i8 0, i32 1, i1 true)144 ret i32 0145}146 147define i32 @test_in_range4(ptr %a) sanitize_hwaddress {148entry:149 ; CHECK-LABEL: @test_in_range4150 ; NOSAFETY: call {{.*}}__hwasan_generate_tag151 ; NOSAFETY: call {{.*}}__hwasan_memmove152 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag153 ; SAFETY-NOT: call {{.*}}__hwasan_memmove154 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag155 ; NOSTACK-NOT: call {{.*}}__hwasan_memmove156 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_in_range4157 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range4158 %buf.sroa.0 = alloca [10 x i8], align 4159 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9160 call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %ptr, i32 1, i1 true)161 ret i32 0162}163 164define i32 @test_in_range5(ptr %a) sanitize_hwaddress {165entry:166 ; CHECK-LABEL: @test_in_range5167 ; NOSAFETY: call {{.*}}__hwasan_generate_tag168 ; NOSAFETY: call {{.*}}__hwasan_memmove169 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag170 ; SAFETY-NOT: call {{.*}}__hwasan_memmove171 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag172 ; NOSTACK-NOT: call {{.*}}__hwasan_memmove173 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_in_range5174 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range5175 %buf.sroa.0 = alloca [10 x i8], align 4176 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9177 %buf.sroa.1 = alloca [10 x i8], align 4178 %ptr1 = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9179 call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %ptr1, i32 1, i1 true)180 ret i32 0181}182 183; Check an alloca with out of range GEP to ensure it gets a tag and check.184define i32 @test_out_of_range(ptr %a) sanitize_hwaddress {185entry:186 ; CHECK-LABEL: @test_out_of_range187 ; NOSAFETY: call {{.*}}__hwasan_generate_tag188 ; NOSAFETY: call {{.*}}__hwasan_store189 ; SAFETY: call {{.*}}__hwasan_generate_tag190 ; SAFETY: call {{.*}}__hwasan_store191 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag192 ; NOSTACK-NOT: call {{.*}}__hwasan_store193 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_out_of_range194 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range195 %buf.sroa.0 = alloca [10 x i8], align 4196 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 10197 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)198 store volatile i8 0, ptr %ptr, align 4, !tbaa !8199 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)200 ret i32 0201}202 203define i32 @test_out_of_range2(ptr %a) sanitize_hwaddress {204entry:205 ; CHECK-LABEL: @test_out_of_range2206 ; NOSAFETY: call {{.*}}__hwasan_generate_tag207 ; NOSAFETY: call {{.*}}__hwasan_store208 ; SAFETY: call {{.*}}__hwasan_generate_tag209 ; SAFETY: call {{.*}}__hwasan_store210 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag211 ; NOSTACK-NOT: call {{.*}}__hwasan_store212 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_out_of_range2213 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range2214 %buf.sroa.0 = alloca [10 x i8], align 4215 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 10216 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)217 %0 = cmpxchg ptr %ptr, i8 1, i8 2 monotonic monotonic, align 4218 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)219 ret i32 0220}221 222define i32 @test_out_of_range3(ptr %a) sanitize_hwaddress {223entry:224 ; CHECK-LABEL: @test_out_of_range3225 ; NOSAFETY: call {{.*}}__hwasan_generate_tag226 ; NOSAFETY: call {{.*}}__hwasan_memset227 ; SAFETY: call {{.*}}__hwasan_generate_tag228 ; SAFETY: call {{.*}}__hwasan_memset229 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag230 ; NOSTACK-NOT: call {{.*}}__hwasan_memset231 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_out_of_range3232 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range3233 %buf.sroa.0 = alloca [10 x i8], align 4234 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9235 call void @llvm.memset.p0.i32(ptr %ptr, i8 0, i32 2, i1 true)236 ret i32 0237}238 239define i32 @test_out_of_range4(ptr %a) sanitize_hwaddress {240entry:241 ; CHECK-LABEL: @test_out_of_range4242 ; NOSAFETY: call {{.*}}__hwasan_generate_tag243 ; NOSAFETY: call {{.*}}__hwasan_memmove244 ; SAFETY: call {{.*}}__hwasan_generate_tag245 ; SAFETY: call {{.*}}__hwasan_memmove246 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag247 ; NOSTACK-NOT: call {{.*}}__hwasan_memmove248 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_out_of_range4249 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range4250 %buf.sroa.0 = alloca [10 x i8], align 4251 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9252 call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %ptr, i32 2, i1 true)253 ret i32 0254}255 256define i32 @test_out_of_range5(ptr %a) sanitize_hwaddress {257entry:258 ; CHECK-LABEL: @test_out_of_range5259 ; NOSAFETY: call {{.*}}__hwasan_generate_tag260 ; NOSAFETY: call {{.*}}__hwasan_memmove261 ; SAFETY: call {{.*}}__hwasan_generate_tag262 ; SAFETY: call {{.*}}__hwasan_memmove263 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag264 ; NOSTACK-NOT: call {{.*}}__hwasan_memmove265 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_out_of_range5266 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range5267 %buf.sroa.0 = alloca [10 x i8], align 4268 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9269 %buf.sroa.1 = alloca [10 x i8], align 4270 %ptr1 = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9271 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)272 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)273 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.1)274 call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %ptr1, i32 1, i1 true)275 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.1)276 ret i32 0277}278 279define i32 @test_out_of_range6(ptr %a) sanitize_hwaddress {280entry:281 ; CHECK-LABEL: @test_out_of_range6282 ; NOSAFETY: call {{.*}}__hwasan_generate_tag283 ; NOSAFETY: call {{.*}}__hwasan_store284 ; SAFETY: call {{.*}}__hwasan_generate_tag285 ; SAFETY: call {{.*}}__hwasan_store286 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag287 ; NOSTACK-NOT: call {{.*}}__hwasan_store288 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_out_of_range6289 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range6290 %buf.sroa.0 = alloca [10 x i8], align 4291 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 10292 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)293 %0 = atomicrmw add ptr %ptr, i32 1 monotonic, align 4294 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)295 ret i32 0296}297 298define i32 @test_potentially_out_of_range2(ptr %a) sanitize_hwaddress {299entry:300 ; CHECK-LABEL: @test_potentially_out_of_range2301 ; NOSAFETY: call {{.*}}__hwasan_generate_tag302 ; NOSAFETY: call {{.*}}__hwasan_memmove303 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag304 ; SAFETY: call {{.*}}__hwasan_memmove305 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag306 ; NOSTACK: call {{.*}}__hwasan_memmove307 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_potentially_out_of_range2308 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_potentially_out_of_range2309 %buf.sroa.0 = alloca [10 x i8], align 4310 %ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9311 call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %a, i32 1, i1 true)312 ret i32 0313}314 315define i32 @test_select(ptr %a) sanitize_hwaddress {316entry:317 ; CHECK-LABEL: @test_select318 ; NOSAFETY: call {{.*}}__hwasan_generate_tag319 ; NOSAFETY: call {{.*}}__hwasan_store320 ; SAFETY: call {{.*}}__hwasan_generate_tag321 ; SAFETY: call {{.*}}__hwasan_store322 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag323 ; NOSTACK: call {{.*}}__hwasan_store324 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_select325 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_select326 %x = call ptr @getptr(ptr %a)327 %buf.sroa.0 = alloca i8, align 4328 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)329 %c = call i1 @cond()330 %ptr = select i1 %c, ptr %x, ptr %buf.sroa.0331 store volatile i8 0, ptr %ptr, align 4, !tbaa !8332 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)333 ret i32 0334}335 336; Check whether we see through the returns attribute of functions.337define i32 @test_retptr(ptr %a) sanitize_hwaddress {338entry:339 ; CHECK-LABEL: @test_retptr340 ; NOSAFETY: call {{.*}}__hwasan_generate_tag341 ; NOSAFETY: call {{.*}}__hwasan_store342 ; SAFETY: call {{.*}}__hwasan_generate_tag343 ; SAFETY-NOT: call {{.*}}__hwasan_store344 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag345 ; NOSTACK-NOT: call {{.*}}__hwasan_store346 ; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_retptr347 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_retptr348 %buf.sroa.0 = alloca i8, align 4349 call void @llvm.lifetime.start.p0(ptr nonnull %buf.sroa.0)350 %ptr = call ptr @retptr(ptr %buf.sroa.0)351 store volatile i8 0, ptr %ptr, align 4, !tbaa !8352 call void @llvm.lifetime.end.p0(ptr nonnull %buf.sroa.0)353 ret i32 0354}355 356; Check that lifetimes on poison are ignored.357define i32 @test_lifetime_poison(ptr %a) sanitize_hwaddress {358entry:359 ; CHECK-LABEL: @test_lifetime_poison360 ; NOSAFETY: call {{.*}}__hwasan_generate_tag361 ; NOSAFETY: call {{.*}}__hwasan_store362 ; SAFETY-NOT: call {{.*}}__hwasan_generate_tag363 ; SAFETY-NOT: call {{.*}}__hwasan_store364 ; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag365 ; NOSTACK-NOT: call {{.*}}__hwasan_store366 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: safeAlloca{{[[:space:]]}}Function: test_lifetime_poison367 ; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_lifetime_poison368 %buf.sroa.0 = alloca i8, align 4369 call void @llvm.lifetime.start.p0(ptr poison)370 store volatile i8 0, ptr %buf.sroa.0, align 4, !tbaa !8371 call void @llvm.lifetime.end.p0(ptr poison)372 ret i32 0373}374 375; Function Attrs: argmemonly mustprogress nofree nosync nounwind willreturn376declare void @llvm.lifetime.start.p0(ptr nocapture)377 378; Function Attrs: argmemonly mustprogress nofree nosync nounwind willreturn379declare void @llvm.lifetime.end.p0(ptr nocapture)380 381declare void @llvm.memset.p0.i32(ptr, i8, i32, i1)382declare void @llvm.memcpy.p0.p0.i32(ptr, ptr, i32, i1)383declare void @llvm.memmove.p0.p0.i32(ptr, ptr, i32, i1)384 385declare i1 @cond()386declare void @use(ptr nocapture)387declare i32 @getoffset()388declare ptr @getptr(ptr nocapture)389declare ptr @retptr(ptr returned)390 391!8 = !{!9, !9, i64 0}392!9 = !{!"omnipotent char", !10, i64 0}393!10 = !{!"Simple C/C++ TBAA"}394