From ef6b007dc5ff1290d48d71736fc5dc0f4c154331 Mon Sep 17 00:00:00 2001 From: Alp Toker Date: Sat, 4 Jan 2014 13:47:14 +0000 Subject: [PATCH] Only mark dump() function definitions 'used' in debug builds This has the dual effect of (1) enabling more dead-stripping in release builds and (2) ensuring that debug helper functions aren't stripped away in debug builds, as they're intended to be called from the debugger. Note that the attribute is applied to definitions rather than declarations in headers going forward because it's now conditional on NDEBUG: /// \brief Mark debug helper function definitions like dump() that should not be /// stripped from debug builds. Requires corresponding macro added in LLVM r198456. llvm-svn: 198489 --- clang/include/clang/AST/Comment.h | 6 ++-- clang/include/clang/AST/DeclBase.h | 10 +++---- clang/include/clang/AST/Stmt.h | 6 ++-- clang/include/clang/AST/Type.h | 2 +- .../include/clang/Analysis/AnalysisContext.h | 2 +- clang/include/clang/Basic/SourceLocation.h | 4 +-- .../Core/BugReporter/PathDiagnostic.h | 2 +- .../Core/PathSensitive/CallEvent.h | 2 +- clang/lib/AST/ASTDumper.cpp | 28 ++++++++----------- clang/lib/AST/DeclPrinter.cpp | 2 +- clang/lib/AST/TypePrinter.cpp | 9 ++---- clang/lib/Analysis/AnalysisDeclContext.cpp | 2 +- clang/lib/Basic/SourceLocation.cpp | 7 +++-- .../StaticAnalyzer/Checkers/MallocChecker.cpp | 4 +-- clang/lib/StaticAnalyzer/Core/BugReporter.cpp | 3 +- clang/lib/StaticAnalyzer/Core/CallEvent.cpp | 4 +-- clang/lib/StaticAnalyzer/Core/RegionStore.cpp | 10 ++----- 17 files changed, 44 insertions(+), 59 deletions(-) diff --git a/clang/include/clang/AST/Comment.h b/clang/include/clang/AST/Comment.h index 28849f58a8ec..e67ceab3ab7f 100644 --- a/clang/include/clang/AST/Comment.h +++ b/clang/include/clang/AST/Comment.h @@ -194,9 +194,9 @@ public: const char *getCommentKindName() const; - LLVM_ATTRIBUTE_USED void dump() const; - LLVM_ATTRIBUTE_USED void dumpColor() const; - LLVM_ATTRIBUTE_USED void dump(const ASTContext &Context) const; + void dump() const; + void dumpColor() const; + void dump(const ASTContext &Context) const; void dump(raw_ostream &OS, const CommandTraits *Traits, const SourceManager *SM) const; diff --git a/clang/include/clang/AST/DeclBase.h b/clang/include/clang/AST/DeclBase.h index cf016a75554b..4d5ff662c733 100644 --- a/clang/include/clang/AST/DeclBase.h +++ b/clang/include/clang/AST/DeclBase.h @@ -938,9 +938,9 @@ public: raw_ostream &Out, const PrintingPolicy &Policy, unsigned Indentation = 0); // Debuggers don't usually respect default arguments. - LLVM_ATTRIBUTE_USED void dump() const; + void dump() const; // Same as dump(), but forces color printing. - LLVM_ATTRIBUTE_USED void dumpColor() const; + void dumpColor() const; void dump(raw_ostream &Out) const; private: @@ -1616,9 +1616,9 @@ public: static bool classof(const Decl *D); static bool classof(const DeclContext *D) { return true; } - LLVM_ATTRIBUTE_USED void dumpDeclContext() const; - LLVM_ATTRIBUTE_USED void dumpLookups() const; - LLVM_ATTRIBUTE_USED void dumpLookups(llvm::raw_ostream &OS) const; + void dumpDeclContext() const; + void dumpLookups() const; + void dumpLookups(llvm::raw_ostream &OS) const; private: void reconcileExternalVisibleStorage(); diff --git a/clang/include/clang/AST/Stmt.h b/clang/include/clang/AST/Stmt.h index 2396fb73ff55..4303e7b36e5d 100644 --- a/clang/include/clang/AST/Stmt.h +++ b/clang/include/clang/AST/Stmt.h @@ -371,12 +371,12 @@ public: /// \brief Dumps the specified AST fragment and all subtrees to /// \c llvm::errs(). - LLVM_ATTRIBUTE_USED void dump() const; - LLVM_ATTRIBUTE_USED void dump(SourceManager &SM) const; + void dump() const; + void dump(SourceManager &SM) const; void dump(raw_ostream &OS, SourceManager &SM) const; /// dumpColor - same as dump(), but forces color highlighting. - LLVM_ATTRIBUTE_USED void dumpColor() const; + void dumpColor() const; /// dumpPretty/printPretty - These two methods do a "pretty print" of the AST /// back to its original source language syntax. diff --git a/clang/include/clang/AST/Type.h b/clang/include/clang/AST/Type.h index 9e5507bcf7eb..9711bf782183 100644 --- a/clang/include/clang/AST/Type.h +++ b/clang/include/clang/AST/Type.h @@ -1797,7 +1797,7 @@ public: return CanonicalType; } CanQualType getCanonicalTypeUnqualified() const; // in CanonicalType.h - LLVM_ATTRIBUTE_USED void dump() const; + void dump() const; friend class ASTReader; friend class ASTWriter; diff --git a/clang/include/clang/Analysis/AnalysisContext.h b/clang/include/clang/Analysis/AnalysisContext.h index b6f183d21b68..b1cd212ef926 100644 --- a/clang/include/clang/Analysis/AnalysisContext.h +++ b/clang/include/clang/Analysis/AnalysisContext.h @@ -252,7 +252,7 @@ public: virtual void Profile(llvm::FoldingSetNodeID &ID) = 0; void dumpStack(raw_ostream &OS, StringRef Indent = "") const; - LLVM_ATTRIBUTE_USED void dumpStack() const; + void dumpStack() const; public: static void ProfileCommon(llvm::FoldingSetNodeID &ID, diff --git a/clang/include/clang/Basic/SourceLocation.h b/clang/include/clang/Basic/SourceLocation.h index 10ae07b82498..1062c53128ba 100644 --- a/clang/include/clang/Basic/SourceLocation.h +++ b/clang/include/clang/Basic/SourceLocation.h @@ -172,7 +172,7 @@ public: } void print(raw_ostream &OS, const SourceManager &SM) const; - LLVM_ATTRIBUTE_USED std::string printToString(const SourceManager &SM) const; + std::string printToString(const SourceManager &SM) const; void dump(const SourceManager &SM) const; }; @@ -331,7 +331,7 @@ public: /// \brief Prints information about this FullSourceLoc to stderr. /// /// This is useful for debugging. - LLVM_ATTRIBUTE_USED void dump() const; + void dump() const; friend inline bool operator==(const FullSourceLoc &LHS, const FullSourceLoc &RHS) { diff --git a/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h b/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h index 87e850f4b16c..f373b1852620 100644 --- a/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h +++ b/clang/include/clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h @@ -423,7 +423,7 @@ public: return Result; } - LLVM_ATTRIBUTE_USED void dump() const; + void dump() const; }; class PathDiagnosticSpotPiece : public PathDiagnosticPiece { diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h index cfaf085b5f34..d69f50a9a2f4 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h @@ -379,7 +379,7 @@ public: // For debugging purposes only void dump(raw_ostream &Out) const; - LLVM_ATTRIBUTE_USED void dump() const; + void dump() const; }; diff --git a/clang/lib/AST/ASTDumper.cpp b/clang/lib/AST/ASTDumper.cpp index a968500cfa02..5a81966c7029 100644 --- a/clang/lib/AST/ASTDumper.cpp +++ b/clang/lib/AST/ASTDumper.cpp @@ -2096,27 +2096,25 @@ void ASTDumper::visitVerbatimLineComment(const VerbatimLineComment *C) { // Decl method implementations //===----------------------------------------------------------------------===// -void Decl::dump() const { - dump(llvm::errs()); -} +LLVM_DUMP_METHOD void Decl::dump() const { dump(llvm::errs()); } -void Decl::dump(raw_ostream &OS) const { +LLVM_DUMP_METHOD void Decl::dump(raw_ostream &OS) const { ASTDumper P(OS, &getASTContext().getCommentCommandTraits(), &getASTContext().getSourceManager()); P.dumpDecl(this); } -void Decl::dumpColor() const { +LLVM_DUMP_METHOD void Decl::dumpColor() const { ASTDumper P(llvm::errs(), &getASTContext().getCommentCommandTraits(), &getASTContext().getSourceManager(), /*ShowColors*/true); P.dumpDecl(this); } -void DeclContext::dumpLookups() const { +LLVM_DUMP_METHOD void DeclContext::dumpLookups() const { dumpLookups(llvm::errs()); } -void DeclContext::dumpLookups(raw_ostream &OS) const { +LLVM_DUMP_METHOD void DeclContext::dumpLookups(raw_ostream &OS) const { const DeclContext *DC = this; while (!DC->isTranslationUnit()) DC = DC->getParent(); @@ -2129,21 +2127,21 @@ void DeclContext::dumpLookups(raw_ostream &OS) const { // Stmt method implementations //===----------------------------------------------------------------------===// -void Stmt::dump(SourceManager &SM) const { +LLVM_DUMP_METHOD void Stmt::dump(SourceManager &SM) const { dump(llvm::errs(), SM); } -void Stmt::dump(raw_ostream &OS, SourceManager &SM) const { +LLVM_DUMP_METHOD void Stmt::dump(raw_ostream &OS, SourceManager &SM) const { ASTDumper P(OS, 0, &SM); P.dumpStmt(this); } -void Stmt::dump() const { +LLVM_DUMP_METHOD void Stmt::dump() const { ASTDumper P(llvm::errs(), 0, 0); P.dumpStmt(this); } -void Stmt::dumpColor() const { +LLVM_DUMP_METHOD void Stmt::dumpColor() const { ASTDumper P(llvm::errs(), 0, 0, /*ShowColors*/true); P.dumpStmt(this); } @@ -2152,11 +2150,9 @@ void Stmt::dumpColor() const { // Comment method implementations //===----------------------------------------------------------------------===// -void Comment::dump() const { - dump(llvm::errs(), 0, 0); -} +LLVM_DUMP_METHOD void Comment::dump() const { dump(llvm::errs(), 0, 0); } -void Comment::dump(const ASTContext &Context) const { +LLVM_DUMP_METHOD void Comment::dump(const ASTContext &Context) const { dump(llvm::errs(), &Context.getCommentCommandTraits(), &Context.getSourceManager()); } @@ -2168,7 +2164,7 @@ void Comment::dump(raw_ostream &OS, const CommandTraits *Traits, D.dumpFullComment(FC); } -void Comment::dumpColor() const { +LLVM_DUMP_METHOD void Comment::dumpColor() const { const FullComment *FC = dyn_cast(this); ASTDumper D(llvm::errs(), 0, 0, /*ShowColors*/true); D.dumpFullComment(FC); diff --git a/clang/lib/AST/DeclPrinter.cpp b/clang/lib/AST/DeclPrinter.cpp index 61c693cf4252..4b289ca2264f 100644 --- a/clang/lib/AST/DeclPrinter.cpp +++ b/clang/lib/AST/DeclPrinter.cpp @@ -167,7 +167,7 @@ void Decl::printGroup(Decl** Begin, unsigned NumDecls, } } -void DeclContext::dumpDeclContext() const { +LLVM_DUMP_METHOD void DeclContext::dumpDeclContext() const { // Get the translation unit const DeclContext *DC = this; while (!DC->isTranslationUnit()) diff --git a/clang/lib/AST/TypePrinter.cpp b/clang/lib/AST/TypePrinter.cpp index 082d027791fd..45fc9c4a1819 100644 --- a/clang/lib/AST/TypePrinter.cpp +++ b/clang/lib/AST/TypePrinter.cpp @@ -1423,13 +1423,10 @@ void QualType::dump(const char *msg) const { print(llvm::errs(), PrintingPolicy(LO), "identifier"); llvm::errs() << '\n'; } -void QualType::dump() const { - dump(0); -} -void Type::dump() const { - QualType(this, 0).dump(); -} +LLVM_DUMP_METHOD void QualType::dump() const { dump(0); } + +LLVM_DUMP_METHOD void Type::dump() const { QualType(this, 0).dump(); } std::string Qualifiers::getAsString() const { LangOptions LO; diff --git a/clang/lib/Analysis/AnalysisDeclContext.cpp b/clang/lib/Analysis/AnalysisDeclContext.cpp index 465f0c383486..9bf8df27c70b 100644 --- a/clang/lib/Analysis/AnalysisDeclContext.cpp +++ b/clang/lib/Analysis/AnalysisDeclContext.cpp @@ -435,7 +435,7 @@ void LocationContext::dumpStack(raw_ostream &OS, StringRef Indent) const { } } -void LocationContext::dumpStack() const { +LLVM_DUMP_METHOD void LocationContext::dumpStack() const { dumpStack(llvm::errs()); } diff --git a/clang/lib/Basic/SourceLocation.cpp b/clang/lib/Basic/SourceLocation.cpp index 182209117966..0c06a48c123a 100644 --- a/clang/lib/Basic/SourceLocation.cpp +++ b/clang/lib/Basic/SourceLocation.cpp @@ -61,14 +61,15 @@ void SourceLocation::print(raw_ostream &OS, const SourceManager &SM)const{ OS << '>'; } -std::string SourceLocation::printToString(const SourceManager &SM) const { +LLVM_DUMP_METHOD std::string +SourceLocation::printToString(const SourceManager &SM) const { std::string S; llvm::raw_string_ostream OS(S); print(OS, SM); return OS.str(); } -void SourceLocation::dump(const SourceManager &SM) const { +LLVM_DUMP_METHOD void SourceLocation::dump(const SourceManager &SM) const { print(llvm::errs(), SM); } @@ -122,7 +123,7 @@ bool FullSourceLoc::isBeforeInTranslationUnitThan(SourceLocation Loc) const { return SrcMgr->isBeforeInTranslationUnit(*this, Loc); } -void FullSourceLoc::dump() const { +LLVM_DUMP_METHOD void FullSourceLoc::dump() const { SourceLocation::dump(*SrcMgr); } diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 8697badcf97e..82a1aa22579c 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -108,9 +108,7 @@ public: OS << Table[(unsigned) K]; } - LLVM_ATTRIBUTE_USED void dump() const { - dump(llvm::errs()); - } + LLVM_DUMP_METHOD void dump() const { dump(llvm::errs()); } }; enum ReallocPairKind { diff --git a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp index 1940fa79fda3..2518d05d412f 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporter.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporter.cpp @@ -3501,8 +3501,7 @@ BugType *BugReporter::getBugTypeForName(StringRef name, return BT; } - -void PathPieces::dump() const { +LLVM_DUMP_METHOD void PathPieces::dump() const { unsigned index = 0; for (PathPieces::const_iterator I = begin(), E = end(); I != E; ++I) { llvm::errs() << "[" << index++ << "] "; diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index a3b34f4790a9..e0392bd14730 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -209,9 +209,7 @@ SVal CallEvent::getReturnValue() const { return getSVal(E); } -void CallEvent::dump() const { - dump(llvm::errs()); -} +LLVM_DUMP_METHOD void CallEvent::dump() const { dump(llvm::errs()); } void CallEvent::dump(raw_ostream &Out) const { ASTContext &Ctx = getState()->getStateManager().getContext(); diff --git a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp index 58f21214e197..245491c9fd03 100644 --- a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -104,7 +104,7 @@ public: Data == X.Data; } - LLVM_ATTRIBUTE_USED void dump() const; + void dump() const; }; } // end anonymous namespace @@ -133,9 +133,7 @@ namespace llvm { }; } // end llvm namespace -void BindingKey::dump() const { - llvm::errs() << *this; -} +LLVM_DUMP_METHOD void BindingKey::dump() const { llvm::errs() << *this; } //===----------------------------------------------------------------------===// // Actual Store type. @@ -224,9 +222,7 @@ public: } } - LLVM_ATTRIBUTE_USED void dump() const { - dump(llvm::errs(), "\n"); - } + LLVM_DUMP_METHOD void dump() const { dump(llvm::errs(), "\n"); } }; } // end anonymous namespace