1*0b57cec5SDimitry Andric //===-- SBLineEntry.cpp -----------------------------------------*- C++ -*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #include "lldb/API/SBLineEntry.h" 10*0b57cec5SDimitry Andric #include "SBReproducerPrivate.h" 11*0b57cec5SDimitry Andric #include "Utils.h" 12*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h" 13*0b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h" 14*0b57cec5SDimitry Andric #include "lldb/Symbol/LineEntry.h" 15*0b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h" 16*0b57cec5SDimitry Andric 17*0b57cec5SDimitry Andric #include <limits.h> 18*0b57cec5SDimitry Andric 19*0b57cec5SDimitry Andric using namespace lldb; 20*0b57cec5SDimitry Andric using namespace lldb_private; 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry Andric SBLineEntry::SBLineEntry() : m_opaque_up() { 23*0b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBLineEntry); 24*0b57cec5SDimitry Andric } 25*0b57cec5SDimitry Andric 26*0b57cec5SDimitry Andric SBLineEntry::SBLineEntry(const SBLineEntry &rhs) : m_opaque_up() { 27*0b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBLineEntry, (const lldb::SBLineEntry &), rhs); 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up); 30*0b57cec5SDimitry Andric } 31*0b57cec5SDimitry Andric 32*0b57cec5SDimitry Andric SBLineEntry::SBLineEntry(const lldb_private::LineEntry *lldb_object_ptr) 33*0b57cec5SDimitry Andric : m_opaque_up() { 34*0b57cec5SDimitry Andric if (lldb_object_ptr) 35*0b57cec5SDimitry Andric m_opaque_up = llvm::make_unique<LineEntry>(*lldb_object_ptr); 36*0b57cec5SDimitry Andric } 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric const SBLineEntry &SBLineEntry::operator=(const SBLineEntry &rhs) { 39*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(const lldb::SBLineEntry &, 40*0b57cec5SDimitry Andric SBLineEntry, operator=,(const lldb::SBLineEntry &), rhs); 41*0b57cec5SDimitry Andric 42*0b57cec5SDimitry Andric if (this != &rhs) 43*0b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up); 44*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(*this); 45*0b57cec5SDimitry Andric } 46*0b57cec5SDimitry Andric 47*0b57cec5SDimitry Andric void SBLineEntry::SetLineEntry(const lldb_private::LineEntry &lldb_object_ref) { 48*0b57cec5SDimitry Andric m_opaque_up = llvm::make_unique<LineEntry>(lldb_object_ref); 49*0b57cec5SDimitry Andric } 50*0b57cec5SDimitry Andric 51*0b57cec5SDimitry Andric SBLineEntry::~SBLineEntry() {} 52*0b57cec5SDimitry Andric 53*0b57cec5SDimitry Andric SBAddress SBLineEntry::GetStartAddress() const { 54*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry, 55*0b57cec5SDimitry Andric GetStartAddress); 56*0b57cec5SDimitry Andric 57*0b57cec5SDimitry Andric SBAddress sb_address; 58*0b57cec5SDimitry Andric if (m_opaque_up) 59*0b57cec5SDimitry Andric sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress()); 60*0b57cec5SDimitry Andric 61*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_address); 62*0b57cec5SDimitry Andric } 63*0b57cec5SDimitry Andric 64*0b57cec5SDimitry Andric SBAddress SBLineEntry::GetEndAddress() const { 65*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry, GetEndAddress); 66*0b57cec5SDimitry Andric 67*0b57cec5SDimitry Andric SBAddress sb_address; 68*0b57cec5SDimitry Andric if (m_opaque_up) { 69*0b57cec5SDimitry Andric sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress()); 70*0b57cec5SDimitry Andric sb_address.OffsetAddress(m_opaque_up->range.GetByteSize()); 71*0b57cec5SDimitry Andric } 72*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_address); 73*0b57cec5SDimitry Andric } 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric bool SBLineEntry::IsValid() const { 76*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBLineEntry, IsValid); 77*0b57cec5SDimitry Andric return this->operator bool(); 78*0b57cec5SDimitry Andric } 79*0b57cec5SDimitry Andric SBLineEntry::operator bool() const { 80*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBLineEntry, operator bool); 81*0b57cec5SDimitry Andric 82*0b57cec5SDimitry Andric return m_opaque_up.get() && m_opaque_up->IsValid(); 83*0b57cec5SDimitry Andric } 84*0b57cec5SDimitry Andric 85*0b57cec5SDimitry Andric SBFileSpec SBLineEntry::GetFileSpec() const { 86*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBLineEntry, GetFileSpec); 87*0b57cec5SDimitry Andric 88*0b57cec5SDimitry Andric SBFileSpec sb_file_spec; 89*0b57cec5SDimitry Andric if (m_opaque_up.get() && m_opaque_up->file) 90*0b57cec5SDimitry Andric sb_file_spec.SetFileSpec(m_opaque_up->file); 91*0b57cec5SDimitry Andric 92*0b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_file_spec); 93*0b57cec5SDimitry Andric } 94*0b57cec5SDimitry Andric 95*0b57cec5SDimitry Andric uint32_t SBLineEntry::GetLine() const { 96*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetLine); 97*0b57cec5SDimitry Andric 98*0b57cec5SDimitry Andric uint32_t line = 0; 99*0b57cec5SDimitry Andric if (m_opaque_up) 100*0b57cec5SDimitry Andric line = m_opaque_up->line; 101*0b57cec5SDimitry Andric 102*0b57cec5SDimitry Andric return line; 103*0b57cec5SDimitry Andric } 104*0b57cec5SDimitry Andric 105*0b57cec5SDimitry Andric uint32_t SBLineEntry::GetColumn() const { 106*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetColumn); 107*0b57cec5SDimitry Andric 108*0b57cec5SDimitry Andric if (m_opaque_up) 109*0b57cec5SDimitry Andric return m_opaque_up->column; 110*0b57cec5SDimitry Andric return 0; 111*0b57cec5SDimitry Andric } 112*0b57cec5SDimitry Andric 113*0b57cec5SDimitry Andric void SBLineEntry::SetFileSpec(lldb::SBFileSpec filespec) { 114*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBLineEntry, SetFileSpec, (lldb::SBFileSpec), 115*0b57cec5SDimitry Andric filespec); 116*0b57cec5SDimitry Andric 117*0b57cec5SDimitry Andric if (filespec.IsValid()) 118*0b57cec5SDimitry Andric ref().file = filespec.ref(); 119*0b57cec5SDimitry Andric else 120*0b57cec5SDimitry Andric ref().file.Clear(); 121*0b57cec5SDimitry Andric } 122*0b57cec5SDimitry Andric void SBLineEntry::SetLine(uint32_t line) { 123*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBLineEntry, SetLine, (uint32_t), line); 124*0b57cec5SDimitry Andric 125*0b57cec5SDimitry Andric ref().line = line; 126*0b57cec5SDimitry Andric } 127*0b57cec5SDimitry Andric 128*0b57cec5SDimitry Andric void SBLineEntry::SetColumn(uint32_t column) { 129*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBLineEntry, SetColumn, (uint32_t), column); 130*0b57cec5SDimitry Andric 131*0b57cec5SDimitry Andric ref().line = column; 132*0b57cec5SDimitry Andric } 133*0b57cec5SDimitry Andric 134*0b57cec5SDimitry Andric bool SBLineEntry::operator==(const SBLineEntry &rhs) const { 135*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST( 136*0b57cec5SDimitry Andric bool, SBLineEntry, operator==,(const lldb::SBLineEntry &), rhs); 137*0b57cec5SDimitry Andric 138*0b57cec5SDimitry Andric lldb_private::LineEntry *lhs_ptr = m_opaque_up.get(); 139*0b57cec5SDimitry Andric lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get(); 140*0b57cec5SDimitry Andric 141*0b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr) 142*0b57cec5SDimitry Andric return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) == 0; 143*0b57cec5SDimitry Andric 144*0b57cec5SDimitry Andric return lhs_ptr == rhs_ptr; 145*0b57cec5SDimitry Andric } 146*0b57cec5SDimitry Andric 147*0b57cec5SDimitry Andric bool SBLineEntry::operator!=(const SBLineEntry &rhs) const { 148*0b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST( 149*0b57cec5SDimitry Andric bool, SBLineEntry, operator!=,(const lldb::SBLineEntry &), rhs); 150*0b57cec5SDimitry Andric 151*0b57cec5SDimitry Andric lldb_private::LineEntry *lhs_ptr = m_opaque_up.get(); 152*0b57cec5SDimitry Andric lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get(); 153*0b57cec5SDimitry Andric 154*0b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr) 155*0b57cec5SDimitry Andric return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) != 0; 156*0b57cec5SDimitry Andric 157*0b57cec5SDimitry Andric return lhs_ptr != rhs_ptr; 158*0b57cec5SDimitry Andric } 159*0b57cec5SDimitry Andric 160*0b57cec5SDimitry Andric const lldb_private::LineEntry *SBLineEntry::operator->() const { 161*0b57cec5SDimitry Andric return m_opaque_up.get(); 162*0b57cec5SDimitry Andric } 163*0b57cec5SDimitry Andric 164*0b57cec5SDimitry Andric lldb_private::LineEntry &SBLineEntry::ref() { 165*0b57cec5SDimitry Andric if (m_opaque_up == nullptr) 166*0b57cec5SDimitry Andric m_opaque_up.reset(new lldb_private::LineEntry()); 167*0b57cec5SDimitry Andric return *m_opaque_up; 168*0b57cec5SDimitry Andric } 169*0b57cec5SDimitry Andric 170*0b57cec5SDimitry Andric const lldb_private::LineEntry &SBLineEntry::ref() const { return *m_opaque_up; } 171*0b57cec5SDimitry Andric 172*0b57cec5SDimitry Andric bool SBLineEntry::GetDescription(SBStream &description) { 173*0b57cec5SDimitry Andric LLDB_RECORD_METHOD(bool, SBLineEntry, GetDescription, (lldb::SBStream &), 174*0b57cec5SDimitry Andric description); 175*0b57cec5SDimitry Andric 176*0b57cec5SDimitry Andric Stream &strm = description.ref(); 177*0b57cec5SDimitry Andric 178*0b57cec5SDimitry Andric if (m_opaque_up) { 179*0b57cec5SDimitry Andric char file_path[PATH_MAX * 2]; 180*0b57cec5SDimitry Andric m_opaque_up->file.GetPath(file_path, sizeof(file_path)); 181*0b57cec5SDimitry Andric strm.Printf("%s:%u", file_path, GetLine()); 182*0b57cec5SDimitry Andric if (GetColumn() > 0) 183*0b57cec5SDimitry Andric strm.Printf(":%u", GetColumn()); 184*0b57cec5SDimitry Andric } else 185*0b57cec5SDimitry Andric strm.PutCString("No value"); 186*0b57cec5SDimitry Andric 187*0b57cec5SDimitry Andric return true; 188*0b57cec5SDimitry Andric } 189*0b57cec5SDimitry Andric 190*0b57cec5SDimitry Andric lldb_private::LineEntry *SBLineEntry::get() { return m_opaque_up.get(); } 191*0b57cec5SDimitry Andric 192*0b57cec5SDimitry Andric namespace lldb_private { 193*0b57cec5SDimitry Andric namespace repro { 194*0b57cec5SDimitry Andric 195*0b57cec5SDimitry Andric template <> 196*0b57cec5SDimitry Andric void RegisterMethods<SBLineEntry>(Registry &R) { 197*0b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBLineEntry, ()); 198*0b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBLineEntry, (const lldb::SBLineEntry &)); 199*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(const lldb::SBLineEntry &, 200*0b57cec5SDimitry Andric SBLineEntry, operator=,(const lldb::SBLineEntry &)); 201*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBLineEntry, GetStartAddress, 202*0b57cec5SDimitry Andric ()); 203*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBLineEntry, GetEndAddress, ()); 204*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBLineEntry, IsValid, ()); 205*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBLineEntry, operator bool, ()); 206*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBLineEntry, GetFileSpec, ()); 207*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(uint32_t, SBLineEntry, GetLine, ()); 208*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(uint32_t, SBLineEntry, GetColumn, ()); 209*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBLineEntry, SetFileSpec, (lldb::SBFileSpec)); 210*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBLineEntry, SetLine, (uint32_t)); 211*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBLineEntry, SetColumn, (uint32_t)); 212*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST( 213*0b57cec5SDimitry Andric bool, SBLineEntry, operator==,(const lldb::SBLineEntry &)); 214*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST( 215*0b57cec5SDimitry Andric bool, SBLineEntry, operator!=,(const lldb::SBLineEntry &)); 216*0b57cec5SDimitry Andric LLDB_REGISTER_METHOD(bool, SBLineEntry, GetDescription, (lldb::SBStream &)); 217*0b57cec5SDimitry Andric } 218*0b57cec5SDimitry Andric 219*0b57cec5SDimitry Andric } 220*0b57cec5SDimitry Andric } 221