Driver: Add an explicit offset to JoinedArg and JoinedAndSeparateArg, so that
they can be independent of the exact option that created them.

llvm-svn: 105739
diff --git a/clang/lib/Driver/Arg.cpp b/clang/lib/Driver/Arg.cpp
index 8243cab..9b02378 100644
--- a/clang/lib/Driver/Arg.cpp
+++ b/clang/lib/Driver/Arg.cpp
@@ -101,8 +101,9 @@
   return Args.getArgString(getIndex());
 }
 
-JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
-  : Arg(JoinedClass, Opt, Index, BaseArg) {
+JoinedArg::JoinedArg(const Option *Opt, unsigned Index, unsigned _Offset,
+                     const Arg *BaseArg)
+  : Arg(JoinedClass, Opt, Index, BaseArg), Offset(_Offset) {
 }
 
 void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -110,14 +111,14 @@
     Output.push_back(getOption().getName());
     Output.push_back(getValue(Args, 0));
   } else {
-    Output.push_back(Args.getArgString(getIndex()));
+    Output.push_back(Args.GetOrMakeJoinedArgString(
+                       getIndex(), getOption().getName(), getValue(Args, 0)));
   }
 }
 
 const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
   assert(N < getNumValues() && "Invalid index.");
-  // FIXME: Avoid strlen.
-  return Args.getArgString(getIndex()) + strlen(getOption().getName());
+  return Args.getArgString(getIndex()) + Offset;
 }
 
 CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
@@ -171,13 +172,14 @@
 }
 
 JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index,
-                                           const Arg *BaseArg)
-  : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) {
+                                           unsigned _Offset, const Arg *BaseArg)
+  : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg), Offset(_Offset) {
 }
 
 void JoinedAndSeparateArg::render(const ArgList &Args,
                                   ArgStringList &Output) const {
-  Output.push_back(Args.getArgString(getIndex()));
+  Output.push_back(Args.GetOrMakeJoinedArgString(
+                     getIndex(), getOption().getName(), getValue(Args, 0)));
   Output.push_back(Args.getArgString(getIndex() + 1));
 }
 
@@ -185,6 +187,6 @@
                                            unsigned N) const {
   assert(N < getNumValues() && "Invalid index.");
   if (N == 0)
-    return Args.getArgString(getIndex()) + strlen(getOption().getName());
+    return Args.getArgString(getIndex()) + Offset;
   return Args.getArgString(getIndex() + 1);
 }