1 //===- GuessTargetAndModeCompilationDatabase.cpp --------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "clang/Tooling/CompilationDatabase.h" 10 #include "clang/Tooling/Tooling.h" 11 #include <memory> 12 13 namespace clang { 14 namespace tooling { 15 16 namespace { 17 class TargetAndModeAdderDatabase : public CompilationDatabase { 18 public: TargetAndModeAdderDatabase(std::unique_ptr<CompilationDatabase> Base)19 TargetAndModeAdderDatabase(std::unique_ptr<CompilationDatabase> Base) 20 : Base(std::move(Base)) { 21 assert(this->Base != nullptr); 22 } 23 getAllFiles() const24 std::vector<std::string> getAllFiles() const override { 25 return Base->getAllFiles(); 26 } 27 getAllCompileCommands() const28 std::vector<CompileCommand> getAllCompileCommands() const override { 29 return addTargetAndMode(Base->getAllCompileCommands()); 30 } 31 32 std::vector<CompileCommand> getCompileCommands(StringRef FilePath) const33 getCompileCommands(StringRef FilePath) const override { 34 return addTargetAndMode(Base->getCompileCommands(FilePath)); 35 } 36 37 private: 38 std::vector<CompileCommand> addTargetAndMode(std::vector<CompileCommand> Cmds) const39 addTargetAndMode(std::vector<CompileCommand> Cmds) const { 40 for (auto &Cmd : Cmds) { 41 if (Cmd.CommandLine.empty()) 42 continue; 43 addTargetAndModeForProgramName(Cmd.CommandLine, Cmd.CommandLine.front()); 44 } 45 return Cmds; 46 } 47 std::unique_ptr<CompilationDatabase> Base; 48 }; 49 } // namespace 50 51 std::unique_ptr<CompilationDatabase> inferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base)52inferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base) { 53 return std::make_unique<TargetAndModeAdderDatabase>(std::move(Base)); 54 } 55 56 } // namespace tooling 57 } // namespace clang 58