Driver: Change Arg to just hold the values directly, instead of implicitly
deriving them from the Arg type.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105760 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/Arg.cpp b/lib/Driver/Arg.cpp
index 9b02378..24de51f 100644
--- a/lib/Driver/Arg.cpp
+++ b/lib/Driver/Arg.cpp
@@ -17,10 +17,16 @@
Arg::Arg(ArgClass _Kind, const Option *_Opt, unsigned _Index,
const Arg *_BaseArg)
- : Kind(_Kind), Opt(_Opt), BaseArg(_BaseArg), Index(_Index), Claimed(false) {
+ : Kind(_Kind), Opt(_Opt), BaseArg(_BaseArg), Index(_Index),
+ Claimed(false), OwnsValues(false) {
}
-Arg::~Arg() { }
+Arg::~Arg() {
+ if (OwnsValues) {
+ for (unsigned i = 0, e = Values.size(); i != e; ++i)
+ delete[] Values[i];
+ }
+}
void Arg::dump() const {
llvm::errs() << "<";
@@ -82,28 +88,20 @@
Output.push_back(getOption().getName());
}
-const char *FlagArg::getValue(const ArgList &Args, unsigned N) const {
- assert(0 && "Invalid index.");
- return 0;
-}
-
PositionalArg::PositionalArg(const Option *Opt, unsigned Index,
- const Arg *BaseArg)
+ const char *Value0, const Arg *BaseArg)
: Arg(PositionalClass, Opt, Index, BaseArg) {
+ getValues().push_back(Value0);
}
void PositionalArg::render(const ArgList &Args, ArgStringList &Output) const {
Output.push_back(Args.getArgString(getIndex()));
}
-const char *PositionalArg::getValue(const ArgList &Args, unsigned N) const {
- assert(N < getNumValues() && "Invalid index.");
- return Args.getArgString(getIndex());
-}
-
-JoinedArg::JoinedArg(const Option *Opt, unsigned Index, unsigned _Offset,
+JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const char *Value0,
const Arg *BaseArg)
- : Arg(JoinedClass, Opt, Index, BaseArg), Offset(_Offset) {
+ : Arg(JoinedClass, Opt, Index, BaseArg) {
+ getValues().push_back(Value0);
}
void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -116,11 +114,6 @@
}
}
-const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
- assert(N < getNumValues() && "Invalid index.");
- return Args.getArgString(getIndex()) + Offset;
-}
-
CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
const char *Str, const Arg *BaseArg)
: Arg(CommaJoinedClass, Opt, Index, BaseArg) {
@@ -128,30 +121,32 @@
for (;; ++Str) {
char c = *Str;
- if (!c) {
- if (Prev != Str)
- Values.push_back(std::string(Prev, Str));
- break;
- } else if (c == ',') {
- if (Prev != Str)
- Values.push_back(std::string(Prev, Str));
+ if (!c || c == ',') {
+ if (Prev != Str) {
+ char *Value = new char[Str - Prev + 1];
+ memcpy(Value, Prev, Str - Prev);
+ Value[Str - Prev] = '\0';
+ getValues().push_back(Value);
+ }
+
+ if (!c)
+ break;
+
Prev = Str + 1;
}
}
+
+ setOwnsValues(true);
}
void CommaJoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
Output.push_back(Args.getArgString(getIndex()));
}
-const char *CommaJoinedArg::getValue(const ArgList &Args, unsigned N) const {
- assert(N < getNumValues() && "Invalid index.");
- return Values[N].c_str();
-}
-
-SeparateArg::SeparateArg(const Option *Opt, unsigned Index, unsigned _NumValues,
+SeparateArg::SeparateArg(const Option *Opt, unsigned Index, const char *Value0,
const Arg *BaseArg)
- : Arg(SeparateClass, Opt, Index, BaseArg), NumValues(_NumValues) {
+ : Arg(SeparateClass, Opt, Index, BaseArg) {
+ getValues().push_back(Value0);
}
void SeparateArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -161,32 +156,23 @@
getValue(Args, 0)));
} else {
Output.push_back(getOption().getName());
- for (unsigned i = 0; i < NumValues; ++i)
+ for (unsigned i = 0; i != getNumValues(); ++i)
Output.push_back(getValue(Args, i));
}
}
-const char *SeparateArg::getValue(const ArgList &Args, unsigned N) const {
- assert(N < getNumValues() && "Invalid index.");
- return Args.getArgString(getIndex() + 1 + N);
-}
-
JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index,
- unsigned _Offset, const Arg *BaseArg)
- : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg), Offset(_Offset) {
+ const char *Value0,
+ const char *Value1,
+ const Arg *BaseArg)
+ : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) {
+ getValues().push_back(Value0);
+ getValues().push_back(Value1);
}
void JoinedAndSeparateArg::render(const ArgList &Args,
ArgStringList &Output) const {
Output.push_back(Args.GetOrMakeJoinedArgString(
getIndex(), getOption().getName(), getValue(Args, 0)));
- Output.push_back(Args.getArgString(getIndex() + 1));
-}
-
-const char *JoinedAndSeparateArg::getValue(const ArgList &Args,
- unsigned N) const {
- assert(N < getNumValues() && "Invalid index.");
- if (N == 0)
- return Args.getArgString(getIndex()) + Offset;
- return Args.getArgString(getIndex() + 1);
+ Output.push_back(getValue(Args, 1));
}
diff --git a/lib/Driver/ArgList.cpp b/lib/Driver/ArgList.cpp
index ad067f1..9cf2eaf 100644
--- a/lib/Driver/ArgList.cpp
+++ b/lib/Driver/ArgList.cpp
@@ -264,23 +264,26 @@
Arg *DerivedArgList::MakePositionalArg(const Arg *BaseArg, const Option *Opt,
llvm::StringRef Value) const {
- Arg *A = new PositionalArg(Opt, BaseArgs.MakeIndex(Value), BaseArg);
+ unsigned Index = BaseArgs.MakeIndex(Value);
+ Arg *A = new PositionalArg(Opt, Index, BaseArgs.getArgString(Index), BaseArg);
SynthesizedArgs.push_back(A);
return A;
}
Arg *DerivedArgList::MakeSeparateArg(const Arg *BaseArg, const Option *Opt,
llvm::StringRef Value) const {
- Arg *A = new SeparateArg(Opt, BaseArgs.MakeIndex(Opt->getName(), Value), 1,
- BaseArg);
+ unsigned Index = BaseArgs.MakeIndex(Opt->getName(), Value);
+ Arg *A = new SeparateArg(Opt, Index, BaseArgs.getArgString(Index), BaseArg);
SynthesizedArgs.push_back(A);
return A;
}
Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
llvm::StringRef Value) const {
- Arg *A = new JoinedArg(Opt, BaseArgs.MakeIndex(Opt->getName() + Value.str()),
- strlen(Opt->getName()), BaseArg);
+ unsigned Index = BaseArgs.MakeIndex(Opt->getName() + Value.str());
+ Arg *A = new JoinedArg(Opt, Index,
+ BaseArgs.getArgString(Index) + strlen(Opt->getName()),
+ BaseArg);
SynthesizedArgs.push_back(A);
return A;
}
diff --git a/lib/Driver/OptTable.cpp b/lib/Driver/OptTable.cpp
index de1e459..1f913e3 100644
--- a/lib/Driver/OptTable.cpp
+++ b/lib/Driver/OptTable.cpp
@@ -188,7 +188,7 @@
// Anything that doesn't start with '-' is an input, as is '-' itself.
if (Str[0] != '-' || Str[1] == '\0')
- return new PositionalArg(TheInputOption, Index++);
+ return new PositionalArg(TheInputOption, Index++, Str);
const Info *Start = OptionInfos + FirstSearchableIndex;
const Info *End = OptionInfos + getNumOptions();
@@ -221,7 +221,7 @@
return 0;
}
- return new PositionalArg(TheUnknownOption, Index++);
+ return new PositionalArg(TheUnknownOption, Index++, Str);
}
InputArgList *OptTable::ParseArgs(const char **ArgBegin, const char **ArgEnd,
diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp
index 5a967ea..ea3b3bc 100644
--- a/lib/Driver/Option.cpp
+++ b/lib/Driver/Option.cpp
@@ -133,7 +133,8 @@
Arg *JoinedOption::accept(const InputArgList &Args, unsigned &Index) const {
// Always matches.
- return new JoinedArg(this, Index++, strlen(getName()));
+ const char *Value = Args.getArgString(Index) + strlen(getName());
+ return new JoinedArg(this, Index++, Value);
}
CommaJoinedOption::CommaJoinedOption(OptSpecifier ID, const char *Name,
@@ -168,7 +169,7 @@
if (Index > Args.getNumInputArgStrings())
return 0;
- return new SeparateArg(this, Index - 2, 1);
+ return new SeparateArg(this, Index - 2, Args.getArgString(Index - 1));
}
MultiArgOption::MultiArgOption(OptSpecifier ID, const char *Name,
@@ -188,7 +189,11 @@
if (Index > Args.getNumInputArgStrings())
return 0;
- return new SeparateArg(this, Index - 1 - NumArgs, NumArgs);
+ Arg *A = new SeparateArg(this, Index - 1 - NumArgs,
+ Args.getArgString(Index - NumArgs));
+ for (unsigned i = 1; i != NumArgs; ++i)
+ A->getValues().push_back(Args.getArgString(Index - NumArgs + i));
+ return A;
}
JoinedOrSeparateOption::JoinedOrSeparateOption(OptSpecifier ID,
@@ -202,15 +207,18 @@
unsigned &Index) const {
// If this is not an exact match, it is a joined arg.
// FIXME: Avoid strlen.
- if (strlen(getName()) != strlen(Args.getArgString(Index)))
- return new JoinedArg(this, Index++, strlen(getName()));
+ if (strlen(getName()) != strlen(Args.getArgString(Index))) {
+ const char *Value = Args.getArgString(Index) + strlen(getName());
+ return new JoinedArg(this, Index++, Value);
+ }
// Otherwise it must be separate.
Index += 2;
if (Index > Args.getNumInputArgStrings())
return 0;
- return new SeparateArg(this, Index - 2, 1);
+ return new SeparateArg(this, Index - 2,
+ Args.getArgString(Index - 1));
}
JoinedAndSeparateOption::JoinedAndSeparateOption(OptSpecifier ID,
@@ -228,6 +236,7 @@
if (Index > Args.getNumInputArgStrings())
return 0;
- return new JoinedAndSeparateArg(this, Index - 2, strlen(getName()));
+ return new JoinedAndSeparateArg(this, Index - 2,
+ Args.getArgString(Index-2)+strlen(getName()),
+ Args.getArgString(Index-1));
}
-