[clang-tools-extra] r187041 - cpp11-migrate: Register the transforms automatically using llvm::Registry
Guillaume Papin
guillaume.papin at epitech.eu
Wed Jul 24 07:24:34 PDT 2013
Author: papin_g
Date: Wed Jul 24 09:24:33 2013
New Revision: 187041
URL: http://llvm.org/viewvc/llvm-project?rev=187041&view=rev
Log:
cpp11-migrate: Register the transforms automatically using llvm::Registry
With this change each transform now register a factory. The factories are
registered using an llvm::Registry which makes them available globally.
Modified:
clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp
clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp
clang-tools-extra/trunk/cpp11-migrate/Core/Transform.h
clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.cpp
clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.h
clang-tools-extra/trunk/cpp11-migrate/LoopConvert/LoopConvert.cpp
clang-tools-extra/trunk/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp
clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAuto.cpp
clang-tools-extra/trunk/cpp11-migrate/UseNullptr/UseNullptr.cpp
clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
Modified: clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/AddOverride/AddOverride.cpp Wed Jul 24 09:24:33 2013
@@ -59,3 +59,17 @@ bool AddOverrideTransform::handleBeginSo
Fixer->setPreprocessor(CI.getPreprocessor());
return Transform::handleBeginSource(CI, Filename);
}
+
+struct AddOverrideFactory : TransformFactory {
+ Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE {
+ return new AddOverrideTransform(Opts);
+ }
+};
+
+// Register the factory using this statically initialized variable.
+static TransformFactoryRegistry::Add<AddOverrideFactory>
+X("add-override", "Make use of override specifier where possible");
+
+// This anchor is used to force the linker to link in the generated object file
+// and thus register the factory.
+volatile int AddOverrideTransformAnchorSource = 0;
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/Core/Transform.cpp Wed Jul 24 09:24:33 2013
@@ -131,3 +131,5 @@ void Transform::addTiming(llvm::StringRe
FrontendActionFactory *Transform::createActionFactory(MatchFinder &Finder) {
return new ActionFactory(Finder, /*Owner=*/ *this);
}
+
+TransformFactory::~TransformFactory() {}
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/Transform.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Transform.h?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/Core/Transform.h (original)
+++ clang-tools-extra/trunk/cpp11-migrate/Core/Transform.h Wed Jul 24 09:24:33 2013
@@ -20,8 +20,8 @@
#include "clang/Tooling/Refactoring.h"
#include "llvm/ADT/OwningPtr.h"
#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/Registry.h"
#include "llvm/Support/Timer.h"
-
#include <string>
#include <vector>
@@ -222,4 +222,35 @@ private:
unsigned DeferredChanges;
};
+/// \brief A factory that can instantiate a specific transform.
+///
+/// Each transform should subclass it and implement the \c createTransform()
+/// methods. Use \c TransformFactoryRegistry to register the transform globally.
+///
+/// Example:
+/// \code
+/// class MyTransform : public Transform { ... };
+///
+/// struct MyFactory : TransformFactory {
+/// Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE {
+/// return new MyTransform(Opts);
+/// }
+/// };
+///
+/// // Register the factory using this statically initialized variable.
+/// static TransformFactoryRegistry::Add<MyFactory>
+/// X("my-transform", "<Short description of my transform>");
+///
+/// // This anchor is used to force the linker to link in the generated object
+/// // file and thus register the factory.
+/// volatile int MyTransformAnchorSource = 0;
+/// \endcode
+class TransformFactory {
+public:
+ virtual ~TransformFactory();
+ virtual Transform *createTransform(const TransformOptions &) = 0;
+};
+
+typedef llvm::Registry<TransformFactory> TransformFactoryRegistry;
+
#endif // CPP11_MIGRATE_TRANSFORM_H
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.cpp Wed Jul 24 09:24:33 2013
@@ -20,31 +20,34 @@ namespace cl = llvm::cl;
static cl::OptionCategory TransformCategory("Transforms");
Transforms::~Transforms() {
- for (std::vector<Transform*>::iterator I = ChosenTransforms.begin(),
- E = ChosenTransforms.end(); I != E; ++I) {
+ for (std::vector<Transform *>::iterator I = ChosenTransforms.begin(),
+ E = ChosenTransforms.end();
+ I != E; ++I)
delete *I;
- }
- for (OptionVec::iterator I = Options.begin(),
- E = Options.end(); I != E; ++I) {
- delete I->first;
- }
+
+ for (OptionMap::iterator I = Options.begin(), E = Options.end(); I != E; ++I)
+ delete I->getValue();
}
-void Transforms::registerTransform(llvm::StringRef OptName,
- llvm::StringRef Description,
- TransformCreator Creator) {
- Options.push_back(OptionVec::value_type(
- new cl::opt<bool>(OptName.data(), cl::desc(Description.data()),
- cl::cat(TransformCategory)),
- Creator));
+void Transforms::registerTransforms() {
+ for (TransformFactoryRegistry::iterator I = TransformFactoryRegistry::begin(),
+ E = TransformFactoryRegistry::end();
+ I != E; ++I)
+ Options[I->getName()] = new cl::opt<bool>(
+ I->getName(), cl::desc(I->getDesc()), cl::cat(TransformCategory));
}
void
Transforms::createSelectedTransforms(const TransformOptions &GlobalOptions) {
- for (OptionVec::iterator I = Options.begin(),
- E = Options.end(); I != E; ++I) {
- if (*I->first) {
- ChosenTransforms.push_back(I->second(GlobalOptions));
- }
+ for (TransformFactoryRegistry::iterator I = TransformFactoryRegistry::begin(),
+ E = TransformFactoryRegistry::end();
+ I != E; ++I) {
+ bool OptionEnabled = *Options[I->getName()];
+
+ if (!OptionEnabled)
+ continue;
+
+ llvm::OwningPtr<TransformFactory> Factory(I->instantiate());
+ ChosenTransforms.push_back(Factory->createTransform(GlobalOptions));
}
}
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.h?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.h (original)
+++ clang-tools-extra/trunk/cpp11-migrate/Core/Transforms.h Wed Jul 24 09:24:33 2013
@@ -48,12 +48,11 @@ public:
~Transforms();
- /// \brief Registers a transform causing the transform to be made available
- /// on the command line.
+ /// \brief Registers all available transforms causing them to be made
+ /// available on the command line.
///
/// Be sure to register all transforms *before* parsing command line options.
- void registerTransform(llvm::StringRef OptName, llvm::StringRef Description,
- TransformCreator Creator);
+ void registerTransforms();
/// \brief Instantiate all transforms that were selected on the command line.
///
@@ -69,12 +68,11 @@ public:
const_iterator end() const { return ChosenTransforms.end(); }
private:
- typedef std::vector<std::pair<llvm::cl::opt<bool>*, TransformCreator> >
- OptionVec;
+ typedef llvm::StringMap<llvm::cl::opt<bool> *> OptionMap;
private:
TransformVec ChosenTransforms;
- OptionVec Options;
+ OptionMap Options;
};
#endif // CPP11_MIGRATE_TRANSFORMS_H
Modified: clang-tools-extra/trunk/cpp11-migrate/LoopConvert/LoopConvert.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/LoopConvert/LoopConvert.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/LoopConvert/LoopConvert.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/LoopConvert/LoopConvert.cpp Wed Jul 24 09:24:33 2013
@@ -66,3 +66,17 @@ int LoopConvertTransform::apply(FileOver
return 0;
}
+
+struct LoopConvertFactory : TransformFactory {
+ Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE {
+ return new LoopConvertTransform(Opts);
+ }
+};
+
+// Register the factory using this statically initialized variable.
+static TransformFactoryRegistry::Add<LoopConvertFactory>
+X("loop-convert", "Make use of range-based for loops where possible");
+
+// This anchor is used to force the linker to link in the generated object file
+// and thus register the factory.
+volatile int LoopConvertTransformAnchorSource = 0;
Modified: clang-tools-extra/trunk/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/ReplaceAutoPtr/ReplaceAutoPtr.cpp Wed Jul 24 09:24:33 2013
@@ -48,3 +48,18 @@ ReplaceAutoPtrTransform::apply(FileOverr
return 0;
}
+
+struct ReplaceAutoPtrFactory : TransformFactory {
+ Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE {
+ return new ReplaceAutoPtrTransform(Opts);
+ }
+};
+
+// Register the factory using this statically initialized variable.
+static TransformFactoryRegistry::Add<ReplaceAutoPtrFactory>
+X("replace-auto_ptr", "Replace std::auto_ptr (deprecated) by std::unique_ptr"
+ " (EXPERIMENTAL)");
+
+// This anchor is used to force the linker to link in the generated object file
+// and thus register the factory.
+volatile int ReplaceAutoPtrTransformAnchorSource = 0;
Modified: clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAuto.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAuto.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAuto.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/UseAuto/UseAuto.cpp Wed Jul 24 09:24:33 2013
@@ -47,3 +47,17 @@ int UseAutoTransform::apply(FileOverride
return 0;
}
+
+struct UseAutoFactory : TransformFactory {
+ Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE {
+ return new UseAutoTransform(Opts);
+ }
+};
+
+// Register the factory using this statically initialized variable.
+static TransformFactoryRegistry::Add<UseAutoFactory>
+X("use-auto", "Use of 'auto' type specifier");
+
+// This anchor is used to force the linker to link in the generated object file
+// and thus register the factory.
+volatile int UseAutoTransformAnchorSource = 0;
Modified: clang-tools-extra/trunk/cpp11-migrate/UseNullptr/UseNullptr.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/UseNullptr/UseNullptr.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/UseNullptr/UseNullptr.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/UseNullptr/UseNullptr.cpp Wed Jul 24 09:24:33 2013
@@ -48,3 +48,17 @@ int UseNullptrTransform::apply(FileOverr
return 0;
}
+
+struct UseNullptrFactory : TransformFactory {
+ Transform *createTransform(const TransformOptions &Opts) LLVM_OVERRIDE {
+ return new UseNullptrTransform(Opts);
+ }
+};
+
+// Register the factory using this statically initialized variable.
+static TransformFactoryRegistry::Add<UseNullptrFactory>
+X("use-nullptr", "Make use of nullptr keyword where possible");
+
+// This anchor is used to force the linker to link in the generated object file
+// and thus register the factory.
+volatile int UseNullptrTransformAnchorSource = 0;
Modified: clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp?rev=187041&r1=187040&r2=187041&view=diff
==============================================================================
--- clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp (original)
+++ clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp Wed Jul 24 09:24:33 2013
@@ -21,11 +21,6 @@
#include "Core/Transform.h"
#include "Core/Transforms.h"
#include "Core/Reformatting.h"
-#include "LoopConvert/LoopConvert.h"
-#include "UseNullptr/UseNullptr.h"
-#include "UseAuto/UseAuto.h"
-#include "AddOverride/AddOverride.h"
-#include "ReplaceAutoPtr/ReplaceAutoPtr.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
@@ -156,23 +151,7 @@ int main(int argc, const char **argv) {
llvm::sys::PrintStackTraceOnErrorSignal();
Transforms TransformManager;
- TransformManager.registerTransform(
- "loop-convert", "Make use of range-based for loops where possible",
- &ConstructTransform<LoopConvertTransform>);
- TransformManager.registerTransform(
- "use-nullptr", "Make use of nullptr keyword where possible",
- &ConstructTransform<UseNullptrTransform>);
- TransformManager.registerTransform(
- "use-auto", "Use of 'auto' type specifier",
- &ConstructTransform<UseAutoTransform>);
- TransformManager.registerTransform(
- "add-override", "Make use of override specifier where possible",
- &ConstructTransform<AddOverrideTransform>);
- TransformManager.registerTransform(
- "replace-auto_ptr", "Replace auto_ptr (deprecated) by unique_ptr"
- " (EXPERIMENTAL)",
- &ConstructTransform<ReplaceAutoPtrTransform>);
- // Add more transform options here.
+ TransformManager.registerTransforms();
// This causes options to be parsed.
CommonOptionsParser OptionsParser(argc, argv);
@@ -293,3 +272,18 @@ int main(int argc, const char **argv) {
return 0;
}
+
+// These anchors are used to force the linker to link the transforms
+extern volatile int AddOverrideTransformAnchorSource;
+extern volatile int LoopConvertTransformAnchorSource;
+extern volatile int ReplaceAutoPtrTransformAnchorSource;
+extern volatile int UseAutoTransformAnchorSource;
+extern volatile int UseNullptrTransformAnchorSource;
+
+static int TransformsAnchorsDestination[] = {
+ AddOverrideTransformAnchorSource,
+ LoopConvertTransformAnchorSource,
+ ReplaceAutoPtrTransformAnchorSource,
+ UseAutoTransformAnchorSource,
+ UseNullptrTransformAnchorSource
+};
More information about the cfe-commits
mailing list