130fdc8d8SChris Lattner //===-- SBLineEntry.cpp -----------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 330fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 430fdc8d8SChris Lattner // 530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 630fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 730fdc8d8SChris Lattner // 830fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 930fdc8d8SChris Lattner 1030fdc8d8SChris Lattner #include "lldb/API/SBLineEntry.h" 11dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 12*cfd1acedSGreg Clayton #include "lldb/Core/StreamString.h" 13ceb6b139SCaroline Tice #include "lldb/Core/Log.h" 14*cfd1acedSGreg Clayton #include "lldb/Symbol/LineEntry.h" 1530fdc8d8SChris Lattner 1630fdc8d8SChris Lattner using namespace lldb; 17ceb6b139SCaroline Tice using namespace lldb_private; 1830fdc8d8SChris Lattner 1930fdc8d8SChris Lattner 2030fdc8d8SChris Lattner SBLineEntry::SBLineEntry () : 216611103cSGreg Clayton m_opaque_ap () 2230fdc8d8SChris Lattner { 2330fdc8d8SChris Lattner } 2430fdc8d8SChris Lattner 2530fdc8d8SChris Lattner SBLineEntry::SBLineEntry (const SBLineEntry &rhs) : 266611103cSGreg Clayton m_opaque_ap () 2730fdc8d8SChris Lattner { 2830fdc8d8SChris Lattner if (rhs.IsValid()) 296611103cSGreg Clayton m_opaque_ap.reset (new lldb_private::LineEntry (*rhs)); 3030fdc8d8SChris Lattner } 31ceb6b139SCaroline Tice 3230fdc8d8SChris Lattner 3330fdc8d8SChris Lattner 3430fdc8d8SChris Lattner SBLineEntry::SBLineEntry (const lldb_private::LineEntry *lldb_object_ptr) : 356611103cSGreg Clayton m_opaque_ap () 3630fdc8d8SChris Lattner { 3730fdc8d8SChris Lattner if (lldb_object_ptr) 386611103cSGreg Clayton m_opaque_ap.reset (new lldb_private::LineEntry(*lldb_object_ptr)); 3930fdc8d8SChris Lattner } 4030fdc8d8SChris Lattner 4130fdc8d8SChris Lattner const SBLineEntry & 4230fdc8d8SChris Lattner SBLineEntry::operator = (const SBLineEntry &rhs) 4330fdc8d8SChris Lattner { 44*cfd1acedSGreg Clayton if (this != &rhs && rhs.IsValid()) 456611103cSGreg Clayton m_opaque_ap.reset (new lldb_private::LineEntry(*rhs)); 4630fdc8d8SChris Lattner return *this; 4730fdc8d8SChris Lattner } 4830fdc8d8SChris Lattner 4930fdc8d8SChris Lattner void 5030fdc8d8SChris Lattner SBLineEntry::SetLineEntry (const lldb_private::LineEntry &lldb_object_ref) 5130fdc8d8SChris Lattner { 526611103cSGreg Clayton if (m_opaque_ap.get()) 536611103cSGreg Clayton (*m_opaque_ap.get()) = lldb_object_ref; 5430fdc8d8SChris Lattner else 556611103cSGreg Clayton m_opaque_ap.reset (new lldb_private::LineEntry (lldb_object_ref)); 5630fdc8d8SChris Lattner } 5730fdc8d8SChris Lattner 5830fdc8d8SChris Lattner 5930fdc8d8SChris Lattner SBLineEntry::~SBLineEntry () 6030fdc8d8SChris Lattner { 6130fdc8d8SChris Lattner } 6230fdc8d8SChris Lattner 6330fdc8d8SChris Lattner 6430fdc8d8SChris Lattner SBAddress 6530fdc8d8SChris Lattner SBLineEntry::GetStartAddress () const 6630fdc8d8SChris Lattner { 67ceb6b139SCaroline Tice 6830fdc8d8SChris Lattner SBAddress sb_address; 696611103cSGreg Clayton if (m_opaque_ap.get()) 706611103cSGreg Clayton sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress()); 71ceb6b139SCaroline Tice 72*cfd1acedSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 73ceb6b139SCaroline Tice if (log) 74ceb6b139SCaroline Tice { 75*cfd1acedSGreg Clayton StreamString sstr; 76*cfd1acedSGreg Clayton if (sb_address.get()) 77*cfd1acedSGreg Clayton sb_address->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 78*cfd1acedSGreg Clayton log->Printf ("SBLineEntry(%p)::GetStartAddress () => SBAddress (%p): %s", 79*cfd1acedSGreg Clayton m_opaque_ap.get(), sb_address.get(), sstr.GetData()); 80ceb6b139SCaroline Tice } 81ceb6b139SCaroline Tice 8230fdc8d8SChris Lattner return sb_address; 8330fdc8d8SChris Lattner } 8430fdc8d8SChris Lattner 8530fdc8d8SChris Lattner SBAddress 8630fdc8d8SChris Lattner SBLineEntry::GetEndAddress () const 8730fdc8d8SChris Lattner { 8830fdc8d8SChris Lattner SBAddress sb_address; 896611103cSGreg Clayton if (m_opaque_ap.get()) 9030fdc8d8SChris Lattner { 916611103cSGreg Clayton sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress()); 926611103cSGreg Clayton sb_address.OffsetAddress(m_opaque_ap->range.GetByteSize()); 9330fdc8d8SChris Lattner } 94*cfd1acedSGreg Clayton Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 95*cfd1acedSGreg Clayton if (log) 96*cfd1acedSGreg Clayton { 97*cfd1acedSGreg Clayton StreamString sstr; 98*cfd1acedSGreg Clayton if (sb_address.get()) 99*cfd1acedSGreg Clayton sb_address->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 100*cfd1acedSGreg Clayton log->Printf ("SBLineEntry(%p)::GetEndAddress () => SBAddress (%p): %s", 101*cfd1acedSGreg Clayton m_opaque_ap.get(), sb_address.get(), sstr.GetData()); 102*cfd1acedSGreg Clayton } 10330fdc8d8SChris Lattner return sb_address; 10430fdc8d8SChris Lattner } 10530fdc8d8SChris Lattner 10630fdc8d8SChris Lattner bool 10730fdc8d8SChris Lattner SBLineEntry::IsValid () const 10830fdc8d8SChris Lattner { 1096611103cSGreg Clayton return m_opaque_ap.get() != NULL; 11030fdc8d8SChris Lattner } 11130fdc8d8SChris Lattner 11230fdc8d8SChris Lattner 11330fdc8d8SChris Lattner SBFileSpec 11430fdc8d8SChris Lattner SBLineEntry::GetFileSpec () const 11530fdc8d8SChris Lattner { 116ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 117ceb6b139SCaroline Tice 11830fdc8d8SChris Lattner SBFileSpec sb_file_spec; 1196611103cSGreg Clayton if (m_opaque_ap.get() && m_opaque_ap->file) 1206611103cSGreg Clayton sb_file_spec.SetFileSpec(m_opaque_ap->file); 121ceb6b139SCaroline Tice 122ceb6b139SCaroline Tice if (log) 123ceb6b139SCaroline Tice { 124ceb6b139SCaroline Tice SBStream sstr; 125ceb6b139SCaroline Tice sb_file_spec.GetDescription (sstr); 126*cfd1acedSGreg Clayton log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(), 127750cd175SCaroline Tice sb_file_spec.get(), sstr.GetData()); 128ceb6b139SCaroline Tice } 129ceb6b139SCaroline Tice 13030fdc8d8SChris Lattner return sb_file_spec; 13130fdc8d8SChris Lattner } 13230fdc8d8SChris Lattner 13330fdc8d8SChris Lattner uint32_t 13430fdc8d8SChris Lattner SBLineEntry::GetLine () const 13530fdc8d8SChris Lattner { 136ceb6b139SCaroline Tice Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API); 137ceb6b139SCaroline Tice 138ceb6b139SCaroline Tice uint32_t line = 0; 1396611103cSGreg Clayton if (m_opaque_ap.get()) 140ceb6b139SCaroline Tice line = m_opaque_ap->line; 141ceb6b139SCaroline Tice 142ceb6b139SCaroline Tice if (log) 143*cfd1acedSGreg Clayton log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line); 144ceb6b139SCaroline Tice 145ceb6b139SCaroline Tice return line; 14630fdc8d8SChris Lattner } 14730fdc8d8SChris Lattner 14830fdc8d8SChris Lattner 14930fdc8d8SChris Lattner uint32_t 15030fdc8d8SChris Lattner SBLineEntry::GetColumn () const 15130fdc8d8SChris Lattner { 1526611103cSGreg Clayton if (m_opaque_ap.get()) 1536611103cSGreg Clayton return m_opaque_ap->column; 15430fdc8d8SChris Lattner return 0; 15530fdc8d8SChris Lattner } 15630fdc8d8SChris Lattner 15730fdc8d8SChris Lattner bool 15830fdc8d8SChris Lattner SBLineEntry::operator == (const SBLineEntry &rhs) const 15930fdc8d8SChris Lattner { 1606611103cSGreg Clayton lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get(); 1616611103cSGreg Clayton lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get(); 16230fdc8d8SChris Lattner 16330fdc8d8SChris Lattner if (lhs_ptr && rhs_ptr) 16430fdc8d8SChris Lattner return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) == 0; 16530fdc8d8SChris Lattner 16630fdc8d8SChris Lattner return lhs_ptr == rhs_ptr; 16730fdc8d8SChris Lattner } 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner bool 17030fdc8d8SChris Lattner SBLineEntry::operator != (const SBLineEntry &rhs) const 17130fdc8d8SChris Lattner { 1726611103cSGreg Clayton lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get(); 1736611103cSGreg Clayton lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get(); 17430fdc8d8SChris Lattner 17530fdc8d8SChris Lattner if (lhs_ptr && rhs_ptr) 17630fdc8d8SChris Lattner return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) != 0; 17730fdc8d8SChris Lattner 17830fdc8d8SChris Lattner return lhs_ptr != rhs_ptr; 17930fdc8d8SChris Lattner } 18030fdc8d8SChris Lattner 18130fdc8d8SChris Lattner const lldb_private::LineEntry * 18230fdc8d8SChris Lattner SBLineEntry::operator->() const 18330fdc8d8SChris Lattner { 1846611103cSGreg Clayton return m_opaque_ap.get(); 18530fdc8d8SChris Lattner } 18630fdc8d8SChris Lattner 18730fdc8d8SChris Lattner const lldb_private::LineEntry & 18830fdc8d8SChris Lattner SBLineEntry::operator*() const 18930fdc8d8SChris Lattner { 1906611103cSGreg Clayton return *m_opaque_ap; 19130fdc8d8SChris Lattner } 19230fdc8d8SChris Lattner 193dde9cff3SCaroline Tice bool 194dde9cff3SCaroline Tice SBLineEntry::GetDescription (SBStream &description) 195dde9cff3SCaroline Tice { 196dde9cff3SCaroline Tice if (m_opaque_ap.get()) 197dde9cff3SCaroline Tice { 198dde9cff3SCaroline Tice char file_path[PATH_MAX*2]; 199dde9cff3SCaroline Tice m_opaque_ap->file.GetPath (file_path, sizeof (file_path)); 200*cfd1acedSGreg Clayton description.Printf ("%s:%u", file_path, GetLine()); 201dde9cff3SCaroline Tice if (GetColumn() > 0) 202*cfd1acedSGreg Clayton description.Printf (":%u", GetColumn()); 203dde9cff3SCaroline Tice } 204dde9cff3SCaroline Tice else 205dde9cff3SCaroline Tice description.Printf ("No value"); 20630fdc8d8SChris Lattner 207dde9cff3SCaroline Tice return true; 208dde9cff3SCaroline Tice } 209750cd175SCaroline Tice 210750cd175SCaroline Tice lldb_private::LineEntry * 211750cd175SCaroline Tice SBLineEntry::get () 212750cd175SCaroline Tice { 213750cd175SCaroline Tice return m_opaque_ap.get(); 214750cd175SCaroline Tice } 215