[llvm] 03e8820 - [msan] Remove more attributes from sanitized functions.

Evgenii Stepanov via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 28 17:57:48 PDT 2019


Author: Evgenii Stepanov
Date: 2019-10-28T17:57:28-07:00
New Revision: 03e882050f1a28024dfd9d88688f718734c0b319

URL: https://github.com/llvm/llvm-project/commit/03e882050f1a28024dfd9d88688f718734c0b319
DIFF: https://github.com/llvm/llvm-project/commit/03e882050f1a28024dfd9d88688f718734c0b319.diff

LOG: [msan] Remove more attributes from sanitized functions.

Summary:
MSan instrumentation adds stores and loads even to pure
readonly/writeonly functions. It is removing some of those attributes
from instrumented functions and call targets, but apparently not enough.

Remove writeonly, argmemonly and speculatable in addition to readonly /
readnone.

Reviewers: pcc, vitalybuka

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D69541

Added: 
    llvm/test/Instrumentation/MemorySanitizer/attributes.ll

Modified: 
    llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 69c9020e060b..2c82dbd90609 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -3278,7 +3278,10 @@ struct MemorySanitizerVisitor : public InstVisitor<MemorySanitizerVisitor> {
         // Clear out readonly/readnone attributes.
         AttrBuilder B;
         B.addAttribute(Attribute::ReadOnly)
-          .addAttribute(Attribute::ReadNone);
+            .addAttribute(Attribute::ReadNone)
+            .addAttribute(Attribute::WriteOnly)
+            .addAttribute(Attribute::ArgMemOnly)
+            .addAttribute(Attribute::Speculatable);
         Func->removeAttributes(AttributeList::FunctionIndex, B);
       }
 
@@ -4595,7 +4598,10 @@ bool MemorySanitizer::sanitizeFunction(Function &F, TargetLibraryInfo &TLI) {
   // Clear out readonly/readnone attributes.
   AttrBuilder B;
   B.addAttribute(Attribute::ReadOnly)
-    .addAttribute(Attribute::ReadNone);
+      .addAttribute(Attribute::ReadNone)
+      .addAttribute(Attribute::WriteOnly)
+      .addAttribute(Attribute::ArgMemOnly)
+      .addAttribute(Attribute::Speculatable);
   F.removeAttributes(AttributeList::FunctionIndex, B);
 
   return Visitor.runOnFunction();

diff  --git a/llvm/test/Instrumentation/MemorySanitizer/attributes.ll b/llvm/test/Instrumentation/MemorySanitizer/attributes.ll
new file mode 100644
index 000000000000..16f497109266
--- /dev/null
+++ b/llvm/test/Instrumentation/MemorySanitizer/attributes.ll
@@ -0,0 +1,47 @@
+; RUN: opt < %s -S -passes='module(msan-module),function(msan)' 2>&1 | FileCheck %s
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+
+declare void @a_() sanitize_memory readnone
+declare void @b_() sanitize_memory readonly
+declare void @c_() sanitize_memory writeonly
+declare void @d_(i32* %p) sanitize_memory writeonly argmemonly
+declare void @e_() sanitize_memory speculatable
+
+define void @a() sanitize_memory readnone {
+entry:
+  call void @a_()
+  ret void
+}
+
+define void @b() sanitize_memory readonly {
+entry:
+  call void @b_()
+  ret void
+}
+
+define void @c() sanitize_memory writeonly {
+entry:
+  call void @c_()
+  ret void
+}
+
+define void @d(i32* %p) sanitize_memory writeonly argmemonly {
+entry:
+  call void @d_(i32* %p)
+  ret void
+}
+
+define void @e() sanitize_memory speculatable {
+entry:
+  call void @e_()
+  ret void
+}
+
+; CHECK-NOT: readnone
+; CHECK-NOT: readonly
+; CHECK-NOT: writeonly
+; CHECK-NOT: argmemonly
+; CHECK-NOT: speculatable


        


More information about the llvm-commits mailing list