diff options
Diffstat (limited to 'clang-tools-extra/cpp11-migrate')
13 files changed, 82 insertions, 17 deletions
diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp index d75c658ec69..f431c34c88f 100644 --- a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp +++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.cpp @@ -45,7 +45,8 @@ int AddOverrideTransform::apply(const FileContentsByPath &InputStates, Finder.addMatcher(makeCandidateForOverrideAttrMatcher(), &Fixer); - if (int result = AddOverrideTool.run(newFrontendActionFactory(&Finder))) { + if (int result = AddOverrideTool.run( + newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) { llvm::errs() << "Error encountered during translation.\n"; return result; } diff --git a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h index 9b1aa1535ba..1e9de5d5c71 100644 --- a/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h +++ b/clang-tools-extra/cpp11-migrate/AddOverride/AddOverride.h @@ -24,7 +24,8 @@ /// member functions overriding base class virtual functions. class AddOverrideTransform : public Transform { public: - AddOverrideTransform() : Transform("AddOverride") {} + AddOverrideTransform(bool EnableTiming) + : Transform("AddOverride", EnableTiming) {} /// \see Transform::run(). virtual int apply(const FileContentsByPath &InputStates, diff --git a/clang-tools-extra/cpp11-migrate/Core/Transform.cpp b/clang-tools-extra/cpp11-migrate/Core/Transform.cpp index d235356075f..c6bb835321d 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transform.cpp +++ b/clang-tools-extra/cpp11-migrate/Core/Transform.cpp @@ -35,3 +35,19 @@ void collectResults(clang::Rewriter &Rewrite, Results[Entry->getName()] = ResultBuf; } } + +bool Transform::handleBeginSource(CompilerInstance &CI, StringRef Filename) { + if (!EnableTiming) + return true; + + Timings.push_back(std::make_pair(Filename.str(), llvm::TimeRecord())); + Timings.back().second -= llvm::TimeRecord::getCurrentTime(true); + return true; +} + +void Transform::handleEndSource() { + if (!EnableTiming) + return; + + Timings.back().second += llvm::TimeRecord::getCurrentTime(false); +} diff --git a/clang-tools-extra/cpp11-migrate/Core/Transform.h b/clang-tools-extra/cpp11-migrate/Core/Transform.h index adc02989536..73a2a00a816 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transform.h +++ b/clang-tools-extra/cpp11-migrate/Core/Transform.h @@ -17,6 +17,8 @@ #include <string> #include <vector> +#include "clang/Tooling/Tooling.h" +#include "llvm/Support/Timer.h" // For RewriterContainer #include "clang/Rewrite/Core/Rewriter.h" @@ -104,9 +106,23 @@ private: }; /// \brief Abstract base class for all C++11 migration transforms. -class Transform { +/// +/// Per-source performance timing is handled by the callbacks +/// handleBeginSource() and handleEndSource() if timing is enabled. See +/// clang::tooling::newFrontendActionFactory() for how to register +/// a Transform object for callbacks. +class Transform : public clang::tooling::SourceFileCallbacks { public: - Transform(llvm::StringRef Name) : Name(Name) { + /// \brief Constructor + /// \param Name Name of the transform for human-readable purposes (e.g. -help + /// text) + /// \param EnableTiming Enable the timing of the duration between calls to + /// handleBeginSource() and handleEndSource(). When a Transform object is + /// registered for FrontendAction source file callbacks, this behaviour can + /// be used to time the application of a MatchFinder by subclasses. Durations + /// are automatically stored in a TimingVec. + Transform(llvm::StringRef Name, bool EnableTiming) + : Name(Name), EnableTiming(EnableTiming) { Reset(); } @@ -156,7 +172,31 @@ public: DeferredChanges = 0; } + /// \brief Callback for notification of the start of processing of a source + /// file by a FrontendAction. Starts a performance timer if timing was + /// enabled. + virtual bool handleBeginSource(clang::CompilerInstance &CI, + llvm::StringRef Filename) LLVM_OVERRIDE; + + /// \brief Callback for notification of the end of processing of a source + /// file by a FrontendAction. Stops a performance timer if timing was enabled + /// and records the elapsed time. For a given source, handleBeginSource() and + /// handleEndSource() are expected to be called in pairs. + virtual void handleEndSource() LLVM_OVERRIDE; + + /// \brief Performance timing data is stored as a vector of pairs. Pairs are + /// formed of: + /// \li Name of source file. + /// \li Elapsed time. + typedef std::vector<std::pair<std::string, llvm::TimeRecord> > TimingVec; + + /// \brief Return an iterator to the start of collected timing data. + TimingVec::const_iterator timing_begin() const { return Timings.begin(); } + /// \brief Return an iterator to the start of collected timing data. + TimingVec::const_iterator timing_end() const { return Timings.end(); } + protected: + void setAcceptedChanges(unsigned Changes) { AcceptedChanges = Changes; } @@ -169,6 +209,8 @@ protected: private: const std::string Name; + bool EnableTiming; + TimingVec Timings; unsigned AcceptedChanges; unsigned RejectedChanges; unsigned DeferredChanges; diff --git a/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp b/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp index d7eae694870..85c0e2103a7 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp +++ b/clang-tools-extra/cpp11-migrate/Core/Transforms.cpp @@ -35,11 +35,11 @@ void Transforms::registerTransform(llvm::StringRef OptName, new cl::opt<bool>(OptName.data(), cl::desc(Description.data())), Creator)); } -void Transforms::createSelectedTransforms() { +void Transforms::createSelectedTransforms(bool EnableTiming) { for (OptionVec::iterator I = Options.begin(), E = Options.end(); I != E; ++I) { if (*I->first) { - ChosenTransforms.push_back(I->second()); + ChosenTransforms.push_back(I->second(EnableTiming)); } } } diff --git a/clang-tools-extra/cpp11-migrate/Core/Transforms.h b/clang-tools-extra/cpp11-migrate/Core/Transforms.h index 67e38b025c8..b19b0316d90 100644 --- a/clang-tools-extra/cpp11-migrate/Core/Transforms.h +++ b/clang-tools-extra/cpp11-migrate/Core/Transforms.h @@ -28,10 +28,10 @@ class Option; } // namespace llvm class Transform; -typedef Transform *(*TransformCreator)(); +typedef Transform *(*TransformCreator)(bool); template <typename T> -Transform *ConstructTransform() { - return new T(); +Transform *ConstructTransform(bool EnableTiming) { + return new T(EnableTiming); } /// \brief Class encapsulating the creation of command line bool options @@ -55,7 +55,7 @@ public: /// \brief Instantiate all transforms that were selected on the command line. /// /// Call *after* parsing options. - void createSelectedTransforms(); + void createSelectedTransforms(bool EnableTiming); /// \brief Return an iterator to the start of a container of instantiated /// transforms. diff --git a/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp b/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp index 7e95d7555cd..9afd4990e45 100644 --- a/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp +++ b/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.cpp @@ -64,7 +64,8 @@ int LoopConvertTransform::apply(const FileContentsByPath &InputStates, MaxRisk, LFK_PseudoArray); Finder.addMatcher(makePseudoArrayLoopMatcher(), &PseudoarrrayLoopFixer); - if (int result = LoopTool.run(newFrontendActionFactory(&Finder))) { + if (int result = LoopTool.run( + newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) { llvm::errs() << "Error encountered during translation.\n"; return result; } diff --git a/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.h b/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.h index 361855d3f1c..25c6460af04 100644 --- a/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.h +++ b/clang-tools-extra/cpp11-migrate/LoopConvert/LoopConvert.h @@ -23,7 +23,8 @@ /// for-loops where possible. class LoopConvertTransform : public Transform { public: - LoopConvertTransform() : Transform("LoopConvert") {} + LoopConvertTransform(bool EnableTiming) + : Transform("LoopConvert", EnableTiming) {} /// \see Transform::run(). virtual int apply(const FileContentsByPath &InputStates, diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp index 7a56e1c1250..a8e839d1c81 100644 --- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp +++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.cpp @@ -43,7 +43,8 @@ int UseAutoTransform::apply(const FileContentsByPath &InputStates, Finder.addMatcher(makeIteratorDeclMatcher(), &ReplaceIterators); Finder.addMatcher(makeDeclWithNewMatcher(), &ReplaceNew); - if (int Result = UseAutoTool.run(newFrontendActionFactory(&Finder))) { + if (int Result = UseAutoTool.run( + newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) { llvm::errs() << "Error encountered during translation.\n"; return Result; } diff --git a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h index 684da880e89..5e83d867a8e 100644 --- a/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h +++ b/clang-tools-extra/cpp11-migrate/UseAuto/UseAuto.h @@ -29,7 +29,7 @@ /// p2 are not handled by this transform. class UseAutoTransform : public Transform { public: - UseAutoTransform() : Transform("UseAuto") {} + UseAutoTransform(bool EnableTiming) : Transform("UseAuto", EnableTiming) {} /// \see Transform::run(). virtual int apply(const FileContentsByPath &InputStates, diff --git a/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp b/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp index 573604a9c53..0f8b1a84f4b 100644 --- a/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp +++ b/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.cpp @@ -47,7 +47,8 @@ int UseNullptrTransform::apply(const FileContentsByPath &InputStates, Finder.addMatcher(makeCastSequenceMatcher(), &Fixer); - if (int result = UseNullptrTool.run(newFrontendActionFactory(&Finder))) { + if (int result = UseNullptrTool.run( + newFrontendActionFactory(&Finder, /*Callbacks=*/ this))) { llvm::errs() << "Error encountered during translation.\n"; return result; } diff --git a/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.h b/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.h index 02691f6e08b..49cdc45baa5 100644 --- a/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.h +++ b/clang-tools-extra/cpp11-migrate/UseNullptr/UseNullptr.h @@ -23,7 +23,8 @@ /// C++11's nullptr keyword where possible. class UseNullptrTransform : public Transform { public: - UseNullptrTransform() : Transform("UseNullptr") {} + UseNullptrTransform(bool EnableTiming) + : Transform("UseNullptr", EnableTiming) {} /// \see Transform::run(). virtual int apply(const FileContentsByPath &InputStates, diff --git a/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp b/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp index d71626ce828..88c1bfcca70 100644 --- a/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp +++ b/clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp @@ -99,7 +99,7 @@ int main(int argc, const char **argv) { // This causes options to be parsed. CommonOptionsParser OptionsParser(argc, argv); - TransformManager.createSelectedTransforms(); + TransformManager.createSelectedTransforms(/*EnableTiming=*/false); if (TransformManager.begin() == TransformManager.end()) { llvm::errs() << "No selected transforms\n"; |