brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · 484399c Raw
205 lines · cpp
1//===-- SBSymbolContext.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/SBSymbolContext.h"10#include "Utils.h"11#include "lldb/API/SBStream.h"12#include "lldb/Core/Module.h"13#include "lldb/Symbol/Function.h"14#include "lldb/Symbol/Symbol.h"15#include "lldb/Symbol/SymbolContext.h"16#include "lldb/Utility/Instrumentation.h"17 18using namespace lldb;19using namespace lldb_private;20 21SBSymbolContext::SBSymbolContext() { LLDB_INSTRUMENT_VA(this); }22 23SBSymbolContext::SBSymbolContext(const SymbolContext &sc)24    : m_opaque_up(std::make_unique<SymbolContext>(sc)) {25  LLDB_INSTRUMENT_VA(this, sc);26}27 28SBSymbolContext::SBSymbolContext(const SBSymbolContext &rhs) {29  LLDB_INSTRUMENT_VA(this, rhs);30 31  m_opaque_up = clone(rhs.m_opaque_up);32}33 34SBSymbolContext::~SBSymbolContext() = default;35 36const SBSymbolContext &SBSymbolContext::operator=(const SBSymbolContext &rhs) {37  LLDB_INSTRUMENT_VA(this, rhs);38 39  if (this != &rhs)40    m_opaque_up = clone(rhs.m_opaque_up);41  return *this;42}43 44bool SBSymbolContext::IsValid() const {45  LLDB_INSTRUMENT_VA(this);46  return this->operator bool();47}48SBSymbolContext::operator bool() const {49  LLDB_INSTRUMENT_VA(this);50 51  return m_opaque_up != nullptr;52}53 54SBModule SBSymbolContext::GetModule() {55  LLDB_INSTRUMENT_VA(this);56 57  SBModule sb_module;58  ModuleSP module_sp;59  if (m_opaque_up) {60    module_sp = m_opaque_up->module_sp;61    sb_module.SetSP(module_sp);62  }63 64  return sb_module;65}66 67SBCompileUnit SBSymbolContext::GetCompileUnit() {68  LLDB_INSTRUMENT_VA(this);69 70  return SBCompileUnit(m_opaque_up ? m_opaque_up->comp_unit : nullptr);71}72 73SBFunction SBSymbolContext::GetFunction() {74  LLDB_INSTRUMENT_VA(this);75 76  Function *function = nullptr;77 78  if (m_opaque_up)79    function = m_opaque_up->function;80 81  SBFunction sb_function(function);82 83  return sb_function;84}85 86SBBlock SBSymbolContext::GetBlock() {87  LLDB_INSTRUMENT_VA(this);88 89  return SBBlock(m_opaque_up ? m_opaque_up->block : nullptr);90}91 92SBLineEntry SBSymbolContext::GetLineEntry() {93  LLDB_INSTRUMENT_VA(this);94 95  SBLineEntry sb_line_entry;96  if (m_opaque_up)97    sb_line_entry.SetLineEntry(m_opaque_up->line_entry);98 99  return sb_line_entry;100}101 102SBSymbol SBSymbolContext::GetSymbol() {103  LLDB_INSTRUMENT_VA(this);104 105  Symbol *symbol = nullptr;106 107  if (m_opaque_up)108    symbol = m_opaque_up->symbol;109 110  SBSymbol sb_symbol(symbol);111 112  return sb_symbol;113}114 115void SBSymbolContext::SetModule(lldb::SBModule module) {116  LLDB_INSTRUMENT_VA(this, module);117 118  ref().module_sp = module.GetSP();119}120 121void SBSymbolContext::SetCompileUnit(lldb::SBCompileUnit compile_unit) {122  LLDB_INSTRUMENT_VA(this, compile_unit);123 124  ref().comp_unit = compile_unit.get();125}126 127void SBSymbolContext::SetFunction(lldb::SBFunction function) {128  LLDB_INSTRUMENT_VA(this, function);129 130  ref().function = function.get();131}132 133void SBSymbolContext::SetBlock(lldb::SBBlock block) {134  LLDB_INSTRUMENT_VA(this, block);135 136  ref().block = block.GetPtr();137}138 139void SBSymbolContext::SetLineEntry(lldb::SBLineEntry line_entry) {140  LLDB_INSTRUMENT_VA(this, line_entry);141 142  if (line_entry.IsValid())143    ref().line_entry = line_entry.ref();144  else145    ref().line_entry.Clear();146}147 148void SBSymbolContext::SetSymbol(lldb::SBSymbol symbol) {149  LLDB_INSTRUMENT_VA(this, symbol);150 151  ref().symbol = symbol.get();152}153 154lldb_private::SymbolContext *SBSymbolContext::operator->() const {155  return m_opaque_up.get();156}157 158const lldb_private::SymbolContext &SBSymbolContext::operator*() const {159  assert(m_opaque_up.get());160  return *m_opaque_up;161}162 163lldb_private::SymbolContext &SBSymbolContext::operator*() {164  if (m_opaque_up == nullptr)165    m_opaque_up = std::make_unique<SymbolContext>();166  return *m_opaque_up;167}168 169lldb_private::SymbolContext &SBSymbolContext::ref() {170  if (m_opaque_up == nullptr)171    m_opaque_up = std::make_unique<SymbolContext>();172  return *m_opaque_up;173}174 175lldb_private::SymbolContext *SBSymbolContext::get() const {176  return m_opaque_up.get();177}178 179bool SBSymbolContext::GetDescription(SBStream &description) {180  LLDB_INSTRUMENT_VA(this, description);181 182  Stream &strm = description.ref();183 184  if (m_opaque_up) {185    m_opaque_up->GetDescription(&strm, lldb::eDescriptionLevelFull, nullptr);186  } else187    strm.PutCString("No value");188 189  return true;190}191 192SBSymbolContext193SBSymbolContext::GetParentOfInlinedScope(const SBAddress &curr_frame_pc,194                                         SBAddress &parent_frame_addr) const {195  LLDB_INSTRUMENT_VA(this, curr_frame_pc, parent_frame_addr);196 197  SBSymbolContext sb_sc;198  if (m_opaque_up.get() && curr_frame_pc.IsValid()) {199    if (m_opaque_up->GetParentOfInlinedScope(curr_frame_pc.ref(), sb_sc.ref(),200                                             parent_frame_addr.ref()))201      return sb_sc;202  }203  return SBSymbolContext();204}205