leonardchan updated this revision to Diff 169516. Repository: rC Clang
https://reviews.llvm.org/D52814 Files: lib/CodeGen/BackendUtil.cpp test/CodeGen/asan-new-pm.ll 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:; <label>:6: ; preds = %entry +; CHECK: %7 = and i64 %0, 7 +; CHECK: %8 = add i64 %7, 3 +; CHECK: %9 = trunc i64 %8 to i8 +; CHECK: %10 = icmp sge i8 %9, %4 +; CHECK: br i1 %10, label %11, label %12 + +; CHECK:; <label>:11: ; preds = %6 +; CHECK: call void @__asan_report_load4(i64 %0) +; CHECK: call void asm sideeffect "", ""() +; CHECK: unreachable + +; CHECK:; <label>:12: ; preds = %6, %entry + + %tmp1 = load i32, i32* %a, align 4 + ret i32 %tmp1 +} Index: lib/CodeGen/BackendUtil.cpp =================================================================== --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -52,6 +52,7 @@ #include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h" #include "llvm/Transforms/InstCombine/InstCombine.h" #include "llvm/Transforms/Instrumentation.h" +#include "llvm/Transforms/Instrumentation/AddressSanitizerPass.h" #include "llvm/Transforms/Instrumentation/BoundsChecking.h" #include "llvm/Transforms/Instrumentation/GCOVProfiler.h" #include "llvm/Transforms/ObjCARC.h" @@ -1022,6 +1023,16 @@ CodeGenOpts.DebugPassManager); } } + + if (LangOpts.Sanitize.has(SanitizerKind::Address)) { + bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::Address); + MPM.addPass(createModuleToFunctionPassAdaptor( + AddressSanitizerPass(/*CompileKernel=*/false, Recover, + CodeGenOpts.SanitizeAddressUseAfterScope))); + bool ModuleUseAfterScope = asanUseGlobalsGC(TargetTriple, CodeGenOpts); + MPM.addPass(AddressSanitizerPass(/*CompileKernel=*/false, Recover, + ModuleUseAfterScope)); + } } // 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:; <label>:6: ; preds = %entry +; CHECK: %7 = and i64 %0, 7 +; CHECK: %8 = add i64 %7, 3 +; CHECK: %9 = trunc i64 %8 to i8 +; CHECK: %10 = icmp sge i8 %9, %4 +; CHECK: br i1 %10, label %11, label %12 + +; CHECK:; <label>:11: ; preds = %6 +; CHECK: call void @__asan_report_load4(i64 %0) +; CHECK: call void asm sideeffect "", ""() +; CHECK: unreachable + +; CHECK:; <label>:12: ; preds = %6, %entry + + %tmp1 = load i32, i32* %a, align 4 + ret i32 %tmp1 +} Index: lib/CodeGen/BackendUtil.cpp =================================================================== --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -52,6 +52,7 @@ #include "llvm/Transforms/IPO/ThinLTOBitcodeWriter.h" #include "llvm/Transforms/InstCombine/InstCombine.h" #include "llvm/Transforms/Instrumentation.h" +#include "llvm/Transforms/Instrumentation/AddressSanitizerPass.h" #include "llvm/Transforms/Instrumentation/BoundsChecking.h" #include "llvm/Transforms/Instrumentation/GCOVProfiler.h" #include "llvm/Transforms/ObjCARC.h" @@ -1022,6 +1023,16 @@ CodeGenOpts.DebugPassManager); } } + + if (LangOpts.Sanitize.has(SanitizerKind::Address)) { + bool Recover = CodeGenOpts.SanitizeRecover.has(SanitizerKind::Address); + MPM.addPass(createModuleToFunctionPassAdaptor( + AddressSanitizerPass(/*CompileKernel=*/false, Recover, + CodeGenOpts.SanitizeAddressUseAfterScope))); + bool ModuleUseAfterScope = asanUseGlobalsGC(TargetTriple, CodeGenOpts); + MPM.addPass(AddressSanitizerPass(/*CompileKernel=*/false, Recover, + ModuleUseAfterScope)); + } } // FIXME: We still use the legacy pass manager to do code generation. We
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits