<div dir="ltr">How can I reproduce the problem?</div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jun 26, 2018 at 3:48 PM Evgeniy Stepanov via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: eugenis<br>
Date: Tue Jun 26 15:43:48 2018<br>
New Revision: 335681<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=335681&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=335681&view=rev</a><br>
Log:<br>
Revert "[asan] Instrument comdat globals on COFF targets"<br>
<br>
Causes false positive ODR violation reports on __llvm_profile_raw_version.<br>
<br>
Removed:<br>
    llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll<br>
Modified:<br>
    llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp<br>
<br>
Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=335681&r1=335680&r2=335681&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=335681&r1=335680&r2=335681&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Tue Jun 26 15:43:48 2018<br>
@@ -1653,6 +1653,14 @@ bool AddressSanitizerModule::ShouldInstr<br>
   if (!Ty->isSized()) return false;<br>
   if (!G->hasInitializer()) return false;<br>
   if (GlobalWasGeneratedByCompiler(G)) return false; // Our own globals.<br>
+  // Touch only those globals that will not be defined in other modules.<br>
+  // Don't handle ODR linkage types and COMDATs since other modules may be built<br>
+  // without ASan.<br>
+  if (G->getLinkage() != GlobalVariable::ExternalLinkage &&<br>
+      G->getLinkage() != GlobalVariable::PrivateLinkage &&<br>
+      G->getLinkage() != GlobalVariable::InternalLinkage)<br>
+    return false;<br>
+  if (G->hasComdat()) return false;<br>
   // Two problems with thread-locals:<br>
   //   - The address of the main thread's copy can't be computed at link-time.<br>
   //   - Need to poison all copies, not just the main thread's one.<br>
@@ -1660,38 +1668,6 @@ bool AddressSanitizerModule::ShouldInstr<br>
   // For now, just ignore this Global if the alignment is large.<br>
   if (G->getAlignment() > MinRedzoneSizeForGlobal()) return false;<br>
<br>
-  // If we know this global is defined only in this module (external or static),<br>
-  // we can instrument it.<br>
-  if (G->getLinkage() != GlobalVariable::ExternalLinkage &&<br>
-      G->getLinkage() != GlobalVariable::PrivateLinkage &&<br>
-      G->getLinkage() != GlobalVariable::InternalLinkage) {<br>
-    // For targets that support comdats, we can instrument ODR globals in<br>
-    // comdats. We simply add our global metadata to the group and hope that an<br>
-    // instrumented global is selected.<br>
-    // FIXME: This should work on ELF, enable it there too.<br>
-    if (!TargetTriple.isOSBinFormatCOFF())<br>
-      return false;<br>
-    if (G->getLinkage() != GlobalVariable::WeakODRLinkage &&<br>
-        G->getLinkage() != GlobalVariable::LinkOnceODRLinkage)<br>
-      return false;<br>
-    if (!G->hasComdat())<br>
-      return false;<br>
-  }<br>
-<br>
-  // If a comdat is present, it must have a selection kind that implies ODR<br>
-  // semantics: no duplicates, any, or exact match.<br>
-  if (Comdat *C = G->getComdat()) {<br>
-    switch (C->getSelectionKind()) {<br>
-    case Comdat::Any:<br>
-    case Comdat::ExactMatch:<br>
-    case Comdat::NoDuplicates:<br>
-      break;<br>
-    case Comdat::Largest:<br>
-    case Comdat::SameSize:<br>
-      return false;<br>
-    }<br>
-  }<br>
-<br>
   if (G->hasSection()) {<br>
     StringRef Section = G->getSection();<br>
<br>
@@ -2145,7 +2121,6 @@ bool AddressSanitizerModule::InstrumentG<br>
         new GlobalVariable(M, NewTy, G->isConstant(), Linkage, NewInitializer,<br>
                            "", G, G->getThreadLocalMode());<br>
     NewGlobal->copyAttributesFrom(G);<br>
-    NewGlobal->setComdat(G->getComdat());<br>
     NewGlobal->setAlignment(MinRZ);<br>
<br>
     // Move null-terminated C strings to "__asan_cstring" section on Darwin.<br>
<br>
Removed: llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll?rev=335680&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll?rev=335680&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll (original)<br>
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/win-string-literal.ll (removed)<br>
@@ -1,46 +0,0 @@<br>
-; RUN: opt < %s -asan -asan-module -S | FileCheck %s<br>
-<br>
-; Generated like so:<br>
-; $ clang -S -emit-llvm -Xclang -disable-llvm-passes -fsanitize=address -O1 t.cpp -o t.ll<br>
-; const char *getstr() { return "asdf"; }<br>
-<br>
-; CHECK: $"??_C@_04JIHMPGLA@asdf?$AA@" = comdat any<br>
-<br>
-; CHECK: @"??_C@_04JIHMPGLA@asdf?$AA@" =<br>
-; CHECK-SAME: linkonce_odr dso_local unnamed_addr constant { [5 x i8], [59 x i8] }<br>
-; CHECK-SAME: { [5 x i8] c"asdf\00", [59 x i8] zeroinitializer }, comdat, align 32<br>
-<br>
-; CHECK: @"__asan_global_??_C@_04JIHMPGLA@asdf?$AA@" =<br>
-; CHECK-SAME: private global { i64, i64, i64, i64, i64, i64, i64, i64 }<br>
-; CHECK-SAME: { i64 ptrtoint ({ [5 x i8], [59 x i8] }* @"??_C@_04JIHMPGLA@asdf?$AA@" to i64),<br>
-; CHECK-SAME:   i64 5, i64 64, i64 ptrtoint ([17 x i8]* @__asan_gen_.1 to i64),<br>
-; CHECK-SAME:   i64 ptrtoint ([8 x i8]* @__asan_gen_ to i64), i64 0,<br>
-; CHECK-SAME:   i64 ptrtoint ({ [6 x i8]*, i32, i32 }* @__asan_gen_.3 to i64), i64 0 },<br>
-; CHECK-SAME:   section ".ASAN$GL", comdat($"??_C@_04JIHMPGLA@asdf?$AA@"), align 64<br>
-<br>
-; ModuleID = 't.cpp'<br>
-source_filename = "t.cpp"<br>
-target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"<br>
-target triple = "x86_64-pc-windows-msvc19.13.26131"<br>
-<br>
-$"??_C@_04JIHMPGLA@asdf?$AA@" = comdat any<br>
-<br>
-@"??_C@_04JIHMPGLA@asdf?$AA@" = linkonce_odr dso_local unnamed_addr constant [5 x i8] c"asdf\00", comdat, align 1<br>
-<br>
-; Function Attrs: nounwind sanitize_address uwtable<br>
-define dso_local i8* @"?getstr@@YAPEBDXZ"() #0 {<br>
-entry:<br>
-  ret i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"??_C@_04JIHMPGLA@asdf?$AA@", i32 0, i32 0)<br>
-}<br>
-<br>
-attributes #0 = { nounwind sanitize_address uwtable }<br>
-<br>
-!llvm.asan.globals = !{!0}<br>
-!llvm.module.flags = !{!2, !3}<br>
-!llvm.ident = !{!4}<br>
-<br>
-!0 = !{[5 x i8]* @"??_C@_04JIHMPGLA@asdf?$AA@", !1, !"<string literal>", i1 false, i1 false}<br>
-!1 = !{!"t.cpp", i32 1, i32 31}<br>
-!2 = !{i32 1, !"wchar_size", i32 2}<br>
-!3 = !{i32 7, !"PIC Level", i32 2}<br>
-!4 = !{!"clang version 7.0.0 "}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>