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