From f3509fceef370bbd35e0b69f8204835fe10f33e4 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Tue, 5 May 2015 21:46:14 +0000 Subject: [PATCH] InstrProf: Don't start or end coverage regions inside of system macros It doesn't make much sense to try to show coverage inside system macros, and source locations in builtins confuses the coverage mapping. Just avoid doing this. Fixes an assert that fired when a __block storage specifier starts a region. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236547 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CoverageMappingGen.cpp | 8 ++++---- test/CoverageMapping/block-storage-starts-region.m | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 test/CoverageMapping/block-storage-starts-region.m diff --git a/lib/CodeGen/CoverageMappingGen.cpp b/lib/CodeGen/CoverageMappingGen.cpp index fca17264e8..65415d9d2d 100644 --- a/lib/CodeGen/CoverageMappingGen.cpp +++ b/lib/CodeGen/CoverageMappingGen.cpp @@ -134,18 +134,18 @@ public: : SM.getIncludeLoc(SM.getFileID(Loc)); } - /// \brief Get the start of \c S ignoring macro argument locations. + /// \brief Get the start of \c S ignoring macro arguments and system macros. SourceLocation getStart(const Stmt *S) { SourceLocation Loc = S->getLocStart(); - while (SM.isMacroArgExpansion(Loc)) + while (SM.isMacroArgExpansion(Loc) || SM.isInSystemMacro(Loc)) Loc = SM.getImmediateExpansionRange(Loc).first; return Loc; } - /// \brief Get the end of \c S ignoring macro argument locations. + /// \brief Get the end of \c S ignoring macro arguments and system macros. SourceLocation getEnd(const Stmt *S) { SourceLocation Loc = S->getLocEnd(); - while (SM.isMacroArgExpansion(Loc)) + while (SM.isMacroArgExpansion(Loc) || SM.isInSystemMacro(Loc)) Loc = SM.getImmediateExpansionRange(Loc).first; return getPreciseTokenLocEnd(Loc); } diff --git a/test/CoverageMapping/block-storage-starts-region.m b/test/CoverageMapping/block-storage-starts-region.m new file mode 100644 index 0000000000..7997c8d4d2 --- /dev/null +++ b/test/CoverageMapping/block-storage-starts-region.m @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -fprofile-instr-generate -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -triple x86_64-apple-darwin -fobjc-runtime=macosx-10.10.0 -fblocks -fobjc-arc %s | FileCheck %s + +@interface Foo +@end + +// CHECK-LABEL: doSomething: +void doSomething() { // CHECK: File 0, [[@LINE]]:20 -> {{[0-9:]+}} = #0 + return; + __block Foo *f; // CHECK: File 0, [[@LINE]]:3 -> {{[0-9:]+}} = 0 +} + +int main() {} -- 2.50.1