forked from OSchip/llvm-project
[analyzer] Sort path diagnostics with array_pod_sort.
They're expensive to compare and we won't sort many of them so std::sort doesn't give any benefits and causes code bloat. Func fact: clang -O3 didn't even bother to inline libc++'s std::sort here. While there validate the predicate a bit harder, the sort is unstable and we don't want to introduce any non-determinism. I had to spell out the function pointer type because GCC 4.7 still fails to convert the lambda to a function pointer :( No intended functionality change. llvm-svn: 232263
This commit is contained in:
parent
15e6954aea
commit
5caa50e469
|
@ -432,11 +432,15 @@ void PathDiagnosticConsumer::FlushDiagnostics(
|
|||
|
||||
// Sort the diagnostics so that they are always emitted in a deterministic
|
||||
// order.
|
||||
if (!BatchDiags.empty())
|
||||
std::sort(BatchDiags.begin(), BatchDiags.end(),
|
||||
[](const PathDiagnostic *X, const PathDiagnostic *Y) {
|
||||
return X != Y && compare(*X, *Y);
|
||||
});
|
||||
int (*Comp)(const PathDiagnostic *const *, const PathDiagnostic *const *) =
|
||||
[](const PathDiagnostic *const *X, const PathDiagnostic *const *Y) {
|
||||
assert(*X != *Y && "PathDiagnostics not uniqued!");
|
||||
if (compare(**X, **Y))
|
||||
return -1;
|
||||
assert(compare(**Y, **X) && "Not a total order!");
|
||||
return 1;
|
||||
};
|
||||
array_pod_sort(BatchDiags.begin(), BatchDiags.end(), Comp);
|
||||
|
||||
FlushDiagnosticsImpl(BatchDiags, Files);
|
||||
|
||||
|
|
Loading…
Reference in New Issue