1 //===- lib/Tooling/Execution.cpp - Implements tool execution framework. ---===//
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
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
)
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() {
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
);
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
) {
50 std::pair
<std::unique_ptr
<FrontendActionFactory
>, ArgumentsAdjuster
>>
52 Actions
.emplace_back(std::move(Action
), std::move(Adjuster
));
53 return execute(Actions
);
57 llvm::Expected
<std::unique_ptr
<ToolExecutor
>>
58 createExecutorFromCommandLineArgsImpl(int &argc
, const char **argv
,
59 llvm::cl::OptionCategory
&Category
,
60 const char *Overview
) {
62 CommonOptionsParser::create(argc
, argv
, Category
, llvm::cl::ZeroOrMore
,
63 /*Overview=*/Overview
);
65 return OptionsParser
.takeError();
66 for (const auto &TEPlugin
: ToolExecutorPluginRegistry::entries()) {
67 if (TEPlugin
.getName() != ExecutorName
) {
70 std::unique_ptr
<ToolExecutorPlugin
> Plugin(TEPlugin
.instantiate());
71 llvm::Expected
<std::unique_ptr
<ToolExecutor
>> Executor
=
72 Plugin
->create(*OptionsParser
);
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
,
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