blob: db288bc6f0ce0a1c977facc0227cc00ab6dfa8bf [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBLineEntry.cpp -----------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Stephen Wilsonec2d9782011-04-08 13:36:44 +000010#include <limits.h>
11
Chris Lattner24943d22010-06-08 16:52:24 +000012#include "lldb/API/SBLineEntry.h"
Caroline Tice98f930f2010-09-20 05:20:02 +000013#include "lldb/API/SBStream.h"
Greg Clayton49ce6822010-10-31 03:01:06 +000014#include "lldb/Core/StreamString.h"
Caroline Tice7826c882010-10-26 03:11:13 +000015#include "lldb/Core/Log.h"
Greg Clayton49ce6822010-10-31 03:01:06 +000016#include "lldb/Symbol/LineEntry.h"
Chris Lattner24943d22010-06-08 16:52:24 +000017
18using namespace lldb;
Caroline Tice7826c882010-10-26 03:11:13 +000019using namespace lldb_private;
Chris Lattner24943d22010-06-08 16:52:24 +000020
21
22SBLineEntry::SBLineEntry () :
Greg Clayton63094e02010-06-23 01:19:29 +000023 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000024{
25}
26
27SBLineEntry::SBLineEntry (const SBLineEntry &rhs) :
Greg Clayton63094e02010-06-23 01:19:29 +000028 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000029{
30 if (rhs.IsValid())
Greg Clayton23b8abb2011-09-26 07:11:27 +000031 ref() = rhs.ref();
Chris Lattner24943d22010-06-08 16:52:24 +000032}
33
Chris Lattner24943d22010-06-08 16:52:24 +000034SBLineEntry::SBLineEntry (const lldb_private::LineEntry *lldb_object_ptr) :
Greg Clayton63094e02010-06-23 01:19:29 +000035 m_opaque_ap ()
Chris Lattner24943d22010-06-08 16:52:24 +000036{
37 if (lldb_object_ptr)
Greg Clayton23b8abb2011-09-26 07:11:27 +000038 ref() = *lldb_object_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +000039}
40
41const SBLineEntry &
42SBLineEntry::operator = (const SBLineEntry &rhs)
43{
Greg Clayton23b8abb2011-09-26 07:11:27 +000044 if (this != &rhs)
45 {
46 if (rhs.IsValid())
47 ref() = rhs.ref();
48 else
49 m_opaque_ap.reset();
50 }
Chris Lattner24943d22010-06-08 16:52:24 +000051 return *this;
52}
53
54void
55SBLineEntry::SetLineEntry (const lldb_private::LineEntry &lldb_object_ref)
56{
Greg Clayton23b8abb2011-09-26 07:11:27 +000057 ref() = lldb_object_ref;
Chris Lattner24943d22010-06-08 16:52:24 +000058}
59
60
61SBLineEntry::~SBLineEntry ()
62{
63}
64
65
66SBAddress
67SBLineEntry::GetStartAddress () const
68{
Caroline Tice7826c882010-10-26 03:11:13 +000069
Chris Lattner24943d22010-06-08 16:52:24 +000070 SBAddress sb_address;
Greg Clayton63094e02010-06-23 01:19:29 +000071 if (m_opaque_ap.get())
72 sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress());
Caroline Tice7826c882010-10-26 03:11:13 +000073
Greg Claytone005f2c2010-11-06 01:53:30 +000074 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000075 if (log)
76 {
Greg Clayton49ce6822010-10-31 03:01:06 +000077 StreamString sstr;
78 if (sb_address.get())
79 sb_address->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
80 log->Printf ("SBLineEntry(%p)::GetStartAddress () => SBAddress (%p): %s",
81 m_opaque_ap.get(), sb_address.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +000082 }
83
Chris Lattner24943d22010-06-08 16:52:24 +000084 return sb_address;
85}
86
87SBAddress
88SBLineEntry::GetEndAddress () const
89{
90 SBAddress sb_address;
Greg Clayton63094e02010-06-23 01:19:29 +000091 if (m_opaque_ap.get())
Chris Lattner24943d22010-06-08 16:52:24 +000092 {
Greg Clayton63094e02010-06-23 01:19:29 +000093 sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress());
94 sb_address.OffsetAddress(m_opaque_ap->range.GetByteSize());
Chris Lattner24943d22010-06-08 16:52:24 +000095 }
Greg Claytone005f2c2010-11-06 01:53:30 +000096 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Clayton49ce6822010-10-31 03:01:06 +000097 if (log)
98 {
99 StreamString sstr;
100 if (sb_address.get())
101 sb_address->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4);
102 log->Printf ("SBLineEntry(%p)::GetEndAddress () => SBAddress (%p): %s",
103 m_opaque_ap.get(), sb_address.get(), sstr.GetData());
104 }
Chris Lattner24943d22010-06-08 16:52:24 +0000105 return sb_address;
106}
107
108bool
109SBLineEntry::IsValid () const
110{
Greg Clayton63094e02010-06-23 01:19:29 +0000111 return m_opaque_ap.get() != NULL;
Chris Lattner24943d22010-06-08 16:52:24 +0000112}
113
114
115SBFileSpec
116SBLineEntry::GetFileSpec () const
117{
Greg Claytone005f2c2010-11-06 01:53:30 +0000118 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000119
Chris Lattner24943d22010-06-08 16:52:24 +0000120 SBFileSpec sb_file_spec;
Greg Clayton63094e02010-06-23 01:19:29 +0000121 if (m_opaque_ap.get() && m_opaque_ap->file)
122 sb_file_spec.SetFileSpec(m_opaque_ap->file);
Caroline Tice7826c882010-10-26 03:11:13 +0000123
124 if (log)
125 {
126 SBStream sstr;
127 sb_file_spec.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000128 log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(),
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000129 sb_file_spec.get(), sstr.GetData());
Caroline Tice7826c882010-10-26 03:11:13 +0000130 }
131
Chris Lattner24943d22010-06-08 16:52:24 +0000132 return sb_file_spec;
133}
134
135uint32_t
136SBLineEntry::GetLine () const
137{
Greg Claytone005f2c2010-11-06 01:53:30 +0000138 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000139
Caroline Tice7826c882010-10-26 03:11:13 +0000140 uint32_t line = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000141 if (m_opaque_ap.get())
Caroline Tice7826c882010-10-26 03:11:13 +0000142 line = m_opaque_ap->line;
143
144 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +0000145 log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line);
Caroline Tice7826c882010-10-26 03:11:13 +0000146
147 return line;
Chris Lattner24943d22010-06-08 16:52:24 +0000148}
149
150
151uint32_t
152SBLineEntry::GetColumn () const
153{
Greg Clayton63094e02010-06-23 01:19:29 +0000154 if (m_opaque_ap.get())
155 return m_opaque_ap->column;
Chris Lattner24943d22010-06-08 16:52:24 +0000156 return 0;
157}
158
Greg Clayton23b8abb2011-09-26 07:11:27 +0000159void
160SBLineEntry::SetFileSpec (lldb::SBFileSpec filespec)
161{
162 if (filespec.IsValid())
163 ref().file = filespec.ref();
164 else
165 ref().file.Clear();
166}
167void
168SBLineEntry::SetLine (uint32_t line)
169{
170 ref().line = line;
171}
172
173void
174SBLineEntry::SetColumn (uint32_t column)
175{
176 ref().line = column;
177}
178
179
180
Chris Lattner24943d22010-06-08 16:52:24 +0000181bool
182SBLineEntry::operator == (const SBLineEntry &rhs) const
183{
Greg Clayton63094e02010-06-23 01:19:29 +0000184 lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get();
185 lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000186
187 if (lhs_ptr && rhs_ptr)
188 return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) == 0;
189
190 return lhs_ptr == rhs_ptr;
191}
192
193bool
194SBLineEntry::operator != (const SBLineEntry &rhs) const
195{
Greg Clayton63094e02010-06-23 01:19:29 +0000196 lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get();
197 lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000198
199 if (lhs_ptr && rhs_ptr)
200 return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) != 0;
201
202 return lhs_ptr != rhs_ptr;
203}
204
205const lldb_private::LineEntry *
206SBLineEntry::operator->() const
207{
Greg Clayton63094e02010-06-23 01:19:29 +0000208 return m_opaque_ap.get();
Chris Lattner24943d22010-06-08 16:52:24 +0000209}
210
Greg Clayton23b8abb2011-09-26 07:11:27 +0000211lldb_private::LineEntry &
212SBLineEntry::ref()
213{
214 if (m_opaque_ap.get() == NULL)
215 m_opaque_ap.reset (new lldb_private::LineEntry ());
216 return *m_opaque_ap;
217}
218
Chris Lattner24943d22010-06-08 16:52:24 +0000219const lldb_private::LineEntry &
Greg Clayton23b8abb2011-09-26 07:11:27 +0000220SBLineEntry::ref() const
Chris Lattner24943d22010-06-08 16:52:24 +0000221{
Greg Clayton63094e02010-06-23 01:19:29 +0000222 return *m_opaque_ap;
Chris Lattner24943d22010-06-08 16:52:24 +0000223}
224
Caroline Tice98f930f2010-09-20 05:20:02 +0000225bool
226SBLineEntry::GetDescription (SBStream &description)
227{
Greg Clayton96154be2011-11-13 06:57:31 +0000228 Stream &strm = description.ref();
229
Caroline Tice98f930f2010-09-20 05:20:02 +0000230 if (m_opaque_ap.get())
231 {
Caroline Tice98f930f2010-09-20 05:20:02 +0000232 char file_path[PATH_MAX*2];
233 m_opaque_ap->file.GetPath (file_path, sizeof (file_path));
Greg Clayton96154be2011-11-13 06:57:31 +0000234 strm.Printf ("%s:%u", file_path, GetLine());
Caroline Tice98f930f2010-09-20 05:20:02 +0000235 if (GetColumn() > 0)
Greg Clayton96154be2011-11-13 06:57:31 +0000236 strm.Printf (":%u", GetColumn());
Caroline Tice98f930f2010-09-20 05:20:02 +0000237 }
238 else
Greg Clayton96154be2011-11-13 06:57:31 +0000239 strm.PutCString ("No value");
Chris Lattner24943d22010-06-08 16:52:24 +0000240
Caroline Tice98f930f2010-09-20 05:20:02 +0000241 return true;
242}
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000243
244lldb_private::LineEntry *
245SBLineEntry::get ()
246{
247 return m_opaque_ap.get();
248}