[PATCH] D69541: [msan] Remove more attributes from sanitized functions.

Evgenii Stepanov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 28 17:53:20 PDT 2019


eugenis created this revision.
eugenis added reviewers: pcc, vitalybuka.
Herald added a subscriber: hiraditya.
Herald added a project: LLVM.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D69541

Files:
  llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
  llvm/test/Instrumentation/MemorySanitizer/attributes.ll


Index: llvm/test/Instrumentation/MemorySanitizer/attributes.ll
===================================================================
--- /dev/null
+++ 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
Index: llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -3278,7 +3278,10 @@
         // 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 @@
   // 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();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69541.226822.patch
Type: text/x-patch
Size: 2530 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191029/ff83c377/attachment.bin>


More information about the llvm-commits mailing list