10b57cec5SDimitry Andric //===-- Driver.h ------------------------------------------------*- C++ -*-===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 95ffd83dbSDimitry Andric #ifndef LLDB_TOOLS_DRIVER_DRIVER_H 105ffd83dbSDimitry Andric #define LLDB_TOOLS_DRIVER_DRIVER_H 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "Platform.h" 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "lldb/API/SBBroadcaster.h" 150b57cec5SDimitry Andric #include "lldb/API/SBDebugger.h" 160b57cec5SDimitry Andric #include "lldb/API/SBDefines.h" 170b57cec5SDimitry Andric #include "lldb/API/SBError.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric #include "llvm/Option/Arg.h" 200b57cec5SDimitry Andric #include "llvm/Option/ArgList.h" 210b57cec5SDimitry Andric #include "llvm/Option/Option.h" 220b57cec5SDimitry Andric 230b57cec5SDimitry Andric #include <set> 240b57cec5SDimitry Andric #include <string> 250b57cec5SDimitry Andric #include <vector> 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric class Driver : public lldb::SBBroadcaster { 280b57cec5SDimitry Andric public: 290b57cec5SDimitry Andric enum CommandPlacement { 300b57cec5SDimitry Andric eCommandPlacementBeforeFile, 310b57cec5SDimitry Andric eCommandPlacementAfterFile, 320b57cec5SDimitry Andric eCommandPlacementAfterCrash, 330b57cec5SDimitry Andric }; 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric Driver(); 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric virtual ~Driver(); 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric /// Runs the main loop. 400b57cec5SDimitry Andric /// 410b57cec5SDimitry Andric /// \return The exit code that the process should return. 420b57cec5SDimitry Andric int MainLoop(); 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric lldb::SBError ProcessArgs(const llvm::opt::InputArgList &args, bool &exiting); 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric void WriteCommandsForSourcing(CommandPlacement placement, 470b57cec5SDimitry Andric lldb::SBStream &strm); 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric struct OptionData { 500b57cec5SDimitry Andric void AddInitialCommand(std::string command, CommandPlacement placement, 510b57cec5SDimitry Andric bool is_file, lldb::SBError &error); 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric struct InitialCmdEntry { 540b57cec5SDimitry Andric InitialCmdEntry(std::string contents, bool in_is_file, 550b57cec5SDimitry Andric bool in_quiet = false) 560b57cec5SDimitry Andric : contents(std::move(contents)), is_file(in_is_file), 570b57cec5SDimitry Andric source_quietly(in_quiet) {} 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric std::string contents; 600b57cec5SDimitry Andric bool is_file; 610b57cec5SDimitry Andric bool source_quietly; 620b57cec5SDimitry Andric }; 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric std::vector<std::string> m_args; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric lldb::LanguageType m_repl_lang = lldb::eLanguageTypeUnknown; 670b57cec5SDimitry Andric lldb::pid_t m_process_pid = LLDB_INVALID_PROCESS_ID; 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric std::string m_core_file; 700b57cec5SDimitry Andric std::string m_crash_log; 710b57cec5SDimitry Andric std::string m_repl_options; 720b57cec5SDimitry Andric std::string m_process_name; 730b57cec5SDimitry Andric 740b57cec5SDimitry Andric std::vector<InitialCmdEntry> m_initial_commands; 750b57cec5SDimitry Andric std::vector<InitialCmdEntry> m_after_file_commands; 760b57cec5SDimitry Andric std::vector<InitialCmdEntry> m_after_crash_commands; 770b57cec5SDimitry Andric 780b57cec5SDimitry Andric bool m_source_quietly = false; 790b57cec5SDimitry Andric bool m_print_version = false; 800b57cec5SDimitry Andric bool m_print_python_path = false; 81*349cc55cSDimitry Andric bool m_print_script_interpreter_info = false; 820b57cec5SDimitry Andric bool m_wait_for = false; 830b57cec5SDimitry Andric bool m_repl = false; 840b57cec5SDimitry Andric bool m_batch = false; 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric // FIXME: When we have set/show variables we can remove this from here. 870b57cec5SDimitry Andric bool m_use_external_editor = false; 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric using OptionSet = std::set<char>; 900b57cec5SDimitry Andric OptionSet m_seen_options; 910b57cec5SDimitry Andric }; 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric lldb::SBDebugger &GetDebugger() { return m_debugger; } 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric void ResizeWindow(unsigned short col); 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric private: 980b57cec5SDimitry Andric lldb::SBDebugger m_debugger; 990b57cec5SDimitry Andric OptionData m_option_data; 1000b57cec5SDimitry Andric }; 1010b57cec5SDimitry Andric 1025ffd83dbSDimitry Andric #endif // LLDB_TOOLS_DRIVER_DRIVER_H 103