forked from OSchip/llvm-project
[HWAsan][NewPM] Handle hwasan like other sanitizers
Move it as an EP callback (-O[123]) or in addSanitizersAtO0. This makes it not run in ThinLTO pre-link (like the other sanitizers), so don't check LTO runs in hwasan-new-pm.c. Changing its position also seems to change the generated IR. I think we just need to make sure the pass runs. Reviewed By: leonardchan Differential Revision: https://reviews.llvm.org/D88936
This commit is contained in:
parent
97e7fbb343
commit
afff74e5c2
clang
|
@ -1070,6 +1070,16 @@ static void addSanitizersAtO0(ModulePassManager &MPM,
|
|||
ASanPass(SanitizerKind::KernelAddress, /*CompileKernel=*/true);
|
||||
}
|
||||
|
||||
if (LangOpts.Sanitize.has(SanitizerKind::HWAddress)) {
|
||||
bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::HWAddress);
|
||||
MPM.addPass(HWAddressSanitizerPass(
|
||||
/*CompileKernel=*/false, Recover));
|
||||
}
|
||||
if (LangOpts.Sanitize.has(SanitizerKind::KernelHWAddress)) {
|
||||
MPM.addPass(HWAddressSanitizerPass(
|
||||
/*CompileKernel=*/true, /*Recover=*/true));
|
||||
}
|
||||
|
||||
if (LangOpts.Sanitize.has(SanitizerKind::Memory)) {
|
||||
bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::Memory);
|
||||
int TrackOrigins = CodeGenOpts.SanitizeMemoryTrackOrigins;
|
||||
|
@ -1348,6 +1358,28 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
|
|||
/*CompileKernel=*/false, Recover, UseAfterScope)));
|
||||
});
|
||||
}
|
||||
|
||||
if (LangOpts.Sanitize.has(SanitizerKind::HWAddress)) {
|
||||
bool Recover =
|
||||
CodeGenOpts.SanitizeRecover.has(SanitizerKind::HWAddress);
|
||||
PB.registerOptimizerLastEPCallback(
|
||||
[Recover](ModulePassManager &MPM,
|
||||
PassBuilder::OptimizationLevel Level) {
|
||||
MPM.addPass(HWAddressSanitizerPass(
|
||||
/*CompileKernel=*/false, Recover));
|
||||
});
|
||||
}
|
||||
if (LangOpts.Sanitize.has(SanitizerKind::KernelHWAddress)) {
|
||||
bool Recover =
|
||||
CodeGenOpts.SanitizeRecover.has(SanitizerKind::KernelHWAddress);
|
||||
PB.registerOptimizerLastEPCallback(
|
||||
[Recover](ModulePassManager &MPM,
|
||||
PassBuilder::OptimizationLevel Level) {
|
||||
MPM.addPass(HWAddressSanitizerPass(
|
||||
/*CompileKernel=*/true, Recover));
|
||||
});
|
||||
}
|
||||
|
||||
if (Optional<GCOVOptions> Options = getGCOVOptions(CodeGenOpts, LangOpts))
|
||||
PB.registerPipelineStartEPCallback([Options](ModulePassManager &MPM) {
|
||||
MPM.addPass(GCOVProfilerPass(*Options));
|
||||
|
@ -1384,16 +1416,6 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
|
|||
MPM.addPass(ModuleMemProfilerPass());
|
||||
}
|
||||
|
||||
if (LangOpts.Sanitize.has(SanitizerKind::HWAddress)) {
|
||||
bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::HWAddress);
|
||||
MPM.addPass(HWAddressSanitizerPass(
|
||||
/*CompileKernel=*/false, Recover));
|
||||
}
|
||||
if (LangOpts.Sanitize.has(SanitizerKind::KernelHWAddress)) {
|
||||
MPM.addPass(HWAddressSanitizerPass(
|
||||
/*CompileKernel=*/true, /*Recover=*/true));
|
||||
}
|
||||
|
||||
if (CodeGenOpts.OptimizationLevel == 0) {
|
||||
// FIXME: the backends do not handle matrix intrinsics currently. Make
|
||||
// sure they are also lowered in O0. A lightweight version of the pass
|
||||
|
|
|
@ -1,34 +1,14 @@
|
|||
// Test that HWASan and KHWASan runs with the new pass manager.
|
||||
// We run them under different optimizations and LTOs to ensure the IR is still
|
||||
// We run them under different optimizations to ensure the IR is still
|
||||
// being instrumented properly.
|
||||
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=hwaddress %s | FileCheck %s --check-prefixes=CHECK,HWASAN,HWASAN-NOOPT
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=hwaddress -flto %s | FileCheck %s --check-prefixes=CHECK,HWASAN,HWASAN-NOOPT
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=hwaddress -flto=thin %s | FileCheck %s --check-prefixes=CHECK,HWASAN,HWASAN-NOOPT
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=hwaddress %s | FileCheck %s --check-prefixes=CHECK,HWASAN
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=hwaddress -flto %s | FileCheck %s --check-prefixes=CHECK,HWASAN
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=hwaddress -flto=thin %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=hwaddress %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=hwaddress %s | FileCheck %s
|
||||
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress %s | FileCheck %s --check-prefixes=CHECK,KHWASAN,KHWASAN-NOOPT
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress -flto %s | FileCheck %s --check-prefixes=CHECK,KHWASAN,KHWASAN-NOOPT
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress -flto=thin %s | FileCheck %s --check-prefixes=CHECK,KHWASAN,KHWASAN-NOOPT
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress %s | FileCheck %s --check-prefixes=CHECK,KHWASAN
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress -flto %s | FileCheck %s --check-prefixes=CHECK,KHWASAN
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress -flto=thin %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-linux-gnu -S -emit-llvm -o - -O1 -fexperimental-new-pass-manager -fsanitize=kernel-hwaddress %s | FileCheck %s
|
||||
|
||||
int foo(int *a) { return *a; }
|
||||
|
||||
// All the cases above mark the function with sanitize_hwaddress.
|
||||
// CHECK-DAG: sanitize_hwaddress
|
||||
|
||||
// Both sanitizers produce %hwasan.shadow without both thinlto and optimizations.
|
||||
// HWASAN-DAG: %hwasan.shadow
|
||||
// KHWASAN-DAG: %hwasan.shadow
|
||||
|
||||
// Both sanitizers produce __hwasan_tls without both thinlto and optimizations.
|
||||
// HWASAN-DAG: __hwasan_tls
|
||||
// KHWASAN-DAG: __hwasan_tls
|
||||
|
||||
// For unoptimized cases, both sanitizers produce different load functions.
|
||||
// HWASAN-NOOPT-DAG: __hwasan_loadN
|
||||
// KHWASAN-NOOPT-DAG: __hwasan_loadN_noabort
|
||||
// CHECK: sanitize_hwaddress
|
||||
|
|
Loading…
Reference in New Issue