summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CoverageMappingGen.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/CodeGen/CoverageMappingGen.cpp')
-rw-r--r--clang/lib/CodeGen/CoverageMappingGen.cpp43
1 files changed, 31 insertions, 12 deletions
diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp
index 984ae9cc176..b7cbd33a3b9 100644
--- a/clang/lib/CodeGen/CoverageMappingGen.cpp
+++ b/clang/lib/CodeGen/CoverageMappingGen.cpp
@@ -32,7 +32,8 @@ void CoverageSourceInfo::SourceRangeSkipped(SourceRange Range) {
namespace {
/// \brief A region of source code that can be mapped to a counter.
-struct SourceMappingRegion {
+class SourceMappingRegion {
+public:
enum RegionFlags {
/// \brief This region won't be emitted if it wasn't extended.
/// This is useful so that we won't emit source ranges for single tokens
@@ -41,6 +42,7 @@ struct SourceMappingRegion {
IgnoreIfNotExtended = 0x0001,
};
+private:
FileID File, MacroArgumentFile;
Counter Count;
@@ -69,6 +71,7 @@ struct SourceMappingRegion {
SourceLocation LocEnd, AlternativeLocEnd;
unsigned Flags;
+public:
SourceMappingRegion(FileID File, FileID MacroArgumentFile, Counter Count,
const Stmt *UnreachableInitiator, const Stmt *Group,
SourceLocation LocStart, SourceLocation LocEnd,
@@ -78,6 +81,18 @@ struct SourceMappingRegion {
LocStart(LocStart), LocEnd(LocEnd), AlternativeLocEnd(LocStart),
Flags(Flags) {}
+ const FileID &getFile() const { return File; }
+
+ const Counter &getCounter() const { return Count; }
+
+ const SourceLocation &getStartLoc() const { return LocStart; }
+
+ const SourceLocation &getEndLoc(const SourceManager &SM) const {
+ if (SM.getFileID(LocEnd) != File)
+ return AlternativeLocEnd;
+ return LocEnd;
+ }
+
bool hasFlag(RegionFlags Flag) const { return (Flags & Flag) != 0; }
void setFlag(RegionFlags Flag) { Flags |= Flag; }
@@ -91,6 +106,14 @@ struct SourceMappingRegion {
Group == R.Group;
}
+ bool isMergeable(FileID File, FileID MacroArgumentFile, Counter Count,
+ const Stmt *UnreachableInitiator, const Stmt *Group) {
+ return this->File == File && this->MacroArgumentFile == MacroArgumentFile &&
+ this->Count == Count &&
+ this->UnreachableInitiator == UnreachableInitiator &&
+ this->Group == Group;
+ }
+
/// \brief Merge two regions by extending the 'this' region to cover the
/// given region.
void mergeByExtendingTo(SourceMappingRegion &R) {
@@ -312,10 +335,8 @@ public:
const Stmt *SourceGroup) {
for (size_t I = SourceRegions.size(); I != 0;) {
--I;
- if (SourceRegions[I].Count == Count && SourceRegions[I].File == File &&
- SourceRegions[I].MacroArgumentFile == MacroArgumentFile &&
- SourceRegions[I].UnreachableInitiator == UnreachableInitiator &&
- SourceRegions[I].Group == SourceGroup) {
+ if (SourceRegions[I].isMergeable(File, MacroArgumentFile, Count,
+ UnreachableInitiator, SourceGroup)) {
if (I != SourceRegions.size() - 1)
std::swap(SourceRegions[I], SourceRegions.back());
return;
@@ -379,10 +400,8 @@ public:
/// source regions.
void emitSourceRegions() {
for (const auto &R : SourceRegions) {
- SourceLocation LocStart = R.LocStart;
- SourceLocation LocEnd = R.LocEnd;
- if (SM.getFileID(LocEnd) != R.File)
- LocEnd = R.AlternativeLocEnd;
+ SourceLocation LocStart = R.getStartLoc();
+ SourceLocation LocEnd = R.getEndLoc(SM);
if (R.hasFlag(SourceMappingRegion::IgnoreIfNotExtended) &&
LocStart == LocEnd)
@@ -394,14 +413,14 @@ public:
unsigned LineEnd = SM.getSpellingLineNumber(LocEnd);
unsigned ColumnEnd = SM.getSpellingColumnNumber(LocEnd);
- auto SpellingFile = SM.getDecomposedSpellingLoc(R.LocStart).first;
+ auto SpellingFile = SM.getDecomposedSpellingLoc(LocStart).first;
unsigned CovFileID;
- if (getCoverageFileID(R.LocStart, R.File, SpellingFile, CovFileID))
+ if (getCoverageFileID(LocStart, R.getFile(), SpellingFile, CovFileID))
continue;
assert(LineStart <= LineEnd);
MappingRegions.push_back(CounterMappingRegion(
- R.Count, CovFileID, LineStart, ColumnStart, LineEnd, ColumnEnd,
+ R.getCounter(), CovFileID, LineStart, ColumnStart, LineEnd, ColumnEnd,
false, CounterMappingRegion::CodeRegion));
}
}
OpenPOWER on IntegriCloud