forked from OSchip/llvm-project
[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:
parent
4a22fb18c7
commit
19ff35c481
|
@ -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);
|
||||||
|
|
|
@ -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 {
|
Loading…
Reference in New Issue