Driver: Add an explicit offset to JoinedArg and JoinedAndSeparateArg, so that
they can be independent of the exact option that created them.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@105739 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/Arg.cpp b/lib/Driver/Arg.cpp
index 8243cab..9b02378 100644
--- a/lib/Driver/Arg.cpp
+++ b/lib/Driver/Arg.cpp
@@ -101,8 +101,9 @@
return Args.getArgString(getIndex());
}
-JoinedArg::JoinedArg(const Option *Opt, unsigned Index, const Arg *BaseArg)
- : Arg(JoinedClass, Opt, Index, BaseArg) {
+JoinedArg::JoinedArg(const Option *Opt, unsigned Index, unsigned _Offset,
+ const Arg *BaseArg)
+ : Arg(JoinedClass, Opt, Index, BaseArg), Offset(_Offset) {
}
void JoinedArg::render(const ArgList &Args, ArgStringList &Output) const {
@@ -110,14 +111,14 @@
Output.push_back(getOption().getName());
Output.push_back(getValue(Args, 0));
} else {
- Output.push_back(Args.getArgString(getIndex()));
+ Output.push_back(Args.GetOrMakeJoinedArgString(
+ getIndex(), getOption().getName(), getValue(Args, 0)));
}
}
const char *JoinedArg::getValue(const ArgList &Args, unsigned N) const {
assert(N < getNumValues() && "Invalid index.");
- // FIXME: Avoid strlen.
- return Args.getArgString(getIndex()) + strlen(getOption().getName());
+ return Args.getArgString(getIndex()) + Offset;
}
CommaJoinedArg::CommaJoinedArg(const Option *Opt, unsigned Index,
@@ -171,13 +172,14 @@
}
JoinedAndSeparateArg::JoinedAndSeparateArg(const Option *Opt, unsigned Index,
- const Arg *BaseArg)
- : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg) {
+ unsigned _Offset, const Arg *BaseArg)
+ : Arg(JoinedAndSeparateClass, Opt, Index, BaseArg), Offset(_Offset) {
}
void JoinedAndSeparateArg::render(const ArgList &Args,
ArgStringList &Output) const {
- Output.push_back(Args.getArgString(getIndex()));
+ Output.push_back(Args.GetOrMakeJoinedArgString(
+ getIndex(), getOption().getName(), getValue(Args, 0)));
Output.push_back(Args.getArgString(getIndex() + 1));
}
@@ -185,6 +187,6 @@
unsigned N) const {
assert(N < getNumValues() && "Invalid index.");
if (N == 0)
- return Args.getArgString(getIndex()) + strlen(getOption().getName());
+ return Args.getArgString(getIndex()) + Offset;
return Args.getArgString(getIndex() + 1);
}
diff --git a/lib/Driver/ArgList.cpp b/lib/Driver/ArgList.cpp
index 3d07431..ad067f1 100644
--- a/lib/Driver/ArgList.cpp
+++ b/lib/Driver/ArgList.cpp
@@ -191,6 +191,17 @@
return MakeArgString(Str.str());
}
+const char *ArgList::GetOrMakeJoinedArgString(unsigned Index,
+ llvm::StringRef LHS,
+ llvm::StringRef RHS) const {
+ llvm::StringRef Cur = getArgString(Index);
+ if (Cur.size() == LHS.size() + RHS.size() &&
+ Cur.startswith(LHS) && Cur.endswith(RHS))
+ return Cur.data();
+
+ return MakeArgString(LHS + RHS);
+}
+
//
InputArgList::InputArgList(const char **ArgBegin, const char **ArgEnd)
@@ -269,7 +280,7 @@
Arg *DerivedArgList::MakeJoinedArg(const Arg *BaseArg, const Option *Opt,
llvm::StringRef Value) const {
Arg *A = new JoinedArg(Opt, BaseArgs.MakeIndex(Opt->getName() + Value.str()),
- BaseArg);
+ strlen(Opt->getName()), BaseArg);
SynthesizedArgs.push_back(A);
return A;
}
diff --git a/lib/Driver/Option.cpp b/lib/Driver/Option.cpp
index 17d00f5..5a967ea 100644
--- a/lib/Driver/Option.cpp
+++ b/lib/Driver/Option.cpp
@@ -133,7 +133,7 @@
Arg *JoinedOption::accept(const InputArgList &Args, unsigned &Index) const {
// Always matches.
- return new JoinedArg(this, Index++);
+ return new JoinedArg(this, Index++, strlen(getName()));
}
CommaJoinedOption::CommaJoinedOption(OptSpecifier ID, const char *Name,
@@ -191,7 +191,8 @@
return new SeparateArg(this, Index - 1 - NumArgs, NumArgs);
}
-JoinedOrSeparateOption::JoinedOrSeparateOption(OptSpecifier ID, const char *Name,
+JoinedOrSeparateOption::JoinedOrSeparateOption(OptSpecifier ID,
+ const char *Name,
const OptionGroup *Group,
const Option *Alias)
: Option(Option::JoinedOrSeparateClass, ID, Name, Group, Alias) {
@@ -202,7 +203,7 @@
// 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++);
+ return new JoinedArg(this, Index++, strlen(getName()));
// Otherwise it must be separate.
Index += 2;
@@ -227,6 +228,6 @@
if (Index > Args.getNumInputArgStrings())
return 0;
- return new JoinedAndSeparateArg(this, Index - 2);
+ return new JoinedAndSeparateArg(this, Index - 2, strlen(getName()));
}