[PATCH] D43959: [asan] Fix a false positive ODR violation due to LTO ConstantMerge pass

Kuba (Brecka) Mracek via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 1 10:27:39 PST 2018


kubamracek created this revision.
kubamracek added reviewers: george.karpenkov, steven_wu, kcc, eugenis, filcab, fjricci, dvyukov.
kubamracek added a project: Sanitizers.
Herald added subscribers: inglorion, mehdi_amini.

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. See the included testcase for an example.


Repository:
  rL LLVM

https://reviews.llvm.org/D43959

Files:
  lib/Transforms/Instrumentation/AddressSanitizer.cpp
  projects/compiler-rt/test/asan/TestCases/lto-odr.cc
  test/Instrumentation/AddressSanitizer/global_lto_merge.ll


Index: projects/compiler-rt/test/asan/TestCases/lto-odr.cc
===================================================================
--- projects/compiler-rt/test/asan/TestCases/lto-odr.cc
+++ projects/compiler-rt/test/asan/TestCases/lto-odr.cc
@@ -0,0 +1,14 @@
+// RUN: %clangxx_asan -O3 -flto %s -o %t
+// RUN: %run %t 2>&1
+
+// REQUIRES: lto
+
+int main(int argc, const char * argv[]) {
+  struct { long width, height; } a = {16, 16};
+  struct { long width, height; } b = {16, 16};
+
+  // Just to make sure 'a' and 'b' don't get optimized out.
+  asm volatile ("" : : "r" (&a), "r" (&b) );
+
+  return 0;
+}
Index: test/Instrumentation/AddressSanitizer/global_lto_merge.ll
===================================================================
--- test/Instrumentation/AddressSanitizer/global_lto_merge.ll
+++ test/Instrumentation/AddressSanitizer/global_lto_merge.ll
@@ -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)
Index: lib/Transforms/Instrumentation/AddressSanitizer.cpp
===================================================================
--- lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -2158,6 +2158,12 @@
     Initializers[i] = Initializer;
   }
 
+  // Add instrumented globals to llvm.compiler.used list to avoid LTO from
+  // ConstantMerge'ing them.
+  appendToCompilerUsed(
+      M, ArrayRef<GlobalValue *>(cast<GlobalValue *>(NewGlobals.data()),
+                                 NewGlobals.size()));
+
   std::string ELFUniqueModuleId =
       (UseGlobalsGC && TargetTriple.isOSBinFormatELF()) ? getUniqueModuleId(&M)
                                                         : "";


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D43959.136571.patch
Type: text/x-patch
Size: 2902 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180301/853f77ef/attachment.bin>


More information about the llvm-commits mailing list