vitalybuka created this revision.
Herald added subscribers: steven_wu, hiraditya, inglorion.
vitalybuka requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.
Distributed ThinLTO has special case when backend fallback
to regular non-ThinLTO version. In that instrumentation must be
skipped as it's already applied by buildLTOPreLinkDefaultPipeline.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D96320
Files:
clang/lib/CodeGen/BackendUtil.cpp
clang/test/CodeGen/thinlto-distributed-backend-skip-sanitizer.ll
Index: clang/test/CodeGen/thinlto-distributed-backend-skip-sanitizer.ll
===================================================================
--- /dev/null
+++ clang/test/CodeGen/thinlto-distributed-backend-skip-sanitizer.ll
@@ -0,0 +1,109 @@
+; REQUIRES: x86-registered-target
+
+; Check that ThinLTO backend respects "SkipModuleByDistributedBackend"
+; flag which can be set by indexing.
+
+; RUN: opt -thinlto-bc -o %t.o %s
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fmemory-profile=/dev/null \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=memprof
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=local-bounds \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=trap
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize-coverage-type=1 \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=sanitizer_cov
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=address \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=kernel-address \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=hwaddress \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=kernel-hwaddress \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=thread \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=tsan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=memory \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=msan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=kernel-memory \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=msan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=dataflow \
+; RUN: -fthinlto-index=/dev/null \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=dfsan
+
+; Lagacy PM
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fmemory-profile=/dev/null \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=memprof
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=local-bounds \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=trap
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize-coverage-type=1 \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=sanitizer_cov
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=address \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=kernel-address \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=hwaddress \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=kernel-hwaddress \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=asan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=thread \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=tsan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=memory \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=msan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=kernel-memory \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=msan
+
+; RUN: %clang_cc1 -triple x86_64-grtev4-linux-gnu -fsanitize=dataflow \
+; RUN: -fthinlto-index=/dev/null -flegacy-pass-manager \
+; RUN: -emit-llvm -o - -x ir %t.o | FileCheck %s --implicit-check-not=dfsan
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-grtev4-linux-gnu"
+
+define void @test(i64 %i) sanitize_address sanitize_thread sanitize_hwaddress {
+; CHECK-LABEL: entry:
+entry:
+ %a = alloca [2 x i8], align 1
+ %0 = getelementptr inbounds [2 x i8], [2 x i8]* %a, i64 0, i64 0
+ %arrayidx = getelementptr inbounds [2 x i8], [2 x i8]* %a, i64 0, i64 %i
+ store i8 3, i8* %arrayidx, align 1
+; CHECK: ret
+ ret void
+}
\ No newline at end of file
Index: clang/lib/CodeGen/BackendUtil.cpp
===================================================================
--- clang/lib/CodeGen/BackendUtil.cpp
+++ clang/lib/CodeGen/BackendUtil.cpp
@@ -633,12 +633,13 @@
std::unique_ptr<TargetLibraryInfoImpl> TLII(
createTLII(TargetTriple, CodeGenOpts));
- // If we reached here with a non-empty index file name, then the index file
- // was empty and we are not performing ThinLTO backend compilation (used in
- // testing in a distributed build environment). Drop any the type test
- // assume sequences inserted for whole program vtables so that codegen doesn't
- // complain.
- if (!CodeGenOpts.ThinLTOIndexFile.empty())
+ // If we reached here with a non-empty index file name, then the index
+ // file was empty and we are not performing ThinLTO backend compilation
+ // (used in testing in a distributed build environment).
+ bool IsDistributedThinLTOTesting = !CodeGenOpts.ThinLTOIndexFile.empty();
+ // Drop any the type test assume sequences inserted for whole program
+ // vtables so that codegen doesn't complain.
+ if (IsDistributedThinLTOTesting)
MPM.add(createLowerTypeTestsPass(/*ExportSummary=*/nullptr,
/*ImportSummary=*/nullptr,
/*DropTypeTests=*/true));
@@ -702,83 +703,86 @@
if (LangOpts.Coroutines)
addCoroutinePassesToExtensionPoints(PMBuilder);
- if (!CodeGenOpts.MemoryProfileOutput.empty()) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addMemProfilerPasses);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addMemProfilerPasses);
- }
+ if (!IsDistributedThinLTOTesting) {
+ // IsDistributedThinLTOTesting instrumented on ThinLTOPreLink.
+ if (!CodeGenOpts.MemoryProfileOutput.empty()) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addMemProfilerPasses);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addMemProfilerPasses);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
- addBoundsCheckingPass);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addBoundsCheckingPass);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_ScalarOptimizerLate,
+ addBoundsCheckingPass);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addBoundsCheckingPass);
+ }
- if (CodeGenOpts.SanitizeCoverageType ||
- CodeGenOpts.SanitizeCoverageIndirectCalls ||
- CodeGenOpts.SanitizeCoverageTraceCmp) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addSanitizerCoveragePass);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addSanitizerCoveragePass);
- }
+ if (CodeGenOpts.SanitizeCoverageType ||
+ CodeGenOpts.SanitizeCoverageIndirectCalls ||
+ CodeGenOpts.SanitizeCoverageTraceCmp) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addSanitizerCoveragePass);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addSanitizerCoveragePass);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::Address)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addAddressSanitizerPasses);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addAddressSanitizerPasses);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::Address)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addAddressSanitizerPasses);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addAddressSanitizerPasses);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::KernelAddress)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addKernelAddressSanitizerPasses);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addKernelAddressSanitizerPasses);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::KernelAddress)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addKernelAddressSanitizerPasses);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addKernelAddressSanitizerPasses);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::HWAddress)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addHWAddressSanitizerPasses);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addHWAddressSanitizerPasses);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::HWAddress)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addHWAddressSanitizerPasses);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addHWAddressSanitizerPasses);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::KernelHWAddress)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addKernelHWAddressSanitizerPasses);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addKernelHWAddressSanitizerPasses);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::KernelHWAddress)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addKernelHWAddressSanitizerPasses);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addKernelHWAddressSanitizerPasses);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addMemorySanitizerPass);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addMemorySanitizerPass);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addMemorySanitizerPass);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addMemorySanitizerPass);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::KernelMemory)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addKernelMemorySanitizerPass);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addKernelMemorySanitizerPass);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::KernelMemory)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addKernelMemorySanitizerPass);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addKernelMemorySanitizerPass);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addThreadSanitizerPass);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addThreadSanitizerPass);
- }
+ if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addThreadSanitizerPass);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addThreadSanitizerPass);
+ }
- if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
- PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
- addDataFlowSanitizerPass);
- PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
- addDataFlowSanitizerPass);
+ if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
+ PMBuilder.addExtension(PassManagerBuilder::EP_OptimizerLast,
+ addDataFlowSanitizerPass);
+ PMBuilder.addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
+ addDataFlowSanitizerPass);
+ }
}
// Set up the per-function pass manager.
@@ -1222,10 +1226,11 @@
// If we reached here with a non-empty index file name, then the index
// file was empty and we are not performing ThinLTO backend compilation
- // (used in testing in a distributed build environment). Drop any the type
- // test assume sequences inserted for whole program vtables so that
- // codegen doesn't complain.
- if (!CodeGenOpts.ThinLTOIndexFile.empty())
+ // (used in testing in a distributed build environment).
+ bool IsDistributedThinLTOTesting = !CodeGenOpts.ThinLTOIndexFile.empty();
+ // Drop any the type test assume sequences inserted for whole program
+ // vtables so that codegen doesn't complain.
+ if (IsDistributedThinLTOTesting)
PB.registerPipelineStartEPCallback(
[](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
MPM.addPass(LowerTypeTestsPass(/*ExportSummary=*/nullptr,
@@ -1241,88 +1246,95 @@
});
}
- // Register callbacks to schedule sanitizer passes at the appropriate part
- // of the pipeline.
- if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
- PB.registerScalarOptimizerLateEPCallback(
- [](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
- FPM.addPass(BoundsCheckingPass());
- });
-
- if (CodeGenOpts.SanitizeCoverageType ||
- CodeGenOpts.SanitizeCoverageIndirectCalls ||
- CodeGenOpts.SanitizeCoverageTraceCmp) {
- PB.registerOptimizerLastEPCallback(
- [this](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
- auto SancovOpts = getSancovOptsFromCGOpts(CodeGenOpts);
- MPM.addPass(ModuleSanitizerCoveragePass(
- SancovOpts, CodeGenOpts.SanitizeCoverageAllowlistFiles,
- CodeGenOpts.SanitizeCoverageBlocklistFiles));
- });
- }
+ // IsDistributedThinLTOTesting instrumented on ThinLTOPreLink.
+ if (!IsDistributedThinLTOTesting) {
+ // Register callbacks to schedule sanitizer passes at the appropriate part
+ // of the pipeline.
+ if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
+ PB.registerScalarOptimizerLateEPCallback(
+ [](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
+ FPM.addPass(BoundsCheckingPass());
+ });
- if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
- int TrackOrigins = CodeGenOpts.SanitizeMemoryTrackOrigins;
- bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::Memory);
- PB.registerOptimizerLastEPCallback(
- [TrackOrigins, Recover](ModulePassManager &MPM,
- PassBuilder::OptimizationLevel Level) {
- MPM.addPass(MemorySanitizerPass({TrackOrigins, Recover, false}));
- MPM.addPass(createModuleToFunctionPassAdaptor(
- MemorySanitizerPass({TrackOrigins, Recover, false})));
- });
- }
- if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
- PB.registerOptimizerLastEPCallback(
- [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
- MPM.addPass(ThreadSanitizerPass());
- MPM.addPass(
- createModuleToFunctionPassAdaptor(ThreadSanitizerPass()));
- });
- }
+ if (CodeGenOpts.SanitizeCoverageType ||
+ CodeGenOpts.SanitizeCoverageIndirectCalls ||
+ CodeGenOpts.SanitizeCoverageTraceCmp) {
+ PB.registerOptimizerLastEPCallback(
+ [this](ModulePassManager &MPM,
+ PassBuilder::OptimizationLevel Level) {
+ auto SancovOpts = getSancovOptsFromCGOpts(CodeGenOpts);
+ MPM.addPass(ModuleSanitizerCoveragePass(
+ SancovOpts, CodeGenOpts.SanitizeCoverageAllowlistFiles,
+ CodeGenOpts.SanitizeCoverageBlocklistFiles));
+ });
+ }
- auto ASanPass = [&](SanitizerMask Mask, bool CompileKernel) {
- if (LangOpts.Sanitize.has(Mask)) {
- bool Recover = CodeGenOpts.SanitizeRecover.has(Mask);
- bool UseAfterScope = CodeGenOpts.SanitizeAddressUseAfterScope;
- bool ModuleUseAfterScope = asanUseGlobalsGC(TargetTriple, CodeGenOpts);
- bool UseOdrIndicator = CodeGenOpts.SanitizeAddressUseOdrIndicator;
+ if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
+ int TrackOrigins = CodeGenOpts.SanitizeMemoryTrackOrigins;
+ bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::Memory);
PB.registerOptimizerLastEPCallback(
- [CompileKernel, Recover, UseAfterScope, ModuleUseAfterScope,
- UseOdrIndicator](ModulePassManager &MPM,
- PassBuilder::OptimizationLevel Level) {
- MPM.addPass(
- RequireAnalysisPass<ASanGlobalsMetadataAnalysis, Module>());
- MPM.addPass(ModuleAddressSanitizerPass(CompileKernel, Recover,
- ModuleUseAfterScope,
- UseOdrIndicator));
+ [TrackOrigins, Recover](ModulePassManager &MPM,
+ PassBuilder::OptimizationLevel Level) {
+ MPM.addPass(MemorySanitizerPass({TrackOrigins, Recover, false}));
MPM.addPass(createModuleToFunctionPassAdaptor(
- AddressSanitizerPass(CompileKernel, Recover, UseAfterScope)));
+ MemorySanitizerPass({TrackOrigins, Recover, false})));
});
}
- };
- ASanPass(SanitizerKind::Address, false);
- ASanPass(SanitizerKind::KernelAddress, true);
-
- auto HWASanPass = [&](SanitizerMask Mask, bool CompileKernel) {
- if (LangOpts.Sanitize.has(Mask)) {
- bool Recover = CodeGenOpts.SanitizeRecover.has(Mask);
+ if (LangOpts.Sanitize.has(SanitizerKind::Thread)) {
PB.registerOptimizerLastEPCallback(
- [CompileKernel, Recover](ModulePassManager &MPM,
- PassBuilder::OptimizationLevel Level) {
- MPM.addPass(HWAddressSanitizerPass(CompileKernel, Recover));
+ [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
+ MPM.addPass(ThreadSanitizerPass());
+ MPM.addPass(
+ createModuleToFunctionPassAdaptor(ThreadSanitizerPass()));
});
}
- };
- HWASanPass(SanitizerKind::HWAddress, false);
- HWASanPass(SanitizerKind::KernelHWAddress, true);
- if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
- PB.registerOptimizerLastEPCallback(
- [this](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
- MPM.addPass(
- DataFlowSanitizerPass(LangOpts.SanitizerBlacklistFiles));
- });
+ auto ASanPass = [&](SanitizerMask Mask, bool CompileKernel) {
+ if (LangOpts.Sanitize.has(Mask)) {
+ bool Recover = CodeGenOpts.SanitizeRecover.has(Mask);
+ bool UseAfterScope = CodeGenOpts.SanitizeAddressUseAfterScope;
+ bool ModuleUseAfterScope =
+ asanUseGlobalsGC(TargetTriple, CodeGenOpts);
+ bool UseOdrIndicator = CodeGenOpts.SanitizeAddressUseOdrIndicator;
+ PB.registerOptimizerLastEPCallback(
+ [CompileKernel, Recover, UseAfterScope, ModuleUseAfterScope,
+ UseOdrIndicator](ModulePassManager &MPM,
+ PassBuilder::OptimizationLevel Level) {
+ MPM.addPass(
+ RequireAnalysisPass<ASanGlobalsMetadataAnalysis, Module>());
+ MPM.addPass(ModuleAddressSanitizerPass(CompileKernel, Recover,
+ ModuleUseAfterScope,
+ UseOdrIndicator));
+ MPM.addPass(
+ createModuleToFunctionPassAdaptor(AddressSanitizerPass(
+ CompileKernel, Recover, UseAfterScope)));
+ });
+ }
+ };
+ ASanPass(SanitizerKind::Address, false);
+ ASanPass(SanitizerKind::KernelAddress, true);
+
+ auto HWASanPass = [&](SanitizerMask Mask, bool CompileKernel) {
+ if (LangOpts.Sanitize.has(Mask)) {
+ bool Recover = CodeGenOpts.SanitizeRecover.has(Mask);
+ PB.registerOptimizerLastEPCallback(
+ [CompileKernel, Recover](ModulePassManager &MPM,
+ PassBuilder::OptimizationLevel Level) {
+ MPM.addPass(HWAddressSanitizerPass(CompileKernel, Recover));
+ });
+ }
+ };
+ HWASanPass(SanitizerKind::HWAddress, false);
+ HWASanPass(SanitizerKind::KernelHWAddress, true);
+
+ if (LangOpts.Sanitize.has(SanitizerKind::DataFlow)) {
+ PB.registerOptimizerLastEPCallback(
+ [this](ModulePassManager &MPM,
+ PassBuilder::OptimizationLevel Level) {
+ MPM.addPass(
+ DataFlowSanitizerPass(LangOpts.SanitizerBlacklistFiles));
+ });
+ }
}
if (Optional<GCOVOptions> Options = getGCOVOptions(CodeGenOpts, LangOpts))
@@ -1349,7 +1361,9 @@
MPM = PB.buildPerModuleDefaultPipeline(Level);
}
- if (!CodeGenOpts.MemoryProfileOutput.empty()) {
+ // IsDistributedThinLTOTesting instrumented on ThinLTOPreLink.
+ if (!IsDistributedThinLTOTesting &&
+ !CodeGenOpts.MemoryProfileOutput.empty()) {
MPM.addPass(createModuleToFunctionPassAdaptor(MemProfilerPass()));
MPM.addPass(ModuleMemProfilerPass());
}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits