summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2016-03-15 20:25:47 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2016-03-15 20:25:47 +0000
commitd6e91369d8001317467d4993b73c9695f5980174 (patch)
tree6f7d7a360b2294232e4cfb741ff23cc4ae59385f
parent02279ed12d50f78d5a1dc8c6736ad051edb1d69e (diff)
downloadbcm5719-llvm-d6e91369d8001317467d4993b73c9695f5980174.tar.gz
bcm5719-llvm-d6e91369d8001317467d4993b73c9695f5980174.zip
[msan] Don't put module constructors in comdats.
There is something strange going on with debug info (.eh_frame_hdr) disappearing when msan.module_ctor are placed in comdat sections. Moving this functionality under flag, disabled by default. llvm-svn: 263579
-rw-r--r--llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp13
-rw-r--r--llvm/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll2
-rw-r--r--llvm/test/Instrumentation/MemorySanitizer/msan_basic.ll5
3 files changed, 13 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
index 6ebf6e20a4a..ed9e7396111 100644
--- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp
@@ -190,6 +190,9 @@ static cl::opt<int> ClInstrumentationWithCallThreshold(
static cl::opt<bool> ClCheckConstantShadow("msan-check-constant-shadow",
cl::desc("Insert checks for constant shadow values"),
cl::Hidden, cl::init(false));
+static cl::opt<bool> ClWithComdat("msan-with-comdat",
+ cl::desc("Place MSan constructors in comdat sections"),
+ cl::Hidden, cl::init(false));
static const char *const kMsanModuleCtorName = "msan.module_ctor";
static const char *const kMsanInitName = "__msan_init";
@@ -540,10 +543,14 @@ bool MemorySanitizer::doInitialization(Module &M) {
createSanitizerCtorAndInitFunctions(M, kMsanModuleCtorName, kMsanInitName,
/*InitArgTypes=*/{},
/*InitArgs=*/{});
- Comdat *MsanCtorComdat = M.getOrInsertComdat(kMsanModuleCtorName);
- MsanCtorFunction->setComdat(MsanCtorComdat);
+ if (ClWithComdat) {
+ Comdat *MsanCtorComdat = M.getOrInsertComdat(kMsanModuleCtorName);
+ MsanCtorFunction->setComdat(MsanCtorComdat);
+ appendToGlobalCtors(M, MsanCtorFunction, 0, MsanCtorFunction);
+ } else {
+ appendToGlobalCtors(M, MsanCtorFunction, 0);
+ }
- appendToGlobalCtors(M, MsanCtorFunction, 0, MsanCtorFunction);
if (TrackOrigins)
new GlobalVariable(M, IRB.getInt32Ty(), true, GlobalValue::WeakODRLinkage,
diff --git a/llvm/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll b/llvm/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll
index fb4f5c59797..8e0ab268301 100644
--- a/llvm/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll
+++ b/llvm/test/Instrumentation/MemorySanitizer/global_ctors_2to3.ll
@@ -1,5 +1,5 @@
; MSan converts 2-element global_ctors to 3-element when adding the new entry.
-; RUN: opt < %s -msan -S | FileCheck %s
+; RUN: opt < %s -msan -msan-with-comdat -S | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
diff --git a/llvm/test/Instrumentation/MemorySanitizer/msan_basic.ll b/llvm/test/Instrumentation/MemorySanitizer/msan_basic.ll
index 10a56d6c60a..014c19c71cb 100644
--- a/llvm/test/Instrumentation/MemorySanitizer/msan_basic.ll
+++ b/llvm/test/Instrumentation/MemorySanitizer/msan_basic.ll
@@ -4,8 +4,7 @@
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
-; CHECK: $msan.module_ctor = comdat any
-; CHECK: @llvm.global_ctors {{.*}} { i32 0, void ()* @msan.module_ctor, i8* bitcast (void ()* @msan.module_ctor to i8*) }
+; CHECK: @llvm.global_ctors {{.*}} { i32 0, void ()* @msan.module_ctor, i8* null }
; Check the presence and the linkage type of __msan_track_origins and
; other interface symbols.
@@ -982,5 +981,5 @@ define i8* @MismatchingCallMustTailCall(i32 %a) sanitize_memory {
; CHECK-NEXT: ret i8*
-; CHECK-LABEL: define internal void @msan.module_ctor() comdat {
+; CHECK-LABEL: define internal void @msan.module_ctor() {
; CHECK: call void @__msan_init()
OpenPOWER on IntegriCloud