aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/clang/Driver/ArgList.h182
-rw-r--r--include/clang/Driver/Compilation.h19
-rw-r--r--include/clang/Driver/Driver.h3
-rw-r--r--include/clang/Driver/Option.h24
-rw-r--r--include/clang/Driver/Options.h8
-rw-r--r--include/clang/Driver/ToolChain.h8
-rw-r--r--lib/Driver/ArgList.cpp128
-rw-r--r--lib/Driver/Compilation.cpp15
-rw-r--r--lib/Driver/Driver.cpp11
-rw-r--r--lib/Driver/OptTable.cpp2
-rw-r--r--lib/Driver/Option.cpp21
-rw-r--r--lib/Driver/ToolChains.cpp10
-rw-r--r--lib/Driver/ToolChains.h4
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;