From dd5c7f9313ca9b1ec9c4f49c1af03d2835f02ac1 Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Thu, 14 Jul 2016 17:59:01 +0000 Subject: [PATCH] [sanitizer-coverage] make sure that calls to __sanitizer_cov_trace_pc are not merged (otherwise different calls get the same PC and confuse fuzzers) llvm-svn: 275449 --- llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp | 3 ++- llvm/test/Instrumentation/SanitizerCoverage/coverage.ll | 15 ++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp index 1315e19..7d40447 100644 --- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp +++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp @@ -544,7 +544,8 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F, BasicBlock &BB, Type *Int32PtrTy = PointerType::getUnqual(IRB.getInt32Ty()); GuardP = IRB.CreateIntToPtr(GuardP, Int32PtrTy); if (Options.TracePC) { - IRB.CreateCall(SanCovTracePC); + IRB.CreateCall(SanCovTracePC); // gets the PC using GET_CALLER_PC. + IRB.CreateCall(EmptyAsm, {}); // Avoids callback merge. } else if (Options.TraceBB) { IRB.CreateCall(IsEntryBB ? SanCovTraceEnter : SanCovTraceBB, GuardP); } else if (UseCalls) { diff --git a/llvm/test/Instrumentation/SanitizerCoverage/coverage.ll b/llvm/test/Instrumentation/SanitizerCoverage/coverage.ll index 4991d62..eb66709 100644 --- a/llvm/test/Instrumentation/SanitizerCoverage/coverage.ll +++ b/llvm/test/Instrumentation/SanitizerCoverage/coverage.ll @@ -6,7 +6,7 @@ ; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=1 -S | FileCheck %s --check-prefix=CHECK_WITH_CHECK ; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-block-threshold=10 -S | FileCheck %s --check-prefix=CHECK3 ; RUN: opt < %s -sancov -sanitizer-coverage-level=4 -S | FileCheck %s --check-prefix=CHECK4 -; RUN: opt < %s -sancov -sanitizer-coverage-level=4 -sanitizer-coverage-trace-pc -S | FileCheck %s --check-prefix=CHECK_TRACE_PC_INDIR +; RUN: opt < %s -sancov -sanitizer-coverage-level=4 -sanitizer-coverage-trace-pc -S | FileCheck %s --check-prefix=CHECK_TRACE_PC ; RUN: opt < %s -sancov -sanitizer-coverage-level=3 -sanitizer-coverage-8bit-counters=1 -S | FileCheck %s --check-prefix=CHECK-8BIT ; RUN: opt < %s -sancov -sanitizer-coverage-level=2 -sanitizer-coverage-block-threshold=10 \ @@ -120,10 +120,15 @@ entry: ; CHECK4-NOT: call void @__sanitizer_cov_indir_call16({{.*}},[[CACHE]]) ; CHECK4: ret void -; CHECK_TRACE_PC_INDIR-LABEL: define void @CallViaVptr -; CHECK_TRACE_PC_INDIR: call void @__sanitizer_cov_trace_pc_indir -; CHECK_TRACE_PC_INDIR: call void @__sanitizer_cov_trace_pc_indir -; CHECK_TRACE_PC_INDIR: ret void +; CHECK_TRACE_PC-LABEL: define void @foo +; CHECK_TRACE_PC: call void @__sanitizer_cov_trace_pc +; CHECK_TRACE_PC: call void asm sideeffect "", ""() +; CHECK_TRACE_PC: ret void + +; CHECK_TRACE_PC-LABEL: define void @CallViaVptr +; CHECK_TRACE_PC: call void @__sanitizer_cov_trace_pc_indir +; CHECK_TRACE_PC: call void @__sanitizer_cov_trace_pc_indir +; CHECK_TRACE_PC: ret void define void @call_unreachable() uwtable sanitize_address { entry: -- 2.7.4