diff options
author | Matt Morehouse <mascasa@google.com> | 2019-01-15 21:21:01 +0000 |
---|---|---|
committer | Matt Morehouse <mascasa@google.com> | 2019-01-15 21:21:01 +0000 |
commit | abd139f2e6439f59c511afbbe3ce27d80025db0f (patch) | |
tree | f1ecb04a9ccd3a60c94255a735fca6f4b801a525 | |
parent | 5c2d7386350aea9843bec15e179827e8beebebec (diff) |
[SanitizerCoverage] Don't create comdat for interposable functions.
Summary:
Comdat groups override weak symbol behavior, allowing the linker to keep
the comdats for weak symbols in favor of comdats for strong symbols.
Fixes the issue described in:
https://bugs.chromium.org/p/chromium/issues/detail?id=918662
Reviewers: eugenis, pcc, rnk
Reviewed By: pcc, rnk
Subscribers: smeenai, rnk, bd1976llvm, hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D56516
-rw-r--r-- | llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Instrumentation/SanitizerCoverage/interposable-symbol-nocomdat.ll | 37 |
2 files changed, 38 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index 729197fcefd..0ba8d5765e8 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -568,7 +568,7 @@ GlobalVariable *SanitizerCoverageModule::CreateFunctionLocalArrayInSection( *CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage, Constant::getNullValue(ArrayTy), "__sancov_gen_"); - if (TargetTriple.supportsCOMDAT()) + if (TargetTriple.supportsCOMDAT() && !F.isInterposable()) if (auto Comdat = GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId)) Array->setComdat(Comdat); diff --git a/llvm/test/Instrumentation/SanitizerCoverage/interposable-symbol-nocomdat.ll b/llvm/test/Instrumentation/SanitizerCoverage/interposable-symbol-nocomdat.ll new file mode 100644 index 00000000000..c79a2fb5fff --- /dev/null +++ b/llvm/test/Instrumentation/SanitizerCoverage/interposable-symbol-nocomdat.ll @@ -0,0 +1,37 @@ +; Test that interposable symbols do not get put in comdats. +; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -mtriple x86_64-linux-gnu -S | FileCheck %s +; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -mtriple x86_64-windows-msvc -S | FileCheck %s + +define void @Vanilla() { +entry: + ret void +} + +define linkonce void @LinkOnce() { +entry: + ret void +} + +define weak void @Weak() { +entry: + ret void +} + +declare extern_weak void @ExternWeak() + +define linkonce_odr void @LinkOnceOdr() { +entry: + ret void +} + +define weak_odr void @WeakOdr() { +entry: + ret void +} + +; CHECK: define void @Vanilla() comdat { +; CHECK: define linkonce void @LinkOnce() { +; CHECK: define weak void @Weak() { +; CHECK: declare extern_weak void @ExternWeak() +; CHECK: define linkonce_odr void @LinkOnceOdr() comdat { +; CHECK: define weak_odr void @WeakOdr() comdat { |