1*5ffd83dbSDimitry Andric //===-- SBLineEntry.cpp ---------------------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "lldb/API/SBLineEntry.h" 100b57cec5SDimitry Andric #include "SBReproducerPrivate.h" 110b57cec5SDimitry Andric #include "Utils.h" 120b57cec5SDimitry Andric #include "lldb/API/SBStream.h" 130b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h" 140b57cec5SDimitry Andric #include "lldb/Symbol/LineEntry.h" 150b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h" 160b57cec5SDimitry Andric 170b57cec5SDimitry Andric #include <limits.h> 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric using namespace lldb; 200b57cec5SDimitry Andric using namespace lldb_private; 210b57cec5SDimitry Andric 220b57cec5SDimitry Andric SBLineEntry::SBLineEntry() : m_opaque_up() { 230b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBLineEntry); 240b57cec5SDimitry Andric } 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric SBLineEntry::SBLineEntry(const SBLineEntry &rhs) : m_opaque_up() { 270b57cec5SDimitry Andric LLDB_RECORD_CONSTRUCTOR(SBLineEntry, (const lldb::SBLineEntry &), rhs); 280b57cec5SDimitry Andric 290b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up); 300b57cec5SDimitry Andric } 310b57cec5SDimitry Andric 320b57cec5SDimitry Andric SBLineEntry::SBLineEntry(const lldb_private::LineEntry *lldb_object_ptr) 330b57cec5SDimitry Andric : m_opaque_up() { 340b57cec5SDimitry Andric if (lldb_object_ptr) 359dba64beSDimitry Andric m_opaque_up = std::make_unique<LineEntry>(*lldb_object_ptr); 360b57cec5SDimitry Andric } 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric const SBLineEntry &SBLineEntry::operator=(const SBLineEntry &rhs) { 390b57cec5SDimitry Andric LLDB_RECORD_METHOD(const lldb::SBLineEntry &, 400b57cec5SDimitry Andric SBLineEntry, operator=,(const lldb::SBLineEntry &), rhs); 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric if (this != &rhs) 430b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up); 440b57cec5SDimitry Andric return LLDB_RECORD_RESULT(*this); 450b57cec5SDimitry Andric } 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric void SBLineEntry::SetLineEntry(const lldb_private::LineEntry &lldb_object_ref) { 489dba64beSDimitry Andric m_opaque_up = std::make_unique<LineEntry>(lldb_object_ref); 490b57cec5SDimitry Andric } 500b57cec5SDimitry Andric 51*5ffd83dbSDimitry Andric SBLineEntry::~SBLineEntry() = default; 520b57cec5SDimitry Andric 530b57cec5SDimitry Andric SBAddress SBLineEntry::GetStartAddress() const { 540b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry, 550b57cec5SDimitry Andric GetStartAddress); 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric SBAddress sb_address; 580b57cec5SDimitry Andric if (m_opaque_up) 590b57cec5SDimitry Andric sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress()); 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_address); 620b57cec5SDimitry Andric } 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric SBAddress SBLineEntry::GetEndAddress() const { 650b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBLineEntry, GetEndAddress); 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric SBAddress sb_address; 680b57cec5SDimitry Andric if (m_opaque_up) { 690b57cec5SDimitry Andric sb_address.SetAddress(&m_opaque_up->range.GetBaseAddress()); 700b57cec5SDimitry Andric sb_address.OffsetAddress(m_opaque_up->range.GetByteSize()); 710b57cec5SDimitry Andric } 720b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_address); 730b57cec5SDimitry Andric } 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric bool SBLineEntry::IsValid() const { 760b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBLineEntry, IsValid); 770b57cec5SDimitry Andric return this->operator bool(); 780b57cec5SDimitry Andric } 790b57cec5SDimitry Andric SBLineEntry::operator bool() const { 800b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBLineEntry, operator bool); 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric return m_opaque_up.get() && m_opaque_up->IsValid(); 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric SBFileSpec SBLineEntry::GetFileSpec() const { 860b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBLineEntry, GetFileSpec); 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric SBFileSpec sb_file_spec; 890b57cec5SDimitry Andric if (m_opaque_up.get() && m_opaque_up->file) 900b57cec5SDimitry Andric sb_file_spec.SetFileSpec(m_opaque_up->file); 910b57cec5SDimitry Andric 920b57cec5SDimitry Andric return LLDB_RECORD_RESULT(sb_file_spec); 930b57cec5SDimitry Andric } 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric uint32_t SBLineEntry::GetLine() const { 960b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetLine); 970b57cec5SDimitry Andric 980b57cec5SDimitry Andric uint32_t line = 0; 990b57cec5SDimitry Andric if (m_opaque_up) 1000b57cec5SDimitry Andric line = m_opaque_up->line; 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric return line; 1030b57cec5SDimitry Andric } 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric uint32_t SBLineEntry::GetColumn() const { 1060b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBLineEntry, GetColumn); 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric if (m_opaque_up) 1090b57cec5SDimitry Andric return m_opaque_up->column; 1100b57cec5SDimitry Andric return 0; 1110b57cec5SDimitry Andric } 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric void SBLineEntry::SetFileSpec(lldb::SBFileSpec filespec) { 1140b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBLineEntry, SetFileSpec, (lldb::SBFileSpec), 1150b57cec5SDimitry Andric filespec); 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric if (filespec.IsValid()) 1180b57cec5SDimitry Andric ref().file = filespec.ref(); 1190b57cec5SDimitry Andric else 1200b57cec5SDimitry Andric ref().file.Clear(); 1210b57cec5SDimitry Andric } 1220b57cec5SDimitry Andric void SBLineEntry::SetLine(uint32_t line) { 1230b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBLineEntry, SetLine, (uint32_t), line); 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric ref().line = line; 1260b57cec5SDimitry Andric } 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric void SBLineEntry::SetColumn(uint32_t column) { 1290b57cec5SDimitry Andric LLDB_RECORD_METHOD(void, SBLineEntry, SetColumn, (uint32_t), column); 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric ref().line = column; 1320b57cec5SDimitry Andric } 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric bool SBLineEntry::operator==(const SBLineEntry &rhs) const { 1350b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST( 1360b57cec5SDimitry Andric bool, SBLineEntry, operator==,(const lldb::SBLineEntry &), rhs); 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric lldb_private::LineEntry *lhs_ptr = m_opaque_up.get(); 1390b57cec5SDimitry Andric lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get(); 1400b57cec5SDimitry Andric 1410b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr) 1420b57cec5SDimitry Andric return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) == 0; 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric return lhs_ptr == rhs_ptr; 1450b57cec5SDimitry Andric } 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric bool SBLineEntry::operator!=(const SBLineEntry &rhs) const { 1480b57cec5SDimitry Andric LLDB_RECORD_METHOD_CONST( 1490b57cec5SDimitry Andric bool, SBLineEntry, operator!=,(const lldb::SBLineEntry &), rhs); 1500b57cec5SDimitry Andric 1510b57cec5SDimitry Andric lldb_private::LineEntry *lhs_ptr = m_opaque_up.get(); 1520b57cec5SDimitry Andric lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get(); 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr) 1550b57cec5SDimitry Andric return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) != 0; 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric return lhs_ptr != rhs_ptr; 1580b57cec5SDimitry Andric } 1590b57cec5SDimitry Andric 1600b57cec5SDimitry Andric const lldb_private::LineEntry *SBLineEntry::operator->() const { 1610b57cec5SDimitry Andric return m_opaque_up.get(); 1620b57cec5SDimitry Andric } 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric lldb_private::LineEntry &SBLineEntry::ref() { 1650b57cec5SDimitry Andric if (m_opaque_up == nullptr) 166*5ffd83dbSDimitry Andric m_opaque_up = std::make_unique<lldb_private::LineEntry>(); 1670b57cec5SDimitry Andric return *m_opaque_up; 1680b57cec5SDimitry Andric } 1690b57cec5SDimitry Andric 1700b57cec5SDimitry Andric const lldb_private::LineEntry &SBLineEntry::ref() const { return *m_opaque_up; } 1710b57cec5SDimitry Andric 1720b57cec5SDimitry Andric bool SBLineEntry::GetDescription(SBStream &description) { 1730b57cec5SDimitry Andric LLDB_RECORD_METHOD(bool, SBLineEntry, GetDescription, (lldb::SBStream &), 1740b57cec5SDimitry Andric description); 1750b57cec5SDimitry Andric 1760b57cec5SDimitry Andric Stream &strm = description.ref(); 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric if (m_opaque_up) { 1790b57cec5SDimitry Andric char file_path[PATH_MAX * 2]; 1800b57cec5SDimitry Andric m_opaque_up->file.GetPath(file_path, sizeof(file_path)); 1810b57cec5SDimitry Andric strm.Printf("%s:%u", file_path, GetLine()); 1820b57cec5SDimitry Andric if (GetColumn() > 0) 1830b57cec5SDimitry Andric strm.Printf(":%u", GetColumn()); 1840b57cec5SDimitry Andric } else 1850b57cec5SDimitry Andric strm.PutCString("No value"); 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric return true; 1880b57cec5SDimitry Andric } 1890b57cec5SDimitry Andric 1900b57cec5SDimitry Andric lldb_private::LineEntry *SBLineEntry::get() { return m_opaque_up.get(); } 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric namespace lldb_private { 1930b57cec5SDimitry Andric namespace repro { 1940b57cec5SDimitry Andric 1950b57cec5SDimitry Andric template <> 1960b57cec5SDimitry Andric void RegisterMethods<SBLineEntry>(Registry &R) { 1970b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBLineEntry, ()); 1980b57cec5SDimitry Andric LLDB_REGISTER_CONSTRUCTOR(SBLineEntry, (const lldb::SBLineEntry &)); 1990b57cec5SDimitry Andric LLDB_REGISTER_METHOD(const lldb::SBLineEntry &, 2000b57cec5SDimitry Andric SBLineEntry, operator=,(const lldb::SBLineEntry &)); 2010b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBLineEntry, GetStartAddress, 2020b57cec5SDimitry Andric ()); 2030b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBLineEntry, GetEndAddress, ()); 2040b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBLineEntry, IsValid, ()); 2050b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(bool, SBLineEntry, operator bool, ()); 2060b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBLineEntry, GetFileSpec, ()); 2070b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(uint32_t, SBLineEntry, GetLine, ()); 2080b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST(uint32_t, SBLineEntry, GetColumn, ()); 2090b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBLineEntry, SetFileSpec, (lldb::SBFileSpec)); 2100b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBLineEntry, SetLine, (uint32_t)); 2110b57cec5SDimitry Andric LLDB_REGISTER_METHOD(void, SBLineEntry, SetColumn, (uint32_t)); 2120b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST( 2130b57cec5SDimitry Andric bool, SBLineEntry, operator==,(const lldb::SBLineEntry &)); 2140b57cec5SDimitry Andric LLDB_REGISTER_METHOD_CONST( 2150b57cec5SDimitry Andric bool, SBLineEntry, operator!=,(const lldb::SBLineEntry &)); 2160b57cec5SDimitry Andric LLDB_REGISTER_METHOD(bool, SBLineEntry, GetDescription, (lldb::SBStream &)); 2170b57cec5SDimitry Andric } 2180b57cec5SDimitry Andric 2190b57cec5SDimitry Andric } 2200b57cec5SDimitry Andric } 221