|
@@ -130,6 +130,16 @@ public:
|
|
|
return strcmp(SM.getBufferName(SM.getSpellingLoc(Loc)), "<built-in>") == 0;
|
|
|
}
|
|
|
|
|
|
+ /// \brief Check whether \c Loc is included or expanded from \c Parent.
|
|
|
+ bool isNestedIn(SourceLocation Loc, FileID Parent) {
|
|
|
+ do {
|
|
|
+ Loc = getIncludeOrExpansionLoc(Loc);
|
|
|
+ if (Loc.isInvalid())
|
|
|
+ return false;
|
|
|
+ } while (!SM.isInFileID(Loc, Parent));
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
/// \brief Get the start of \c S ignoring macro arguments and builtin macros.
|
|
|
SourceLocation getStart(const Stmt *S) {
|
|
|
SourceLocation Loc = S->getLocStart();
|
|
@@ -310,7 +320,27 @@ struct EmptyCoverageMappingBuilder : public CoverageMappingBuilder {
|
|
|
if (!D->hasBody())
|
|
|
return;
|
|
|
auto Body = D->getBody();
|
|
|
- SourceRegions.emplace_back(Counter(), getStart(Body), getEnd(Body));
|
|
|
+ SourceLocation Start = getStart(Body);
|
|
|
+ SourceLocation End = getEnd(Body);
|
|
|
+ if (!SM.isWrittenInSameFile(Start, End)) {
|
|
|
+ // Walk up to find the common ancestor.
|
|
|
+ // Correct the locations accordingly.
|
|
|
+ FileID StartFileID = SM.getFileID(Start);
|
|
|
+ FileID EndFileID = SM.getFileID(End);
|
|
|
+ while (StartFileID != EndFileID && !isNestedIn(End, StartFileID)) {
|
|
|
+ Start = getIncludeOrExpansionLoc(Start);
|
|
|
+ assert(Start.isValid() &&
|
|
|
+ "Declaration start location not nested within a known region");
|
|
|
+ StartFileID = SM.getFileID(Start);
|
|
|
+ }
|
|
|
+ while (StartFileID != EndFileID) {
|
|
|
+ End = getPreciseTokenLocEnd(getIncludeOrExpansionLoc(End));
|
|
|
+ assert(End.isValid() &&
|
|
|
+ "Declaration end location not nested within a known region");
|
|
|
+ EndFileID = SM.getFileID(End);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ SourceRegions.emplace_back(Counter(), Start, End);
|
|
|
}
|
|
|
|
|
|
/// \brief Write the mapping data to the output stream
|
|
@@ -471,16 +501,6 @@ struct CounterCoverageMappingBuilder
|
|
|
MostRecentLocation = getIncludeOrExpansionLoc(MostRecentLocation);
|
|
|
}
|
|
|
|
|
|
- /// \brief Check whether \c Loc is included or expanded from \c Parent.
|
|
|
- bool isNestedIn(SourceLocation Loc, FileID Parent) {
|
|
|
- do {
|
|
|
- Loc = getIncludeOrExpansionLoc(Loc);
|
|
|
- if (Loc.isInvalid())
|
|
|
- return false;
|
|
|
- } while (!SM.isInFileID(Loc, Parent));
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
/// \brief Adjust regions and state when \c NewLoc exits a file.
|
|
|
///
|
|
|
/// If moving from our most recently tracked location to \c NewLoc exits any
|