diff options
author | Albert Gutowski <agutowski@google.com> | 2016-10-14 17:33:05 +0000 |
---|---|---|
committer | Albert Gutowski <agutowski@google.com> | 2016-10-14 17:33:05 +0000 |
commit | 1deab387170a0877485e9aca7461acac79b33be3 (patch) | |
tree | fd89d89caffae48b6add6cfd403cc7ea4b4dfb42 /clang/test/CodeGen/ms-intrinsics.c | |
parent | c39f8b0a3a1dd8bab1ddcfd865eaf092b2a8507f (diff) | |
download | bcm5719-llvm-1deab387170a0877485e9aca7461acac79b33be3.tar.gz bcm5719-llvm-1deab387170a0877485e9aca7461acac79b33be3.zip |
Implement __stosb intrinsic as a volatile memset
Summary: We need `__stosb` to be an intrinsic, because SecureZeroMemory function uses it without including intrin.h. Implementing it as a volatile memset is not consistent with MSDN specification, but it gives us target-independent IR while keeping the most important properties of `__stosb`.
Reviewers: rnk, hans, thakis, majnemer
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D25334
llvm-svn: 284253
Diffstat (limited to 'clang/test/CodeGen/ms-intrinsics.c')
-rw-r--r-- | clang/test/CodeGen/ms-intrinsics.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/clang/test/CodeGen/ms-intrinsics.c b/clang/test/CodeGen/ms-intrinsics.c index 0da34427ac4..25eae44e027 100644 --- a/clang/test/CodeGen/ms-intrinsics.c +++ b/clang/test/CodeGen/ms-intrinsics.c @@ -14,6 +14,22 @@ typedef __SIZE_TYPE__ size_t; #include <intrin.h> +#if defined(__i386__) || defined(__x86_64__) +void test__stosb(unsigned char *Dest, unsigned char Data, size_t Count) { + return __stosb(Dest, Data, Count); +} + +// CHECK-I386: define{{.*}}void @test__stosb +// CHECK-I386: tail call void @llvm.memset.p0i8.i32(i8* %Dest, i8 %Data, i32 %Count, i32 1, i1 true) +// CHECK-I386: ret void +// CHECK-I386: } + +// CHECK-X64: define{{.*}}void @test__stosb +// CHECK-X64: tail call void @llvm.memset.p0i8.i64(i8* %Dest, i8 %Data, i64 %Count, i32 1, i1 true) +// CHECK-X64: ret void +// CHECK-X64: } +#endif + void *test_ReturnAddress() { return _ReturnAddress(); } |