<div dir="ltr">On Fri, Sep 6, 2013 at 3:47 PM, Manman Ren <span dir="ltr"><<a href="mailto:manman.ren@gmail.com" target="_blank">manman.ren@gmail.com</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: mren<br>
Date: Fri Sep  6 17:47:05 2013<br>
New Revision: 190216<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=190216&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=190216&view=rev</a><br>
Log:<br>
TBAA: add isTBAAVtableAccess to MDNode so clients can call the function<br>
instead of having its own implementation.<br>
<br>
The implementation of isTBAAVtableAccess is in TypeBasedAliasAnalysis.cpp<br>
since it is related to the format of TBAA metadata.<br>
<br>
The path for struct-path tbaa will be exercised by<br>
test/Instrumentation/ThreadSanitizer/read_from_global.ll, vptr_read.ll, and<br>
vptr_update.ll when struct-path tbaa is on by default.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/Metadata.h<br>
    llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp<br>
    llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Metadata.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=190216&r1=190215&r2=190216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=190216&r1=190215&r2=190216&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Metadata.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Metadata.h Fri Sep  6 17:47:05 2013<br>
@@ -161,6 +161,9 @@ public:<br>
     return V->getValueID() == MDNodeVal;<br>
   }<br>
<br>
+  /// Check whether MDNode is a vtable access.<br>
+  bool isTBAAVtableAccess() const;<br>
+<br>
   /// Methods for metadata merging.<br>
   static MDNode *getMostGenericTBAA(MDNode *A, MDNode *B);<br>
   static MDNode *getMostGenericFPMath(MDNode *A, MDNode *B);<br>
<br>
Modified: llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=190216&r1=190215&r2=190216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp?rev=190216&r1=190215&r2=190216&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/TypeBasedAliasAnalysis.cpp Fri Sep  6 17:47:05 2013<br>
@@ -458,6 +458,25 @@ TypeBasedAliasAnalysis::getModRefInfo(Im<br>
   return AliasAnalysis::getModRefInfo(CS1, CS2);<br>
 }<br>
<br>
+bool MDNode::isTBAAVtableAccess() const {<br>
+  if (!EnableStructPathTBAA) {<br>
+    if (getNumOperands() < 1) return false;<br>
+    if (MDString *Tag1 = dyn_cast<MDString>(getOperand(0))) {<br></blockquote><div><br></div><div>This is also causing a crash, for the same reason: getOperand(0) can apparently return null here.</div><div> </div>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      if (Tag1->getString() == "vtable pointer") return true;<br>
+    }<br>
+    return false;<br>
+  }<br>
+<br>
+  // For struct-path aware TBAA, we use the access type of the tag.<br>
+  if (getNumOperands() < 2) return false;<br>
+  MDNode *Tag = cast_or_null<MDNode>(getOperand(1));<br>
+  if (!Tag) return false;<br>
+  if (MDString *Tag1 = dyn_cast<MDString>(Tag->getOperand(0))) {<br>
+    if (Tag1->getString() == "vtable pointer") return true;<br>
+  }<br>
+  return false;<br>
+}<br>
+<br>
 MDNode *MDNode::getMostGenericTBAA(MDNode *A, MDNode *B) {<br>
   if (!A || !B)<br>
     return NULL;<br>
<br>
Modified: llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp?rev=190216&r1=190215&r2=190216&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp?rev=190216&r1=190215&r2=190216&view=diff</a><br>

==============================================================================<br>
--- llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Instrumentation/ThreadSanitizer.cpp Fri Sep  6 17:47:05 2013<br>
@@ -240,12 +240,8 @@ bool ThreadSanitizer::doInitialization(M<br>
 }<br>
<br>
 static bool isVtableAccess(Instruction *I) {<br>
-  if (MDNode *Tag = I->getMetadata(LLVMContext::MD_tbaa)) {<br>
-    if (Tag->getNumOperands() < 1) return false;<br>
-    if (MDString *Tag1 = dyn_cast<MDString>(Tag->getOperand(0))) {<br>
-      if (Tag1->getString() == "vtable pointer") return true;<br>
-    }<br>
-  }<br>
+  if (MDNode *Tag = I->getMetadata(LLVMContext::MD_tbaa))<br>
+    return Tag->isTBAAVtableAccess();<br>
   return false;<br>
 }<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>