diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -931,22 +931,34 @@ const Triple &TargetTriple, const LangOptions &LangOpts, const CodeGenOptions &CodeGenOpts) { - if (LangOpts.Sanitize.has(SanitizerKind::Address)) { + auto ASanPass = [&](SanitizerMask Mask, bool CompileKernel) { MPM.addPass(RequireAnalysisPass()); - bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::Address); - MPM.addPass(createModuleToFunctionPassAdaptor( - AddressSanitizerPass(/*CompileKernel=*/false, Recover, - CodeGenOpts.SanitizeAddressUseAfterScope))); + bool Recover = CodeGenOpts.SanitizeRecover.has(Mask); + MPM.addPass(createModuleToFunctionPassAdaptor(AddressSanitizerPass( + CompileKernel, Recover, CodeGenOpts.SanitizeAddressUseAfterScope))); bool ModuleUseAfterScope = asanUseGlobalsGC(TargetTriple, CodeGenOpts); - MPM.addPass(ModuleAddressSanitizerPass( - /*CompileKernel=*/false, Recover, ModuleUseAfterScope, - CodeGenOpts.SanitizeAddressUseOdrIndicator)); + MPM.addPass( + ModuleAddressSanitizerPass(CompileKernel, Recover, ModuleUseAfterScope, + CodeGenOpts.SanitizeAddressUseOdrIndicator)); + }; + + if (LangOpts.Sanitize.has(SanitizerKind::Address)) { + ASanPass(SanitizerKind::Address, /*CompileKernel=*/false); + } + + if (LangOpts.Sanitize.has(SanitizerKind::KernelAddress)) { + ASanPass(SanitizerKind::KernelAddress, /*CompileKernel=*/true); } if (LangOpts.Sanitize.has(SanitizerKind::Memory)) { MPM.addPass(createModuleToFunctionPassAdaptor(MemorySanitizerPass({}))); } + if (LangOpts.Sanitize.has(SanitizerKind::KernelMemory)) { + MPM.addPass(createModuleToFunctionPassAdaptor( + MemorySanitizerPass({0, false, /*Kernel=*/true}))); + } + if (LangOpts.Sanitize.has(SanitizerKind::Thread)) { MPM.addPass(createModuleToFunctionPassAdaptor(ThreadSanitizerPass())); } diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -83,7 +83,8 @@ MODULE_PASS("synthetic-counts-propagation", SyntheticCountsPropagation()) MODULE_PASS("wholeprogramdevirt", WholeProgramDevirtPass(nullptr, nullptr)) MODULE_PASS("verify", VerifierPass()) -MODULE_PASS("asan-module", ModuleAddressSanitizerPass(false, false, true, false)) +MODULE_PASS("asan-module", ModuleAddressSanitizerPass(/*CompileKernel=*/false, false, true, false)) +MODULE_PASS("kasan-module", ModuleAddressSanitizerPass(/*CompileKernel=*/true, false, true, false)) #undef MODULE_PASS #ifndef CGSCC_ANALYSIS @@ -237,6 +238,8 @@ FUNCTION_PASS("asan", AddressSanitizerPass(false, false, false)) FUNCTION_PASS("msan", MemorySanitizerPass({})) FUNCTION_PASS("tsan", ThreadSanitizerPass()) +FUNCTION_PASS("kasan", AddressSanitizerPass(true, false, false)) +FUNCTION_PASS("kmsan", MemorySanitizerPass({0, false, /*Kernel=*/true})) #undef FUNCTION_PASS #ifndef FUNCTION_PASS_WITH_PARAMS