brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.3 KiB · a9f712c Raw
341 lines · cpp
1//===-- SBAttachInfo.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-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/API/SBAttachInfo.h"10#include "Utils.h"11#include "lldb/API/SBFileSpec.h"12#include "lldb/API/SBListener.h"13#include "lldb/API/SBStructuredData.h"14#include "lldb/Target/Process.h"15#include "lldb/Utility/Instrumentation.h"16#include "lldb/Utility/ScriptedMetadata.h"17 18using namespace lldb;19using namespace lldb_private;20 21SBAttachInfo::SBAttachInfo() : m_opaque_sp(new ProcessAttachInfo()) {22  LLDB_INSTRUMENT_VA(this);23}24 25SBAttachInfo::SBAttachInfo(lldb::pid_t pid)26    : m_opaque_sp(new ProcessAttachInfo()) {27  LLDB_INSTRUMENT_VA(this, pid);28 29  m_opaque_sp->SetProcessID(pid);30}31 32SBAttachInfo::SBAttachInfo(const char *path, bool wait_for)33    : m_opaque_sp(new ProcessAttachInfo()) {34  LLDB_INSTRUMENT_VA(this, path, wait_for);35 36  if (path && path[0])37    m_opaque_sp->GetExecutableFile().SetFile(path, FileSpec::Style::native);38  m_opaque_sp->SetWaitForLaunch(wait_for);39}40 41SBAttachInfo::SBAttachInfo(const char *path, bool wait_for, bool async)42    : m_opaque_sp(new ProcessAttachInfo()) {43  LLDB_INSTRUMENT_VA(this, path, wait_for, async);44 45  if (path && path[0])46    m_opaque_sp->GetExecutableFile().SetFile(path, FileSpec::Style::native);47  m_opaque_sp->SetWaitForLaunch(wait_for);48  m_opaque_sp->SetAsync(async);49}50 51SBAttachInfo::SBAttachInfo(const SBAttachInfo &rhs)52    : m_opaque_sp(new ProcessAttachInfo()) {53  LLDB_INSTRUMENT_VA(this, rhs);54 55  m_opaque_sp = clone(rhs.m_opaque_sp);56}57 58SBAttachInfo::~SBAttachInfo() = default;59 60lldb_private::ProcessAttachInfo &SBAttachInfo::ref() { return *m_opaque_sp; }61 62SBAttachInfo &SBAttachInfo::operator=(const SBAttachInfo &rhs) {63  LLDB_INSTRUMENT_VA(this, rhs);64 65  if (this != &rhs)66    m_opaque_sp = clone(rhs.m_opaque_sp);67  return *this;68}69 70lldb::pid_t SBAttachInfo::GetProcessID() {71  LLDB_INSTRUMENT_VA(this);72 73  return m_opaque_sp->GetProcessID();74}75 76void SBAttachInfo::SetProcessID(lldb::pid_t pid) {77  LLDB_INSTRUMENT_VA(this, pid);78 79  m_opaque_sp->SetProcessID(pid);80}81 82uint32_t SBAttachInfo::GetResumeCount() {83  LLDB_INSTRUMENT_VA(this);84 85  return m_opaque_sp->GetResumeCount();86}87 88void SBAttachInfo::SetResumeCount(uint32_t c) {89  LLDB_INSTRUMENT_VA(this, c);90 91  m_opaque_sp->SetResumeCount(c);92}93 94const char *SBAttachInfo::GetProcessPluginName() {95  LLDB_INSTRUMENT_VA(this);96 97  return ConstString(m_opaque_sp->GetProcessPluginName()).GetCString();98}99 100void SBAttachInfo::SetProcessPluginName(const char *plugin_name) {101  LLDB_INSTRUMENT_VA(this, plugin_name);102 103  return m_opaque_sp->SetProcessPluginName(plugin_name);104}105 106void SBAttachInfo::SetExecutable(const char *path) {107  LLDB_INSTRUMENT_VA(this, path);108 109  if (path && path[0])110    m_opaque_sp->GetExecutableFile().SetFile(path, FileSpec::Style::native);111  else112    m_opaque_sp->GetExecutableFile().Clear();113}114 115void SBAttachInfo::SetExecutable(SBFileSpec exe_file) {116  LLDB_INSTRUMENT_VA(this, exe_file);117 118  if (exe_file.IsValid())119    m_opaque_sp->GetExecutableFile() = exe_file.ref();120  else121    m_opaque_sp->GetExecutableFile().Clear();122}123 124bool SBAttachInfo::GetWaitForLaunch() {125  LLDB_INSTRUMENT_VA(this);126 127  return m_opaque_sp->GetWaitForLaunch();128}129 130void SBAttachInfo::SetWaitForLaunch(bool b) {131  LLDB_INSTRUMENT_VA(this, b);132 133  m_opaque_sp->SetWaitForLaunch(b);134}135 136void SBAttachInfo::SetWaitForLaunch(bool b, bool async) {137  LLDB_INSTRUMENT_VA(this, b, async);138 139  m_opaque_sp->SetWaitForLaunch(b);140  m_opaque_sp->SetAsync(async);141}142 143bool SBAttachInfo::GetIgnoreExisting() {144  LLDB_INSTRUMENT_VA(this);145 146  return m_opaque_sp->GetIgnoreExisting();147}148 149void SBAttachInfo::SetIgnoreExisting(bool b) {150  LLDB_INSTRUMENT_VA(this, b);151 152  m_opaque_sp->SetIgnoreExisting(b);153}154 155uint32_t SBAttachInfo::GetUserID() {156  LLDB_INSTRUMENT_VA(this);157 158  return m_opaque_sp->GetUserID();159}160 161uint32_t SBAttachInfo::GetGroupID() {162  LLDB_INSTRUMENT_VA(this);163 164  return m_opaque_sp->GetGroupID();165}166 167bool SBAttachInfo::UserIDIsValid() {168  LLDB_INSTRUMENT_VA(this);169 170  return m_opaque_sp->UserIDIsValid();171}172 173bool SBAttachInfo::GroupIDIsValid() {174  LLDB_INSTRUMENT_VA(this);175 176  return m_opaque_sp->GroupIDIsValid();177}178 179void SBAttachInfo::SetUserID(uint32_t uid) {180  LLDB_INSTRUMENT_VA(this, uid);181 182  m_opaque_sp->SetUserID(uid);183}184 185void SBAttachInfo::SetGroupID(uint32_t gid) {186  LLDB_INSTRUMENT_VA(this, gid);187 188  m_opaque_sp->SetGroupID(gid);189}190 191uint32_t SBAttachInfo::GetEffectiveUserID() {192  LLDB_INSTRUMENT_VA(this);193 194  return m_opaque_sp->GetEffectiveUserID();195}196 197uint32_t SBAttachInfo::GetEffectiveGroupID() {198  LLDB_INSTRUMENT_VA(this);199 200  return m_opaque_sp->GetEffectiveGroupID();201}202 203bool SBAttachInfo::EffectiveUserIDIsValid() {204  LLDB_INSTRUMENT_VA(this);205 206  return m_opaque_sp->EffectiveUserIDIsValid();207}208 209bool SBAttachInfo::EffectiveGroupIDIsValid() {210  LLDB_INSTRUMENT_VA(this);211 212  return m_opaque_sp->EffectiveGroupIDIsValid();213}214 215void SBAttachInfo::SetEffectiveUserID(uint32_t uid) {216  LLDB_INSTRUMENT_VA(this, uid);217 218  m_opaque_sp->SetEffectiveUserID(uid);219}220 221void SBAttachInfo::SetEffectiveGroupID(uint32_t gid) {222  LLDB_INSTRUMENT_VA(this, gid);223 224  m_opaque_sp->SetEffectiveGroupID(gid);225}226 227lldb::pid_t SBAttachInfo::GetParentProcessID() {228  LLDB_INSTRUMENT_VA(this);229 230  return m_opaque_sp->GetParentProcessID();231}232 233void SBAttachInfo::SetParentProcessID(lldb::pid_t pid) {234  LLDB_INSTRUMENT_VA(this, pid);235 236  m_opaque_sp->SetParentProcessID(pid);237}238 239bool SBAttachInfo::ParentProcessIDIsValid() {240  LLDB_INSTRUMENT_VA(this);241 242  return m_opaque_sp->ParentProcessIDIsValid();243}244 245SBListener SBAttachInfo::GetListener() {246  LLDB_INSTRUMENT_VA(this);247 248  return SBListener(m_opaque_sp->GetListener());249}250 251void SBAttachInfo::SetListener(SBListener &listener) {252  LLDB_INSTRUMENT_VA(this, listener);253 254  m_opaque_sp->SetListener(listener.GetSP());255}256 257SBListener SBAttachInfo::GetShadowListener() {258  LLDB_INSTRUMENT_VA(this);259 260  lldb::ListenerSP shadow_sp = m_opaque_sp->GetShadowListener();261  if (!shadow_sp)262    return SBListener();263  return SBListener(shadow_sp);264}265 266void SBAttachInfo::SetShadowListener(SBListener &listener) {267  LLDB_INSTRUMENT_VA(this, listener);268 269  m_opaque_sp->SetShadowListener(listener.GetSP());270}271 272const char *SBAttachInfo::GetScriptedProcessClassName() const {273  LLDB_INSTRUMENT_VA(this);274 275  ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();276 277  if (!metadata_sp || !*metadata_sp)278    return nullptr;279 280  // Constify this string so that it is saved in the string pool.  Otherwise it281  // would be freed when this function goes out of scope.282  ConstString class_name(metadata_sp->GetClassName().data());283  return class_name.AsCString();284}285 286void SBAttachInfo::SetScriptedProcessClassName(const char *class_name) {287  LLDB_INSTRUMENT_VA(this, class_name);288 289  ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();290 291  if (!metadata_sp)292    metadata_sp = std::make_shared<ScriptedMetadata>(class_name, nullptr);293  else294    metadata_sp = std::make_shared<ScriptedMetadata>(class_name,295                                                     metadata_sp->GetArgsSP());296 297  m_opaque_sp->SetScriptedMetadata(metadata_sp);298}299 300lldb::SBStructuredData SBAttachInfo::GetScriptedProcessDictionary() const {301  LLDB_INSTRUMENT_VA(this);302 303  ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();304 305  SBStructuredData data;306  if (!metadata_sp)307    return data;308 309  lldb_private::StructuredData::DictionarySP dict_sp = metadata_sp->GetArgsSP();310  data.m_impl_up->SetObjectSP(dict_sp);311 312  return data;313}314 315void SBAttachInfo::SetScriptedProcessDictionary(lldb::SBStructuredData dict) {316  LLDB_INSTRUMENT_VA(this, dict);317 318  if (!dict.IsValid() || !dict.m_impl_up)319    return;320 321  StructuredData::ObjectSP obj_sp = dict.m_impl_up->GetObjectSP();322 323  if (!obj_sp)324    return;325 326  StructuredData::DictionarySP dict_sp =327      std::make_shared<StructuredData::Dictionary>(obj_sp);328  if (!dict_sp || dict_sp->GetType() == lldb::eStructuredDataTypeInvalid)329    return;330 331  ScriptedMetadataSP metadata_sp = m_opaque_sp->GetScriptedMetadata();332 333  if (!metadata_sp)334    metadata_sp = std::make_shared<ScriptedMetadata>("", dict_sp);335  else336    metadata_sp = std::make_shared<ScriptedMetadata>(337        metadata_sp->GetClassName(), dict_sp);338 339  m_opaque_sp->SetScriptedMetadata(metadata_sp);340}341