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

Daniel Dunbar daniel at zuster.org
Wed Jun 9 15:31:04 PDT 2010


Author: ddunbar
Date: Wed Jun  9 17:31:04 2010
New Revision: 105761

URL: http://llvm.org/viewvc/llvm-project?rev=105761&view=rev
Log:
Driver: Keep the rendering style in the option, instead of as part of the Arg.

Modified:
    cfe/trunk/include/clang/Driver/Arg.h
    cfe/trunk/include/clang/Driver/Option.h
    cfe/trunk/lib/Driver/Arg.cpp
    cfe/trunk/lib/Driver/OptTable.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=105761&r1=105760&r2=105761&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Arg.h (original)
+++ cfe/trunk/include/clang/Driver/Arg.h Wed Jun  9 17:31:04 2010
@@ -109,7 +109,7 @@
     }
 
     /// render - Append the argument onto the given array as strings.
-    virtual void render(const ArgList &Args, ArgStringList &Output) const = 0;
+    void render(const ArgList &Args, ArgStringList &Output) const;
 
     /// renderAsInput - Append the argument, render as an input, onto
     /// the given array as strings. The distinction is that some
@@ -131,8 +131,6 @@
   public:
     FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg = 0);
 
-    virtual void render(const ArgList &Args, ArgStringList &Output) const;
-
     static bool classof(const Arg *A) {
       return A->getKind() == Arg::FlagClass;
     }
@@ -145,8 +143,6 @@
     PositionalArg(const Option *Opt, unsigned Index, const char *Value,
                   const Arg *BaseArg = 0);
 
-    virtual void render(const ArgList &Args, ArgStringList &Output) const;
-
     static bool classof(const Arg *A) {
       return A->getKind() == Arg::PositionalClass;
     }
@@ -160,8 +156,6 @@
     JoinedArg(const Option *Opt, unsigned Index, const char *Value,
               const Arg *BaseArg = 0);
 
-    virtual void render(const ArgList &Args, ArgStringList &Output) const;
-
     static bool classof(const Arg *A) {
       return A->getKind() == Arg::JoinedClass;
     }
@@ -175,8 +169,6 @@
     SeparateArg(const Option *Opt, unsigned Index, const char *Value,
                 const Arg *BaseArg = 0);
 
-    virtual void render(const ArgList &Args, ArgStringList &Output) const;
-
     static bool classof(const Arg *A) {
       return A->getKind() == Arg::SeparateClass;
     }
@@ -194,8 +186,6 @@
     CommaJoinedArg(const Option *Opt, unsigned Index, const char *Str,
                    const Arg *BaseArg = 0);
 
-    virtual void render(const ArgList &Args, ArgStringList &Output) const;
-
     static bool classof(const Arg *A) {
       return A->getKind() == Arg::CommaJoinedClass;
     }
@@ -210,8 +200,6 @@
                          const char *Value0, const char *Value1, 
                          const Arg *BaseArg = 0);
 
-    virtual void render(const ArgList &Args, ArgStringList &Output) const;
-
     static bool classof(const Arg *A) {
       return A->getKind() == Arg::JoinedAndSeparateClass;
     }

Modified: cfe/trunk/include/clang/Driver/Option.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Option.h?rev=105761&r1=105760&r2=105761&view=diff
==============================================================================
--- cfe/trunk/include/clang/Driver/Option.h (original)
+++ cfe/trunk/include/clang/Driver/Option.h Wed Jun  9 17:31:04 2010
@@ -50,6 +50,13 @@
       JoinedAndSeparateClass
     };
 
+    enum RenderStyleKind {
+      RenderCommaJoinedStyle,
+      RenderJoinedStyle,
+      RenderSeparateStyle,
+      RenderValuesStyle
+    };
+
   private:
     OptionClass Kind;
 
@@ -65,7 +72,7 @@
     /// Option that this is an alias for, if any.
     const Option *Alias;
 
-    /// Unsupported options will not be rejected.
+    /// Unsupported options will be rejected.
     bool Unsupported : 1;
 
     /// Treat this option like a linker input?
@@ -76,11 +83,8 @@
     // FIXME: We should ditch the render/renderAsInput distinction.
     bool NoOptAsInput : 1;
 
-    /// Always render this option as separate form its value.
-    bool ForceSeparateRender : 1;
-
-    /// Always render this option joined with its value.
-    bool ForceJoinedRender : 1;
+    /// The style to using when rendering arguments parsed by this option.
+    unsigned RenderStyle : 2;
 
     /// This option is only consumed by the driver.
     bool DriverOption : 1;
@@ -109,11 +113,10 @@
     bool hasNoOptAsInput() const { return NoOptAsInput; }
     void setNoOptAsInput(bool Value) { NoOptAsInput = Value; }
 
-    bool hasForceSeparateRender() const { return ForceSeparateRender; }
-    void setForceSeparateRender(bool Value) { ForceSeparateRender = Value; }
-
-    bool hasForceJoinedRender() const { return ForceJoinedRender; }
-    void setForceJoinedRender(bool Value) { ForceJoinedRender = Value; }
+    RenderStyleKind getRenderStyle() const {
+      return RenderStyleKind(RenderStyle);
+    }
+    void setRenderStyle(RenderStyleKind Value) { RenderStyle = Value; }
 
     bool isDriverOption() const { return DriverOption; }
     void setDriverOption(bool Value) { DriverOption = Value; }

Modified: cfe/trunk/lib/Driver/Arg.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Arg.cpp?rev=105761&r1=105760&r2=105761&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Arg.cpp (original)
+++ cfe/trunk/lib/Driver/Arg.cpp Wed Jun  9 17:31:04 2010
@@ -10,6 +10,7 @@
 #include "clang/Driver/Arg.h"
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/Option.h"
+#include "llvm/ADT/SmallString.h"
 #include "llvm/ADT/Twine.h"
 #include "llvm/Support/raw_ostream.h"
 
@@ -55,8 +56,8 @@
 }
 
 std::string Arg::getAsString(const ArgList &Args) const {
-  std::string Res;
-  llvm::raw_string_ostream OS(Res);
+  llvm::SmallString<256> Res;
+  llvm::raw_svector_ostream OS(Res);
 
   ArgStringList ASL;
   render(Args, ASL);
@@ -80,12 +81,42 @@
     Output.push_back(getValue(Args, i));
 }
 
-FlagArg::FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
-  : Arg(FlagClass, Opt, Index, BaseArg) {
+void Arg::render(const ArgList &Args, ArgStringList &Output) const {
+  switch (getOption().getRenderStyle()) {
+  case Option::RenderValuesStyle:
+    for (unsigned i = 0, e = getNumValues(); i != e; ++i)
+      Output.push_back(getValue(Args, i));
+    break;
+
+  case Option::RenderCommaJoinedStyle: {
+    llvm::SmallString<256> Res;
+    llvm::raw_svector_ostream OS(Res);
+    OS << getOption().getName();
+    for (unsigned i = 0, e = getNumValues(); i != e; ++i) {
+      if (i) OS << ',';
+      OS << getValue(Args, i);
+    }
+    Output.push_back(Args.MakeArgString(OS.str()));
+    break;
+  }
+ 
+ case Option::RenderJoinedStyle:
+    Output.push_back(Args.GetOrMakeJoinedArgString(
+                       getIndex(), getOption().getName(), getValue(Args, 0)));
+    for (unsigned i = 1, e = getNumValues(); i != e; ++i)
+      Output.push_back(getValue(Args, i));
+    break;
+
+  case Option::RenderSeparateStyle:
+    Output.push_back(getOption().getName());
+    for (unsigned i = 0, e = getNumValues(); i != e; ++i)
+      Output.push_back(getValue(Args, i));
+    break;
+  }
 }
 
-void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
-  Output.push_back(getOption().getName());
+FlagArg::FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
+  : Arg(FlagClass, Opt, Index, BaseArg) {
 }
 
 PositionalArg::PositionalArg(const Option *Opt, unsigned Index,
@@ -94,26 +125,12 @@
   getValues().push_back(Value0);
 }
 
-void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
-  Output.push_back(Args.getArgString(getIndex()));
-}
-
 JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const char *Value0,
                      const Arg *BaseArg)
   : Arg(JoinedClass, Opt, Index, BaseArg) {
   getValues().push_back(Value0);
 }
 
-void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
-  if (getOption().hasForceSeparateRender()) {
-    Output.push_back(getOption().getName());
-    Output.push_back(getValue(Args, 0));
-  } else {
-    Output.push_back(Args.GetOrMakeJoinedArgString(
-                       getIndex(), getOption().getName(), getValue(Args, 0)));
-  }
-}
-
 CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
                                const char *Str, const Arg *BaseArg)
   : Arg(CommaJoinedClass, Opt, Index, BaseArg) {
@@ -139,28 +156,12 @@
   setOwnsValues(true);
 }
 
-void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
-  Output.push_back(Args.getArgString(getIndex()));
-}
-
 SeparateArg::SeparateArg(const Option *Opt, unsigned Index, const char *Value0,
                          const Arg *BaseArg)
   : Arg(SeparateClass, Opt, Index, BaseArg) {
   getValues().push_back(Value0);
 }
 
-void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
-  if (getOption().hasForceJoinedRender()) {
-    assert(getNumValues() == 1 && "Cannot force joined render with > 1 args.");
-    Output.push_back(Args.MakeArgString(llvm::StringRef(getOption().getName()) +
-                                        getValue(Args, 0)));
-  } else {
-    Output.push_back(getOption().getName());
-    for (unsigned i = 0; i != getNumValues(); ++i)
-      Output.push_back(getValue(Args, i));
-  }
-}
-
 JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index,
                                            const char *Value0,
                                            const char *Value1,
@@ -169,10 +170,3 @@
   getValues().push_back(Value0);
   getValues().push_back(Value1);
 }
-
-void JoinedAndSeparateArg::render(const ArgList &Args,
-                                  ArgStringList &Output) const {
-  Output.push_back(Args.GetOrMakeJoinedArgString(
-                     getIndex(), getOption().getName(), getValue(Args, 0)));
-  Output.push_back(getValue(Args, 1));
-}

Modified: cfe/trunk/lib/Driver/OptTable.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/OptTable.cpp?rev=105761&r1=105760&r2=105761&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/OptTable.cpp (original)
+++ cfe/trunk/lib/Driver/OptTable.cpp Wed Jun  9 17:31:04 2010
@@ -169,12 +169,12 @@
   if (info.Flags & RenderJoined) {
     assert((info.Kind == Option::JoinedOrSeparateClass ||
             info.Kind == Option::SeparateClass) && "Invalid option.");
-    Opt->setForceJoinedRender(true);
+    Opt->setRenderStyle(Option::RenderJoinedStyle);
   }
   if (info.Flags & RenderSeparate) {
     assert((info.Kind == Option::JoinedOrSeparateClass ||
             info.Kind == Option::JoinedClass) && "Invalid option.");
-    Opt->setForceSeparateRender(true);
+    Opt->setRenderStyle(Option::RenderSeparateStyle);
   }
   if (info.Flags & Unsupported)
     Opt->setUnsupported(true);

Modified: cfe/trunk/lib/Driver/Option.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Option.cpp?rev=105761&r1=105760&r2=105761&view=diff
==============================================================================
--- cfe/trunk/lib/Driver/Option.cpp (original)
+++ cfe/trunk/lib/Driver/Option.cpp Wed Jun  9 17:31:04 2010
@@ -20,7 +20,6 @@
                const OptionGroup *_Group, const Option *_Alias)
   : Kind(_Kind), ID(_ID.getID()), Name(_Name), Group(_Group), Alias(_Alias),
     Unsupported(false), LinkerInput(false), NoOptAsInput(false),
-    ForceSeparateRender(false), ForceJoinedRender(false),
     DriverOption(false), NoArgumentUnused(false) {
 
   // Multi-level aliases are not supported, and alias options cannot
@@ -28,6 +27,31 @@
   // inherent limitation.
   assert((!Alias || (!Alias->Alias && !Group)) &&
          "Multi-level aliases and aliases with groups are unsupported.");
+
+  // Initialize rendering options based on the class.
+  switch (Kind) {
+  case GroupClass:
+  case InputClass:
+  case UnknownClass:
+    RenderStyle = RenderValuesStyle;
+    break;
+
+  case JoinedClass:
+  case JoinedAndSeparateClass:
+    RenderStyle = RenderJoinedStyle;
+    break;
+
+  case CommaJoinedClass:
+    RenderStyle = RenderCommaJoinedStyle;
+    break;
+
+  case FlagClass:
+  case SeparateClass:
+  case MultiArgClass:
+  case JoinedOrSeparateClass:
+    RenderStyle = RenderSeparateStyle;
+    break;
+  }
 }
 
 Option::~Option() {





More information about the cfe-commits mailing list