]> granicus.if.org Git - clang/commitdiff
ThreadSafetyReporter: Manage diagnostics in a std::list.
authorBenjamin Kramer <benny.kra@googlemail.com>
Mon, 26 Mar 2012 14:05:40 +0000 (14:05 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Mon, 26 Mar 2012 14:05:40 +0000 (14:05 +0000)
std::list is expensive, but so is std::sorting a SmallVector of SmallVectors of
heavyweight PartialDiagnostics.

Saves ~30k in a i386-linux-Release+Asserts clang build.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@153437 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/AnalysisBasedWarnings.cpp

index 13ab5428b851f98d8ea724a872d77ce49cd03df9..a8e679132c74d39fff965a13917effea70bc8a7b 100644 (file)
@@ -621,17 +621,16 @@ namespace clang {
 namespace thread_safety {
 typedef llvm::SmallVector<PartialDiagnosticAt, 1> OptionalNotes;
 typedef std::pair<PartialDiagnosticAt, OptionalNotes> DelayedDiag;
-typedef llvm::SmallVector<DelayedDiag, 4> DiagList;
+typedef std::list<DelayedDiag> DiagList;
 
 struct SortDiagBySourceLocation {
-  Sema &S;
-  SortDiagBySourceLocation(Sema &S) : S(S) {}
+  SourceManager &SM;
+  SortDiagBySourceLocation(SourceManager &SM) : SM(SM) {}
 
   bool operator()(const DelayedDiag &left, const DelayedDiag &right) {
     // Although this call will be slow, this is only called when outputting
     // multiple warnings.
-    return S.getSourceManager().isBeforeInTranslationUnit(left.first.first,
-                                                          right.first.first);
+    return SM.isBeforeInTranslationUnit(left.first.first, right.first.first);
   }
 };
 
@@ -660,8 +659,7 @@ class ThreadSafetyReporter : public clang::thread_safety::ThreadSafetyHandler {
   /// the lockset in deterministic order, so this function orders diagnostics
   /// and outputs them.
   void emitDiagnostics() {
-    SortDiagBySourceLocation SortDiagBySL(S);
-    sort(Warnings.begin(), Warnings.end(), SortDiagBySL);
+    Warnings.sort(SortDiagBySourceLocation(S.getSourceManager()));
     for (DiagList::iterator I = Warnings.begin(), E = Warnings.end();
          I != E; ++I) {
       S.Diag(I->first.first, I->first.second);