Mercurial > hg > CbC > CbC_llvm
view clang/lib/Tooling/Execution.cpp @ 176:de4ac79aef9d
...
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 25 May 2020 17:13:11 +0900 |
parents | 1d019706d866 |
children | 2e18cbf3894f |
line wrap: on
line source
//===- 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<std::string> 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<std::pair<llvm::StringRef, llvm::StringRef>> InMemoryToolResults::AllKVResults() { return KVResults; } void InMemoryToolResults::forEachResult( llvm::function_ref<void(StringRef Key, StringRef Value)> 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<FrontendActionFactory> Action) { return execute(std::move(Action), ArgumentsAdjuster()); } llvm::Error ToolExecutor::execute(std::unique_ptr<FrontendActionFactory> Action, ArgumentsAdjuster Adjuster) { std::vector< std::pair<std::unique_ptr<FrontendActionFactory>, ArgumentsAdjuster>> Actions; Actions.emplace_back(std::move(Action), std::move(Adjuster)); return execute(Actions); } namespace internal { llvm::Expected<std::unique_ptr<ToolExecutor>> 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<ToolExecutorPlugin> Plugin(I->instantiate()); llvm::Expected<std::unique_ptr<ToolExecutor>> Executor = Plugin->create(*OptionsParser); if (!Executor) { return llvm::make_error<llvm::StringError>( llvm::Twine("Failed to create '") + I->getName() + "': " + llvm::toString(Executor.takeError()) + "\n", llvm::inconvertibleErrorCode()); } return std::move(*Executor); } return llvm::make_error<llvm::StringError>( llvm::Twine("Executor \"") + ExecutorName + "\" is not registered.", llvm::inconvertibleErrorCode()); } } // end namespace internal llvm::Expected<std::unique_ptr<ToolExecutor>> 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