Handle "--" explicitly in the driver
authorHans Wennborg <hans@hanshq.net>
Tue, 13 Aug 2013 21:32:29 +0000 (21:32 +0000)
committerHans Wennborg <hans@hanshq.net>
Tue, 13 Aug 2013 21:32:29 +0000 (21:32 +0000)
Anything that comes after -- is treated as an input file. This
used to be handled automagically by the option parsing library,
but after LLVM r188314, we should handle it ourselves.

No functionality change.

llvm-svn: 188316

clang/include/clang/Driver/Options.td
clang/lib/Driver/Driver.cpp

index ffe30a862b87a89438fa1ff809857eea1a2cc5e3..c72622d84256b1fe738b218b845850a564b00753 100644 (file)
@@ -179,6 +179,8 @@ def ccc_ : Joined<["-"], "ccc-">, Group<internal_Group>, Flags<[Unsupported]>;
 
 def _HASH_HASH_HASH : Flag<["-"], "###">, Flags<[DriverOption, CoreOption]>,
     HelpText<"Print the commands to run for this compilation">;
+def _DASH_DASH : Option<["--"], "", KIND_REMAINING_ARGS>,
+    Flags<[DriverOption, CoreOption]>;
 def A : JoinedOrSeparate<["-"], "A">;
 def B : JoinedOrSeparate<["-"], "B">;
 def CC : Flag<["-"], "CC">, Flags<[CC1Option]>;
index bbdb6fb8d173050be84eb72c1372053deb57da33..68958047ba739aa9f73fab8bb247858435ab90c3 100644 (file)
@@ -186,6 +186,14 @@ const {
   return FinalPhase;
 }
 
+static Arg* MakeInputArg(const DerivedArgList &Args, OptTable *Opts,
+                         StringRef Value) {
+  Arg *A = new Arg(Opts->getOption(options::OPT_INPUT), Value,
+                   Args.getBaseArgs().MakeIndex(Value), Value.data());
+  A->claim();
+  return A;
+}
+
 DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
   DerivedArgList *DAL = new DerivedArgList(Args);
 
@@ -251,6 +259,14 @@ DerivedArgList *Driver::TranslateInputArgs(const InputArgList &Args) const {
       }
     }
 
+    // Pick up inputs via the -- option.
+    if (A->getOption().matches(options::OPT__DASH_DASH)) {
+      A->claim();
+      for (unsigned i = 0, e = A->getNumValues(); i != e; ++i)
+        DAL->append(MakeInputArg(*DAL, Opts, A->getValue(i)));
+      continue;
+    }
+
     DAL->append(*it);
   }
 
@@ -375,7 +391,7 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) {
 
   // Construct the list of inputs.
   InputList Inputs;
-  BuildInputs(C->getDefaultToolChain(), C->getArgs(), Inputs);
+  BuildInputs(C->getDefaultToolChain(), *TranslatedArgs, Inputs);
 
   // Construct the list of abstract actions to perform for this compilation. On
   // Darwin target OSes this uses the driver-driver and universal actions.
@@ -990,14 +1006,6 @@ static bool DiagnoseInputExistance(const Driver &D, const DerivedArgList &Args,
   return false;
 }
 
-static Arg* MakeInputArg(const DerivedArgList &Args, OptTable *Opts,
-                         StringRef Value) {
-  unsigned Index = Args.getBaseArgs().MakeIndex(Value);
-  Arg *A = Opts->ParseOneArg(Args, Index);
-  A->claim();
-  return A;
-}
-
 // Construct a the list of inputs and their types.
 void Driver::BuildInputs(const ToolChain &TC, const DerivedArgList &Args,
                          InputList &Inputs) const {