1//===-- SBProcessInfo.cpp -------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "lldb/API/SBProcessInfo.h"
10#include "Utils.h"
11#include "lldb/API/SBFileSpec.h"
12#include "lldb/Utility/Instrumentation.h"
13#include "lldb/Utility/ProcessInfo.h"
14
15using namespace lldb;
16using namespace lldb_private;
17
18SBProcessInfo::SBProcessInfo() { LLDB_INSTRUMENT_VA(this); }
19
20SBProcessInfo::SBProcessInfo(const SBProcessInfo &rhs) {
21  LLDB_INSTRUMENT_VA(this, rhs);
22
23  m_opaque_up = clone(rhs.m_opaque_up);
24}
25
26SBProcessInfo::~SBProcessInfo() = default;
27
28SBProcessInfo &SBProcessInfo::operator=(const SBProcessInfo &rhs) {
29  LLDB_INSTRUMENT_VA(this, rhs);
30
31  if (this != &rhs)
32    m_opaque_up = clone(rhs.m_opaque_up);
33  return *this;
34}
35
36ProcessInstanceInfo &SBProcessInfo::ref() {
37  if (m_opaque_up == nullptr) {
38    m_opaque_up = std::make_unique<ProcessInstanceInfo>();
39  }
40  return *m_opaque_up;
41}
42
43void SBProcessInfo::SetProcessInfo(const ProcessInstanceInfo &proc_info_ref) {
44  ref() = proc_info_ref;
45}
46
47bool SBProcessInfo::IsValid() const {
48  LLDB_INSTRUMENT_VA(this);
49  return this->operator bool();
50}
51SBProcessInfo::operator bool() const {
52  LLDB_INSTRUMENT_VA(this);
53
54  return m_opaque_up != nullptr;
55}
56
57const char *SBProcessInfo::GetName() {
58  LLDB_INSTRUMENT_VA(this);
59
60  if (!m_opaque_up)
61    return nullptr;
62
63  return ConstString(m_opaque_up->GetName()).GetCString();
64}
65
66SBFileSpec SBProcessInfo::GetExecutableFile() {
67  LLDB_INSTRUMENT_VA(this);
68
69  SBFileSpec file_spec;
70  if (m_opaque_up) {
71    file_spec.SetFileSpec(m_opaque_up->GetExecutableFile());
72  }
73  return file_spec;
74}
75
76lldb::pid_t SBProcessInfo::GetProcessID() {
77  LLDB_INSTRUMENT_VA(this);
78
79  lldb::pid_t proc_id = LLDB_INVALID_PROCESS_ID;
80  if (m_opaque_up) {
81    proc_id = m_opaque_up->GetProcessID();
82  }
83  return proc_id;
84}
85
86uint32_t SBProcessInfo::GetUserID() {
87  LLDB_INSTRUMENT_VA(this);
88
89  uint32_t user_id = UINT32_MAX;
90  if (m_opaque_up) {
91    user_id = m_opaque_up->GetUserID();
92  }
93  return user_id;
94}
95
96uint32_t SBProcessInfo::GetGroupID() {
97  LLDB_INSTRUMENT_VA(this);
98
99  uint32_t group_id = UINT32_MAX;
100  if (m_opaque_up) {
101    group_id = m_opaque_up->GetGroupID();
102  }
103  return group_id;
104}
105
106bool SBProcessInfo::UserIDIsValid() {
107  LLDB_INSTRUMENT_VA(this);
108
109  bool is_valid = false;
110  if (m_opaque_up) {
111    is_valid = m_opaque_up->UserIDIsValid();
112  }
113  return is_valid;
114}
115
116bool SBProcessInfo::GroupIDIsValid() {
117  LLDB_INSTRUMENT_VA(this);
118
119  bool is_valid = false;
120  if (m_opaque_up) {
121    is_valid = m_opaque_up->GroupIDIsValid();
122  }
123  return is_valid;
124}
125
126uint32_t SBProcessInfo::GetEffectiveUserID() {
127  LLDB_INSTRUMENT_VA(this);
128
129  uint32_t user_id = UINT32_MAX;
130  if (m_opaque_up) {
131    user_id = m_opaque_up->GetEffectiveUserID();
132  }
133  return user_id;
134}
135
136uint32_t SBProcessInfo::GetEffectiveGroupID() {
137  LLDB_INSTRUMENT_VA(this);
138
139  uint32_t group_id = UINT32_MAX;
140  if (m_opaque_up) {
141    group_id = m_opaque_up->GetEffectiveGroupID();
142  }
143  return group_id;
144}
145
146bool SBProcessInfo::EffectiveUserIDIsValid() {
147  LLDB_INSTRUMENT_VA(this);
148
149  bool is_valid = false;
150  if (m_opaque_up) {
151    is_valid = m_opaque_up->EffectiveUserIDIsValid();
152  }
153  return is_valid;
154}
155
156bool SBProcessInfo::EffectiveGroupIDIsValid() {
157  LLDB_INSTRUMENT_VA(this);
158
159  bool is_valid = false;
160  if (m_opaque_up) {
161    is_valid = m_opaque_up->EffectiveGroupIDIsValid();
162  }
163  return is_valid;
164}
165
166lldb::pid_t SBProcessInfo::GetParentProcessID() {
167  LLDB_INSTRUMENT_VA(this);
168
169  lldb::pid_t proc_id = LLDB_INVALID_PROCESS_ID;
170  if (m_opaque_up) {
171    proc_id = m_opaque_up->GetParentProcessID();
172  }
173  return proc_id;
174}
175
176const char *SBProcessInfo::GetTriple() {
177  LLDB_INSTRUMENT_VA(this);
178
179  if (!m_opaque_up)
180    return nullptr;
181
182  const auto &arch = m_opaque_up->GetArchitecture();
183  if (!arch.IsValid())
184    return nullptr;
185
186  return ConstString(arch.GetTriple().getTriple().c_str()).GetCString();
187}
188