15ffd83dbSDimitry 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 "Utils.h" 110b57cec5SDimitry Andric #include "lldb/API/SBStream.h" 120b57cec5SDimitry Andric #include "lldb/Host/PosixApi.h" 130b57cec5SDimitry Andric #include "lldb/Symbol/LineEntry.h" 14*04eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h" 150b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h" 160b57cec5SDimitry Andric 17fe6060f1SDimitry Andric #include <climits> 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric using namespace lldb; 200b57cec5SDimitry Andric using namespace lldb_private; 210b57cec5SDimitry Andric 22*04eeddc0SDimitry Andric SBLineEntry::SBLineEntry() { LLDB_INSTRUMENT_VA(this); } 230b57cec5SDimitry Andric 24*04eeddc0SDimitry Andric SBLineEntry::SBLineEntry(const SBLineEntry &rhs) { 25*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 260b57cec5SDimitry Andric 270b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up); 280b57cec5SDimitry Andric } 290b57cec5SDimitry Andric 30*04eeddc0SDimitry Andric SBLineEntry::SBLineEntry(const lldb_private::LineEntry *lldb_object_ptr) { 310b57cec5SDimitry Andric if (lldb_object_ptr) 329dba64beSDimitry Andric m_opaque_up = std::make_unique<LineEntry>(*lldb_object_ptr); 330b57cec5SDimitry Andric } 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric const SBLineEntry &SBLineEntry::operator=(const SBLineEntry &rhs) { 36*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 370b57cec5SDimitry Andric 380b57cec5SDimitry Andric if (this != &rhs) 390b57cec5SDimitry Andric m_opaque_up = clone(rhs.m_opaque_up); 40*04eeddc0SDimitry Andric return *this; 410b57cec5SDimitry Andric } 420b57cec5SDimitry Andric 430b57cec5SDimitry Andric void SBLineEntry::SetLineEntry(const lldb_private::LineEntry &lldb_object_ref) { 449dba64beSDimitry Andric m_opaque_up = std::make_unique<LineEntry>(lldb_object_ref); 450b57cec5SDimitry Andric } 460b57cec5SDimitry Andric 475ffd83dbSDimitry Andric SBLineEntry::~SBLineEntry() = default; 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric SBAddress SBLineEntry::GetStartAddress() const { 50*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 510b57cec5SDimitry Andric 520b57cec5SDimitry Andric SBAddress sb_address; 530b57cec5SDimitry Andric if (m_opaque_up) 54e8d8bef9SDimitry Andric sb_address.SetAddress(m_opaque_up->range.GetBaseAddress()); 550b57cec5SDimitry Andric 56*04eeddc0SDimitry Andric return sb_address; 570b57cec5SDimitry Andric } 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric SBAddress SBLineEntry::GetEndAddress() const { 60*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 610b57cec5SDimitry Andric 620b57cec5SDimitry Andric SBAddress sb_address; 630b57cec5SDimitry Andric if (m_opaque_up) { 64e8d8bef9SDimitry Andric sb_address.SetAddress(m_opaque_up->range.GetBaseAddress()); 650b57cec5SDimitry Andric sb_address.OffsetAddress(m_opaque_up->range.GetByteSize()); 660b57cec5SDimitry Andric } 67*04eeddc0SDimitry Andric return sb_address; 680b57cec5SDimitry Andric } 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric bool SBLineEntry::IsValid() const { 71*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 720b57cec5SDimitry Andric return this->operator bool(); 730b57cec5SDimitry Andric } 740b57cec5SDimitry Andric SBLineEntry::operator bool() const { 75*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 760b57cec5SDimitry Andric 770b57cec5SDimitry Andric return m_opaque_up.get() && m_opaque_up->IsValid(); 780b57cec5SDimitry Andric } 790b57cec5SDimitry Andric 800b57cec5SDimitry Andric SBFileSpec SBLineEntry::GetFileSpec() const { 81*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 820b57cec5SDimitry Andric 830b57cec5SDimitry Andric SBFileSpec sb_file_spec; 840b57cec5SDimitry Andric if (m_opaque_up.get() && m_opaque_up->file) 850b57cec5SDimitry Andric sb_file_spec.SetFileSpec(m_opaque_up->file); 860b57cec5SDimitry Andric 87*04eeddc0SDimitry Andric return sb_file_spec; 880b57cec5SDimitry Andric } 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric uint32_t SBLineEntry::GetLine() const { 91*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 920b57cec5SDimitry Andric 930b57cec5SDimitry Andric uint32_t line = 0; 940b57cec5SDimitry Andric if (m_opaque_up) 950b57cec5SDimitry Andric line = m_opaque_up->line; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric return line; 980b57cec5SDimitry Andric } 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric uint32_t SBLineEntry::GetColumn() const { 101*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric if (m_opaque_up) 1040b57cec5SDimitry Andric return m_opaque_up->column; 1050b57cec5SDimitry Andric return 0; 1060b57cec5SDimitry Andric } 1070b57cec5SDimitry Andric 1080b57cec5SDimitry Andric void SBLineEntry::SetFileSpec(lldb::SBFileSpec filespec) { 109*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, filespec); 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric if (filespec.IsValid()) 1120b57cec5SDimitry Andric ref().file = filespec.ref(); 1130b57cec5SDimitry Andric else 1140b57cec5SDimitry Andric ref().file.Clear(); 1150b57cec5SDimitry Andric } 1160b57cec5SDimitry Andric void SBLineEntry::SetLine(uint32_t line) { 117*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, line); 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric ref().line = line; 1200b57cec5SDimitry Andric } 1210b57cec5SDimitry Andric 1220b57cec5SDimitry Andric void SBLineEntry::SetColumn(uint32_t column) { 123*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, column); 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric ref().line = column; 1260b57cec5SDimitry Andric } 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric bool SBLineEntry::operator==(const SBLineEntry &rhs) const { 129*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric lldb_private::LineEntry *lhs_ptr = m_opaque_up.get(); 1320b57cec5SDimitry Andric lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get(); 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr) 1350b57cec5SDimitry Andric return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) == 0; 1360b57cec5SDimitry Andric 1370b57cec5SDimitry Andric return lhs_ptr == rhs_ptr; 1380b57cec5SDimitry Andric } 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric bool SBLineEntry::operator!=(const SBLineEntry &rhs) const { 141*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric lldb_private::LineEntry *lhs_ptr = m_opaque_up.get(); 1440b57cec5SDimitry Andric lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_up.get(); 1450b57cec5SDimitry Andric 1460b57cec5SDimitry Andric if (lhs_ptr && rhs_ptr) 1470b57cec5SDimitry Andric return lldb_private::LineEntry::Compare(*lhs_ptr, *rhs_ptr) != 0; 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andric return lhs_ptr != rhs_ptr; 1500b57cec5SDimitry Andric } 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric const lldb_private::LineEntry *SBLineEntry::operator->() const { 1530b57cec5SDimitry Andric return m_opaque_up.get(); 1540b57cec5SDimitry Andric } 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric lldb_private::LineEntry &SBLineEntry::ref() { 1570b57cec5SDimitry Andric if (m_opaque_up == nullptr) 1585ffd83dbSDimitry Andric m_opaque_up = std::make_unique<lldb_private::LineEntry>(); 1590b57cec5SDimitry Andric return *m_opaque_up; 1600b57cec5SDimitry Andric } 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric const lldb_private::LineEntry &SBLineEntry::ref() const { return *m_opaque_up; } 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric bool SBLineEntry::GetDescription(SBStream &description) { 165*04eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, description); 1660b57cec5SDimitry Andric 1670b57cec5SDimitry Andric Stream &strm = description.ref(); 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric if (m_opaque_up) { 1700b57cec5SDimitry Andric char file_path[PATH_MAX * 2]; 1710b57cec5SDimitry Andric m_opaque_up->file.GetPath(file_path, sizeof(file_path)); 1720b57cec5SDimitry Andric strm.Printf("%s:%u", file_path, GetLine()); 1730b57cec5SDimitry Andric if (GetColumn() > 0) 1740b57cec5SDimitry Andric strm.Printf(":%u", GetColumn()); 1750b57cec5SDimitry Andric } else 1760b57cec5SDimitry Andric strm.PutCString("No value"); 1770b57cec5SDimitry Andric 1780b57cec5SDimitry Andric return true; 1790b57cec5SDimitry Andric } 1800b57cec5SDimitry Andric 1810b57cec5SDimitry Andric lldb_private::LineEntry *SBLineEntry::get() { return m_opaque_up.get(); } 182