[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / clang / lib / Tooling / Execution.cpp
blob247b260b97edcc270315b688c72af2df6edb57ec
1 //===- lib/Tooling/Execution.cpp - Implements tool execution framework. ---===//
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 //===----------------------------------------------------------------------===//
9 #include "clang/Tooling/Execution.h"
10 #include "clang/Tooling/ToolExecutorPluginRegistry.h"
11 #include "clang/Tooling/Tooling.h"
13 LLVM_INSTANTIATE_REGISTRY(clang::tooling::ToolExecutorPluginRegistry)
15 namespace clang {
16 namespace tooling {
18 llvm::cl::opt<std::string>
19 ExecutorName("executor", llvm::cl::desc("The name of the executor to use."),
20 llvm::cl::init("standalone"));
22 void InMemoryToolResults::addResult(StringRef Key, StringRef Value) {
23 KVResults.push_back({Strings.save(Key), Strings.save(Value)});
26 std::vector<std::pair<llvm::StringRef, llvm::StringRef>>
27 InMemoryToolResults::AllKVResults() {
28 return KVResults;
31 void InMemoryToolResults::forEachResult(
32 llvm::function_ref<void(StringRef Key, StringRef Value)> Callback) {
33 for (const auto &KV : KVResults) {
34 Callback(KV.first, KV.second);
38 void ExecutionContext::reportResult(StringRef Key, StringRef Value) {
39 Results->addResult(Key, Value);
42 llvm::Error
43 ToolExecutor::execute(std::unique_ptr<FrontendActionFactory> Action) {
44 return execute(std::move(Action), ArgumentsAdjuster());
47 llvm::Error ToolExecutor::execute(std::unique_ptr<FrontendActionFactory> Action,
48 ArgumentsAdjuster Adjuster) {
49 std::vector<
50 std::pair<std::unique_ptr<FrontendActionFactory>, ArgumentsAdjuster>>
51 Actions;
52 Actions.emplace_back(std::move(Action), std::move(Adjuster));
53 return execute(Actions);
56 namespace internal {
57 llvm::Expected<std::unique_ptr<ToolExecutor>>
58 createExecutorFromCommandLineArgsImpl(int &argc, const char **argv,
59 llvm::cl::OptionCategory &Category,
60 const char *Overview) {
61 auto OptionsParser =
62 CommonOptionsParser::create(argc, argv, Category, llvm::cl::ZeroOrMore,
63 /*Overview=*/Overview);
64 if (!OptionsParser)
65 return OptionsParser.takeError();
66 for (const auto &TEPlugin : ToolExecutorPluginRegistry::entries()) {
67 if (TEPlugin.getName() != ExecutorName) {
68 continue;
70 std::unique_ptr<ToolExecutorPlugin> Plugin(TEPlugin.instantiate());
71 llvm::Expected<std::unique_ptr<ToolExecutor>> Executor =
72 Plugin->create(*OptionsParser);
73 if (!Executor) {
74 return llvm::make_error<llvm::StringError>(
75 llvm::Twine("Failed to create '") + TEPlugin.getName() +
76 "': " + llvm::toString(Executor.takeError()) + "\n",
77 llvm::inconvertibleErrorCode());
79 return std::move(*Executor);
81 return llvm::make_error<llvm::StringError>(
82 llvm::Twine("Executor \"") + ExecutorName + "\" is not registered.",
83 llvm::inconvertibleErrorCode());
85 } // end namespace internal
87 llvm::Expected<std::unique_ptr<ToolExecutor>>
88 createExecutorFromCommandLineArgs(int &argc, const char **argv,
89 llvm::cl::OptionCategory &Category,
90 const char *Overview) {
91 return internal::createExecutorFromCommandLineArgsImpl(argc, argv, Category,
92 Overview);
95 // This anchor is used to force the linker to link in the generated object file
96 // and thus register the StandaloneToolExecutorPlugin etc.
97 extern volatile int StandaloneToolExecutorAnchorSource;
98 extern volatile int AllTUsToolExecutorAnchorSource;
99 static int LLVM_ATTRIBUTE_UNUSED StandaloneToolExecutorAnchorDest =
100 StandaloneToolExecutorAnchorSource;
101 static int LLVM_ATTRIBUTE_UNUSED AllTUsToolExecutorAnchorDest =
102 AllTUsToolExecutorAnchorSource;
104 } // end namespace tooling
105 } // end namespace clang