<div dir="ltr">Ok.<div><br></div><div>David</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Apr 27, 2016 at 1:18 PM, Rong Xu <span dir="ltr"><<a href="mailto:xur@google.com" target="_blank">xur@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">xur updated this revision to Diff 55302.<br>
xur added a comment.<br>
<br>
I did not find an easy way to do the check-not match with the sub string.<br>
; CHECK-NOT: @__profd__stdin__foo foo<br>
obviously not working.<br>
<br>
the best approximation I can think of is to use CHECK-NOT with CHECK-SAME.<br>
<span class=""><br>
<br>
<a href="http://reviews.llvm.org/D19515" rel="noreferrer" target="_blank">http://reviews.llvm.org/D19515</a><br>
<br>
Files:<br>
  lib/Transforms/Instrumentation/InstrProfiling.cpp<br>
  test/Transforms/PGOProfile/comdat_internal.ll<br>
<br>
Index: test/Transforms/PGOProfile/comdat_internal.ll<br>
===================================================================<br>
--- test/Transforms/PGOProfile/comdat_internal.ll<br>
+++ test/Transforms/PGOProfile/comdat_internal.ll<br>
</span>@@ -0,0 +1,25 @@<br>
<span class="">+; RUN: opt < %s -pgo-instr-gen -instrprof -S | FileCheck %s<br>
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-unknown-linux-gnu"<br>
+<br>
+$foo = comdat any<br>
+<br>
+; CHECK: $__llvm_profile_raw_version = comdat any<br>
+; CHECK: $__profv__stdin__foo = comdat any<br>
+<br>
+@bar = global i32 ()* @foo, align 8<br>
+<br>
+; CHECK: @__llvm_profile_raw_version = constant i64 {{[0-9]+}}, comdat<br>
+; CHECK: @__profn__stdin__foo = private constant [11 x i8] c"<stdin>:foo"<br>
</span>+; CHECK: @__profc__stdin__foo = private global [1 x i64] zeroinitializer, section "__llvm_prf_cnts", comdat($__profv__stdin__foo), align 8<br>
<span class="">+; CHECK: @__profd__stdin__foo = private global { i64, i64, i64*, i8*, i8*, i32, [1 x i16] } { i64 -5640069336071256030, i64 12884901887, i64* getelementptr inbounds ([1 x i64], [1 x i64]* @__profc__stdin__foo, i32 0, i32 0), i8*<br>
</span>+; CHECK-NOT: bitcast (i32 ()* @foo to i8*)<br>
+; CHECK-SAME: null<br>
+; CHECK-SAME: , i8* null, i32 1, [1 x i16] zeroinitializer }, section "__llvm_prf_data", comdat($__profv__stdin__foo), align 8<br>
<span class="">+; CHECK: @__llvm_prf_nm = private constant [21 x i8] c"\0B\13x\DA\B3).I\C9\CC\B3\B3J\CB\CF\07\00\18a\04\1B", section "__llvm_prf_names"<br>
</span><span class="">+; CHECK: @llvm.used = appending global [2 x i8*] [i8* bitcast ({ i64, i64, i64*, i8*, i8*, i32, [1 x i16] }* @__profd__stdin__foo to i8*), i8* getelementptr inbounds ([21 x i8], [21 x i8]* @__llvm_prf_nm, i32 0, i32 0)], section "llvm.metadata"<br>
+<br>
+define internal i32 @foo() comdat {<br>
+entry:<br>
+  ret i32 1<br>
+}<br>
</span><span class="">Index: lib/Transforms/Instrumentation/InstrProfiling.cpp<br>
===================================================================<br>
--- lib/Transforms/Instrumentation/InstrProfiling.cpp<br>
+++ lib/Transforms/Instrumentation/InstrProfiling.cpp<br>
</span>@@ -237,6 +237,11 @@<br>
<span class="">   if (!F->hasLinkOnceLinkage() && !F->hasLocalLinkage() &&<br>
       !F->hasAvailableExternallyLinkage())<br>
</span><span class="">     return true;<br>
+  // Prohibit function address recording if the function is both internal and<br>
+  // COMDAT. This avoids the profile data variable referencing internal symbols<br>
</span>+  // in COMDAT.<br>
<span class="im HOEnZb">+  if (F->hasLocalLinkage() && F->hasComdat())<br>
+    return false;<br>
</span><div class="HOEnZb"><div class="h5">   // Check uses of this function for other than direct calls or invokes to it.<br>
   return F->hasAddressTaken();<br>
 }<br>
<br>
<br>
</div></div></blockquote></div><br></div>