Skip to content

Commit 088b98a

Browse files
authored
[HWASan] add optimization remarks for ignoreAccess (#94551)
1 parent 7eab680 commit 088b98a

File tree

2 files changed

+62
-17
lines changed

2 files changed

+62
-17
lines changed

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -337,13 +337,17 @@ class HWAddressSanitizer {
337337
unsigned AccessSizeIndex,
338338
Instruction *InsertBefore, DomTreeUpdater &DTU,
339339
LoopInfo *LI);
340-
bool ignoreMemIntrinsic(MemIntrinsic *MI);
340+
bool ignoreMemIntrinsic(OptimizationRemarkEmitter &ORE, MemIntrinsic *MI);
341341
void instrumentMemIntrinsic(MemIntrinsic *MI);
342342
bool instrumentMemAccess(InterestingMemoryOperand &O, DomTreeUpdater &DTU,
343343
LoopInfo *LI);
344-
bool ignoreAccess(Instruction *Inst, Value *Ptr);
344+
bool ignoreAccessWithoutRemark(Instruction *Inst, Value *Ptr);
345+
bool ignoreAccess(OptimizationRemarkEmitter &ORE, Instruction *Inst,
346+
Value *Ptr);
347+
345348
void getInterestingMemoryOperands(
346-
Instruction *I, const TargetLibraryInfo &TLI,
349+
OptimizationRemarkEmitter &ORE, Instruction *I,
350+
const TargetLibraryInfo &TLI,
347351
SmallVectorImpl<InterestingMemoryOperand> &Interesting);
348352

349353
void tagAlloca(IRBuilder<> &IRB, AllocaInst *AI, Value *Tag, size_t Size);
@@ -765,7 +769,8 @@ Value *HWAddressSanitizer::getShadowNonTls(IRBuilder<> &IRB) {
765769
return IRB.CreateLoad(PtrTy, GlobalDynamicAddress);
766770
}
767771

768-
bool HWAddressSanitizer::ignoreAccess(Instruction *Inst, Value *Ptr) {
772+
bool HWAddressSanitizer::ignoreAccessWithoutRemark(Instruction *Inst,
773+
Value *Ptr) {
769774
// Do not instrument accesses from different address spaces; we cannot deal
770775
// with them.
771776
Type *PtrTy = cast<PointerType>(Ptr->getType()->getScalarType());
@@ -795,8 +800,23 @@ bool HWAddressSanitizer::ignoreAccess(Instruction *Inst, Value *Ptr) {
795800
return false;
796801
}
797802

803+
bool HWAddressSanitizer::ignoreAccess(OptimizationRemarkEmitter &ORE,
804+
Instruction *Inst, Value *Ptr) {
805+
bool Ignored = ignoreAccessWithoutRemark(Inst, Ptr);
806+
if (Ignored) {
807+
ORE.emit(
808+
[&]() { return OptimizationRemark(DEBUG_TYPE, "ignoreAccess", Inst); });
809+
} else {
810+
ORE.emit([&]() {
811+
return OptimizationRemarkMissed(DEBUG_TYPE, "ignoreAccess", Inst);
812+
});
813+
}
814+
return Ignored;
815+
}
816+
798817
void HWAddressSanitizer::getInterestingMemoryOperands(
799-
Instruction *I, const TargetLibraryInfo &TLI,
818+
OptimizationRemarkEmitter &ORE, Instruction *I,
819+
const TargetLibraryInfo &TLI,
800820
SmallVectorImpl<InterestingMemoryOperand> &Interesting) {
801821
// Skip memory accesses inserted by another instrumentation.
802822
if (I->hasMetadata(LLVMContext::MD_nosanitize))
@@ -807,30 +827,30 @@ void HWAddressSanitizer::getInterestingMemoryOperands(
807827
return;
808828

809829
if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
810-
if (!ClInstrumentReads || ignoreAccess(I, LI->getPointerOperand()))
830+
if (!ClInstrumentReads || ignoreAccess(ORE, I, LI->getPointerOperand()))
811831
return;
812832
Interesting.emplace_back(I, LI->getPointerOperandIndex(), false,
813833
LI->getType(), LI->getAlign());
814834
} else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
815-
if (!ClInstrumentWrites || ignoreAccess(I, SI->getPointerOperand()))
835+
if (!ClInstrumentWrites || ignoreAccess(ORE, I, SI->getPointerOperand()))
816836
return;
817837
Interesting.emplace_back(I, SI->getPointerOperandIndex(), true,
818838
SI->getValueOperand()->getType(), SI->getAlign());
819839
} else if (AtomicRMWInst *RMW = dyn_cast<AtomicRMWInst>(I)) {
820-
if (!ClInstrumentAtomics || ignoreAccess(I, RMW->getPointerOperand()))
840+
if (!ClInstrumentAtomics || ignoreAccess(ORE, I, RMW->getPointerOperand()))
821841
return;
822842
Interesting.emplace_back(I, RMW->getPointerOperandIndex(), true,
823843
RMW->getValOperand()->getType(), std::nullopt);
824844
} else if (AtomicCmpXchgInst *XCHG = dyn_cast<AtomicCmpXchgInst>(I)) {
825-
if (!ClInstrumentAtomics || ignoreAccess(I, XCHG->getPointerOperand()))
845+
if (!ClInstrumentAtomics || ignoreAccess(ORE, I, XCHG->getPointerOperand()))
826846
return;
827847
Interesting.emplace_back(I, XCHG->getPointerOperandIndex(), true,
828848
XCHG->getCompareOperand()->getType(),
829849
std::nullopt);
830850
} else if (auto *CI = dyn_cast<CallInst>(I)) {
831851
for (unsigned ArgNo = 0; ArgNo < CI->arg_size(); ArgNo++) {
832852
if (!ClInstrumentByval || !CI->isByValArgument(ArgNo) ||
833-
ignoreAccess(I, CI->getArgOperand(ArgNo)))
853+
ignoreAccess(ORE, I, CI->getArgOperand(ArgNo)))
834854
continue;
835855
Type *Ty = CI->getParamByValType(ArgNo);
836856
Interesting.emplace_back(I, ArgNo, false, Ty, Align(1));
@@ -1035,13 +1055,14 @@ void HWAddressSanitizer::instrumentMemAccessInline(Value *Ptr, bool IsWrite,
10351055
->setSuccessor(0, TCI.TagMismatchTerm->getParent());
10361056
}
10371057

1038-
bool HWAddressSanitizer::ignoreMemIntrinsic(MemIntrinsic *MI) {
1058+
bool HWAddressSanitizer::ignoreMemIntrinsic(OptimizationRemarkEmitter &ORE,
1059+
MemIntrinsic *MI) {
10391060
if (MemTransferInst *MTI = dyn_cast<MemTransferInst>(MI)) {
1040-
return (!ClInstrumentWrites || ignoreAccess(MTI, MTI->getDest())) &&
1041-
(!ClInstrumentReads || ignoreAccess(MTI, MTI->getSource()));
1061+
return (!ClInstrumentWrites || ignoreAccess(ORE, MTI, MTI->getDest())) &&
1062+
(!ClInstrumentReads || ignoreAccess(ORE, MTI, MTI->getSource()));
10421063
}
10431064
if (isa<MemSetInst>(MI))
1044-
return !ClInstrumentWrites || ignoreAccess(MI, MI->getDest());
1065+
return !ClInstrumentWrites || ignoreAccess(ORE, MI, MI->getDest());
10451066
return false;
10461067
}
10471068

@@ -1541,6 +1562,9 @@ void HWAddressSanitizer::sanitizeFunction(Function &F,
15411562

15421563
NumTotalFuncs++;
15431564

1565+
OptimizationRemarkEmitter &ORE =
1566+
FAM.getResult<OptimizationRemarkEmitterAnalysis>(F);
1567+
15441568
if (selectiveInstrumentationShouldSkip(F, FAM))
15451569
return;
15461570

@@ -1562,10 +1586,10 @@ void HWAddressSanitizer::sanitizeFunction(Function &F,
15621586
if (InstrumentLandingPads && isa<LandingPadInst>(Inst))
15631587
LandingPadVec.push_back(&Inst);
15641588

1565-
getInterestingMemoryOperands(&Inst, TLI, OperandsToInstrument);
1589+
getInterestingMemoryOperands(ORE, &Inst, TLI, OperandsToInstrument);
15661590

15671591
if (MemIntrinsic *MI = dyn_cast<MemIntrinsic>(&Inst))
1568-
if (!ignoreMemIntrinsic(MI))
1592+
if (!ignoreMemIntrinsic(ORE, MI))
15691593
IntrinToInstrument.push_back(MI);
15701594
}
15711595

llvm/test/Instrumentation/HWAddressSanitizer/stack-safety-analysis.ll

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
; RUN: opt -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,CHECK
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,CHECK
2+
; RUN: cat %t.pass-remarks | FileCheck %s --check-prefixes=SAFETY-REMARKS
23
; 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,CHECK
34
; 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,CHECK
45
; 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,CHECK
@@ -20,6 +21,7 @@ entry:
2021
; SAFETY-NOT: call {{.*}}__hwasan_store
2122
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
2223
; NOSTACK-NOT: call {{.*}}__hwasan_store
24+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_simple
2325
%buf.sroa.0 = alloca i8, align 4
2426
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %buf.sroa.0)
2527
store volatile i8 0, ptr %buf.sroa.0, align 4, !tbaa !8
@@ -37,6 +39,7 @@ entry:
3739
; SAFETY-NOT: call {{.*}}__hwasan_store
3840
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
3941
; NOSTACK-NOT: call {{.*}}__hwasan_store
42+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_cmpxchg
4043
%buf.sroa.0 = alloca i8, align 4
4144
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %buf.sroa.0)
4245
%0 = cmpxchg ptr %buf.sroa.0, i8 1, i8 2 monotonic monotonic, align 4
@@ -54,6 +57,7 @@ entry:
5457
; SAFETY-NOT: call {{.*}}__hwasan_store
5558
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
5659
; NOSTACK-NOT: call {{.*}}__hwasan_store
60+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_atomicrwm
5761
%buf.sroa.0 = alloca i8, align 4
5862
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %buf.sroa.0)
5963
%0 = atomicrmw add ptr %buf.sroa.0, i8 1 monotonic, align 4
@@ -71,6 +75,7 @@ entry:
7175
; SAFETY-NOT: call {{.*}}__hwasan_store
7276
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
7377
; NOSTACK-NOT: call {{.*}}__hwasan_store
78+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_use
7479
%buf.sroa.0 = alloca i8, align 4
7580
call void @use(ptr nonnull %buf.sroa.0)
7681
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %buf.sroa.0)
@@ -89,6 +94,7 @@ entry:
8994
; SAFETY-NOT: call {{.*}}__hwasan_store
9095
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
9196
; NOSTACK-NOT: call {{.*}}__hwasan_store
97+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range
9298
%buf.sroa.0 = alloca [10 x i8], align 4
9399
call void @llvm.lifetime.start.p0(i64 10, ptr nonnull %buf.sroa.0)
94100
store volatile i8 0, ptr %buf.sroa.0, align 4, !tbaa !8
@@ -106,6 +112,7 @@ entry:
106112
; SAFETY-NOT: call {{.*}}__hwasan_store
107113
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
108114
; NOSTACK-NOT: call {{.*}}__hwasan_store
115+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range2
109116
%buf.sroa.0 = alloca [10 x i8], align 4
110117
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
111118
call void @llvm.lifetime.start.p0(i64 10, ptr nonnull %buf.sroa.0)
@@ -123,6 +130,7 @@ entry:
123130
; SAFETY-NOT: call {{.*}}__hwasan_memset
124131
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
125132
; NOSTACK-NOT: call {{.*}}__hwasan_memset
133+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range3
126134
%buf.sroa.0 = alloca [10 x i8], align 4
127135
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
128136
call void @llvm.memset.p0.i32(ptr %ptr, i8 0, i32 1, i1 true)
@@ -138,6 +146,7 @@ entry:
138146
; SAFETY-NOT: call {{.*}}__hwasan_memmove
139147
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
140148
; NOSTACK-NOT: call {{.*}}__hwasan_memmove
149+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range4
141150
%buf.sroa.0 = alloca [10 x i8], align 4
142151
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
143152
call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %ptr, i32 1, i1 true)
@@ -153,6 +162,7 @@ entry:
153162
; SAFETY-NOT: call {{.*}}__hwasan_memmove
154163
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
155164
; NOSTACK-NOT: call {{.*}}__hwasan_memmove
165+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_in_range5
156166
%buf.sroa.0 = alloca [10 x i8], align 4
157167
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
158168
%buf.sroa.1 = alloca [10 x i8], align 4
@@ -171,6 +181,7 @@ entry:
171181
; SAFETY: call {{.*}}__hwasan_store
172182
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
173183
; NOSTACK-NOT: call {{.*}}__hwasan_store
184+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range
174185
%buf.sroa.0 = alloca [10 x i8], align 4
175186
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 10
176187
call void @llvm.lifetime.start.p0(i64 10, ptr nonnull %buf.sroa.0)
@@ -188,6 +199,7 @@ entry:
188199
; SAFETY: call {{.*}}__hwasan_store
189200
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
190201
; NOSTACK-NOT: call {{.*}}__hwasan_store
202+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range2
191203
%buf.sroa.0 = alloca [10 x i8], align 4
192204
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 10
193205
call void @llvm.lifetime.start.p0(i64 10, ptr nonnull %buf.sroa.0)
@@ -205,6 +217,7 @@ entry:
205217
; SAFETY: call {{.*}}__hwasan_memset
206218
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
207219
; NOSTACK-NOT: call {{.*}}__hwasan_memset
220+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range3
208221
%buf.sroa.0 = alloca [10 x i8], align 4
209222
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
210223
call void @llvm.memset.p0.i32(ptr %ptr, i8 0, i32 2, i1 true)
@@ -220,6 +233,7 @@ entry:
220233
; SAFETY: call {{.*}}__hwasan_memmove
221234
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
222235
; NOSTACK-NOT: call {{.*}}__hwasan_memmove
236+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range4
223237
%buf.sroa.0 = alloca [10 x i8], align 4
224238
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
225239
call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %ptr, i32 2, i1 true)
@@ -235,6 +249,7 @@ entry:
235249
; SAFETY: call {{.*}}__hwasan_memmove
236250
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
237251
; NOSTACK-NOT: call {{.*}}__hwasan_memmove
252+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range5
238253
%buf.sroa.0 = alloca [10 x i8], align 4
239254
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
240255
%buf.sroa.1 = alloca [10 x i8], align 4
@@ -256,6 +271,7 @@ entry:
256271
; SAFETY: call {{.*}}__hwasan_store
257272
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
258273
; NOSTACK-NOT: call {{.*}}__hwasan_store
274+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_out_of_range6
259275
%buf.sroa.0 = alloca [10 x i8], align 4
260276
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 10
261277
call void @llvm.lifetime.start.p0(i64 10, ptr nonnull %buf.sroa.0)
@@ -275,6 +291,7 @@ entry:
275291
; SAFETY: call {{.*}}__hwasan_store
276292
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
277293
; NOSTACK-NOT: call {{.*}}__hwasan_store
294+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_potentially_out_of_range
278295
%buf.sroa.0 = alloca [10 x i8], align 4
279296
%off = call i32 @getoffset()
280297
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 %off
@@ -293,6 +310,7 @@ entry:
293310
; SAFETY: call {{.*}}__hwasan_memmove
294311
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
295312
; NOSTACK: call {{.*}}__hwasan_memmove
313+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_potentially_out_of_range2
296314
%buf.sroa.0 = alloca [10 x i8], align 4
297315
%ptr = getelementptr [10 x i8], ptr %buf.sroa.0, i32 0, i32 9
298316
call void @llvm.memmove.p0.p0.i32(ptr %ptr, ptr %a, i32 1, i1 true)
@@ -309,6 +327,7 @@ entry:
309327
; SAFETY: call {{.*}}__hwasan_store
310328
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
311329
; NOSTACK: call {{.*}}__hwasan_store
330+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_unclear
312331
%buf.sroa.0 = alloca i8, align 4
313332
%ptr = call ptr @getptr(ptr %buf.sroa.0)
314333
call void @llvm.lifetime.start.p0(i64 10, ptr nonnull %ptr)
@@ -326,6 +345,7 @@ entry:
326345
; SAFETY: call {{.*}}__hwasan_store
327346
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
328347
; NOSTACK: call {{.*}}__hwasan_store
348+
; SAFETY-REMARKS: --- !Missed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_select
329349
%x = call ptr @getptr(ptr %a)
330350
%buf.sroa.0 = alloca i8, align 4
331351
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %buf.sroa.0)
@@ -346,6 +366,7 @@ entry:
346366
; SAFETY-NOT: call {{.*}}__hwasan_store
347367
; NOSTACK-NOT: call {{.*}}__hwasan_generate_tag
348368
; NOSTACK-NOT: call {{.*}}__hwasan_store
369+
; SAFETY-REMARKS: --- !Passed{{[[:space:]]}}Pass: hwasan{{[[:space:]]}}Name: ignoreAccess{{[[:space:]]}}Function: test_retptr
349370
%buf.sroa.0 = alloca i8, align 4
350371
call void @llvm.lifetime.start.p0(i64 1, ptr nonnull %buf.sroa.0)
351372
%ptr = call ptr @retptr(ptr %buf.sroa.0)

0 commit comments

Comments
 (0)