diff options
Diffstat (limited to 'contrib/llvm/tools/lldb/source/Target/UnixSignals.cpp')
-rw-r--r-- | contrib/llvm/tools/lldb/source/Target/UnixSignals.cpp | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/contrib/llvm/tools/lldb/source/Target/UnixSignals.cpp b/contrib/llvm/tools/lldb/source/Target/UnixSignals.cpp new file mode 100644 index 0000000..7fe81f8 --- /dev/null +++ b/contrib/llvm/tools/lldb/source/Target/UnixSignals.cpp @@ -0,0 +1,293 @@ +//===-- UnixSignals.cpp -----------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Target/UnixSignals.h" + +// C Includes +// C++ Includes +// Other libraries and framework includes +// Project includes +#include "lldb/Interpreter/Args.h" + +using namespace lldb_private; + +UnixSignals::Signal::Signal +( + const char *name, + const char *short_name, + bool default_suppress, + bool default_stop, + bool default_notify, + const char *description +) : + m_name (name), + m_short_name (short_name), + m_description (), + m_suppress (default_suppress), + m_stop (default_stop), + m_notify (default_notify) +{ + if (description) + m_description.assign (description); +} + +//---------------------------------------------------------------------- +// UnixSignals constructor +//---------------------------------------------------------------------- +UnixSignals::UnixSignals () +{ + Reset (); +} + +//---------------------------------------------------------------------- +// Destructor +//---------------------------------------------------------------------- +UnixSignals::~UnixSignals () +{ +} + +void +UnixSignals::Reset () +{ + // This builds one standard set of Unix Signals. If yours aren't quite in this + // order, you can either subclass this class, and use Add & Remove to change them + // or you can subclass and build them afresh in your constructor; + m_signals.clear(); + // SIGNO NAME SHORT NAME SUPPRESS STOP NOTIFY DESCRIPTION + // ====== ============ ========== ======== ====== ====== =================================================== + AddSignal (1, "SIGHUP", "HUP", false, true , true , "hangup"); + AddSignal (2, "SIGINT", "INT", true , true , true , "interrupt"); + AddSignal (3, "SIGQUIT", "QUIT", false, true , true , "quit"); + AddSignal (4, "SIGILL", "ILL", false, true , true , "illegal instruction"); + AddSignal (5, "SIGTRAP", "TRAP", true , true , true , "trace trap (not reset when caught)"); + AddSignal (6, "SIGABRT", "ABRT", false, true , true , "abort()"); + AddSignal (7, "SIGEMT", "EMT", false, true , true , "pollable event"); + AddSignal (8, "SIGFPE", "FPE", false, true , true , "floating point exception"); + AddSignal (9, "SIGKILL", "KILL", false, true , true , "kill"); + AddSignal (10, "SIGBUS", "BUS", false, true , true , "bus error"); + AddSignal (11, "SIGSEGV", "SEGV", false, true , true , "segmentation violation"); + AddSignal (12, "SIGSYS", "SYS", false, true , true , "bad argument to system call"); + AddSignal (13, "SIGPIPE", "PIPE", false, true , true , "write on a pipe with no one to read it"); + AddSignal (14, "SIGALRM", "ALRM", false, false, true , "alarm clock"); + AddSignal (15, "SIGTERM", "TERM", false, true , true , "software termination signal from kill"); + AddSignal (16, "SIGURG", "URG", false, false, false, "urgent condition on IO channel"); + AddSignal (17, "SIGSTOP", "STOP", true , true , true , "sendable stop signal not from tty"); + AddSignal (18, "SIGTSTP", "TSTP", false, true , true , "stop signal from tty"); + AddSignal (19, "SIGCONT", "CONT", false, true , true , "continue a stopped process"); + AddSignal (20, "SIGCHLD", "CHLD", false, false, true , "to parent on child stop or exit"); + AddSignal (21, "SIGTTIN", "TTIN", false, true , true , "to readers process group upon background tty read"); + AddSignal (22, "SIGTTOU", "TTOU", false, true , true , "to readers process group upon background tty write"); + AddSignal (23, "SIGIO", "IO", false, false, false, "input/output possible signal"); + AddSignal (24, "SIGXCPU", "XCPU", false, true , true , "exceeded CPU time limit"); + AddSignal (25, "SIGXFSZ", "XFSZ", false, true , true , "exceeded file size limit"); + AddSignal (26, "SIGVTALRM", "VTALRM", false, false, false, "virtual time alarm"); + AddSignal (27, "SIGPROF", "PROF", false, false, false, "profiling time alarm"); + AddSignal (28, "SIGWINCH", "WINCH", false, false, false, "window size changes"); + AddSignal (29, "SIGINFO", "INFO", false, true , true , "information request"); + AddSignal (30, "SIGUSR1", "USR1", false, true , true , "user defined signal 1"); + AddSignal (31, "SIGUSR2", "USR2", false, true , true , "user defined signal 2"); +} + +void +UnixSignals::AddSignal +( + int signo, + const char *name, + const char *short_name, + bool default_suppress, + bool default_stop, + bool default_notify, + const char *description +) +{ + Signal new_signal (name, short_name, default_suppress, default_stop, default_notify, description); + m_signals.insert (std::make_pair(signo, new_signal)); +} + +void +UnixSignals::RemoveSignal (int signo) +{ + collection::iterator pos = m_signals.find (signo); + if (pos != m_signals.end()) + m_signals.erase (pos); +} + +const char * +UnixSignals::GetSignalAsCString (int signo) const +{ + collection::const_iterator pos = m_signals.find (signo); + if (pos == m_signals.end()) + return NULL; + else + return pos->second.m_name.GetCString (); +} + + +bool +UnixSignals::SignalIsValid (int32_t signo) const +{ + return m_signals.find (signo) != m_signals.end(); +} + + +int32_t +UnixSignals::GetSignalNumberFromName (const char *name) const +{ + ConstString const_name (name); + + collection::const_iterator pos, end = m_signals.end (); + for (pos = m_signals.begin (); pos != end; pos++) + { + if ((const_name == pos->second.m_name) || (const_name == pos->second.m_short_name)) + return pos->first; + } + + const int32_t signo = Args::StringToSInt32(name, LLDB_INVALID_SIGNAL_NUMBER, 0); + if (signo != LLDB_INVALID_SIGNAL_NUMBER) + return signo; + return LLDB_INVALID_SIGNAL_NUMBER; +} + +int32_t +UnixSignals::GetFirstSignalNumber () const +{ + if (m_signals.empty()) + return LLDB_INVALID_SIGNAL_NUMBER; + + return (*m_signals.begin ()).first; +} + +int32_t +UnixSignals::GetNextSignalNumber (int32_t current_signal) const +{ + collection::const_iterator pos = m_signals.find (current_signal); + collection::const_iterator end = m_signals.end(); + if (pos == end) + return LLDB_INVALID_SIGNAL_NUMBER; + else + { + pos++; + if (pos == end) + return LLDB_INVALID_SIGNAL_NUMBER; + else + return pos->first; + } +} + +const char * +UnixSignals::GetSignalInfo +( + int32_t signo, + bool &should_suppress, + bool &should_stop, + bool &should_notify +) const +{ + collection::const_iterator pos = m_signals.find (signo); + if (pos == m_signals.end()) + return NULL; + else + { + const Signal &signal = pos->second; + should_suppress = signal.m_suppress; + should_stop = signal.m_stop; + should_notify = signal.m_notify; + return signal.m_name.AsCString(""); + } +} + +bool +UnixSignals::GetShouldSuppress (int signo) const +{ + collection::const_iterator pos = m_signals.find (signo); + if (pos != m_signals.end()) + return pos->second.m_suppress; + return false; +} + +bool +UnixSignals::SetShouldSuppress (int signo, bool value) +{ + collection::iterator pos = m_signals.find (signo); + if (pos != m_signals.end()) + { + pos->second.m_suppress = value; + return true; + } + return false; +} + +bool +UnixSignals::SetShouldSuppress (const char *signal_name, bool value) +{ + const int32_t signo = GetSignalNumberFromName (signal_name); + if (signo != LLDB_INVALID_SIGNAL_NUMBER) + return SetShouldSuppress (signo, value); + return false; +} + +bool +UnixSignals::GetShouldStop (int signo) const +{ + collection::const_iterator pos = m_signals.find (signo); + if (pos != m_signals.end()) + return pos->second.m_stop; + return false; +} + +bool +UnixSignals::SetShouldStop (int signo, bool value) +{ + collection::iterator pos = m_signals.find (signo); + if (pos != m_signals.end()) + { + pos->second.m_stop = value; + return true; + } + return false; +} + +bool +UnixSignals::SetShouldStop (const char *signal_name, bool value) +{ + const int32_t signo = GetSignalNumberFromName (signal_name); + if (signo != LLDB_INVALID_SIGNAL_NUMBER) + return SetShouldStop (signo, value); + return false; +} + +bool +UnixSignals::GetShouldNotify (int signo) const +{ + collection::const_iterator pos = m_signals.find (signo); + if (pos != m_signals.end()) + return pos->second.m_notify; + return false; +} + +bool +UnixSignals::SetShouldNotify (int signo, bool value) +{ + collection::iterator pos = m_signals.find (signo); + if (pos != m_signals.end()) + { + pos->second.m_notify = value; + return true; + } + return false; +} + +bool +UnixSignals::SetShouldNotify (const char *signal_name, bool value) +{ + const int32_t signo = GetSignalNumberFromName (signal_name); + if (signo != LLDB_INVALID_SIGNAL_NUMBER) + return SetShouldNotify (signo, value); + return false; +} |