[cfe-commits] r163497 [1/2] - in /cfe/trunk: lib/StaticAnalyzer/Core/PathDiagnostic.cpp test/Analysis/retain-release.m
Ted Kremenek
kremenek at apple.com
Mon Sep 10 07:32:52 PDT 2012
Hi Takumi,
Thanks for reverting this. I had thought that r163490 would have resolved the issue, because it did on at least one of the builders that was previously failing with this test case. I didn't see the other failures because I was asleep. I'll need to dig deeper.
Thanks,
Ted
On Sep 10, 2012, at 2:17 AM, NAKAMURA Takumi <geek4civic at gmail.com> wrote:
> Author: chapuni
> Date: Mon Sep 10 04:17:27 2012
> New Revision: 163497
>
> URL: http://llvm.org/viewvc/llvm-project?rev=163497&view=rev
> Log:
> Revert Ted's r163489 and r163490, due to breakage.
>
> r163489, "Take another crack at stabilizing the emission order of analyzer"
> r163490, "Use isBeforeInTranslationUnitThan() instead of operator<."
>
> Modified:
> cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
> cfe/trunk/test/Analysis/retain-release.m
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp?rev=163497&r1=163496&r2=163497&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/PathDiagnostic.cpp Mon Sep 10 04:17:27 2012
> @@ -199,7 +199,6 @@
> if (orig_size <= new_size)
> return;
>
> - assert(orig != D);
> Diags.RemoveNode(orig);
> delete orig;
> }
> @@ -207,145 +206,22 @@
> Diags.InsertNode(OwningD.take());
> }
>
> -static llvm::Optional<bool> comparePath(const PathPieces &X,
> - const PathPieces &Y);
> -static llvm::Optional<bool>
> -compareControlFlow(const PathDiagnosticControlFlowPiece &X,
> - const PathDiagnosticControlFlowPiece &Y) {
> - FullSourceLoc XSL = X.getStartLocation().asLocation();
> - FullSourceLoc YSL = Y.getStartLocation().asLocation();
> - if (XSL != YSL)
> - return XSL.isBeforeInTranslationUnitThan(YSL);
> - FullSourceLoc XEL = X.getStartLocation().asLocation();
> - FullSourceLoc YEL = Y.getStartLocation().asLocation();
> - if (XEL != YEL)
> - return XEL.isBeforeInTranslationUnitThan(YEL);
> - return llvm::Optional<bool>();
> -}
> -
> -static llvm::Optional<bool>
> -compareMacro(const PathDiagnosticMacroPiece &X,
> - const PathDiagnosticMacroPiece &Y) {
> - return comparePath(X.subPieces, Y.subPieces);
> -}
> -
> -static llvm::Optional<bool>
> -compareCall(const PathDiagnosticCallPiece &X,
> - const PathDiagnosticCallPiece &Y) {
> - FullSourceLoc X_CEL = X.callEnter.asLocation();
> - FullSourceLoc Y_CEL = Y.callEnter.asLocation();
> - if (X_CEL != Y_CEL)
> - return X_CEL.isBeforeInTranslationUnitThan(Y_CEL);
> - FullSourceLoc X_CEWL = X.callEnterWithin.asLocation();
> - FullSourceLoc Y_CEWL = Y.callEnterWithin.asLocation();
> - if (X_CEWL != Y_CEWL)
> - return X_CEWL.isBeforeInTranslationUnitThan(Y_CEWL);
> - FullSourceLoc X_CRL = X.callReturn.asLocation();
> - FullSourceLoc Y_CRL = Y.callReturn.asLocation();
> - if (X_CRL != Y_CRL)
> - return X_CRL.isBeforeInTranslationUnitThan(Y_CRL);
> - return comparePath(X.path, Y.path);
> -}
> -
> -static llvm::Optional<bool> comparePiece(const PathDiagnosticPiece &X,
> - const PathDiagnosticPiece &Y) {
> - if (X.getKind() != Y.getKind())
> - return X.getKind() < Y.getKind();
> -
> - FullSourceLoc XL = X.getLocation().asLocation();
> - FullSourceLoc YL = Y.getLocation().asLocation();
> - if (XL != YL)
> - return XL.isBeforeInTranslationUnitThan(YL);
> -
> - if (X.getString() != Y.getString())
> - return X.getString() < Y.getString();
> -
> - if (X.getRanges().size() != Y.getRanges().size())
> - return X.getRanges().size() < Y.getRanges().size();
> -
> - for (unsigned i = 0, n = X.getRanges().size(); i < n; ++i) {
> - SourceRange XR = X.getRanges()[i];
> - SourceRange YR = Y.getRanges()[i];
> - if (XR != YR) {
> - if (XR.getBegin() != YR.getBegin())
> - return XR.getBegin() < YR.getBegin();
> - return XR.getEnd() < YR.getEnd();
> - }
> - }
> -
> - switch (X.getKind()) {
> - case clang::ento::PathDiagnosticPiece::ControlFlow:
> - return compareControlFlow(cast<PathDiagnosticControlFlowPiece>(X),
> - cast<PathDiagnosticControlFlowPiece>(Y));
> - case clang::ento::PathDiagnosticPiece::Event:
> - return llvm::Optional<bool>();
> - case clang::ento::PathDiagnosticPiece::Macro:
> - return compareMacro(cast<PathDiagnosticMacroPiece>(X),
> - cast<PathDiagnosticMacroPiece>(Y));
> - case clang::ento::PathDiagnosticPiece::Call:
> - return compareCall(cast<PathDiagnosticCallPiece>(X),
> - cast<PathDiagnosticCallPiece>(Y));
> - }
> - llvm_unreachable("all cases handled");
> -}
> -
> -static llvm::Optional<bool> comparePath(const PathPieces &X,
> - const PathPieces &Y) {
> - if (X.size() != Y.size())
> - return X.size() < Y.size();
> - for (unsigned i = 0, n = X.size(); i != n; ++i) {
> - llvm::Optional<bool> b = comparePiece(*X[i], *Y[i]);
> - if (b.hasValue())
> - return b.getValue();
> - }
> - return llvm::Optional<bool>();
> -}
> -
> -static bool compare(const PathDiagnostic &X, const PathDiagnostic &Y) {
> - FullSourceLoc XL = X.getLocation().asLocation();
> - FullSourceLoc YL = Y.getLocation().asLocation();
> - if (XL != YL)
> - return XL.isBeforeInTranslationUnitThan(YL);
> - if (X.getBugType() != Y.getBugType())
> - return X.getBugType() < Y.getBugType();
> - if (X.getCategory() != Y.getCategory())
> - return X.getCategory() < Y.getCategory();
> - if (X.getVerboseDescription() != Y.getVerboseDescription())
> - return X.getVerboseDescription() < Y.getVerboseDescription();
> - if (X.getShortDescription() != Y.getShortDescription())
> - return X.getShortDescription() < Y.getShortDescription();
> - if (X.getDeclWithIssue() != Y.getDeclWithIssue()) {
> - const Decl *XD = X.getDeclWithIssue();
> - if (!XD)
> - return true;
> - const Decl *YD = Y.getDeclWithIssue();
> - if (!YD)
> - return false;
> - SourceLocation XDL = XD->getLocation();
> - SourceLocation YDL = YD->getLocation();
> - if (XDL != YDL)
> - return XDL < YDL;
> - }
> - PathDiagnostic::meta_iterator XI = X.meta_begin(), XE = X.meta_end();
> - PathDiagnostic::meta_iterator YI = Y.meta_begin(), YE = Y.meta_end();
> - if (XE - XI != YE - YI)
> - return (XE - XI) < (YE - YI);
> - for ( ; XI != XE ; ++XI, ++YI) {
> - if (*XI != *YI)
> - return (*XI) < (*YI);
> - }
> - llvm::Optional<bool> b = comparePath(X.path, Y.path);
> - assert(b.hasValue());
> - return b.getValue();
> -}
>
> namespace {
> struct CompareDiagnostics {
> // Compare if 'X' is "<" than 'Y'.
> bool operator()(const PathDiagnostic *X, const PathDiagnostic *Y) const {
> - if (X == Y)
> - return false;
> - return compare(*X, *Y);
> + // First sort by location, and if that doesn't work, do a full profile.
> + FullSourceLoc XL = X->getLocation().asLocation();
> + FullSourceLoc YL = Y->getLocation().asLocation();
> + if (XL != YL)
> + return XL < YL;
> +
> + // Do a full profile.
> + llvm::FoldingSetNodeID XProfile, YProfile;
> + X->FullProfile(XProfile);
> + Y->FullProfile(YProfile);
> + return XProfile < YProfile;
> }
> };
> }
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list