llvm-project/clang/lib/Tooling/GuessTargetAndModeCompilationDatabase.cpp
Kadir Cetinkaya c3a7302397 [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
2019-06-26 07:39:03 +00:00

58 lines
1.7 KiB
C++

//===- 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 <memory>
namespace clang {
namespace tooling {
namespace {
class TargetAndModeAdderDatabase : public CompilationDatabase {
public:
TargetAndModeAdderDatabase(std::unique_ptr<CompilationDatabase> Base)
: Base(std::move(Base)) {
assert(this->Base != nullptr);
}
std::vector<std::string> getAllFiles() const override {
return Base->getAllFiles();
}
std::vector<CompileCommand> getAllCompileCommands() const override {
return addTargetAndMode(Base->getAllCompileCommands());
}
std::vector<CompileCommand>
getCompileCommands(StringRef FilePath) const override {
return addTargetAndMode(Base->getCompileCommands(FilePath));
}
private:
std::vector<CompileCommand>
addTargetAndMode(std::vector<CompileCommand> Cmds) const {
for (auto &Cmd : Cmds) {
if (Cmd.CommandLine.empty())
continue;
addTargetAndModeForProgramName(Cmd.CommandLine, Cmd.CommandLine.front());
}
return Cmds;
}
std::unique_ptr<CompilationDatabase> Base;
};
} // namespace
std::unique_ptr<CompilationDatabase>
inferTargetAndDriverMode(std::unique_ptr<CompilationDatabase> Base) {
return llvm::make_unique<TargetAndModeAdderDatabase>(std::move(Base));
}
} // namespace tooling
} // namespace clang