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/lib/CodeGen/CGBuiltin.cpp | |
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/lib/CodeGen/CGBuiltin.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGBuiltin.cpp | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index bfec53ace22..8bb9a465864 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -7770,6 +7770,11 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID, Value *F = CGM.getIntrinsic(Intrinsic::addressofreturnaddress); return Builder.CreateCall(F); } + case X86::BI__stosb: { + // We treat __stosb as a volatile memset - it may not generate "rep stosb" + // instruction, but it will create a memset that won't be optimized away. + return Builder.CreateMemSet(Ops[0], Ops[1], Ops[2], 1, true); + } } } |