15ffd83dbSDimitry Andric //===-- SBModule.cpp ------------------------------------------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #include "lldb/API/SBModule.h" 10*0b57cec5SDimitry Andric #include "lldb/API/SBAddress.h" 11*0b57cec5SDimitry Andric #include "lldb/API/SBFileSpec.h" 12*0b57cec5SDimitry Andric #include "lldb/API/SBModuleSpec.h" 13*0b57cec5SDimitry Andric #include "lldb/API/SBProcess.h" 14*0b57cec5SDimitry Andric #include "lldb/API/SBStream.h" 15*0b57cec5SDimitry Andric #include "lldb/API/SBSymbolContextList.h" 16*0b57cec5SDimitry Andric #include "lldb/Core/Module.h" 17*0b57cec5SDimitry Andric #include "lldb/Core/Section.h" 18*0b57cec5SDimitry Andric #include "lldb/Core/ValueObjectList.h" 19*0b57cec5SDimitry Andric #include "lldb/Core/ValueObjectVariable.h" 20*0b57cec5SDimitry Andric #include "lldb/Symbol/ObjectFile.h" 21*0b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h" 22*0b57cec5SDimitry Andric #include "lldb/Symbol/Symtab.h" 23*0b57cec5SDimitry Andric #include "lldb/Symbol/TypeSystem.h" 24*0b57cec5SDimitry Andric #include "lldb/Symbol/VariableList.h" 25*0b57cec5SDimitry Andric #include "lldb/Target/Target.h" 2604eeddc0SDimitry Andric #include "lldb/Utility/Instrumentation.h" 27*0b57cec5SDimitry Andric #include "lldb/Utility/StreamString.h" 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric using namespace lldb; 30*0b57cec5SDimitry Andric using namespace lldb_private; 31*0b57cec5SDimitry Andric 3204eeddc0SDimitry Andric SBModule::SBModule() { LLDB_INSTRUMENT_VA(this); } 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {} 35*0b57cec5SDimitry Andric 3604eeddc0SDimitry Andric SBModule::SBModule(const SBModuleSpec &module_spec) { 3704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, module_spec); 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric ModuleSP module_sp; 40*0b57cec5SDimitry Andric Status error = ModuleList::GetSharedModule( 41*0b57cec5SDimitry Andric *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr); 42*0b57cec5SDimitry Andric if (module_sp) 43*0b57cec5SDimitry Andric SetSP(module_sp); 44*0b57cec5SDimitry Andric } 45*0b57cec5SDimitry Andric 46*0b57cec5SDimitry Andric SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) { 4704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 48*0b57cec5SDimitry Andric } 49*0b57cec5SDimitry Andric 5004eeddc0SDimitry Andric SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) { 5104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, process, header_addr); 52*0b57cec5SDimitry Andric 53*0b57cec5SDimitry Andric ProcessSP process_sp(process.GetSP()); 54*0b57cec5SDimitry Andric if (process_sp) { 55*0b57cec5SDimitry Andric m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr); 56*0b57cec5SDimitry Andric if (m_opaque_sp) { 57*0b57cec5SDimitry Andric Target &target = process_sp->GetTarget(); 58*0b57cec5SDimitry Andric bool changed = false; 59*0b57cec5SDimitry Andric m_opaque_sp->SetLoadAddress(target, 0, true, changed); 60*0b57cec5SDimitry Andric target.GetImages().Append(m_opaque_sp); 61*0b57cec5SDimitry Andric } 62*0b57cec5SDimitry Andric } 63*0b57cec5SDimitry Andric } 64*0b57cec5SDimitry Andric 65*0b57cec5SDimitry Andric const SBModule &SBModule::operator=(const SBModule &rhs) { 6604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 67*0b57cec5SDimitry Andric 68*0b57cec5SDimitry Andric if (this != &rhs) 69*0b57cec5SDimitry Andric m_opaque_sp = rhs.m_opaque_sp; 7004eeddc0SDimitry Andric return *this; 71*0b57cec5SDimitry Andric } 72*0b57cec5SDimitry Andric 735ffd83dbSDimitry Andric SBModule::~SBModule() = default; 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric bool SBModule::IsValid() const { 7604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 77*0b57cec5SDimitry Andric return this->operator bool(); 78*0b57cec5SDimitry Andric } 79*0b57cec5SDimitry Andric SBModule::operator bool() const { 8004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 81*0b57cec5SDimitry Andric 82*0b57cec5SDimitry Andric return m_opaque_sp.get() != nullptr; 83*0b57cec5SDimitry Andric } 84*0b57cec5SDimitry Andric 85*0b57cec5SDimitry Andric void SBModule::Clear() { 8604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 87*0b57cec5SDimitry Andric 88*0b57cec5SDimitry Andric m_opaque_sp.reset(); 89*0b57cec5SDimitry Andric } 90*0b57cec5SDimitry Andric 9104eeddc0SDimitry Andric bool SBModule::IsFileBacked() const { 9204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 9304eeddc0SDimitry Andric 9404eeddc0SDimitry Andric ModuleSP module_sp(GetSP()); 9504eeddc0SDimitry Andric if (!module_sp) 9604eeddc0SDimitry Andric return false; 9704eeddc0SDimitry Andric 9804eeddc0SDimitry Andric ObjectFile *obj_file = module_sp->GetObjectFile(); 9904eeddc0SDimitry Andric if (!obj_file) 10004eeddc0SDimitry Andric return false; 10104eeddc0SDimitry Andric 10204eeddc0SDimitry Andric return !obj_file->IsInMemory(); 10304eeddc0SDimitry Andric } 10404eeddc0SDimitry Andric 105*0b57cec5SDimitry Andric SBFileSpec SBModule::GetFileSpec() const { 10604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 107*0b57cec5SDimitry Andric 108*0b57cec5SDimitry Andric SBFileSpec file_spec; 109*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 110*0b57cec5SDimitry Andric if (module_sp) 111*0b57cec5SDimitry Andric file_spec.SetFileSpec(module_sp->GetFileSpec()); 112*0b57cec5SDimitry Andric 11304eeddc0SDimitry Andric return file_spec; 114*0b57cec5SDimitry Andric } 115*0b57cec5SDimitry Andric 116*0b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetPlatformFileSpec() const { 11704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 118*0b57cec5SDimitry Andric 119*0b57cec5SDimitry Andric SBFileSpec file_spec; 120*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 121*0b57cec5SDimitry Andric if (module_sp) 122*0b57cec5SDimitry Andric file_spec.SetFileSpec(module_sp->GetPlatformFileSpec()); 123*0b57cec5SDimitry Andric 12404eeddc0SDimitry Andric return file_spec; 125*0b57cec5SDimitry Andric } 126*0b57cec5SDimitry Andric 127*0b57cec5SDimitry Andric bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) { 12804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, platform_file); 129*0b57cec5SDimitry Andric 130*0b57cec5SDimitry Andric bool result = false; 131*0b57cec5SDimitry Andric 132*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 133*0b57cec5SDimitry Andric if (module_sp) { 134*0b57cec5SDimitry Andric module_sp->SetPlatformFileSpec(*platform_file); 135*0b57cec5SDimitry Andric result = true; 136*0b57cec5SDimitry Andric } 137*0b57cec5SDimitry Andric 138*0b57cec5SDimitry Andric return result; 139*0b57cec5SDimitry Andric } 140*0b57cec5SDimitry Andric 141*0b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() { 14204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 143*0b57cec5SDimitry Andric 144*0b57cec5SDimitry Andric SBFileSpec sb_file_spec; 145*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 146*0b57cec5SDimitry Andric if (module_sp) 147*0b57cec5SDimitry Andric sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec()); 14804eeddc0SDimitry Andric return sb_file_spec; 149*0b57cec5SDimitry Andric } 150*0b57cec5SDimitry Andric 151*0b57cec5SDimitry Andric bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) { 15204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, file); 153*0b57cec5SDimitry Andric 154*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 155*0b57cec5SDimitry Andric if (module_sp) { 156*0b57cec5SDimitry Andric module_sp->SetRemoteInstallFileSpec(file.ref()); 157*0b57cec5SDimitry Andric return true; 158*0b57cec5SDimitry Andric } 159*0b57cec5SDimitry Andric return false; 160*0b57cec5SDimitry Andric } 161*0b57cec5SDimitry Andric 162*0b57cec5SDimitry Andric const uint8_t *SBModule::GetUUIDBytes() const { 16304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 164*0b57cec5SDimitry Andric 165*0b57cec5SDimitry Andric const uint8_t *uuid_bytes = nullptr; 166*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 167*0b57cec5SDimitry Andric if (module_sp) 168*0b57cec5SDimitry Andric uuid_bytes = module_sp->GetUUID().GetBytes().data(); 169*0b57cec5SDimitry Andric 170*0b57cec5SDimitry Andric return uuid_bytes; 171*0b57cec5SDimitry Andric } 172*0b57cec5SDimitry Andric 173*0b57cec5SDimitry Andric const char *SBModule::GetUUIDString() const { 17404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 175*0b57cec5SDimitry Andric 176*0b57cec5SDimitry Andric const char *uuid_cstr = nullptr; 177*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 178*0b57cec5SDimitry Andric if (module_sp) { 179*0b57cec5SDimitry Andric // We are going to return a "const char *" value through the public API, so 180*0b57cec5SDimitry Andric // we need to constify it so it gets added permanently the string pool and 181*0b57cec5SDimitry Andric // then we don't need to worry about the lifetime of the string as it will 182*0b57cec5SDimitry Andric // never go away once it has been put into the ConstString string pool 183*0b57cec5SDimitry Andric uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString(); 184*0b57cec5SDimitry Andric } 185*0b57cec5SDimitry Andric 186*0b57cec5SDimitry Andric if (uuid_cstr && uuid_cstr[0]) { 187*0b57cec5SDimitry Andric return uuid_cstr; 188*0b57cec5SDimitry Andric } 189*0b57cec5SDimitry Andric 190*0b57cec5SDimitry Andric return nullptr; 191*0b57cec5SDimitry Andric } 192*0b57cec5SDimitry Andric 193*0b57cec5SDimitry Andric bool SBModule::operator==(const SBModule &rhs) const { 19404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 195*0b57cec5SDimitry Andric 196*0b57cec5SDimitry Andric if (m_opaque_sp) 197*0b57cec5SDimitry Andric return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 198*0b57cec5SDimitry Andric return false; 199*0b57cec5SDimitry Andric } 200*0b57cec5SDimitry Andric 201*0b57cec5SDimitry Andric bool SBModule::operator!=(const SBModule &rhs) const { 20204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, rhs); 203*0b57cec5SDimitry Andric 204*0b57cec5SDimitry Andric if (m_opaque_sp) 205*0b57cec5SDimitry Andric return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 206*0b57cec5SDimitry Andric return false; 207*0b57cec5SDimitry Andric } 208*0b57cec5SDimitry Andric 209*0b57cec5SDimitry Andric ModuleSP SBModule::GetSP() const { return m_opaque_sp; } 210*0b57cec5SDimitry Andric 211*0b57cec5SDimitry Andric void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; } 212*0b57cec5SDimitry Andric 213*0b57cec5SDimitry Andric SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) { 21404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, vm_addr); 215*0b57cec5SDimitry Andric 216*0b57cec5SDimitry Andric lldb::SBAddress sb_addr; 217*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 218*0b57cec5SDimitry Andric if (module_sp) { 219*0b57cec5SDimitry Andric Address addr; 220*0b57cec5SDimitry Andric if (module_sp->ResolveFileAddress(vm_addr, addr)) 221*0b57cec5SDimitry Andric sb_addr.ref() = addr; 222*0b57cec5SDimitry Andric } 22304eeddc0SDimitry Andric return sb_addr; 224*0b57cec5SDimitry Andric } 225*0b57cec5SDimitry Andric 226*0b57cec5SDimitry Andric SBSymbolContext 227*0b57cec5SDimitry Andric SBModule::ResolveSymbolContextForAddress(const SBAddress &addr, 228*0b57cec5SDimitry Andric uint32_t resolve_scope) { 22904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, addr, resolve_scope); 230*0b57cec5SDimitry Andric 231*0b57cec5SDimitry Andric SBSymbolContext sb_sc; 232*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 233*0b57cec5SDimitry Andric SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 234*0b57cec5SDimitry Andric if (module_sp && addr.IsValid()) 235*0b57cec5SDimitry Andric module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc); 23604eeddc0SDimitry Andric return sb_sc; 237*0b57cec5SDimitry Andric } 238*0b57cec5SDimitry Andric 239*0b57cec5SDimitry Andric bool SBModule::GetDescription(SBStream &description) { 24004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, description); 241*0b57cec5SDimitry Andric 242*0b57cec5SDimitry Andric Stream &strm = description.ref(); 243*0b57cec5SDimitry Andric 244*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 245*0b57cec5SDimitry Andric if (module_sp) { 246480093f4SDimitry Andric module_sp->GetDescription(strm.AsRawOstream()); 247*0b57cec5SDimitry Andric } else 248*0b57cec5SDimitry Andric strm.PutCString("No value"); 249*0b57cec5SDimitry Andric 250*0b57cec5SDimitry Andric return true; 251*0b57cec5SDimitry Andric } 252*0b57cec5SDimitry Andric 253*0b57cec5SDimitry Andric uint32_t SBModule::GetNumCompileUnits() { 25404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 255*0b57cec5SDimitry Andric 256*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 257*0b57cec5SDimitry Andric if (module_sp) { 258*0b57cec5SDimitry Andric return module_sp->GetNumCompileUnits(); 259*0b57cec5SDimitry Andric } 260*0b57cec5SDimitry Andric return 0; 261*0b57cec5SDimitry Andric } 262*0b57cec5SDimitry Andric 263*0b57cec5SDimitry Andric SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) { 26404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, index); 265*0b57cec5SDimitry Andric 266*0b57cec5SDimitry Andric SBCompileUnit sb_cu; 267*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 268*0b57cec5SDimitry Andric if (module_sp) { 269*0b57cec5SDimitry Andric CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index); 270*0b57cec5SDimitry Andric sb_cu.reset(cu_sp.get()); 271*0b57cec5SDimitry Andric } 27204eeddc0SDimitry Andric return sb_cu; 273*0b57cec5SDimitry Andric } 274*0b57cec5SDimitry Andric 275*0b57cec5SDimitry Andric SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) { 27604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sb_file_spec); 277*0b57cec5SDimitry Andric 278*0b57cec5SDimitry Andric SBSymbolContextList sb_sc_list; 279*0b57cec5SDimitry Andric const ModuleSP module_sp(GetSP()); 280*0b57cec5SDimitry Andric if (sb_file_spec.IsValid() && module_sp) { 2819dba64beSDimitry Andric module_sp->FindCompileUnits(*sb_file_spec, *sb_sc_list); 282*0b57cec5SDimitry Andric } 28304eeddc0SDimitry Andric return sb_sc_list; 284*0b57cec5SDimitry Andric } 285*0b57cec5SDimitry Andric 286*0b57cec5SDimitry Andric static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) { 2879dba64beSDimitry Andric if (module_sp) 2889dba64beSDimitry Andric return module_sp->GetSymtab(); 289*0b57cec5SDimitry Andric return nullptr; 290*0b57cec5SDimitry Andric } 291*0b57cec5SDimitry Andric 292*0b57cec5SDimitry Andric size_t SBModule::GetNumSymbols() { 29304eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 294*0b57cec5SDimitry Andric 295*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 2969dba64beSDimitry Andric if (Symtab *symtab = GetUnifiedSymbolTable(module_sp)) 297*0b57cec5SDimitry Andric return symtab->GetNumSymbols(); 298*0b57cec5SDimitry Andric return 0; 299*0b57cec5SDimitry Andric } 300*0b57cec5SDimitry Andric 301*0b57cec5SDimitry Andric SBSymbol SBModule::GetSymbolAtIndex(size_t idx) { 30204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, idx); 303*0b57cec5SDimitry Andric 304*0b57cec5SDimitry Andric SBSymbol sb_symbol; 305*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 306*0b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp); 307*0b57cec5SDimitry Andric if (symtab) 308*0b57cec5SDimitry Andric sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx)); 30904eeddc0SDimitry Andric return sb_symbol; 310*0b57cec5SDimitry Andric } 311*0b57cec5SDimitry Andric 312*0b57cec5SDimitry Andric lldb::SBSymbol SBModule::FindSymbol(const char *name, 313*0b57cec5SDimitry Andric lldb::SymbolType symbol_type) { 31404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name, symbol_type); 315*0b57cec5SDimitry Andric 316*0b57cec5SDimitry Andric SBSymbol sb_symbol; 317*0b57cec5SDimitry Andric if (name && name[0]) { 318*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 319*0b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp); 320*0b57cec5SDimitry Andric if (symtab) 321*0b57cec5SDimitry Andric sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType( 322*0b57cec5SDimitry Andric ConstString(name), symbol_type, Symtab::eDebugAny, 323*0b57cec5SDimitry Andric Symtab::eVisibilityAny)); 324*0b57cec5SDimitry Andric } 32504eeddc0SDimitry Andric return sb_symbol; 326*0b57cec5SDimitry Andric } 327*0b57cec5SDimitry Andric 328*0b57cec5SDimitry Andric lldb::SBSymbolContextList SBModule::FindSymbols(const char *name, 329*0b57cec5SDimitry Andric lldb::SymbolType symbol_type) { 33004eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name, symbol_type); 331*0b57cec5SDimitry Andric 332*0b57cec5SDimitry Andric SBSymbolContextList sb_sc_list; 333*0b57cec5SDimitry Andric if (name && name[0]) { 334*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 335*0b57cec5SDimitry Andric Symtab *symtab = GetUnifiedSymbolTable(module_sp); 336*0b57cec5SDimitry Andric if (symtab) { 337*0b57cec5SDimitry Andric std::vector<uint32_t> matching_symbol_indexes; 3389dba64beSDimitry Andric symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, 3399dba64beSDimitry Andric matching_symbol_indexes); 3409dba64beSDimitry Andric const size_t num_matches = matching_symbol_indexes.size(); 341*0b57cec5SDimitry Andric if (num_matches) { 342*0b57cec5SDimitry Andric SymbolContext sc; 343*0b57cec5SDimitry Andric sc.module_sp = module_sp; 344*0b57cec5SDimitry Andric SymbolContextList &sc_list = *sb_sc_list; 345*0b57cec5SDimitry Andric for (size_t i = 0; i < num_matches; ++i) { 346*0b57cec5SDimitry Andric sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]); 347*0b57cec5SDimitry Andric if (sc.symbol) 348*0b57cec5SDimitry Andric sc_list.Append(sc); 349*0b57cec5SDimitry Andric } 350*0b57cec5SDimitry Andric } 351*0b57cec5SDimitry Andric } 352*0b57cec5SDimitry Andric } 35304eeddc0SDimitry Andric return sb_sc_list; 354*0b57cec5SDimitry Andric } 355*0b57cec5SDimitry Andric 356*0b57cec5SDimitry Andric size_t SBModule::GetNumSections() { 35704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 358*0b57cec5SDimitry Andric 359*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 360*0b57cec5SDimitry Andric if (module_sp) { 361*0b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list. 3629dba64beSDimitry Andric module_sp->GetSymbolFile(); 363*0b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList(); 364*0b57cec5SDimitry Andric if (section_list) 365*0b57cec5SDimitry Andric return section_list->GetSize(); 366*0b57cec5SDimitry Andric } 367*0b57cec5SDimitry Andric return 0; 368*0b57cec5SDimitry Andric } 369*0b57cec5SDimitry Andric 370*0b57cec5SDimitry Andric SBSection SBModule::GetSectionAtIndex(size_t idx) { 37104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, idx); 372*0b57cec5SDimitry Andric 373*0b57cec5SDimitry Andric SBSection sb_section; 374*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 375*0b57cec5SDimitry Andric if (module_sp) { 376*0b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list. 3779dba64beSDimitry Andric module_sp->GetSymbolFile(); 378*0b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList(); 379*0b57cec5SDimitry Andric 380*0b57cec5SDimitry Andric if (section_list) 381*0b57cec5SDimitry Andric sb_section.SetSP(section_list->GetSectionAtIndex(idx)); 382*0b57cec5SDimitry Andric } 38304eeddc0SDimitry Andric return sb_section; 384*0b57cec5SDimitry Andric } 385*0b57cec5SDimitry Andric 386*0b57cec5SDimitry Andric lldb::SBSymbolContextList SBModule::FindFunctions(const char *name, 387*0b57cec5SDimitry Andric uint32_t name_type_mask) { 38804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name, name_type_mask); 389*0b57cec5SDimitry Andric 390*0b57cec5SDimitry Andric lldb::SBSymbolContextList sb_sc_list; 391*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 392*0b57cec5SDimitry Andric if (name && module_sp) { 393349cc55cSDimitry Andric 394349cc55cSDimitry Andric ModuleFunctionSearchOptions function_options; 395349cc55cSDimitry Andric function_options.include_symbols = true; 396349cc55cSDimitry Andric function_options.include_inlines = true; 397*0b57cec5SDimitry Andric FunctionNameType type = static_cast<FunctionNameType>(name_type_mask); 3985ffd83dbSDimitry Andric module_sp->FindFunctions(ConstString(name), CompilerDeclContext(), type, 399349cc55cSDimitry Andric function_options, *sb_sc_list); 400*0b57cec5SDimitry Andric } 40104eeddc0SDimitry Andric return sb_sc_list; 402*0b57cec5SDimitry Andric } 403*0b57cec5SDimitry Andric 404*0b57cec5SDimitry Andric SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name, 405*0b57cec5SDimitry Andric uint32_t max_matches) { 40604eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, target, name, max_matches); 407*0b57cec5SDimitry Andric 408*0b57cec5SDimitry Andric SBValueList sb_value_list; 409*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 410*0b57cec5SDimitry Andric if (name && module_sp) { 411*0b57cec5SDimitry Andric VariableList variable_list; 4125ffd83dbSDimitry Andric module_sp->FindGlobalVariables(ConstString(name), CompilerDeclContext(), 4135ffd83dbSDimitry Andric max_matches, variable_list); 414480093f4SDimitry Andric for (const VariableSP &var_sp : variable_list) { 415*0b57cec5SDimitry Andric lldb::ValueObjectSP valobj_sp; 416*0b57cec5SDimitry Andric TargetSP target_sp(target.GetSP()); 417480093f4SDimitry Andric valobj_sp = ValueObjectVariable::Create(target_sp.get(), var_sp); 418*0b57cec5SDimitry Andric if (valobj_sp) 419*0b57cec5SDimitry Andric sb_value_list.Append(SBValue(valobj_sp)); 420*0b57cec5SDimitry Andric } 421*0b57cec5SDimitry Andric } 422*0b57cec5SDimitry Andric 42304eeddc0SDimitry Andric return sb_value_list; 424*0b57cec5SDimitry Andric } 425*0b57cec5SDimitry Andric 426*0b57cec5SDimitry Andric lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target, 427*0b57cec5SDimitry Andric const char *name) { 42804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, target, name); 429*0b57cec5SDimitry Andric 430*0b57cec5SDimitry Andric SBValueList sb_value_list(FindGlobalVariables(target, name, 1)); 431*0b57cec5SDimitry Andric if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 43204eeddc0SDimitry Andric return sb_value_list.GetValueAtIndex(0); 43304eeddc0SDimitry Andric return SBValue(); 434*0b57cec5SDimitry Andric } 435*0b57cec5SDimitry Andric 436*0b57cec5SDimitry Andric lldb::SBType SBModule::FindFirstType(const char *name_cstr) { 43704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, name_cstr); 438*0b57cec5SDimitry Andric 439*0b57cec5SDimitry Andric SBType sb_type; 440*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 441*0b57cec5SDimitry Andric if (name_cstr && module_sp) { 442*0b57cec5SDimitry Andric SymbolContext sc; 443*0b57cec5SDimitry Andric const bool exact_match = false; 444*0b57cec5SDimitry Andric ConstString name(name_cstr); 445*0b57cec5SDimitry Andric 446*0b57cec5SDimitry Andric sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match)); 447*0b57cec5SDimitry Andric 448*0b57cec5SDimitry Andric if (!sb_type.IsValid()) { 4499dba64beSDimitry Andric auto type_system_or_err = 450*0b57cec5SDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4519dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) { 4529dba64beSDimitry Andric llvm::consumeError(std::move(err)); 45304eeddc0SDimitry Andric return SBType(); 4549dba64beSDimitry Andric } 4559dba64beSDimitry Andric sb_type = SBType(type_system_or_err->GetBuiltinTypeByName(name)); 456*0b57cec5SDimitry Andric } 457*0b57cec5SDimitry Andric } 45804eeddc0SDimitry Andric return sb_type; 459*0b57cec5SDimitry Andric } 460*0b57cec5SDimitry Andric 461*0b57cec5SDimitry Andric lldb::SBType SBModule::GetBasicType(lldb::BasicType type) { 46204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, type); 463*0b57cec5SDimitry Andric 464*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 465*0b57cec5SDimitry Andric if (module_sp) { 4669dba64beSDimitry Andric auto type_system_or_err = 467*0b57cec5SDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4689dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) { 4699dba64beSDimitry Andric llvm::consumeError(std::move(err)); 4709dba64beSDimitry Andric } else { 47104eeddc0SDimitry Andric return SBType(type_system_or_err->GetBasicTypeFromAST(type)); 4729dba64beSDimitry Andric } 473*0b57cec5SDimitry Andric } 47404eeddc0SDimitry Andric return SBType(); 475*0b57cec5SDimitry Andric } 476*0b57cec5SDimitry Andric 477*0b57cec5SDimitry Andric lldb::SBTypeList SBModule::FindTypes(const char *type) { 47804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, type); 479*0b57cec5SDimitry Andric 480*0b57cec5SDimitry Andric SBTypeList retval; 481*0b57cec5SDimitry Andric 482*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 483*0b57cec5SDimitry Andric if (type && module_sp) { 484*0b57cec5SDimitry Andric TypeList type_list; 485*0b57cec5SDimitry Andric const bool exact_match = false; 486*0b57cec5SDimitry Andric ConstString name(type); 487*0b57cec5SDimitry Andric llvm::DenseSet<SymbolFile *> searched_symbol_files; 4889dba64beSDimitry Andric module_sp->FindTypes(name, exact_match, UINT32_MAX, searched_symbol_files, 4899dba64beSDimitry Andric type_list); 490*0b57cec5SDimitry Andric 4919dba64beSDimitry Andric if (type_list.Empty()) { 4929dba64beSDimitry Andric auto type_system_or_err = 4939dba64beSDimitry Andric module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 4949dba64beSDimitry Andric if (auto err = type_system_or_err.takeError()) { 4959dba64beSDimitry Andric llvm::consumeError(std::move(err)); 4969dba64beSDimitry Andric } else { 4979dba64beSDimitry Andric CompilerType compiler_type = 4989dba64beSDimitry Andric type_system_or_err->GetBuiltinTypeByName(name); 4999dba64beSDimitry Andric if (compiler_type) 5009dba64beSDimitry Andric retval.Append(SBType(compiler_type)); 5019dba64beSDimitry Andric } 5029dba64beSDimitry Andric } else { 5039dba64beSDimitry Andric for (size_t idx = 0; idx < type_list.GetSize(); idx++) { 504*0b57cec5SDimitry Andric TypeSP type_sp(type_list.GetTypeAtIndex(idx)); 505*0b57cec5SDimitry Andric if (type_sp) 506*0b57cec5SDimitry Andric retval.Append(SBType(type_sp)); 507*0b57cec5SDimitry Andric } 508*0b57cec5SDimitry Andric } 509*0b57cec5SDimitry Andric } 51004eeddc0SDimitry Andric return retval; 511*0b57cec5SDimitry Andric } 512*0b57cec5SDimitry Andric 513*0b57cec5SDimitry Andric lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) { 51404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, uid); 515*0b57cec5SDimitry Andric 516*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 517*0b57cec5SDimitry Andric if (module_sp) { 5189dba64beSDimitry Andric if (SymbolFile *symfile = module_sp->GetSymbolFile()) { 5199dba64beSDimitry Andric Type *type_ptr = symfile->ResolveTypeUID(uid); 520*0b57cec5SDimitry Andric if (type_ptr) 52104eeddc0SDimitry Andric return SBType(type_ptr->shared_from_this()); 522*0b57cec5SDimitry Andric } 523*0b57cec5SDimitry Andric } 52404eeddc0SDimitry Andric return SBType(); 525*0b57cec5SDimitry Andric } 526*0b57cec5SDimitry Andric 527*0b57cec5SDimitry Andric lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) { 52804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, type_mask); 529*0b57cec5SDimitry Andric 530*0b57cec5SDimitry Andric SBTypeList sb_type_list; 531*0b57cec5SDimitry Andric 532*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 533*0b57cec5SDimitry Andric if (!module_sp) 53404eeddc0SDimitry Andric return sb_type_list; 5359dba64beSDimitry Andric SymbolFile *symfile = module_sp->GetSymbolFile(); 5369dba64beSDimitry Andric if (!symfile) 53704eeddc0SDimitry Andric return sb_type_list; 538*0b57cec5SDimitry Andric 539*0b57cec5SDimitry Andric TypeClass type_class = static_cast<TypeClass>(type_mask); 540*0b57cec5SDimitry Andric TypeList type_list; 5419dba64beSDimitry Andric symfile->GetTypes(nullptr, type_class, type_list); 542*0b57cec5SDimitry Andric sb_type_list.m_opaque_up->Append(type_list); 54304eeddc0SDimitry Andric return sb_type_list; 544*0b57cec5SDimitry Andric } 545*0b57cec5SDimitry Andric 546*0b57cec5SDimitry Andric SBSection SBModule::FindSection(const char *sect_name) { 54704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, sect_name); 548*0b57cec5SDimitry Andric 549*0b57cec5SDimitry Andric SBSection sb_section; 550*0b57cec5SDimitry Andric 551*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 552*0b57cec5SDimitry Andric if (sect_name && module_sp) { 553*0b57cec5SDimitry Andric // Give the symbol vendor a chance to add to the unified section list. 5549dba64beSDimitry Andric module_sp->GetSymbolFile(); 555*0b57cec5SDimitry Andric SectionList *section_list = module_sp->GetSectionList(); 556*0b57cec5SDimitry Andric if (section_list) { 557*0b57cec5SDimitry Andric ConstString const_sect_name(sect_name); 558*0b57cec5SDimitry Andric SectionSP section_sp(section_list->FindSectionByName(const_sect_name)); 559*0b57cec5SDimitry Andric if (section_sp) { 560*0b57cec5SDimitry Andric sb_section.SetSP(section_sp); 561*0b57cec5SDimitry Andric } 562*0b57cec5SDimitry Andric } 563*0b57cec5SDimitry Andric } 56404eeddc0SDimitry Andric return sb_section; 565*0b57cec5SDimitry Andric } 566*0b57cec5SDimitry Andric 567*0b57cec5SDimitry Andric lldb::ByteOrder SBModule::GetByteOrder() { 56804eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 569*0b57cec5SDimitry Andric 570*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 571*0b57cec5SDimitry Andric if (module_sp) 572*0b57cec5SDimitry Andric return module_sp->GetArchitecture().GetByteOrder(); 573*0b57cec5SDimitry Andric return eByteOrderInvalid; 574*0b57cec5SDimitry Andric } 575*0b57cec5SDimitry Andric 576*0b57cec5SDimitry Andric const char *SBModule::GetTriple() { 57704eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 578*0b57cec5SDimitry Andric 579*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 580*0b57cec5SDimitry Andric if (module_sp) { 581*0b57cec5SDimitry Andric std::string triple(module_sp->GetArchitecture().GetTriple().str()); 582*0b57cec5SDimitry Andric // Unique the string so we don't run into ownership issues since the const 583*0b57cec5SDimitry Andric // strings put the string into the string pool once and the strings never 584*0b57cec5SDimitry Andric // comes out 585*0b57cec5SDimitry Andric ConstString const_triple(triple.c_str()); 586*0b57cec5SDimitry Andric return const_triple.GetCString(); 587*0b57cec5SDimitry Andric } 588*0b57cec5SDimitry Andric return nullptr; 589*0b57cec5SDimitry Andric } 590*0b57cec5SDimitry Andric 591*0b57cec5SDimitry Andric uint32_t SBModule::GetAddressByteSize() { 59204eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 593*0b57cec5SDimitry Andric 594*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 595*0b57cec5SDimitry Andric if (module_sp) 596*0b57cec5SDimitry Andric return module_sp->GetArchitecture().GetAddressByteSize(); 597*0b57cec5SDimitry Andric return sizeof(void *); 598*0b57cec5SDimitry Andric } 599*0b57cec5SDimitry Andric 600*0b57cec5SDimitry Andric uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) { 60104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this, versions, num_versions); 602*0b57cec5SDimitry Andric 603*0b57cec5SDimitry Andric llvm::VersionTuple version; 604*0b57cec5SDimitry Andric if (ModuleSP module_sp = GetSP()) 605*0b57cec5SDimitry Andric version = module_sp->GetVersion(); 606*0b57cec5SDimitry Andric uint32_t result = 0; 607*0b57cec5SDimitry Andric if (!version.empty()) 608*0b57cec5SDimitry Andric ++result; 609*0b57cec5SDimitry Andric if (version.getMinor()) 610*0b57cec5SDimitry Andric ++result; 611*0b57cec5SDimitry Andric if (version.getSubminor()) 612*0b57cec5SDimitry Andric ++result; 613*0b57cec5SDimitry Andric 614*0b57cec5SDimitry Andric if (!versions) 615*0b57cec5SDimitry Andric return result; 616*0b57cec5SDimitry Andric 617*0b57cec5SDimitry Andric if (num_versions > 0) 618*0b57cec5SDimitry Andric versions[0] = version.empty() ? UINT32_MAX : version.getMajor(); 619*0b57cec5SDimitry Andric if (num_versions > 1) 620*0b57cec5SDimitry Andric versions[1] = version.getMinor().getValueOr(UINT32_MAX); 621*0b57cec5SDimitry Andric if (num_versions > 2) 622*0b57cec5SDimitry Andric versions[2] = version.getSubminor().getValueOr(UINT32_MAX); 623*0b57cec5SDimitry Andric for (uint32_t i = 3; i < num_versions; ++i) 624*0b57cec5SDimitry Andric versions[i] = UINT32_MAX; 625*0b57cec5SDimitry Andric return result; 626*0b57cec5SDimitry Andric } 627*0b57cec5SDimitry Andric 628*0b57cec5SDimitry Andric lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { 62904eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 630*0b57cec5SDimitry Andric 631*0b57cec5SDimitry Andric lldb::SBFileSpec sb_file_spec; 632*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 633*0b57cec5SDimitry Andric if (module_sp) { 6349dba64beSDimitry Andric if (SymbolFile *symfile = module_sp->GetSymbolFile()) 6359dba64beSDimitry Andric sb_file_spec.SetFileSpec(symfile->GetObjectFile()->GetFileSpec()); 636*0b57cec5SDimitry Andric } 63704eeddc0SDimitry Andric return sb_file_spec; 638*0b57cec5SDimitry Andric } 639*0b57cec5SDimitry Andric 640*0b57cec5SDimitry Andric lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { 64104eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 642*0b57cec5SDimitry Andric 643*0b57cec5SDimitry Andric lldb::SBAddress sb_addr; 644*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 645*0b57cec5SDimitry Andric if (module_sp) { 646*0b57cec5SDimitry Andric ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 647*0b57cec5SDimitry Andric if (objfile_ptr) 648*0b57cec5SDimitry Andric sb_addr.ref() = objfile_ptr->GetBaseAddress(); 649*0b57cec5SDimitry Andric } 65004eeddc0SDimitry Andric return sb_addr; 651*0b57cec5SDimitry Andric } 652*0b57cec5SDimitry Andric 653*0b57cec5SDimitry Andric lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const { 65404eeddc0SDimitry Andric LLDB_INSTRUMENT_VA(this); 655*0b57cec5SDimitry Andric 656*0b57cec5SDimitry Andric lldb::SBAddress sb_addr; 657*0b57cec5SDimitry Andric ModuleSP module_sp(GetSP()); 658*0b57cec5SDimitry Andric if (module_sp) { 659*0b57cec5SDimitry Andric ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 660*0b57cec5SDimitry Andric if (objfile_ptr) 661*0b57cec5SDimitry Andric sb_addr.ref() = objfile_ptr->GetEntryPointAddress(); 662*0b57cec5SDimitry Andric } 66304eeddc0SDimitry Andric return sb_addr; 664*0b57cec5SDimitry Andric } 665*0b57cec5SDimitry Andric 6665ffd83dbSDimitry Andric uint32_t SBModule::GetNumberAllocatedModules() { 66704eeddc0SDimitry Andric LLDB_INSTRUMENT(); 6685ffd83dbSDimitry Andric 6695ffd83dbSDimitry Andric return Module::GetNumberAllocatedModules(); 6705ffd83dbSDimitry Andric } 6715ffd83dbSDimitry Andric 672e8d8bef9SDimitry Andric void SBModule::GarbageCollectAllocatedModules() { 67304eeddc0SDimitry Andric LLDB_INSTRUMENT(); 674e8d8bef9SDimitry Andric 675e8d8bef9SDimitry Andric const bool mandatory = false; 676e8d8bef9SDimitry Andric ModuleList::RemoveOrphanSharedModules(mandatory); 677e8d8bef9SDimitry Andric } 678