]> granicus.if.org Git - clang/commitdiff
Support for -plugin-arg- with -add-plugin
authorNico Weber <nicolasweber@gmx.de>
Sat, 29 Jan 2011 21:21:49 +0000 (21:21 +0000)
committerNico Weber <nicolasweber@gmx.de>
Sat, 29 Jan 2011 21:21:49 +0000 (21:21 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124551 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Frontend/FrontendOptions.h
lib/Frontend/CompilerInvocation.cpp
lib/Frontend/FrontendAction.cpp

index fe953a459583500d1049c6db85ed47c5ca73f76d..f19914ecd78d9e8be0c741e9131c7cdcab133b80 100644 (file)
@@ -100,12 +100,15 @@ public:
   /// The name of the action to run when using a plugin action.
   std::string ActionName;
 
-  /// Arg to pass to the plugin
+  /// Args to pass to the plugin
   std::vector<std::string> PluginArgs;
 
   /// The list of plugin actions to run in addition to the normal action.
   std::vector<std::string> AddPluginActions;
 
+  /// Args to pass to the additional plugins
+  std::vector<std::vector<std::string> > AddPluginArgs;
+
   /// The list of plugins to load.
   std::vector<std::string> Plugins;
 
index 28cae64bff232cca0362f2a568439b77f50e3aae..3fdbc1683cdcdbf02c2e8a522f0b59d92452d840 100644 (file)
@@ -438,6 +438,10 @@ static void FrontendOptsToArgs(const FrontendOptions &Opts,
   for (unsigned i = 0, e = Opts.AddPluginActions.size(); i != e; ++i) {
     Res.push_back("-add-plugin");
     Res.push_back(Opts.AddPluginActions[i]);
+    for(unsigned ai = 0, ae = Opts.AddPluginArgs.size(); ai != ae; ++ai) {
+      Res.push_back("-plugin-arg-" + Opts.AddPluginActions[i]);
+      Res.push_back(Opts.AddPluginArgs[i][ai]);
+    }
   }
   for (unsigned i = 0, e = Opts.ASTMergeFiles.size(); i != e; ++i) {
     Res.push_back("-ast-merge");
@@ -1106,6 +1110,14 @@ static InputKind ParseFrontendArgs(FrontendOptions &Opts, ArgList &Args,
   }
 
   Opts.AddPluginActions = Args.getAllArgValues(OPT_add_plugin);
+  Opts.AddPluginArgs.resize(Opts.AddPluginActions.size());
+  for (int i = 0, e = Opts.AddPluginActions.size(); i != e; ++i) {
+    for (arg_iterator it = Args.filtered_begin(OPT_plugin_arg),
+           end = Args.filtered_end(); it != end; ++it) {
+      if ((*it)->getValue(Args, 0) == Opts.AddPluginActions[i])
+        Opts.AddPluginArgs[i].push_back((*it)->getValue(Args, 1));
+    }
+  }
 
   if (const Arg *A = Args.getLastArg(OPT_code_completion_at)) {
     Opts.CodeCompletionAt =
index 1a5c0422477ab3f365977cff847d850336a2f5f8..5f78fb17723d33eb3975eedd1cf0c038451f147e 100644 (file)
@@ -112,7 +112,7 @@ ASTConsumer* FrontendAction::CreateWrappedASTConsumer(CompilerInstance &CI,
       if (it->getName() == CI.getFrontendOpts().AddPluginActions[i]) {
         llvm::OwningPtr<PluginASTAction> P(it->instantiate());
         FrontendAction* c = P.get();
-        if (P->ParseArgs(CI, CI.getFrontendOpts().PluginArgs))
+        if (P->ParseArgs(CI, CI.getFrontendOpts().AddPluginArgs[i]))
           Consumers.push_back(c->CreateASTConsumer(CI, InFile));
       }
     }