Skip to content

Commit b86302e

Browse files
committed
[MSan] Set zeroext on call arguments to msan functions with zeroext parameter attribute
ABI attributes need to match between the caller and callee. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D102667
1 parent 4e297dc commit b86302e

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1178,9 +1178,11 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
11781178
FunctionCallee Fn = MS.MaybeStoreOriginFn[SizeIndex];
11791179
Value *ConvertedShadow2 =
11801180
IRB.CreateZExt(ConvertedShadow, IRB.getIntNTy(8 * (1 << SizeIndex)));
1181-
IRB.CreateCall(Fn,
1182-
{ConvertedShadow2,
1183-
IRB.CreatePointerCast(Addr, IRB.getInt8PtrTy()), Origin});
1181+
CallBase *CB = IRB.CreateCall(
1182+
Fn, {ConvertedShadow2,
1183+
IRB.CreatePointerCast(Addr, IRB.getInt8PtrTy()), Origin});
1184+
CB->addParamAttr(0, Attribute::ZExt);
1185+
CB->addParamAttr(2, Attribute::ZExt);
11841186
} else {
11851187
Value *Cmp = convertToBool(ConvertedShadow, IRB, "_mscmp");
11861188
Instruction *CheckTerm = SplitBlockAndInsertIfThen(
@@ -1250,9 +1252,11 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
12501252
FunctionCallee Fn = MS.MaybeWarningFn[SizeIndex];
12511253
Value *ConvertedShadow2 =
12521254
IRB.CreateZExt(ConvertedShadow, IRB.getIntNTy(8 * (1 << SizeIndex)));
1253-
IRB.CreateCall(Fn, {ConvertedShadow2, MS.TrackOrigins && Origin
1254-
? Origin
1255-
: (Value *)IRB.getInt32(0)});
1255+
CallBase *CB = IRB.CreateCall(
1256+
Fn, {ConvertedShadow2,
1257+
MS.TrackOrigins && Origin ? Origin : (Value *)IRB.getInt32(0)});
1258+
CB->addParamAttr(0, Attribute::ZExt);
1259+
CB->addParamAttr(1, Attribute::ZExt);
12561260
} else {
12571261
Value *Cmp = convertToBool(ConvertedShadow, IRB, "_mscmp");
12581262
Instruction *CheckTerm = SplitBlockAndInsertIfThen(

llvm/test/Instrumentation/MemorySanitizer/instrumentation-with-call-threshold.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ declare void @foo(...)
4040
; CHECK: = load
4141
; CHECK: = load
4242
; CHECK: = zext i1 {{.*}} to i8
43-
; CHECK: call void @__msan_maybe_warning_1(
43+
; CHECK: call void @__msan_maybe_warning_1(i8 zeroext {{.*}}, i32 zeroext {{.*}})
4444
; CHECK-NOT: unreachable
4545
; CHECK: ret void
4646

@@ -58,7 +58,7 @@ entry:
5858
; CHECK-ORIGINS-NOT: __msan_chain_origin
5959
; CHECK-ORIGINS: bitcast i64* {{.*}} to i8*
6060
; CHECK-ORIGINS-NOT: __msan_chain_origin
61-
; CHECK-ORIGINS: call void @__msan_maybe_store_origin_8(
61+
; CHECK-ORIGINS: call void @__msan_maybe_store_origin_8(i64 zeroext {{.*}}, i8* {{.*}}, i32 zeroext {{.*}})
6262
; CHECK-ORIGINS-NOT: __msan_chain_origin
6363
; CHECK: store i64
6464
; CHECK: ret void

llvm/test/Instrumentation/MemorySanitizer/with-call-type-size.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ define <4 x i32> @test1(<4 x i32> %vec, i1 %idx, i32 %x) sanitize_memory {
1111
}
1212
; CHECK-LABEL: @test1(
1313
; CHECK: %[[A:.*]] = zext i1 {{.*}} to i8
14-
; CHECK: call void @__msan_maybe_warning_1(i8 %[[A]], i32 0)
14+
; CHECK: call void @__msan_maybe_warning_1(i8 zeroext %[[A]], i32 zeroext 0)
1515
; CHECK: ret <4 x i32>
1616

1717
define <4 x i32> @test2(<4 x i32> %vec, i2 %idx, i32 %x) sanitize_memory {
@@ -20,7 +20,7 @@ define <4 x i32> @test2(<4 x i32> %vec, i2 %idx, i32 %x) sanitize_memory {
2020
}
2121
; CHECK-LABEL: @test2(
2222
; CHECK: %[[A:.*]] = zext i2 {{.*}} to i8
23-
; CHECK: call void @__msan_maybe_warning_1(i8 %[[A]], i32 0)
23+
; CHECK: call void @__msan_maybe_warning_1(i8 zeroext %[[A]], i32 zeroext 0)
2424
; CHECK: ret <4 x i32>
2525

2626
define <4 x i32> @test8(<4 x i32> %vec, i8 %idx, i32 %x) sanitize_memory {
@@ -29,7 +29,7 @@ define <4 x i32> @test8(<4 x i32> %vec, i8 %idx, i32 %x) sanitize_memory {
2929
}
3030
; CHECK-LABEL: @test8(
3131
; zext i8 -> i8 unnecessary.
32-
; CHECK: call void @__msan_maybe_warning_1(i8 %{{.*}}, i32 0)
32+
; CHECK: call void @__msan_maybe_warning_1(i8 zeroext %{{.*}}, i32 zeroext 0)
3333
; CHECK: ret <4 x i32>
3434

3535
define <4 x i32> @test9(<4 x i32> %vec, i9 %idx, i32 %x) sanitize_memory {
@@ -38,15 +38,15 @@ define <4 x i32> @test9(<4 x i32> %vec, i9 %idx, i32 %x) sanitize_memory {
3838
}
3939
; CHECK-LABEL: @test9(
4040
; CHECK: %[[A:.*]] = zext i9 {{.*}} to i16
41-
; CHECK: call void @__msan_maybe_warning_2(i16 %[[A]], i32 0)
41+
; CHECK: call void @__msan_maybe_warning_2(i16 zeroext %[[A]], i32 zeroext 0)
4242
; CHECK: ret <4 x i32>
4343

4444
define <4 x i32> @test16(<4 x i32> %vec, i16 %idx, i32 %x) sanitize_memory {
4545
%vec1 = insertelement <4 x i32> %vec, i32 %x, i16 %idx
4646
ret <4 x i32> %vec1
4747
}
4848
; CHECK-LABEL: @test16(
49-
; CHECK: call void @__msan_maybe_warning_2(i16 %{{.*}}, i32 0)
49+
; CHECK: call void @__msan_maybe_warning_2(i16 zeroext %{{.*}}, i32 zeroext 0)
5050
; CHECK: ret <4 x i32>
5151

5252
define <4 x i32> @test17(<4 x i32> %vec, i17 %idx, i32 %x) sanitize_memory {
@@ -55,7 +55,7 @@ define <4 x i32> @test17(<4 x i32> %vec, i17 %idx, i32 %x) sanitize_memory {
5555
}
5656
; CHECK-LABEL: @test17(
5757
; CHECK: %[[A:.*]] = zext i17 {{.*}} to i32
58-
; CHECK: call void @__msan_maybe_warning_4(i32 %[[A]], i32 0)
58+
; CHECK: call void @__msan_maybe_warning_4(i32 zeroext %[[A]], i32 zeroext 0)
5959
; CHECK: ret <4 x i32>
6060

6161
define <4 x i32> @test42(<4 x i32> %vec, i42 %idx, i32 %x) sanitize_memory {
@@ -64,15 +64,15 @@ define <4 x i32> @test42(<4 x i32> %vec, i42 %idx, i32 %x) sanitize_memory {
6464
}
6565
; CHECK-LABEL: @test42(
6666
; CHECK: %[[A:.*]] = zext i42 {{.*}} to i64
67-
; CHECK: call void @__msan_maybe_warning_8(i64 %[[A]], i32 0)
67+
; CHECK: call void @__msan_maybe_warning_8(i64 zeroext %[[A]], i32 zeroext 0)
6868
; CHECK: ret <4 x i32>
6969

7070
define <4 x i32> @test64(<4 x i32> %vec, i64 %idx, i32 %x) sanitize_memory {
7171
%vec1 = insertelement <4 x i32> %vec, i32 %x, i64 %idx
7272
ret <4 x i32> %vec1
7373
}
7474
; CHECK-LABEL: @test64(
75-
; CHECK: call void @__msan_maybe_warning_8(i64 %{{.*}}, i32 0)
75+
; CHECK: call void @__msan_maybe_warning_8(i64 zeroext %{{.*}}, i32 zeroext 0)
7676
; CHECK: ret <4 x i32>
7777

7878
; Type size too large => inline check.

0 commit comments

Comments
 (0)