130fdc8d8SChris Lattner //===-- SBModule.cpp --------------------------------------------*- C++ -*-===// 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" 10*baf5664fSJonas Devlieghere #include "SBReproducerPrivate.h" 1109960031SGreg Clayton #include "lldb/API/SBAddress.h" 1209960031SGreg Clayton #include "lldb/API/SBFileSpec.h" 13226cce25SGreg Clayton #include "lldb/API/SBModuleSpec.h" 14c9660546SGreg Clayton #include "lldb/API/SBProcess.h" 15dde9cff3SCaroline Tice #include "lldb/API/SBStream.h" 16fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h" 17b9c1b51eSKate Stone #include "lldb/Core/Module.h" 181f746071SGreg Clayton #include "lldb/Core/Section.h" 19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h" 20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 211f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h" 22ae088e52SGreg Clayton #include "lldb/Symbol/SymbolFile.h" 236f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h" 241f746071SGreg Clayton #include "lldb/Symbol/Symtab.h" 2556939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h" 26dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h" 27dea8cb4fSGreg Clayton #include "lldb/Target/Target.h" 286f9e6901SZachary Turner #include "lldb/Utility/Log.h" 29bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h" 3030fdc8d8SChris Lattner 3130fdc8d8SChris Lattner using namespace lldb; 32ceb6b139SCaroline Tice using namespace lldb_private; 3330fdc8d8SChris Lattner 34*baf5664fSJonas Devlieghere SBModule::SBModule() : m_opaque_sp() { 35*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBModule); 36*baf5664fSJonas Devlieghere } 3730fdc8d8SChris Lattner 38b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {} 3930fdc8d8SChris Lattner 40b9c1b51eSKate Stone SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() { 41*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModuleSpec &), module_spec); 42*baf5664fSJonas Devlieghere 43226cce25SGreg Clayton ModuleSP module_sp; 44d5b44036SJonas Devlieghere Status error = ModuleList::GetSharedModule(*module_spec.m_opaque_up, 4597206d57SZachary Turner module_sp, NULL, NULL, NULL); 46226cce25SGreg Clayton if (module_sp) 47226cce25SGreg Clayton SetSP(module_sp); 48226cce25SGreg Clayton } 49226cce25SGreg Clayton 50*baf5664fSJonas Devlieghere SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) { 51*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBModule, (const lldb::SBModule &), rhs); 52*baf5664fSJonas Devlieghere } 53efabb123SGreg Clayton 54b9c1b51eSKate Stone SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) 55b9c1b51eSKate Stone : m_opaque_sp() { 56*baf5664fSJonas Devlieghere LLDB_RECORD_CONSTRUCTOR(SBModule, (lldb::SBProcess &, lldb::addr_t), process, 57*baf5664fSJonas Devlieghere header_addr); 58*baf5664fSJonas Devlieghere 59c9660546SGreg Clayton ProcessSP process_sp(process.GetSP()); 60b9c1b51eSKate Stone if (process_sp) { 6139f7ee86SGreg Clayton m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr); 62b9c1b51eSKate Stone if (m_opaque_sp) { 6339f7ee86SGreg Clayton Target &target = process_sp->GetTarget(); 6439f7ee86SGreg Clayton bool changed = false; 65751caf65SGreg Clayton m_opaque_sp->SetLoadAddress(target, 0, true, changed); 6639f7ee86SGreg Clayton target.GetImages().Append(m_opaque_sp); 6739f7ee86SGreg Clayton } 68c859e2d5SGreg Clayton } 69c9660546SGreg Clayton } 70c9660546SGreg Clayton 71b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) { 72*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(const lldb::SBModule &, 73*baf5664fSJonas Devlieghere SBModule, operator=,(const lldb::SBModule &), rhs); 74*baf5664fSJonas Devlieghere 75efabb123SGreg Clayton if (this != &rhs) 76efabb123SGreg Clayton m_opaque_sp = rhs.m_opaque_sp; 77efabb123SGreg Clayton return *this; 78efabb123SGreg Clayton } 79efabb123SGreg Clayton 80b9c1b51eSKate Stone SBModule::~SBModule() {} 8130fdc8d8SChris Lattner 82*baf5664fSJonas Devlieghere bool SBModule::IsValid() const { 83*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBModule, IsValid); 8430fdc8d8SChris Lattner 85*baf5664fSJonas Devlieghere return m_opaque_sp.get() != NULL; 86*baf5664fSJonas Devlieghere } 87*baf5664fSJonas Devlieghere 88*baf5664fSJonas Devlieghere void SBModule::Clear() { 89*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(void, SBModule, Clear); 90*baf5664fSJonas Devlieghere 91*baf5664fSJonas Devlieghere m_opaque_sp.reset(); 92*baf5664fSJonas Devlieghere } 935d3bca4eSJim Ingham 94b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const { 95*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule, GetFileSpec); 96*baf5664fSJonas Devlieghere 975160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 98ceb6b139SCaroline Tice 9930fdc8d8SChris Lattner SBFileSpec file_spec; 100c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 101c2ff9318SGreg Clayton if (module_sp) 102c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetFileSpec()); 103ceb6b139SCaroline Tice 104ceb6b139SCaroline Tice if (log) 105cfd1acedSGreg Clayton log->Printf("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)", 106324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 107324a1036SSaleem Abdulrasool static_cast<const void *>(file_spec.get())); 108ceb6b139SCaroline Tice 109*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(file_spec); 11030fdc8d8SChris Lattner } 11130fdc8d8SChris Lattner 112b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const { 113*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule, 114*baf5664fSJonas Devlieghere GetPlatformFileSpec); 115*baf5664fSJonas Devlieghere 1165160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1172289fa48SGreg Clayton 1182289fa48SGreg Clayton SBFileSpec file_spec; 119c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 120c2ff9318SGreg Clayton if (module_sp) 121c2ff9318SGreg Clayton file_spec.SetFileSpec(module_sp->GetPlatformFileSpec()); 1222289fa48SGreg Clayton 1232289fa48SGreg Clayton if (log) 1242289fa48SGreg Clayton log->Printf("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)", 125324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 126324a1036SSaleem Abdulrasool static_cast<const void *>(file_spec.get())); 1272289fa48SGreg Clayton 128*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(file_spec); 1292289fa48SGreg Clayton } 1302289fa48SGreg Clayton 131b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) { 132*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBModule, SetPlatformFileSpec, 133*baf5664fSJonas Devlieghere (const lldb::SBFileSpec &), platform_file); 134*baf5664fSJonas Devlieghere 1352289fa48SGreg Clayton bool result = false; 1365160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 1372289fa48SGreg Clayton 138c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 139b9c1b51eSKate Stone if (module_sp) { 140c2ff9318SGreg Clayton module_sp->SetPlatformFileSpec(*platform_file); 1412289fa48SGreg Clayton result = true; 1422289fa48SGreg Clayton } 1432289fa48SGreg Clayton 1442289fa48SGreg Clayton if (log) 145b5ad4ec7SGreg Clayton log->Printf("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s)) => %i", 146324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), 147324a1036SSaleem Abdulrasool static_cast<const void *>(platform_file.get()), 148324a1036SSaleem Abdulrasool platform_file->GetPath().c_str(), result); 1492289fa48SGreg Clayton return result; 1502289fa48SGreg Clayton } 1512289fa48SGreg Clayton 152b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() { 153*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::SBFileSpec, SBModule, 154*baf5664fSJonas Devlieghere GetRemoteInstallFileSpec); 155*baf5664fSJonas Devlieghere 156fbb76349SGreg Clayton SBFileSpec sb_file_spec; 157fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 158fbb76349SGreg Clayton if (module_sp) 159fbb76349SGreg Clayton sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec()); 160*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_file_spec); 161fbb76349SGreg Clayton } 162fbb76349SGreg Clayton 163b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) { 164*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBModule, SetRemoteInstallFileSpec, 165*baf5664fSJonas Devlieghere (lldb::SBFileSpec &), file); 166*baf5664fSJonas Devlieghere 167fbb76349SGreg Clayton ModuleSP module_sp(GetSP()); 168b9c1b51eSKate Stone if (module_sp) { 169fbb76349SGreg Clayton module_sp->SetRemoteInstallFileSpec(file.ref()); 170fbb76349SGreg Clayton return true; 171fbb76349SGreg Clayton } 172fbb76349SGreg Clayton return false; 173fbb76349SGreg Clayton } 1742289fa48SGreg Clayton 175b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const { 176*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const uint8_t *, SBModule, GetUUIDBytes); 177*baf5664fSJonas Devlieghere 1785160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 179ceb6b139SCaroline Tice 1804838131bSGreg Clayton const uint8_t *uuid_bytes = NULL; 181c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 182c2ff9318SGreg Clayton if (module_sp) 183470b286eSPavel Labath uuid_bytes = module_sp->GetUUID().GetBytes().data(); 184ceb6b139SCaroline Tice 185b9c1b51eSKate Stone if (log) { 186b9c1b51eSKate Stone if (uuid_bytes) { 1874838131bSGreg Clayton StreamString s; 188c2ff9318SGreg Clayton module_sp->GetUUID().Dump(&s); 189324a1036SSaleem Abdulrasool log->Printf("SBModule(%p)::GetUUIDBytes () => %s", 190324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get()), s.GetData()); 191b9c1b51eSKate Stone } else 192324a1036SSaleem Abdulrasool log->Printf("SBModule(%p)::GetUUIDBytes () => NULL", 193324a1036SSaleem Abdulrasool static_cast<void *>(module_sp.get())); 1944838131bSGreg Clayton } 1954838131bSGreg Clayton return uuid_bytes; 19630fdc8d8SChris Lattner } 19730fdc8d8SChris Lattner 198b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const { 199*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(const char *, SBModule, GetUUIDString); 200*baf5664fSJonas Devlieghere 2015160ce5cSGreg Clayton Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API)); 202df2963edSJohnny Chen 203f1be855aSGreg Clayton const char *uuid_cstr = NULL; 204c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 205b9c1b51eSKate Stone if (module_sp) { 20605097246SAdrian Prantl // We are going to return a "const char *" value through the public API, so 20705097246SAdrian Prantl // we need to constify it so it gets added permanently the string pool and 20805097246SAdrian Prantl // then we don't need to worry about the lifetime of the string as it will 20905097246SAdrian Prantl // never go away once it has been put into the ConstString string pool 210f1be855aSGreg Clayton uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString(); 211f1be855aSGreg Clayton } 212f1be855aSGreg Clayton 213b9c1b51eSKate Stone if (uuid_cstr && uuid_cstr[0]) { 214f1be855aSGreg Clayton if (log) 215b9c1b51eSKate Stone log->Printf("SBModule(%p)::GetUUIDString () => %s", 216b9c1b51eSKate Stone static_cast<void *>(module_sp.get()), uuid_cstr); 217f1be855aSGreg Clayton return uuid_cstr; 218c16b4af0SJason Molenda } 219df2963edSJohnny Chen 220df2963edSJohnny Chen if (log) 221b9c1b51eSKate Stone log->Printf("SBModule(%p)::GetUUIDString () => NULL", 222b9c1b51eSKate Stone static_cast<void *>(module_sp.get())); 223f1be855aSGreg Clayton return NULL; 224df2963edSJohnny Chen } 225df2963edSJohnny Chen 226b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const { 227*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBModule, operator==,(const lldb::SBModule &), 228*baf5664fSJonas Devlieghere rhs); 229*baf5664fSJonas Devlieghere 2306611103cSGreg Clayton if (m_opaque_sp) 2316611103cSGreg Clayton return m_opaque_sp.get() == rhs.m_opaque_sp.get(); 23230fdc8d8SChris Lattner return false; 23330fdc8d8SChris Lattner } 23430fdc8d8SChris Lattner 235b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const { 236*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST(bool, SBModule, operator!=,(const lldb::SBModule &), 237*baf5664fSJonas Devlieghere rhs); 238*baf5664fSJonas Devlieghere 2396611103cSGreg Clayton if (m_opaque_sp) 2406611103cSGreg Clayton return m_opaque_sp.get() != rhs.m_opaque_sp.get(); 24130fdc8d8SChris Lattner return false; 24230fdc8d8SChris Lattner } 24330fdc8d8SChris Lattner 244b9c1b51eSKate Stone ModuleSP SBModule::GetSP() const { return m_opaque_sp; } 24530fdc8d8SChris Lattner 246b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; } 24730fdc8d8SChris Lattner 248b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) { 249*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBAddress, SBModule, ResolveFileAddress, 250*baf5664fSJonas Devlieghere (lldb::addr_t), vm_addr); 251*baf5664fSJonas Devlieghere 252cac9c5f9SGreg Clayton lldb::SBAddress sb_addr; 253c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 254b9c1b51eSKate Stone if (module_sp) { 255cac9c5f9SGreg Clayton Address addr; 256c2ff9318SGreg Clayton if (module_sp->ResolveFileAddress(vm_addr, addr)) 257cac9c5f9SGreg Clayton sb_addr.ref() = addr; 258cac9c5f9SGreg Clayton } 259*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_addr); 26009960031SGreg Clayton } 26109960031SGreg Clayton 26209960031SGreg Clayton SBSymbolContext 263b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr, 264b9c1b51eSKate Stone uint32_t resolve_scope) { 265*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSymbolContext, SBModule, 266*baf5664fSJonas Devlieghere ResolveSymbolContextForAddress, 267*baf5664fSJonas Devlieghere (const lldb::SBAddress &, uint32_t), addr, resolve_scope); 268*baf5664fSJonas Devlieghere 26909960031SGreg Clayton SBSymbolContext sb_sc; 270c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 271991e4453SZachary Turner SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 272c2ff9318SGreg Clayton if (module_sp && addr.IsValid()) 273991e4453SZachary Turner module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc); 274*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_sc); 27509960031SGreg Clayton } 27609960031SGreg Clayton 277b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) { 278*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(bool, SBModule, GetDescription, (lldb::SBStream &), 279*baf5664fSJonas Devlieghere description); 280*baf5664fSJonas Devlieghere 281da7bc7d0SGreg Clayton Stream &strm = description.ref(); 282da7bc7d0SGreg Clayton 283c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 284b9c1b51eSKate Stone if (module_sp) { 285c2ff9318SGreg Clayton module_sp->GetDescription(&strm); 286b9c1b51eSKate Stone } else 287da7bc7d0SGreg Clayton strm.PutCString("No value"); 288dde9cff3SCaroline Tice 289dde9cff3SCaroline Tice return true; 290dde9cff3SCaroline Tice } 291bbdabce2SGreg Clayton 292b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() { 293*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetNumCompileUnits); 294*baf5664fSJonas Devlieghere 295873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 296b9c1b51eSKate Stone if (module_sp) { 297873a7a4bSJohnny Chen return module_sp->GetNumCompileUnits(); 298873a7a4bSJohnny Chen } 299873a7a4bSJohnny Chen return 0; 300873a7a4bSJohnny Chen } 301873a7a4bSJohnny Chen 302b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) { 303*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBCompileUnit, SBModule, GetCompileUnitAtIndex, 304*baf5664fSJonas Devlieghere (uint32_t), index); 305*baf5664fSJonas Devlieghere 306873a7a4bSJohnny Chen SBCompileUnit sb_cu; 307873a7a4bSJohnny Chen ModuleSP module_sp(GetSP()); 308b9c1b51eSKate Stone if (module_sp) { 309873a7a4bSJohnny Chen CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index); 310873a7a4bSJohnny Chen sb_cu.reset(cu_sp.get()); 311873a7a4bSJohnny Chen } 312*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_cu); 313873a7a4bSJohnny Chen } 314873a7a4bSJohnny Chen 315*baf5664fSJonas Devlieghere SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) { 316*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindCompileUnits, 317*baf5664fSJonas Devlieghere (const lldb::SBFileSpec &), sb_file_spec); 318*baf5664fSJonas Devlieghere 319da0c081fSAlexander Polyakov SBSymbolContextList sb_sc_list; 320da0c081fSAlexander Polyakov const ModuleSP module_sp(GetSP()); 321da0c081fSAlexander Polyakov if (sb_file_spec.IsValid() && module_sp) { 322da0c081fSAlexander Polyakov const bool append = true; 323da0c081fSAlexander Polyakov module_sp->FindCompileUnits(*sb_file_spec, append, *sb_sc_list); 324da0c081fSAlexander Polyakov } 325*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_sc_list); 326da0c081fSAlexander Polyakov } 327da0c081fSAlexander Polyakov 328b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) { 329b9c1b51eSKate Stone if (module_sp) { 330a7499c98SMichael Sartain SymbolVendor *symbols = module_sp->GetSymbolVendor(); 331a7499c98SMichael Sartain if (symbols) 332a7499c98SMichael Sartain return symbols->GetSymtab(); 333a7499c98SMichael Sartain } 334a7499c98SMichael Sartain return NULL; 335a7499c98SMichael Sartain } 336a7499c98SMichael Sartain 337b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() { 338*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSymbols); 339*baf5664fSJonas Devlieghere 340c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 341b9c1b51eSKate Stone if (module_sp) { 342a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 343bbdabce2SGreg Clayton if (symtab) 344bbdabce2SGreg Clayton return symtab->GetNumSymbols(); 345bbdabce2SGreg Clayton } 346bbdabce2SGreg Clayton return 0; 347bbdabce2SGreg Clayton } 348bbdabce2SGreg Clayton 349b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) { 350*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, GetSymbolAtIndex, (size_t), idx); 351*baf5664fSJonas Devlieghere 352bbdabce2SGreg Clayton SBSymbol sb_symbol; 353c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 354a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 355bbdabce2SGreg Clayton if (symtab) 356bbdabce2SGreg Clayton sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx)); 357*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_symbol); 358bbdabce2SGreg Clayton } 359fe356d35SGreg Clayton 360b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name, 361b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 362*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSymbol, SBModule, FindSymbol, 363*baf5664fSJonas Devlieghere (const char *, lldb::SymbolType), name, symbol_type); 364*baf5664fSJonas Devlieghere 365e14e1925SGreg Clayton SBSymbol sb_symbol; 366b9c1b51eSKate Stone if (name && name[0]) { 367e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 368a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 369e14e1925SGreg Clayton if (symtab) 370b9c1b51eSKate Stone sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType( 371b9c1b51eSKate Stone ConstString(name), symbol_type, Symtab::eDebugAny, 372b9c1b51eSKate Stone Symtab::eVisibilityAny)); 373e14e1925SGreg Clayton } 374*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_symbol); 375e14e1925SGreg Clayton } 376e14e1925SGreg Clayton 377b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name, 378b9c1b51eSKate Stone lldb::SymbolType symbol_type) { 379*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindSymbols, 380*baf5664fSJonas Devlieghere (const char *, lldb::SymbolType), name, symbol_type); 381*baf5664fSJonas Devlieghere 382e14e1925SGreg Clayton SBSymbolContextList sb_sc_list; 383b9c1b51eSKate Stone if (name && name[0]) { 384e14e1925SGreg Clayton ModuleSP module_sp(GetSP()); 385a7499c98SMichael Sartain Symtab *symtab = GetUnifiedSymbolTable(module_sp); 386b9c1b51eSKate Stone if (symtab) { 387e14e1925SGreg Clayton std::vector<uint32_t> matching_symbol_indexes; 388b9c1b51eSKate Stone const size_t num_matches = symtab->FindAllSymbolsWithNameAndType( 389b9c1b51eSKate Stone ConstString(name), symbol_type, matching_symbol_indexes); 390b9c1b51eSKate Stone if (num_matches) { 391e14e1925SGreg Clayton SymbolContext sc; 392e14e1925SGreg Clayton sc.module_sp = module_sp; 393e14e1925SGreg Clayton SymbolContextList &sc_list = *sb_sc_list; 394b9c1b51eSKate Stone for (size_t i = 0; i < num_matches; ++i) { 395e14e1925SGreg Clayton sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]); 396e14e1925SGreg Clayton if (sc.symbol) 397e14e1925SGreg Clayton sc_list.Append(sc); 398e14e1925SGreg Clayton } 399e14e1925SGreg Clayton } 400e14e1925SGreg Clayton } 401e14e1925SGreg Clayton } 402*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_sc_list); 403e14e1925SGreg Clayton } 404e14e1925SGreg Clayton 405b9c1b51eSKate Stone size_t SBModule::GetNumSections() { 406*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(size_t, SBModule, GetNumSections); 407*baf5664fSJonas Devlieghere 408c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 409b9c1b51eSKate Stone if (module_sp) { 410a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 411a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 4123046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 413cac9c5f9SGreg Clayton if (section_list) 414cac9c5f9SGreg Clayton return section_list->GetSize(); 415cac9c5f9SGreg Clayton } 416cac9c5f9SGreg Clayton return 0; 417cac9c5f9SGreg Clayton } 418cac9c5f9SGreg Clayton 419b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) { 420*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSection, SBModule, GetSectionAtIndex, (size_t), 421*baf5664fSJonas Devlieghere idx); 422*baf5664fSJonas Devlieghere 423cac9c5f9SGreg Clayton SBSection sb_section; 424c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 425b9c1b51eSKate Stone if (module_sp) { 426a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 427a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 4283046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 429cac9c5f9SGreg Clayton 430cac9c5f9SGreg Clayton if (section_list) 431e72dfb32SGreg Clayton sb_section.SetSP(section_list->GetSectionAtIndex(idx)); 432cac9c5f9SGreg Clayton } 433*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_section); 434cac9c5f9SGreg Clayton } 435cac9c5f9SGreg Clayton 436b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name, 437b9c1b51eSKate Stone uint32_t name_type_mask) { 438*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSymbolContextList, SBModule, FindFunctions, 439*baf5664fSJonas Devlieghere (const char *, uint32_t), name, name_type_mask); 440*baf5664fSJonas Devlieghere 4415569e64eSGreg Clayton lldb::SBSymbolContextList sb_sc_list; 442c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 443b9c1b51eSKate Stone if (name && module_sp) { 4445569e64eSGreg Clayton const bool append = true; 445fe356d35SGreg Clayton const bool symbols_ok = true; 4469df05fbbSSean Callanan const bool inlines_ok = true; 447117b1fa1SZachary Turner FunctionNameType type = static_cast<FunctionNameType>(name_type_mask); 448117b1fa1SZachary Turner module_sp->FindFunctions(ConstString(name), NULL, type, symbols_ok, 449117b1fa1SZachary Turner inlines_ok, append, *sb_sc_list); 450fe356d35SGreg Clayton } 451*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_sc_list); 452fe356d35SGreg Clayton } 453fe356d35SGreg Clayton 454b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name, 455b9c1b51eSKate Stone uint32_t max_matches) { 456*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValueList, SBModule, FindGlobalVariables, 457*baf5664fSJonas Devlieghere (lldb::SBTarget &, const char *, uint32_t), target, name, 458*baf5664fSJonas Devlieghere max_matches); 459*baf5664fSJonas Devlieghere 460dea8cb4fSGreg Clayton SBValueList sb_value_list; 461c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 462b9c1b51eSKate Stone if (name && module_sp) { 463dea8cb4fSGreg Clayton VariableList variable_list; 464b9c1b51eSKate Stone const uint32_t match_count = module_sp->FindGlobalVariables( 46534cda14bSPavel Labath ConstString(name), NULL, max_matches, variable_list); 466dea8cb4fSGreg Clayton 467b9c1b51eSKate Stone if (match_count > 0) { 468b9c1b51eSKate Stone for (uint32_t i = 0; i < match_count; ++i) { 469dea8cb4fSGreg Clayton lldb::ValueObjectSP valobj_sp; 470b9556accSGreg Clayton TargetSP target_sp(target.GetSP()); 471b9c1b51eSKate Stone valobj_sp = ValueObjectVariable::Create( 472b9c1b51eSKate Stone target_sp.get(), variable_list.GetVariableAtIndex(i)); 473dea8cb4fSGreg Clayton if (valobj_sp) 47485425d77SEnrico Granata sb_value_list.Append(SBValue(valobj_sp)); 475dea8cb4fSGreg Clayton } 476dea8cb4fSGreg Clayton } 477dea8cb4fSGreg Clayton } 478dea8cb4fSGreg Clayton 479*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value_list); 480dea8cb4fSGreg Clayton } 4816f3533fbSEnrico Granata 482b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target, 483b9c1b51eSKate Stone const char *name) { 484*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBValue, SBModule, FindFirstGlobalVariable, 485*baf5664fSJonas Devlieghere (lldb::SBTarget &, const char *), target, name); 486*baf5664fSJonas Devlieghere 487bcd80b47SEnrico Granata SBValueList sb_value_list(FindGlobalVariables(target, name, 1)); 488bcd80b47SEnrico Granata if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0) 489*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_value_list.GetValueAtIndex(0)); 490*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBValue()); 491bcd80b47SEnrico Granata } 492bcd80b47SEnrico Granata 493b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) { 494*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBType, SBModule, FindFirstType, (const char *), 495*baf5664fSJonas Devlieghere name_cstr); 496*baf5664fSJonas Devlieghere 497fe42ac4dSGreg Clayton SBType sb_type; 498c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 499b9c1b51eSKate Stone if (name_cstr && module_sp) { 5006f3533fbSEnrico Granata SymbolContext sc; 50184db9105SGreg Clayton const bool exact_match = false; 5026f3533fbSEnrico Granata ConstString name(name_cstr); 5036f3533fbSEnrico Granata 504b43165b7SGreg Clayton sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match)); 5056f3533fbSEnrico Granata 506b9c1b51eSKate Stone if (!sb_type.IsValid()) { 507b9c1b51eSKate Stone TypeSystem *type_system = 508b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 50956939cb3SGreg Clayton if (type_system) 51056939cb3SGreg Clayton sb_type = SBType(type_system->GetBuiltinTypeByName(name)); 51156939cb3SGreg Clayton } 5126f3533fbSEnrico Granata } 513*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type); 5146f3533fbSEnrico Granata } 5156f3533fbSEnrico Granata 516b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) { 517*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetBasicType, (lldb::BasicType), 518*baf5664fSJonas Devlieghere type); 519*baf5664fSJonas Devlieghere 520b43165b7SGreg Clayton ModuleSP module_sp(GetSP()); 521b9c1b51eSKate Stone if (module_sp) { 522b9c1b51eSKate Stone TypeSystem *type_system = 523b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 52456939cb3SGreg Clayton if (type_system) 525*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBType(type_system->GetBasicTypeFromAST(type))); 52656939cb3SGreg Clayton } 527*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBType()); 528b43165b7SGreg Clayton } 529b43165b7SGreg Clayton 530b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) { 531*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, FindTypes, (const char *), 532*baf5664fSJonas Devlieghere type); 533*baf5664fSJonas Devlieghere 5346f3533fbSEnrico Granata SBTypeList retval; 5356f3533fbSEnrico Granata 536c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 537b9c1b51eSKate Stone if (type && module_sp) { 5386f3533fbSEnrico Granata TypeList type_list; 53984db9105SGreg Clayton const bool exact_match = false; 5406f3533fbSEnrico Granata ConstString name(type); 541ae088e52SGreg Clayton llvm::DenseSet<SymbolFile *> searched_symbol_files; 542b9c1b51eSKate Stone const uint32_t num_matches = module_sp->FindTypes( 543576495e6SZachary Turner name, exact_match, UINT32_MAX, searched_symbol_files, type_list); 5446f3533fbSEnrico Granata 545b9c1b51eSKate Stone if (num_matches > 0) { 546b9c1b51eSKate Stone for (size_t idx = 0; idx < num_matches; idx++) { 547fe42ac4dSGreg Clayton TypeSP type_sp(type_list.GetTypeAtIndex(idx)); 548fe42ac4dSGreg Clayton if (type_sp) 549fe42ac4dSGreg Clayton retval.Append(SBType(type_sp)); 550fe42ac4dSGreg Clayton } 551b9c1b51eSKate Stone } else { 552b9c1b51eSKate Stone TypeSystem *type_system = 553b9c1b51eSKate Stone module_sp->GetTypeSystemForLanguage(eLanguageTypeC); 554b9c1b51eSKate Stone if (type_system) { 55556939cb3SGreg Clayton CompilerType compiler_type = type_system->GetBuiltinTypeByName(name); 55656939cb3SGreg Clayton if (compiler_type) 55756939cb3SGreg Clayton retval.Append(SBType(compiler_type)); 55856939cb3SGreg Clayton } 559b43165b7SGreg Clayton } 560b43165b7SGreg Clayton } 5616f3533fbSEnrico Granata 562*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(retval); 5636f3533fbSEnrico Granata } 564cac9c5f9SGreg Clayton 565b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) { 566*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBType, SBModule, GetTypeByID, (lldb::user_id_t), 567*baf5664fSJonas Devlieghere uid); 568*baf5664fSJonas Devlieghere 5691f4db7daSGreg Clayton ModuleSP module_sp(GetSP()); 570b9c1b51eSKate Stone if (module_sp) { 5711f4db7daSGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 572b9c1b51eSKate Stone if (vendor) { 5731f4db7daSGreg Clayton Type *type_ptr = vendor->ResolveTypeUID(uid); 5741f4db7daSGreg Clayton if (type_ptr) 575*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBType(type_ptr->shared_from_this())); 5761f4db7daSGreg Clayton } 5771f4db7daSGreg Clayton } 578*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(SBType()); 5791f4db7daSGreg Clayton } 5801f4db7daSGreg Clayton 581b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) { 582*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBTypeList, SBModule, GetTypes, (uint32_t), 583*baf5664fSJonas Devlieghere type_mask); 584*baf5664fSJonas Devlieghere 585f02500c7SGreg Clayton SBTypeList sb_type_list; 586f02500c7SGreg Clayton 587f02500c7SGreg Clayton ModuleSP module_sp(GetSP()); 588117b1fa1SZachary Turner if (!module_sp) 589*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type_list); 590f02500c7SGreg Clayton SymbolVendor *vendor = module_sp->GetSymbolVendor(); 591117b1fa1SZachary Turner if (!vendor) 592*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type_list); 593117b1fa1SZachary Turner 594117b1fa1SZachary Turner TypeClass type_class = static_cast<TypeClass>(type_mask); 595f02500c7SGreg Clayton TypeList type_list; 596117b1fa1SZachary Turner vendor->GetTypes(NULL, type_class, type_list); 597d5b44036SJonas Devlieghere sb_type_list.m_opaque_up->Append(type_list); 598*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_type_list); 599f02500c7SGreg Clayton } 600cac9c5f9SGreg Clayton 601b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) { 602*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(lldb::SBSection, SBModule, FindSection, (const char *), 603*baf5664fSJonas Devlieghere sect_name); 604*baf5664fSJonas Devlieghere 605cac9c5f9SGreg Clayton SBSection sb_section; 606cac9c5f9SGreg Clayton 607c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 608b9c1b51eSKate Stone if (sect_name && module_sp) { 609a7499c98SMichael Sartain // Give the symbol vendor a chance to add to the unified section list. 610a7499c98SMichael Sartain module_sp->GetSymbolVendor(); 6113046e668SGreg Clayton SectionList *section_list = module_sp->GetSectionList(); 612b9c1b51eSKate Stone if (section_list) { 613cac9c5f9SGreg Clayton ConstString const_sect_name(sect_name); 614cac9c5f9SGreg Clayton SectionSP section_sp(section_list->FindSectionByName(const_sect_name)); 615b9c1b51eSKate Stone if (section_sp) { 616e72dfb32SGreg Clayton sb_section.SetSP(section_sp); 617cac9c5f9SGreg Clayton } 618cac9c5f9SGreg Clayton } 619cac9c5f9SGreg Clayton } 620*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_section); 621cac9c5f9SGreg Clayton } 622cac9c5f9SGreg Clayton 623b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() { 624*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(lldb::ByteOrder, SBModule, GetByteOrder); 625*baf5664fSJonas Devlieghere 626c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 627c2ff9318SGreg Clayton if (module_sp) 628c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetByteOrder(); 62913d1950aSGreg Clayton return eByteOrderInvalid; 63013d1950aSGreg Clayton } 63113d1950aSGreg Clayton 632b9c1b51eSKate Stone const char *SBModule::GetTriple() { 633*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(const char *, SBModule, GetTriple); 634*baf5664fSJonas Devlieghere 635c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 636b9c1b51eSKate Stone if (module_sp) { 637c2ff9318SGreg Clayton std::string triple(module_sp->GetArchitecture().GetTriple().str()); 63805097246SAdrian Prantl // Unique the string so we don't run into ownership issues since the const 63905097246SAdrian Prantl // strings put the string into the string pool once and the strings never 64005097246SAdrian Prantl // comes out 64113d1950aSGreg Clayton ConstString const_triple(triple.c_str()); 64213d1950aSGreg Clayton return const_triple.GetCString(); 64313d1950aSGreg Clayton } 64413d1950aSGreg Clayton return NULL; 64513d1950aSGreg Clayton } 64613d1950aSGreg Clayton 647b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() { 648*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_NO_ARGS(uint32_t, SBModule, GetAddressByteSize); 649*baf5664fSJonas Devlieghere 650c2ff9318SGreg Clayton ModuleSP module_sp(GetSP()); 651c2ff9318SGreg Clayton if (module_sp) 652c2ff9318SGreg Clayton return module_sp->GetArchitecture().GetAddressByteSize(); 65313d1950aSGreg Clayton return sizeof(void *); 65413d1950aSGreg Clayton } 65513d1950aSGreg Clayton 656b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) { 657*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD(uint32_t, SBModule, GetVersion, (uint32_t *, uint32_t), 658*baf5664fSJonas Devlieghere versions, num_versions); 659*baf5664fSJonas Devlieghere 6602272c481SPavel Labath llvm::VersionTuple version; 6612272c481SPavel Labath if (ModuleSP module_sp = GetSP()) 6622272c481SPavel Labath version = module_sp->GetVersion(); 6632272c481SPavel Labath uint32_t result = 0; 6642272c481SPavel Labath if (!version.empty()) 6652272c481SPavel Labath ++result; 6662272c481SPavel Labath if (version.getMinor()) 6672272c481SPavel Labath ++result; 6682272c481SPavel Labath if(version.getSubminor()) 6692272c481SPavel Labath ++result; 6702272c481SPavel Labath 6712272c481SPavel Labath if (!versions) 6722272c481SPavel Labath return result; 6732272c481SPavel Labath 6742272c481SPavel Labath if (num_versions > 0) 6752272c481SPavel Labath versions[0] = version.empty() ? UINT32_MAX : version.getMajor(); 6762272c481SPavel Labath if (num_versions > 1) 6772272c481SPavel Labath versions[1] = version.getMinor().getValueOr(UINT32_MAX); 6782272c481SPavel Labath if (num_versions > 2) 6792272c481SPavel Labath versions[2] = version.getSubminor().getValueOr(UINT32_MAX); 6802272c481SPavel Labath for (uint32_t i = 3; i < num_versions; ++i) 681c2ff9318SGreg Clayton versions[i] = UINT32_MAX; 6822272c481SPavel Labath return result; 6833467d80bSEnrico Granata } 684c2ff9318SGreg Clayton 685b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const { 686*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBFileSpec, SBModule, 687*baf5664fSJonas Devlieghere GetSymbolFileSpec); 688*baf5664fSJonas Devlieghere 689eb2c19a5SIlia K lldb::SBFileSpec sb_file_spec; 690eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 691b9c1b51eSKate Stone if (module_sp) { 692eb2c19a5SIlia K SymbolVendor *symbol_vendor_ptr = module_sp->GetSymbolVendor(); 693eb2c19a5SIlia K if (symbol_vendor_ptr) 694eb2c19a5SIlia K sb_file_spec.SetFileSpec(symbol_vendor_ptr->GetMainFileSpec()); 695eb2c19a5SIlia K } 696*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_file_spec); 697eb2c19a5SIlia K } 698eb2c19a5SIlia K 699b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const { 700*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule, 701*baf5664fSJonas Devlieghere GetObjectFileHeaderAddress); 702*baf5664fSJonas Devlieghere 703eb2c19a5SIlia K lldb::SBAddress sb_addr; 704eb2c19a5SIlia K ModuleSP module_sp(GetSP()); 705b9c1b51eSKate Stone if (module_sp) { 706eb2c19a5SIlia K ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 707eb2c19a5SIlia K if (objfile_ptr) 708d1e3fe21SPavel Labath sb_addr.ref() = objfile_ptr->GetBaseAddress(); 709eb2c19a5SIlia K } 710*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_addr); 711eb2c19a5SIlia K } 7129b087d2cSAleksandr Urakov 7139b087d2cSAleksandr Urakov lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const { 714*baf5664fSJonas Devlieghere LLDB_RECORD_METHOD_CONST_NO_ARGS(lldb::SBAddress, SBModule, 715*baf5664fSJonas Devlieghere GetObjectFileEntryPointAddress); 716*baf5664fSJonas Devlieghere 7179b087d2cSAleksandr Urakov lldb::SBAddress sb_addr; 7189b087d2cSAleksandr Urakov ModuleSP module_sp(GetSP()); 7199b087d2cSAleksandr Urakov if (module_sp) { 7209b087d2cSAleksandr Urakov ObjectFile *objfile_ptr = module_sp->GetObjectFile(); 7219b087d2cSAleksandr Urakov if (objfile_ptr) 7229b087d2cSAleksandr Urakov sb_addr.ref() = objfile_ptr->GetEntryPointAddress(); 7239b087d2cSAleksandr Urakov } 724*baf5664fSJonas Devlieghere return LLDB_RECORD_RESULT(sb_addr); 7259b087d2cSAleksandr Urakov } 726