1 //===-- 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 10 #include <limits.h> 11 12 #include "lldb/API/SBLineEntry.h" 13 #include "lldb/API/SBStream.h" 14 #include "lldb/Core/StreamString.h" 15 #include "lldb/Core/Log.h" 16 #include "lldb/Symbol/LineEntry.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 22 SBLineEntry::SBLineEntry () : 23 m_opaque_ap () 24 { 25 } 26 27 SBLineEntry::SBLineEntry (const SBLineEntry &rhs) : 28 m_opaque_ap () 29 { 30 if (rhs.IsValid()) 31 ref() = rhs.ref(); 32 } 33 34 SBLineEntry::SBLineEntry (const lldb_private::LineEntry *lldb_object_ptr) : 35 m_opaque_ap () 36 { 37 if (lldb_object_ptr) 38 ref() = *lldb_object_ptr; 39 } 40 41 const SBLineEntry & 42 SBLineEntry::operator = (const SBLineEntry &rhs) 43 { 44 if (this != &rhs) 45 { 46 if (rhs.IsValid()) 47 ref() = rhs.ref(); 48 else 49 m_opaque_ap.reset(); 50 } 51 return *this; 52 } 53 54 void 55 SBLineEntry::SetLineEntry (const lldb_private::LineEntry &lldb_object_ref) 56 { 57 ref() = lldb_object_ref; 58 } 59 60 61 SBLineEntry::~SBLineEntry () 62 { 63 } 64 65 66 SBAddress 67 SBLineEntry::GetStartAddress () const 68 { 69 70 SBAddress sb_address; 71 if (m_opaque_ap.get()) 72 sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress()); 73 74 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 75 if (log) 76 { 77 StreamString sstr; 78 const Address *addr = sb_address.get(); 79 if (addr) 80 addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 81 log->Printf ("SBLineEntry(%p)::GetStartAddress () => SBAddress (%p): %s", 82 m_opaque_ap.get(), sb_address.get(), sstr.GetData()); 83 } 84 85 return sb_address; 86 } 87 88 SBAddress 89 SBLineEntry::GetEndAddress () const 90 { 91 SBAddress sb_address; 92 if (m_opaque_ap.get()) 93 { 94 sb_address.SetAddress(&m_opaque_ap->range.GetBaseAddress()); 95 sb_address.OffsetAddress(m_opaque_ap->range.GetByteSize()); 96 } 97 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 98 if (log) 99 { 100 StreamString sstr; 101 const Address *addr = sb_address.get(); 102 if (addr) 103 addr->Dump (&sstr, NULL, Address::DumpStyleModuleWithFileAddress, Address::DumpStyleInvalid, 4); 104 log->Printf ("SBLineEntry(%p)::GetEndAddress () => SBAddress (%p): %s", 105 m_opaque_ap.get(), sb_address.get(), sstr.GetData()); 106 } 107 return sb_address; 108 } 109 110 bool 111 SBLineEntry::IsValid () const 112 { 113 return m_opaque_ap.get() && m_opaque_ap->IsValid(); 114 } 115 116 117 SBFileSpec 118 SBLineEntry::GetFileSpec () const 119 { 120 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 121 122 SBFileSpec sb_file_spec; 123 if (m_opaque_ap.get() && m_opaque_ap->file) 124 sb_file_spec.SetFileSpec(m_opaque_ap->file); 125 126 if (log) 127 { 128 SBStream sstr; 129 sb_file_spec.GetDescription (sstr); 130 log->Printf ("SBLineEntry(%p)::GetFileSpec () => SBFileSpec(%p): %s", m_opaque_ap.get(), 131 sb_file_spec.get(), sstr.GetData()); 132 } 133 134 return sb_file_spec; 135 } 136 137 uint32_t 138 SBLineEntry::GetLine () const 139 { 140 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API)); 141 142 uint32_t line = 0; 143 if (m_opaque_ap.get()) 144 line = m_opaque_ap->line; 145 146 if (log) 147 log->Printf ("SBLineEntry(%p)::GetLine () => %u", m_opaque_ap.get(), line); 148 149 return line; 150 } 151 152 153 uint32_t 154 SBLineEntry::GetColumn () const 155 { 156 if (m_opaque_ap.get()) 157 return m_opaque_ap->column; 158 return 0; 159 } 160 161 void 162 SBLineEntry::SetFileSpec (lldb::SBFileSpec filespec) 163 { 164 if (filespec.IsValid()) 165 ref().file = filespec.ref(); 166 else 167 ref().file.Clear(); 168 } 169 void 170 SBLineEntry::SetLine (uint32_t line) 171 { 172 ref().line = line; 173 } 174 175 void 176 SBLineEntry::SetColumn (uint32_t column) 177 { 178 ref().line = column; 179 } 180 181 182 183 bool 184 SBLineEntry::operator == (const SBLineEntry &rhs) const 185 { 186 lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get(); 187 lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get(); 188 189 if (lhs_ptr && rhs_ptr) 190 return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) == 0; 191 192 return lhs_ptr == rhs_ptr; 193 } 194 195 bool 196 SBLineEntry::operator != (const SBLineEntry &rhs) const 197 { 198 lldb_private::LineEntry *lhs_ptr = m_opaque_ap.get(); 199 lldb_private::LineEntry *rhs_ptr = rhs.m_opaque_ap.get(); 200 201 if (lhs_ptr && rhs_ptr) 202 return lldb_private::LineEntry::Compare (*lhs_ptr, *rhs_ptr) != 0; 203 204 return lhs_ptr != rhs_ptr; 205 } 206 207 const lldb_private::LineEntry * 208 SBLineEntry::operator->() const 209 { 210 return m_opaque_ap.get(); 211 } 212 213 lldb_private::LineEntry & 214 SBLineEntry::ref() 215 { 216 if (m_opaque_ap.get() == NULL) 217 m_opaque_ap.reset (new lldb_private::LineEntry ()); 218 return *m_opaque_ap; 219 } 220 221 const lldb_private::LineEntry & 222 SBLineEntry::ref() const 223 { 224 return *m_opaque_ap; 225 } 226 227 bool 228 SBLineEntry::GetDescription (SBStream &description) 229 { 230 Stream &strm = description.ref(); 231 232 if (m_opaque_ap.get()) 233 { 234 char file_path[PATH_MAX*2]; 235 m_opaque_ap->file.GetPath (file_path, sizeof (file_path)); 236 strm.Printf ("%s:%u", file_path, GetLine()); 237 if (GetColumn() > 0) 238 strm.Printf (":%u", GetColumn()); 239 } 240 else 241 strm.PutCString ("No value"); 242 243 return true; 244 } 245 246 lldb_private::LineEntry * 247 SBLineEntry::get () 248 { 249 return m_opaque_ap.get(); 250 } 251