[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

llvm-svn: 351247
This commit is contained in:
Matt Morehouse 2019-01-15 21:21:01 +00:00
parent 4a22fb18c7
commit 19ff35c481
2 changed files with 38 additions and 1 deletions

View File

@ -568,7 +568,7 @@ GlobalVariable *SanitizerCoverageModule::CreateFunctionLocalArrayInSection(
*CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage, *CurModule, ArrayTy, false, GlobalVariable::PrivateLinkage,
Constant::getNullValue(ArrayTy), "__sancov_gen_"); Constant::getNullValue(ArrayTy), "__sancov_gen_");
if (TargetTriple.supportsCOMDAT()) if (TargetTriple.supportsCOMDAT() && !F.isInterposable())
if (auto Comdat = if (auto Comdat =
GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId)) GetOrCreateFunctionComdat(F, TargetTriple, CurModuleUniqueId))
Array->setComdat(Comdat); Array->setComdat(Comdat);

View File

@ -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 {