130fdc8d8SChris Lattner //===-- SBModule.cpp --------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner 930fdc8d8SChris Lattner #include "lldb/API/SBModule.h" 1009960031SGreg Clayton #include "lldb/API/SBAddress.h" 1109960031SGreg Clayton #include "lldb/API/SBFileSpec.h" 12226cce25SGreg Clayton #include "lldb/API/SBModuleSpec.h" 13c9660546SGreg Clayton #include "lldb/API/SBProcess.h" 14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 15fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h" 16b9c1b51eSKate Stone #include "lldb/Core/Module.h" 171f746071SGreg Clayton #include "lldb/Core/Section.h" 18dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h" 19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 201f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h" 21ae088e52SGreg Clayton #include "lldb/Symbol/SymbolFile.h" 226f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h" 231f746071SGreg Clayton #include "lldb/Symbol/Symtab.h" 2456939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h" 25dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h" 26dea8cb4fSGreg Clayton #include "lldb/Target/Target.h" 276f9e6901SZachary Turner #include "lldb/Utility/Log.h" 28bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h" 2930fdc8d8SChris Lattner 3030fdc8d8SChris Lattner using namespace lldb; 31ceb6b139SCaroline Tice using namespace lldb_private; 3230fdc8d8SChris Lattner 33b9c1b51eSKate Stone SBModule::SBModule() : m_opaque_sp() {} 3430fdc8d8SChris Lattner 35b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {} 3630fdc8d8SChris Lattner 37b9c1b51eSKate Stone SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() { 38226cce25SGreg Clayton ModuleSP module_sp; 3997206d57SZachary Turner Status error = ModuleList::GetSharedModule(*module_spec.m_opaque_ap, 4097206d57SZachary Turner module_sp, NULL, NULL, NULL); 41226cce25SGreg Clayton if (module_sp) 42226cce25SGreg Clayton SetSP(module_sp); 43226cce25SGreg Clayton } 44226cce25SGreg Clayton 45b9c1b51eSKate Stone SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {} 46efabb123SGreg Clayton 47b9c1b51eSKate Stone SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) 48b9c1b51eSKate Stone : m_opaque_sp() { 49c9660546SGreg Clayton ProcessSP process_sp(process.GetSP()); 50b9c1b51eSKate Stone if (process_sp) { 5139f7ee86SGreg Clayton m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr); 52b9c1b51eSKate Stone if (m_opaque_sp) { 5339f7ee86SGreg Clayton Target &target = process_sp->GetTarget(); 5439f7ee86SGreg Clayton bool changed = false; 55751caf65SGreg Clayton m_opaque_sp->SetLoadAddress(target, 0, true, changed); 5639f7ee86SGreg Clayton target.GetImages().Append(m_opaque_sp); 5739f7ee86SGreg Clayton } 58c859e2d5SGreg Clayton } 59c9660546SGreg Clayton } 60c9660546SGreg Clayton 61b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) { 62efabb123SGreg Clayton if (this != &rhs) 63efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 64efabb123SGreg Clayton return *this; 65efabb123SGreg Clayton } 66efabb123SGreg Clayton 67b9c1b51eSKate Stone SBModule::~SBModule() {} 6830fdc8d8SChris Lattner 69b9c1b51eSKate Stone bool SBModule::IsValid() const { return m_opaque_sp.get() != NULL; } 7030fdc8d8SChris Lattner 71b9c1b51eSKate Stone void SBModule::Clear() { m_opaque_sp.reset(); } 725d3bca4eSJim Ingham 73b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const { 745160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 75ceb6b139SCaroline Tice 7630fdc8d8SChris Lattner SBFileSpec file_spec; 77c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 78c2ff9318SGreg Clayton if (module_sp) 79c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetFileSpec()); 80ceb6b139SCaroline Tice 81ceb6b139SCaroline Tice if (log) 82cfd1acedSGreg Clayton log->Printf("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)", 83324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 84324a1036SSaleem Abdulrasool static_cast<const void *>(file_spec.get())); 85ceb6b139SCaroline Tice 8630fdc8d8SChris Lattner return file_spec; 8730fdc8d8SChris Lattner } 8830fdc8d8SChris Lattner 89b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const { 905160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 912289fa48SGreg Clayton 922289fa48SGreg Clayton SBFileSpec file_spec; 93c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 94c2ff9318SGreg Clayton if (module_sp) 95c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetPlatformFileSpec()); 962289fa48SGreg Clayton 972289fa48SGreg Clayton if (log) 982289fa48SGreg Clayton log->Printf("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", 99324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 100324a1036SSaleem Abdulrasool static_cast<const void *>(file_spec.get())); 1012289fa48SGreg Clayton 1022289fa48SGreg Clayton return file_spec; 1032289fa48SGreg Clayton } 1042289fa48SGreg Clayton 105b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) { 1062289fa48SGreg Clayton bool result = false; 1075160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1082289fa48SGreg Clayton 109c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 110b9c1b51eSKate Stone if (module_sp) { 111c2ff9318SGreg Clayton module_sp->SetPlatformFileSpec(*platform_file); 1122289fa48SGreg Clayton result = true; 1132289fa48SGreg Clayton } 1142289fa48SGreg Clayton 1152289fa48SGreg Clayton if (log) 116b5ad4ec7SGreg Clayton log->Printf("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s)) => %i", 117324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 118324a1036SSaleem Abdulrasool static_cast<const void *>(platform_file.get()), 119324a1036SSaleem Abdulrasool platform_file->GetPath().c_str(), result); 1202289fa48SGreg Clayton return result; 1212289fa48SGreg Clayton } 1222289fa48SGreg Clayton 123b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() { 124fbb76349SGreg Clayton SBFileSpec sb_file_spec; 125fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 126fbb76349SGreg Clayton if (module_sp) 127fbb76349SGreg Clayton sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec()); 128fbb76349SGreg Clayton return sb_file_spec; 129fbb76349SGreg Clayton } 130fbb76349SGreg Clayton 131b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) { 132fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 133b9c1b51eSKate Stone if (module_sp) { 134fbb76349SGreg Clayton module_sp->SetRemoteInstallFileSpec(file.ref()); 135fbb76349SGreg Clayton return true; 136fbb76349SGreg Clayton } 137fbb76349SGreg Clayton return false; 138fbb76349SGreg Clayton } 1392289fa48SGreg Clayton 140b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const { 1415160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 142ceb6b139SCaroline Tice 1434838131bSGreg Clayton const uint8_t *uuid_bytes = NULL; 144c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 145c2ff9318SGreg Clayton if (module_sp) 146470b286eSPavel Labath uuid_bytes = module_sp->GetUUID().GetBytes().data(); 147ceb6b139SCaroline Tice 148b9c1b51eSKate Stone if (log) { 149b9c1b51eSKate Stone if (uuid_bytes) { 1504838131bSGreg Clayton StreamString s; 151c2ff9318SGreg Clayton module_sp->GetUUID().Dump(&s); 152324a1036SSaleem Abdulrasool log->Printf("SBModule(%p)::GetUUIDBytes () => %s", 153324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), s.GetData()); 154b9c1b51eSKate Stone } else 155324a1036SSaleem Abdulrasool log->Printf("SBModule(%p)::GetUUIDBytes () => NULL", 156324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get())); 1574838131bSGreg Clayton } 1584838131bSGreg Clayton return uuid_bytes; 15930fdc8d8SChris Lattner } 16030fdc8d8SChris Lattner 161b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const { 1625160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 163df2963edSJohnny Chen 164f1be855aSGreg Clayton const char *uuid_cstr = NULL; 165c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 166b9c1b51eSKate Stone if (module_sp) { 16705097246SAdrian Prantl // We are going to return a "const char *" value through the public API, so 16805097246SAdrian Prantl // we need to constify it so it gets added permanently the string pool and 16905097246SAdrian Prantl // then we don't need to worry about the lifetime of the string as it will 17005097246SAdrian Prantl // never go away once it has been put into the ConstString string pool 171f1be855aSGreg Clayton uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString(); 172f1be855aSGreg Clayton } 173f1be855aSGreg Clayton 174b9c1b51eSKate Stone if (uuid_cstr && uuid_cstr[0]) { 175f1be855aSGreg Clayton if (log) 176b9c1b51eSKate Stone log->Printf("SBModule(%p)::GetUUIDString () => %s", 177b9c1b51eSKate Stone static_cast<void *>(module_sp.get()), uuid_cstr); 178f1be855aSGreg Clayton return uuid_cstr; 179c16b4af0SJason Molenda } 180df2963edSJohnny Chen 181df2963edSJohnny Chen if (log) 182b9c1b51eSKate Stone log->Printf("SBModule(%p)::GetUUIDString () => NULL", 183b9c1b51eSKate Stone static_cast<void *>(module_sp.get())); 184f1be855aSGreg Clayton return NULL; 185df2963edSJohnny Chen } 186df2963edSJohnny Chen 187b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const { 1886611103cSGreg Clayton if (m_opaque_sp) 1896611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 19030fdc8d8SChris Lattner return false; 19130fdc8d8SChris Lattner } 19230fdc8d8SChris Lattner 193b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const { 1946611103cSGreg Clayton if (m_opaque_sp) 1956611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 19630fdc8d8SChris Lattner return false; 19730fdc8d8SChris Lattner } 19830fdc8d8SChris Lattner 199b9c1b51eSKate Stone ModuleSP SBModule::GetSP() const { return m_opaque_sp; } 20030fdc8d8SChris Lattner 201b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; } 20230fdc8d8SChris Lattner 203b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) { 204cac9c5f9SGreg Clayton lldb::SBAddress sb_addr; 205c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 206b9c1b51eSKate Stone if (module_sp) { 207cac9c5f9SGreg Clayton Address addr; 208c2ff9318SGreg Clayton if (module_sp->ResolveFileAddress(vm_addr, addr)) 209cac9c5f9SGreg Clayton sb_addr.ref() = addr; 210cac9c5f9SGreg Clayton } 211cac9c5f9SGreg Clayton return sb_addr; 21209960031SGreg Clayton } 21309960031SGreg Clayton 21409960031SGreg Clayton SBSymbolContext 215b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr, 216b9c1b51eSKate Stone uint32_t resolve_scope) { 21709960031SGreg Clayton SBSymbolContext sb_sc; 218c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 219991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 220c2ff9318SGreg Clayton if (module_sp && addr.IsValid()) 221991e4453SZachary Turner module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc); 22209960031SGreg Clayton return sb_sc; 22309960031SGreg Clayton } 22409960031SGreg Clayton 225b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) { 226da7bc7d0SGreg Clayton Stream &strm = description.ref(); 227da7bc7d0SGreg Clayton 228c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 229b9c1b51eSKate Stone if (module_sp) { 230c2ff9318SGreg Clayton module_sp->GetDescription(&strm); 231b9c1b51eSKate Stone } else 232da7bc7d0SGreg Clayton strm.PutCString("No value"); 233dde9cff3SCaroline Tice 234dde9cff3SCaroline Tice return true; 235dde9cff3SCaroline Tice } 236bbdabce2SGreg Clayton 237b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() { 238873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 239b9c1b51eSKate Stone if (module_sp) { 240873a7a4bSJohnny Chen return module_sp->GetNumCompileUnits(); 241873a7a4bSJohnny Chen } 242873a7a4bSJohnny Chen return 0; 243873a7a4bSJohnny Chen } 244873a7a4bSJohnny Chen 245b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) { 246873a7a4bSJohnny Chen SBCompileUnit sb_cu; 247873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 248b9c1b51eSKate Stone if (module_sp) { 249873a7a4bSJohnny Chen CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index); 250873a7a4bSJohnny Chen sb_cu.reset(cu_sp.get()); 251873a7a4bSJohnny Chen } 252873a7a4bSJohnny Chen return sb_cu; 253873a7a4bSJohnny Chen } 254873a7a4bSJohnny Chen 255da0c081fSAlexander Polyakov SBSymbolContextList 256da0c081fSAlexander Polyakov SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) { 257da0c081fSAlexander Polyakov SBSymbolContextList sb_sc_list; 258da0c081fSAlexander Polyakov const ModuleSP module_sp(GetSP()); 259da0c081fSAlexander Polyakov if (sb_file_spec.IsValid() && module_sp) { 260da0c081fSAlexander Polyakov const bool append = true; 261da0c081fSAlexander Polyakov module_sp->FindCompileUnits(*sb_file_spec, append, *sb_sc_list); 262da0c081fSAlexander Polyakov } 263da0c081fSAlexander Polyakov return sb_sc_list; 264da0c081fSAlexander Polyakov } 265da0c081fSAlexander Polyakov 266b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) { 267b9c1b51eSKate Stone if (module_sp) { 268a7499c98SMichael Sartain SymbolVendor *symbols = module_sp->GetSymbolVendor(); 269a7499c98SMichael Sartain if (symbols) 270a7499c98SMichael Sartain return symbols->GetSymtab(); 271a7499c98SMichael Sartain } 272a7499c98SMichael Sartain return NULL; 273a7499c98SMichael Sartain } 274a7499c98SMichael Sartain 275b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() { 276c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 277b9c1b51eSKate Stone if (module_sp) { 278a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 279bbdabce2SGreg Clayton if (symtab) 280bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 281bbdabce2SGreg Clayton } 282bbdabce2SGreg Clayton return 0; 283bbdabce2SGreg Clayton } 284bbdabce2SGreg Clayton 285b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) { 286bbdabce2SGreg Clayton SBSymbol sb_symbol; 287c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 288a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 289bbdabce2SGreg Clayton if (symtab) 290bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx)); 291bbdabce2SGreg Clayton return sb_symbol; 292bbdabce2SGreg Clayton } 293fe356d35SGreg Clayton 294b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name, 295b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 296e14e1925SGreg Clayton SBSymbol sb_symbol; 297b9c1b51eSKate Stone if (name && name[0]) { 298e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 299a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 300e14e1925SGreg Clayton if (symtab) 301b9c1b51eSKate Stone sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType( 302b9c1b51eSKate Stone ConstString(name), symbol_type, Symtab::eDebugAny, 303b9c1b51eSKate Stone Symtab::eVisibilityAny)); 304e14e1925SGreg Clayton } 305e14e1925SGreg Clayton return sb_symbol; 306e14e1925SGreg Clayton } 307e14e1925SGreg Clayton 308b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name, 309b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 310e14e1925SGreg Clayton SBSymbolContextList sb_sc_list; 311b9c1b51eSKate Stone if (name && name[0]) { 312e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 313a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 314b9c1b51eSKate Stone if (symtab) { 315e14e1925SGreg Clayton std::vector<uint32_t> matching_symbol_indexes; 316b9c1b51eSKate Stone const size_t num_matches = symtab->FindAllSymbolsWithNameAndType( 317b9c1b51eSKate Stone ConstString(name), symbol_type, matching_symbol_indexes); 318b9c1b51eSKate Stone if (num_matches) { 319e14e1925SGreg Clayton SymbolContext sc; 320e14e1925SGreg Clayton sc.module_sp = module_sp; 321e14e1925SGreg Clayton SymbolContextList &sc_list = *sb_sc_list; 322b9c1b51eSKate Stone for (size_t i = 0; i < num_matches; ++i) { 323e14e1925SGreg Clayton sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]); 324e14e1925SGreg Clayton if (sc.symbol) 325e14e1925SGreg Clayton sc_list.Append(sc); 326e14e1925SGreg Clayton } 327e14e1925SGreg Clayton } 328e14e1925SGreg Clayton } 329e14e1925SGreg Clayton } 330e14e1925SGreg Clayton return sb_sc_list; 331e14e1925SGreg Clayton } 332e14e1925SGreg Clayton 333b9c1b51eSKate Stone size_t SBModule::GetNumSections() { 334c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 335b9c1b51eSKate Stone if (module_sp) { 336a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 337a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 3383046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 339cac9c5f9SGreg Clayton if (section_list) 340cac9c5f9SGreg Clayton return section_list->GetSize(); 341cac9c5f9SGreg Clayton } 342cac9c5f9SGreg Clayton return 0; 343cac9c5f9SGreg Clayton } 344cac9c5f9SGreg Clayton 345b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) { 346cac9c5f9SGreg Clayton SBSection sb_section; 347c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 348b9c1b51eSKate Stone if (module_sp) { 349a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 350a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 3513046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 352cac9c5f9SGreg Clayton 353cac9c5f9SGreg Clayton if (section_list) 354e72dfb32SGreg Clayton sb_section.SetSP(section_list->GetSectionAtIndex(idx)); 355cac9c5f9SGreg Clayton } 356cac9c5f9SGreg Clayton return sb_section; 357cac9c5f9SGreg Clayton } 358cac9c5f9SGreg Clayton 359b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name, 360b9c1b51eSKate Stone uint32_t name_type_mask) { 3615569e64eSGreg Clayton lldb::SBSymbolContextList sb_sc_list; 362c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 363b9c1b51eSKate Stone if (name && module_sp) { 3645569e64eSGreg Clayton const bool append = true; 365fe356d35SGreg Clayton const bool symbols_ok = true; 3669df05fbbSSean Callanan const bool inlines_ok = true; 367117b1fa1SZachary Turner FunctionNameType type = static_cast<FunctionNameType>(name_type_mask); 368117b1fa1SZachary Turner module_sp->FindFunctions(ConstString(name), NULL, type, symbols_ok, 369117b1fa1SZachary Turner inlines_ok, append, *sb_sc_list); 370fe356d35SGreg Clayton } 3715569e64eSGreg Clayton return sb_sc_list; 372fe356d35SGreg Clayton } 373fe356d35SGreg Clayton 374b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name, 375b9c1b51eSKate Stone uint32_t max_matches) { 376dea8cb4fSGreg Clayton SBValueList sb_value_list; 377c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 378b9c1b51eSKate Stone if (name && module_sp) { 379dea8cb4fSGreg Clayton VariableList variable_list; 380b9c1b51eSKate Stone const uint32_t match_count = module_sp->FindGlobalVariables( 38134cda14bSPavel Labath ConstString(name), NULL, max_matches, variable_list); 382dea8cb4fSGreg Clayton 383b9c1b51eSKate Stone if (match_count > 0) { 384b9c1b51eSKate Stone for (uint32_t i = 0; i < match_count; ++i) { 385dea8cb4fSGreg Clayton lldb::ValueObjectSP valobj_sp; 386b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 387b9c1b51eSKate Stone valobj_sp = ValueObjectVariable::Create( 388b9c1b51eSKate Stone target_sp.get(), variable_list.GetVariableAtIndex(i)); 389dea8cb4fSGreg Clayton if (valobj_sp) 39085425d77SEnrico Granata sb_value_list.Append(SBValue(valobj_sp)); 391dea8cb4fSGreg Clayton } 392dea8cb4fSGreg Clayton } 393dea8cb4fSGreg Clayton } 394dea8cb4fSGreg Clayton 395dea8cb4fSGreg Clayton return sb_value_list; 396dea8cb4fSGreg Clayton } 3976f3533fbSEnrico Granata 398b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target, 399b9c1b51eSKate Stone const char *name) { 400bcd80b47SEnrico Granata SBValueList sb_value_list(FindGlobalVariables(target, name, 1)); 401bcd80b47SEnrico Granata if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 402bcd80b47SEnrico Granata return sb_value_list.GetValueAtIndex(0); 403bcd80b47SEnrico Granata return SBValue(); 404bcd80b47SEnrico Granata } 405bcd80b47SEnrico Granata 406b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) { 407fe42ac4dSGreg Clayton SBType sb_type; 408c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 409b9c1b51eSKate Stone if (name_cstr && module_sp) { 4106f3533fbSEnrico Granata SymbolContext sc; 41184db9105SGreg Clayton const bool exact_match = false; 4126f3533fbSEnrico Granata ConstString name(name_cstr); 4136f3533fbSEnrico Granata 414b43165b7SGreg Clayton sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match)); 4156f3533fbSEnrico Granata 416b9c1b51eSKate Stone if (!sb_type.IsValid()) { 417b9c1b51eSKate Stone TypeSystem *type_system = 418b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 41956939cb3SGreg Clayton if (type_system) 42056939cb3SGreg Clayton sb_type = SBType(type_system->GetBuiltinTypeByName(name)); 42156939cb3SGreg Clayton } 4226f3533fbSEnrico Granata } 423fe42ac4dSGreg Clayton return sb_type; 4246f3533fbSEnrico Granata } 4256f3533fbSEnrico Granata 426b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) { 427b43165b7SGreg Clayton ModuleSP module_sp(GetSP()); 428b9c1b51eSKate Stone if (module_sp) { 429b9c1b51eSKate Stone TypeSystem *type_system = 430b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 43156939cb3SGreg Clayton if (type_system) 43256939cb3SGreg Clayton return SBType(type_system->GetBasicTypeFromAST(type)); 43356939cb3SGreg Clayton } 434b43165b7SGreg Clayton return SBType(); 435b43165b7SGreg Clayton } 436b43165b7SGreg Clayton 437b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) { 4386f3533fbSEnrico Granata SBTypeList retval; 4396f3533fbSEnrico Granata 440c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 441b9c1b51eSKate Stone if (type && module_sp) { 4426f3533fbSEnrico Granata TypeList type_list; 44384db9105SGreg Clayton const bool exact_match = false; 4446f3533fbSEnrico Granata ConstString name(type); 445ae088e52SGreg Clayton llvm::DenseSet<SymbolFile *> searched_symbol_files; 446b9c1b51eSKate Stone const uint32_t num_matches = module_sp->FindTypes( 447576495e6SZachary Turner name, exact_match, UINT32_MAX, searched_symbol_files, type_list); 4486f3533fbSEnrico Granata 449b9c1b51eSKate Stone if (num_matches > 0) { 450b9c1b51eSKate Stone for (size_t idx = 0; idx < num_matches; idx++) { 451fe42ac4dSGreg Clayton TypeSP type_sp(type_list.GetTypeAtIndex(idx)); 452fe42ac4dSGreg Clayton if (type_sp) 453fe42ac4dSGreg Clayton retval.Append(SBType(type_sp)); 454fe42ac4dSGreg Clayton } 455b9c1b51eSKate Stone } else { 456b9c1b51eSKate Stone TypeSystem *type_system = 457b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 458b9c1b51eSKate Stone if (type_system) { 45956939cb3SGreg Clayton CompilerType compiler_type = type_system->GetBuiltinTypeByName(name); 46056939cb3SGreg Clayton if (compiler_type) 46156939cb3SGreg Clayton retval.Append(SBType(compiler_type)); 46256939cb3SGreg Clayton } 463b43165b7SGreg Clayton } 464b43165b7SGreg Clayton } 4656f3533fbSEnrico Granata 4666f3533fbSEnrico Granata return retval; 4676f3533fbSEnrico Granata } 468cac9c5f9SGreg Clayton 469b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) { 4701f4db7daSGreg Clayton ModuleSP module_sp(GetSP()); 471b9c1b51eSKate Stone if (module_sp) { 4721f4db7daSGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 473b9c1b51eSKate Stone if (vendor) { 4741f4db7daSGreg Clayton Type *type_ptr = vendor->ResolveTypeUID(uid); 4751f4db7daSGreg Clayton if (type_ptr) 4761f4db7daSGreg Clayton return SBType(type_ptr->shared_from_this()); 4771f4db7daSGreg Clayton } 4781f4db7daSGreg Clayton } 4791f4db7daSGreg Clayton return SBType(); 4801f4db7daSGreg Clayton } 4811f4db7daSGreg Clayton 482b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) { 483f02500c7SGreg Clayton SBTypeList sb_type_list; 484f02500c7SGreg Clayton 485f02500c7SGreg Clayton ModuleSP module_sp(GetSP()); 486117b1fa1SZachary Turner if (!module_sp) 487117b1fa1SZachary Turner return sb_type_list; 488f02500c7SGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 489117b1fa1SZachary Turner if (!vendor) 490117b1fa1SZachary Turner return sb_type_list; 491117b1fa1SZachary Turner 492117b1fa1SZachary Turner TypeClass type_class = static_cast<TypeClass>(type_mask); 493f02500c7SGreg Clayton TypeList type_list; 494117b1fa1SZachary Turner vendor->GetTypes(NULL, type_class, type_list); 495f02500c7SGreg Clayton sb_type_list.m_opaque_ap->Append(type_list); 496f02500c7SGreg Clayton return sb_type_list; 497f02500c7SGreg Clayton } 498cac9c5f9SGreg Clayton 499b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) { 500cac9c5f9SGreg Clayton SBSection sb_section; 501cac9c5f9SGreg Clayton 502c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 503b9c1b51eSKate Stone if (sect_name && module_sp) { 504a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 505a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 5063046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 507b9c1b51eSKate Stone if (section_list) { 508cac9c5f9SGreg Clayton ConstString const_sect_name(sect_name); 509cac9c5f9SGreg Clayton SectionSP section_sp(section_list->FindSectionByName(const_sect_name)); 510b9c1b51eSKate Stone if (section_sp) { 511e72dfb32SGreg Clayton sb_section.SetSP(section_sp); 512cac9c5f9SGreg Clayton } 513cac9c5f9SGreg Clayton } 514cac9c5f9SGreg Clayton } 515cac9c5f9SGreg Clayton return sb_section; 516cac9c5f9SGreg Clayton } 517cac9c5f9SGreg Clayton 518b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() { 519c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 520c2ff9318SGreg Clayton if (module_sp) 521c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetByteOrder(); 52213d1950aSGreg Clayton return eByteOrderInvalid; 52313d1950aSGreg Clayton } 52413d1950aSGreg Clayton 525b9c1b51eSKate Stone const char *SBModule::GetTriple() { 526c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 527b9c1b51eSKate Stone if (module_sp) { 528c2ff9318SGreg Clayton std::string triple(module_sp->GetArchitecture().GetTriple().str()); 52905097246SAdrian Prantl // Unique the string so we don't run into ownership issues since the const 53005097246SAdrian Prantl // strings put the string into the string pool once and the strings never 53105097246SAdrian Prantl // comes out 53213d1950aSGreg Clayton ConstString const_triple(triple.c_str()); 53313d1950aSGreg Clayton return const_triple.GetCString(); 53413d1950aSGreg Clayton } 53513d1950aSGreg Clayton return NULL; 53613d1950aSGreg Clayton } 53713d1950aSGreg Clayton 538b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() { 539c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 540c2ff9318SGreg Clayton if (module_sp) 541c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetAddressByteSize(); 54213d1950aSGreg Clayton return sizeof(void *); 54313d1950aSGreg Clayton } 54413d1950aSGreg Clayton 545b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) { 5462272c481SPavel Labath llvm::VersionTuple version; 5472272c481SPavel Labath if (ModuleSP module_sp = GetSP()) 5482272c481SPavel Labath version = module_sp->GetVersion(); 5492272c481SPavel Labath uint32_t result = 0; 5502272c481SPavel Labath if (!version.empty()) 5512272c481SPavel Labath ++result; 5522272c481SPavel Labath if (version.getMinor()) 5532272c481SPavel Labath ++result; 5542272c481SPavel Labath if(version.getSubminor()) 5552272c481SPavel Labath ++result; 5562272c481SPavel Labath 5572272c481SPavel Labath if (!versions) 5582272c481SPavel Labath return result; 5592272c481SPavel Labath 5602272c481SPavel Labath if (num_versions > 0) 5612272c481SPavel Labath versions[0] = version.empty() ? UINT32_MAX : version.getMajor(); 5622272c481SPavel Labath if (num_versions > 1) 5632272c481SPavel Labath versions[1] = version.getMinor().getValueOr(UINT32_MAX); 5642272c481SPavel Labath if (num_versions > 2) 5652272c481SPavel Labath versions[2] = version.getSubminor().getValueOr(UINT32_MAX); 5662272c481SPavel Labath for (uint32_t i = 3; i < num_versions; ++i) 567c2ff9318SGreg Clayton versions[i] = UINT32_MAX; 5682272c481SPavel Labath return result; 5693467d80bSEnrico Granata } 570c2ff9318SGreg Clayton 571b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { 572eb2c19a5SIlia K lldb::SBFileSpec sb_file_spec; 573eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 574b9c1b51eSKate Stone if (module_sp) { 575eb2c19a5SIlia K SymbolVendor *symbol_vendor_ptr = module_sp->GetSymbolVendor(); 576eb2c19a5SIlia K if (symbol_vendor_ptr) 577eb2c19a5SIlia K sb_file_spec.SetFileSpec(symbol_vendor_ptr->GetMainFileSpec()); 578eb2c19a5SIlia K } 579eb2c19a5SIlia K return sb_file_spec; 580eb2c19a5SIlia K } 581eb2c19a5SIlia K 582b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { 583eb2c19a5SIlia K lldb::SBAddress sb_addr; 584eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 585b9c1b51eSKate Stone if (module_sp) { 586eb2c19a5SIlia K ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 587eb2c19a5SIlia K if (objfile_ptr) 588d1e3fe21SPavel Labath sb_addr.ref() = objfile_ptr->GetBaseAddress(); 589eb2c19a5SIlia K } 590eb2c19a5SIlia K return sb_addr; 591eb2c19a5SIlia K } 5929b087d2cSAleksandr Urakov 5939b087d2cSAleksandr Urakov lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const { 5949b087d2cSAleksandr Urakov lldb::SBAddress sb_addr; 5959b087d2cSAleksandr Urakov ModuleSP module_sp(GetSP()); 5969b087d2cSAleksandr Urakov if (module_sp) { 5979b087d2cSAleksandr Urakov ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 5989b087d2cSAleksandr Urakov if (objfile_ptr) 5999b087d2cSAleksandr Urakov sb_addr.ref() = objfile_ptr->GetEntryPointAddress(); 6009b087d2cSAleksandr Urakov } 6019b087d2cSAleksandr Urakov return sb_addr; 6029b087d2cSAleksandr Urakov } 603