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