]> granicus.if.org Git - clang/commitdiff
Driver: Prep for tool chain specific argument translation.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 25 Mar 2009 04:13:45 +0000 (04:13 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 25 Mar 2009 04:13:45 +0000 (04:13 +0000)
 - Lift ArgList to a base class for InputArgList and DerivedArgList.

 - This is not a great decomposition, but it does embed the
   translation into the type system, and keep things efficient for
   tool chains that don't want to do any translation.

 - No intended functionality change.

Eventually I hope to get rid of tool chain specific translation and
have each tool do the right thing, but for now this is the easiest way
to match gcc precisely (which is good for testing).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67676 91177308-0d34-0410-b5e6-96231b3b80d8

13 files changed:
include/clang/Driver/ArgList.h
include/clang/Driver/Compilation.h
include/clang/Driver/Driver.h
include/clang/Driver/Option.h
include/clang/Driver/Options.h
include/clang/Driver/ToolChain.h
lib/Driver/ArgList.cpp
lib/Driver/Compilation.cpp
lib/Driver/Driver.cpp
lib/Driver/OptTable.cpp
lib/Driver/Option.cpp
lib/Driver/ToolChains.cpp
lib/Driver/ToolChains.h

index e2b4cf47fdd9b54f8a9f41784833f765b6fa5b66..fea6dd8ef25636d8b5e12b5608af052b3315b8ba 100644 (file)
@@ -36,30 +36,23 @@ namespace driver {
     typedef arglist_type::const_reverse_iterator const_reverse_iterator;
 
   private:
-    /// List of argument strings used by the contained Args.
-    ///
-    /// This is mutable since we treat the ArgList as being the list
-    /// of Args, and allow routines to add new strings (to have a
-    /// convenient place to store the memory) via MakeIndex.
-    mutable ArgStringList ArgStrings;
-
-    /// Strings for synthesized arguments.
-    ///
-    /// This is mutable since we treat the ArgList as being the list
-    /// of Args, and allow routines to add new strings (to have a
-    /// convenient place to store the memory) via MakeIndex.
-    mutable std::list<std::string> SynthesizedStrings;
-
     /// The full list of arguments.
-    arglist_type Args;
+    arglist_type &Args;
 
-    /// The number of original input argument strings.
-    unsigned NumInputArgStrings;
+  protected:
+    ArgList(arglist_type &Args);
 
   public:
-    ArgList(const char **ArgBegin, const char **ArgEnd);
-    ArgList(const ArgList &);
-    ~ArgList();
+    virtual ~ArgList();
+
+    /// @name Arg Access
+    /// @{
+
+    /// append - Append \arg A to the arg list.
+    void append(Arg *A);
+
+    arglist_type &getArgs() { return Args; }
+    const arglist_type &getArgs() const { return Args; }
 
     unsigned size() const { return Args.size(); }
 
@@ -74,16 +67,6 @@ namespace driver {
     
     const_reverse_iterator rbegin() const { return Args.rbegin(); }
     const_reverse_iterator rend() const { return Args.rend(); }
-    
-    /// append - Append \arg A to the arg list, taking ownership.
-    void append(Arg *A);
-
-    /// getArgString - Return the input argument string at \arg Index.
-    const char *getArgString(unsigned Index) const { return ArgStrings[Index]; }
-
-    /// getNumInputArgStrings - Return the number of original input
-    /// argument strings.
-    unsigned getNumInputArgStrings() const { return NumInputArgStrings; }
 
     /// hasArg - Does the arg list contain any option matching \arg Id.
     ///
@@ -98,36 +81,8 @@ namespace driver {
     Arg *getLastArg(options::ID Id, bool Claim=true) const;
     Arg *getLastArg(options::ID Id0, options::ID Id1, bool Claim=true) const;
 
-    /// @name Arg Synthesis
-    /// @{
-
-  private:    
-    /// MakeIndex - Get an index for the given string(s).
-    unsigned MakeIndex(const char *String0) const;
-    unsigned MakeIndex(const char *String0, const char *String1) const;
-
-  public:
-    /// MakeArgString - Construct a constant string pointer whose
-    /// lifetime will match that of the ArgList.
-    const char *MakeArgString(const char *Str) const;
-
-    /// MakeFlagArg - Construct a new FlagArg for the given option
-    /// \arg Id.
-    Arg *MakeFlagArg(const Option *Opt) const;
-
-    /// MakePositionalArg - Construct a new Positional arg for the
-    /// given option \arg Id, with the provided \arg Value.
-    Arg *MakePositionalArg(const Option *Opt, const char *Value) const;
-
-    /// MakeSeparateArg - Construct a new Positional arg for the
-    /// given option \arg Id, with the provided \arg Value.
-    Arg *MakeSeparateArg(const Option *Opt, const char *Value) const;
-
-    /// MakeJoinedArg - Construct a new Positional arg for the
-    /// given option \arg Id, with the provided \arg Value.
-    Arg *MakeJoinedArg(const Option *Opt, const char *Value) const;
-
-    /// @}
+    /// getArgString - Return the input argument string at \arg Index.
+    virtual const char *getArgString(unsigned Index) const = 0;
     /// @name Translation Utilities
     /// @{
 
@@ -155,8 +110,115 @@ namespace driver {
     void AddAllArgValues(ArgStringList &Output, options::ID Id0, 
                          options::ID Id1) const;
 
+    /// @}
+    /// @name Arg Synthesis
+    /// @{
+
+    /// MakeArgString - Construct a constant string pointer whose
+    /// lifetime will match that of the ArgList.
+    virtual const char *MakeArgString(const char *Str) const = 0;
+
     /// @}
   };
+
+  class InputArgList : public ArgList  {
+  private:
+    /// The internal list of arguments.
+    arglist_type ActualArgs;
+
+    /// List of argument strings used by the contained Args.
+    ///
+    /// This is mutable since we treat the ArgList as being the list
+    /// of Args, and allow routines to add new strings (to have a
+    /// convenient place to store the memory) via MakeIndex.
+    mutable ArgStringList ArgStrings;
+
+    /// Strings for synthesized arguments.
+    ///
+    /// This is mutable since we treat the ArgList as being the list
+    /// of Args, and allow routines to add new strings (to have a
+    /// convenient place to store the memory) via MakeIndex.
+    mutable std::list<std::string> SynthesizedStrings;
+
+    /// The number of original input argument strings.
+    unsigned NumInputArgStrings;
+
+  public:
+    InputArgList(const char **ArgBegin, const char **ArgEnd);
+    InputArgList(const ArgList &);
+    ~InputArgList();
+
+    virtual const char *getArgString(unsigned Index) const { 
+      return ArgStrings[Index]; 
+    }
+
+    /// getNumInputArgStrings - Return the number of original input
+    /// argument strings.
+    unsigned getNumInputArgStrings() const { return NumInputArgStrings; }
+
+    /// @name Arg Synthesis
+    /// @{
+
+  public:
+    /// MakeIndex - Get an index for the given string(s).
+    unsigned MakeIndex(const char *String0) const;
+    unsigned MakeIndex(const char *String0, const char *String1) const;
+
+    virtual const char *MakeArgString(const char *Str) const;
+
+    /// @}
+  };
+
+  /// DerivedArgList - An ordered collection of driver arguments,
+  /// whose storage may be in another argument list.
+  class DerivedArgList : public ArgList {
+    InputArgList &BaseArgs;
+
+    /// The internal list of arguments.
+    arglist_type ActualArgs;
+
+    /// The list of arguments we synthesized.
+    arglist_type SynthesizedArgs;
+
+    /// Is this only a proxy for the base ArgList?
+    bool OnlyProxy;
+
+  public:
+    /// Construct a new derived arg list from \arg BaseArgs.
+    ///
+    /// \param OnlyProxy - If true, this is only a proxy for the base
+    /// list (to adapt the type), and it's Args list is unused.
+    DerivedArgList(InputArgList &BaseArgs, bool OnlyProxy);
+    ~DerivedArgList();
+
+    virtual const char *getArgString(unsigned Index) const {
+      return BaseArgs.getArgString(Index); 
+    }
+
+    /// @name Arg Synthesis
+    /// @{
+
+    virtual const char *MakeArgString(const char *Str) const;
+
+    /// MakeFlagArg - Construct a new FlagArg for the given option
+    /// \arg Id.
+    Arg *MakeFlagArg(const Option *Opt) const;
+
+    /// MakePositionalArg - Construct a new Positional arg for the
+    /// given option \arg Id, with the provided \arg Value.
+    Arg *MakePositionalArg(const Option *Opt, const char *Value) const;
+
+    /// MakeSeparateArg - Construct a new Positional arg for the
+    /// given option \arg Id, with the provided \arg Value.
+    Arg *MakeSeparateArg(const Option *Opt, const char *Value) const;
+
+    /// MakeJoinedArg - Construct a new Positional arg for the
+    /// given option \arg Id, with the provided \arg Value.
+    Arg *MakeJoinedArg(const Option *Opt, const char *Value) const;
+
+    /// @}
+  };
+
 } // end namespace driver
 } // end namespace clang
 
index 1a6d7b02ea8bfbd9440e368e83ce6f0be1cc3359..4985f30ad553d647478f227f98e3304d33d9ff30 100644 (file)
@@ -22,8 +22,9 @@ namespace llvm {
 
 namespace clang {
 namespace driver {
-  class ArgList;
+  class DerivedArgList;
   class Driver;
+  class InputArgList;
   class JobList;
   class ToolChain;
 
@@ -37,7 +38,7 @@ class Compilation {
   ToolChain &DefaultToolChain;
 
   /// The original (untranslated) input argument list.
-  ArgList *Args;
+  InputArgList *Args;
 
   /// The list of actions.
   ActionList Actions;
@@ -46,7 +47,7 @@ class Compilation {
   JobList Jobs;
 
   /// Cache of translated arguments for a particular tool chain.
-  llvm::DenseMap<const ToolChain*, ArgList*> TCArgs;
+  llvm::DenseMap<const ToolChain*, DerivedArgList*> TCArgs;
 
   /// Temporary files which should be removed on exit.
   ArgStringList TempFiles;
@@ -55,24 +56,24 @@ class Compilation {
   ArgStringList ResultFiles;
 
 public:
-  Compilation(Driver &D, ToolChain &DefaultToolChain, ArgList *Args);
+  Compilation(Driver &D, ToolChain &DefaultToolChain, InputArgList *Args);
   ~Compilation();
 
   const Driver &getDriver() const { return TheDriver; }
 
   const ToolChain &getDefaultToolChain() const { return DefaultToolChain; }
 
-  const ArgList &getArgs() const { return *Args; }
+  const InputArgList &getArgs() const { return *Args; }
 
   ActionList &getActions() { return Actions; }
   const ActionList &getActions() const { return Actions; }
 
   JobList &getJobs() { return Jobs; }
 
-  /// getArgsForToolChain - Return the argument list, possibly
-  /// translated by the tool chain \arg TC (or by the default tool
-  /// chain, if TC is not specified).
-  const ArgList &getArgsForToolChain(const ToolChain *TC = 0);
+  /// getArgsForToolChain - Return the derived argument list for the
+  /// tool chain \arg TC (or the default tool chain, if TC is not
+  /// specified).
+  const DerivedArgList &getArgsForToolChain(const ToolChain *TC = 0);
 
   /// addTempFile - Add a file to remove on exit, and returns its
   /// argument.
index 5ba737379dafa638635c293e12eee7bf182e5fda..4935acc66da878699e4f74aece26efb14b4e8dfb 100644 (file)
@@ -27,6 +27,7 @@ namespace driver {
   class ArgList;
   class Compilation;
   class HostInfo;
+  class InputArgList;
   class InputInfo;
   class JobAction;
   class OptTable;
@@ -130,7 +131,7 @@ public:
 
   /// ParseArgStrings - Parse the given list of strings into an
   /// ArgList.
-  ArgList *ParseArgStrings(const char **ArgBegin, const char **ArgEnd);
+  InputArgList *ParseArgStrings(const char **ArgBegin, const char **ArgEnd);
 
   /// BuildActions - Construct the list of actions to perform for the
   /// given arguments, which are only done for a single architecture.
index 57e15cb00f04a770d68ae5c6a6574e07b4c202a2..79b512e607b156e3ddfc98209ea7b7ffbc0e1592 100644 (file)
@@ -22,7 +22,7 @@ using llvm::dyn_cast_or_null;
 namespace clang {
 namespace driver {
   class Arg;
-  class ArgList;
+  class InputArgList;
   class OptionGroup;
   
   /// Option - Abstract representation for a single form of driver
@@ -140,7 +140,7 @@ namespace driver {
     /// If the option accepts the current argument, accept() sets
     /// Index to the position where argument parsing should resume
     /// (even if the argument is missing values).
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const = 0;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const = 0;
     
     void dump() const;
 
@@ -153,7 +153,7 @@ namespace driver {
   public:
     OptionGroup(options::ID ID, const char *Name, const OptionGroup *Group);
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::GroupClass; 
@@ -168,7 +168,7 @@ namespace driver {
   public:
     InputOption();
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::InputClass; 
@@ -181,7 +181,7 @@ namespace driver {
   public:
     UnknownOption();
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::UnknownClass; 
@@ -196,7 +196,7 @@ namespace driver {
     FlagOption(options::ID ID, const char *Name, const OptionGroup *Group, 
                const Option *Alias);
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::FlagClass; 
@@ -209,7 +209,7 @@ namespace driver {
     JoinedOption(options::ID ID, const char *Name, const OptionGroup *Group, 
                  const Option *Alias);
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::JoinedClass; 
@@ -222,7 +222,7 @@ namespace driver {
     SeparateOption(options::ID ID, const char *Name, const OptionGroup *Group, 
                    const Option *Alias);
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::SeparateClass; 
@@ -235,7 +235,7 @@ namespace driver {
     CommaJoinedOption(options::ID ID, const char *Name, 
                       const OptionGroup *Group, const Option *Alias);
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::CommaJoinedClass; 
@@ -256,7 +256,7 @@ namespace driver {
 
     unsigned getNumArgs() const { return NumArgs; }
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::MultiArgClass; 
@@ -271,7 +271,7 @@ namespace driver {
     JoinedOrSeparateOption(options::ID ID, const char *Name, 
                            const OptionGroup *Group, const Option *Alias);
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::JoinedOrSeparateClass; 
@@ -286,7 +286,7 @@ namespace driver {
     JoinedAndSeparateOption(options::ID ID, const char *Name, 
                             const OptionGroup *Group, const Option *Alias);
 
-    virtual Arg *accept(const ArgList &Args, unsigned &Index) const;
+    virtual Arg *accept(const InputArgList &Args, unsigned &Index) const;
 
     static bool classof(const Option *O) { 
       return O->getKind() == Option::JoinedAndSeparateClass; 
index efa32d929ca8f8a30846af1f7637d96d2c36acb2..d5bc4d5b8a81c9327d7d4c98057bfcf654407ed1 100644 (file)
@@ -15,8 +15,8 @@ namespace driver {
 namespace options {
   enum ID {
     OPT_INVALID = 0, // This is not an option ID.
-    OPT_INPUT,      // Reserved ID for input option.
-    OPT_UNKNOWN,    // Reserved ID for unknown option.
+    OPT_INPUT,       // Reserved ID for input option.
+    OPT_UNKNOWN,     // Reserved ID for unknown option.
 #define OPTION(NAME, ID, KIND, GROUP, ALIAS, FLAGS, PARAM) OPT_##ID,
 #include "clang/Driver/Options.def"
     LastOption
@@ -25,7 +25,7 @@ namespace options {
 }
   
   class Arg;
-  class ArgList;
+  class InputArgList;
   class Option;
 
   /// OptTable - Provide access to the Option info table.
@@ -70,7 +70,7 @@ namespace options {
     /// \return - The parsed argument, or 0 if the argument is missing
     /// values (in which case Index still points at the conceptual
     /// next argument string to parse).
-    Arg *ParseOneArg(const ArgList &Args, unsigned &Index) const;
+    Arg *ParseOneArg(const InputArgList &Args, unsigned &Index) const;
   };
 }
 }
index 99d9bcb3cb5eba86030305aee9a896bed3b2a294..e85d7a7e204a5b7e39b47e531e44d206769ebc27 100644 (file)
 
 namespace clang {
 namespace driver {
-  class ArgList;
   class Compilation;
+  class DerivedArgList;
   class HostInfo;
+  class InputArgList;
   class JobAction;
   class Tool;
 
@@ -63,10 +64,7 @@ public:
 
   /// TranslateArgs - Create a new derived argument list for any
   /// argument translations this ToolChain may wish to perform.
-  ///
-  /// The client implementation is free to return Args directly if no
-  /// translations need to be performed.
-  virtual ArgList *TranslateArgs(ArgList &Args) const = 0;
+  virtual DerivedArgList *TranslateArgs(InputArgList &Args) const = 0;
 
   /// SelectTool - Choose a tool to use to handle the action \arg JA.
   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const = 0;
index d74e3bd59d73ef95bb091e5d6383bea5fe1be1d1..bd3aab351d622ae316f02b1189e7a0c12f549101 100644 (file)
 
 using namespace clang::driver;
 
-ArgList::ArgList(const char **ArgBegin, const char **ArgEnd) 
-  : NumInputArgStrings(ArgEnd - ArgBegin) 
-{
-  ArgStrings.append(ArgBegin, ArgEnd);
+ArgList::ArgList(arglist_type &_Args) : Args(_Args) {
 }
 
 ArgList::~ArgList() {
-  for (iterator it = begin(), ie = end(); it != ie; ++it)
-    delete *it;
 }
 
 void ArgList::append(Arg *A) {
-  if (A->getOption().isUnsupported()) {
-    assert(0 && "FIXME: unsupported unsupported.");
-  }
-
   Args.push_back(A);
 }
 
@@ -68,46 +59,6 @@ bool ArgList::hasFlag(options::ID Pos, options::ID Neg, bool Default) const {
   return Default;
 }
 
-unsigned ArgList::MakeIndex(const char *String0) const {
-  unsigned Index = ArgStrings.size();
-
-  // Tuck away so we have a reliable const char *.
-  SynthesizedStrings.push_back(String0);
-  ArgStrings.push_back(SynthesizedStrings.back().c_str());
-
-  return Index;
-}
-
-unsigned ArgList::MakeIndex(const char *String0, const char *String1) const {
-  unsigned Index0 = MakeIndex(String0);
-  unsigned Index1 = MakeIndex(String1);
-  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
-  (void) Index1;
-  return Index0;
-}
-
-const char *ArgList::MakeArgString(const char *Str) const {
-  return getArgString(MakeIndex(Str));
-}
-
-Arg *ArgList::MakeFlagArg(const Option *Opt) const {
-  return new FlagArg(Opt, MakeIndex(Opt->getName()));
-}
-
-Arg *ArgList::MakePositionalArg(const Option *Opt, const char *Value) const {
-  return new PositionalArg(Opt, MakeIndex(Value));
-}
-
-Arg *ArgList::MakeSeparateArg(const Option *Opt, const char *Value) const {
-  return new SeparateArg(Opt, MakeIndex(Opt->getName(), Value), 1);
-}
-
-Arg *ArgList::MakeJoinedArg(const Option *Opt, const char *Value) const {
-  std::string Joined(Opt->getName());
-  Joined += Value;
-  return new JoinedArg(Opt, MakeIndex(Joined.c_str()));
-}
-
 void ArgList::AddLastArg(ArgStringList &Output, options::ID Id) const {
   if (Arg *A = getLastArg(Id)) {
     A->claim();
@@ -175,3 +126,80 @@ void ArgList::AddAllArgValues(ArgStringList &Output, options::ID Id0,
     }
   }
 }
+
+//
+
+InputArgList::InputArgList(const char **ArgBegin, const char **ArgEnd) 
+  : ArgList(ActualArgs), NumInputArgStrings(ArgEnd - ArgBegin) 
+{
+  ArgStrings.append(ArgBegin, ArgEnd);
+}
+
+InputArgList::~InputArgList() {
+  // An InputArgList always owns its arguments.
+  for (iterator it = begin(), ie = end(); it != ie; ++it)
+    delete *it;
+}
+
+unsigned InputArgList::MakeIndex(const char *String0) const {
+  unsigned Index = ArgStrings.size();
+
+  // Tuck away so we have a reliable const char *.
+  SynthesizedStrings.push_back(String0);
+  ArgStrings.push_back(SynthesizedStrings.back().c_str());
+
+  return Index;
+}
+
+unsigned InputArgList::MakeIndex(const char *String0, 
+                                 const char *String1) const {
+  unsigned Index0 = MakeIndex(String0);
+  unsigned Index1 = MakeIndex(String1);
+  assert(Index0 + 1 == Index1 && "Unexpected non-consecutive indices!");
+  (void) Index1;
+  return Index0;
+}
+
+const char *InputArgList::MakeArgString(const char *Str) const {
+  return getArgString(MakeIndex(Str));
+}
+
+//
+
+DerivedArgList::DerivedArgList(InputArgList &_BaseArgs, bool _OnlyProxy)
+  : ArgList(_OnlyProxy ? _BaseArgs.getArgs() : ActualArgs),
+    BaseArgs(_BaseArgs), OnlyProxy(_OnlyProxy)
+{
+}
+
+DerivedArgList::~DerivedArgList() {
+  // We only own the arguments we explicitly synthesized.
+  for (iterator it = SynthesizedArgs.begin(), ie = SynthesizedArgs.end(); 
+       it != ie; ++it)
+    delete *it;
+}
+
+const char *DerivedArgList::MakeArgString(const char *Str) const {
+  return BaseArgs.MakeArgString(Str);
+}
+
+Arg *DerivedArgList::MakeFlagArg(const Option *Opt) const {
+  return new FlagArg(Opt, BaseArgs.MakeIndex(Opt->getName()));
+}
+
+Arg *DerivedArgList::MakePositionalArg(const Option *Opt, 
+                                       const char *Value) const {
+  return new PositionalArg(Opt, BaseArgs.MakeIndex(Value));
+}
+
+Arg *DerivedArgList::MakeSeparateArg(const Option *Opt, 
+                                     const char *Value) const {
+  return new SeparateArg(Opt, BaseArgs.MakeIndex(Opt->getName(), Value), 1);
+}
+
+Arg *DerivedArgList::MakeJoinedArg(const Option *Opt, 
+                                   const char *Value) const {
+  std::string Joined(Opt->getName());
+  Joined += Value;
+  return new JoinedArg(Opt, BaseArgs.MakeIndex(Joined.c_str()));
+}
index 2165bb74018a650451c7adb4274c7a0032fe3582..1e044c6b8fdc1a21ce95180feeccfa0f0b155d01 100644 (file)
@@ -23,7 +23,7 @@ using namespace clang::driver;
 
 Compilation::Compilation(Driver &D,
                          ToolChain &_DefaultToolChain,
-                         ArgList *_Args) 
+                         InputArgList *_Args) 
   : TheDriver(D), DefaultToolChain(_DefaultToolChain), Args(_Args) {
 }
 
@@ -31,12 +31,9 @@ Compilation::~Compilation() {
   delete Args;
   
   // Free any derived arg lists.
-  for (llvm::DenseMap<const ToolChain*, ArgList*>::iterator 
-         it = TCArgs.begin(), ie = TCArgs.end(); it != ie; ++it) {
-    ArgList *A = it->second;
-    if (A != Args)
-      delete Args;
-  }
+  for (llvm::DenseMap<const ToolChain*, DerivedArgList*>::iterator 
+         it = TCArgs.begin(), ie = TCArgs.end(); it != ie; ++it)
+    delete it->second;
 
   // Free the actions, if built.
   for (ActionList::iterator it = Actions.begin(), ie = Actions.end(); 
@@ -44,11 +41,11 @@ Compilation::~Compilation() {
     delete *it;
 }
 
-const ArgList &Compilation::getArgsForToolChain(const ToolChain *TC) {
+const DerivedArgList &Compilation::getArgsForToolChain(const ToolChain *TC) {
   if (!TC)
     TC = &DefaultToolChain;
 
-  ArgList *&Entry = TCArgs[TC];
+  DerivedArgList *&Entry = TCArgs[TC];
   if (!Entry)
     Entry = TC->TranslateArgs(*Args);
 
index 2ffd64191014c6919114e4ac41f6e642fb254674..85d76c8c20f8910a5ab464e5890fdb44c32449f3 100644 (file)
@@ -56,9 +56,10 @@ Driver::~Driver() {
   delete Host;
 }
 
-ArgList *Driver::ParseArgStrings(const char **ArgBegin, const char **ArgEnd) {
+InputArgList *Driver::ParseArgStrings(const char **ArgBegin, 
+                                      const char **ArgEnd) {
   llvm::PrettyStackTraceString CrashInfo("Command line argument parsing");
-  ArgList *Args = new ArgList(ArgBegin, ArgEnd);
+  InputArgList *Args = new InputArgList(ArgBegin, ArgEnd);
   
   // FIXME: Handle '@' args (or at least error on them).
 
@@ -171,7 +172,7 @@ Compilation *Driver::BuildCompilation(int argc, const char **argv) {
     }
   }
 
-  ArgList *Args = ParseArgStrings(Start, End);
+  InputArgList *Args = ParseArgStrings(Start, End);
 
   Host = GetHostInfo(HostTriple);
 
@@ -851,8 +852,8 @@ void Driver::BuildJobsForAction(Compilation &C,
     }
     llvm::errs() << "], output: " << Result.getAsString() << "\n";
   } else {
-    const ArgList &TCArgs = C.getArgsForToolChain(TC);
-    T.ConstructJob(C, *JA, *Dest, Result, InputInfos, TCArgs, LinkingOutput);
+    T.ConstructJob(C, *JA, *Dest, Result, InputInfos, 
+                   C.getArgsForToolChain(TC), LinkingOutput);
   }
 }
 
index 4524ecedd4c7c5916f1e27d7074692000745590f..baaa886fec10bd16db2c16c3937c2de0014f2259 100644 (file)
@@ -208,7 +208,7 @@ static inline bool operator<(const char *Name, struct Info &I) {
   return StrCmpOptionName(Name, I.Name) == -1;
 }
 
-Arg *OptTable::ParseOneArg(const ArgList &Args, unsigned &Index) const {
+Arg *OptTable::ParseOneArg(const InputArgList &Args, unsigned &Index) const {
   unsigned Prev = Index;
   const char *Str = Args.getArgString(Index);
 
index dc681c72957ae216f3e8a6094f6af1213e2b40f0..6ea02aaf40e0ccfad8984cf0469623a3cb718667 100644 (file)
@@ -107,7 +107,7 @@ OptionGroup::OptionGroup(options::ID ID, const char *Name,
   : Option(Option::GroupClass, ID, Name, Group, 0) {
 }
 
-Arg *OptionGroup::accept(const ArgList &Args, unsigned &Index) const {
+Arg *OptionGroup::accept(const InputArgList &Args, unsigned &Index) const {
   assert(0 && "accept() should never be called on an OptionGroup");
   return 0;
 }
@@ -116,7 +116,7 @@ InputOption::InputOption()
   : Option(Option::InputClass, options::OPT_INPUT, "<input>", 0, 0) {
 }
 
-Arg *InputOption::accept(const ArgList &Args, unsigned &Index) const {
+Arg *InputOption::accept(const InputArgList &Args, unsigned &Index) const {
   assert(0 && "accept() should never be called on an InputOption");
   return 0;
 }
@@ -125,7 +125,7 @@ UnknownOption::UnknownOption()
   : Option(Option::UnknownClass, options::OPT_UNKNOWN, "<unknown>", 0, 0) {
 }
 
-Arg *UnknownOption::accept(const ArgList &Args, unsigned &Index) const {
+Arg *UnknownOption::accept(const InputArgList &Args, unsigned &Index) const {
   assert(0 && "accept() should never be called on an UnknownOption");
   return 0;
 }
@@ -135,7 +135,7 @@ FlagOption::FlagOption(options::ID ID, const char *Name,
   : Option(Option::FlagClass, ID, Name, Group, Alias) {
 }
 
-Arg *FlagOption::accept(const ArgList &Args, unsigned &Index) const {
+Arg *FlagOption::accept(const InputArgList &Args, unsigned &Index) const {
   // Matches iff this is an exact match.  
   // FIXME: Avoid strlen.
   if (strlen(getName()) != strlen(Args.getArgString(Index)))
@@ -149,7 +149,7 @@ JoinedOption::JoinedOption(options::ID ID, const char *Name,
   : Option(Option::JoinedClass, ID, Name, Group, Alias) {
 }
 
-Arg *JoinedOption::accept(const ArgList &Args, unsigned &Index) const {
+Arg *JoinedOption::accept(const InputArgList &Args, unsigned &Index) const {
   // Always matches.
   return new JoinedArg(this, Index++);
 }
@@ -160,7 +160,8 @@ CommaJoinedOption::CommaJoinedOption(options::ID ID, const char *Name,
   : Option(Option::CommaJoinedClass, ID, Name, Group, Alias) {
 }
 
-Arg *CommaJoinedOption::accept(const ArgList &Args, unsigned &Index) const {
+Arg *CommaJoinedOption::accept(const InputArgList &Args, 
+                               unsigned &Index) const {
   // Always matches. We count the commas now so we can answer
   // getNumValues easily.
   
@@ -175,7 +176,7 @@ SeparateOption::SeparateOption(options::ID ID, const char *Name,
   : Option(Option::SeparateClass, ID, Name, Group, Alias) {
 }
 
-Arg *SeparateOption::accept(const ArgList &Args, unsigned &Index) const {
+Arg *SeparateOption::accept(const InputArgList &Args, unsigned &Index) const {
   // Matches iff this is an exact match.  
   // FIXME: Avoid strlen.
   if (strlen(getName()) != strlen(Args.getArgString(Index)))
@@ -195,7 +196,7 @@ MultiArgOption::MultiArgOption(options::ID ID, const char *Name,
   assert(NumArgs > 1  && "Invalid MultiArgOption!");
 }
 
-Arg *MultiArgOption::accept(const ArgList &Args, unsigned &Index) const {
+Arg *MultiArgOption::accept(const InputArgList &Args, unsigned &Index) const {
   // Matches iff this is an exact match.  
   // FIXME: Avoid strlen.
   if (strlen(getName()) != strlen(Args.getArgString(Index)))
@@ -214,7 +215,7 @@ JoinedOrSeparateOption::JoinedOrSeparateOption(options::ID ID, const char *Name,
   : Option(Option::JoinedOrSeparateClass, ID, Name, Group, Alias) {
 }
 
-Arg *JoinedOrSeparateOption::accept(const ArgList &Args, 
+Arg *JoinedOrSeparateOption::accept(const InputArgList &Args, 
                                     unsigned &Index) const {
   // If this is not an exact match, it is a joined arg.
   // FIXME: Avoid strlen.
@@ -236,7 +237,7 @@ JoinedAndSeparateOption::JoinedAndSeparateOption(options::ID ID,
   : Option(Option::JoinedAndSeparateClass, ID, Name, Group, Alias) {
 }
 
-Arg *JoinedAndSeparateOption::accept(const ArgList &Args, 
+Arg *JoinedAndSeparateOption::accept(const InputArgList &Args, 
                                      unsigned &Index) const {
   // Always matches.
 
index c8df6c09e59bbf56f623fa6dc9146a934bf4e473..898f12e8f2502a6afecf769d922bbc1d48b83225 100644 (file)
@@ -9,6 +9,8 @@
 
 #include "ToolChains.h"
 
+#include "clang/Driver/Arg.h"
+#include "clang/Driver/ArgList.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/HostInfo.h"
 
@@ -122,9 +124,9 @@ Tool &Darwin_X86::SelectTool(const Compilation &C,
   return *T;
 }
 
-ArgList *Darwin_X86::TranslateArgs(ArgList &Args) const { 
+DerivedArgList *Darwin_X86::TranslateArgs(InputArgList &Args) const { 
   // FIXME: Implement!
-  return &Args;
+  return new DerivedArgList(Args, true);
 } 
 
 bool Darwin_X86::IsMathErrnoDefault() const { 
@@ -223,3 +225,7 @@ const char *Generic_GCC::GetDefaultRelocationModel() const {
 const char *Generic_GCC::GetForcedPicModel() const {
   return 0;
 }
+
+DerivedArgList *Generic_GCC::TranslateArgs(InputArgList &Args) const {
+  return new DerivedArgList(Args, true);
+}
index ea1661a970e5511818314fe4feb96ff591d27ab1..305737b9a91d51844832b4bc3a686a3cad0b6634 100644 (file)
@@ -33,7 +33,7 @@ public:
               const char *OS);
   ~Generic_GCC();
 
-  virtual ArgList *TranslateArgs(ArgList &Args) const { return &Args; }
+  virtual DerivedArgList *TranslateArgs(InputArgList &Args) const;
 
   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;
 
@@ -62,7 +62,7 @@ public:
              const unsigned (&GCCVersion)[3]);
   ~Darwin_X86();
 
-  virtual ArgList *TranslateArgs(ArgList &Args) const;
+  virtual DerivedArgList *TranslateArgs(InputArgList &Args) const;
 
   virtual Tool &SelectTool(const Compilation &C, const JobAction &JA) const;