//===- lib/Tooling/Execution.cpp - Implements tool execution framework. ---===// // // 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/Execution.h" #include "clang/Tooling/ToolExecutorPluginRegistry.h" #include "clang/Tooling/Tooling.h" LLVM_INSTANTIATE_REGISTRY(clang::tooling::ToolExecutorPluginRegistry) namespace clang { namespace tooling { llvm::cl::opt ExecutorName("executor", llvm::cl::desc("The name of the executor to use."), llvm::cl::init("standalone")); void InMemoryToolResults::addResult(StringRef Key, StringRef Value) { KVResults.push_back({Strings.save(Key), Strings.save(Value)}); } std::vector> InMemoryToolResults::AllKVResults() { return KVResults; } void InMemoryToolResults::forEachResult( llvm::function_ref Callback) { for (const auto &KV : KVResults) { Callback(KV.first, KV.second); } } void ExecutionContext::reportResult(StringRef Key, StringRef Value) { Results->addResult(Key, Value); } llvm::Error ToolExecutor::execute(std::unique_ptr Action) { return execute(std::move(Action), ArgumentsAdjuster()); } llvm::Error ToolExecutor::execute(std::unique_ptr Action, ArgumentsAdjuster Adjuster) { std::vector< std::pair, ArgumentsAdjuster>> Actions; Actions.emplace_back(std::move(Action), std::move(Adjuster)); return execute(Actions); } namespace internal { llvm::Expected> createExecutorFromCommandLineArgsImpl(int &argc, const char **argv, llvm::cl::OptionCategory &Category, const char *Overview) { auto OptionsParser = CommonOptionsParser::create(argc, argv, Category, llvm::cl::ZeroOrMore, /*Overview=*/Overview); if (!OptionsParser) return OptionsParser.takeError(); for (auto I = ToolExecutorPluginRegistry::begin(), E = ToolExecutorPluginRegistry::end(); I != E; ++I) { if (I->getName() != ExecutorName) { continue; } std::unique_ptr Plugin(I->instantiate()); llvm::Expected> Executor = Plugin->create(*OptionsParser); if (!Executor) { return llvm::make_error( llvm::Twine("Failed to create '") + I->getName() + "': " + llvm::toString(Executor.takeError()) + "\n", llvm::inconvertibleErrorCode()); } return std::move(*Executor); } return llvm::make_error( llvm::Twine("Executor \"") + ExecutorName + "\" is not registered.", llvm::inconvertibleErrorCode()); } } // end namespace internal llvm::Expected> createExecutorFromCommandLineArgs(int &argc, const char **argv, llvm::cl::OptionCategory &Category, const char *Overview) { return internal::createExecutorFromCommandLineArgsImpl(argc, argv, Category, Overview); } // This anchor is used to force the linker to link in the generated object file // and thus register the StandaloneToolExecutorPlugin etc. extern volatile int StandaloneToolExecutorAnchorSource; extern volatile int AllTUsToolExecutorAnchorSource; static int LLVM_ATTRIBUTE_UNUSED StandaloneToolExecutorAnchorDest = StandaloneToolExecutorAnchorSource; static int LLVM_ATTRIBUTE_UNUSED AllTUsToolExecutorAnchorDest = AllTUsToolExecutorAnchorSource; } // end namespace tooling } // end namespace clang