1254721Semaste//===-- SBLineEntry.cpp -----------------------------------------*- C++ -*-===// 2254721Semaste// 3254721Semaste// The LLVM Compiler Infrastructure 4254721Semaste// 5254721Semaste// This file is distributed under the University of Illinois Open Source 6254721Semaste// License. See LICENSE.TXT for details. 7254721Semaste// 8254721Semaste//===----------------------------------------------------------------------===// 9254721Semaste 10254721Semaste#include <limits.h> 11254721Semaste 12254721Semaste#include "lldb/API/SBLineEntry.h" 13254721Semaste#include "lldb/API/SBStream.h" 14254721Semaste#include "lldb/Core/StreamString.h" 15254721Semaste#include "lldb/Core/Log.h" 16254721Semaste#include "lldb/Symbol/LineEntry.h" 17254721Semaste 18254721Semasteusing namespace lldb; 19254721Semasteusing namespace lldb_private; 20254721Semaste 21254721Semaste 22254721SemasteSBLineEntry::SBLineEntry () : 23254721Semaste m_opaque_ap () 24254721Semaste{ 25254721Semaste} 26254721Semaste 27254721SemasteSBLineEntry::SBLineEntry (const SBLineEntry &rhs) : 28254721Semaste m_opaque_ap () 29254721Semaste{ 30254721Semaste if (rhs.IsValid()) 31254721Semaste ref() = rhs.ref(); 32254721Semaste} 33254721Semaste 34254721SemasteSBLineEntry::SBLineEntry (const lldb_private::LineEntry *lldb_object_ptr) : 35254721Semaste m_opaque_ap () 36254721Semaste{ 37254721Semaste if (lldb_object_ptr) 38254721Semaste ref() = *lldb_object_ptr; 39254721Semaste} 40254721Semaste 41254721Semasteconst SBLineEntry & 42254721SemasteSBLineEntry::operator = (const SBLineEntry &rhs) 43254721Semaste{ 44254721Semaste if (this != &rhs) 45254721Semaste { 46254721Semaste if (rhs.IsValid()) 47254721Semaste ref() = rhs.ref(); 48254721Semaste else 49254721Semaste m_opaque_ap.reset(); 50254721Semaste } 51254721Semaste return *this; 52254721Semaste} 53254721Semaste 54254721Semastevoid 55254721SemasteSBLineEntry::SetLineEntry (const lldb_private::LineEntry &lldb_object_ref) 56254721Semaste{ 57254721Semaste ref() = lldb_object_ref; 58254721Semaste} 59254721Semaste 60254721Semaste 61254721SemasteSBLineEntry::~SBLineEntry () 62254721Semaste{ 63254721Semaste} 64254721Semaste 65254721Semaste 66254721SemasteSBAddress 67254721SemasteSBLineEntry::GetStartAddress () const 68254721Semaste{ 69254721Semaste 70254721Semaste SBAddress sb_address; 71254721Semaste if (m_opaque_ap.get()) 72254721Semaste sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress()); 73254721Semaste 74254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 75254721Semaste if (log) 76254721Semaste { 77254721Semaste StreamString sstr; 78254721Semaste const Address *addr = sb_address.get(); 79254721Semaste if (addr) 80254721Semaste addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 81254721Semaste log->Printf ("SBLineEntry(%p)::GetStartAddress () => SBAddress (%p): %s", 82254721Semaste m_opaque_ap.get(), sb_address.get(), sstr.GetData()); 83254721Semaste } 84254721Semaste 85254721Semaste return sb_address; 86254721Semaste} 87254721Semaste 88254721SemasteSBAddress 89254721SemasteSBLineEntry::GetEndAddress () const 90254721Semaste{ 91254721Semaste SBAddress sb_address; 92254721Semaste if (m_opaque_ap.get()) 93254721Semaste { 94254721Semaste sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress()); 95254721Semaste sb_address.OffsetAddress(m_opaque_ap->range.GetByteSize()); 96254721Semaste } 97254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 98254721Semaste if (log) 99254721Semaste { 100254721Semaste StreamString sstr; 101254721Semaste const Address *addr = sb_address.get(); 102254721Semaste if (addr) 103254721Semaste addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 104254721Semaste log->Printf ("SBLineEntry(%p)::GetEndAddress () => SBAddress (%p): %s", 105254721Semaste m_opaque_ap.get(), sb_address.get(), sstr.GetData()); 106254721Semaste } 107254721Semaste return sb_address; 108254721Semaste} 109254721Semaste 110254721Semastebool 111254721SemasteSBLineEntry::IsValid () const 112254721Semaste{ 113254721Semaste return m_opaque_ap.get() && m_opaque_ap->IsValid(); 114254721Semaste} 115254721Semaste 116254721Semaste 117254721SemasteSBFileSpec 118254721SemasteSBLineEntry::GetFileSpec () const 119254721Semaste{ 120254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 121254721Semaste 122254721Semaste SBFileSpec sb_file_spec; 123254721Semaste if (m_opaque_ap.get() && m_opaque_ap->file) 124254721Semaste sb_file_spec.SetFileSpec(m_opaque_ap->file); 125254721Semaste 126254721Semaste if (log) 127254721Semaste { 128254721Semaste SBStream sstr; 129254721Semaste sb_file_spec.GetDescription (sstr); 130254721Semaste log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(), 131254721Semaste sb_file_spec.get(), sstr.GetData()); 132254721Semaste } 133254721Semaste 134254721Semaste return sb_file_spec; 135254721Semaste} 136254721Semaste 137254721Semasteuint32_t 138254721SemasteSBLineEntry::GetLine () const 139254721Semaste{ 140254721Semaste Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 141254721Semaste 142254721Semaste uint32_t line = 0; 143254721Semaste if (m_opaque_ap.get()) 144254721Semaste line = m_opaque_ap->line; 145254721Semaste 146254721Semaste if (log) 147254721Semaste log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line); 148254721Semaste 149254721Semaste return line; 150254721Semaste} 151254721Semaste 152254721Semaste 153254721Semasteuint32_t 154254721SemasteSBLineEntry::GetColumn () const 155254721Semaste{ 156254721Semaste if (m_opaque_ap.get()) 157254721Semaste return m_opaque_ap->column; 158254721Semaste return 0; 159254721Semaste} 160254721Semaste 161254721Semastevoid 162254721SemasteSBLineEntry::SetFileSpec (lldb::SBFileSpec filespec) 163254721Semaste{ 164254721Semaste if (filespec.IsValid()) 165254721Semaste ref().file = filespec.ref(); 166254721Semaste else 167254721Semaste ref().file.Clear(); 168254721Semaste} 169254721Semastevoid 170254721SemasteSBLineEntry::SetLine (uint32_t line) 171254721Semaste{ 172254721Semaste ref().line = line; 173254721Semaste} 174254721Semaste 175254721Semastevoid 176254721SemasteSBLineEntry::SetColumn (uint32_t column) 177254721Semaste{ 178254721Semaste ref().line = column; 179254721Semaste} 180254721Semaste 181254721Semaste 182254721Semaste 183254721Semastebool 184254721SemasteSBLineEntry::operator == (const SBLineEntry &rhs) const 185254721Semaste{ 186254721Semaste lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get(); 187254721Semaste lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get(); 188254721Semaste 189254721Semaste if (lhs_ptr && rhs_ptr) 190254721Semaste return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) == 0; 191254721Semaste 192254721Semaste return lhs_ptr == rhs_ptr; 193254721Semaste} 194254721Semaste 195254721Semastebool 196254721SemasteSBLineEntry::operator != (const SBLineEntry &rhs) const 197254721Semaste{ 198254721Semaste lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get(); 199254721Semaste lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get(); 200254721Semaste 201254721Semaste if (lhs_ptr && rhs_ptr) 202254721Semaste return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) != 0; 203254721Semaste 204254721Semaste return lhs_ptr != rhs_ptr; 205254721Semaste} 206254721Semaste 207254721Semasteconst lldb_private::LineEntry * 208254721SemasteSBLineEntry::operator->() const 209254721Semaste{ 210254721Semaste return m_opaque_ap.get(); 211254721Semaste} 212254721Semaste 213254721Semastelldb_private::LineEntry & 214254721SemasteSBLineEntry::ref() 215254721Semaste{ 216254721Semaste if (m_opaque_ap.get() == NULL) 217254721Semaste m_opaque_ap.reset (new lldb_private::LineEntry ()); 218254721Semaste return *m_opaque_ap; 219254721Semaste} 220254721Semaste 221254721Semasteconst lldb_private::LineEntry & 222254721SemasteSBLineEntry::ref() const 223254721Semaste{ 224254721Semaste return *m_opaque_ap; 225254721Semaste} 226254721Semaste 227254721Semastebool 228254721SemasteSBLineEntry::GetDescription (SBStream &description) 229254721Semaste{ 230254721Semaste Stream &strm = description.ref(); 231254721Semaste 232254721Semaste if (m_opaque_ap.get()) 233254721Semaste { 234254721Semaste char file_path[PATH_MAX*2]; 235254721Semaste m_opaque_ap->file.GetPath (file_path, sizeof (file_path)); 236254721Semaste strm.Printf ("%s:%u", file_path, GetLine()); 237254721Semaste if (GetColumn() > 0) 238254721Semaste strm.Printf (":%u", GetColumn()); 239254721Semaste } 240254721Semaste else 241254721Semaste strm.PutCString ("No value"); 242254721Semaste 243254721Semaste return true; 244254721Semaste} 245254721Semaste 246254721Semastelldb_private::LineEntry * 247254721SemasteSBLineEntry::get () 248254721Semaste{ 249254721Semaste return m_opaque_ap.get(); 250254721Semaste} 251