15ffd83dbSDimitry Andric //===-- SBProcessInfo.cpp -------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "lldb/API/SBProcessInfo.h"
100b57cec5SDimitry Andric #include "Utils.h"
110b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h"
1204eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h"
130b57cec5SDimitry Andric #include "lldb/Utility/ProcessInfo.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric using namespace lldb;
160b57cec5SDimitry Andric using namespace lldb_private;
170b57cec5SDimitry Andric 
SBProcessInfo()1804eeddc0SDimitry Andric SBProcessInfo::SBProcessInfo() { LLDB_INSTRUMENT_VA(this); }
190b57cec5SDimitry Andric 
SBProcessInfo(const SBProcessInfo & rhs)2004eeddc0SDimitry Andric SBProcessInfo::SBProcessInfo(const SBProcessInfo &rhs) {
2104eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric   m_opaque_up = clone(rhs.m_opaque_up);
240b57cec5SDimitry Andric }
250b57cec5SDimitry Andric 
265ffd83dbSDimitry Andric SBProcessInfo::~SBProcessInfo() = default;
270b57cec5SDimitry Andric 
operator =(const SBProcessInfo & rhs)280b57cec5SDimitry Andric SBProcessInfo &SBProcessInfo::operator=(const SBProcessInfo &rhs) {
2904eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this, rhs);
300b57cec5SDimitry Andric 
310b57cec5SDimitry Andric   if (this != &rhs)
320b57cec5SDimitry Andric     m_opaque_up = clone(rhs.m_opaque_up);
3304eeddc0SDimitry Andric   return *this;
340b57cec5SDimitry Andric }
350b57cec5SDimitry Andric 
ref()360b57cec5SDimitry Andric ProcessInstanceInfo &SBProcessInfo::ref() {
370b57cec5SDimitry Andric   if (m_opaque_up == nullptr) {
385ffd83dbSDimitry Andric     m_opaque_up = std::make_unique<ProcessInstanceInfo>();
390b57cec5SDimitry Andric   }
400b57cec5SDimitry Andric   return *m_opaque_up;
410b57cec5SDimitry Andric }
420b57cec5SDimitry Andric 
SetProcessInfo(const ProcessInstanceInfo & proc_info_ref)430b57cec5SDimitry Andric void SBProcessInfo::SetProcessInfo(const ProcessInstanceInfo &proc_info_ref) {
440b57cec5SDimitry Andric   ref() = proc_info_ref;
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric 
IsValid() const470b57cec5SDimitry Andric bool SBProcessInfo::IsValid() const {
4804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
490b57cec5SDimitry Andric   return this->operator bool();
500b57cec5SDimitry Andric }
operator bool() const510b57cec5SDimitry Andric SBProcessInfo::operator bool() const {
5204eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   return m_opaque_up != nullptr;
550b57cec5SDimitry Andric }
560b57cec5SDimitry Andric 
GetName()570b57cec5SDimitry Andric const char *SBProcessInfo::GetName() {
5804eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
590b57cec5SDimitry Andric 
60*fe013be4SDimitry Andric   if (!m_opaque_up)
61*fe013be4SDimitry Andric     return nullptr;
62*fe013be4SDimitry Andric 
63*fe013be4SDimitry Andric   return ConstString(m_opaque_up->GetName()).GetCString();
640b57cec5SDimitry Andric }
650b57cec5SDimitry Andric 
GetExecutableFile()660b57cec5SDimitry Andric SBFileSpec SBProcessInfo::GetExecutableFile() {
6704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric   SBFileSpec file_spec;
700b57cec5SDimitry Andric   if (m_opaque_up) {
710b57cec5SDimitry Andric     file_spec.SetFileSpec(m_opaque_up->GetExecutableFile());
720b57cec5SDimitry Andric   }
7304eeddc0SDimitry Andric   return file_spec;
740b57cec5SDimitry Andric }
750b57cec5SDimitry Andric 
GetProcessID()760b57cec5SDimitry Andric lldb::pid_t SBProcessInfo::GetProcessID() {
7704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric   lldb::pid_t proc_id = LLDB_INVALID_PROCESS_ID;
800b57cec5SDimitry Andric   if (m_opaque_up) {
810b57cec5SDimitry Andric     proc_id = m_opaque_up->GetProcessID();
820b57cec5SDimitry Andric   }
830b57cec5SDimitry Andric   return proc_id;
840b57cec5SDimitry Andric }
850b57cec5SDimitry Andric 
GetUserID()860b57cec5SDimitry Andric uint32_t SBProcessInfo::GetUserID() {
8704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
880b57cec5SDimitry Andric 
890b57cec5SDimitry Andric   uint32_t user_id = UINT32_MAX;
900b57cec5SDimitry Andric   if (m_opaque_up) {
910b57cec5SDimitry Andric     user_id = m_opaque_up->GetUserID();
920b57cec5SDimitry Andric   }
930b57cec5SDimitry Andric   return user_id;
940b57cec5SDimitry Andric }
950b57cec5SDimitry Andric 
GetGroupID()960b57cec5SDimitry Andric uint32_t SBProcessInfo::GetGroupID() {
9704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
980b57cec5SDimitry Andric 
990b57cec5SDimitry Andric   uint32_t group_id = UINT32_MAX;
1000b57cec5SDimitry Andric   if (m_opaque_up) {
1010b57cec5SDimitry Andric     group_id = m_opaque_up->GetGroupID();
1020b57cec5SDimitry Andric   }
1030b57cec5SDimitry Andric   return group_id;
1040b57cec5SDimitry Andric }
1050b57cec5SDimitry Andric 
UserIDIsValid()1060b57cec5SDimitry Andric bool SBProcessInfo::UserIDIsValid() {
10704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1080b57cec5SDimitry Andric 
1090b57cec5SDimitry Andric   bool is_valid = false;
1100b57cec5SDimitry Andric   if (m_opaque_up) {
1110b57cec5SDimitry Andric     is_valid = m_opaque_up->UserIDIsValid();
1120b57cec5SDimitry Andric   }
1130b57cec5SDimitry Andric   return is_valid;
1140b57cec5SDimitry Andric }
1150b57cec5SDimitry Andric 
GroupIDIsValid()1160b57cec5SDimitry Andric bool SBProcessInfo::GroupIDIsValid() {
11704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric   bool is_valid = false;
1200b57cec5SDimitry Andric   if (m_opaque_up) {
1210b57cec5SDimitry Andric     is_valid = m_opaque_up->GroupIDIsValid();
1220b57cec5SDimitry Andric   }
1230b57cec5SDimitry Andric   return is_valid;
1240b57cec5SDimitry Andric }
1250b57cec5SDimitry Andric 
GetEffectiveUserID()1260b57cec5SDimitry Andric uint32_t SBProcessInfo::GetEffectiveUserID() {
12704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1280b57cec5SDimitry Andric 
1290b57cec5SDimitry Andric   uint32_t user_id = UINT32_MAX;
1300b57cec5SDimitry Andric   if (m_opaque_up) {
1310b57cec5SDimitry Andric     user_id = m_opaque_up->GetEffectiveUserID();
1320b57cec5SDimitry Andric   }
1330b57cec5SDimitry Andric   return user_id;
1340b57cec5SDimitry Andric }
1350b57cec5SDimitry Andric 
GetEffectiveGroupID()1360b57cec5SDimitry Andric uint32_t SBProcessInfo::GetEffectiveGroupID() {
13704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1380b57cec5SDimitry Andric 
1390b57cec5SDimitry Andric   uint32_t group_id = UINT32_MAX;
1400b57cec5SDimitry Andric   if (m_opaque_up) {
1410b57cec5SDimitry Andric     group_id = m_opaque_up->GetEffectiveGroupID();
1420b57cec5SDimitry Andric   }
1430b57cec5SDimitry Andric   return group_id;
1440b57cec5SDimitry Andric }
1450b57cec5SDimitry Andric 
EffectiveUserIDIsValid()1460b57cec5SDimitry Andric bool SBProcessInfo::EffectiveUserIDIsValid() {
14704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1480b57cec5SDimitry Andric 
1490b57cec5SDimitry Andric   bool is_valid = false;
1500b57cec5SDimitry Andric   if (m_opaque_up) {
1510b57cec5SDimitry Andric     is_valid = m_opaque_up->EffectiveUserIDIsValid();
1520b57cec5SDimitry Andric   }
1530b57cec5SDimitry Andric   return is_valid;
1540b57cec5SDimitry Andric }
1550b57cec5SDimitry Andric 
EffectiveGroupIDIsValid()1560b57cec5SDimitry Andric bool SBProcessInfo::EffectiveGroupIDIsValid() {
15704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1580b57cec5SDimitry Andric 
1590b57cec5SDimitry Andric   bool is_valid = false;
1600b57cec5SDimitry Andric   if (m_opaque_up) {
1610b57cec5SDimitry Andric     is_valid = m_opaque_up->EffectiveGroupIDIsValid();
1620b57cec5SDimitry Andric   }
1630b57cec5SDimitry Andric   return is_valid;
1640b57cec5SDimitry Andric }
1650b57cec5SDimitry Andric 
GetParentProcessID()1660b57cec5SDimitry Andric lldb::pid_t SBProcessInfo::GetParentProcessID() {
16704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
1680b57cec5SDimitry Andric 
1690b57cec5SDimitry Andric   lldb::pid_t proc_id = LLDB_INVALID_PROCESS_ID;
1700b57cec5SDimitry Andric   if (m_opaque_up) {
1710b57cec5SDimitry Andric     proc_id = m_opaque_up->GetParentProcessID();
1720b57cec5SDimitry Andric   }
1730b57cec5SDimitry Andric   return proc_id;
1740b57cec5SDimitry Andric }
1750b57cec5SDimitry Andric 
GetTriple()176fe6060f1SDimitry Andric const char *SBProcessInfo::GetTriple() {
17704eeddc0SDimitry Andric   LLDB_INSTRUMENT_VA(this);
178fe6060f1SDimitry Andric 
179*fe013be4SDimitry Andric   if (!m_opaque_up)
180*fe013be4SDimitry Andric     return nullptr;
181*fe013be4SDimitry Andric 
182fe6060f1SDimitry Andric   const auto &arch = m_opaque_up->GetArchitecture();
183*fe013be4SDimitry Andric   if (!arch.IsValid())
184*fe013be4SDimitry Andric     return nullptr;
185*fe013be4SDimitry Andric 
186*fe013be4SDimitry Andric   return ConstString(arch.GetTriple().getTriple().c_str()).GetCString();
187fe6060f1SDimitry Andric }
188