[clang] 1ab418b - [Tooling] Fix FixedCompilationDatabase with header compile flags (#73913)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 19 05:02:08 PST 2024
Author: Sam McCall
Date: 2024-01-19T14:02:04+01:00
New Revision: 1ab418beb3cc9c31ebb2d5779069426d761ceb8f
URL: https://github.com/llvm/llvm-project/commit/1ab418beb3cc9c31ebb2d5779069426d761ceb8f
DIFF: https://github.com/llvm/llvm-project/commit/1ab418beb3cc9c31ebb2d5779069426d761ceb8f.diff
LOG: [Tooling] Fix FixedCompilationDatabase with header compile flags (#73913)
Summary:
The logic to strip positional args feels very fragile, but it's terribly
useful
when you want to use a tool on a file and have the exact argv.
Today doesn't work with header-parsing actions because these are
"precompile"
rather than "compile", from tooling's perspective it's all the same.
Reviewers:
kadircet
Subscribers:
Added:
Modified:
clang/lib/Tooling/CompilationDatabase.cpp
clang/unittests/Tooling/CompilationDatabaseTest.cpp
Removed:
################################################################################
diff --git a/clang/lib/Tooling/CompilationDatabase.cpp b/clang/lib/Tooling/CompilationDatabase.cpp
index 87ad8f25a1ab4e..9d8f0d03a7d5cb 100644
--- a/clang/lib/Tooling/CompilationDatabase.cpp
+++ b/clang/lib/Tooling/CompilationDatabase.cpp
@@ -156,6 +156,7 @@ struct CompileJobAnalyzer {
bool CollectChildren = Collect;
switch (A->getKind()) {
case driver::Action::CompileJobClass:
+ case driver::Action::PrecompileJobClass:
CollectChildren = true;
break;
@@ -293,7 +294,8 @@ static bool stripPositionalArgs(std::vector<const char *> Args,
// -flto* flags make the BackendJobClass, which still needs analyzer.
if (Cmd.getSource().getKind() == driver::Action::AssembleJobClass ||
Cmd.getSource().getKind() == driver::Action::BackendJobClass ||
- Cmd.getSource().getKind() == driver::Action::CompileJobClass) {
+ Cmd.getSource().getKind() == driver::Action::CompileJobClass ||
+ Cmd.getSource().getKind() == driver::Action::PrecompileJobClass) {
CompileAnalyzer.run(&Cmd.getSource());
}
}
diff --git a/clang/unittests/Tooling/CompilationDatabaseTest.cpp b/clang/unittests/Tooling/CompilationDatabaseTest.cpp
index 5173d472486bfc..45062cf7c16f6f 100644
--- a/clang/unittests/Tooling/CompilationDatabaseTest.cpp
+++ b/clang/unittests/Tooling/CompilationDatabaseTest.cpp
@@ -647,12 +647,30 @@ TEST(ParseFixedCompilationDatabase, HandlesPositionalArgs) {
FixedCompilationDatabase::loadFromCommandLine(Argc, Argv, ErrorMsg);
ASSERT_TRUE((bool)Database);
ASSERT_TRUE(ErrorMsg.empty());
+ std::vector<CompileCommand> Result = Database->getCompileCommands("source");
+ ASSERT_EQ(1ul, Result.size());
+ ASSERT_EQ(".", Result[0].Directory);
+ ASSERT_THAT(Result[0].CommandLine,
+ ElementsAre(EndsWith("clang-tool"), "-c", "-DDEF3", "source"));
+ EXPECT_EQ(2, Argc);
+}
+
+TEST(ParseFixedCompilationDatabase, HandlesPositionalArgsHeader) {
+ const char *Argv[] = {"1", "2", "--", "-xc++-header",
+ "-c", "somefile.h", "-DDEF3"};
+ int Argc = std::size(Argv);
+ std::string ErrorMsg;
+ std::unique_ptr<FixedCompilationDatabase> Database =
+ FixedCompilationDatabase::loadFromCommandLine(Argc, Argv, ErrorMsg);
+ ASSERT_TRUE((bool)Database);
+ ASSERT_TRUE(ErrorMsg.empty());
std::vector<CompileCommand> Result =
Database->getCompileCommands("source");
ASSERT_EQ(1ul, Result.size());
ASSERT_EQ(".", Result[0].Directory);
ASSERT_THAT(Result[0].CommandLine,
- ElementsAre(EndsWith("clang-tool"), "-c", "-DDEF3", "source"));
+ ElementsAre(EndsWith("clang-tool"), "-xc++-header", "-c",
+ "-DDEF3", "source"));
EXPECT_EQ(2, Argc);
}
More information about the cfe-commits
mailing list