#pragma once /* * This file is distributed under the MIT License. See LICENSE.md for details. */ #include #include "llvm/Support/CommandLine.h" #include "llvm/Support/PluginLoader.h" #include "revng/Pipes/PipelineManager.h" namespace revng::pipes { class ToolCLOptions { private: llvm::cl::list InputPipeline; llvm::cl::opt ModelOverride; llvm::cl::list EnablingFlags; llvm::cl::opt ExecutionDirectory; llvm::cl::alias A1; public: ToolCLOptions(llvm::cl::OptionCategory &Category) : InputPipeline("P", llvm::cl::desc(""), llvm::cl::cat(Category)), ModelOverride("m", llvm::cl::desc("Load the model from a provided file"), llvm::cl::cat(Category), llvm::cl::init("")), EnablingFlags("f", llvm::cl::desc("list of pipeline enabling flags"), llvm::cl::cat(Category)), ExecutionDirectory("resume", llvm::cl::desc("Directory from which all containers " "will be loaded before everything else " "and to which it will be store after " "everything else"), llvm::cl::cat(Category)), A1("l", llvm::cl::desc("Alias for --load"), llvm::cl::aliasopt(llvm::LoadOpt), llvm::cl::cat(Category)) {} llvm::Error overrideModel(llvm::StringRef ModelOverride, PipelineManager &Manager) { const auto &Name = ModelGlobalName; auto *Model(cantFail(Manager.context().getGlobal(Name))); return Model->loadFromDisk(ModelOverride); } llvm::Expected makeManager() { auto Manager = revng::pipes::PipelineManager::create(InputPipeline, EnablingFlags, ExecutionDirectory); if (not Manager) return Manager; if (not ModelOverride.empty()) if (auto Err = overrideModel(ModelOverride, *Manager); Err) return std::move(Err); return Manager; } }; } // namespace revng::pipes