[cfe-commits] r105739 - in /cfe/trunk: include/clang/Driver/Arg.h include/clang/Driver/ArgList.h lib/Driver/Arg.cpp lib/Driver/ArgList.cpp lib/Driver/Option.cpp

Daniel Dunbar daniel at zuster.org
Wed Jun 9 11:49:38 PDT 2010


Author: ddunbar
Date: Wed Jun  9 13:49:38 2010
New Revision: 105739

URL: http://llvm.org/viewvc/llvm-project?rev=105739&view=rev
Log:
Driver: Add an explicit offset to JoinedArg and JoinedAndSeparateArg, so that
they can be independent of the exact option that created them.

Modified:
    cfe/trunk/include/clang/Driver/Arg.h
    cfe/trunk/include/clang/Driver/ArgList.h
    cfe/trunk/lib/Driver/Arg.cpp
    cfe/trunk/lib/Driver/ArgList.cpp
    cfe/trunk/lib/Driver/Option.cpp

Modified: cfe/trunk/include/clang/Driver/Arg.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Arg.h?rev=105739&r1=105738&r2=105739&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Arg.h (original)
+++ cfe/trunk/include/clang/Driver/Arg.h Wed Jun  9 13:49:38 2010
@@ -149,8 +149,12 @@
   /// JoinedArg - A single value argument where the value is joined
   /// (suffixed) to the option.
   class JoinedArg : public Arg {
+    /// The offset of the joined argument value.
+    unsigned Offset;
+
   public:
-    JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg = 0);
+    JoinedArg(const Option *Opt, unsigned Index, unsigned Offset,
+              const Arg *BaseArg = 0);
 
     virtual void render(const ArgList &Args, ArgStringList &Output) const;
 
@@ -210,9 +214,12 @@
   /// JoinedAndSeparateArg - An argument with both joined and separate
   /// values.
   class JoinedAndSeparateArg : public Arg {
+    /// The offset of the joined argument value.
+    unsigned Offset;
+
   public:
     JoinedAndSeparateArg(const Option *Opt, unsigned Index,
-                         const Arg *BaseArg = 0);
+                         unsigned Offset, const Arg *BaseArg = 0);
 
     virtual void render(const ArgList &Args, ArgStringList &Output) const;
 

Modified: cfe/trunk/include/clang/Driver/ArgList.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/ArgList.h?rev=105739&r1=105738&r2=105739&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/ArgList.h (original)
+++ cfe/trunk/include/clang/Driver/ArgList.h Wed Jun  9 13:49:38 2010
@@ -249,6 +249,11 @@
     }
     const char *MakeArgString(const llvm::Twine &Str) const;
 
+    /// \brief Create an arg string for (\arg LHS + \arg RHS), reusing the
+    /// string at \arg Index if possible.
+    const char *GetOrMakeJoinedArgString(unsigned Index, llvm::StringRef LHS,
+                                         llvm::StringRef RHS) const;
+
     /// @}
   };
 

Modified: cfe/trunk/lib/Driver/Arg.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Arg.cpp?rev=105739&r1=105738&r2=105739&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Arg.cpp (original)
+++ cfe/trunk/lib/Driver/Arg.cpp Wed Jun  9 13:49:38 2010
@@ -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);
 }

Modified: cfe/trunk/lib/Driver/ArgList.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ArgList.cpp?rev=105739&r1=105738&r2=105739&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/ArgList.cpp (original)
+++ cfe/trunk/lib/Driver/ArgList.cpp Wed Jun  9 13:49:38 2010
@@ -191,6 +191,17 @@
   return MakeArgString(Str.str());
 }
 
+const char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
+                                              llvm::StringRef LHS,
+                                              llvm::StringRef RHS) const {
+  llvm::StringRef Cur = getArgString(Index);
+  if (Cur.size() == LHS.size() + RHS.size() &&
+      Cur.startswith(LHS) && Cur.endswith(RHS))
+    return Cur.data();
+
+  return MakeArgString(LHS + RHS);
+}
+
 //
 
 InputArgList::InputArgList(const char **ArgBegin, const char **ArgEnd)
@@ -269,7 +280,7 @@
 Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
                                    llvm::StringRef Value) const {
   Arg *A = new JoinedArg(Opt, BaseArgs.MakeIndex(Opt->getName() + Value.str()),
-                         BaseArg);
+                         strlen(Opt->getName()), BaseArg);
   SynthesizedArgs.push_back(A);
   return A;
 }

Modified: cfe/trunk/lib/Driver/Option.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Option.cpp?rev=105739&r1=105738&r2=105739&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Option.cpp (original)
+++ cfe/trunk/lib/Driver/Option.cpp Wed Jun  9 13:49:38 2010
@@ -133,7 +133,7 @@
 
 Arg *JoinedOption::accept(const InputArgList &Args, unsigned &Index) const {
   // Always matches.
-  return new JoinedArg(this, Index++);
+  return new JoinedArg(this, Index++, strlen(getName()));
 }
 
 CommaJoinedOption::CommaJoinedOption(OptSpecifier ID, const char *Name,
@@ -191,7 +191,8 @@
   return new SeparateArg(this, Index - 1 - NumArgs, NumArgs);
 }
 
-JoinedOrSeparateOption::JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
+JoinedOrSeparateOption::JoinedOrSeparateOption(OptSpecifier ID,
+                                               const char *Name,
                                                const OptionGroup *Group,
                                                const Option *Alias)
   : Option(Option::JoinedOrSeparateClass, ID, Name, Group, Alias) {
@@ -202,7 +203,7 @@
   // If this is not an exact match, it is a joined arg.
   // FIXME: Avoid strlen.
   if (strlen(getName()) != strlen(Args.getArgString(Index)))
-    return new JoinedArg(this, Index++);
+    return new JoinedArg(this, Index++, strlen(getName()));
 
   // Otherwise it must be separate.
   Index += 2;
@@ -227,6 +228,6 @@
   if (Index > Args.getNumInputArgStrings())
     return 0;
 
-  return new JoinedAndSeparateArg(this, Index - 2);
+  return new JoinedAndSeparateArg(this, Index - 2, strlen(getName()));
 }
 





More information about the cfe-commits mailing list