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