1dda28197Spatrick //===-- SBModule.cpp ------------------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/API/SBModule.h"
10061da546Spatrick #include "lldb/API/SBAddress.h"
11061da546Spatrick #include "lldb/API/SBFileSpec.h"
12061da546Spatrick #include "lldb/API/SBModuleSpec.h"
13061da546Spatrick #include "lldb/API/SBProcess.h"
14061da546Spatrick #include "lldb/API/SBStream.h"
15061da546Spatrick #include "lldb/API/SBSymbolContextList.h"
16061da546Spatrick #include "lldb/Core/Module.h"
17061da546Spatrick #include "lldb/Core/Section.h"
18061da546Spatrick #include "lldb/Core/ValueObjectList.h"
19061da546Spatrick #include "lldb/Core/ValueObjectVariable.h"
20061da546Spatrick #include "lldb/Symbol/ObjectFile.h"
21061da546Spatrick #include "lldb/Symbol/SymbolFile.h"
22061da546Spatrick #include "lldb/Symbol/Symtab.h"
23061da546Spatrick #include "lldb/Symbol/TypeSystem.h"
24061da546Spatrick #include "lldb/Symbol/VariableList.h"
25061da546Spatrick #include "lldb/Target/Target.h"
26*f6aab3d8Srobert #include "lldb/Utility/Instrumentation.h"
27061da546Spatrick #include "lldb/Utility/StreamString.h"
28061da546Spatrick
29061da546Spatrick using namespace lldb;
30061da546Spatrick using namespace lldb_private;
31061da546Spatrick
SBModule()32*f6aab3d8Srobert SBModule::SBModule() { LLDB_INSTRUMENT_VA(this); }
33061da546Spatrick
SBModule(const lldb::ModuleSP & module_sp)34061da546Spatrick SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {}
35061da546Spatrick
SBModule(const SBModuleSpec & module_spec)36*f6aab3d8Srobert SBModule::SBModule(const SBModuleSpec &module_spec) {
37*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, module_spec);
38061da546Spatrick
39061da546Spatrick ModuleSP module_sp;
40061da546Spatrick Status error = ModuleList::GetSharedModule(
41061da546Spatrick *module_spec.m_opaque_up, module_sp, nullptr, nullptr, nullptr);
42061da546Spatrick if (module_sp)
43061da546Spatrick SetSP(module_sp);
44061da546Spatrick }
45061da546Spatrick
SBModule(const SBModule & rhs)46061da546Spatrick SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {
47*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
48061da546Spatrick }
49061da546Spatrick
SBModule(lldb::SBProcess & process,lldb::addr_t header_addr)50*f6aab3d8Srobert SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr) {
51*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, process, header_addr);
52061da546Spatrick
53061da546Spatrick ProcessSP process_sp(process.GetSP());
54061da546Spatrick if (process_sp) {
55061da546Spatrick m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr);
56061da546Spatrick if (m_opaque_sp) {
57061da546Spatrick Target &target = process_sp->GetTarget();
58061da546Spatrick bool changed = false;
59061da546Spatrick m_opaque_sp->SetLoadAddress(target, 0, true, changed);
60061da546Spatrick target.GetImages().Append(m_opaque_sp);
61061da546Spatrick }
62061da546Spatrick }
63061da546Spatrick }
64061da546Spatrick
operator =(const SBModule & rhs)65061da546Spatrick const SBModule &SBModule::operator=(const SBModule &rhs) {
66*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
67061da546Spatrick
68061da546Spatrick if (this != &rhs)
69061da546Spatrick m_opaque_sp = rhs.m_opaque_sp;
70*f6aab3d8Srobert return *this;
71061da546Spatrick }
72061da546Spatrick
73dda28197Spatrick SBModule::~SBModule() = default;
74061da546Spatrick
IsValid() const75061da546Spatrick bool SBModule::IsValid() const {
76*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
77061da546Spatrick return this->operator bool();
78061da546Spatrick }
operator bool() const79061da546Spatrick SBModule::operator bool() const {
80*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
81061da546Spatrick
82061da546Spatrick return m_opaque_sp.get() != nullptr;
83061da546Spatrick }
84061da546Spatrick
Clear()85061da546Spatrick void SBModule::Clear() {
86*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
87061da546Spatrick
88061da546Spatrick m_opaque_sp.reset();
89061da546Spatrick }
90061da546Spatrick
IsFileBacked() const91*f6aab3d8Srobert bool SBModule::IsFileBacked() const {
92*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
93*f6aab3d8Srobert
94*f6aab3d8Srobert ModuleSP module_sp(GetSP());
95*f6aab3d8Srobert if (!module_sp)
96*f6aab3d8Srobert return false;
97*f6aab3d8Srobert
98*f6aab3d8Srobert ObjectFile *obj_file = module_sp->GetObjectFile();
99*f6aab3d8Srobert if (!obj_file)
100*f6aab3d8Srobert return false;
101*f6aab3d8Srobert
102*f6aab3d8Srobert return !obj_file->IsInMemory();
103*f6aab3d8Srobert }
104*f6aab3d8Srobert
GetFileSpec() const105061da546Spatrick SBFileSpec SBModule::GetFileSpec() const {
106*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
107061da546Spatrick
108061da546Spatrick SBFileSpec file_spec;
109061da546Spatrick ModuleSP module_sp(GetSP());
110061da546Spatrick if (module_sp)
111061da546Spatrick file_spec.SetFileSpec(module_sp->GetFileSpec());
112061da546Spatrick
113*f6aab3d8Srobert return file_spec;
114061da546Spatrick }
115061da546Spatrick
GetPlatformFileSpec() const116061da546Spatrick lldb::SBFileSpec SBModule::GetPlatformFileSpec() const {
117*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
118061da546Spatrick
119061da546Spatrick SBFileSpec file_spec;
120061da546Spatrick ModuleSP module_sp(GetSP());
121061da546Spatrick if (module_sp)
122061da546Spatrick file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
123061da546Spatrick
124*f6aab3d8Srobert return file_spec;
125061da546Spatrick }
126061da546Spatrick
SetPlatformFileSpec(const lldb::SBFileSpec & platform_file)127061da546Spatrick bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) {
128*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, platform_file);
129061da546Spatrick
130061da546Spatrick bool result = false;
131061da546Spatrick
132061da546Spatrick ModuleSP module_sp(GetSP());
133061da546Spatrick if (module_sp) {
134061da546Spatrick module_sp->SetPlatformFileSpec(*platform_file);
135061da546Spatrick result = true;
136061da546Spatrick }
137061da546Spatrick
138061da546Spatrick return result;
139061da546Spatrick }
140061da546Spatrick
GetRemoteInstallFileSpec()141061da546Spatrick lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() {
142*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
143061da546Spatrick
144061da546Spatrick SBFileSpec sb_file_spec;
145061da546Spatrick ModuleSP module_sp(GetSP());
146061da546Spatrick if (module_sp)
147061da546Spatrick sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec());
148*f6aab3d8Srobert return sb_file_spec;
149061da546Spatrick }
150061da546Spatrick
SetRemoteInstallFileSpec(lldb::SBFileSpec & file)151061da546Spatrick bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) {
152*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, file);
153061da546Spatrick
154061da546Spatrick ModuleSP module_sp(GetSP());
155061da546Spatrick if (module_sp) {
156061da546Spatrick module_sp->SetRemoteInstallFileSpec(file.ref());
157061da546Spatrick return true;
158061da546Spatrick }
159061da546Spatrick return false;
160061da546Spatrick }
161061da546Spatrick
GetUUIDBytes() const162061da546Spatrick const uint8_t *SBModule::GetUUIDBytes() const {
163*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
164061da546Spatrick
165061da546Spatrick const uint8_t *uuid_bytes = nullptr;
166061da546Spatrick ModuleSP module_sp(GetSP());
167061da546Spatrick if (module_sp)
168061da546Spatrick uuid_bytes = module_sp->GetUUID().GetBytes().data();
169061da546Spatrick
170061da546Spatrick return uuid_bytes;
171061da546Spatrick }
172061da546Spatrick
GetUUIDString() const173061da546Spatrick const char *SBModule::GetUUIDString() const {
174*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
175061da546Spatrick
176061da546Spatrick const char *uuid_cstr = nullptr;
177061da546Spatrick ModuleSP module_sp(GetSP());
178061da546Spatrick if (module_sp) {
179061da546Spatrick // We are going to return a "const char *" value through the public API, so
180061da546Spatrick // we need to constify it so it gets added permanently the string pool and
181061da546Spatrick // then we don't need to worry about the lifetime of the string as it will
182061da546Spatrick // never go away once it has been put into the ConstString string pool
183061da546Spatrick uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
184061da546Spatrick }
185061da546Spatrick
186061da546Spatrick if (uuid_cstr && uuid_cstr[0]) {
187061da546Spatrick return uuid_cstr;
188061da546Spatrick }
189061da546Spatrick
190061da546Spatrick return nullptr;
191061da546Spatrick }
192061da546Spatrick
operator ==(const SBModule & rhs) const193061da546Spatrick bool SBModule::operator==(const SBModule &rhs) const {
194*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
195061da546Spatrick
196061da546Spatrick if (m_opaque_sp)
197061da546Spatrick return m_opaque_sp.get() == rhs.m_opaque_sp.get();
198061da546Spatrick return false;
199061da546Spatrick }
200061da546Spatrick
operator !=(const SBModule & rhs) const201061da546Spatrick bool SBModule::operator!=(const SBModule &rhs) const {
202*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, rhs);
203061da546Spatrick
204061da546Spatrick if (m_opaque_sp)
205061da546Spatrick return m_opaque_sp.get() != rhs.m_opaque_sp.get();
206061da546Spatrick return false;
207061da546Spatrick }
208061da546Spatrick
GetSP() const209061da546Spatrick ModuleSP SBModule::GetSP() const { return m_opaque_sp; }
210061da546Spatrick
SetSP(const ModuleSP & module_sp)211061da546Spatrick void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; }
212061da546Spatrick
ResolveFileAddress(lldb::addr_t vm_addr)213061da546Spatrick SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) {
214*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, vm_addr);
215061da546Spatrick
216061da546Spatrick lldb::SBAddress sb_addr;
217061da546Spatrick ModuleSP module_sp(GetSP());
218061da546Spatrick if (module_sp) {
219061da546Spatrick Address addr;
220061da546Spatrick if (module_sp->ResolveFileAddress(vm_addr, addr))
221061da546Spatrick sb_addr.ref() = addr;
222061da546Spatrick }
223*f6aab3d8Srobert return sb_addr;
224061da546Spatrick }
225061da546Spatrick
226061da546Spatrick SBSymbolContext
ResolveSymbolContextForAddress(const SBAddress & addr,uint32_t resolve_scope)227061da546Spatrick SBModule::ResolveSymbolContextForAddress(const SBAddress &addr,
228061da546Spatrick uint32_t resolve_scope) {
229*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, addr, resolve_scope);
230061da546Spatrick
231061da546Spatrick SBSymbolContext sb_sc;
232061da546Spatrick ModuleSP module_sp(GetSP());
233061da546Spatrick SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope);
234061da546Spatrick if (module_sp && addr.IsValid())
235061da546Spatrick module_sp->ResolveSymbolContextForAddress(addr.ref(), scope, *sb_sc);
236*f6aab3d8Srobert return sb_sc;
237061da546Spatrick }
238061da546Spatrick
GetDescription(SBStream & description)239061da546Spatrick bool SBModule::GetDescription(SBStream &description) {
240*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, description);
241061da546Spatrick
242061da546Spatrick Stream &strm = description.ref();
243061da546Spatrick
244061da546Spatrick ModuleSP module_sp(GetSP());
245061da546Spatrick if (module_sp) {
246061da546Spatrick module_sp->GetDescription(strm.AsRawOstream());
247061da546Spatrick } else
248061da546Spatrick strm.PutCString("No value");
249061da546Spatrick
250061da546Spatrick return true;
251061da546Spatrick }
252061da546Spatrick
GetNumCompileUnits()253061da546Spatrick uint32_t SBModule::GetNumCompileUnits() {
254*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
255061da546Spatrick
256061da546Spatrick ModuleSP module_sp(GetSP());
257061da546Spatrick if (module_sp) {
258061da546Spatrick return module_sp->GetNumCompileUnits();
259061da546Spatrick }
260061da546Spatrick return 0;
261061da546Spatrick }
262061da546Spatrick
GetCompileUnitAtIndex(uint32_t index)263061da546Spatrick SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) {
264*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, index);
265061da546Spatrick
266061da546Spatrick SBCompileUnit sb_cu;
267061da546Spatrick ModuleSP module_sp(GetSP());
268061da546Spatrick if (module_sp) {
269061da546Spatrick CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index);
270061da546Spatrick sb_cu.reset(cu_sp.get());
271061da546Spatrick }
272*f6aab3d8Srobert return sb_cu;
273061da546Spatrick }
274061da546Spatrick
FindCompileUnits(const SBFileSpec & sb_file_spec)275061da546Spatrick SBSymbolContextList SBModule::FindCompileUnits(const SBFileSpec &sb_file_spec) {
276*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, sb_file_spec);
277061da546Spatrick
278061da546Spatrick SBSymbolContextList sb_sc_list;
279061da546Spatrick const ModuleSP module_sp(GetSP());
280061da546Spatrick if (sb_file_spec.IsValid() && module_sp) {
281061da546Spatrick module_sp->FindCompileUnits(*sb_file_spec, *sb_sc_list);
282061da546Spatrick }
283*f6aab3d8Srobert return sb_sc_list;
284061da546Spatrick }
285061da546Spatrick
GetUnifiedSymbolTable(const lldb::ModuleSP & module_sp)286061da546Spatrick static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) {
287061da546Spatrick if (module_sp)
288061da546Spatrick return module_sp->GetSymtab();
289061da546Spatrick return nullptr;
290061da546Spatrick }
291061da546Spatrick
GetNumSymbols()292061da546Spatrick size_t SBModule::GetNumSymbols() {
293*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
294061da546Spatrick
295061da546Spatrick ModuleSP module_sp(GetSP());
296061da546Spatrick if (Symtab *symtab = GetUnifiedSymbolTable(module_sp))
297061da546Spatrick return symtab->GetNumSymbols();
298061da546Spatrick return 0;
299061da546Spatrick }
300061da546Spatrick
GetSymbolAtIndex(size_t idx)301061da546Spatrick SBSymbol SBModule::GetSymbolAtIndex(size_t idx) {
302*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, idx);
303061da546Spatrick
304061da546Spatrick SBSymbol sb_symbol;
305061da546Spatrick ModuleSP module_sp(GetSP());
306061da546Spatrick Symtab *symtab = GetUnifiedSymbolTable(module_sp);
307061da546Spatrick if (symtab)
308061da546Spatrick sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx));
309*f6aab3d8Srobert return sb_symbol;
310061da546Spatrick }
311061da546Spatrick
FindSymbol(const char * name,lldb::SymbolType symbol_type)312061da546Spatrick lldb::SBSymbol SBModule::FindSymbol(const char *name,
313061da546Spatrick lldb::SymbolType symbol_type) {
314*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, name, symbol_type);
315061da546Spatrick
316061da546Spatrick SBSymbol sb_symbol;
317061da546Spatrick if (name && name[0]) {
318061da546Spatrick ModuleSP module_sp(GetSP());
319061da546Spatrick Symtab *symtab = GetUnifiedSymbolTable(module_sp);
320061da546Spatrick if (symtab)
321061da546Spatrick sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(
322061da546Spatrick ConstString(name), symbol_type, Symtab::eDebugAny,
323061da546Spatrick Symtab::eVisibilityAny));
324061da546Spatrick }
325*f6aab3d8Srobert return sb_symbol;
326061da546Spatrick }
327061da546Spatrick
FindSymbols(const char * name,lldb::SymbolType symbol_type)328061da546Spatrick lldb::SBSymbolContextList SBModule::FindSymbols(const char *name,
329061da546Spatrick lldb::SymbolType symbol_type) {
330*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, name, symbol_type);
331061da546Spatrick
332061da546Spatrick SBSymbolContextList sb_sc_list;
333061da546Spatrick if (name && name[0]) {
334061da546Spatrick ModuleSP module_sp(GetSP());
335061da546Spatrick Symtab *symtab = GetUnifiedSymbolTable(module_sp);
336061da546Spatrick if (symtab) {
337061da546Spatrick std::vector<uint32_t> matching_symbol_indexes;
338061da546Spatrick symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type,
339061da546Spatrick matching_symbol_indexes);
340061da546Spatrick const size_t num_matches = matching_symbol_indexes.size();
341061da546Spatrick if (num_matches) {
342061da546Spatrick SymbolContext sc;
343061da546Spatrick sc.module_sp = module_sp;
344061da546Spatrick SymbolContextList &sc_list = *sb_sc_list;
345061da546Spatrick for (size_t i = 0; i < num_matches; ++i) {
346061da546Spatrick sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]);
347061da546Spatrick if (sc.symbol)
348061da546Spatrick sc_list.Append(sc);
349061da546Spatrick }
350061da546Spatrick }
351061da546Spatrick }
352061da546Spatrick }
353*f6aab3d8Srobert return sb_sc_list;
354061da546Spatrick }
355061da546Spatrick
GetNumSections()356061da546Spatrick size_t SBModule::GetNumSections() {
357*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
358061da546Spatrick
359061da546Spatrick ModuleSP module_sp(GetSP());
360061da546Spatrick if (module_sp) {
361061da546Spatrick // Give the symbol vendor a chance to add to the unified section list.
362061da546Spatrick module_sp->GetSymbolFile();
363061da546Spatrick SectionList *section_list = module_sp->GetSectionList();
364061da546Spatrick if (section_list)
365061da546Spatrick return section_list->GetSize();
366061da546Spatrick }
367061da546Spatrick return 0;
368061da546Spatrick }
369061da546Spatrick
GetSectionAtIndex(size_t idx)370061da546Spatrick SBSection SBModule::GetSectionAtIndex(size_t idx) {
371*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, idx);
372061da546Spatrick
373061da546Spatrick SBSection sb_section;
374061da546Spatrick ModuleSP module_sp(GetSP());
375061da546Spatrick if (module_sp) {
376061da546Spatrick // Give the symbol vendor a chance to add to the unified section list.
377061da546Spatrick module_sp->GetSymbolFile();
378061da546Spatrick SectionList *section_list = module_sp->GetSectionList();
379061da546Spatrick
380061da546Spatrick if (section_list)
381061da546Spatrick sb_section.SetSP(section_list->GetSectionAtIndex(idx));
382061da546Spatrick }
383*f6aab3d8Srobert return sb_section;
384061da546Spatrick }
385061da546Spatrick
FindFunctions(const char * name,uint32_t name_type_mask)386061da546Spatrick lldb::SBSymbolContextList SBModule::FindFunctions(const char *name,
387061da546Spatrick uint32_t name_type_mask) {
388*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, name, name_type_mask);
389061da546Spatrick
390061da546Spatrick lldb::SBSymbolContextList sb_sc_list;
391061da546Spatrick ModuleSP module_sp(GetSP());
392061da546Spatrick if (name && module_sp) {
393*f6aab3d8Srobert
394*f6aab3d8Srobert ModuleFunctionSearchOptions function_options;
395*f6aab3d8Srobert function_options.include_symbols = true;
396*f6aab3d8Srobert function_options.include_inlines = true;
397061da546Spatrick FunctionNameType type = static_cast<FunctionNameType>(name_type_mask);
398dda28197Spatrick module_sp->FindFunctions(ConstString(name), CompilerDeclContext(), type,
399*f6aab3d8Srobert function_options, *sb_sc_list);
400061da546Spatrick }
401*f6aab3d8Srobert return sb_sc_list;
402061da546Spatrick }
403061da546Spatrick
FindGlobalVariables(SBTarget & target,const char * name,uint32_t max_matches)404061da546Spatrick SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name,
405061da546Spatrick uint32_t max_matches) {
406*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, target, name, max_matches);
407061da546Spatrick
408061da546Spatrick SBValueList sb_value_list;
409061da546Spatrick ModuleSP module_sp(GetSP());
410061da546Spatrick if (name && module_sp) {
411061da546Spatrick VariableList variable_list;
412dda28197Spatrick module_sp->FindGlobalVariables(ConstString(name), CompilerDeclContext(),
413dda28197Spatrick max_matches, variable_list);
414061da546Spatrick for (const VariableSP &var_sp : variable_list) {
415061da546Spatrick lldb::ValueObjectSP valobj_sp;
416061da546Spatrick TargetSP target_sp(target.GetSP());
417061da546Spatrick valobj_sp = ValueObjectVariable::Create(target_sp.get(), var_sp);
418061da546Spatrick if (valobj_sp)
419061da546Spatrick sb_value_list.Append(SBValue(valobj_sp));
420061da546Spatrick }
421061da546Spatrick }
422061da546Spatrick
423*f6aab3d8Srobert return sb_value_list;
424061da546Spatrick }
425061da546Spatrick
FindFirstGlobalVariable(lldb::SBTarget & target,const char * name)426061da546Spatrick lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target,
427061da546Spatrick const char *name) {
428*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, target, name);
429061da546Spatrick
430061da546Spatrick SBValueList sb_value_list(FindGlobalVariables(target, name, 1));
431061da546Spatrick if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
432*f6aab3d8Srobert return sb_value_list.GetValueAtIndex(0);
433*f6aab3d8Srobert return SBValue();
434061da546Spatrick }
435061da546Spatrick
FindFirstType(const char * name_cstr)436061da546Spatrick lldb::SBType SBModule::FindFirstType(const char *name_cstr) {
437*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, name_cstr);
438061da546Spatrick
439061da546Spatrick ModuleSP module_sp(GetSP());
440*f6aab3d8Srobert if (!name_cstr || !module_sp)
441*f6aab3d8Srobert return {};
442061da546Spatrick SymbolContext sc;
443061da546Spatrick const bool exact_match = false;
444061da546Spatrick ConstString name(name_cstr);
445061da546Spatrick
446*f6aab3d8Srobert SBType sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match));
447061da546Spatrick
448*f6aab3d8Srobert if (sb_type.IsValid())
449*f6aab3d8Srobert return sb_type;
450*f6aab3d8Srobert
451*f6aab3d8Srobert auto type_system_or_err = module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
452061da546Spatrick if (auto err = type_system_or_err.takeError()) {
453061da546Spatrick llvm::consumeError(std::move(err));
454*f6aab3d8Srobert return {};
455061da546Spatrick }
456*f6aab3d8Srobert
457*f6aab3d8Srobert if (auto ts = *type_system_or_err)
458*f6aab3d8Srobert return SBType(ts->GetBuiltinTypeByName(name));
459*f6aab3d8Srobert
460*f6aab3d8Srobert return {};
461061da546Spatrick }
462061da546Spatrick
GetBasicType(lldb::BasicType type)463061da546Spatrick lldb::SBType SBModule::GetBasicType(lldb::BasicType type) {
464*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, type);
465061da546Spatrick
466061da546Spatrick ModuleSP module_sp(GetSP());
467061da546Spatrick if (module_sp) {
468061da546Spatrick auto type_system_or_err =
469061da546Spatrick module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
470061da546Spatrick if (auto err = type_system_or_err.takeError()) {
471061da546Spatrick llvm::consumeError(std::move(err));
472061da546Spatrick } else {
473*f6aab3d8Srobert if (auto ts = *type_system_or_err)
474*f6aab3d8Srobert return SBType(ts->GetBasicTypeFromAST(type));
475061da546Spatrick }
476061da546Spatrick }
477*f6aab3d8Srobert return SBType();
478061da546Spatrick }
479061da546Spatrick
FindTypes(const char * type)480061da546Spatrick lldb::SBTypeList SBModule::FindTypes(const char *type) {
481*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, type);
482061da546Spatrick
483061da546Spatrick SBTypeList retval;
484061da546Spatrick
485061da546Spatrick ModuleSP module_sp(GetSP());
486061da546Spatrick if (type && module_sp) {
487061da546Spatrick TypeList type_list;
488061da546Spatrick const bool exact_match = false;
489061da546Spatrick ConstString name(type);
490061da546Spatrick llvm::DenseSet<SymbolFile *> searched_symbol_files;
491061da546Spatrick module_sp->FindTypes(name, exact_match, UINT32_MAX, searched_symbol_files,
492061da546Spatrick type_list);
493061da546Spatrick
494061da546Spatrick if (type_list.Empty()) {
495061da546Spatrick auto type_system_or_err =
496061da546Spatrick module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
497061da546Spatrick if (auto err = type_system_or_err.takeError()) {
498061da546Spatrick llvm::consumeError(std::move(err));
499061da546Spatrick } else {
500*f6aab3d8Srobert if (auto ts = *type_system_or_err)
501*f6aab3d8Srobert if (CompilerType compiler_type = ts->GetBuiltinTypeByName(name))
502061da546Spatrick retval.Append(SBType(compiler_type));
503061da546Spatrick }
504061da546Spatrick } else {
505061da546Spatrick for (size_t idx = 0; idx < type_list.GetSize(); idx++) {
506061da546Spatrick TypeSP type_sp(type_list.GetTypeAtIndex(idx));
507061da546Spatrick if (type_sp)
508061da546Spatrick retval.Append(SBType(type_sp));
509061da546Spatrick }
510061da546Spatrick }
511061da546Spatrick }
512*f6aab3d8Srobert return retval;
513061da546Spatrick }
514061da546Spatrick
GetTypeByID(lldb::user_id_t uid)515061da546Spatrick lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) {
516*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, uid);
517061da546Spatrick
518061da546Spatrick ModuleSP module_sp(GetSP());
519061da546Spatrick if (module_sp) {
520061da546Spatrick if (SymbolFile *symfile = module_sp->GetSymbolFile()) {
521061da546Spatrick Type *type_ptr = symfile->ResolveTypeUID(uid);
522061da546Spatrick if (type_ptr)
523*f6aab3d8Srobert return SBType(type_ptr->shared_from_this());
524061da546Spatrick }
525061da546Spatrick }
526*f6aab3d8Srobert return SBType();
527061da546Spatrick }
528061da546Spatrick
GetTypes(uint32_t type_mask)529061da546Spatrick lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) {
530*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, type_mask);
531061da546Spatrick
532061da546Spatrick SBTypeList sb_type_list;
533061da546Spatrick
534061da546Spatrick ModuleSP module_sp(GetSP());
535061da546Spatrick if (!module_sp)
536*f6aab3d8Srobert return sb_type_list;
537061da546Spatrick SymbolFile *symfile = module_sp->GetSymbolFile();
538061da546Spatrick if (!symfile)
539*f6aab3d8Srobert return sb_type_list;
540061da546Spatrick
541061da546Spatrick TypeClass type_class = static_cast<TypeClass>(type_mask);
542061da546Spatrick TypeList type_list;
543061da546Spatrick symfile->GetTypes(nullptr, type_class, type_list);
544061da546Spatrick sb_type_list.m_opaque_up->Append(type_list);
545*f6aab3d8Srobert return sb_type_list;
546061da546Spatrick }
547061da546Spatrick
FindSection(const char * sect_name)548061da546Spatrick SBSection SBModule::FindSection(const char *sect_name) {
549*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, sect_name);
550061da546Spatrick
551061da546Spatrick SBSection sb_section;
552061da546Spatrick
553061da546Spatrick ModuleSP module_sp(GetSP());
554061da546Spatrick if (sect_name && module_sp) {
555061da546Spatrick // Give the symbol vendor a chance to add to the unified section list.
556061da546Spatrick module_sp->GetSymbolFile();
557061da546Spatrick SectionList *section_list = module_sp->GetSectionList();
558061da546Spatrick if (section_list) {
559061da546Spatrick ConstString const_sect_name(sect_name);
560061da546Spatrick SectionSP section_sp(section_list->FindSectionByName(const_sect_name));
561061da546Spatrick if (section_sp) {
562061da546Spatrick sb_section.SetSP(section_sp);
563061da546Spatrick }
564061da546Spatrick }
565061da546Spatrick }
566*f6aab3d8Srobert return sb_section;
567061da546Spatrick }
568061da546Spatrick
GetByteOrder()569061da546Spatrick lldb::ByteOrder SBModule::GetByteOrder() {
570*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
571061da546Spatrick
572061da546Spatrick ModuleSP module_sp(GetSP());
573061da546Spatrick if (module_sp)
574061da546Spatrick return module_sp->GetArchitecture().GetByteOrder();
575061da546Spatrick return eByteOrderInvalid;
576061da546Spatrick }
577061da546Spatrick
GetTriple()578061da546Spatrick const char *SBModule::GetTriple() {
579*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
580061da546Spatrick
581061da546Spatrick ModuleSP module_sp(GetSP());
582061da546Spatrick if (module_sp) {
583061da546Spatrick std::string triple(module_sp->GetArchitecture().GetTriple().str());
584061da546Spatrick // Unique the string so we don't run into ownership issues since the const
585061da546Spatrick // strings put the string into the string pool once and the strings never
586061da546Spatrick // comes out
587061da546Spatrick ConstString const_triple(triple.c_str());
588061da546Spatrick return const_triple.GetCString();
589061da546Spatrick }
590061da546Spatrick return nullptr;
591061da546Spatrick }
592061da546Spatrick
GetAddressByteSize()593061da546Spatrick uint32_t SBModule::GetAddressByteSize() {
594*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
595061da546Spatrick
596061da546Spatrick ModuleSP module_sp(GetSP());
597061da546Spatrick if (module_sp)
598061da546Spatrick return module_sp->GetArchitecture().GetAddressByteSize();
599061da546Spatrick return sizeof(void *);
600061da546Spatrick }
601061da546Spatrick
GetVersion(uint32_t * versions,uint32_t num_versions)602061da546Spatrick uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) {
603*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this, versions, num_versions);
604061da546Spatrick
605061da546Spatrick llvm::VersionTuple version;
606061da546Spatrick if (ModuleSP module_sp = GetSP())
607061da546Spatrick version = module_sp->GetVersion();
608061da546Spatrick uint32_t result = 0;
609061da546Spatrick if (!version.empty())
610061da546Spatrick ++result;
611061da546Spatrick if (version.getMinor())
612061da546Spatrick ++result;
613061da546Spatrick if (version.getSubminor())
614061da546Spatrick ++result;
615061da546Spatrick
616061da546Spatrick if (!versions)
617061da546Spatrick return result;
618061da546Spatrick
619061da546Spatrick if (num_versions > 0)
620061da546Spatrick versions[0] = version.empty() ? UINT32_MAX : version.getMajor();
621061da546Spatrick if (num_versions > 1)
622*f6aab3d8Srobert versions[1] = version.getMinor().value_or(UINT32_MAX);
623061da546Spatrick if (num_versions > 2)
624*f6aab3d8Srobert versions[2] = version.getSubminor().value_or(UINT32_MAX);
625061da546Spatrick for (uint32_t i = 3; i < num_versions; ++i)
626061da546Spatrick versions[i] = UINT32_MAX;
627061da546Spatrick return result;
628061da546Spatrick }
629061da546Spatrick
GetSymbolFileSpec() const630061da546Spatrick lldb::SBFileSpec SBModule::GetSymbolFileSpec() const {
631*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
632061da546Spatrick
633061da546Spatrick lldb::SBFileSpec sb_file_spec;
634061da546Spatrick ModuleSP module_sp(GetSP());
635061da546Spatrick if (module_sp) {
636061da546Spatrick if (SymbolFile *symfile = module_sp->GetSymbolFile())
637061da546Spatrick sb_file_spec.SetFileSpec(symfile->GetObjectFile()->GetFileSpec());
638061da546Spatrick }
639*f6aab3d8Srobert return sb_file_spec;
640061da546Spatrick }
641061da546Spatrick
GetObjectFileHeaderAddress() const642061da546Spatrick lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const {
643*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
644061da546Spatrick
645061da546Spatrick lldb::SBAddress sb_addr;
646061da546Spatrick ModuleSP module_sp(GetSP());
647061da546Spatrick if (module_sp) {
648061da546Spatrick ObjectFile *objfile_ptr = module_sp->GetObjectFile();
649061da546Spatrick if (objfile_ptr)
650061da546Spatrick sb_addr.ref() = objfile_ptr->GetBaseAddress();
651061da546Spatrick }
652*f6aab3d8Srobert return sb_addr;
653061da546Spatrick }
654061da546Spatrick
GetObjectFileEntryPointAddress() const655061da546Spatrick lldb::SBAddress SBModule::GetObjectFileEntryPointAddress() const {
656*f6aab3d8Srobert LLDB_INSTRUMENT_VA(this);
657061da546Spatrick
658061da546Spatrick lldb::SBAddress sb_addr;
659061da546Spatrick ModuleSP module_sp(GetSP());
660061da546Spatrick if (module_sp) {
661061da546Spatrick ObjectFile *objfile_ptr = module_sp->GetObjectFile();
662061da546Spatrick if (objfile_ptr)
663061da546Spatrick sb_addr.ref() = objfile_ptr->GetEntryPointAddress();
664061da546Spatrick }
665*f6aab3d8Srobert return sb_addr;
666061da546Spatrick }
667061da546Spatrick
GetNumberAllocatedModules()668dda28197Spatrick uint32_t SBModule::GetNumberAllocatedModules() {
669*f6aab3d8Srobert LLDB_INSTRUMENT();
670dda28197Spatrick
671dda28197Spatrick return Module::GetNumberAllocatedModules();
672dda28197Spatrick }
673dda28197Spatrick
GarbageCollectAllocatedModules()674be691f3bSpatrick void SBModule::GarbageCollectAllocatedModules() {
675*f6aab3d8Srobert LLDB_INSTRUMENT();
676be691f3bSpatrick
677be691f3bSpatrick const bool mandatory = false;
678be691f3bSpatrick ModuleList::RemoveOrphanSharedModules(mandatory);
679be691f3bSpatrick }
680