Index: lib/CodeGen/BackendUtil.cpp =================================================================== --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -27,6 +27,7 @@ #include "llvm/CodeGen/RegAllocRegistry.h" #include "llvm/CodeGen/SchedulerRegistry.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" +#include "llvm/IR/AddressSanitizerPass.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/IRPrintingPasses.h" #include "llvm/IR/LegacyPassManager.h" @@ -1019,6 +1020,11 @@ CodeGenOpts.DebugPassManager); } } + + if (LangOpts.Sanitize.has(SanitizerKind::Address)) { + MPM.addPass(createModuleToFunctionPassAdaptor(AddressSanitizerPass())); + MPM.addPass(AddressSanitizerModulePass()); + } } // FIXME: We still use the legacy pass manager to do code generation. We Index: test/CodeGen/asan-new-pm.ll =================================================================== --- /dev/null +++ test/CodeGen/asan-new-pm.ll @@ -0,0 +1,31 @@ +; RUN: %clang_cc1 -S -emit-llvm -o - -fexperimental-new-pass-manager -fsanitize=address %s | FileCheck %s + +; CHECK: @llvm.global_ctors = {{.*}}@asan.module_ctor + +define i32 @test_load(i32* %a) sanitize_address { +entry: +; CHECK: %0 = ptrtoint i32* %a to i64 +; CHECK: %1 = lshr i64 %0, 3 +; CHECK: %2 = add i64 %1, 2147450880 +; CHECK: %3 = inttoptr i64 %2 to i8* +; CHECK: %4 = load i8, i8* %3 +; CHECK: %5 = icmp ne i8 %4, 0 +; CHECK: br i1 %5, label %6, label %12, !prof !0 + +; CHECK:;