Skip to content

Commit 83fdcf2

Browse files
authored
[msan] Fix vscale alloca poisoning (#90912)
1 parent a7e9e3e commit 83fdcf2

File tree

2 files changed

+60
-3
lines changed

2 files changed

+60
-3
lines changed

llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4458,8 +4458,8 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
44584458
InsPoint = &I;
44594459
NextNodeIRBuilder IRB(InsPoint);
44604460
const DataLayout &DL = F.getParent()->getDataLayout();
4461-
uint64_t TypeSize = DL.getTypeAllocSize(I.getAllocatedType());
4462-
Value *Len = ConstantInt::get(MS.IntptrTy, TypeSize);
4461+
TypeSize TS = DL.getTypeAllocSize(I.getAllocatedType());
4462+
Value *Len = IRB.CreateTypeSize(MS.IntptrTy, TS);
44634463
if (I.isArrayAllocation())
44644464
Len = IRB.CreateMul(Len,
44654465
IRB.CreateZExtOrTrunc(I.getArraySize(), MS.IntptrTy));

llvm/test/Instrumentation/MemorySanitizer/vscale.ll

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ define void @test_param(ptr %a, ptr %b) sanitize_memory {
173173
; CHECK-NEXT: [[_MSCMP:%.*]] = icmp ne i32 [[TMP6]], 0
174174
; CHECK-NEXT: br i1 [[_MSCMP]], label [[TMP7:%.*]], label [[TMP8:%.*]], !prof [[PROF0:![0-9]+]]
175175
; CHECK: 7:
176-
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR4:[0-9]+]]
176+
; CHECK-NEXT: call void @__msan_warning_noreturn() #[[ATTR5:[0-9]+]]
177177
; CHECK-NEXT: unreachable
178178
; CHECK: 8:
179179
; CHECK-NEXT: call void @fn_param(<vscale x 2 x float> [[TMP2]], ptr [[B]])
@@ -183,6 +183,63 @@ define void @test_param(ptr %a, ptr %b) sanitize_memory {
183183
call void @fn_param(<vscale x 2 x float> %1, ptr %b)
184184
ret void
185185
}
186+
187+
define void @test_alloca1() sanitize_memory {
188+
; CHECK-LABEL: define void @test_alloca1(
189+
; CHECK-SAME: ) #[[ATTR0]] {
190+
; CHECK-NEXT: entry:
191+
; CHECK-NEXT: call void @llvm.donothing()
192+
; CHECK-NEXT: [[X:%.*]] = alloca <vscale x 64 x i1>, align 4
193+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
194+
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[TMP0]], 8
195+
; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[X]] to i64
196+
; CHECK-NEXT: [[TMP3:%.*]] = xor i64 [[TMP2]], 87960930222080
197+
; CHECK-NEXT: [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr
198+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP4]], i8 -1, i64 [[TMP1]], i1 false)
199+
; CHECK-NEXT: ret void
200+
;
201+
entry:
202+
%x = alloca <vscale x 64 x i1>, align 4
203+
ret void
204+
}
205+
206+
define void @test_alloca2() sanitize_memory {
207+
; CHECK-LABEL: define void @test_alloca2(
208+
; CHECK-SAME: ) #[[ATTR0]] {
209+
; CHECK-NEXT: entry:
210+
; CHECK-NEXT: call void @llvm.donothing()
211+
; CHECK-NEXT: [[X:%.*]] = alloca <vscale x 64 x double>, align 4
212+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
213+
; CHECK-NEXT: [[TMP1:%.*]] = mul i64 [[TMP0]], 512
214+
; CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[X]] to i64
215+
; CHECK-NEXT: [[TMP3:%.*]] = xor i64 [[TMP2]], 87960930222080
216+
; CHECK-NEXT: [[TMP4:%.*]] = inttoptr i64 [[TMP3]] to ptr
217+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP4]], i8 -1, i64 [[TMP1]], i1 false)
218+
; CHECK-NEXT: ret void
219+
;
220+
entry:
221+
%x = alloca <vscale x 64 x double>, align 4
222+
ret void
223+
}
224+
225+
define void @test_alloca3() sanitize_memory {
226+
; CHECK-LABEL: define void @test_alloca3(
227+
; CHECK-SAME: ) #[[ATTR0]] {
228+
; CHECK-NEXT: entry:
229+
; CHECK-NEXT: call void @llvm.donothing()
230+
; CHECK-NEXT: [[X:%.*]] = alloca <vscale x 1 x i1>, align 4
231+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.vscale.i64()
232+
; CHECK-NEXT: [[TMP1:%.*]] = ptrtoint ptr [[X]] to i64
233+
; CHECK-NEXT: [[TMP2:%.*]] = xor i64 [[TMP1]], 87960930222080
234+
; CHECK-NEXT: [[TMP3:%.*]] = inttoptr i64 [[TMP2]] to ptr
235+
; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 4 [[TMP3]], i8 -1, i64 [[TMP0]], i1 false)
236+
; CHECK-NEXT: ret void
237+
;
238+
entry:
239+
%x = alloca <vscale x 1 x i1>, align 4
240+
ret void
241+
}
242+
186243
;.
187244
; CHECK: [[PROF0]] = !{!"branch_weights", i32 1, i32 1048575}
188245
;.

0 commit comments

Comments
 (0)