180814287SRaphael Isemann //===-- SBModule.cpp ------------------------------------------------------===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler 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" 221f746071SGreg Clayton #include "lldb/Symbol/Symtab.h" 2356939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h" 24dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h" 25dea8cb4fSGreg Clayton #include "lldb/Target/Target.h" 261755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h" 27bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h" 2830fdc8d8SChris Lattner 2930fdc8d8SChris Lattner using namespace lldb; 30ceb6b139SCaroline Tice using namespace lldb_private; 3130fdc8d8SChris Lattner 321755f5b1SJonas Devlieghere SBModule::SBModule() { LLDB_INSTRUMENT_VA(this); } 3330fdc8d8SChris Lattner 34b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {} 3530fdc8d8SChris Lattner 36a3436f73SKazu Hirata SBModule::SBModule(const SBModuleSpec &module_spec) { 371755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, module_spec); 38baf5664fSJonas Devlieghere 39226cce25SGreg Clayton ModuleSP module_sp; 40248a1305SKonrad Kleine Status error = ModuleList::GetSharedModule( 41248a1305SKonrad Kleine *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr); 42226cce25SGreg Clayton if (module_sp) 43226cce25SGreg Clayton SetSP(module_sp); 44226cce25SGreg Clayton } 45226cce25SGreg Clayton 46baf5664fSJonas Devlieghere SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) { 471755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 48baf5664fSJonas Devlieghere } 49efabb123SGreg Clayton 50a3436f73SKazu Hirata SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) { 511755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, process, header_addr); 52baf5664fSJonas Devlieghere 53c9660546SGreg Clayton ProcessSP process_sp(process.GetSP()); 54b9c1b51eSKate Stone if (process_sp) { 5539f7ee86SGreg Clayton m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr); 56b9c1b51eSKate Stone if (m_opaque_sp) { 5739f7ee86SGreg Clayton Target &target = process_sp->GetTarget(); 5839f7ee86SGreg Clayton bool changed = false; 59751caf65SGreg Clayton m_opaque_sp->SetLoadAddress(target, 0, true, changed); 6039f7ee86SGreg Clayton target.GetImages().Append(m_opaque_sp); 6139f7ee86SGreg Clayton } 62c859e2d5SGreg Clayton } 63c9660546SGreg Clayton } 64c9660546SGreg Clayton 65b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) { 661755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 67baf5664fSJonas Devlieghere 68efabb123SGreg Clayton if (this != &rhs) 69efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 70d232abc3SJonas Devlieghere return *this; 71efabb123SGreg Clayton } 72efabb123SGreg Clayton 73866b7a65SJonas Devlieghere SBModule::~SBModule() = default; 7430fdc8d8SChris Lattner 75baf5664fSJonas Devlieghere bool SBModule::IsValid() const { 761755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 777f5237bcSPavel Labath return this->operator bool(); 787f5237bcSPavel Labath } 797f5237bcSPavel Labath SBModule::operator bool() const { 801755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 8130fdc8d8SChris Lattner 82248a1305SKonrad Kleine return m_opaque_sp.get() != nullptr; 83baf5664fSJonas Devlieghere } 84baf5664fSJonas Devlieghere 85baf5664fSJonas Devlieghere void SBModule::Clear() { 861755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 87baf5664fSJonas Devlieghere 88baf5664fSJonas Devlieghere m_opaque_sp.reset(); 89baf5664fSJonas Devlieghere } 905d3bca4eSJim Ingham 91*ff52ef33SMed Ismail Bennani bool SBModule::IsFileBacked() const { 92*ff52ef33SMed Ismail Bennani LLDB_INSTRUMENT_VA(this); 93*ff52ef33SMed Ismail Bennani 94*ff52ef33SMed Ismail Bennani ModuleSP module_sp(GetSP()); 95*ff52ef33SMed Ismail Bennani if (!module_sp) 96*ff52ef33SMed Ismail Bennani return false; 97*ff52ef33SMed Ismail Bennani 98*ff52ef33SMed Ismail Bennani ObjectFile *obj_file = module_sp->GetObjectFile(); 99*ff52ef33SMed Ismail Bennani if (!obj_file) 100*ff52ef33SMed Ismail Bennani return false; 101*ff52ef33SMed Ismail Bennani 102*ff52ef33SMed Ismail Bennani return !obj_file->IsInMemory(); 103*ff52ef33SMed Ismail Bennani } 104*ff52ef33SMed Ismail Bennani 105b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const { 1061755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 107baf5664fSJonas Devlieghere 10830fdc8d8SChris Lattner SBFileSpec file_spec; 109c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 110c2ff9318SGreg Clayton if (module_sp) 111c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetFileSpec()); 112ceb6b139SCaroline Tice 113d232abc3SJonas Devlieghere return file_spec; 11430fdc8d8SChris Lattner } 11530fdc8d8SChris Lattner 116b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const { 1171755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 118baf5664fSJonas Devlieghere 1192289fa48SGreg Clayton SBFileSpec file_spec; 120c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 121c2ff9318SGreg Clayton if (module_sp) 122c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetPlatformFileSpec()); 1232289fa48SGreg Clayton 124d232abc3SJonas Devlieghere return file_spec; 1252289fa48SGreg Clayton } 1262289fa48SGreg Clayton 127b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) { 1281755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, platform_file); 129baf5664fSJonas Devlieghere 1302289fa48SGreg Clayton bool result = false; 1312289fa48SGreg Clayton 132c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 133b9c1b51eSKate Stone if (module_sp) { 134c2ff9318SGreg Clayton module_sp->SetPlatformFileSpec(*platform_file); 1352289fa48SGreg Clayton result = true; 1362289fa48SGreg Clayton } 1372289fa48SGreg Clayton 1382289fa48SGreg Clayton return result; 1392289fa48SGreg Clayton } 1402289fa48SGreg Clayton 141b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() { 1421755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 143baf5664fSJonas Devlieghere 144fbb76349SGreg Clayton SBFileSpec sb_file_spec; 145fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 146fbb76349SGreg Clayton if (module_sp) 147fbb76349SGreg Clayton sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec()); 148d232abc3SJonas Devlieghere return sb_file_spec; 149fbb76349SGreg Clayton } 150fbb76349SGreg Clayton 151b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) { 1521755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, file); 153baf5664fSJonas Devlieghere 154fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 155b9c1b51eSKate Stone if (module_sp) { 156fbb76349SGreg Clayton module_sp->SetRemoteInstallFileSpec(file.ref()); 157fbb76349SGreg Clayton return true; 158fbb76349SGreg Clayton } 159fbb76349SGreg Clayton return false; 160fbb76349SGreg Clayton } 1612289fa48SGreg Clayton 162b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const { 1631755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 164baf5664fSJonas Devlieghere 165248a1305SKonrad Kleine const uint8_t *uuid_bytes = nullptr; 166c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 167c2ff9318SGreg Clayton if (module_sp) 168470b286eSPavel Labath uuid_bytes = module_sp->GetUUID().GetBytes().data(); 169ceb6b139SCaroline Tice 1704838131bSGreg Clayton return uuid_bytes; 17130fdc8d8SChris Lattner } 17230fdc8d8SChris Lattner 173b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const { 1741755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 175baf5664fSJonas Devlieghere 176248a1305SKonrad Kleine const char *uuid_cstr = nullptr; 177c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 178b9c1b51eSKate Stone if (module_sp) { 17905097246SAdrian Prantl // We are going to return a "const char *" value through the public API, so 18005097246SAdrian Prantl // we need to constify it so it gets added permanently the string pool and 18105097246SAdrian Prantl // then we don't need to worry about the lifetime of the string as it will 18205097246SAdrian Prantl // never go away once it has been put into the ConstString string pool 183f1be855aSGreg Clayton uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString(); 184f1be855aSGreg Clayton } 185f1be855aSGreg Clayton 186b9c1b51eSKate Stone if (uuid_cstr && uuid_cstr[0]) { 187f1be855aSGreg Clayton return uuid_cstr; 188c16b4af0SJason Molenda } 189df2963edSJohnny Chen 190248a1305SKonrad Kleine return nullptr; 191df2963edSJohnny Chen } 192df2963edSJohnny Chen 193b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const { 1941755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 195baf5664fSJonas Devlieghere 1966611103cSGreg Clayton if (m_opaque_sp) 1976611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 19830fdc8d8SChris Lattner return false; 19930fdc8d8SChris Lattner } 20030fdc8d8SChris Lattner 201b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const { 2021755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, rhs); 203baf5664fSJonas Devlieghere 2046611103cSGreg Clayton if (m_opaque_sp) 2056611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 20630fdc8d8SChris Lattner return false; 20730fdc8d8SChris Lattner } 20830fdc8d8SChris Lattner 209b9c1b51eSKate Stone ModuleSP SBModule::GetSP() const { return m_opaque_sp; } 21030fdc8d8SChris Lattner 211b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; } 21230fdc8d8SChris Lattner 213b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) { 2141755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, vm_addr); 215baf5664fSJonas Devlieghere 216cac9c5f9SGreg Clayton lldb::SBAddress sb_addr; 217c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 218b9c1b51eSKate Stone if (module_sp) { 219cac9c5f9SGreg Clayton Address addr; 220c2ff9318SGreg Clayton if (module_sp->ResolveFileAddress(vm_addr, addr)) 221cac9c5f9SGreg Clayton sb_addr.ref() = addr; 222cac9c5f9SGreg Clayton } 223d232abc3SJonas Devlieghere return sb_addr; 22409960031SGreg Clayton } 22509960031SGreg Clayton 22609960031SGreg Clayton SBSymbolContext 227b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr, 228b9c1b51eSKate Stone uint32_t resolve_scope) { 2291755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, addr, resolve_scope); 230baf5664fSJonas Devlieghere 23109960031SGreg Clayton SBSymbolContext sb_sc; 232c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 233991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 234c2ff9318SGreg Clayton if (module_sp && addr.IsValid()) 235991e4453SZachary Turner module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc); 236d232abc3SJonas Devlieghere return sb_sc; 23709960031SGreg Clayton } 23809960031SGreg Clayton 239b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) { 2401755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, description); 241baf5664fSJonas Devlieghere 242da7bc7d0SGreg Clayton Stream &strm = description.ref(); 243da7bc7d0SGreg Clayton 244c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 245b9c1b51eSKate Stone if (module_sp) { 246c4c464f8SRaphael Isemann module_sp->GetDescription(strm.AsRawOstream()); 247b9c1b51eSKate Stone } else 248da7bc7d0SGreg Clayton strm.PutCString("No value"); 249dde9cff3SCaroline Tice 250dde9cff3SCaroline Tice return true; 251dde9cff3SCaroline Tice } 252bbdabce2SGreg Clayton 253b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() { 2541755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 255baf5664fSJonas Devlieghere 256873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 257b9c1b51eSKate Stone if (module_sp) { 258873a7a4bSJohnny Chen return module_sp->GetNumCompileUnits(); 259873a7a4bSJohnny Chen } 260873a7a4bSJohnny Chen return 0; 261873a7a4bSJohnny Chen } 262873a7a4bSJohnny Chen 263b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) { 2641755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, index); 265baf5664fSJonas Devlieghere 266873a7a4bSJohnny Chen SBCompileUnit sb_cu; 267873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 268b9c1b51eSKate Stone if (module_sp) { 269873a7a4bSJohnny Chen CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index); 270873a7a4bSJohnny Chen sb_cu.reset(cu_sp.get()); 271873a7a4bSJohnny Chen } 272d232abc3SJonas Devlieghere return sb_cu; 273873a7a4bSJohnny Chen } 274873a7a4bSJohnny Chen 275baf5664fSJonas Devlieghere SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) { 2761755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, sb_file_spec); 277baf5664fSJonas Devlieghere 278da0c081fSAlexander Polyakov SBSymbolContextList sb_sc_list; 279da0c081fSAlexander Polyakov const ModuleSP module_sp(GetSP()); 280da0c081fSAlexander Polyakov if (sb_file_spec.IsValid() && module_sp) { 2811ad655e2SAdrian Prantl module_sp->FindCompileUnits(*sb_file_spec, *sb_sc_list); 282da0c081fSAlexander Polyakov } 283d232abc3SJonas Devlieghere return sb_sc_list; 284da0c081fSAlexander Polyakov } 285da0c081fSAlexander Polyakov 286b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) { 287d5d47a35SPavel Labath if (module_sp) 288d5d47a35SPavel Labath return module_sp->GetSymtab(); 289248a1305SKonrad Kleine return nullptr; 290a7499c98SMichael Sartain } 291a7499c98SMichael Sartain 292b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() { 2931755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 294baf5664fSJonas Devlieghere 295c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 296d5d47a35SPavel Labath if (Symtab *symtab = GetUnifiedSymbolTable(module_sp)) 297bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 298bbdabce2SGreg Clayton return 0; 299bbdabce2SGreg Clayton } 300bbdabce2SGreg Clayton 301b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) { 3021755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, idx); 303baf5664fSJonas Devlieghere 304bbdabce2SGreg Clayton SBSymbol sb_symbol; 305c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 306a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 307bbdabce2SGreg Clayton if (symtab) 308bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx)); 309d232abc3SJonas Devlieghere return sb_symbol; 310bbdabce2SGreg Clayton } 311fe356d35SGreg Clayton 312b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name, 313b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 3141755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, symbol_type); 315baf5664fSJonas Devlieghere 316e14e1925SGreg Clayton SBSymbol sb_symbol; 317b9c1b51eSKate Stone if (name && name[0]) { 318e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 319a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 320e14e1925SGreg Clayton if (symtab) 321b9c1b51eSKate Stone sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType( 322b9c1b51eSKate Stone ConstString(name), symbol_type, Symtab::eDebugAny, 323b9c1b51eSKate Stone Symtab::eVisibilityAny)); 324e14e1925SGreg Clayton } 325d232abc3SJonas Devlieghere return sb_symbol; 326e14e1925SGreg Clayton } 327e14e1925SGreg Clayton 328b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name, 329b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 3301755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, symbol_type); 331baf5664fSJonas Devlieghere 332e14e1925SGreg Clayton SBSymbolContextList sb_sc_list; 333b9c1b51eSKate Stone if (name && name[0]) { 334e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 335a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 336b9c1b51eSKate Stone if (symtab) { 337e14e1925SGreg Clayton std::vector<uint32_t> matching_symbol_indexes; 3381ad655e2SAdrian Prantl symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, 3391ad655e2SAdrian Prantl matching_symbol_indexes); 3401ad655e2SAdrian Prantl const size_t num_matches = matching_symbol_indexes.size(); 341b9c1b51eSKate Stone if (num_matches) { 342e14e1925SGreg Clayton SymbolContext sc; 343e14e1925SGreg Clayton sc.module_sp = module_sp; 344e14e1925SGreg Clayton SymbolContextList &sc_list = *sb_sc_list; 345b9c1b51eSKate Stone for (size_t i = 0; i < num_matches; ++i) { 346e14e1925SGreg Clayton sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]); 347e14e1925SGreg Clayton if (sc.symbol) 348e14e1925SGreg Clayton sc_list.Append(sc); 349e14e1925SGreg Clayton } 350e14e1925SGreg Clayton } 351e14e1925SGreg Clayton } 352e14e1925SGreg Clayton } 353d232abc3SJonas Devlieghere return sb_sc_list; 354e14e1925SGreg Clayton } 355e14e1925SGreg Clayton 356b9c1b51eSKate Stone size_t SBModule::GetNumSections() { 3571755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 358baf5664fSJonas Devlieghere 359c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 360b9c1b51eSKate Stone if (module_sp) { 361a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 362465eae36SPavel Labath module_sp->GetSymbolFile(); 3633046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 364cac9c5f9SGreg Clayton if (section_list) 365cac9c5f9SGreg Clayton return section_list->GetSize(); 366cac9c5f9SGreg Clayton } 367cac9c5f9SGreg Clayton return 0; 368cac9c5f9SGreg Clayton } 369cac9c5f9SGreg Clayton 370b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) { 3711755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, idx); 372baf5664fSJonas Devlieghere 373cac9c5f9SGreg Clayton SBSection sb_section; 374c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 375b9c1b51eSKate Stone if (module_sp) { 376a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 377465eae36SPavel Labath module_sp->GetSymbolFile(); 3783046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 379cac9c5f9SGreg Clayton 380cac9c5f9SGreg Clayton if (section_list) 381e72dfb32SGreg Clayton sb_section.SetSP(section_list->GetSectionAtIndex(idx)); 382cac9c5f9SGreg Clayton } 383d232abc3SJonas Devlieghere return sb_section; 384cac9c5f9SGreg Clayton } 385cac9c5f9SGreg Clayton 386b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name, 387b9c1b51eSKate Stone uint32_t name_type_mask) { 3881755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name, name_type_mask); 389baf5664fSJonas Devlieghere 3905569e64eSGreg Clayton lldb::SBSymbolContextList sb_sc_list; 391c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 392b9c1b51eSKate Stone if (name && module_sp) { 393c020be17SJonas Devlieghere 394c020be17SJonas Devlieghere ModuleFunctionSearchOptions function_options; 395c020be17SJonas Devlieghere function_options.include_symbols = true; 396c020be17SJonas Devlieghere function_options.include_inlines = true; 397117b1fa1SZachary Turner FunctionNameType type = static_cast<FunctionNameType>(name_type_mask); 398f9568a95SRaphael Isemann module_sp->FindFunctions(ConstString(name), CompilerDeclContext(), type, 399c020be17SJonas Devlieghere function_options, *sb_sc_list); 400fe356d35SGreg Clayton } 401d232abc3SJonas Devlieghere return sb_sc_list; 402fe356d35SGreg Clayton } 403fe356d35SGreg Clayton 404b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name, 405b9c1b51eSKate Stone uint32_t max_matches) { 4061755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target, name, max_matches); 407baf5664fSJonas Devlieghere 408dea8cb4fSGreg Clayton SBValueList sb_value_list; 409c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 410b9c1b51eSKate Stone if (name && module_sp) { 411dea8cb4fSGreg Clayton VariableList variable_list; 412f9568a95SRaphael Isemann module_sp->FindGlobalVariables(ConstString(name), CompilerDeclContext(), 413f9568a95SRaphael Isemann max_matches, variable_list); 414d1782133SRaphael Isemann for (const VariableSP &var_sp : variable_list) { 415dea8cb4fSGreg Clayton lldb::ValueObjectSP valobj_sp; 416b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 417d1782133SRaphael Isemann valobj_sp = ValueObjectVariable::Create(target_sp.get(), var_sp); 418dea8cb4fSGreg Clayton if (valobj_sp) 41985425d77SEnrico Granata sb_value_list.Append(SBValue(valobj_sp)); 420dea8cb4fSGreg Clayton } 421dea8cb4fSGreg Clayton } 422dea8cb4fSGreg Clayton 423d232abc3SJonas Devlieghere return sb_value_list; 424dea8cb4fSGreg Clayton } 4256f3533fbSEnrico Granata 426b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target, 427b9c1b51eSKate Stone const char *name) { 4281755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, target, name); 429baf5664fSJonas Devlieghere 430bcd80b47SEnrico Granata SBValueList sb_value_list(FindGlobalVariables(target, name, 1)); 431bcd80b47SEnrico Granata if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 432d232abc3SJonas Devlieghere return sb_value_list.GetValueAtIndex(0); 433d232abc3SJonas Devlieghere return SBValue(); 434bcd80b47SEnrico Granata } 435bcd80b47SEnrico Granata 436b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) { 4371755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, name_cstr); 438baf5664fSJonas Devlieghere 439fe42ac4dSGreg Clayton SBType sb_type; 440c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 441b9c1b51eSKate Stone if (name_cstr && module_sp) { 4426f3533fbSEnrico Granata SymbolContext sc; 44384db9105SGreg Clayton const bool exact_match = false; 4446f3533fbSEnrico Granata ConstString name(name_cstr); 4456f3533fbSEnrico Granata 446b43165b7SGreg Clayton sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match)); 4476f3533fbSEnrico Granata 448b9c1b51eSKate Stone if (!sb_type.IsValid()) { 4490e252e38SAlex Langford auto type_system_or_err = 450b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4510e252e38SAlex Langford if (auto err = type_system_or_err.takeError()) { 4520e252e38SAlex Langford llvm::consumeError(std::move(err)); 453d232abc3SJonas Devlieghere return SBType(); 4540e252e38SAlex Langford } 4550e252e38SAlex Langford sb_type = SBType(type_system_or_err->GetBuiltinTypeByName(name)); 45656939cb3SGreg Clayton } 4576f3533fbSEnrico Granata } 458d232abc3SJonas Devlieghere return sb_type; 4596f3533fbSEnrico Granata } 4606f3533fbSEnrico Granata 461b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) { 4621755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, type); 463baf5664fSJonas Devlieghere 464b43165b7SGreg Clayton ModuleSP module_sp(GetSP()); 465b9c1b51eSKate Stone if (module_sp) { 4660e252e38SAlex Langford auto type_system_or_err = 467b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4680e252e38SAlex Langford if (auto err = type_system_or_err.takeError()) { 4690e252e38SAlex Langford llvm::consumeError(std::move(err)); 4700e252e38SAlex Langford } else { 471d232abc3SJonas Devlieghere return SBType(type_system_or_err->GetBasicTypeFromAST(type)); 4720e252e38SAlex Langford } 47356939cb3SGreg Clayton } 474d232abc3SJonas Devlieghere return SBType(); 475b43165b7SGreg Clayton } 476b43165b7SGreg Clayton 477b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) { 4781755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, type); 479baf5664fSJonas Devlieghere 4806f3533fbSEnrico Granata SBTypeList retval; 4816f3533fbSEnrico Granata 482c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 483b9c1b51eSKate Stone if (type && module_sp) { 4846f3533fbSEnrico Granata TypeList type_list; 48584db9105SGreg Clayton const bool exact_match = false; 4866f3533fbSEnrico Granata ConstString name(type); 487ae088e52SGreg Clayton llvm::DenseSet<SymbolFile *> searched_symbol_files; 488bf9d84c0SAdrian Prantl module_sp->FindTypes(name, exact_match, UINT32_MAX, searched_symbol_files, 489bf9d84c0SAdrian Prantl type_list); 4906f3533fbSEnrico Granata 491bf9d84c0SAdrian Prantl if (type_list.Empty()) { 4920e252e38SAlex Langford auto type_system_or_err = 493b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4940e252e38SAlex Langford if (auto err = type_system_or_err.takeError()) { 4950e252e38SAlex Langford llvm::consumeError(std::move(err)); 4960e252e38SAlex Langford } else { 4970e252e38SAlex Langford CompilerType compiler_type = 4980e252e38SAlex Langford type_system_or_err->GetBuiltinTypeByName(name); 49956939cb3SGreg Clayton if (compiler_type) 50056939cb3SGreg Clayton retval.Append(SBType(compiler_type)); 50156939cb3SGreg Clayton } 502bf9d84c0SAdrian Prantl } else { 503bf9d84c0SAdrian Prantl for (size_t idx = 0; idx < type_list.GetSize(); idx++) { 504bf9d84c0SAdrian Prantl TypeSP type_sp(type_list.GetTypeAtIndex(idx)); 505bf9d84c0SAdrian Prantl if (type_sp) 506bf9d84c0SAdrian Prantl retval.Append(SBType(type_sp)); 507b43165b7SGreg Clayton } 508b43165b7SGreg Clayton } 509bf9d84c0SAdrian Prantl } 510d232abc3SJonas Devlieghere return retval; 5116f3533fbSEnrico Granata } 512cac9c5f9SGreg Clayton 513b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) { 5141755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, uid); 515baf5664fSJonas Devlieghere 5161f4db7daSGreg Clayton ModuleSP module_sp(GetSP()); 517b9c1b51eSKate Stone if (module_sp) { 518465eae36SPavel Labath if (SymbolFile *symfile = module_sp->GetSymbolFile()) { 519465eae36SPavel Labath Type *type_ptr = symfile->ResolveTypeUID(uid); 5201f4db7daSGreg Clayton if (type_ptr) 521d232abc3SJonas Devlieghere return SBType(type_ptr->shared_from_this()); 5221f4db7daSGreg Clayton } 5231f4db7daSGreg Clayton } 524d232abc3SJonas Devlieghere return SBType(); 5251f4db7daSGreg Clayton } 5261f4db7daSGreg Clayton 527b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) { 5281755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, type_mask); 529baf5664fSJonas Devlieghere 530f02500c7SGreg Clayton SBTypeList sb_type_list; 531f02500c7SGreg Clayton 532f02500c7SGreg Clayton ModuleSP module_sp(GetSP()); 533117b1fa1SZachary Turner if (!module_sp) 534d232abc3SJonas Devlieghere return sb_type_list; 535465eae36SPavel Labath SymbolFile *symfile = module_sp->GetSymbolFile(); 536465eae36SPavel Labath if (!symfile) 537d232abc3SJonas Devlieghere return sb_type_list; 538117b1fa1SZachary Turner 539117b1fa1SZachary Turner TypeClass type_class = static_cast<TypeClass>(type_mask); 540f02500c7SGreg Clayton TypeList type_list; 541465eae36SPavel Labath symfile->GetTypes(nullptr, type_class, type_list); 542d5b44036SJonas Devlieghere sb_type_list.m_opaque_up->Append(type_list); 543d232abc3SJonas Devlieghere return sb_type_list; 544f02500c7SGreg Clayton } 545cac9c5f9SGreg Clayton 546b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) { 5471755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, sect_name); 548baf5664fSJonas Devlieghere 549cac9c5f9SGreg Clayton SBSection sb_section; 550cac9c5f9SGreg Clayton 551c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 552b9c1b51eSKate Stone if (sect_name && module_sp) { 553a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 554465eae36SPavel Labath module_sp->GetSymbolFile(); 5553046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 556b9c1b51eSKate Stone if (section_list) { 557cac9c5f9SGreg Clayton ConstString const_sect_name(sect_name); 558cac9c5f9SGreg Clayton SectionSP section_sp(section_list->FindSectionByName(const_sect_name)); 559b9c1b51eSKate Stone if (section_sp) { 560e72dfb32SGreg Clayton sb_section.SetSP(section_sp); 561cac9c5f9SGreg Clayton } 562cac9c5f9SGreg Clayton } 563cac9c5f9SGreg Clayton } 564d232abc3SJonas Devlieghere return sb_section; 565cac9c5f9SGreg Clayton } 566cac9c5f9SGreg Clayton 567b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() { 5681755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 569baf5664fSJonas Devlieghere 570c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 571c2ff9318SGreg Clayton if (module_sp) 572c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetByteOrder(); 57313d1950aSGreg Clayton return eByteOrderInvalid; 57413d1950aSGreg Clayton } 57513d1950aSGreg Clayton 576b9c1b51eSKate Stone const char *SBModule::GetTriple() { 5771755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 578baf5664fSJonas Devlieghere 579c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 580b9c1b51eSKate Stone if (module_sp) { 581c2ff9318SGreg Clayton std::string triple(module_sp->GetArchitecture().GetTriple().str()); 58205097246SAdrian Prantl // Unique the string so we don't run into ownership issues since the const 58305097246SAdrian Prantl // strings put the string into the string pool once and the strings never 58405097246SAdrian Prantl // comes out 58513d1950aSGreg Clayton ConstString const_triple(triple.c_str()); 58613d1950aSGreg Clayton return const_triple.GetCString(); 58713d1950aSGreg Clayton } 588248a1305SKonrad Kleine return nullptr; 58913d1950aSGreg Clayton } 59013d1950aSGreg Clayton 591b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() { 5921755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 593baf5664fSJonas Devlieghere 594c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 595c2ff9318SGreg Clayton if (module_sp) 596c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetAddressByteSize(); 59713d1950aSGreg Clayton return sizeof(void *); 59813d1950aSGreg Clayton } 59913d1950aSGreg Clayton 600b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) { 6011755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this, versions, num_versions); 602baf5664fSJonas Devlieghere 6032272c481SPavel Labath llvm::VersionTuple version; 6042272c481SPavel Labath if (ModuleSP module_sp = GetSP()) 6052272c481SPavel Labath version = module_sp->GetVersion(); 6062272c481SPavel Labath uint32_t result = 0; 6072272c481SPavel Labath if (!version.empty()) 6082272c481SPavel Labath ++result; 6092272c481SPavel Labath if (version.getMinor()) 6102272c481SPavel Labath ++result; 6112272c481SPavel Labath if (version.getSubminor()) 6122272c481SPavel Labath ++result; 6132272c481SPavel Labath 6142272c481SPavel Labath if (!versions) 6152272c481SPavel Labath return result; 6162272c481SPavel Labath 6172272c481SPavel Labath if (num_versions > 0) 6182272c481SPavel Labath versions[0] = version.empty() ? UINT32_MAX : version.getMajor(); 6192272c481SPavel Labath if (num_versions > 1) 6202272c481SPavel Labath versions[1] = version.getMinor().getValueOr(UINT32_MAX); 6212272c481SPavel Labath if (num_versions > 2) 6222272c481SPavel Labath versions[2] = version.getSubminor().getValueOr(UINT32_MAX); 6232272c481SPavel Labath for (uint32_t i = 3; i < num_versions; ++i) 624c2ff9318SGreg Clayton versions[i] = UINT32_MAX; 6252272c481SPavel Labath return result; 6263467d80bSEnrico Granata } 627c2ff9318SGreg Clayton 628b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { 6291755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 630baf5664fSJonas Devlieghere 631eb2c19a5SIlia K lldb::SBFileSpec sb_file_spec; 632eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 633b9c1b51eSKate Stone if (module_sp) { 634465eae36SPavel Labath if (SymbolFile *symfile = module_sp->GetSymbolFile()) 635465eae36SPavel Labath sb_file_spec.SetFileSpec(symfile->GetObjectFile()->GetFileSpec()); 636eb2c19a5SIlia K } 637d232abc3SJonas Devlieghere return sb_file_spec; 638eb2c19a5SIlia K } 639eb2c19a5SIlia K 640b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { 6411755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 642baf5664fSJonas Devlieghere 643eb2c19a5SIlia K lldb::SBAddress sb_addr; 644eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 645b9c1b51eSKate Stone if (module_sp) { 646eb2c19a5SIlia K ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 647eb2c19a5SIlia K if (objfile_ptr) 648d1e3fe21SPavel Labath sb_addr.ref() = objfile_ptr->GetBaseAddress(); 649eb2c19a5SIlia K } 650d232abc3SJonas Devlieghere return sb_addr; 651eb2c19a5SIlia K } 6529b087d2cSAleksandr Urakov 6539b087d2cSAleksandr Urakov lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const { 6541755f5b1SJonas Devlieghere LLDB_INSTRUMENT_VA(this); 655baf5664fSJonas Devlieghere 6569b087d2cSAleksandr Urakov lldb::SBAddress sb_addr; 6579b087d2cSAleksandr Urakov ModuleSP module_sp(GetSP()); 6589b087d2cSAleksandr Urakov if (module_sp) { 6599b087d2cSAleksandr Urakov ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 6609b087d2cSAleksandr Urakov if (objfile_ptr) 6619b087d2cSAleksandr Urakov sb_addr.ref() = objfile_ptr->GetEntryPointAddress(); 6629b087d2cSAleksandr Urakov } 663d232abc3SJonas Devlieghere return sb_addr; 6649b087d2cSAleksandr Urakov } 665ae211eceSMichal Gorny 666da601ea7SJonas Devlieghere uint32_t SBModule::GetNumberAllocatedModules() { 6671755f5b1SJonas Devlieghere LLDB_INSTRUMENT(); 668da601ea7SJonas Devlieghere 669da601ea7SJonas Devlieghere return Module::GetNumberAllocatedModules(); 670da601ea7SJonas Devlieghere } 671da601ea7SJonas Devlieghere 672c2f9454aSRaphael Isemann void SBModule::GarbageCollectAllocatedModules() { 6731755f5b1SJonas Devlieghere LLDB_INSTRUMENT(); 674e095e98aSJonas Devlieghere 675c2f9454aSRaphael Isemann const bool mandatory = false; 676c2f9454aSRaphael Isemann ModuleList::RemoveOrphanSharedModules(mandatory); 677c2f9454aSRaphael Isemann } 678