[PATCH] Coverage mapping: Don't map implicit casts and modify "ignore if not extended" flag semantics
Justin Bogner
mail at justinbogner.com
Fri Aug 22 16:29:57 PDT 2014
Alex L <arphaman at gmail.com> writes:
> It's ensuring that macros like `define N 1024` don't create mapping regions
> when the integer literal
> is implicitly converted. It also makes sure that literals in ternary
> conditional create mapping regions
> - e.g. there will be a mapping region for 1 and 0 in `cond? 1 : 0` .
Thanks. Please explain that in the commit message when you commit. LGTM.
> 2014-08-20 23:49 GMT-07:00 Justin Bogner <mail at justinbogner.com>:
>
> Alex L <arphaman at gmail.com> writes:
> > These two patches remove the mapping for implicit cast expression and
> > modify the "ignore if not extended" flag to be "ignore if file only
> > has this region". I'm sending them out together as they both partially
> > influence a common testcase.
>
> Why? What is this accomplishing? As far as I can tell one of these
> patches removes a CHECK line and the other adds back the exact same
> check. I guess this changes how that particular construct is modelled?
> If so, it might be better to just make this one patch so it's clear that
> you're not removing functionality, but changing how it's done.
>
>
> diff --git a/lib/CodeGen/CoverageMappingGen.cpp b/lib/CodeGen/CoverageMappingGen.cpp
> index 1bfa7cd..0570cd0 100644
> --- a/lib/CodeGen/CoverageMappingGen.cpp
> +++ b/lib/CodeGen/CoverageMappingGen.cpp
> @@ -34,11 +34,12 @@ namespace {
> /// \brief A region of source code that can be mapped to a counter.
> struct SourceMappingRegion {
> enum RegionFlags {
> - /// \brief This region won't be emitted if it wasn't extended.
> + /// \brief This region won't be emitted if the "file" that contains this
> + /// region consists only of this region.
> /// This is useful so that we won't emit source ranges for single tokens
> /// that we don't really care that much about, like:
> /// the '(' token in #define MACRO (
> - IgnoreIfNotExtended = 0x0001,
> + IgnoreIfFileOnlyHasThisRegion = 0x0001,
> };
>
> FileID File, MacroArgumentFile;
> @@ -99,8 +100,8 @@ struct SourceMappingRegion {
> void mergeByExtendingTo(SourceMappingRegion &R) {
> LocEnd = R.LocEnd;
> AlternativeLocEnd = R.LocStart;
> - if (hasFlag(IgnoreIfNotExtended))
> - clearFlag(IgnoreIfNotExtended);
> + if (hasFlag(IgnoreIfFileOnlyHasThisRegion))
> + clearFlag(IgnoreIfFileOnlyHasThisRegion);
> }
> };
>
> @@ -381,14 +382,31 @@ public:
> /// \brief Generate the coverage counter mapping regions from collected
> /// source regions.
> void emitSourceRegions() {
> + struct FileRegionInfo {
> + bool HasMultipleRegions;
> +
> + FileRegionInfo() : HasMultipleRegions(false) {}
> + };
> +
> + llvm::SmallDenseMap<FileID, FileRegionInfo, 8> FileRegionInfoMapping;
> +
> + for (const auto &R : SourceRegions) {
> + auto It = FileRegionInfoMapping.find(R.File);
> + if (It == FileRegionInfoMapping.end()) {
> + FileRegionInfoMapping.insert(std::make_pair(R.File, FileRegionInfo()));
> + continue;
> + }
> + It->second.HasMultipleRegions = true;
> + }
> +
> for (const auto &R : SourceRegions) {
> SourceLocation LocStart = R.LocStart;
> SourceLocation LocEnd = R.LocEnd;
> if (SM.getFileID(LocEnd) != R.File)
> LocEnd = R.AlternativeLocEnd;
>
> - if (R.hasFlag(SourceMappingRegion::IgnoreIfNotExtended) &&
> - LocStart == LocEnd)
> + if (R.hasFlag(SourceMappingRegion::IgnoreIfFileOnlyHasThisRegion) &&
> + !FileRegionInfoMapping[R.File].HasMultipleRegions)
> continue;
>
> LocEnd = getPreciseTokenLocEnd(LocEnd);
> @@ -627,12 +645,13 @@ struct CounterCoverageMappingBuilder
> void mapToken(SourceLocation LocStart) {
> CoverageMappingBuilder::mapSourceCodeRange(
> LocStart, LocStart, CurrentRegionCount,
> - SourceMappingRegion::IgnoreIfNotExtended);
> + SourceMappingRegion::IgnoreIfFileOnlyHasThisRegion);
> }
>
> void mapToken(const SourceMappingState &State, SourceLocation LocStart) {
> CoverageMappingBuilder::mapSourceCodeRange(
> - State, LocStart, LocStart, SourceMappingRegion::IgnoreIfNotExtended);
> + State, LocStart, LocStart,
> + SourceMappingRegion::IgnoreIfFileOnlyHasThisRegion);
> }
>
> void VisitStmt(const Stmt *S) {
> @@ -1021,6 +1040,10 @@ struct CounterCoverageMappingBuilder
> Visit(E->getSubExpr());
> }
>
> + void VisitImplicitCastExpr(const ImplicitCastExpr *E) {
> + Visit(E->getSubExpr());
> + }
> +
> // Map literals as tokens so that the macros like #define PI 3.14
> // won't generate coverage mapping regions.
>
> diff --git a/test/CoverageMapping/casts.c b/test/CoverageMapping/casts.c
> index 94c13dc..ef08c19 100644
> --- a/test/CoverageMapping/casts.c
> +++ b/test/CoverageMapping/casts.c
> @@ -6,6 +6,13 @@ int main() { // CHECK: File 0,
> return 0;
> }
>
> +#define N 32
>
> + // CHECK: foo
> +void foo() { // CHECK-NEXT: File 0, [[@LINE]]:12 -> [[@LINE+4]]:2 = #0 (HasCodeBefore = 0)
> + char c = N;
> + if (0) { // CHECK-NEXT: File 0, [[@LINE]]:10 -> [[@LINE+1]]:4 = #1 (HasCodeBefore = 0)
> + }
> +}
>
>
> diff --git a/test/CoverageMapping/exprregions.c b/test/CoverageMapping/exprregions.c
> new file mode 100644
> index 0000000..c62cc07
> --- /dev/null
> +++ b/test/CoverageMapping/exprregions.c
> @@ -0,0 +1,8 @@
> +// RUN: %clang_cc1 -fprofile-instr-generate -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name exprregions.c %s | FileCheck %s
> +
> +int main() { // CHECK: File 0, [[@LINE]]:12 -> [[@LINE+5]]:2 = #0 (HasCodeBefore = 0)
> + int x = 0 ?
> + 1 : // CHECK-NEXT: File 0, [[@LINE]]:13 -> [[@LINE]]:14 = #1 (HasCodeBefore = 0)
> + 0; // CHECK-NEXT: File 0, [[@LINE]]:13 -> [[@LINE]]:14 = (#0 - #1) (HasCodeBefore = 0)
> + return 0;
> +}
More information about the cfe-commits
mailing list