aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-03-29 22:29:05 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-03-29 22:29:05 +0000
commit478edc295efc560627053e2320bedd2f696ae028 (patch)
tree9545e251b27d675c2e0920177f7ee87bb6ad9ad0
parent9120f179fd2e354f067e4ef2c76dcf3fc4db8a16 (diff)
Driver: Track which original arguments an arg is derived from, so that
we can properly claim arguments, even if they have been translated by the tool chain. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68020 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/Driver/Arg.h38
-rw-r--r--include/clang/Driver/ArgList.h11
-rw-r--r--lib/Driver/Arg.cpp35
-rw-r--r--lib/Driver/ArgList.cpp17
-rw-r--r--lib/Driver/ToolChains.cpp40
5 files changed, 82 insertions, 59 deletions
diff --git a/include/clang/Driver/Arg.h b/include/clang/Driver/Arg.h
index a9e34d20c8..6bed2b8cbd 100644
--- a/include/clang/Driver/Arg.h
+++ b/include/clang/Driver/Arg.h
@@ -50,6 +50,10 @@ namespace driver {
/// The option this argument is an instance of.
const Option *Opt;
+ /// The argument this argument was derived from (during tool chain
+ /// argument translation), if any.
+ const Arg *BaseArg;
+
/// The index at which this argument appears in the containing
/// ArgList.
unsigned Index;
@@ -60,25 +64,34 @@ namespace driver {
mutable bool Claimed;
protected:
- Arg(ArgClass Kind, const Option *Opt, unsigned Index);
+ Arg(ArgClass Kind, const Option *Opt, unsigned Index,
+ const Arg *BaseArg = 0);
public:
Arg(const Arg &);
virtual ~Arg();
ArgClass getKind() const { return Kind; }
-
const Option &getOption() const { return *Opt; }
-
unsigned getIndex() const { return Index; }
+
+ /// getBaseArg - Return the base argument which generated this
+ /// arg; this is either the argument itself or the argument it was
+ /// derived from during tool chain specific argument translation.
+ const Arg &getBaseArg() const {
+ return BaseArg ? *BaseArg : *this;
+ }
+ void setBaseArg(const Arg *_BaseArg) {
+ BaseArg = _BaseArg;
+ }
- bool isClaimed() const { return Claimed; }
+ bool isClaimed() const { return getBaseArg().Claimed; }
/// claim - Set the Arg claimed bit.
// FIXME: We need to deal with derived arguments and set the bit
// in the original argument; not the derived one.
- void claim() const { Claimed = true; }
+ void claim() const { getBaseArg().Claimed = true; }
virtual unsigned getNumValues() const = 0;
virtual const char *getValue(const ArgList &Args, unsigned N=0) const = 0;
@@ -104,7 +117,7 @@ namespace driver {
/// FlagArg - An argument with no value.
class FlagArg : public Arg {
public:
- FlagArg(const Option *Opt, unsigned Index);
+ FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg = 0);
virtual void render(const ArgList &Args, ArgStringList &Output) const;
@@ -120,7 +133,7 @@ namespace driver {
/// PositionalArg - A simple positional argument.
class PositionalArg : public Arg {
public:
- PositionalArg(const Option *Opt, unsigned Index);
+ PositionalArg(const Option *Opt, unsigned Index, const Arg *BaseArg = 0);
virtual void render(const ArgList &Args, ArgStringList &Output) const;
@@ -137,7 +150,7 @@ namespace driver {
/// (suffixed) to the option.
class JoinedArg : public Arg {
public:
- JoinedArg(const Option *Opt, unsigned Index);
+ JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg = 0);
virtual void render(const ArgList &Args, ArgStringList &Output) const;
@@ -156,7 +169,8 @@ namespace driver {
unsigned NumValues;
public:
- SeparateArg(const Option *Opt, unsigned Index, unsigned NumValues);
+ SeparateArg(const Option *Opt, unsigned Index, unsigned NumValues,
+ const Arg *BaseArg = 0);
virtual void render(const ArgList &Args, ArgStringList &Output) const;
@@ -179,7 +193,8 @@ namespace driver {
std::vector<std::string> Values;
public:
- CommaJoinedArg(const Option *Opt, unsigned Index, const char *Str);
+ CommaJoinedArg(const Option *Opt, unsigned Index, const char *Str,
+ const Arg *BaseArg = 0);
virtual void render(const ArgList &Args, ArgStringList &Output) const;
@@ -196,7 +211,8 @@ namespace driver {
/// values.
class JoinedAndSeparateArg : public Arg {
public:
- JoinedAndSeparateArg(const Option *Opt, unsigned Index);
+ JoinedAndSeparateArg(const Option *Opt, unsigned Index,
+ const Arg *BaseArg = 0);
virtual void render(const ArgList &Args, ArgStringList &Output) const;
diff --git a/include/clang/Driver/ArgList.h b/include/clang/Driver/ArgList.h
index 226d8193a9..3fae792d3a 100644
--- a/include/clang/Driver/ArgList.h
+++ b/include/clang/Driver/ArgList.h
@@ -208,19 +208,22 @@ namespace driver {
/// MakeFlagArg - Construct a new FlagArg for the given option
/// \arg Id.
- Arg *MakeFlagArg(const Option *Opt) const;
+ Arg *MakeFlagArg(const Arg *BaseArg, 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;
+ Arg *MakePositionalArg(const Arg *BaseArg, 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;
+ Arg *MakeSeparateArg(const Arg *BaseArg, 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;
+ Arg *MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
+ const char *Value) const;
/// @}
};
diff --git a/lib/Driver/Arg.cpp b/lib/Driver/Arg.cpp
index 1d8d2497b6..e227d7e2ea 100644
--- a/lib/Driver/Arg.cpp
+++ b/lib/Driver/Arg.cpp
@@ -14,11 +14,9 @@
using namespace clang::driver;
-Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index)
- : Kind(_Kind),
- Opt(_Opt),
- Index(_Index),
- Claimed(false)
+Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index,
+ const Arg *_BaseArg)
+ : Kind(_Kind), Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false)
{
}
@@ -76,8 +74,8 @@ void Arg::renderAsInput(const ArgList &Args, ArgStringList &Output) const {
Output.push_back(getValue(Args, i));
}
-FlagArg::FlagArg(const Option *Opt, unsigned Index)
- : Arg(FlagClass, Opt, Index) {
+FlagArg::FlagArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
+ : Arg(FlagClass, Opt, Index, BaseArg) {
}
void FlagArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -89,8 +87,9 @@ const char *FlagArg::getValue(const ArgList &Args, unsigned N) const {
return 0;
}
-PositionalArg::PositionalArg(const Option *Opt, unsigned Index)
- : Arg(PositionalClass, Opt, Index) {
+PositionalArg::PositionalArg(const Option *Opt, unsigned Index,
+ const Arg *BaseArg)
+ : Arg(PositionalClass, Opt, Index, BaseArg) {
}
void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -102,8 +101,8 @@ const char *PositionalArg::getValue(const ArgList &Args, unsigned N) const {
return Args.getArgString(getIndex());
}
-JoinedArg::JoinedArg(const Option *Opt, unsigned Index)
- : Arg(JoinedClass, Opt, Index) {
+JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
+ : Arg(JoinedClass, Opt, Index, BaseArg) {
}
void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -122,8 +121,8 @@ const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
}
CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
- const char *Str)
- : Arg(CommaJoinedClass, Opt, Index) {
+ const char *Str, const Arg *BaseArg)
+ : Arg(CommaJoinedClass, Opt, Index, BaseArg) {
const char *Prev = Str;
for (;; ++Str) {
char c = *Str;
@@ -149,8 +148,9 @@ const char *CommaJoinedArg::getValue(const ArgList &Args, unsigned N) const {
return Values[N].c_str();
}
-SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues)
- : Arg(SeparateClass, Opt, Index), NumValues(_NumValues) {
+SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues,
+ const Arg *BaseArg)
+ : Arg(SeparateClass, Opt, Index, BaseArg), NumValues(_NumValues) {
}
void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -172,8 +172,9 @@ const char *SeparateArg::getValue(const ArgList &Args, unsigned N) const {
return Args.getArgString(getIndex() + 1 + N);
}
-JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index)
- : Arg(JoinedAndSeparateClass, Opt, Index) {
+JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index,
+ const Arg *BaseArg)
+ : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) {
}
void JoinedAndSeparateArg::render(const ArgList &Args,
diff --git a/lib/Driver/ArgList.cpp b/lib/Driver/ArgList.cpp
index 44549b0636..2e526ab5d5 100644
--- a/lib/Driver/ArgList.cpp
+++ b/lib/Driver/ArgList.cpp
@@ -196,23 +196,24 @@ 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::MakeFlagArg(const Arg *BaseArg, const Option *Opt) const {
+ return new FlagArg(Opt, BaseArgs.MakeIndex(Opt->getName()), BaseArg);
}
-Arg *DerivedArgList::MakePositionalArg(const Option *Opt,
+Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
const char *Value) const {
- return new PositionalArg(Opt, BaseArgs.MakeIndex(Value));
+ return new PositionalArg(Opt, BaseArgs.MakeIndex(Value), BaseArg);
}
-Arg *DerivedArgList::MakeSeparateArg(const Option *Opt,
+Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
const char *Value) const {
- return new SeparateArg(Opt, BaseArgs.MakeIndex(Opt->getName(), Value), 1);
+ return new SeparateArg(Opt, BaseArgs.MakeIndex(Opt->getName(), Value), 1,
+ BaseArg);
}
-Arg *DerivedArgList::MakeJoinedArg(const Option *Opt,
+Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
const char *Value) const {
std::string Joined(Opt->getName());
Joined += Value;
- return new JoinedArg(Opt, BaseArgs.MakeIndex(Joined.c_str()));
+ return new JoinedArg(Opt, BaseArgs.MakeIndex(Joined.c_str()), BaseArg);
}
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index 8bbf2a67bc..744882a9a0 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -142,7 +142,7 @@ DerivedArgList *Darwin_X86::TranslateArgs(InputArgList &Args) const {
if (!Args.hasArg(options::OPT_mmacosx_version_min_EQ, false)) {
const Option *O = Opts.getOption(options::OPT_mmacosx_version_min_EQ);
- DAL->append(DAL->MakeJoinedArg(O, MacosxVersionMin.c_str()));
+ DAL->append(DAL->MakeJoinedArg(0, O, MacosxVersionMin.c_str()));
}
for (ArgList::iterator it = Args.begin(), ie = Args.end(); it != ie; ++it) {
@@ -173,6 +173,7 @@ DerivedArgList *Darwin_X86::TranslateArgs(InputArgList &Args) const {
continue;
}
+ XarchArg->setBaseArg(A);
A = XarchArg;
}
@@ -188,64 +189,65 @@ DerivedArgList *Darwin_X86::TranslateArgs(InputArgList &Args) const {
case options::OPT_mkernel:
case options::OPT_fapple_kext:
DAL->append(A);
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_static)));
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_static)));
+ DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
+ DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
break;
case options::OPT_dependency_file:
- DAL->append(DAL->MakeSeparateArg(Opts.getOption(options::OPT_MF),
+ DAL->append(DAL->MakeSeparateArg(A, Opts.getOption(options::OPT_MF),
A->getValue(Args)));
break;
case options::OPT_gfull:
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_g_Flag)));
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag)));
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_fno_eliminate_unused_debug_symbols)));
break;
case options::OPT_gused:
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_g_Flag)));
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_g_Flag)));
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_feliminate_unused_debug_symbols)));
break;
case options::OPT_fterminated_vtables:
case options::OPT_findirect_virtual_calls:
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_fapple_kext)));
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_static)));
+ DAL->append(DAL->MakeFlagArg(A,
+ Opts.getOption(options::OPT_fapple_kext)));
+ DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_static)));
break;
case options::OPT_shared:
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_dynamiclib)));
+ DAL->append(DAL->MakeFlagArg(A, Opts.getOption(options::OPT_dynamiclib)));
break;
case options::OPT_fconstant_cfstrings:
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_mconstant_cfstrings)));
break;
case options::OPT_fno_constant_cfstrings:
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_mno_constant_cfstrings)));
break;
case options::OPT_Wnonportable_cfstrings:
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_mwarn_nonportable_cfstrings)));
break;
case options::OPT_Wno_nonportable_cfstrings:
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_mno_warn_nonportable_cfstrings)));
break;
case options::OPT_fpascal_strings:
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_mpascal_strings)));
break;
case options::OPT_fno_pascal_strings:
- DAL->append(DAL->MakeFlagArg(
+ DAL->append(DAL->MakeFlagArg(A,
Opts.getOption(options::OPT_mno_pascal_strings)));
break;
}
@@ -256,10 +258,10 @@ DerivedArgList *Darwin_X86::TranslateArgs(InputArgList &Args) const {
// look it up.
if (getArchName() == "x86_64")
if (!Args.hasArg(options::OPT_m64, false))
- DAL->append(DAL->MakeFlagArg(Opts.getOption(options::OPT_m64)));
+ DAL->append(DAL->MakeFlagArg(0, Opts.getOption(options::OPT_m64)));
if (!Args.hasArg(options::OPT_mtune_EQ, false))
- DAL->append(DAL->MakeJoinedArg(Opts.getOption(options::OPT_mtune_EQ),
+ DAL->append(DAL->MakeJoinedArg(0, Opts.getOption(options::OPT_mtune_EQ),
"core2"));
return DAL;