130fdc8d8SChris Lattner //===-- SBModule.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/API/SBModule.h"
1109960031SGreg Clayton #include "lldb/API/SBAddress.h"
1209960031SGreg Clayton #include "lldb/API/SBFileSpec.h"
13226cce25SGreg Clayton #include "lldb/API/SBModuleSpec.h"
14c9660546SGreg Clayton #include "lldb/API/SBProcess.h"
15dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
16fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h"
17b9c1b51eSKate Stone #include "lldb/Core/Module.h"
181f746071SGreg Clayton #include "lldb/Core/Section.h"
19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h"
20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
211f746071SGreg Clayton #include "lldb/Symbol/ObjectFile.h"
22ae088e52SGreg Clayton #include "lldb/Symbol/SymbolFile.h"
236f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h"
241f746071SGreg Clayton #include "lldb/Symbol/Symtab.h"
2556939cb3SGreg Clayton #include "lldb/Symbol/TypeSystem.h"
26dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h"
27dea8cb4fSGreg Clayton #include "lldb/Target/Target.h"
286f9e6901SZachary Turner #include "lldb/Utility/Log.h"
29bf9a7730SZachary Turner #include "lldb/Utility/StreamString.h"
3030fdc8d8SChris Lattner 
3130fdc8d8SChris Lattner using namespace lldb;
32ceb6b139SCaroline Tice using namespace lldb_private;
3330fdc8d8SChris Lattner 
34b9c1b51eSKate Stone SBModule::SBModule() : m_opaque_sp() {}
3530fdc8d8SChris Lattner 
36b9c1b51eSKate Stone SBModule::SBModule(const lldb::ModuleSP &module_sp) : m_opaque_sp(module_sp) {}
3730fdc8d8SChris Lattner 
38b9c1b51eSKate Stone SBModule::SBModule(const SBModuleSpec &module_spec) : m_opaque_sp() {
39226cce25SGreg Clayton   ModuleSP module_sp;
40*97206d57SZachary Turner   Status error = ModuleList::GetSharedModule(*module_spec.m_opaque_ap,
41*97206d57SZachary Turner                                              module_sp, NULL, NULL, NULL);
42226cce25SGreg Clayton   if (module_sp)
43226cce25SGreg Clayton     SetSP(module_sp);
44226cce25SGreg Clayton }
45226cce25SGreg Clayton 
46b9c1b51eSKate Stone SBModule::SBModule(const SBModule &rhs) : m_opaque_sp(rhs.m_opaque_sp) {}
47efabb123SGreg Clayton 
48b9c1b51eSKate Stone SBModule::SBModule(lldb::SBProcess &process, lldb::addr_t header_addr)
49b9c1b51eSKate Stone     : m_opaque_sp() {
50c9660546SGreg Clayton   ProcessSP process_sp(process.GetSP());
51b9c1b51eSKate Stone   if (process_sp) {
5239f7ee86SGreg Clayton     m_opaque_sp = process_sp->ReadModuleFromMemory(FileSpec(), header_addr);
53b9c1b51eSKate Stone     if (m_opaque_sp) {
5439f7ee86SGreg Clayton       Target &target = process_sp->GetTarget();
5539f7ee86SGreg Clayton       bool changed = false;
56751caf65SGreg Clayton       m_opaque_sp->SetLoadAddress(target, 0, true, changed);
5739f7ee86SGreg Clayton       target.GetImages().Append(m_opaque_sp);
5839f7ee86SGreg Clayton     }
59c859e2d5SGreg Clayton   }
60c9660546SGreg Clayton }
61c9660546SGreg Clayton 
62b9c1b51eSKate Stone const SBModule &SBModule::operator=(const SBModule &rhs) {
63efabb123SGreg Clayton   if (this != &rhs)
64efabb123SGreg Clayton     m_opaque_sp = rhs.m_opaque_sp;
65efabb123SGreg Clayton   return *this;
66efabb123SGreg Clayton }
67efabb123SGreg Clayton 
68b9c1b51eSKate Stone SBModule::~SBModule() {}
6930fdc8d8SChris Lattner 
70b9c1b51eSKate Stone bool SBModule::IsValid() const { return m_opaque_sp.get() != NULL; }
7130fdc8d8SChris Lattner 
72b9c1b51eSKate Stone void SBModule::Clear() { m_opaque_sp.reset(); }
735d3bca4eSJim Ingham 
74b9c1b51eSKate Stone SBFileSpec SBModule::GetFileSpec() const {
755160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
76ceb6b139SCaroline Tice 
7730fdc8d8SChris Lattner   SBFileSpec file_spec;
78c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
79c2ff9318SGreg Clayton   if (module_sp)
80c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetFileSpec());
81ceb6b139SCaroline Tice 
82ceb6b139SCaroline Tice   if (log)
83cfd1acedSGreg Clayton     log->Printf("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)",
84324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
85324a1036SSaleem Abdulrasool                 static_cast<const void *>(file_spec.get()));
86ceb6b139SCaroline Tice 
8730fdc8d8SChris Lattner   return file_spec;
8830fdc8d8SChris Lattner }
8930fdc8d8SChris Lattner 
90b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetPlatformFileSpec() const {
915160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
922289fa48SGreg Clayton 
932289fa48SGreg Clayton   SBFileSpec file_spec;
94c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
95c2ff9318SGreg Clayton   if (module_sp)
96c2ff9318SGreg Clayton     file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
972289fa48SGreg Clayton 
982289fa48SGreg Clayton   if (log)
992289fa48SGreg Clayton     log->Printf("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)",
100324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
101324a1036SSaleem Abdulrasool                 static_cast<const void *>(file_spec.get()));
1022289fa48SGreg Clayton 
1032289fa48SGreg Clayton   return file_spec;
1042289fa48SGreg Clayton }
1052289fa48SGreg Clayton 
106b9c1b51eSKate Stone bool SBModule::SetPlatformFileSpec(const lldb::SBFileSpec &platform_file) {
1072289fa48SGreg Clayton   bool result = false;
1085160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
1092289fa48SGreg Clayton 
110c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
111b9c1b51eSKate Stone   if (module_sp) {
112c2ff9318SGreg Clayton     module_sp->SetPlatformFileSpec(*platform_file);
1132289fa48SGreg Clayton     result = true;
1142289fa48SGreg Clayton   }
1152289fa48SGreg Clayton 
1162289fa48SGreg Clayton   if (log)
117b5ad4ec7SGreg Clayton     log->Printf("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s)) => %i",
118324a1036SSaleem Abdulrasool                 static_cast<void *>(module_sp.get()),
119324a1036SSaleem Abdulrasool                 static_cast<const void *>(platform_file.get()),
120324a1036SSaleem Abdulrasool                 platform_file->GetPath().c_str(), result);
1212289fa48SGreg Clayton   return result;
1222289fa48SGreg Clayton }
1232289fa48SGreg Clayton 
124b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetRemoteInstallFileSpec() {
125fbb76349SGreg Clayton   SBFileSpec sb_file_spec;
126fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
127fbb76349SGreg Clayton   if (module_sp)
128fbb76349SGreg Clayton     sb_file_spec.SetFileSpec(module_sp->GetRemoteInstallFileSpec());
129fbb76349SGreg Clayton   return sb_file_spec;
130fbb76349SGreg Clayton }
131fbb76349SGreg Clayton 
132b9c1b51eSKate Stone bool SBModule::SetRemoteInstallFileSpec(lldb::SBFileSpec &file) {
133fbb76349SGreg Clayton   ModuleSP module_sp(GetSP());
134b9c1b51eSKate Stone   if (module_sp) {
135fbb76349SGreg Clayton     module_sp->SetRemoteInstallFileSpec(file.ref());
136fbb76349SGreg Clayton     return true;
137fbb76349SGreg Clayton   }
138fbb76349SGreg Clayton   return false;
139fbb76349SGreg Clayton }
1402289fa48SGreg Clayton 
141b9c1b51eSKate Stone const uint8_t *SBModule::GetUUIDBytes() const {
1425160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
143ceb6b139SCaroline Tice 
1444838131bSGreg Clayton   const uint8_t *uuid_bytes = NULL;
145c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
146c2ff9318SGreg Clayton   if (module_sp)
147c2ff9318SGreg Clayton     uuid_bytes = (const uint8_t *)module_sp->GetUUID().GetBytes();
148ceb6b139SCaroline Tice 
149b9c1b51eSKate Stone   if (log) {
150b9c1b51eSKate Stone     if (uuid_bytes) {
1514838131bSGreg Clayton       StreamString s;
152c2ff9318SGreg Clayton       module_sp->GetUUID().Dump(&s);
153324a1036SSaleem Abdulrasool       log->Printf("SBModule(%p)::GetUUIDBytes () => %s",
154324a1036SSaleem Abdulrasool                   static_cast<void *>(module_sp.get()), s.GetData());
155b9c1b51eSKate Stone     } else
156324a1036SSaleem Abdulrasool       log->Printf("SBModule(%p)::GetUUIDBytes () => NULL",
157324a1036SSaleem Abdulrasool                   static_cast<void *>(module_sp.get()));
1584838131bSGreg Clayton   }
1594838131bSGreg Clayton   return uuid_bytes;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
162b9c1b51eSKate Stone const char *SBModule::GetUUIDString() const {
1635160ce5cSGreg Clayton   Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
164df2963edSJohnny Chen 
165f1be855aSGreg Clayton   const char *uuid_cstr = NULL;
166c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
167b9c1b51eSKate Stone   if (module_sp) {
168f1be855aSGreg Clayton     // We are going to return a "const char *" value through the public
16958ef391fSBruce Mitchener     // API, so we need to constify it so it gets added permanently the
170f1be855aSGreg Clayton     // string pool and then we don't need to worry about the lifetime of the
171f1be855aSGreg Clayton     // string as it will never go away once it has been put into the ConstString
172f1be855aSGreg Clayton     // string pool
173f1be855aSGreg Clayton     uuid_cstr = ConstString(module_sp->GetUUID().GetAsString()).GetCString();
174f1be855aSGreg Clayton   }
175f1be855aSGreg Clayton 
176b9c1b51eSKate Stone   if (uuid_cstr && uuid_cstr[0]) {
177f1be855aSGreg Clayton     if (log)
178b9c1b51eSKate Stone       log->Printf("SBModule(%p)::GetUUIDString () => %s",
179b9c1b51eSKate Stone                   static_cast<void *>(module_sp.get()), uuid_cstr);
180f1be855aSGreg Clayton     return uuid_cstr;
181c16b4af0SJason Molenda   }
182df2963edSJohnny Chen 
183df2963edSJohnny Chen   if (log)
184b9c1b51eSKate Stone     log->Printf("SBModule(%p)::GetUUIDString () => NULL",
185b9c1b51eSKate Stone                 static_cast<void *>(module_sp.get()));
186f1be855aSGreg Clayton   return NULL;
187df2963edSJohnny Chen }
188df2963edSJohnny Chen 
189b9c1b51eSKate Stone bool SBModule::operator==(const SBModule &rhs) const {
1906611103cSGreg Clayton   if (m_opaque_sp)
1916611103cSGreg Clayton     return m_opaque_sp.get() == rhs.m_opaque_sp.get();
19230fdc8d8SChris Lattner   return false;
19330fdc8d8SChris Lattner }
19430fdc8d8SChris Lattner 
195b9c1b51eSKate Stone bool SBModule::operator!=(const SBModule &rhs) const {
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 ModuleSP SBModule::GetSP() const { return m_opaque_sp; }
20230fdc8d8SChris Lattner 
203b9c1b51eSKate Stone void SBModule::SetSP(const ModuleSP &module_sp) { m_opaque_sp = module_sp; }
20430fdc8d8SChris Lattner 
205b9c1b51eSKate Stone SBAddress SBModule::ResolveFileAddress(lldb::addr_t vm_addr) {
206cac9c5f9SGreg Clayton   lldb::SBAddress sb_addr;
207c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
208b9c1b51eSKate Stone   if (module_sp) {
209cac9c5f9SGreg Clayton     Address addr;
210c2ff9318SGreg Clayton     if (module_sp->ResolveFileAddress(vm_addr, addr))
211cac9c5f9SGreg Clayton       sb_addr.ref() = addr;
212cac9c5f9SGreg Clayton   }
213cac9c5f9SGreg Clayton   return sb_addr;
21409960031SGreg Clayton }
21509960031SGreg Clayton 
21609960031SGreg Clayton SBSymbolContext
217b9c1b51eSKate Stone SBModule::ResolveSymbolContextForAddress(const SBAddress &addr,
218b9c1b51eSKate Stone                                          uint32_t resolve_scope) {
21909960031SGreg Clayton   SBSymbolContext sb_sc;
220c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
221c2ff9318SGreg Clayton   if (module_sp && addr.IsValid())
222b9c1b51eSKate Stone     module_sp->ResolveSymbolContextForAddress(addr.ref(), resolve_scope,
223b9c1b51eSKate Stone                                               *sb_sc);
22409960031SGreg Clayton   return sb_sc;
22509960031SGreg Clayton }
22609960031SGreg Clayton 
227b9c1b51eSKate Stone bool SBModule::GetDescription(SBStream &description) {
228da7bc7d0SGreg Clayton   Stream &strm = description.ref();
229da7bc7d0SGreg Clayton 
230c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
231b9c1b51eSKate Stone   if (module_sp) {
232c2ff9318SGreg Clayton     module_sp->GetDescription(&strm);
233b9c1b51eSKate Stone   } else
234da7bc7d0SGreg Clayton     strm.PutCString("No value");
235dde9cff3SCaroline Tice 
236dde9cff3SCaroline Tice   return true;
237dde9cff3SCaroline Tice }
238bbdabce2SGreg Clayton 
239b9c1b51eSKate Stone uint32_t SBModule::GetNumCompileUnits() {
240873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
241b9c1b51eSKate Stone   if (module_sp) {
242873a7a4bSJohnny Chen     return module_sp->GetNumCompileUnits();
243873a7a4bSJohnny Chen   }
244873a7a4bSJohnny Chen   return 0;
245873a7a4bSJohnny Chen }
246873a7a4bSJohnny Chen 
247b9c1b51eSKate Stone SBCompileUnit SBModule::GetCompileUnitAtIndex(uint32_t index) {
248873a7a4bSJohnny Chen   SBCompileUnit sb_cu;
249873a7a4bSJohnny Chen   ModuleSP module_sp(GetSP());
250b9c1b51eSKate Stone   if (module_sp) {
251873a7a4bSJohnny Chen     CompUnitSP cu_sp = module_sp->GetCompileUnitAtIndex(index);
252873a7a4bSJohnny Chen     sb_cu.reset(cu_sp.get());
253873a7a4bSJohnny Chen   }
254873a7a4bSJohnny Chen   return sb_cu;
255873a7a4bSJohnny Chen }
256873a7a4bSJohnny Chen 
257b9c1b51eSKate Stone static Symtab *GetUnifiedSymbolTable(const lldb::ModuleSP &module_sp) {
258b9c1b51eSKate Stone   if (module_sp) {
259a7499c98SMichael Sartain     SymbolVendor *symbols = module_sp->GetSymbolVendor();
260a7499c98SMichael Sartain     if (symbols)
261a7499c98SMichael Sartain       return symbols->GetSymtab();
262a7499c98SMichael Sartain   }
263a7499c98SMichael Sartain   return NULL;
264a7499c98SMichael Sartain }
265a7499c98SMichael Sartain 
266b9c1b51eSKate Stone size_t SBModule::GetNumSymbols() {
267c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
268b9c1b51eSKate Stone   if (module_sp) {
269a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
270bbdabce2SGreg Clayton     if (symtab)
271bbdabce2SGreg Clayton       return symtab->GetNumSymbols();
272bbdabce2SGreg Clayton   }
273bbdabce2SGreg Clayton   return 0;
274bbdabce2SGreg Clayton }
275bbdabce2SGreg Clayton 
276b9c1b51eSKate Stone SBSymbol SBModule::GetSymbolAtIndex(size_t idx) {
277bbdabce2SGreg Clayton   SBSymbol sb_symbol;
278c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
279a7499c98SMichael Sartain   Symtab *symtab = GetUnifiedSymbolTable(module_sp);
280bbdabce2SGreg Clayton   if (symtab)
281bbdabce2SGreg Clayton     sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx));
282bbdabce2SGreg Clayton   return sb_symbol;
283bbdabce2SGreg Clayton }
284fe356d35SGreg Clayton 
285b9c1b51eSKate Stone lldb::SBSymbol SBModule::FindSymbol(const char *name,
286b9c1b51eSKate Stone                                     lldb::SymbolType symbol_type) {
287e14e1925SGreg Clayton   SBSymbol sb_symbol;
288b9c1b51eSKate Stone   if (name && name[0]) {
289e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
290a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
291e14e1925SGreg Clayton     if (symtab)
292b9c1b51eSKate Stone       sb_symbol.SetSymbol(symtab->FindFirstSymbolWithNameAndType(
293b9c1b51eSKate Stone           ConstString(name), symbol_type, Symtab::eDebugAny,
294b9c1b51eSKate Stone           Symtab::eVisibilityAny));
295e14e1925SGreg Clayton   }
296e14e1925SGreg Clayton   return sb_symbol;
297e14e1925SGreg Clayton }
298e14e1925SGreg Clayton 
299b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindSymbols(const char *name,
300b9c1b51eSKate Stone                                                 lldb::SymbolType symbol_type) {
301e14e1925SGreg Clayton   SBSymbolContextList sb_sc_list;
302b9c1b51eSKate Stone   if (name && name[0]) {
303e14e1925SGreg Clayton     ModuleSP module_sp(GetSP());
304a7499c98SMichael Sartain     Symtab *symtab = GetUnifiedSymbolTable(module_sp);
305b9c1b51eSKate Stone     if (symtab) {
306e14e1925SGreg Clayton       std::vector<uint32_t> matching_symbol_indexes;
307b9c1b51eSKate Stone       const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(
308b9c1b51eSKate Stone           ConstString(name), symbol_type, matching_symbol_indexes);
309b9c1b51eSKate Stone       if (num_matches) {
310e14e1925SGreg Clayton         SymbolContext sc;
311e14e1925SGreg Clayton         sc.module_sp = module_sp;
312e14e1925SGreg Clayton         SymbolContextList &sc_list = *sb_sc_list;
313b9c1b51eSKate Stone         for (size_t i = 0; i < num_matches; ++i) {
314e14e1925SGreg Clayton           sc.symbol = symtab->SymbolAtIndex(matching_symbol_indexes[i]);
315e14e1925SGreg Clayton           if (sc.symbol)
316e14e1925SGreg Clayton             sc_list.Append(sc);
317e14e1925SGreg Clayton         }
318e14e1925SGreg Clayton       }
319e14e1925SGreg Clayton     }
320e14e1925SGreg Clayton   }
321e14e1925SGreg Clayton   return sb_sc_list;
322e14e1925SGreg Clayton }
323e14e1925SGreg Clayton 
324b9c1b51eSKate Stone size_t SBModule::GetNumSections() {
325c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
326b9c1b51eSKate Stone   if (module_sp) {
327a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
328a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
3293046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
330cac9c5f9SGreg Clayton     if (section_list)
331cac9c5f9SGreg Clayton       return section_list->GetSize();
332cac9c5f9SGreg Clayton   }
333cac9c5f9SGreg Clayton   return 0;
334cac9c5f9SGreg Clayton }
335cac9c5f9SGreg Clayton 
336b9c1b51eSKate Stone SBSection SBModule::GetSectionAtIndex(size_t idx) {
337cac9c5f9SGreg Clayton   SBSection sb_section;
338c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
339b9c1b51eSKate Stone   if (module_sp) {
340a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
341a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
3423046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
343cac9c5f9SGreg Clayton 
344cac9c5f9SGreg Clayton     if (section_list)
345e72dfb32SGreg Clayton       sb_section.SetSP(section_list->GetSectionAtIndex(idx));
346cac9c5f9SGreg Clayton   }
347cac9c5f9SGreg Clayton   return sb_section;
348cac9c5f9SGreg Clayton }
349cac9c5f9SGreg Clayton 
350b9c1b51eSKate Stone lldb::SBSymbolContextList SBModule::FindFunctions(const char *name,
351b9c1b51eSKate Stone                                                   uint32_t name_type_mask) {
3525569e64eSGreg Clayton   lldb::SBSymbolContextList sb_sc_list;
353c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
354b9c1b51eSKate Stone   if (name && module_sp) {
3555569e64eSGreg Clayton     const bool append = true;
356fe356d35SGreg Clayton     const bool symbols_ok = true;
3579df05fbbSSean Callanan     const bool inlines_ok = true;
358b9c1b51eSKate Stone     module_sp->FindFunctions(ConstString(name), NULL, name_type_mask,
359b9c1b51eSKate Stone                              symbols_ok, inlines_ok, append, *sb_sc_list);
360fe356d35SGreg Clayton   }
3615569e64eSGreg Clayton   return sb_sc_list;
362fe356d35SGreg Clayton }
363fe356d35SGreg Clayton 
364b9c1b51eSKate Stone SBValueList SBModule::FindGlobalVariables(SBTarget &target, const char *name,
365b9c1b51eSKate Stone                                           uint32_t max_matches) {
366dea8cb4fSGreg Clayton   SBValueList sb_value_list;
367c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
368b9c1b51eSKate Stone   if (name && module_sp) {
369dea8cb4fSGreg Clayton     VariableList variable_list;
370b9c1b51eSKate Stone     const uint32_t match_count = module_sp->FindGlobalVariables(
371b9c1b51eSKate Stone         ConstString(name), NULL, false, max_matches, variable_list);
372dea8cb4fSGreg Clayton 
373b9c1b51eSKate Stone     if (match_count > 0) {
374b9c1b51eSKate Stone       for (uint32_t i = 0; i < match_count; ++i) {
375dea8cb4fSGreg Clayton         lldb::ValueObjectSP valobj_sp;
376b9556accSGreg Clayton         TargetSP target_sp(target.GetSP());
377b9c1b51eSKate Stone         valobj_sp = ValueObjectVariable::Create(
378b9c1b51eSKate Stone             target_sp.get(), variable_list.GetVariableAtIndex(i));
379dea8cb4fSGreg Clayton         if (valobj_sp)
38085425d77SEnrico Granata           sb_value_list.Append(SBValue(valobj_sp));
381dea8cb4fSGreg Clayton       }
382dea8cb4fSGreg Clayton     }
383dea8cb4fSGreg Clayton   }
384dea8cb4fSGreg Clayton 
385dea8cb4fSGreg Clayton   return sb_value_list;
386dea8cb4fSGreg Clayton }
3876f3533fbSEnrico Granata 
388b9c1b51eSKate Stone lldb::SBValue SBModule::FindFirstGlobalVariable(lldb::SBTarget &target,
389b9c1b51eSKate Stone                                                 const char *name) {
390bcd80b47SEnrico Granata   SBValueList sb_value_list(FindGlobalVariables(target, name, 1));
391bcd80b47SEnrico Granata   if (sb_value_list.IsValid() && sb_value_list.GetSize() > 0)
392bcd80b47SEnrico Granata     return sb_value_list.GetValueAtIndex(0);
393bcd80b47SEnrico Granata   return SBValue();
394bcd80b47SEnrico Granata }
395bcd80b47SEnrico Granata 
396b9c1b51eSKate Stone lldb::SBType SBModule::FindFirstType(const char *name_cstr) {
397fe42ac4dSGreg Clayton   SBType sb_type;
398c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
399b9c1b51eSKate Stone   if (name_cstr && module_sp) {
4006f3533fbSEnrico Granata     SymbolContext sc;
40184db9105SGreg Clayton     const bool exact_match = false;
4026f3533fbSEnrico Granata     ConstString name(name_cstr);
4036f3533fbSEnrico Granata 
404b43165b7SGreg Clayton     sb_type = SBType(module_sp->FindFirstType(sc, name, exact_match));
4056f3533fbSEnrico Granata 
406b9c1b51eSKate Stone     if (!sb_type.IsValid()) {
407b9c1b51eSKate Stone       TypeSystem *type_system =
408b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
40956939cb3SGreg Clayton       if (type_system)
41056939cb3SGreg Clayton         sb_type = SBType(type_system->GetBuiltinTypeByName(name));
41156939cb3SGreg Clayton     }
4126f3533fbSEnrico Granata   }
413fe42ac4dSGreg Clayton   return sb_type;
4146f3533fbSEnrico Granata }
4156f3533fbSEnrico Granata 
416b9c1b51eSKate Stone lldb::SBType SBModule::GetBasicType(lldb::BasicType type) {
417b43165b7SGreg Clayton   ModuleSP module_sp(GetSP());
418b9c1b51eSKate Stone   if (module_sp) {
419b9c1b51eSKate Stone     TypeSystem *type_system =
420b9c1b51eSKate Stone         module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
42156939cb3SGreg Clayton     if (type_system)
42256939cb3SGreg Clayton       return SBType(type_system->GetBasicTypeFromAST(type));
42356939cb3SGreg Clayton   }
424b43165b7SGreg Clayton   return SBType();
425b43165b7SGreg Clayton }
426b43165b7SGreg Clayton 
427b9c1b51eSKate Stone lldb::SBTypeList SBModule::FindTypes(const char *type) {
4286f3533fbSEnrico Granata   SBTypeList retval;
4296f3533fbSEnrico Granata 
430c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
431b9c1b51eSKate Stone   if (type && module_sp) {
4326f3533fbSEnrico Granata     SymbolContext sc;
4336f3533fbSEnrico Granata     TypeList type_list;
43484db9105SGreg Clayton     const bool exact_match = false;
4356f3533fbSEnrico Granata     ConstString name(type);
436ae088e52SGreg Clayton     llvm::DenseSet<SymbolFile *> searched_symbol_files;
437b9c1b51eSKate Stone     const uint32_t num_matches = module_sp->FindTypes(
438b9c1b51eSKate Stone         sc, name, exact_match, UINT32_MAX, searched_symbol_files, type_list);
4396f3533fbSEnrico Granata 
440b9c1b51eSKate Stone     if (num_matches > 0) {
441b9c1b51eSKate Stone       for (size_t idx = 0; idx < num_matches; idx++) {
442fe42ac4dSGreg Clayton         TypeSP type_sp(type_list.GetTypeAtIndex(idx));
443fe42ac4dSGreg Clayton         if (type_sp)
444fe42ac4dSGreg Clayton           retval.Append(SBType(type_sp));
445fe42ac4dSGreg Clayton       }
446b9c1b51eSKate Stone     } else {
447b9c1b51eSKate Stone       TypeSystem *type_system =
448b9c1b51eSKate Stone           module_sp->GetTypeSystemForLanguage(eLanguageTypeC);
449b9c1b51eSKate Stone       if (type_system) {
45056939cb3SGreg Clayton         CompilerType compiler_type = type_system->GetBuiltinTypeByName(name);
45156939cb3SGreg Clayton         if (compiler_type)
45256939cb3SGreg Clayton           retval.Append(SBType(compiler_type));
45356939cb3SGreg Clayton       }
454b43165b7SGreg Clayton     }
455b43165b7SGreg Clayton   }
4566f3533fbSEnrico Granata 
4576f3533fbSEnrico Granata   return retval;
4586f3533fbSEnrico Granata }
459cac9c5f9SGreg Clayton 
460b9c1b51eSKate Stone lldb::SBType SBModule::GetTypeByID(lldb::user_id_t uid) {
4611f4db7daSGreg Clayton   ModuleSP module_sp(GetSP());
462b9c1b51eSKate Stone   if (module_sp) {
4631f4db7daSGreg Clayton     SymbolVendor *vendor = module_sp->GetSymbolVendor();
464b9c1b51eSKate Stone     if (vendor) {
4651f4db7daSGreg Clayton       Type *type_ptr = vendor->ResolveTypeUID(uid);
4661f4db7daSGreg Clayton       if (type_ptr)
4671f4db7daSGreg Clayton         return SBType(type_ptr->shared_from_this());
4681f4db7daSGreg Clayton     }
4691f4db7daSGreg Clayton   }
4701f4db7daSGreg Clayton   return SBType();
4711f4db7daSGreg Clayton }
4721f4db7daSGreg Clayton 
473b9c1b51eSKate Stone lldb::SBTypeList SBModule::GetTypes(uint32_t type_mask) {
474f02500c7SGreg Clayton   SBTypeList sb_type_list;
475f02500c7SGreg Clayton 
476f02500c7SGreg Clayton   ModuleSP module_sp(GetSP());
477b9c1b51eSKate Stone   if (module_sp) {
478f02500c7SGreg Clayton     SymbolVendor *vendor = module_sp->GetSymbolVendor();
479b9c1b51eSKate Stone     if (vendor) {
480f02500c7SGreg Clayton       TypeList type_list;
481f02500c7SGreg Clayton       vendor->GetTypes(NULL, type_mask, type_list);
482f02500c7SGreg Clayton       sb_type_list.m_opaque_ap->Append(type_list);
483f02500c7SGreg Clayton     }
484f02500c7SGreg Clayton   }
485f02500c7SGreg Clayton   return sb_type_list;
486f02500c7SGreg Clayton }
487cac9c5f9SGreg Clayton 
488b9c1b51eSKate Stone SBSection SBModule::FindSection(const char *sect_name) {
489cac9c5f9SGreg Clayton   SBSection sb_section;
490cac9c5f9SGreg Clayton 
491c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
492b9c1b51eSKate Stone   if (sect_name && module_sp) {
493a7499c98SMichael Sartain     // Give the symbol vendor a chance to add to the unified section list.
494a7499c98SMichael Sartain     module_sp->GetSymbolVendor();
4953046e668SGreg Clayton     SectionList *section_list = module_sp->GetSectionList();
496b9c1b51eSKate Stone     if (section_list) {
497cac9c5f9SGreg Clayton       ConstString const_sect_name(sect_name);
498cac9c5f9SGreg Clayton       SectionSP section_sp(section_list->FindSectionByName(const_sect_name));
499b9c1b51eSKate Stone       if (section_sp) {
500e72dfb32SGreg Clayton         sb_section.SetSP(section_sp);
501cac9c5f9SGreg Clayton       }
502cac9c5f9SGreg Clayton     }
503cac9c5f9SGreg Clayton   }
504cac9c5f9SGreg Clayton   return sb_section;
505cac9c5f9SGreg Clayton }
506cac9c5f9SGreg Clayton 
507b9c1b51eSKate Stone lldb::ByteOrder SBModule::GetByteOrder() {
508c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
509c2ff9318SGreg Clayton   if (module_sp)
510c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetByteOrder();
51113d1950aSGreg Clayton   return eByteOrderInvalid;
51213d1950aSGreg Clayton }
51313d1950aSGreg Clayton 
514b9c1b51eSKate Stone const char *SBModule::GetTriple() {
515c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
516b9c1b51eSKate Stone   if (module_sp) {
517c2ff9318SGreg Clayton     std::string triple(module_sp->GetArchitecture().GetTriple().str());
51813d1950aSGreg Clayton     // Unique the string so we don't run into ownership issues since
51913d1950aSGreg Clayton     // the const strings put the string into the string pool once and
52013d1950aSGreg Clayton     // the strings never comes out
52113d1950aSGreg Clayton     ConstString const_triple(triple.c_str());
52213d1950aSGreg Clayton     return const_triple.GetCString();
52313d1950aSGreg Clayton   }
52413d1950aSGreg Clayton   return NULL;
52513d1950aSGreg Clayton }
52613d1950aSGreg Clayton 
527b9c1b51eSKate Stone uint32_t SBModule::GetAddressByteSize() {
528c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
529c2ff9318SGreg Clayton   if (module_sp)
530c2ff9318SGreg Clayton     return module_sp->GetArchitecture().GetAddressByteSize();
53113d1950aSGreg Clayton   return sizeof(void *);
53213d1950aSGreg Clayton }
53313d1950aSGreg Clayton 
534b9c1b51eSKate Stone uint32_t SBModule::GetVersion(uint32_t *versions, uint32_t num_versions) {
535c2ff9318SGreg Clayton   ModuleSP module_sp(GetSP());
536c2ff9318SGreg Clayton   if (module_sp)
5373467d80bSEnrico Granata     return module_sp->GetVersion(versions, num_versions);
538b9c1b51eSKate Stone   else {
539b9c1b51eSKate Stone     if (versions && num_versions) {
540c2ff9318SGreg Clayton       for (uint32_t i = 0; i < num_versions; ++i)
541c2ff9318SGreg Clayton         versions[i] = UINT32_MAX;
542c2ff9318SGreg Clayton     }
543c2ff9318SGreg Clayton     return 0;
544c2ff9318SGreg Clayton   }
5453467d80bSEnrico Granata }
546c2ff9318SGreg Clayton 
547b9c1b51eSKate Stone lldb::SBFileSpec SBModule::GetSymbolFileSpec() const {
548eb2c19a5SIlia K   lldb::SBFileSpec sb_file_spec;
549eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
550b9c1b51eSKate Stone   if (module_sp) {
551eb2c19a5SIlia K     SymbolVendor *symbol_vendor_ptr = module_sp->GetSymbolVendor();
552eb2c19a5SIlia K     if (symbol_vendor_ptr)
553eb2c19a5SIlia K       sb_file_spec.SetFileSpec(symbol_vendor_ptr->GetMainFileSpec());
554eb2c19a5SIlia K   }
555eb2c19a5SIlia K   return sb_file_spec;
556eb2c19a5SIlia K }
557eb2c19a5SIlia K 
558b9c1b51eSKate Stone lldb::SBAddress SBModule::GetObjectFileHeaderAddress() const {
559eb2c19a5SIlia K   lldb::SBAddress sb_addr;
560eb2c19a5SIlia K   ModuleSP module_sp(GetSP());
561b9c1b51eSKate Stone   if (module_sp) {
562eb2c19a5SIlia K     ObjectFile *objfile_ptr = module_sp->GetObjectFile();
563eb2c19a5SIlia K     if (objfile_ptr)
564eb2c19a5SIlia K       sb_addr.ref() = objfile_ptr->GetHeaderAddress();
565eb2c19a5SIlia K   }
566eb2c19a5SIlia K   return sb_addr;
567eb2c19a5SIlia K }
568