[llvm] r327061 - [asan] Fix a false positive ODR violation due to LTO ConstantMerge pass [llvm part, take 3]

Kuba Mracek via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 8 13:02:19 PST 2018


Author: kuba.brecka
Date: Thu Mar  8 13:02:18 2018
New Revision: 327061

URL: http://llvm.org/viewvc/llvm-project?rev=327061&view=rev
Log:
[asan] Fix a false positive ODR violation due to LTO ConstantMerge pass [llvm part, take 3]

This fixes a false positive ODR violation that is reported by ASan when using LTO. In cases, where two constant globals have the same value, LTO will merge them, which breaks ASan's ODR detection.

Differential Revision: https://reviews.llvm.org/D43959


Added:
    llvm/trunk/test/Instrumentation/AddressSanitizer/global_lto_merge.ll
Modified:
    llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp

Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=327061&r1=327060&r2=327061&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Thu Mar  8 13:02:18 2018
@@ -2158,6 +2158,16 @@ bool AddressSanitizerModule::InstrumentG
     Initializers[i] = Initializer;
   }
 
+  // Add instrumented globals to llvm.compiler.used list to avoid LTO from
+  // ConstantMerge'ing them.
+  SmallVector<GlobalValue *, 16> GlobalsToAddToUsedList;
+  for (size_t i = 0; i < n; i++) {
+    GlobalVariable *G = NewGlobals[i];
+    if (G->getName().empty()) continue;
+    GlobalsToAddToUsedList.push_back(G);
+  }
+  appendToCompilerUsed(M, ArrayRef<GlobalValue *>(GlobalsToAddToUsedList));
+
   std::string ELFUniqueModuleId =
       (UseGlobalsGC && TargetTriple.isOSBinFormatELF()) ? getUniqueModuleId(&M)
                                                         : "";

Added: llvm/trunk/test/Instrumentation/AddressSanitizer/global_lto_merge.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/global_lto_merge.ll?rev=327061&view=auto
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/global_lto_merge.ll (added)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/global_lto_merge.ll Thu Mar  8 13:02:18 2018
@@ -0,0 +1,30 @@
+; RUN: opt < %s -asan -asan-module -S | FileCheck %s
+; RUN: opt < %s -asan -asan-module -constmerge -S | FileCheck %s
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-apple-macosx10.11.0"
+
+%struct = type { i64, i64 }
+
+ at a = private unnamed_addr constant %struct { i64 16, i64 16 }, align 8
+ at b = private unnamed_addr constant %struct { i64 16, i64 16 }, align 8
+
+; CHECK: @a = {{.*}} %struct
+; CHECK: @b = {{.*}} %struct
+
+; CHECK: @llvm.compiler.used =
+; CHECK-SAME: i8* bitcast ({ %struct, [48 x i8] }* @a to i8*)
+; CHECK-SAME: i8* bitcast ({ %struct, [48 x i8] }* @b to i8*)
+
+define i32 @main(i32, i8** nocapture readnone) {
+  %3 = alloca %struct, align 8
+  %4 = alloca %struct, align 8
+  %5 = bitcast %struct* %3 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull %5, i8* bitcast (%struct* @a to i8*), i64 16, i32 8, i1 false)
+  %6 = bitcast %struct* %4 to i8*
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull %6, i8* bitcast (%struct* @b to i8*), i64 16, i32 8, i1 false)
+  call void asm sideeffect "", "r,r,~{dirflag},~{fpsr},~{flags}"(%struct* nonnull %3, %struct* nonnull %4)
+  ret i32 0
+}
+
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32, i1)




More information about the llvm-commits mailing list