Make joined instances of JoinedOrSeparate flags point to the unaliased args, like all other arg types do

This fixes an 8-year-old regression. r105763 made it so that aliases
always refer to the unaliased option – but it missed the "joined" branch
of JoinedOrSeparate flags. (r162231 then made the Args classes
non-virtual, and r169344 moved them from clang to llvm.)

Back then, there was no JoinedOrSeparate flag that was an alias, so it
wasn't observable. Now /U in CLCompatOptions is a JoinedOrSeparate alias
in clang, and warn_slash_u_filename incorrectly used the aliased arg id
(using the unaliased one isn't really a regression since that warning
checks if the undefined macro contains slash or backslash and only then
emits the warning – and no valid use will pass "-Ufoo/bar" or similar).

Also, lld has many JoinedOrSeparate aliases, and due to this bug it had
to explicitly call `getUnaliasedOption()` in a bunch of places, even
though that shouldn't be necessary by design. After this fix in Option,
these calls really don't have an effect any more, so remove them.

No intended behavior change.

(I accidentally fixed this bug while working on PR29106 but then
wondered why the warn_slash_u_filename broke. When I figured it out, I
thought it would make sense to land this in a separate commit.)

Differential Revision: https://reviews.llvm.org/D64156

llvm-svn: 365186
This commit is contained in:
Nico Weber 2019-07-05 11:45:24 +00:00
parent 1126f1a6de
commit cf1a11ded2
7 changed files with 8 additions and 8 deletions

View File

@ -2180,7 +2180,7 @@ void Driver::BuildInputs(const ToolChain &TC, DerivedArgList &Args,
Diag(clang::diag::err_drv_unknown_language) << A->getValue();
InputType = types::TY_Object;
}
} else if (A->getOption().getID() == options::OPT__SLASH_U) {
} else if (A->getOption().getID() == options::OPT_U) {
assert(A->getNumValues() == 1 && "The /U option has one value.");
StringRef Val = A->getValue(0);
if (Val.find_first_of("/\\") != StringRef::npos) {

View File

@ -332,7 +332,7 @@ void LinkerDriver::parseDirectives(InputFile *File) {
}
for (auto *Arg : Args) {
switch (Arg->getOption().getUnaliasedOption().getID()) {
switch (Arg->getOption().getID()) {
case OPT_aligncomm:
parseAligncomm(Arg->getValue());
break;

View File

@ -1112,7 +1112,7 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) {
// Iterate over argv to process input files and positional arguments.
for (auto *Arg : Args) {
switch (Arg->getOption().getUnaliasedOption().getID()) {
switch (Arg->getOption().getID()) {
case OPT_library:
addLibrary(Arg->getValue());
break;

View File

@ -172,7 +172,7 @@ std::string elf::createResponseFile(const opt::InputArgList &Args) {
// Copy the command line to the output while rewriting paths.
for (auto *Arg : Args) {
switch (Arg->getOption().getUnaliasedOption().getID()) {
switch (Arg->getOption().getID()) {
case OPT_reproduce:
break;
case OPT_INPUT:

View File

@ -313,7 +313,7 @@ bool mingw::link(ArrayRef<const char *> ArgsArr, raw_ostream &Diag) {
StringRef Prefix = "";
bool Static = false;
for (auto *A : Args) {
switch (A->getOption().getUnaliasedOption().getID()) {
switch (A->getOption().getID()) {
case OPT_INPUT:
if (StringRef(A->getValue()).endswith_lower(".def"))
Add("-def:" + StringRef(A->getValue()));

View File

@ -271,7 +271,7 @@ void LinkerDriver::addLibrary(StringRef Name) {
void LinkerDriver::createFiles(opt::InputArgList &Args) {
for (auto *Arg : Args) {
switch (Arg->getOption().getUnaliasedOption().getID()) {
switch (Arg->getOption().getID()) {
case OPT_l:
addLibrary(Arg->getValue());
break;
@ -531,7 +531,7 @@ static std::string createResponseFile(const opt::InputArgList &Args) {
// Copy the command line to the output while rewriting paths.
for (auto *Arg : Args) {
switch (Arg->getOption().getUnaliasedOption().getID()) {
switch (Arg->getOption().getID()) {
case OPT_reproduce:
break;
case OPT_INPUT:

View File

@ -207,7 +207,7 @@ Arg *Option::accept(const ArgList &Args,
// FIXME: Avoid strlen.
if (ArgSize != strlen(Args.getArgString(Index))) {
const char *Value = Args.getArgString(Index) + ArgSize;
return new Arg(*this, Spelling, Index++, Value);
return new Arg(UnaliasedOption, Spelling, Index++, Value);
}
// Otherwise it must be separate.