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