1*0b57cec5SDimitry Andric //===-- SBUnixSignals.cpp -------------------------------------------------===//
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 #include "SBReproducerPrivate.h"
10*0b57cec5SDimitry Andric #include "lldb/Target/Platform.h"
11*0b57cec5SDimitry Andric #include "lldb/Target/Process.h"
12*0b57cec5SDimitry Andric #include "lldb/Target/UnixSignals.h"
13*0b57cec5SDimitry Andric #include "lldb/lldb-defines.h"
14*0b57cec5SDimitry Andric 
15*0b57cec5SDimitry Andric #include "lldb/API/SBUnixSignals.h"
16*0b57cec5SDimitry Andric 
17*0b57cec5SDimitry Andric using namespace lldb;
18*0b57cec5SDimitry Andric using namespace lldb_private;
19*0b57cec5SDimitry Andric 
SBUnixSignals()20*0b57cec5SDimitry Andric SBUnixSignals::SBUnixSignals() {
21*0b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBUnixSignals);
22*0b57cec5SDimitry Andric }
23*0b57cec5SDimitry Andric 
SBUnixSignals(const SBUnixSignals & rhs)24*0b57cec5SDimitry Andric SBUnixSignals::SBUnixSignals(const SBUnixSignals &rhs)
25*0b57cec5SDimitry Andric     : m_opaque_wp(rhs.m_opaque_wp) {
26*0b57cec5SDimitry Andric   LLDB_RECORD_CONSTRUCTOR(SBUnixSignals, (const lldb::SBUnixSignals &), rhs);
27*0b57cec5SDimitry Andric }
28*0b57cec5SDimitry Andric 
SBUnixSignals(ProcessSP & process_sp)29*0b57cec5SDimitry Andric SBUnixSignals::SBUnixSignals(ProcessSP &process_sp)
30*0b57cec5SDimitry Andric     : m_opaque_wp(process_sp ? process_sp->GetUnixSignals() : nullptr) {}
31*0b57cec5SDimitry Andric 
SBUnixSignals(PlatformSP & platform_sp)32*0b57cec5SDimitry Andric SBUnixSignals::SBUnixSignals(PlatformSP &platform_sp)
33*0b57cec5SDimitry Andric     : m_opaque_wp(platform_sp ? platform_sp->GetUnixSignals() : nullptr) {}
34*0b57cec5SDimitry Andric 
operator =(const SBUnixSignals & rhs)35*0b57cec5SDimitry Andric const SBUnixSignals &SBUnixSignals::operator=(const SBUnixSignals &rhs) {
36*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(const lldb::SBUnixSignals &,
37*0b57cec5SDimitry Andric                      SBUnixSignals, operator=,(const lldb::SBUnixSignals &),
38*0b57cec5SDimitry Andric                      rhs);
39*0b57cec5SDimitry Andric 
40*0b57cec5SDimitry Andric   if (this != &rhs)
41*0b57cec5SDimitry Andric     m_opaque_wp = rhs.m_opaque_wp;
42*0b57cec5SDimitry Andric   return LLDB_RECORD_RESULT(*this);
43*0b57cec5SDimitry Andric }
44*0b57cec5SDimitry Andric 
45*0b57cec5SDimitry Andric SBUnixSignals::~SBUnixSignals() = default;
46*0b57cec5SDimitry Andric 
GetSP() const47*0b57cec5SDimitry Andric UnixSignalsSP SBUnixSignals::GetSP() const { return m_opaque_wp.lock(); }
48*0b57cec5SDimitry Andric 
SetSP(const UnixSignalsSP & signals_sp)49*0b57cec5SDimitry Andric void SBUnixSignals::SetSP(const UnixSignalsSP &signals_sp) {
50*0b57cec5SDimitry Andric   m_opaque_wp = signals_sp;
51*0b57cec5SDimitry Andric }
52*0b57cec5SDimitry Andric 
Clear()53*0b57cec5SDimitry Andric void SBUnixSignals::Clear() {
54*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_NO_ARGS(void, SBUnixSignals, Clear);
55*0b57cec5SDimitry Andric 
56*0b57cec5SDimitry Andric   m_opaque_wp.reset();
57*0b57cec5SDimitry Andric }
58*0b57cec5SDimitry Andric 
IsValid() const59*0b57cec5SDimitry Andric bool SBUnixSignals::IsValid() const {
60*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBUnixSignals, IsValid);
61*0b57cec5SDimitry Andric   return this->operator bool();
62*0b57cec5SDimitry Andric }
operator bool() const63*0b57cec5SDimitry Andric SBUnixSignals::operator bool() const {
64*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBUnixSignals, operator bool);
65*0b57cec5SDimitry Andric 
66*0b57cec5SDimitry Andric   return static_cast<bool>(GetSP());
67*0b57cec5SDimitry Andric }
68*0b57cec5SDimitry Andric 
GetSignalAsCString(int32_t signo) const69*0b57cec5SDimitry Andric const char *SBUnixSignals::GetSignalAsCString(int32_t signo) const {
70*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(const char *, SBUnixSignals, GetSignalAsCString,
71*0b57cec5SDimitry Andric                            (int32_t), signo);
72*0b57cec5SDimitry Andric 
73*0b57cec5SDimitry Andric   if (auto signals_sp = GetSP())
74*0b57cec5SDimitry Andric     return signals_sp->GetSignalAsCString(signo);
75*0b57cec5SDimitry Andric 
76*0b57cec5SDimitry Andric   return nullptr;
77*0b57cec5SDimitry Andric }
78*0b57cec5SDimitry Andric 
GetSignalNumberFromName(const char * name) const79*0b57cec5SDimitry Andric int32_t SBUnixSignals::GetSignalNumberFromName(const char *name) const {
80*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(int32_t, SBUnixSignals, GetSignalNumberFromName,
81*0b57cec5SDimitry Andric                            (const char *), name);
82*0b57cec5SDimitry Andric 
83*0b57cec5SDimitry Andric   if (auto signals_sp = GetSP())
84*0b57cec5SDimitry Andric     return signals_sp->GetSignalNumberFromName(name);
85*0b57cec5SDimitry Andric 
86*0b57cec5SDimitry Andric   return LLDB_INVALID_SIGNAL_NUMBER;
87*0b57cec5SDimitry Andric }
88*0b57cec5SDimitry Andric 
GetShouldSuppress(int32_t signo) const89*0b57cec5SDimitry Andric bool SBUnixSignals::GetShouldSuppress(int32_t signo) const {
90*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(bool, SBUnixSignals, GetShouldSuppress, (int32_t),
91*0b57cec5SDimitry Andric                            signo);
92*0b57cec5SDimitry Andric 
93*0b57cec5SDimitry Andric   if (auto signals_sp = GetSP())
94*0b57cec5SDimitry Andric     return signals_sp->GetShouldSuppress(signo);
95*0b57cec5SDimitry Andric 
96*0b57cec5SDimitry Andric   return false;
97*0b57cec5SDimitry Andric }
98*0b57cec5SDimitry Andric 
SetShouldSuppress(int32_t signo,bool value)99*0b57cec5SDimitry Andric bool SBUnixSignals::SetShouldSuppress(int32_t signo, bool value) {
100*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBUnixSignals, SetShouldSuppress, (int32_t, bool),
101*0b57cec5SDimitry Andric                      signo, value);
102*0b57cec5SDimitry Andric 
103*0b57cec5SDimitry Andric   auto signals_sp = GetSP();
104*0b57cec5SDimitry Andric 
105*0b57cec5SDimitry Andric   if (signals_sp)
106*0b57cec5SDimitry Andric     return signals_sp->SetShouldSuppress(signo, value);
107*0b57cec5SDimitry Andric 
108*0b57cec5SDimitry Andric   return false;
109*0b57cec5SDimitry Andric }
110*0b57cec5SDimitry Andric 
GetShouldStop(int32_t signo) const111*0b57cec5SDimitry Andric bool SBUnixSignals::GetShouldStop(int32_t signo) const {
112*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(bool, SBUnixSignals, GetShouldStop, (int32_t),
113*0b57cec5SDimitry Andric                            signo);
114*0b57cec5SDimitry Andric 
115*0b57cec5SDimitry Andric   if (auto signals_sp = GetSP())
116*0b57cec5SDimitry Andric     return signals_sp->GetShouldStop(signo);
117*0b57cec5SDimitry Andric 
118*0b57cec5SDimitry Andric   return false;
119*0b57cec5SDimitry Andric }
120*0b57cec5SDimitry Andric 
SetShouldStop(int32_t signo,bool value)121*0b57cec5SDimitry Andric bool SBUnixSignals::SetShouldStop(int32_t signo, bool value) {
122*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBUnixSignals, SetShouldStop, (int32_t, bool), signo,
123*0b57cec5SDimitry Andric                      value);
124*0b57cec5SDimitry Andric 
125*0b57cec5SDimitry Andric   auto signals_sp = GetSP();
126*0b57cec5SDimitry Andric 
127*0b57cec5SDimitry Andric   if (signals_sp)
128*0b57cec5SDimitry Andric     return signals_sp->SetShouldStop(signo, value);
129*0b57cec5SDimitry Andric 
130*0b57cec5SDimitry Andric   return false;
131*0b57cec5SDimitry Andric }
132*0b57cec5SDimitry Andric 
GetShouldNotify(int32_t signo) const133*0b57cec5SDimitry Andric bool SBUnixSignals::GetShouldNotify(int32_t signo) const {
134*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(bool, SBUnixSignals, GetShouldNotify, (int32_t),
135*0b57cec5SDimitry Andric                            signo);
136*0b57cec5SDimitry Andric 
137*0b57cec5SDimitry Andric   if (auto signals_sp = GetSP())
138*0b57cec5SDimitry Andric     return signals_sp->GetShouldNotify(signo);
139*0b57cec5SDimitry Andric 
140*0b57cec5SDimitry Andric   return false;
141*0b57cec5SDimitry Andric }
142*0b57cec5SDimitry Andric 
SetShouldNotify(int32_t signo,bool value)143*0b57cec5SDimitry Andric bool SBUnixSignals::SetShouldNotify(int32_t signo, bool value) {
144*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD(bool, SBUnixSignals, SetShouldNotify, (int32_t, bool),
145*0b57cec5SDimitry Andric                      signo, value);
146*0b57cec5SDimitry Andric 
147*0b57cec5SDimitry Andric   auto signals_sp = GetSP();
148*0b57cec5SDimitry Andric 
149*0b57cec5SDimitry Andric   if (signals_sp)
150*0b57cec5SDimitry Andric     return signals_sp->SetShouldNotify(signo, value);
151*0b57cec5SDimitry Andric 
152*0b57cec5SDimitry Andric   return false;
153*0b57cec5SDimitry Andric }
154*0b57cec5SDimitry Andric 
GetNumSignals() const155*0b57cec5SDimitry Andric int32_t SBUnixSignals::GetNumSignals() const {
156*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST_NO_ARGS(int32_t, SBUnixSignals, GetNumSignals);
157*0b57cec5SDimitry Andric 
158*0b57cec5SDimitry Andric   if (auto signals_sp = GetSP())
159*0b57cec5SDimitry Andric     return signals_sp->GetNumSignals();
160*0b57cec5SDimitry Andric 
161*0b57cec5SDimitry Andric   return -1;
162*0b57cec5SDimitry Andric }
163*0b57cec5SDimitry Andric 
GetSignalAtIndex(int32_t index) const164*0b57cec5SDimitry Andric int32_t SBUnixSignals::GetSignalAtIndex(int32_t index) const {
165*0b57cec5SDimitry Andric   LLDB_RECORD_METHOD_CONST(int32_t, SBUnixSignals, GetSignalAtIndex, (int32_t),
166*0b57cec5SDimitry Andric                            index);
167*0b57cec5SDimitry Andric 
168*0b57cec5SDimitry Andric   if (auto signals_sp = GetSP())
169*0b57cec5SDimitry Andric     return signals_sp->GetSignalAtIndex(index);
170*0b57cec5SDimitry Andric 
171*0b57cec5SDimitry Andric   return LLDB_INVALID_SIGNAL_NUMBER;
172*0b57cec5SDimitry Andric }
173*0b57cec5SDimitry Andric 
174*0b57cec5SDimitry Andric namespace lldb_private {
175*0b57cec5SDimitry Andric namespace repro {
176*0b57cec5SDimitry Andric 
177*0b57cec5SDimitry Andric template <>
RegisterMethods(Registry & R)178*0b57cec5SDimitry Andric void RegisterMethods<SBUnixSignals>(Registry &R) {
179*0b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBUnixSignals, ());
180*0b57cec5SDimitry Andric   LLDB_REGISTER_CONSTRUCTOR(SBUnixSignals, (const lldb::SBUnixSignals &));
181*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(
182*0b57cec5SDimitry Andric       const lldb::SBUnixSignals &,
183*0b57cec5SDimitry Andric       SBUnixSignals, operator=,(const lldb::SBUnixSignals &));
184*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(void, SBUnixSignals, Clear, ());
185*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBUnixSignals, IsValid, ());
186*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBUnixSignals, operator bool, ());
187*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(const char *, SBUnixSignals, GetSignalAsCString,
188*0b57cec5SDimitry Andric                              (int32_t));
189*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(int32_t, SBUnixSignals, GetSignalNumberFromName,
190*0b57cec5SDimitry Andric                              (const char *));
191*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBUnixSignals, GetShouldSuppress,
192*0b57cec5SDimitry Andric                              (int32_t));
193*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBUnixSignals, SetShouldSuppress,
194*0b57cec5SDimitry Andric                        (int32_t, bool));
195*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBUnixSignals, GetShouldStop, (int32_t));
196*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBUnixSignals, SetShouldStop, (int32_t, bool));
197*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(bool, SBUnixSignals, GetShouldNotify, (int32_t));
198*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD(bool, SBUnixSignals, SetShouldNotify, (int32_t, bool));
199*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(int32_t, SBUnixSignals, GetNumSignals, ());
200*0b57cec5SDimitry Andric   LLDB_REGISTER_METHOD_CONST(int32_t, SBUnixSignals, GetSignalAtIndex,
201*0b57cec5SDimitry Andric                              (int32_t));
202*0b57cec5SDimitry Andric }
203*0b57cec5SDimitry Andric 
204*0b57cec5SDimitry Andric }
205*0b57cec5SDimitry Andric }
206*0b57cec5SDimitry Andric