180814287SRaphael Isemann //===-- SBSymbolContext.cpp -----------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "lldb/API/SBSymbolContext.h"
10bd4bf82aSJonas Devlieghere #include "Utils.h"
11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
128f7180b1SGreg Clayton #include "lldb/Core/Module.h"
13cfd1acedSGreg Clayton #include "lldb/Symbol/Function.h"
14cfd1acedSGreg Clayton #include "lldb/Symbol/Symbol.h"
15cfd1acedSGreg Clayton #include "lldb/Symbol/SymbolContext.h"
16*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
1730fdc8d8SChris Lattner 
1830fdc8d8SChris Lattner using namespace lldb;
1930fdc8d8SChris Lattner using namespace lldb_private;
2030fdc8d8SChris Lattner 
SBSymbolContext()21*1755f5b1SJonas Devlieghere SBSymbolContext::SBSymbolContext() { LLDB_INSTRUMENT_VA(this); }
2230fdc8d8SChris Lattner 
SBSymbolContext(const SymbolContext & sc)232efc6892SPavel Labath SBSymbolContext::SBSymbolContext(const SymbolContext &sc)
242efc6892SPavel Labath     : m_opaque_up(std::make_unique<SymbolContext>(sc)) {
25*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, sc);
2630fdc8d8SChris Lattner }
2730fdc8d8SChris Lattner 
SBSymbolContext(const SBSymbolContext & rhs)28a3436f73SKazu Hirata SBSymbolContext::SBSymbolContext(const SBSymbolContext &rhs) {
29*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
30baf5664fSJonas Devlieghere 
31bd4bf82aSJonas Devlieghere   m_opaque_up = clone(rhs.m_opaque_up);
3230fdc8d8SChris Lattner }
3330fdc8d8SChris Lattner 
34866b7a65SJonas Devlieghere SBSymbolContext::~SBSymbolContext() = default;
3530fdc8d8SChris Lattner 
operator =(const SBSymbolContext & rhs)36b9c1b51eSKate Stone const SBSymbolContext &SBSymbolContext::operator=(const SBSymbolContext &rhs) {
37*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
38baf5664fSJonas Devlieghere 
39bd4bf82aSJonas Devlieghere   if (this != &rhs)
40bd4bf82aSJonas Devlieghere     m_opaque_up = clone(rhs.m_opaque_up);
41d232abc3SJonas Devlieghere   return *this;
4230fdc8d8SChris Lattner }
4330fdc8d8SChris Lattner 
IsValid() const44baf5664fSJonas Devlieghere bool SBSymbolContext::IsValid() const {
45*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
467f5237bcSPavel Labath   return this->operator bool();
477f5237bcSPavel Labath }
operator bool() const487f5237bcSPavel Labath SBSymbolContext::operator bool() const {
49*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
50baf5664fSJonas Devlieghere 
51248a1305SKonrad Kleine   return m_opaque_up != nullptr;
52baf5664fSJonas Devlieghere }
5330fdc8d8SChris Lattner 
GetModule()54b9c1b51eSKate Stone SBModule SBSymbolContext::GetModule() {
55*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
56baf5664fSJonas Devlieghere 
5730fdc8d8SChris Lattner   SBModule sb_module;
58acdbe816SGreg Clayton   ModuleSP module_sp;
59d5b44036SJonas Devlieghere   if (m_opaque_up) {
60d5b44036SJonas Devlieghere     module_sp = m_opaque_up->module_sp;
61acdbe816SGreg Clayton     sb_module.SetSP(module_sp);
62acdbe816SGreg Clayton   }
63ceb6b139SCaroline Tice 
64d232abc3SJonas Devlieghere   return sb_module;
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
GetCompileUnit()67b9c1b51eSKate Stone SBCompileUnit SBSymbolContext::GetCompileUnit() {
68*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
69baf5664fSJonas Devlieghere 
70d232abc3SJonas Devlieghere   return SBCompileUnit(m_opaque_up ? m_opaque_up->comp_unit : nullptr);
7130fdc8d8SChris Lattner }
7230fdc8d8SChris Lattner 
GetFunction()73b9c1b51eSKate Stone SBFunction SBSymbolContext::GetFunction() {
74*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
75baf5664fSJonas Devlieghere 
76248a1305SKonrad Kleine   Function *function = nullptr;
77cfd1acedSGreg Clayton 
78d5b44036SJonas Devlieghere   if (m_opaque_up)
79d5b44036SJonas Devlieghere     function = m_opaque_up->function;
80cfd1acedSGreg Clayton 
81cfd1acedSGreg Clayton   SBFunction sb_function(function);
82ceb6b139SCaroline Tice 
83d232abc3SJonas Devlieghere   return sb_function;
8430fdc8d8SChris Lattner }
8530fdc8d8SChris Lattner 
GetBlock()86b9c1b51eSKate Stone SBBlock SBSymbolContext::GetBlock() {
87*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
88baf5664fSJonas Devlieghere 
89d232abc3SJonas Devlieghere   return SBBlock(m_opaque_up ? m_opaque_up->block : nullptr);
9030fdc8d8SChris Lattner }
9130fdc8d8SChris Lattner 
GetLineEntry()92b9c1b51eSKate Stone SBLineEntry SBSymbolContext::GetLineEntry() {
93*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
94baf5664fSJonas Devlieghere 
9530fdc8d8SChris Lattner   SBLineEntry sb_line_entry;
96d5b44036SJonas Devlieghere   if (m_opaque_up)
97d5b44036SJonas Devlieghere     sb_line_entry.SetLineEntry(m_opaque_up->line_entry);
9830fdc8d8SChris Lattner 
99d232abc3SJonas Devlieghere   return sb_line_entry;
10030fdc8d8SChris Lattner }
10130fdc8d8SChris Lattner 
GetSymbol()102b9c1b51eSKate Stone SBSymbol SBSymbolContext::GetSymbol() {
103*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
104baf5664fSJonas Devlieghere 
105248a1305SKonrad Kleine   Symbol *symbol = nullptr;
106cfd1acedSGreg Clayton 
107d5b44036SJonas Devlieghere   if (m_opaque_up)
108d5b44036SJonas Devlieghere     symbol = m_opaque_up->symbol;
109cfd1acedSGreg Clayton 
110cfd1acedSGreg Clayton   SBSymbol sb_symbol(symbol);
111ceb6b139SCaroline Tice 
112d232abc3SJonas Devlieghere   return sb_symbol;
11330fdc8d8SChris Lattner }
11430fdc8d8SChris Lattner 
SetModule(lldb::SBModule module)115b9c1b51eSKate Stone void SBSymbolContext::SetModule(lldb::SBModule module) {
116*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, module);
117baf5664fSJonas Devlieghere 
118acdbe816SGreg Clayton   ref().module_sp = module.GetSP();
1198f7180b1SGreg Clayton }
1208f7180b1SGreg Clayton 
SetCompileUnit(lldb::SBCompileUnit compile_unit)121b9c1b51eSKate Stone void SBSymbolContext::SetCompileUnit(lldb::SBCompileUnit compile_unit) {
122*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, compile_unit);
123baf5664fSJonas Devlieghere 
1248f7180b1SGreg Clayton   ref().comp_unit = compile_unit.get();
1258f7180b1SGreg Clayton }
1268f7180b1SGreg Clayton 
SetFunction(lldb::SBFunction function)127b9c1b51eSKate Stone void SBSymbolContext::SetFunction(lldb::SBFunction function) {
128*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, function);
129baf5664fSJonas Devlieghere 
1308f7180b1SGreg Clayton   ref().function = function.get();
1318f7180b1SGreg Clayton }
1328f7180b1SGreg Clayton 
SetBlock(lldb::SBBlock block)133b9c1b51eSKate Stone void SBSymbolContext::SetBlock(lldb::SBBlock block) {
134*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, block);
135baf5664fSJonas Devlieghere 
1365569e64eSGreg Clayton   ref().block = block.GetPtr();
1378f7180b1SGreg Clayton }
1388f7180b1SGreg Clayton 
SetLineEntry(lldb::SBLineEntry line_entry)139b9c1b51eSKate Stone void SBSymbolContext::SetLineEntry(lldb::SBLineEntry line_entry) {
140*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, line_entry);
141baf5664fSJonas Devlieghere 
1428f7180b1SGreg Clayton   if (line_entry.IsValid())
1438f7180b1SGreg Clayton     ref().line_entry = line_entry.ref();
1448f7180b1SGreg Clayton   else
1458f7180b1SGreg Clayton     ref().line_entry.Clear();
1468f7180b1SGreg Clayton }
1478f7180b1SGreg Clayton 
SetSymbol(lldb::SBSymbol symbol)148b9c1b51eSKate Stone void SBSymbolContext::SetSymbol(lldb::SBSymbol symbol) {
149*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, symbol);
150baf5664fSJonas Devlieghere 
1518f7180b1SGreg Clayton   ref().symbol = symbol.get();
1528f7180b1SGreg Clayton }
1538f7180b1SGreg Clayton 
operator ->() const154b9c1b51eSKate Stone lldb_private::SymbolContext *SBSymbolContext::operator->() const {
155d5b44036SJonas Devlieghere   return m_opaque_up.get();
15630fdc8d8SChris Lattner }
15730fdc8d8SChris Lattner 
operator *() const158b9c1b51eSKate Stone const lldb_private::SymbolContext &SBSymbolContext::operator*() const {
159d5b44036SJonas Devlieghere   assert(m_opaque_up.get());
160d5b44036SJonas Devlieghere   return *m_opaque_up;
16109960031SGreg Clayton }
16209960031SGreg Clayton 
operator *()163b9c1b51eSKate Stone lldb_private::SymbolContext &SBSymbolContext::operator*() {
164248a1305SKonrad Kleine   if (m_opaque_up == nullptr)
1651c0bbe43SJonas Devlieghere     m_opaque_up = std::make_unique<SymbolContext>();
166d5b44036SJonas Devlieghere   return *m_opaque_up;
16709960031SGreg Clayton }
16809960031SGreg Clayton 
ref()169b9c1b51eSKate Stone lldb_private::SymbolContext &SBSymbolContext::ref() {
170248a1305SKonrad Kleine   if (m_opaque_up == nullptr)
1711c0bbe43SJonas Devlieghere     m_opaque_up = std::make_unique<SymbolContext>();
172d5b44036SJonas Devlieghere   return *m_opaque_up;
173dac97f31SCaroline Tice }
174dac97f31SCaroline Tice 
get() const175b9c1b51eSKate Stone lldb_private::SymbolContext *SBSymbolContext::get() const {
176d5b44036SJonas Devlieghere   return m_opaque_up.get();
17730fdc8d8SChris Lattner }
17830fdc8d8SChris Lattner 
GetDescription(SBStream & description)179b9c1b51eSKate Stone bool SBSymbolContext::GetDescription(SBStream &description) {
180*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, description);
181baf5664fSJonas Devlieghere 
182da7bc7d0SGreg Clayton   Stream &strm = description.ref();
183da7bc7d0SGreg Clayton 
184d5b44036SJonas Devlieghere   if (m_opaque_up) {
185248a1305SKonrad Kleine     m_opaque_up->GetDescription(&strm, lldb::eDescriptionLevelFull, nullptr);
186b9c1b51eSKate Stone   } else
187da7bc7d0SGreg Clayton     strm.PutCString("No value");
18830fdc8d8SChris Lattner 
189dde9cff3SCaroline Tice   return true;
190dde9cff3SCaroline Tice }
1918f7180b1SGreg Clayton 
1928f7180b1SGreg Clayton SBSymbolContext
GetParentOfInlinedScope(const SBAddress & curr_frame_pc,SBAddress & parent_frame_addr) const1931ed54f50SGreg Clayton SBSymbolContext::GetParentOfInlinedScope(const SBAddress &curr_frame_pc,
194b9c1b51eSKate Stone                                          SBAddress &parent_frame_addr) const {
195*1755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, curr_frame_pc, parent_frame_addr);
196baf5664fSJonas Devlieghere 
1978f7180b1SGreg Clayton   SBSymbolContext sb_sc;
198d5b44036SJonas Devlieghere   if (m_opaque_up.get() && curr_frame_pc.IsValid()) {
199d5b44036SJonas Devlieghere     if (m_opaque_up->GetParentOfInlinedScope(curr_frame_pc.ref(), sb_sc.ref(),
200b9c1b51eSKate Stone                                              parent_frame_addr.ref()))
201d232abc3SJonas Devlieghere       return sb_sc;
2028f7180b1SGreg Clayton   }
203d232abc3SJonas Devlieghere   return SBSymbolContext();
2048f7180b1SGreg Clayton }
205