
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
58 lines
1.7 KiB
C++
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
|