|
@@ -1015,11 +1015,22 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
|
|
|
|
|
|
// Register callbacks to schedule sanitizer passes at the appropriate part of
|
|
|
// the pipeline.
|
|
|
+ // FIXME: either handle asan/the remaining sanitizers or error out
|
|
|
if (LangOpts.Sanitize.has(SanitizerKind::LocalBounds))
|
|
|
PB.registerScalarOptimizerLateEPCallback(
|
|
|
[](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
|
|
FPM.addPass(BoundsCheckingPass());
|
|
|
});
|
|
|
+ if (LangOpts.Sanitize.has(SanitizerKind::Memory))
|
|
|
+ PB.registerOptimizerLastEPCallback(
|
|
|
+ [](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
|
|
+ FPM.addPass(MemorySanitizerPass());
|
|
|
+ });
|
|
|
+ if (LangOpts.Sanitize.has(SanitizerKind::Thread))
|
|
|
+ PB.registerOptimizerLastEPCallback(
|
|
|
+ [](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
|
|
+ FPM.addPass(ThreadSanitizerPass());
|
|
|
+ });
|
|
|
if (Optional<GCOVOptions> Options = getGCOVOptions(CodeGenOpts))
|
|
|
PB.registerPipelineStartEPCallback([Options](ModulePassManager &MPM) {
|
|
|
MPM.addPass(GCOVProfilerPass(*Options));
|