[clang(d)] Include/Exclude CLDXC options properly

This handles the new CLDXC options that was introduced in
https://reviews.llvm.org/D128462 inside clang-tooling to make sure cl driver
mode is not broken.

Fixes https://github.com/clangd/clangd/issues/1292.

Differential Revision: https://reviews.llvm.org/D133962
This commit is contained in:
Kadir Cetinkaya 2022-09-15 20:57:07 +02:00
parent 1d1a98e9a0
commit 23ace26e0d
No known key found for this signature in database
GPG Key ID: E39E36B8D2057ED6
3 changed files with 20 additions and 4 deletions

View File

@ -220,10 +220,13 @@ void CommandMangler::adjust(std::vector<std::string> &Cmd,
ArgList = OptTable.ParseArgs(
llvm::makeArrayRef(OriginalArgs).drop_front(), IgnoredCount, IgnoredCount,
/*FlagsToInclude=*/
IsCLMode ? (driver::options::CLOption | driver::options::CoreOption)
IsCLMode ? (driver::options::CLOption | driver::options::CoreOption |
driver::options::CLDXCOption)
: /*everything*/ 0,
/*FlagsToExclude=*/driver::options::NoDriverOption |
(IsCLMode ? 0 : driver::options::CLOption));
(IsCLMode
? 0
: (driver::options::CLOption | driver::options::CLDXCOption)));
llvm::SmallVector<unsigned, 1> IndicesToDrop;
// Having multiple architecture options (e.g. when building fat binaries)

View File

@ -415,6 +415,19 @@ TEST(CommandMangler, EmptyArgs) {
// Make sure we don't crash.
Mangler.adjust(Args, "foo.cc");
}
TEST(CommandMangler, PathsAsPositional) {
const auto Mangler = CommandMangler::forTests();
std::vector<std::string> Args = {
"clang",
"--driver-mode=cl",
"-I",
"foo",
};
// Make sure we don't crash.
Mangler.adjust(Args, "a.cc");
EXPECT_THAT(Args, Contains("foo"));
}
} // namespace
} // namespace clangd
} // namespace clang

View File

@ -165,8 +165,8 @@ struct TransferableCommand {
const unsigned OldPos = Pos;
std::unique_ptr<llvm::opt::Arg> Arg(OptTable.ParseOneArg(
ArgList, Pos,
/* Include */ ClangCLMode ? CoreOption | CLOption : 0,
/* Exclude */ ClangCLMode ? 0 : CLOption));
/* Include */ ClangCLMode ? CoreOption | CLOption | CLDXCOption : 0,
/* Exclude */ ClangCLMode ? 0 : CLOption | CLDXCOption));
if (!Arg)
continue;