1*0b57cec5SDimitry Andric //===-- Driver.h ------------------------------------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #ifndef lldb_Driver_h_ 10*0b57cec5SDimitry Andric #define lldb_Driver_h_ 11*0b57cec5SDimitry Andric 12*0b57cec5SDimitry Andric #include "Platform.h" 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric #include "lldb/API/SBBroadcaster.h" 15*0b57cec5SDimitry Andric #include "lldb/API/SBDebugger.h" 16*0b57cec5SDimitry Andric #include "lldb/API/SBDefines.h" 17*0b57cec5SDimitry Andric #include "lldb/API/SBError.h" 18*0b57cec5SDimitry Andric 19*0b57cec5SDimitry Andric #include "llvm/Option/Arg.h" 20*0b57cec5SDimitry Andric #include "llvm/Option/ArgList.h" 21*0b57cec5SDimitry Andric #include "llvm/Option/Option.h" 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andric #include <set> 24*0b57cec5SDimitry Andric #include <string> 25*0b57cec5SDimitry Andric #include <vector> 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric class Driver : public lldb::SBBroadcaster { 28*0b57cec5SDimitry Andric public: 29*0b57cec5SDimitry Andric enum CommandPlacement { 30*0b57cec5SDimitry Andric eCommandPlacementBeforeFile, 31*0b57cec5SDimitry Andric eCommandPlacementAfterFile, 32*0b57cec5SDimitry Andric eCommandPlacementAfterCrash, 33*0b57cec5SDimitry Andric }; 34*0b57cec5SDimitry Andric 35*0b57cec5SDimitry Andric Driver(); 36*0b57cec5SDimitry Andric 37*0b57cec5SDimitry Andric virtual ~Driver(); 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric /// Runs the main loop. 40*0b57cec5SDimitry Andric /// 41*0b57cec5SDimitry Andric /// \return The exit code that the process should return. 42*0b57cec5SDimitry Andric int MainLoop(); 43*0b57cec5SDimitry Andric 44*0b57cec5SDimitry Andric lldb::SBError ProcessArgs(const llvm::opt::InputArgList &args, bool &exiting); 45*0b57cec5SDimitry Andric 46*0b57cec5SDimitry Andric void WriteCommandsForSourcing(CommandPlacement placement, 47*0b57cec5SDimitry Andric lldb::SBStream &strm); 48*0b57cec5SDimitry Andric 49*0b57cec5SDimitry Andric struct OptionData { 50*0b57cec5SDimitry Andric void AddInitialCommand(std::string command, CommandPlacement placement, 51*0b57cec5SDimitry Andric bool is_file, lldb::SBError &error); 52*0b57cec5SDimitry Andric 53*0b57cec5SDimitry Andric struct InitialCmdEntry { 54*0b57cec5SDimitry Andric InitialCmdEntry(std::string contents, bool in_is_file, 55*0b57cec5SDimitry Andric bool in_quiet = false) 56*0b57cec5SDimitry Andric : contents(std::move(contents)), is_file(in_is_file), 57*0b57cec5SDimitry Andric source_quietly(in_quiet) {} 58*0b57cec5SDimitry Andric 59*0b57cec5SDimitry Andric std::string contents; 60*0b57cec5SDimitry Andric bool is_file; 61*0b57cec5SDimitry Andric bool source_quietly; 62*0b57cec5SDimitry Andric }; 63*0b57cec5SDimitry Andric 64*0b57cec5SDimitry Andric std::vector<std::string> m_args; 65*0b57cec5SDimitry Andric 66*0b57cec5SDimitry Andric lldb::LanguageType m_repl_lang = lldb::eLanguageTypeUnknown; 67*0b57cec5SDimitry Andric lldb::pid_t m_process_pid = LLDB_INVALID_PROCESS_ID; 68*0b57cec5SDimitry Andric 69*0b57cec5SDimitry Andric std::string m_core_file; 70*0b57cec5SDimitry Andric std::string m_crash_log; 71*0b57cec5SDimitry Andric std::string m_repl_options; 72*0b57cec5SDimitry Andric std::string m_process_name; 73*0b57cec5SDimitry Andric 74*0b57cec5SDimitry Andric std::vector<InitialCmdEntry> m_initial_commands; 75*0b57cec5SDimitry Andric std::vector<InitialCmdEntry> m_after_file_commands; 76*0b57cec5SDimitry Andric std::vector<InitialCmdEntry> m_after_crash_commands; 77*0b57cec5SDimitry Andric 78*0b57cec5SDimitry Andric bool m_debug_mode = false; 79*0b57cec5SDimitry Andric bool m_source_quietly = false; 80*0b57cec5SDimitry Andric bool m_print_version = false; 81*0b57cec5SDimitry Andric bool m_print_python_path = false; 82*0b57cec5SDimitry Andric bool m_wait_for = false; 83*0b57cec5SDimitry Andric bool m_repl = false; 84*0b57cec5SDimitry Andric bool m_batch = false; 85*0b57cec5SDimitry Andric 86*0b57cec5SDimitry Andric // FIXME: When we have set/show variables we can remove this from here. 87*0b57cec5SDimitry Andric bool m_use_external_editor = false; 88*0b57cec5SDimitry Andric 89*0b57cec5SDimitry Andric using OptionSet = std::set<char>; 90*0b57cec5SDimitry Andric OptionSet m_seen_options; 91*0b57cec5SDimitry Andric }; 92*0b57cec5SDimitry Andric 93*0b57cec5SDimitry Andric lldb::SBDebugger &GetDebugger() { return m_debugger; } 94*0b57cec5SDimitry Andric 95*0b57cec5SDimitry Andric void ResizeWindow(unsigned short col); 96*0b57cec5SDimitry Andric 97*0b57cec5SDimitry Andric private: 98*0b57cec5SDimitry Andric lldb::SBDebugger m_debugger; 99*0b57cec5SDimitry Andric OptionData m_option_data; 100*0b57cec5SDimitry Andric }; 101*0b57cec5SDimitry Andric 102*0b57cec5SDimitry Andric #endif // lldb_Driver_h_ 103