180814287SRaphael Isemann //===-- SBSymbol.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/SBSymbol.h"
10dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
111d273166SGreg Clayton #include "lldb/Core/Disassembler.h"
121d273166SGreg Clayton #include "lldb/Core/Module.h"
1330fdc8d8SChris Lattner #include "lldb/Symbol/Symbol.h"
141d273166SGreg Clayton #include "lldb/Target/ExecutionContext.h"
151d273166SGreg Clayton #include "lldb/Target/Target.h"
16*1755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
1730fdc8d8SChris Lattner
1830fdc8d8SChris Lattner using namespace lldb;
191d273166SGreg Clayton using namespace lldb_private;
2030fdc8d8SChris Lattner
SBSymbol()21*1755f5b1SJonas Devlieghere SBSymbol::SBSymbol() { LLDB_INSTRUMENT_VA(this); }
2230fdc8d8SChris Lattner
SBSymbol(lldb_private::Symbol * lldb_object_ptr)23b9c1b51eSKate Stone SBSymbol::SBSymbol(lldb_private::Symbol *lldb_object_ptr)
24b9c1b51eSKate Stone : m_opaque_ptr(lldb_object_ptr) {}
2530fdc8d8SChris Lattner
SBSymbol(const lldb::SBSymbol & rhs)26baf5664fSJonas Devlieghere SBSymbol::SBSymbol(const lldb::SBSymbol &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) {
27*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
28baf5664fSJonas Devlieghere }
29efabb123SGreg Clayton
operator =(const SBSymbol & rhs)30b9c1b51eSKate Stone const SBSymbol &SBSymbol::operator=(const SBSymbol &rhs) {
31*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
32baf5664fSJonas Devlieghere
33efabb123SGreg Clayton m_opaque_ptr = rhs.m_opaque_ptr;
34d232abc3SJonas Devlieghere return *this;
35efabb123SGreg Clayton }
36efabb123SGreg Clayton
~SBSymbol()37248a1305SKonrad Kleine SBSymbol::~SBSymbol() { m_opaque_ptr = nullptr; }
3830fdc8d8SChris Lattner
SetSymbol(lldb_private::Symbol * lldb_object_ptr)39b9c1b51eSKate Stone void SBSymbol::SetSymbol(lldb_private::Symbol *lldb_object_ptr) {
40bbdabce2SGreg Clayton m_opaque_ptr = lldb_object_ptr;
41bbdabce2SGreg Clayton }
42bbdabce2SGreg Clayton
IsValid() const43baf5664fSJonas Devlieghere bool SBSymbol::IsValid() const {
44*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
457f5237bcSPavel Labath return this->operator bool();
467f5237bcSPavel Labath }
operator bool() const477f5237bcSPavel Labath SBSymbol::operator bool() const {
48*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
49baf5664fSJonas Devlieghere
50248a1305SKonrad Kleine return m_opaque_ptr != nullptr;
51baf5664fSJonas Devlieghere }
5230fdc8d8SChris Lattner
GetName() const53b9c1b51eSKate Stone const char *SBSymbol::GetName() const {
54*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
55baf5664fSJonas Devlieghere
56248a1305SKonrad Kleine const char *name = nullptr;
576611103cSGreg Clayton if (m_opaque_ptr)
58ddaf6a72SGreg Clayton name = m_opaque_ptr->GetName().AsCString();
594838131bSGreg Clayton
604838131bSGreg Clayton return name;
6130fdc8d8SChris Lattner }
6230fdc8d8SChris Lattner
GetDisplayName() const63b9c1b51eSKate Stone const char *SBSymbol::GetDisplayName() const {
64*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
65baf5664fSJonas Devlieghere
66248a1305SKonrad Kleine const char *name = nullptr;
67c1f705c2SEnrico Granata if (m_opaque_ptr)
6822b04487SAlex Langford name = m_opaque_ptr->GetMangled().GetDisplayDemangledName().AsCString();
69c1f705c2SEnrico Granata
70c1f705c2SEnrico Granata return name;
71c1f705c2SEnrico Granata }
72c1f705c2SEnrico Granata
GetMangledName() const73b9c1b51eSKate Stone const char *SBSymbol::GetMangledName() const {
74*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
75baf5664fSJonas Devlieghere
76248a1305SKonrad Kleine const char *name = nullptr;
776611103cSGreg Clayton if (m_opaque_ptr)
784838131bSGreg Clayton name = m_opaque_ptr->GetMangled().GetMangledName().AsCString();
794838131bSGreg Clayton return name;
8030fdc8d8SChris Lattner }
8130fdc8d8SChris Lattner
operator ==(const SBSymbol & rhs) const82b9c1b51eSKate Stone bool SBSymbol::operator==(const SBSymbol &rhs) const {
83*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
84baf5664fSJonas Devlieghere
856611103cSGreg Clayton return m_opaque_ptr == rhs.m_opaque_ptr;
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner
operator !=(const SBSymbol & rhs) const88b9c1b51eSKate Stone bool SBSymbol::operator!=(const SBSymbol &rhs) const {
89*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs);
90baf5664fSJonas Devlieghere
916611103cSGreg Clayton return m_opaque_ptr != rhs.m_opaque_ptr;
9230fdc8d8SChris Lattner }
93dde9cff3SCaroline Tice
GetDescription(SBStream & description)94b9c1b51eSKate Stone bool SBSymbol::GetDescription(SBStream &description) {
95*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description);
96baf5664fSJonas Devlieghere
97da7bc7d0SGreg Clayton Stream &strm = description.ref();
98da7bc7d0SGreg Clayton
99b9c1b51eSKate Stone if (m_opaque_ptr) {
100248a1305SKonrad Kleine m_opaque_ptr->GetDescription(&strm, lldb::eDescriptionLevelFull, nullptr);
101b9c1b51eSKate Stone } else
102da7bc7d0SGreg Clayton strm.PutCString("No value");
103dde9cff3SCaroline Tice
104dde9cff3SCaroline Tice return true;
105dde9cff3SCaroline Tice }
1061d273166SGreg Clayton
GetInstructions(SBTarget target)107b9c1b51eSKate Stone SBInstructionList SBSymbol::GetInstructions(SBTarget target) {
108*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target);
109baf5664fSJonas Devlieghere
110d232abc3SJonas Devlieghere return GetInstructions(target, nullptr);
1110f063ba6SJim Ingham }
1120f063ba6SJim Ingham
GetInstructions(SBTarget target,const char * flavor_string)113b9c1b51eSKate Stone SBInstructionList SBSymbol::GetInstructions(SBTarget target,
114b9c1b51eSKate Stone const char *flavor_string) {
115*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target, flavor_string);
116baf5664fSJonas Devlieghere
1171d273166SGreg Clayton SBInstructionList sb_instructions;
118b9c1b51eSKate Stone if (m_opaque_ptr) {
119b9556accSGreg Clayton TargetSP target_sp(target.GetSP());
120bb19a13cSSaleem Abdulrasool std::unique_lock<std::recursive_mutex> lock;
12104592d5bSPavel Labath if (target_sp && m_opaque_ptr->ValueIsAddress()) {
122bb19a13cSSaleem Abdulrasool lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
123358cf1eaSGreg Clayton const Address &symbol_addr = m_opaque_ptr->GetAddressRef();
124358cf1eaSGreg Clayton ModuleSP module_sp = symbol_addr.GetModule();
125b9c1b51eSKate Stone if (module_sp) {
126358cf1eaSGreg Clayton AddressRange symbol_range(symbol_addr, m_opaque_ptr->GetByteSize());
127e9fe788dSJason Molenda const bool force_live_memory = true;
128b9c1b51eSKate Stone sb_instructions.SetDisassembler(Disassembler::DisassembleRange(
12904592d5bSPavel Labath module_sp->GetArchitecture(), nullptr, flavor_string, *target_sp,
130e9fe788dSJason Molenda symbol_range, force_live_memory));
1311d273166SGreg Clayton }
1321d273166SGreg Clayton }
1331d273166SGreg Clayton }
134d232abc3SJonas Devlieghere return sb_instructions;
1351d273166SGreg Clayton }
1361d273166SGreg Clayton
get()137b9c1b51eSKate Stone lldb_private::Symbol *SBSymbol::get() { return m_opaque_ptr; }
13872eff18aSGreg Clayton
reset(lldb_private::Symbol * symbol)139b9c1b51eSKate Stone void SBSymbol::reset(lldb_private::Symbol *symbol) { m_opaque_ptr = symbol; }
14093d00df5SGreg Clayton
GetStartAddress()141b9c1b51eSKate Stone SBAddress SBSymbol::GetStartAddress() {
142*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
143baf5664fSJonas Devlieghere
14493d00df5SGreg Clayton SBAddress addr;
145b9c1b51eSKate Stone if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
1466cd4a4cdSJonas Devlieghere addr.SetAddress(m_opaque_ptr->GetAddressRef());
14793d00df5SGreg Clayton }
148d232abc3SJonas Devlieghere return addr;
14993d00df5SGreg Clayton }
15093d00df5SGreg Clayton
GetEndAddress()151b9c1b51eSKate Stone SBAddress SBSymbol::GetEndAddress() {
152*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
153baf5664fSJonas Devlieghere
15493d00df5SGreg Clayton SBAddress addr;
155b9c1b51eSKate Stone if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) {
156e7612134SGreg Clayton lldb::addr_t range_size = m_opaque_ptr->GetByteSize();
157b9c1b51eSKate Stone if (range_size > 0) {
1586cd4a4cdSJonas Devlieghere addr.SetAddress(m_opaque_ptr->GetAddressRef());
159e7612134SGreg Clayton addr->Slide(m_opaque_ptr->GetByteSize());
16093d00df5SGreg Clayton }
16193d00df5SGreg Clayton }
162d232abc3SJonas Devlieghere return addr;
16393d00df5SGreg Clayton }
16493d00df5SGreg Clayton
GetPrologueByteSize()165b9c1b51eSKate Stone uint32_t SBSymbol::GetPrologueByteSize() {
166*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
167baf5664fSJonas Devlieghere
16893d00df5SGreg Clayton if (m_opaque_ptr)
16993d00df5SGreg Clayton return m_opaque_ptr->GetPrologueByteSize();
17093d00df5SGreg Clayton return 0;
17193d00df5SGreg Clayton }
17205d2b7f7SGreg Clayton
GetType()173b9c1b51eSKate Stone SymbolType SBSymbol::GetType() {
174*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
175baf5664fSJonas Devlieghere
17605d2b7f7SGreg Clayton if (m_opaque_ptr)
17705d2b7f7SGreg Clayton return m_opaque_ptr->GetType();
17805d2b7f7SGreg Clayton return eSymbolTypeInvalid;
17905d2b7f7SGreg Clayton }
18074ae3f5aSGreg Clayton
IsExternal()181b9c1b51eSKate Stone bool SBSymbol::IsExternal() {
182*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
183baf5664fSJonas Devlieghere
18474ae3f5aSGreg Clayton if (m_opaque_ptr)
18574ae3f5aSGreg Clayton return m_opaque_ptr->IsExternal();
18674ae3f5aSGreg Clayton return false;
18774ae3f5aSGreg Clayton }
18874ae3f5aSGreg Clayton
IsSynthetic()189b9c1b51eSKate Stone bool SBSymbol::IsSynthetic() {
190*1755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this);
191baf5664fSJonas Devlieghere
19274ae3f5aSGreg Clayton if (m_opaque_ptr)
19374ae3f5aSGreg Clayton return m_opaque_ptr->IsSynthetic();
19474ae3f5aSGreg Clayton return false;
19574ae3f5aSGreg Clayton }
196