diff options
Diffstat (limited to 'tools/lldb-mi/MIDriverMain.cpp')
-rw-r--r-- | tools/lldb-mi/MIDriverMain.cpp | 235 |
1 files changed, 3 insertions, 232 deletions
diff --git a/tools/lldb-mi/MIDriverMain.cpp b/tools/lldb-mi/MIDriverMain.cpp index 5557799..3b7588b 100644 --- a/tools/lldb-mi/MIDriverMain.cpp +++ b/tools/lldb-mi/MIDriverMain.cpp @@ -7,9 +7,6 @@ // //===----------------------------------------------------------------------===// -//++ -// File: MIDriverMain.cpp -// // Overview: Defines the entry point for the console application. // The MI application (project name MI) runs in two modes: // An LLDB native driver mode where it acts no different from the LLDB driver. @@ -23,25 +20,7 @@ // MICmdCommands.cpp // MICmdBase.h / .cpp // MICmdCmd.h / .cpp -// Versions: 1.0.0.1 First version from scratch 28/1/2014 to 28/3/2014. MI not complete. -// 1.0.0.2 First deliverable to client 7/3/2014. MI not complete. -// 1.0.0.3 Code refactor tidy. Release to community for evaluation 17/5/2014. MI not complete. -// 1.0.0.4 Post release to the community for evaluation 17/5/2014. MI not complete. -// 1.0.0.5 Second deliverable to client 16/6/2014. -// 1.0.0.6 Post release of second deliverable to client 16/6/2014. -// Released to the community 24/6/2014. -// 1.0.0.7 Post release to the community. -// Delivered to client 30/6/2014. -// 1.0.0.8 Delivered to client 29/7/2014. -// 1.0.0.9 Post release to client 29/7/2014. -// See MIreadme.txt for list of MI commands implemented. -// -// Environment: Compilers: Visual C++ 12. -// gcc (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1 -// Libraries: See MIReadme.txt. -// -// Copyright: None. -//-- + #if defined(_MSC_VER) #define _INC_SIGNAL // Stop window's signal.h being included - CODETAG_IOR_SIGNALS @@ -54,51 +33,17 @@ // In house headers: #include "MICmnConfig.h" #include "Platform.h" // Define signals - CODETAG_IOR_SIGNALS -#include "Driver.h" #include "MIDriverMgr.h" #include "MIDriver.h" #include "MICmnResources.h" #include "MICmnStreamStdin.h" #include "MIUtilDebug.h" -#include "MICmnLog.h" -#if MICONFIG_COMPILE_MIDRIVER_VERSION #if defined(_MSC_VER) #pragma warning(once : 4530) // Warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc #endif // _MSC_VER -// ToDo: Reevaluate if this function needs to be implemented like the UNIX equivalent -// CODETAG_IOR_SIGNALS -//++ ------------------------------------------------------------------------------------ -// Details: The SIGWINCH signal is sent to a process when its controlling terminal -// changes its size (a window change). -// Type: Function. -// Args: vSigno - (R) Signal number. -// Return: None. -// Throws: None. -//-- -void -sigwinch_handler(int vSigno) -{ -#ifdef _WIN32 // Restore handler as it is not persistent on Windows - signal(SIGWINCH, sigwinch_handler); -#endif - MIunused(vSigno); - - struct winsize window_size; - if (::isatty(STDIN_FILENO) && ::ioctl(STDIN_FILENO, TIOCGWINSZ, &window_size) == 0) - { - CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); - if (window_size.ws_col > 0) - { - rDriverMgr.DriverResizeWindow((uint32_t)window_size.ws_col); - } - } - - CMICmnLog::Instance().WriteLog(CMIUtilString::Format(MIRSRC(IDS_PROCESS_SIGNAL_RECEIVED), "SIGWINCH", vSigno)); -} - // CODETAG_IOR_SIGNALS //++ ------------------------------------------------------------------------------------ // Details: The SIGINT signal is sent to a process by its controlling terminal when a @@ -130,74 +75,8 @@ sigint_handler(int vSigno) } } - CMICmnLog::Instance().WriteLog(CMIUtilString::Format(MIRSRC(IDS_PROCESS_SIGNAL_RECEIVED), "SIGINT", vSigno)); - - // CODETAG_DEBUG_SESSION_RUNNING_PROG_RECEIVED_SIGINT_PAUSE_PROGRAM - // Signal MI to shutdown or halt a running debug session - CMICmnStreamStdin::Instance().SetCtrlCHit(); -} - -// ToDo: Reevaluate if this function needs to be implemented like the UNIX equivalent -// CODETAG_IOR_SIGNALS -//++ ------------------------------------------------------------------------------------ -// Details: The SIGTSTP signal is sent to a process by its controlling terminal to -// request it to stop temporarily. It is commonly initiated by the user pressing -// Control-Z. Unlike SIGSTOP, the process can register a signal handler for or -// ignore the signal. -// *** The function does not behave ATM like the UNIX equivalent *** -// Type: Function. -// Args: vSigno - (R) Signal number. -// Return: None. -// Throws: None. -//-- -void -sigtstp_handler(int vSigno) -{ -#ifdef _WIN32 // Restore handler as it is not persistent on Windows - signal(SIGTSTP, sigtstp_handler); -#endif - CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); - lldb::SBDebugger *pDebugger = rDriverMgr.DriverGetTheDebugger(); - if (pDebugger != nullptr) - { - pDebugger->SaveInputTerminalState(); - } - - CMICmnLog::Instance().WriteLog(CMIUtilString::Format(MIRSRC(IDS_PROCESS_SIGNAL_RECEIVED), "SIGTSTP", vSigno)); - - // Signal MI to shutdown - CMICmnStreamStdin::Instance().SetCtrlCHit(); -} - -// ToDo: Reevaluate if this function needs to be implemented like the UNIX equivalent -// CODETAG_IOR_SIGNALS -//++ ------------------------------------------------------------------------------------ -// Details: The SIGCONT signal instructs the operating system to continue (restart) a -// process previously paused by the SIGSTOP or SIGTSTP signal. One important use -// of this signal is in job control in the UNIX shell. -// *** The function does not behave ATM like the UNIX equivalent *** -// Type: Function. -// Args: vSigno - (R) Signal number. -// Return: None. -// Throws: None. -//-- -void -sigcont_handler(int vSigno) -{ -#ifdef _WIN32 // Restore handler as it is not persistent on Windows - signal(SIGCONT, sigcont_handler); -#endif - CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); - lldb::SBDebugger *pDebugger = rDriverMgr.DriverGetTheDebugger(); - if (pDebugger != nullptr) - { - pDebugger->RestoreInputTerminalState(); - } - - CMICmnLog::Instance().WriteLog(CMIUtilString::Format(MIRSRC(IDS_PROCESS_SIGNAL_RECEIVED), "SIGCONT", vSigno)); - - // Signal MI to shutdown - CMICmnStreamStdin::Instance().SetCtrlCHit(); + // Send signal to driver so that it can take suitable action + rDriverMgr.DeliverSignal (vSigno); } //++ ------------------------------------------------------------------------------------ @@ -213,13 +92,6 @@ bool DriverSystemInit(void) { bool bOk = MIstatus::success; - -#if MICONFIG_COMPILE_MIDRIVER_WITH_LLDBDRIVER - Driver *pDriver = Driver::CreateSelf(); - if (pDriver == nullptr) - return MIstatus::failure; -#endif // MICONFIG_COMPILE_MIDRIVER_WITH_LLDBDRIVER - CMIDriver &rMIDriver = CMIDriver::Instance(); CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); bOk = rDriverMgr.Initialize(); @@ -248,66 +120,9 @@ DriverSystemShutdown(const bool vbAppExitOk) // *** Order is important here *** CMIDriverMgr::Instance().Shutdown(); - -#if MICONFIG_COMPILE_MIDRIVER_WITH_LLDBDRIVER - delete g_driver; - g_driver = nullptr; -#endif // MICONFIG_COMPILE_MIDRIVER_WITH_LLDBDRIVER - return bOk; } -#else -void -sigwinch_handler(int signo) -{ - struct winsize window_size; - if (isatty(STDIN_FILENO) && ::ioctl(STDIN_FILENO, TIOCGWINSZ, &window_size) == 0) - { - if ((window_size.ws_col > 0) && g_driver != NULL) - { - g_driver->ResizeWindow(window_size.ws_col); - } - } -} - -void -sigint_handler(int signo) -{ - static bool g_interrupt_sent = false; - if (g_driver) - { - if (!g_interrupt_sent) - { - g_interrupt_sent = true; - g_driver->GetDebugger().DispatchInputInterrupt(); - g_interrupt_sent = false; - return; - } - } - - exit(signo); -} - -void -sigtstp_handler(int signo) -{ - g_driver->GetDebugger().SaveInputTerminalState(); - signal(signo, SIG_DFL); - kill(getpid(), signo); - signal(signo, sigtstp_handler); -} - -void -sigcont_handler(int signo) -{ - g_driver->GetDebugger().RestoreInputTerminalState(); - signal(signo, SIG_DFL); - kill(getpid(), signo); - signal(signo, sigcont_handler); -} -#endif // #if MICONFIG_COMPILE_MIDRIVER_VERSION - //++ ------------------------------------------------------------------------------------ // Details: MI's application start point of execution. The applicaton runs in two modes. // An LLDB native driver mode where it acts no different from the LLDB driver. @@ -328,7 +143,6 @@ sigcont_handler(int signo) // -1000 = Program failed did not initailize successfully. // Throws: None. //-- -#if MICONFIG_COMPILE_MIDRIVER_VERSION int main(int argc, char const *argv[]) { @@ -349,11 +163,7 @@ main(int argc, char const *argv[]) } // CODETAG_IOR_SIGNALS - signal(SIGPIPE, SIG_IGN); - signal(SIGWINCH, sigwinch_handler); signal(SIGINT, sigint_handler); - signal(SIGTSTP, sigtstp_handler); - signal(SIGCONT, sigcont_handler); bool bExiting = false; CMIDriverMgr &rDriverMgr = CMIDriverMgr::Instance(); @@ -370,42 +180,3 @@ main(int argc, char const *argv[]) return appResult; } -#else // Operate the lldb Driver only version of the code -int -main(int argc, char const *argv[], char *envp[]) -{ - MIunused(envp); - using namespace lldb; - SBDebugger::Initialize(); - - SBHostOS::ThreadCreated("<lldb.driver.main-thread>"); - - signal(SIGPIPE, SIG_IGN); - signal(SIGWINCH, sigwinch_handler); - signal(SIGINT, sigint_handler); - signal(SIGTSTP, sigtstp_handler); - signal(SIGCONT, sigcont_handler); - - // Create a scope for driver so that the driver object will destroy itself - // before SBDebugger::Terminate() is called. - { - Driver driver; - - bool exiting = false; - SBError error(driver.ParseArgs(argc, argv, stdout, exiting)); - if (error.Fail()) - { - const char *error_cstr = error.GetCString(); - if (error_cstr) - ::fprintf(stderr, "error: %s\n", error_cstr); - } - else if (!exiting) - { - driver.MainLoop(); - } - } - - SBDebugger::Terminate(); - return 0; -} -#endif // MICONFIG_COMPILE_MIDRIVER_VERSION |