[PATCH] D63755: [clang][Tooling] Infer target and mode from argv[0] when using JSONCompilationDatabase
This revision was automatically updated to reflect the committed changes. Closed by commit rL364386: [clang][Tooling] Infer target and mode from argv[0] when using… (authored by kadircet, committed by ). Herald added a project: LLVM. Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D63755?vs=206386=206600#toc Repository: rL LLVM CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63755/new/ https://reviews.llvm.org/D63755 Files: cfe/trunk/bindings/python/tests/cindex/test_cdb.py cfe/trunk/include/clang/Tooling/CompilationDatabase.h cfe/trunk/lib/Tooling/CMakeLists.txt cfe/trunk/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp cfe/trunk/lib/Tooling/JSONCompilationDatabase.cpp cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp Index: cfe/trunk/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp === --- cfe/trunk/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp +++ cfe/trunk/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp @@ -0,0 +1,57 @@ +//===- GuessTargetAndModeCompilationDatabase.cpp --===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "clang/Tooling/CompilationDatabase.h" +#include "clang/Tooling/Tooling.h" +#include + +namespace clang { +namespace tooling { + +namespace { +class TargetAndModeAdderDatabase : public CompilationDatabase { +public: + TargetAndModeAdderDatabase(std::unique_ptr Base) + : Base(std::move(Base)) { +assert(this->Base != nullptr); + } + + std::vector getAllFiles() const override { +return Base->getAllFiles(); + } + + std::vector getAllCompileCommands() const override { +return addTargetAndMode(Base->getAllCompileCommands()); + } + + std::vector + getCompileCommands(StringRef FilePath) const override { +return addTargetAndMode(Base->getCompileCommands(FilePath)); + } + +private: + std::vector + addTargetAndMode(std::vector Cmds) const { +for (auto : Cmds) { + if (Cmd.CommandLine.empty()) +continue; + addTargetAndModeForProgramName(Cmd.CommandLine, Cmd.CommandLine.front()); +} +return Cmds; + } + std::unique_ptr Base; +}; +} // namespace + +std::unique_ptr +inferTargetAndDriverMode(std::unique_ptr Base) { + return llvm::make_unique(std::move(Base)); +} + +} // namespace tooling +} // namespace clang Index: cfe/trunk/lib/Tooling/JSONCompilationDatabase.cpp === --- cfe/trunk/lib/Tooling/JSONCompilationDatabase.cpp +++ cfe/trunk/lib/Tooling/JSONCompilationDatabase.cpp @@ -14,7 +14,9 @@ #include "clang/Basic/LLVM.h" #include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/CompilationDatabasePluginRegistry.h" +#include "clang/Tooling/Tooling.h" #include "llvm/ADT/Optional.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" @@ -165,7 +167,9 @@ llvm::sys::path::append(JSONDatabasePath, "compile_commands.json"); auto Base = JSONCompilationDatabase::loadFromFile( JSONDatabasePath, ErrorMessage, JSONCommandLineSyntax::AutoDetect); -return Base ? inferMissingCompileCommands(std::move(Base)) : nullptr; +return Base ? inferTargetAndDriverMode( + inferMissingCompileCommands(std::move(Base))) +: nullptr; } }; Index: cfe/trunk/lib/Tooling/CMakeLists.txt === --- cfe/trunk/lib/Tooling/CMakeLists.txt +++ cfe/trunk/lib/Tooling/CMakeLists.txt @@ -17,6 +17,7 @@ Execution.cpp FileMatchTrie.cpp FixIt.cpp + GuessTargetAndModeCompilationDatabase.cpp InterpolatingCompilationDatabase.cpp JSONCompilationDatabase.cpp Refactoring.cpp Index: cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp === --- cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp +++ cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp @@ -9,10 +9,12 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclGroup.h" #include "clang/Frontend/FrontendAction.h" +#include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/FileMatchTrie.h" #include "clang/Tooling/JSONCompilationDatabase.h" #include "clang/Tooling/Tooling.h" #include "llvm/Support/Path.h" +#include "llvm/Support/TargetSelect.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -632,7 +634,7 @@ } }; -class InterpolateTest : public ::testing::Test { +class MemDBTest : public ::testing::Test { protected: // Adds an entry to the underlying compilation database.
[PATCH] D63755: [clang][Tooling] Infer target and mode from argv[0] when using JSONCompilationDatabase
kadircet updated this revision to Diff 206386. kadircet added a comment. Herald added a subscriber: arphaman. - Rename file - Fix tests Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63755/new/ https://reviews.llvm.org/D63755 Files: clang/bindings/python/tests/cindex/test_cdb.py clang/include/clang/Tooling/CompilationDatabase.h clang/lib/Tooling/CMakeLists.txt clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp clang/lib/Tooling/JSONCompilationDatabase.cpp clang/unittests/Tooling/CompilationDatabaseTest.cpp Index: clang/unittests/Tooling/CompilationDatabaseTest.cpp === --- clang/unittests/Tooling/CompilationDatabaseTest.cpp +++ clang/unittests/Tooling/CompilationDatabaseTest.cpp @@ -9,10 +9,12 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclGroup.h" #include "clang/Frontend/FrontendAction.h" +#include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/FileMatchTrie.h" #include "clang/Tooling/JSONCompilationDatabase.h" #include "clang/Tooling/Tooling.h" #include "llvm/Support/Path.h" +#include "llvm/Support/TargetSelect.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -632,7 +634,7 @@ } }; -class InterpolateTest : public ::testing::Test { +class MemDBTest : public ::testing::Test { protected: // Adds an entry to the underlying compilation database. // A flag is injected: -D , so the command used can be identified. @@ -658,6 +660,11 @@ return Result.str(); } + MemCDB::EntryMap Entries; +}; + +class InterpolateTest : public MemDBTest { +protected: // Look up the command from a relative path, and return it in string form. // The input file is not included in the returned command. std::string getCommand(llvm::StringRef F) { @@ -693,8 +700,6 @@ llvm::sys::path::native(Result, llvm::sys::path::Style::posix); return Result.str(); } - - MemCDB::EntryMap Entries; }; TEST_F(InterpolateTest, Nearby) { @@ -804,5 +809,30 @@ EXPECT_TRUE(CCRef != CCTest); } +class TargetAndModeTest : public MemDBTest { +public: + TargetAndModeTest() { llvm::InitializeAllTargetInfos(); } + +protected: + // Look up the command from a relative path, and return it in string form. + std::string getCommand(llvm::StringRef F) { +auto Results = inferTargetAndDriverMode(llvm::make_unique(Entries)) + ->getCompileCommands(path(F)); +if (Results.empty()) + return "none"; +return llvm::join(Results[0].CommandLine, " "); + } +}; + +TEST_F(TargetAndModeTest, TargetAndMode) { + add("foo.cpp", "clang-cl", ""); + add("bar.cpp", "x86_64-linux-clang", ""); + + EXPECT_EQ(getCommand("foo.cpp"), +"clang-cl --driver-mode=cl foo.cpp -D foo.cpp"); + EXPECT_EQ(getCommand("bar.cpp"), +"x86_64-linux-clang -target x86_64-linux bar.cpp -D bar.cpp"); +} + } // end namespace tooling } // end namespace clang Index: clang/lib/Tooling/JSONCompilationDatabase.cpp === --- clang/lib/Tooling/JSONCompilationDatabase.cpp +++ clang/lib/Tooling/JSONCompilationDatabase.cpp @@ -14,7 +14,9 @@ #include "clang/Basic/LLVM.h" #include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/CompilationDatabasePluginRegistry.h" +#include "clang/Tooling/Tooling.h" #include "llvm/ADT/Optional.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" @@ -165,7 +167,9 @@ llvm::sys::path::append(JSONDatabasePath, "compile_commands.json"); auto Base = JSONCompilationDatabase::loadFromFile( JSONDatabasePath, ErrorMessage, JSONCommandLineSyntax::AutoDetect); -return Base ? inferMissingCompileCommands(std::move(Base)) : nullptr; +return Base ? inferTargetAndDriverMode( + inferMissingCompileCommands(std::move(Base))) +: nullptr; } }; Index: clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp === --- /dev/null +++ clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp @@ -0,0 +1,57 @@ +//===- GuessTargetAndModeCompilationDatabase.cpp --===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "clang/Tooling/CompilationDatabase.h" +#include "clang/Tooling/Tooling.h" +#include + +namespace clang { +namespace tooling { + +namespace { +class TargetAndModeAdderDatabase : public CompilationDatabase { +public: + TargetAndModeAdderDatabase(std::unique_ptr Base) + : Base(std::move(Base)) { +assert(this->Base != nullptr); + } + +
[PATCH] D63755: [clang][Tooling] Infer target and mode from argv[0] when using JSONCompilationDatabase
ilya-biryukov accepted this revision. ilya-biryukov added a comment. This revision is now accepted and ready to land. LGTM Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63755/new/ https://reviews.llvm.org/D63755 ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D63755: [clang][Tooling] Infer target and mode from argv[0] when using JSONCompilationDatabase
kadircet created this revision. kadircet added a reviewer: ilya-biryukov. Herald added subscribers: cfe-commits, mgorny. Herald added a project: clang. kadircet added a child revision: D63194: [clangd] Link and initialize target infos. Wraps JSON compilation database with a target and mode adding database wrapper. So that driver can correctly figure out which toolchain to use. Note that clients that wants to make use of this target discovery mechanism needs to link in TargetsInfos and initialize them at startup. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D63755 Files: clang/include/clang/Tooling/CompilationDatabase.h clang/lib/Tooling/CMakeLists.txt clang/lib/Tooling/JSONCompilationDatabase.cpp clang/lib/Tooling/TargetAndModeAdderDatabase.cpp clang/unittests/Tooling/CompilationDatabaseTest.cpp Index: clang/unittests/Tooling/CompilationDatabaseTest.cpp === --- clang/unittests/Tooling/CompilationDatabaseTest.cpp +++ clang/unittests/Tooling/CompilationDatabaseTest.cpp @@ -9,10 +9,12 @@ #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclGroup.h" #include "clang/Frontend/FrontendAction.h" +#include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/FileMatchTrie.h" #include "clang/Tooling/JSONCompilationDatabase.h" #include "clang/Tooling/Tooling.h" #include "llvm/Support/Path.h" +#include "llvm/Support/TargetSelect.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -632,7 +634,7 @@ } }; -class InterpolateTest : public ::testing::Test { +class MemDBTest : public ::testing::Test { protected: // Adds an entry to the underlying compilation database. // A flag is injected: -D , so the command used can be identified. @@ -658,6 +660,11 @@ return Result.str(); } + MemCDB::EntryMap Entries; +}; + +class InterpolateTest : public MemDBTest { +protected: // Look up the command from a relative path, and return it in string form. // The input file is not included in the returned command. std::string getCommand(llvm::StringRef F) { @@ -693,8 +700,6 @@ llvm::sys::path::native(Result, llvm::sys::path::Style::posix); return Result.str(); } - - MemCDB::EntryMap Entries; }; TEST_F(InterpolateTest, Nearby) { @@ -804,5 +809,31 @@ EXPECT_TRUE(CCRef != CCTest); } +class TargetAndModeTest : public MemDBTest { +public: + TargetAndModeTest() { llvm::InitializeAllTargetInfos(); } + +protected: + // Look up the command from a relative path, and return it in string form. + std::string getCommand(llvm::StringRef F) { +auto Results = +getTargetAndModeAdderDatabase(llvm::make_unique(Entries)) +->getCompileCommands(path(F)); +if (Results.empty()) + return "none"; +return llvm::join(Results[0].CommandLine, " "); + } +}; + +TEST_F(TargetAndModeTest, TargetAndMode) { + add("foo.cpp", "clang-cl", ""); + add("bar.cpp", "x86_64-linux-clang", ""); + + EXPECT_EQ(getCommand("foo.cpp"), +"clang-cl --driver-mode=cl foo.cpp -D foo.cpp"); + EXPECT_EQ(getCommand("bar.cpp"), +"x86_64-linux-clang -target x86_64-linux bar.cpp -D bar.cpp"); +} + } // end namespace tooling } // end namespace clang Index: clang/lib/Tooling/TargetAndModeAdderDatabase.cpp === --- /dev/null +++ clang/lib/Tooling/TargetAndModeAdderDatabase.cpp @@ -0,0 +1,57 @@ +//===- TargetAndModeAdderDatabase.cpp -===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===--===// + +#include "clang/Tooling/CompilationDatabase.h" +#include "clang/Tooling/Tooling.h" +#include + +namespace clang { +namespace tooling { + +namespace { +class TargetAndModeAdderDatabase : public CompilationDatabase { +public: + TargetAndModeAdderDatabase(std::unique_ptr Base) + : Base(std::move(Base)) { +assert(this->Base != nullptr); + } + + std::vector getAllFiles() const override { +return Base->getAllFiles(); + } + + std::vector getAllCompileCommands() const override { +return addTargetAndMode(Base->getAllCompileCommands()); + } + + std::vector + getCompileCommands(StringRef FilePath) const override { +return addTargetAndMode(Base->getCompileCommands(FilePath)); + } + +private: + std::vector + addTargetAndMode(std::vector Cmds) const { +for (auto : Cmds) { + if (Cmd.CommandLine.empty()) +continue; + addTargetAndModeForProgramName(Cmd.CommandLine, Cmd.CommandLine.front()); +} +return Cmds; + } + std::unique_ptr Base; +}; +} // namespace + +std::unique_ptr +inferTargetAndDriverMode(std::unique_ptr Base) { + return llvm::make_unique(std::move(Base)); +} + +} // namespace