From c3a7302397746d669e5339ef25506b0429b23354 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Wed, 26 Jun 2019 07:39:03 +0000 Subject: [clang][Tooling] Infer target and mode from argv[0] when using JSONCompilationDatabase Summary: 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. Reviewers: ilya-biryukov Subscribers: mgorny, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D63755 llvm-svn: 364386 --- .../GuessTargetAndModeCompilationDatabase.cpp | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp (limited to 'clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp') diff --git a/clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp b/clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp new file mode 100644 index 00000000000..ac3faf1b01f --- /dev/null +++ b/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); + } + + 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 &Cmd : 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 -- cgit v1.2.3