[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