diff options
-rw-r--r-- | include/clang/Driver/ArgList.h | 182 | ||||
-rw-r--r-- | include/clang/Driver/Compilation.h | 19 | ||||
-rw-r--r-- | include/clang/Driver/Driver.h | 3 | ||||
-rw-r--r-- | include/clang/Driver/Option.h | 24 | ||||
-rw-r--r-- | include/clang/Driver/Options.h | 8 | ||||
-rw-r--r-- | include/clang/Driver/ToolChain.h | 8 | ||||
-rw-r--r-- | lib/Driver/ArgList.cpp | 128 | ||||
-rw-r--r-- | lib/Driver/Compilation.cpp | 15 | ||||
-rw-r--r-- | lib/Driver/Driver.cpp | 11 | ||||
-rw-r--r-- | lib/Driver/OptTable.cpp | 2 | ||||
-rw-r--r-- | lib/Driver/Option.cpp | 21 | ||||
-rw-r--r-- | lib/Driver/ToolChains.cpp | 10 | ||||
-rw-r--r-- | lib/Driver/ToolChains.h | 4 |
13 files changed, 265 insertions, 170 deletions
diff --git a/include/clang/Driver/ArgList.h b/include/clang/Driver/ArgList.h index e2b4cf47fd..fea6dd8ef2 100644 --- a/include/clang/Driver/ArgList.h +++ b/include/clang/Driver/ArgList.h @@ -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 /// @{ @@ -156,7 +111,114 @@ namespace driver { 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 diff --git a/include/clang/Driver/Compilation.h b/include/clang/Driver/Compilation.h index 1a6d7b02ea..4985f30ad5 100644 --- a/include/clang/Driver/Compilation.h +++ b/include/clang/Driver/Compilation.h @@ -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. diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h index 5ba737379d..4935acc66d 100644 --- a/include/clang/Driver/Driver.h +++ b/include/clang/Driver/Driver.h @@ -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. diff --git a/include/clang/Driver/Option.h b/include/clang/Driver/Option.h index 57e15cb00f..79b512e607 100644 --- a/include/clang/Driver/Option.h +++ b/include/clang/Driver/Option.h @@ -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; diff --git a/include/clang/Driver/Options.h b/include/clang/Driver/Options.h index efa32d929c..d5bc4d5b8a 100644 --- a/include/clang/Driver/Options.h +++ b/include/clang/Driver/Options.h @@ -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; }; } } diff --git a/include/clang/Driver/ToolChain.h b/include/clang/Driver/ToolChain.h index 99d9bcb3cb..e85d7a7e20 100644 --- a/include/clang/Driver/ToolChain.h +++ b/include/clang/Driver/ToolChain.h @@ -16,9 +16,10 @@ 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; diff --git a/lib/Driver/ArgList.cpp b/lib/Driver/ArgList.cpp index d74e3bd59d..bd3aab351d 100644 --- a/lib/Driver/ArgList.cpp +++ b/lib/Driver/ArgList.cpp @@ -13,22 +13,13 @@ 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())); +} diff --git a/lib/Driver/Compilation.cpp b/lib/Driver/Compilation.cpp index 2165bb7401..1e044c6b8f 100644 --- a/lib/Driver/Compilation.cpp +++ b/lib/Driver/Compilation.cpp @@ -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); diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 2ffd641910..85d76c8c20 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -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); } } diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp index 4524ecedd4..baaa886fec 100644 --- a/lib/Driver/OptTable.cpp +++ b/lib/Driver/OptTable.cpp @@ -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); diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp index dc681c7295..6ea02aaf40 100644 --- a/lib/Driver/Option.cpp +++ b/lib/Driver/Option.cpp @@ -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. diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index c8df6c09e5..898f12e8f2 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -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); +} diff --git a/lib/Driver/ToolChains.h b/lib/Driver/ToolChains.h index ea1661a970..305737b9a9 100644 --- a/lib/Driver/ToolChains.h +++ b/lib/Driver/ToolChains.h @@ -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; |