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:
Ted Kremenek 2009-12-03 19:35:02 +00:00
parent 4313a9c56a
commit a3536e23c8
1 changed files with 39 additions and 0 deletions

View File

@ -29,6 +29,40 @@ namespace clang {
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 {
class PlistDiagnostics : public PathDiagnosticClient {
std::vector<const PathDiagnostic*> BatchedDiags;
@ -315,6 +349,11 @@ void PlistDiagnostics::FlushDiagnostics(llvm::SmallVectorImpl<std::string>
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
// ranges of the diagnostics.
FIDMap FM;