From: Daniel Dunbar Date: Wed, 25 Mar 2009 04:13:45 +0000 (+0000) Subject: Driver: Prep for tool chain specific argument translation. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3cad36e59a41b5767fe662b5ac8911ee174b801;p=clang Driver: Prep for tool chain specific argument translation. - 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 --- 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 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 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 TCArgs; + llvm::DenseMap 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::iterator - it = TCArgs.begin(), ie = TCArgs.end(); it != ie; ++it) { - ArgList *A = it->second; - if (A != Args) - delete Args; - } + for (llvm::DenseMap::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, "", 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, "", 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;