1254721Semaste//===-- SBSymbol.cpp --------------------------------------------*- C++ -*-===// 2254721Semaste// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6254721Semaste// 7254721Semaste//===----------------------------------------------------------------------===// 8254721Semaste 9254721Semaste#include "lldb/API/SBSymbol.h" 10353358Sdim#include "SBReproducerPrivate.h" 11254721Semaste#include "lldb/API/SBStream.h" 12254721Semaste#include "lldb/Core/Disassembler.h" 13254721Semaste#include "lldb/Core/Module.h" 14254721Semaste#include "lldb/Symbol/Symbol.h" 15254721Semaste#include "lldb/Target/ExecutionContext.h" 16254721Semaste#include "lldb/Target/Target.h" 17254721Semaste 18254721Semasteusing namespace lldb; 19254721Semasteusing namespace lldb_private; 20254721Semaste 21353358SdimSBSymbol::SBSymbol() : m_opaque_ptr(nullptr) { 22353358Sdim LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBSymbol); 23353358Sdim} 24254721Semaste 25314564SdimSBSymbol::SBSymbol(lldb_private::Symbol *lldb_object_ptr) 26314564Sdim : m_opaque_ptr(lldb_object_ptr) {} 27254721Semaste 28353358SdimSBSymbol::SBSymbol(const lldb::SBSymbol &rhs) : m_opaque_ptr(rhs.m_opaque_ptr) { 29353358Sdim LLDB_RECORD_CONSTRUCTOR(SBSymbol, (const lldb::SBSymbol &), rhs); 30353358Sdim} 31254721Semaste 32314564Sdimconst SBSymbol &SBSymbol::operator=(const SBSymbol &rhs) { 33353358Sdim LLDB_RECORD_METHOD(const lldb::SBSymbol &, 34353358Sdim SBSymbol, operator=,(const lldb::SBSymbol &), rhs); 35353358Sdim 36314564Sdim m_opaque_ptr = rhs.m_opaque_ptr; 37353358Sdim return LLDB_RECORD_RESULT(*this); 38254721Semaste} 39254721Semaste 40353358SdimSBSymbol::~SBSymbol() { m_opaque_ptr = nullptr; } 41254721Semaste 42314564Sdimvoid SBSymbol::SetSymbol(lldb_private::Symbol *lldb_object_ptr) { 43314564Sdim m_opaque_ptr = lldb_object_ptr; 44254721Semaste} 45254721Semaste 46353358Sdimbool SBSymbol::IsValid() const { 47353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBSymbol, IsValid); 48353358Sdim return this->operator bool(); 49353358Sdim} 50353358SdimSBSymbol::operator bool() const { 51353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBSymbol, operator bool); 52254721Semaste 53353358Sdim return m_opaque_ptr != nullptr; 54353358Sdim} 55353358Sdim 56314564Sdimconst char *SBSymbol::GetName() const { 57353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetName); 58353358Sdim 59353358Sdim const char *name = nullptr; 60314564Sdim if (m_opaque_ptr) 61314564Sdim name = m_opaque_ptr->GetName().AsCString(); 62254721Semaste 63314564Sdim return name; 64254721Semaste} 65254721Semaste 66314564Sdimconst char *SBSymbol::GetDisplayName() const { 67353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetDisplayName); 68353358Sdim 69353358Sdim const char *name = nullptr; 70314564Sdim if (m_opaque_ptr) 71314564Sdim name = m_opaque_ptr->GetMangled() 72314564Sdim .GetDisplayDemangledName(m_opaque_ptr->GetLanguage()) 73314564Sdim .AsCString(); 74314564Sdim 75314564Sdim return name; 76288943Sdim} 77288943Sdim 78314564Sdimconst char *SBSymbol::GetMangledName() const { 79353358Sdim LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBSymbol, GetMangledName); 80353358Sdim 81353358Sdim const char *name = nullptr; 82314564Sdim if (m_opaque_ptr) 83314564Sdim name = m_opaque_ptr->GetMangled().GetMangledName().AsCString(); 84314564Sdim return name; 85254721Semaste} 86254721Semaste 87314564Sdimbool SBSymbol::operator==(const SBSymbol &rhs) const { 88353358Sdim LLDB_RECORD_METHOD_CONST(bool, SBSymbol, operator==,(const lldb::SBSymbol &), 89353358Sdim rhs); 90353358Sdim 91314564Sdim return m_opaque_ptr == rhs.m_opaque_ptr; 92254721Semaste} 93254721Semaste 94314564Sdimbool SBSymbol::operator!=(const SBSymbol &rhs) const { 95353358Sdim LLDB_RECORD_METHOD_CONST(bool, SBSymbol, operator!=,(const lldb::SBSymbol &), 96353358Sdim rhs); 97353358Sdim 98314564Sdim return m_opaque_ptr != rhs.m_opaque_ptr; 99254721Semaste} 100254721Semaste 101314564Sdimbool SBSymbol::GetDescription(SBStream &description) { 102353358Sdim LLDB_RECORD_METHOD(bool, SBSymbol, GetDescription, (lldb::SBStream &), 103353358Sdim description); 104353358Sdim 105314564Sdim Stream &strm = description.ref(); 106254721Semaste 107314564Sdim if (m_opaque_ptr) { 108353358Sdim m_opaque_ptr->GetDescription(&strm, lldb::eDescriptionLevelFull, nullptr); 109314564Sdim } else 110314564Sdim strm.PutCString("No value"); 111314564Sdim 112314564Sdim return true; 113254721Semaste} 114254721Semaste 115314564SdimSBInstructionList SBSymbol::GetInstructions(SBTarget target) { 116353358Sdim LLDB_RECORD_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions, 117353358Sdim (lldb::SBTarget), target); 118353358Sdim 119353358Sdim return LLDB_RECORD_RESULT(GetInstructions(target, nullptr)); 120254721Semaste} 121254721Semaste 122314564SdimSBInstructionList SBSymbol::GetInstructions(SBTarget target, 123314564Sdim const char *flavor_string) { 124353358Sdim LLDB_RECORD_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions, 125353358Sdim (lldb::SBTarget, const char *), target, flavor_string); 126353358Sdim 127314564Sdim SBInstructionList sb_instructions; 128314564Sdim if (m_opaque_ptr) { 129314564Sdim ExecutionContext exe_ctx; 130314564Sdim TargetSP target_sp(target.GetSP()); 131314564Sdim std::unique_lock<std::recursive_mutex> lock; 132314564Sdim if (target_sp) { 133314564Sdim lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex()); 134309124Sdim 135314564Sdim target_sp->CalculateExecutionContext(exe_ctx); 136254721Semaste } 137314564Sdim if (m_opaque_ptr->ValueIsAddress()) { 138314564Sdim const Address &symbol_addr = m_opaque_ptr->GetAddressRef(); 139314564Sdim ModuleSP module_sp = symbol_addr.GetModule(); 140314564Sdim if (module_sp) { 141314564Sdim AddressRange symbol_range(symbol_addr, m_opaque_ptr->GetByteSize()); 142314564Sdim const bool prefer_file_cache = false; 143314564Sdim sb_instructions.SetDisassembler(Disassembler::DisassembleRange( 144353358Sdim module_sp->GetArchitecture(), nullptr, flavor_string, exe_ctx, 145314564Sdim symbol_range, prefer_file_cache)); 146314564Sdim } 147314564Sdim } 148314564Sdim } 149353358Sdim return LLDB_RECORD_RESULT(sb_instructions); 150254721Semaste} 151254721Semaste 152314564Sdimlldb_private::Symbol *SBSymbol::get() { return m_opaque_ptr; } 153254721Semaste 154314564Sdimvoid SBSymbol::reset(lldb_private::Symbol *symbol) { m_opaque_ptr = symbol; } 155254721Semaste 156314564SdimSBAddress SBSymbol::GetStartAddress() { 157353358Sdim LLDB_RECORD_METHOD_NO_ARGS(lldb::SBAddress, SBSymbol, GetStartAddress); 158353358Sdim 159314564Sdim SBAddress addr; 160314564Sdim if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) { 161314564Sdim addr.SetAddress(&m_opaque_ptr->GetAddressRef()); 162314564Sdim } 163353358Sdim return LLDB_RECORD_RESULT(addr); 164254721Semaste} 165254721Semaste 166314564SdimSBAddress SBSymbol::GetEndAddress() { 167353358Sdim LLDB_RECORD_METHOD_NO_ARGS(lldb::SBAddress, SBSymbol, GetEndAddress); 168353358Sdim 169314564Sdim SBAddress addr; 170314564Sdim if (m_opaque_ptr && m_opaque_ptr->ValueIsAddress()) { 171314564Sdim lldb::addr_t range_size = m_opaque_ptr->GetByteSize(); 172314564Sdim if (range_size > 0) { 173314564Sdim addr.SetAddress(&m_opaque_ptr->GetAddressRef()); 174314564Sdim addr->Slide(m_opaque_ptr->GetByteSize()); 175254721Semaste } 176314564Sdim } 177353358Sdim return LLDB_RECORD_RESULT(addr); 178254721Semaste} 179254721Semaste 180314564Sdimuint32_t SBSymbol::GetPrologueByteSize() { 181353358Sdim LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBSymbol, GetPrologueByteSize); 182353358Sdim 183314564Sdim if (m_opaque_ptr) 184314564Sdim return m_opaque_ptr->GetPrologueByteSize(); 185314564Sdim return 0; 186254721Semaste} 187254721Semaste 188314564SdimSymbolType SBSymbol::GetType() { 189353358Sdim LLDB_RECORD_METHOD_NO_ARGS(lldb::SymbolType, SBSymbol, GetType); 190353358Sdim 191314564Sdim if (m_opaque_ptr) 192314564Sdim return m_opaque_ptr->GetType(); 193314564Sdim return eSymbolTypeInvalid; 194254721Semaste} 195254721Semaste 196314564Sdimbool SBSymbol::IsExternal() { 197353358Sdim LLDB_RECORD_METHOD_NO_ARGS(bool, SBSymbol, IsExternal); 198353358Sdim 199314564Sdim if (m_opaque_ptr) 200314564Sdim return m_opaque_ptr->IsExternal(); 201314564Sdim return false; 202254721Semaste} 203254721Semaste 204314564Sdimbool SBSymbol::IsSynthetic() { 205353358Sdim LLDB_RECORD_METHOD_NO_ARGS(bool, SBSymbol, IsSynthetic); 206353358Sdim 207314564Sdim if (m_opaque_ptr) 208314564Sdim return m_opaque_ptr->IsSynthetic(); 209314564Sdim return false; 210254721Semaste} 211353358Sdim 212353358Sdimnamespace lldb_private { 213353358Sdimnamespace repro { 214353358Sdim 215353358Sdimtemplate <> 216353358Sdimvoid RegisterMethods<SBSymbol>(Registry &R) { 217353358Sdim LLDB_REGISTER_CONSTRUCTOR(SBSymbol, ()); 218353358Sdim LLDB_REGISTER_CONSTRUCTOR(SBSymbol, (const lldb::SBSymbol &)); 219353358Sdim LLDB_REGISTER_METHOD(const lldb::SBSymbol &, 220353358Sdim SBSymbol, operator=,(const lldb::SBSymbol &)); 221353358Sdim LLDB_REGISTER_METHOD_CONST(bool, SBSymbol, IsValid, ()); 222353358Sdim LLDB_REGISTER_METHOD_CONST(bool, SBSymbol, operator bool, ()); 223353358Sdim LLDB_REGISTER_METHOD_CONST(const char *, SBSymbol, GetName, ()); 224353358Sdim LLDB_REGISTER_METHOD_CONST(const char *, SBSymbol, GetDisplayName, ()); 225353358Sdim LLDB_REGISTER_METHOD_CONST(const char *, SBSymbol, GetMangledName, ()); 226353358Sdim LLDB_REGISTER_METHOD_CONST(bool, 227353358Sdim SBSymbol, operator==,(const lldb::SBSymbol &)); 228353358Sdim LLDB_REGISTER_METHOD_CONST(bool, 229353358Sdim SBSymbol, operator!=,(const lldb::SBSymbol &)); 230353358Sdim LLDB_REGISTER_METHOD(bool, SBSymbol, GetDescription, (lldb::SBStream &)); 231353358Sdim LLDB_REGISTER_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions, 232353358Sdim (lldb::SBTarget)); 233353358Sdim LLDB_REGISTER_METHOD(lldb::SBInstructionList, SBSymbol, GetInstructions, 234353358Sdim (lldb::SBTarget, const char *)); 235353358Sdim LLDB_REGISTER_METHOD(lldb::SBAddress, SBSymbol, GetStartAddress, ()); 236353358Sdim LLDB_REGISTER_METHOD(lldb::SBAddress, SBSymbol, GetEndAddress, ()); 237353358Sdim LLDB_REGISTER_METHOD(uint32_t, SBSymbol, GetPrologueByteSize, ()); 238353358Sdim LLDB_REGISTER_METHOD(lldb::SymbolType, SBSymbol, GetType, ()); 239353358Sdim LLDB_REGISTER_METHOD(bool, SBSymbol, IsExternal, ()); 240353358Sdim LLDB_REGISTER_METHOD(bool, SBSymbol, IsSynthetic, ()); 241353358Sdim} 242353358Sdim 243353358Sdim} 244353358Sdim} 245