From 293a0c4d8d42bbfd7fad1303a0b632e906c3435f Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Wed, 25 Mar 2015 04:13:49 +0000 Subject: [PATCH] InstrProf: Handle whitespace and comments at the ends of macros When we try to find the end loc for a token, we have to re-lex the token. This was running into a problem when we'd store the end loc of a macro's coverage region, since we wouldn't actually be at the beginning of a token when we tried to re-lex it, leading us to do silly things (and eventually assert) when whitespace or comments followed. This pushes our use of getPreciseTokenLocEnd earlier, so that we won't call it when it doesn't make sense to. It also removes an unnecessary adjustment by 1 that was working around this problem in some cases. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@233169 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CoverageMappingGen.cpp | 8 ++++---- test/CoverageMapping/comment-in-macro.c | 11 +++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 test/CoverageMapping/comment-in-macro.c diff --git a/lib/CodeGen/CoverageMappingGen.cpp b/lib/CodeGen/CoverageMappingGen.cpp index 55e7334acc..07db6c74d1 100644 --- a/lib/CodeGen/CoverageMappingGen.cpp +++ b/lib/CodeGen/CoverageMappingGen.cpp @@ -124,7 +124,7 @@ public: SourceLocation getEndOfFileOrMacro(SourceLocation Loc) { if (Loc.isMacroID()) return Loc.getLocWithOffset(SM.getFileIDSize(SM.getFileID(Loc)) - - SM.getFileOffset(Loc) - 1); + SM.getFileOffset(Loc)); return SM.getLocForEndOfFile(SM.getFileID(Loc)); } @@ -147,7 +147,7 @@ public: SourceLocation Loc = S->getLocEnd(); while (SM.isMacroArgExpansion(Loc)) Loc = SM.getImmediateExpansionRange(Loc).first; - return Loc; + return getPreciseTokenLocEnd(Loc); } /// \brief Find the set of files we have regions for and assign IDs @@ -257,7 +257,7 @@ public: if (!CovFileID) continue; - SourceLocation LocEnd = getPreciseTokenLocEnd(Region.getEndLoc()); + SourceLocation LocEnd = Region.getEndLoc(); assert(SM.isWrittenInSameFile(LocStart, LocEnd) && "region spans multiple files"); @@ -407,7 +407,7 @@ struct CounterCoverageMappingBuilder SourceRegions.emplace_back(Region.getCounter(), NestedLoc, EndLoc); - EndLoc = getIncludeOrExpansionLoc(EndLoc); + EndLoc = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(EndLoc)); assert(!EndLoc.isInvalid() && "File exit was not handled before popRegions"); } diff --git a/test/CoverageMapping/comment-in-macro.c b/test/CoverageMapping/comment-in-macro.c new file mode 100644 index 0000000000..ecc883f68e --- /dev/null +++ b/test/CoverageMapping/comment-in-macro.c @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -fprofile-instr-generate -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only %s | FileCheck %s + +#define x1 "" // ... +#define x2 return 0 +// CHECK: main +int main() { // CHECK-NEXT: File 0, [[@LINE]]:12 -> [[@LINE+3]]:2 = #0 + x1; // CHECK-NEXT: Expansion,File 0, [[@LINE]]:3 -> [[@LINE]]:5 = #0 + x2; // CHECK-NEXT: Expansion,File 0, [[@LINE]]:3 -> [[@LINE]]:5 = #0 +} +// CHECK-NEXT: File 1, 3:12 -> 3:14 = #0 +// CHECK-NEXT: File 2, 4:12 -> 4:20 = #0 -- 2.40.0