From a2759327fdc80ab51e6706e0e3a92d0c23a066ca Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Fri, 11 May 2018 01:09:39 +0000 Subject: [PATCH] [sanitizer-coverage] don't instrument a function if it's entry block ends with 'unreachable' llvm-svn: 332072 --- .../Instrumentation/SanitizerCoverage.cpp | 2 ++ .../SanitizerCoverage/abort-in-entry-block.ll | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 llvm/test/Instrumentation/SanitizerCoverage/abort-in-entry-block.ll diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index 4f0abc6bb788..a19cd6d23325 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -480,6 +480,8 @@ bool SanitizerCoverageModule::runOnFunction(Function &F) { if (F.getName() == "__local_stdio_printf_options" || F.getName() == "__local_stdio_scanf_options") return false; + if (isa(F.getEntryBlock().getTerminator())) + return false; // Don't instrument functions using SEH for now. Splitting basic blocks like // we do for coverage breaks WinEHPrepare. // FIXME: Remove this when SEH no longer uses landingpad pattern matching. diff --git a/llvm/test/Instrumentation/SanitizerCoverage/abort-in-entry-block.ll b/llvm/test/Instrumentation/SanitizerCoverage/abort-in-entry-block.ll new file mode 100644 index 000000000000..9bc8acef481d --- /dev/null +++ b/llvm/test/Instrumentation/SanitizerCoverage/abort-in-entry-block.ll @@ -0,0 +1,17 @@ +; Checks that a function with no-return in the entry block is not instrumented. +; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-trace-pc-guard -S | FileCheck %s +; CHECK-NOT: call void @__sanitizer_cov_trace_pc_guard + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +define dso_local void @_Z3foov() noinline nounwind optnone uwtable { +entry: + call void @abort() noreturn nounwind + unreachable + +return: ; No predecessors! + ret void +} + +declare dso_local void @abort() noreturn nounwind