OSDN Git Service

[ASan/Win] Don't instrument COMDAT globals. Properly fixes PR20244.
authorTimur Iskhodzhanov <timurrrr@google.com>
Wed, 9 Jul 2014 08:35:33 +0000 (08:35 +0000)
committerTimur Iskhodzhanov <timurrrr@google.com>
Wed, 9 Jul 2014 08:35:33 +0000 (08:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212596 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/AddressSanitizer.cpp

index 8f9355c..5e5ddc1 100644 (file)
@@ -923,11 +923,14 @@ bool AddressSanitizerModule::ShouldInstrumentGlobal(GlobalVariable *G) {
   if (!G->hasInitializer()) return false;
   if (GlobalWasGeneratedByAsan(G)) return false;  // Our own global.
   // Touch only those globals that will not be defined in other modules.
-  // Don't handle ODR type linkages since other modules may be built w/o asan.
+  // Don't handle ODR linkage types and COMDATs since other modules may be built
+  // without ASan.
   if (G->getLinkage() != GlobalVariable::ExternalLinkage &&
       G->getLinkage() != GlobalVariable::PrivateLinkage &&
       G->getLinkage() != GlobalVariable::InternalLinkage)
     return false;
+  if (G->hasComdat())
+    return false;
   // Two problems with thread-locals:
   //   - The address of the main thread's copy can't be computed at link-time.
   //   - Need to poison all copies, not just the main thread's one.
@@ -946,13 +949,6 @@ bool AddressSanitizerModule::ShouldInstrumentGlobal(GlobalVariable *G) {
     return false;
   }
 
-  // Don't instrument private COMDAT globals on Windows until PR20244 (linkage
-  // of vftables with RTTI) is properly fixed.
-  llvm::Triple TargetTriple(G->getParent()->getTargetTriple());
-  if (G->hasComdat() && G->getLinkage() == GlobalVariable::PrivateLinkage &&
-      TargetTriple.isWindowsMSVCEnvironment())
-    return false;
-
   if (G->hasSection()) {
     StringRef Section(G->getSection());
     // Ignore the globals from the __OBJC section. The ObjC runtime assumes