1 //===-- SBCompileUnit.cpp ---------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/API/SBCompileUnit.h" 10 #include "SBReproducerPrivate.h" 11 #include "lldb/API/SBLineEntry.h" 12 #include "lldb/API/SBStream.h" 13 #include "lldb/Core/Module.h" 14 #include "lldb/Symbol/CompileUnit.h" 15 #include "lldb/Symbol/LineEntry.h" 16 #include "lldb/Symbol/LineTable.h" 17 #include "lldb/Symbol/SymbolVendor.h" 18 #include "lldb/Symbol/Type.h" 19 20 using namespace lldb; 21 using namespace lldb_private; 22 23 SBCompileUnit::SBCompileUnit() : m_opaque_ptr(NULL) { 24 LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBCompileUnit); 25 } 26 27 SBCompileUnit::SBCompileUnit(lldb_private::CompileUnit *lldb_object_ptr) 28 : m_opaque_ptr(lldb_object_ptr) {} 29 30 SBCompileUnit::SBCompileUnit(const SBCompileUnit &rhs) 31 : m_opaque_ptr(rhs.m_opaque_ptr) { 32 LLDB_RECORD_CONSTRUCTOR(SBCompileUnit, (const lldb::SBCompileUnit &), rhs); 33 } 34 35 const SBCompileUnit &SBCompileUnit::operator=(const SBCompileUnit &rhs) { 36 LLDB_RECORD_METHOD(const lldb::SBCompileUnit &, 37 SBCompileUnit, operator=,(const lldb::SBCompileUnit &), 38 rhs); 39 40 m_opaque_ptr = rhs.m_opaque_ptr; 41 return *this; 42 } 43 44 SBCompileUnit::~SBCompileUnit() { m_opaque_ptr = NULL; } 45 46 SBFileSpec SBCompileUnit::GetFileSpec() const { 47 LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBCompileUnit, 48 GetFileSpec); 49 50 SBFileSpec file_spec; 51 if (m_opaque_ptr) 52 file_spec.SetFileSpec(*m_opaque_ptr); 53 return LLDB_RECORD_RESULT(file_spec); 54 } 55 56 uint32_t SBCompileUnit::GetNumLineEntries() const { 57 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBCompileUnit, GetNumLineEntries); 58 59 if (m_opaque_ptr) { 60 LineTable *line_table = m_opaque_ptr->GetLineTable(); 61 if (line_table) { 62 return line_table->GetSize(); 63 } 64 } 65 return 0; 66 } 67 68 SBLineEntry SBCompileUnit::GetLineEntryAtIndex(uint32_t idx) const { 69 LLDB_RECORD_METHOD_CONST(lldb::SBLineEntry, SBCompileUnit, 70 GetLineEntryAtIndex, (uint32_t), idx); 71 72 SBLineEntry sb_line_entry; 73 if (m_opaque_ptr) { 74 LineTable *line_table = m_opaque_ptr->GetLineTable(); 75 if (line_table) { 76 LineEntry line_entry; 77 if (line_table->GetLineEntryAtIndex(idx, line_entry)) 78 sb_line_entry.SetLineEntry(line_entry); 79 } 80 } 81 82 return LLDB_RECORD_RESULT(sb_line_entry); 83 } 84 85 uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 86 SBFileSpec *inline_file_spec) const { 87 LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex, 88 (uint32_t, uint32_t, lldb::SBFileSpec *), start_idx, 89 line, inline_file_spec); 90 91 const bool exact = true; 92 return FindLineEntryIndex(start_idx, line, inline_file_spec, exact); 93 } 94 95 uint32_t SBCompileUnit::FindLineEntryIndex(uint32_t start_idx, uint32_t line, 96 SBFileSpec *inline_file_spec, 97 bool exact) const { 98 LLDB_RECORD_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex, 99 (uint32_t, uint32_t, lldb::SBFileSpec *, bool), 100 start_idx, line, inline_file_spec, exact); 101 102 uint32_t index = UINT32_MAX; 103 if (m_opaque_ptr) { 104 FileSpec file_spec; 105 if (inline_file_spec && inline_file_spec->IsValid()) 106 file_spec = inline_file_spec->ref(); 107 else 108 file_spec = *m_opaque_ptr; 109 110 index = m_opaque_ptr->FindLineEntry( 111 start_idx, line, inline_file_spec ? inline_file_spec->get() : NULL, 112 exact, NULL); 113 } 114 115 return index; 116 } 117 118 uint32_t SBCompileUnit::GetNumSupportFiles() const { 119 LLDB_RECORD_METHOD_CONST_NO_ARGS(uint32_t, SBCompileUnit, GetNumSupportFiles); 120 121 if (m_opaque_ptr) { 122 FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 123 return support_files.GetSize(); 124 } 125 return 0; 126 } 127 128 lldb::SBTypeList SBCompileUnit::GetTypes(uint32_t type_mask) { 129 LLDB_RECORD_METHOD(lldb::SBTypeList, SBCompileUnit, GetTypes, (uint32_t), 130 type_mask); 131 132 SBTypeList sb_type_list; 133 134 if (!m_opaque_ptr) 135 return LLDB_RECORD_RESULT(sb_type_list); 136 137 ModuleSP module_sp(m_opaque_ptr->GetModule()); 138 if (!module_sp) 139 return LLDB_RECORD_RESULT(sb_type_list); 140 141 SymbolVendor *vendor = module_sp->GetSymbolVendor(); 142 if (!vendor) 143 return LLDB_RECORD_RESULT(sb_type_list); 144 145 TypeClass type_class = static_cast<TypeClass>(type_mask); 146 TypeList type_list; 147 vendor->GetTypes(m_opaque_ptr, type_class, type_list); 148 sb_type_list.m_opaque_up->Append(type_list); 149 return LLDB_RECORD_RESULT(sb_type_list); 150 } 151 152 SBFileSpec SBCompileUnit::GetSupportFileAtIndex(uint32_t idx) const { 153 LLDB_RECORD_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit, 154 GetSupportFileAtIndex, (uint32_t), idx); 155 156 SBFileSpec sb_file_spec; 157 if (m_opaque_ptr) { 158 FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 159 FileSpec file_spec = support_files.GetFileSpecAtIndex(idx); 160 sb_file_spec.SetFileSpec(file_spec); 161 } 162 163 164 return LLDB_RECORD_RESULT(sb_file_spec); 165 } 166 167 uint32_t SBCompileUnit::FindSupportFileIndex(uint32_t start_idx, 168 const SBFileSpec &sb_file, 169 bool full) { 170 LLDB_RECORD_METHOD(uint32_t, SBCompileUnit, FindSupportFileIndex, 171 (uint32_t, const lldb::SBFileSpec &, bool), start_idx, 172 sb_file, full); 173 174 if (m_opaque_ptr) { 175 FileSpecList &support_files = m_opaque_ptr->GetSupportFiles(); 176 return support_files.FindFileIndex(start_idx, sb_file.ref(), full); 177 } 178 return 0; 179 } 180 181 lldb::LanguageType SBCompileUnit::GetLanguage() { 182 LLDB_RECORD_METHOD_NO_ARGS(lldb::LanguageType, SBCompileUnit, GetLanguage); 183 184 if (m_opaque_ptr) 185 return m_opaque_ptr->GetLanguage(); 186 return lldb::eLanguageTypeUnknown; 187 } 188 189 bool SBCompileUnit::IsValid() const { 190 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBCompileUnit, IsValid); 191 return this->operator bool(); 192 } 193 SBCompileUnit::operator bool() const { 194 LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBCompileUnit, operator bool); 195 196 return m_opaque_ptr != NULL; 197 } 198 199 bool SBCompileUnit::operator==(const SBCompileUnit &rhs) const { 200 LLDB_RECORD_METHOD_CONST( 201 bool, SBCompileUnit, operator==,(const lldb::SBCompileUnit &), rhs); 202 203 return m_opaque_ptr == rhs.m_opaque_ptr; 204 } 205 206 bool SBCompileUnit::operator!=(const SBCompileUnit &rhs) const { 207 LLDB_RECORD_METHOD_CONST( 208 bool, SBCompileUnit, operator!=,(const lldb::SBCompileUnit &), rhs); 209 210 return m_opaque_ptr != rhs.m_opaque_ptr; 211 } 212 213 const lldb_private::CompileUnit *SBCompileUnit::operator->() const { 214 return m_opaque_ptr; 215 } 216 217 const lldb_private::CompileUnit &SBCompileUnit::operator*() const { 218 return *m_opaque_ptr; 219 } 220 221 lldb_private::CompileUnit *SBCompileUnit::get() { return m_opaque_ptr; } 222 223 void SBCompileUnit::reset(lldb_private::CompileUnit *lldb_object_ptr) { 224 m_opaque_ptr = lldb_object_ptr; 225 } 226 227 bool SBCompileUnit::GetDescription(SBStream &description) { 228 LLDB_RECORD_METHOD(bool, SBCompileUnit, GetDescription, (lldb::SBStream &), 229 description); 230 231 Stream &strm = description.ref(); 232 233 if (m_opaque_ptr) { 234 m_opaque_ptr->Dump(&strm, false); 235 } else 236 strm.PutCString("No value"); 237 238 return true; 239 } 240 241 namespace lldb_private { 242 namespace repro { 243 244 template <> 245 void RegisterMethods<SBCompileUnit>(Registry &R) { 246 LLDB_REGISTER_CONSTRUCTOR(SBCompileUnit, ()); 247 LLDB_REGISTER_CONSTRUCTOR(SBCompileUnit, (const lldb::SBCompileUnit &)); 248 LLDB_REGISTER_METHOD( 249 const lldb::SBCompileUnit &, 250 SBCompileUnit, operator=,(const lldb::SBCompileUnit &)); 251 LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit, GetFileSpec, 252 ()); 253 LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, GetNumLineEntries, ()); 254 LLDB_REGISTER_METHOD_CONST(lldb::SBLineEntry, SBCompileUnit, 255 GetLineEntryAtIndex, (uint32_t)); 256 LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex, 257 (uint32_t, uint32_t, lldb::SBFileSpec *)); 258 LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, FindLineEntryIndex, 259 (uint32_t, uint32_t, lldb::SBFileSpec *, bool)); 260 LLDB_REGISTER_METHOD_CONST(uint32_t, SBCompileUnit, GetNumSupportFiles, ()); 261 LLDB_REGISTER_METHOD(lldb::SBTypeList, SBCompileUnit, GetTypes, (uint32_t)); 262 LLDB_REGISTER_METHOD_CONST(lldb::SBFileSpec, SBCompileUnit, 263 GetSupportFileAtIndex, (uint32_t)); 264 LLDB_REGISTER_METHOD(uint32_t, SBCompileUnit, FindSupportFileIndex, 265 (uint32_t, const lldb::SBFileSpec &, bool)); 266 LLDB_REGISTER_METHOD(lldb::LanguageType, SBCompileUnit, GetLanguage, ()); 267 LLDB_REGISTER_METHOD_CONST(bool, SBCompileUnit, IsValid, ()); 268 LLDB_REGISTER_METHOD_CONST(bool, SBCompileUnit, operator bool, ()); 269 LLDB_REGISTER_METHOD_CONST( 270 bool, SBCompileUnit, operator==,(const lldb::SBCompileUnit &)); 271 LLDB_REGISTER_METHOD_CONST( 272 bool, SBCompileUnit, operator!=,(const lldb::SBCompileUnit &)); 273 LLDB_REGISTER_METHOD(bool, SBCompileUnit, GetDescription, 274 (lldb::SBStream &)); 275 } 276 277 } 278 } 279