forked from OSchip/llvm-project
Try to make the output of PlistDiagnostics more deterministic by sorting PathDiagnostics before they are emitted. Fixes <rdar://problem/7439668>.
llvm-svn: 90478
This commit is contained in:
parent
4313a9c56a
commit
a3536e23c8
|
@ -29,6 +29,40 @@ namespace clang {
|
||||||
class Preprocessor;
|
class Preprocessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
struct CompareDiagnostics {
|
||||||
|
// Compare if 'X' is "<" than 'Y'.
|
||||||
|
bool operator()(const PathDiagnostic *X, const PathDiagnostic *Y) const {
|
||||||
|
// First compare by location
|
||||||
|
const FullSourceLoc &XLoc = X->getLocation().asLocation();
|
||||||
|
const FullSourceLoc &YLoc = Y->getLocation().asLocation();
|
||||||
|
if (XLoc < YLoc)
|
||||||
|
return true;
|
||||||
|
if (XLoc != YLoc)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Next, compare by bug type.
|
||||||
|
llvm::StringRef XBugType = X->getBugType();
|
||||||
|
llvm::StringRef YBugType = Y->getBugType();
|
||||||
|
if (XBugType < YBugType)
|
||||||
|
return true;
|
||||||
|
if (XBugType != YBugType)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Next, compare by bug description.
|
||||||
|
llvm::StringRef XDesc = X->getDescription();
|
||||||
|
llvm::StringRef YDesc = Y->getDescription();
|
||||||
|
if (XDesc < YDesc)
|
||||||
|
return true;
|
||||||
|
if (XDesc != YDesc)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// FIXME: Further refine by comparing PathDiagnosticPieces?
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
class PlistDiagnostics : public PathDiagnosticClient {
|
class PlistDiagnostics : public PathDiagnosticClient {
|
||||||
std::vector<const PathDiagnostic*> BatchedDiags;
|
std::vector<const PathDiagnostic*> BatchedDiags;
|
||||||
|
@ -315,6 +349,11 @@ void PlistDiagnostics::FlushDiagnostics(llvm::SmallVectorImpl<std::string>
|
||||||
|
|
||||||
flushed = true;
|
flushed = true;
|
||||||
|
|
||||||
|
// Sort the diagnostics so that they are always emitted in a deterministic
|
||||||
|
// order.
|
||||||
|
if (!BatchedDiags.empty())
|
||||||
|
std::sort(BatchedDiags.begin(), BatchedDiags.end(), CompareDiagnostics());
|
||||||
|
|
||||||
// Build up a set of FIDs that we use by scanning the locations and
|
// Build up a set of FIDs that we use by scanning the locations and
|
||||||
// ranges of the diagnostics.
|
// ranges of the diagnostics.
|
||||||
FIDMap FM;
|
FIDMap FM;
|
||||||
|
|
Loading…
Reference in New Issue