Driver: Track which original arguments an arg is derived from, so that
we can properly claim arguments, even if they have been translated by
the tool chain.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68020 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/Arg.cpp b/lib/Driver/Arg.cpp
index 1d8d249..e227d7e 100644
--- a/lib/Driver/Arg.cpp
+++ b/lib/Driver/Arg.cpp
@@ -14,11 +14,9 @@
 
 using namespace clang::driver;
 
-Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index) 
-  : Kind(_Kind),
-    Opt(_Opt),
-    Index(_Index),
-    Claimed(false)
+Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index, 
+         const Arg *_BaseArg) 
+  : Kind(_Kind), Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false)
 {
 }
 
@@ -76,8 +74,8 @@
     Output.push_back(getValue(Args, i));
 }
 
-FlagArg::FlagArg(const Option *Opt, unsigned Index)
-  : Arg(FlagClass, Opt, Index) {
+FlagArg::FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
+  : Arg(FlagClass, Opt, Index, BaseArg) {
 }
 
 void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -89,8 +87,9 @@
   return 0;
 }
 
-PositionalArg::PositionalArg(const Option *Opt, unsigned Index)
-  : Arg(PositionalClass, Opt, Index) {
+PositionalArg::PositionalArg(const Option *Opt, unsigned Index, 
+                             const Arg *BaseArg)
+  : Arg(PositionalClass, Opt, Index, BaseArg) {
 }
 
 void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -102,8 +101,8 @@
   return Args.getArgString(getIndex());
 }
 
-JoinedArg::JoinedArg(const Option *Opt, unsigned Index)
-  : Arg(JoinedClass, Opt, Index) {
+JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
+  : Arg(JoinedClass, Opt, Index, BaseArg) {
 }
 
 void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -122,8 +121,8 @@
 }
 
 CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index, 
-                               const char *Str)
-  : Arg(CommaJoinedClass, Opt, Index) {
+                               const char *Str, const Arg *BaseArg)
+  : Arg(CommaJoinedClass, Opt, Index, BaseArg) {
   const char *Prev = Str;  
   for (;; ++Str) {
     char c = *Str;
@@ -149,8 +148,9 @@
   return Values[N].c_str();
 }
 
-SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues)
-  : Arg(SeparateClass, Opt, Index), NumValues(_NumValues) {
+SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues,
+                         const Arg *BaseArg)
+  : Arg(SeparateClass, Opt, Index, BaseArg), NumValues(_NumValues) {
 }
 
 void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -172,8 +172,9 @@
   return Args.getArgString(getIndex() + 1 + N);
 }
 
-JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index)
-  : Arg(JoinedAndSeparateClass, Opt, Index) {
+JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index, 
+                                           const Arg *BaseArg)
+  : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) {
 }
 
 void JoinedAndSeparateArg::render(const ArgList &Args,