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"
13c9660546SGreg Clayton #include "lldb/API/SBProcess.h"
14dde9cff3SCaroline Tice #include "lldb/API/SBStream.h"
15fe356d35SGreg Clayton #include "lldb/API/SBSymbolContextList.h"
1630fdc8d8SChris Lattner #include "lldb/Core/Module.h"
17ceb6b139SCaroline Tice #include "lldb/Core/Log.h"
1838adbbb8SGreg Clayton #include "lldb/Core/StreamString.h"
19dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectList.h"
20dea8cb4fSGreg Clayton #include "lldb/Core/ValueObjectVariable.h"
216f3533fbSEnrico Granata #include "lldb/Symbol/SymbolVendor.h"
22dea8cb4fSGreg Clayton #include "lldb/Symbol/VariableList.h"
23dea8cb4fSGreg Clayton #include "lldb/Target/Target.h"
2430fdc8d8SChris Lattner 
2530fdc8d8SChris Lattner using namespace lldb;
26ceb6b139SCaroline Tice using namespace lldb_private;
2730fdc8d8SChris Lattner 
2830fdc8d8SChris Lattner 
2930fdc8d8SChris Lattner SBModule::SBModule () :
306611103cSGreg Clayton     m_opaque_sp ()
3130fdc8d8SChris Lattner {
3230fdc8d8SChris Lattner }
3330fdc8d8SChris Lattner 
3430fdc8d8SChris Lattner SBModule::SBModule (const lldb::ModuleSP& module_sp) :
356611103cSGreg Clayton     m_opaque_sp (module_sp)
3630fdc8d8SChris Lattner {
3730fdc8d8SChris Lattner }
3830fdc8d8SChris Lattner 
39efabb123SGreg Clayton SBModule::SBModule(const SBModule &rhs) :
40efabb123SGreg Clayton     m_opaque_sp (rhs.m_opaque_sp)
41efabb123SGreg Clayton {
42efabb123SGreg Clayton }
43efabb123SGreg Clayton 
44c9660546SGreg Clayton SBModule::SBModule (lldb::SBProcess &process, lldb::addr_t header_addr) :
45c9660546SGreg Clayton     m_opaque_sp ()
46c9660546SGreg Clayton {
47c9660546SGreg Clayton     ProcessSP process_sp (process.GetSP());
48c9660546SGreg Clayton     if (process_sp)
49*c859e2d5SGreg Clayton     {
50*c859e2d5SGreg Clayton         const bool add_image_to_target = true;
51*c859e2d5SGreg Clayton         const bool load_image_sections_in_target = true;
52*c859e2d5SGreg Clayton         m_opaque_sp = process_sp->ReadModuleFromMemory (FileSpec(),
53*c859e2d5SGreg Clayton                                                         header_addr,
54*c859e2d5SGreg Clayton                                                         add_image_to_target,
55*c859e2d5SGreg Clayton                                                         load_image_sections_in_target);
56*c859e2d5SGreg Clayton     }
57c9660546SGreg Clayton }
58c9660546SGreg Clayton 
59efabb123SGreg Clayton const SBModule &
60efabb123SGreg Clayton SBModule::operator = (const SBModule &rhs)
61efabb123SGreg Clayton {
62efabb123SGreg Clayton     if (this != &rhs)
63efabb123SGreg Clayton         m_opaque_sp = rhs.m_opaque_sp;
64efabb123SGreg Clayton     return *this;
65efabb123SGreg Clayton }
66efabb123SGreg Clayton 
6730fdc8d8SChris Lattner SBModule::~SBModule ()
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner bool
7230fdc8d8SChris Lattner SBModule::IsValid () const
7330fdc8d8SChris Lattner {
746611103cSGreg Clayton     return m_opaque_sp.get() != NULL;
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
775d3bca4eSJim Ingham void
785d3bca4eSJim Ingham SBModule::Clear()
795d3bca4eSJim Ingham {
805d3bca4eSJim Ingham     m_opaque_sp.reset();
815d3bca4eSJim Ingham }
825d3bca4eSJim Ingham 
8330fdc8d8SChris Lattner SBFileSpec
8430fdc8d8SChris Lattner SBModule::GetFileSpec () const
8530fdc8d8SChris Lattner {
862d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
87ceb6b139SCaroline Tice 
8830fdc8d8SChris Lattner     SBFileSpec file_spec;
896611103cSGreg Clayton     if (m_opaque_sp)
906611103cSGreg Clayton         file_spec.SetFileSpec(m_opaque_sp->GetFileSpec());
91ceb6b139SCaroline Tice 
92ceb6b139SCaroline Tice     if (log)
93ceb6b139SCaroline Tice     {
94cfd1acedSGreg Clayton         log->Printf ("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)",
95cfd1acedSGreg Clayton         m_opaque_sp.get(), file_spec.get());
96ceb6b139SCaroline Tice     }
97ceb6b139SCaroline Tice 
9830fdc8d8SChris Lattner     return file_spec;
9930fdc8d8SChris Lattner }
10030fdc8d8SChris Lattner 
1012289fa48SGreg Clayton lldb::SBFileSpec
1022289fa48SGreg Clayton SBModule::GetPlatformFileSpec () const
1032289fa48SGreg Clayton {
1042289fa48SGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1052289fa48SGreg Clayton 
1062289fa48SGreg Clayton     SBFileSpec file_spec;
1072289fa48SGreg Clayton     if (m_opaque_sp)
1082289fa48SGreg Clayton         file_spec.SetFileSpec(m_opaque_sp->GetPlatformFileSpec());
1092289fa48SGreg Clayton 
1102289fa48SGreg Clayton     if (log)
1112289fa48SGreg Clayton     {
1122289fa48SGreg Clayton         log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)",
1132289fa48SGreg Clayton                      m_opaque_sp.get(), file_spec.get());
1142289fa48SGreg Clayton     }
1152289fa48SGreg Clayton 
1162289fa48SGreg Clayton     return file_spec;
1172289fa48SGreg Clayton 
1182289fa48SGreg Clayton }
1192289fa48SGreg Clayton 
1202289fa48SGreg Clayton bool
1212289fa48SGreg Clayton SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file)
1222289fa48SGreg Clayton {
1232289fa48SGreg Clayton     bool result = false;
1242289fa48SGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
1252289fa48SGreg Clayton 
1262289fa48SGreg Clayton     if (m_opaque_sp)
1272289fa48SGreg Clayton     {
1282289fa48SGreg Clayton         m_opaque_sp->SetPlatformFileSpec(*platform_file);
1292289fa48SGreg Clayton         result = true;
1302289fa48SGreg Clayton     }
1312289fa48SGreg Clayton 
1322289fa48SGreg Clayton     if (log)
1332289fa48SGreg Clayton     {
1342289fa48SGreg Clayton         log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i",
1352289fa48SGreg Clayton                      m_opaque_sp.get(),
1362289fa48SGreg Clayton                      platform_file.get(),
1372289fa48SGreg Clayton                      platform_file->GetDirectory().GetCString(),
1382289fa48SGreg Clayton                      platform_file->GetDirectory() ? "/" : "",
1392289fa48SGreg Clayton                      platform_file->GetFilename().GetCString(),
1402289fa48SGreg Clayton                      result);
1412289fa48SGreg Clayton     }
1422289fa48SGreg Clayton     return result;
1432289fa48SGreg Clayton }
1442289fa48SGreg Clayton 
1452289fa48SGreg Clayton 
1462289fa48SGreg Clayton 
14730fdc8d8SChris Lattner const uint8_t *
14830fdc8d8SChris Lattner SBModule::GetUUIDBytes () const
14930fdc8d8SChris Lattner {
1502d4edfbcSGreg Clayton     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
151ceb6b139SCaroline Tice 
1524838131bSGreg Clayton     const uint8_t *uuid_bytes = NULL;
1536611103cSGreg Clayton     if (m_opaque_sp)
1544838131bSGreg Clayton         uuid_bytes = (const uint8_t *)m_opaque_sp->GetUUID().GetBytes();
155ceb6b139SCaroline Tice 
156ceb6b139SCaroline Tice     if (log)
1574838131bSGreg Clayton     {
1584838131bSGreg Clayton         if (uuid_bytes)
1594838131bSGreg Clayton         {
1604838131bSGreg Clayton             StreamString s;
1614838131bSGreg Clayton             m_opaque_sp->GetUUID().Dump (&s);
1624838131bSGreg Clayton             log->Printf ("SBModule(%p)::GetUUIDBytes () => %s", m_opaque_sp.get(), s.GetData());
1634838131bSGreg Clayton         }
1644838131bSGreg Clayton         else
1654838131bSGreg Clayton             log->Printf ("SBModule(%p)::GetUUIDBytes () => NULL", m_opaque_sp.get());
1664838131bSGreg Clayton     }
1674838131bSGreg Clayton     return uuid_bytes;
16830fdc8d8SChris Lattner }
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner 
171df2963edSJohnny Chen const char *
172df2963edSJohnny Chen SBModule::GetUUIDString () const
173df2963edSJohnny Chen {
174df2963edSJohnny Chen     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
175df2963edSJohnny Chen 
176df2963edSJohnny Chen     static char uuid_string[80];
177df2963edSJohnny Chen     const char * uuid_c_string = NULL;
178df2963edSJohnny Chen     if (m_opaque_sp)
179df2963edSJohnny Chen         uuid_c_string = (const char *)m_opaque_sp->GetUUID().GetAsCString(uuid_string, sizeof(uuid_string));
180df2963edSJohnny Chen 
181df2963edSJohnny Chen     if (log)
182df2963edSJohnny Chen     {
183df2963edSJohnny Chen         if (uuid_c_string)
184df2963edSJohnny Chen         {
185df2963edSJohnny Chen             StreamString s;
186df2963edSJohnny Chen             m_opaque_sp->GetUUID().Dump (&s);
187df2963edSJohnny Chen             log->Printf ("SBModule(%p)::GetUUIDString () => %s", m_opaque_sp.get(), s.GetData());
188df2963edSJohnny Chen         }
189df2963edSJohnny Chen         else
190df2963edSJohnny Chen             log->Printf ("SBModule(%p)::GetUUIDString () => NULL", m_opaque_sp.get());
191df2963edSJohnny Chen     }
192df2963edSJohnny Chen     return uuid_c_string;
193df2963edSJohnny Chen }
194df2963edSJohnny Chen 
195df2963edSJohnny Chen 
19630fdc8d8SChris Lattner bool
19730fdc8d8SChris Lattner SBModule::operator == (const SBModule &rhs) const
19830fdc8d8SChris Lattner {
1996611103cSGreg Clayton     if (m_opaque_sp)
2006611103cSGreg Clayton         return m_opaque_sp.get() == rhs.m_opaque_sp.get();
20130fdc8d8SChris Lattner     return false;
20230fdc8d8SChris Lattner }
20330fdc8d8SChris Lattner 
20430fdc8d8SChris Lattner bool
20530fdc8d8SChris Lattner SBModule::operator != (const SBModule &rhs) const
20630fdc8d8SChris Lattner {
2076611103cSGreg Clayton     if (m_opaque_sp)
2086611103cSGreg Clayton         return m_opaque_sp.get() != rhs.m_opaque_sp.get();
20930fdc8d8SChris Lattner     return false;
21030fdc8d8SChris Lattner }
21130fdc8d8SChris Lattner 
212acdbe816SGreg Clayton ModuleSP
213acdbe816SGreg Clayton SBModule::GetSP () const
214cac9c5f9SGreg Clayton {
215cac9c5f9SGreg Clayton     return m_opaque_sp;
216cac9c5f9SGreg Clayton }
21730fdc8d8SChris Lattner 
21830fdc8d8SChris Lattner void
219acdbe816SGreg Clayton SBModule::SetSP (const ModuleSP &module_sp)
22030fdc8d8SChris Lattner {
2216611103cSGreg Clayton     m_opaque_sp = module_sp;
22230fdc8d8SChris Lattner }
22330fdc8d8SChris Lattner 
224cac9c5f9SGreg Clayton SBAddress
225cac9c5f9SGreg Clayton SBModule::ResolveFileAddress (lldb::addr_t vm_addr)
22609960031SGreg Clayton {
227cac9c5f9SGreg Clayton     lldb::SBAddress sb_addr;
228cac9c5f9SGreg Clayton     if (m_opaque_sp)
229cac9c5f9SGreg Clayton     {
230cac9c5f9SGreg Clayton         Address addr;
231cac9c5f9SGreg Clayton         if (m_opaque_sp->ResolveFileAddress (vm_addr, addr))
232cac9c5f9SGreg Clayton             sb_addr.ref() = addr;
233cac9c5f9SGreg Clayton     }
234cac9c5f9SGreg Clayton     return sb_addr;
23509960031SGreg Clayton }
23609960031SGreg Clayton 
23709960031SGreg Clayton SBSymbolContext
23809960031SGreg Clayton SBModule::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope)
23909960031SGreg Clayton {
24009960031SGreg Clayton     SBSymbolContext sb_sc;
24109960031SGreg Clayton     if (m_opaque_sp && addr.IsValid())
24200e6fbfeSGreg Clayton         m_opaque_sp->ResolveSymbolContextForAddress (addr.ref(), resolve_scope, *sb_sc);
24309960031SGreg Clayton     return sb_sc;
24409960031SGreg Clayton }
24509960031SGreg Clayton 
246dde9cff3SCaroline Tice bool
247dde9cff3SCaroline Tice SBModule::GetDescription (SBStream &description)
248dde9cff3SCaroline Tice {
249da7bc7d0SGreg Clayton     Stream &strm = description.ref();
250da7bc7d0SGreg Clayton 
251dde9cff3SCaroline Tice     if (m_opaque_sp)
252dde9cff3SCaroline Tice     {
253da7bc7d0SGreg Clayton         m_opaque_sp->GetDescription (&strm);
254dde9cff3SCaroline Tice     }
255dde9cff3SCaroline Tice     else
256da7bc7d0SGreg Clayton         strm.PutCString ("No value");
257dde9cff3SCaroline Tice 
258dde9cff3SCaroline Tice     return true;
259dde9cff3SCaroline Tice }
260bbdabce2SGreg Clayton 
261bbdabce2SGreg Clayton size_t
262bbdabce2SGreg Clayton SBModule::GetNumSymbols ()
263bbdabce2SGreg Clayton {
264bbdabce2SGreg Clayton     if (m_opaque_sp)
265bbdabce2SGreg Clayton     {
266bbdabce2SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
267bbdabce2SGreg Clayton         if (obj_file)
268bbdabce2SGreg Clayton         {
269bbdabce2SGreg Clayton             Symtab *symtab = obj_file->GetSymtab();
270bbdabce2SGreg Clayton             if (symtab)
271bbdabce2SGreg Clayton                 return symtab->GetNumSymbols();
272bbdabce2SGreg Clayton         }
273bbdabce2SGreg Clayton     }
274bbdabce2SGreg Clayton     return 0;
275bbdabce2SGreg Clayton }
276bbdabce2SGreg Clayton 
277bbdabce2SGreg Clayton SBSymbol
278bbdabce2SGreg Clayton SBModule::GetSymbolAtIndex (size_t idx)
279bbdabce2SGreg Clayton {
280bbdabce2SGreg Clayton     SBSymbol sb_symbol;
281bbdabce2SGreg Clayton     if (m_opaque_sp)
282bbdabce2SGreg Clayton     {
283bbdabce2SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
284bbdabce2SGreg Clayton         if (obj_file)
285bbdabce2SGreg Clayton         {
286bbdabce2SGreg Clayton             Symtab *symtab = obj_file->GetSymtab();
287bbdabce2SGreg Clayton             if (symtab)
288bbdabce2SGreg Clayton                 sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx));
289bbdabce2SGreg Clayton         }
290bbdabce2SGreg Clayton     }
291bbdabce2SGreg Clayton     return sb_symbol;
292bbdabce2SGreg Clayton }
293fe356d35SGreg Clayton 
294cac9c5f9SGreg Clayton size_t
295cac9c5f9SGreg Clayton SBModule::GetNumSections ()
296cac9c5f9SGreg Clayton {
297cac9c5f9SGreg Clayton     if (m_opaque_sp)
298cac9c5f9SGreg Clayton     {
299cac9c5f9SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
300cac9c5f9SGreg Clayton         if (obj_file)
301cac9c5f9SGreg Clayton         {
302cac9c5f9SGreg Clayton             SectionList *section_list = obj_file->GetSectionList ();
303cac9c5f9SGreg Clayton             if (section_list)
304cac9c5f9SGreg Clayton                 return section_list->GetSize();
305cac9c5f9SGreg Clayton         }
306cac9c5f9SGreg Clayton     }
307cac9c5f9SGreg Clayton     return 0;
308cac9c5f9SGreg Clayton }
309cac9c5f9SGreg Clayton 
310cac9c5f9SGreg Clayton SBSection
311cac9c5f9SGreg Clayton SBModule::GetSectionAtIndex (size_t idx)
312cac9c5f9SGreg Clayton {
313cac9c5f9SGreg Clayton     SBSection sb_section;
314cac9c5f9SGreg Clayton     if (m_opaque_sp)
315cac9c5f9SGreg Clayton     {
316cac9c5f9SGreg Clayton         ObjectFile *obj_file = m_opaque_sp->GetObjectFile();
317cac9c5f9SGreg Clayton         if (obj_file)
318cac9c5f9SGreg Clayton         {
319cac9c5f9SGreg Clayton             SectionList *section_list = obj_file->GetSectionList ();
320cac9c5f9SGreg Clayton 
321cac9c5f9SGreg Clayton             if (section_list)
322cac9c5f9SGreg Clayton                 sb_section.SetSection(section_list->GetSectionAtIndex (idx).get());
323cac9c5f9SGreg Clayton         }
324cac9c5f9SGreg Clayton     }
325cac9c5f9SGreg Clayton     return sb_section;
326cac9c5f9SGreg Clayton }
327cac9c5f9SGreg Clayton 
3285569e64eSGreg Clayton lldb::SBSymbolContextList
329fe356d35SGreg Clayton SBModule::FindFunctions (const char *name,
3305569e64eSGreg Clayton                          uint32_t name_type_mask)
331fe356d35SGreg Clayton {
3325569e64eSGreg Clayton     lldb::SBSymbolContextList sb_sc_list;
3334efffd9aSJohnny Chen     if (name && m_opaque_sp)
334fe356d35SGreg Clayton     {
3355569e64eSGreg Clayton         const bool append = true;
336fe356d35SGreg Clayton         const bool symbols_ok = true;
3379df05fbbSSean Callanan         const bool inlines_ok = true;
3385569e64eSGreg Clayton         m_opaque_sp->FindFunctions (ConstString(name),
339b6d70ebcSSean Callanan                                     NULL,
340fe356d35SGreg Clayton                                     name_type_mask,
341fe356d35SGreg Clayton                                     symbols_ok,
3429df05fbbSSean Callanan                                     inlines_ok,
343fe356d35SGreg Clayton                                     append,
3445569e64eSGreg Clayton                                     *sb_sc_list);
345fe356d35SGreg Clayton     }
3465569e64eSGreg Clayton     return sb_sc_list;
347fe356d35SGreg Clayton }
348fe356d35SGreg Clayton 
349dea8cb4fSGreg Clayton 
350dea8cb4fSGreg Clayton SBValueList
351dea8cb4fSGreg Clayton SBModule::FindGlobalVariables (SBTarget &target, const char *name, uint32_t max_matches)
352dea8cb4fSGreg Clayton {
353dea8cb4fSGreg Clayton     SBValueList sb_value_list;
3544efffd9aSJohnny Chen     if (name && m_opaque_sp)
355dea8cb4fSGreg Clayton     {
356dea8cb4fSGreg Clayton         VariableList variable_list;
357dea8cb4fSGreg Clayton         const uint32_t match_count = m_opaque_sp->FindGlobalVariables (ConstString (name),
358b6d70ebcSSean Callanan                                                                        NULL,
359dea8cb4fSGreg Clayton                                                                        false,
360dea8cb4fSGreg Clayton                                                                        max_matches,
361dea8cb4fSGreg Clayton                                                                        variable_list);
362dea8cb4fSGreg Clayton 
363dea8cb4fSGreg Clayton         if (match_count > 0)
364dea8cb4fSGreg Clayton         {
365dea8cb4fSGreg Clayton             ValueObjectList &value_object_list = sb_value_list.ref();
366dea8cb4fSGreg Clayton             for (uint32_t i=0; i<match_count; ++i)
367dea8cb4fSGreg Clayton             {
368dea8cb4fSGreg Clayton                 lldb::ValueObjectSP valobj_sp;
369b9556accSGreg Clayton                 TargetSP target_sp (target.GetSP());
370b9556accSGreg Clayton                 valobj_sp = ValueObjectVariable::Create (target_sp.get(), variable_list.GetVariableAtIndex(i));
371dea8cb4fSGreg Clayton                 if (valobj_sp)
372dea8cb4fSGreg Clayton                     value_object_list.Append(valobj_sp);
373dea8cb4fSGreg Clayton             }
374dea8cb4fSGreg Clayton         }
375dea8cb4fSGreg Clayton     }
376dea8cb4fSGreg Clayton 
377dea8cb4fSGreg Clayton     return sb_value_list;
378dea8cb4fSGreg Clayton }
3796f3533fbSEnrico Granata 
3806f3533fbSEnrico Granata lldb::SBType
3816f3533fbSEnrico Granata SBModule::FindFirstType (const char *name_cstr)
3826f3533fbSEnrico Granata {
383fe42ac4dSGreg Clayton     SBType sb_type;
3844efffd9aSJohnny Chen     if (name_cstr && IsValid())
385fe42ac4dSGreg Clayton     {
3866f3533fbSEnrico Granata         SymbolContext sc;
3876f3533fbSEnrico Granata         TypeList type_list;
3886f3533fbSEnrico Granata         uint32_t num_matches = 0;
3896f3533fbSEnrico Granata         ConstString name(name_cstr);
3906f3533fbSEnrico Granata 
3916f3533fbSEnrico Granata         num_matches = m_opaque_sp->FindTypes(sc,
3926f3533fbSEnrico Granata                                              name,
393b6d70ebcSSean Callanan                                              NULL,
3946f3533fbSEnrico Granata                                              false,
3956f3533fbSEnrico Granata                                              1,
3966f3533fbSEnrico Granata                                              type_list);
3976f3533fbSEnrico Granata 
3986f3533fbSEnrico Granata         if (num_matches)
399fe42ac4dSGreg Clayton             sb_type = lldb::SBType(type_list.GetTypeAtIndex(0));
4006f3533fbSEnrico Granata     }
401fe42ac4dSGreg Clayton     return sb_type;
4026f3533fbSEnrico Granata }
4036f3533fbSEnrico Granata 
4046f3533fbSEnrico Granata lldb::SBTypeList
4056f3533fbSEnrico Granata SBModule::FindTypes (const char *type)
4066f3533fbSEnrico Granata {
4076f3533fbSEnrico Granata 
4086f3533fbSEnrico Granata     SBTypeList retval;
4096f3533fbSEnrico Granata 
4104efffd9aSJohnny Chen     if (type && IsValid())
411fe42ac4dSGreg Clayton     {
4126f3533fbSEnrico Granata         SymbolContext sc;
4136f3533fbSEnrico Granata         TypeList type_list;
4146f3533fbSEnrico Granata         uint32_t num_matches = 0;
4156f3533fbSEnrico Granata         ConstString name(type);
4166f3533fbSEnrico Granata 
4176f3533fbSEnrico Granata         num_matches = m_opaque_sp->FindTypes(sc,
4186f3533fbSEnrico Granata                                              name,
419b6d70ebcSSean Callanan                                              NULL,
4206f3533fbSEnrico Granata                                              false,
4216f3533fbSEnrico Granata                                              UINT32_MAX,
4226f3533fbSEnrico Granata                                              type_list);
4236f3533fbSEnrico Granata 
4246f3533fbSEnrico Granata         for (size_t idx = 0; idx < num_matches; idx++)
4256f3533fbSEnrico Granata         {
426fe42ac4dSGreg Clayton             TypeSP type_sp (type_list.GetTypeAtIndex(idx));
427fe42ac4dSGreg Clayton             if (type_sp)
428fe42ac4dSGreg Clayton                 retval.Append(SBType(type_sp));
429fe42ac4dSGreg Clayton         }
4306f3533fbSEnrico Granata     }
4316f3533fbSEnrico Granata 
4326f3533fbSEnrico Granata     return retval;
4336f3533fbSEnrico Granata }
434cac9c5f9SGreg Clayton 
435cac9c5f9SGreg Clayton 
436cac9c5f9SGreg Clayton SBSection
437cac9c5f9SGreg Clayton SBModule::FindSection (const char *sect_name)
438cac9c5f9SGreg Clayton {
439cac9c5f9SGreg Clayton     SBSection sb_section;
440cac9c5f9SGreg Clayton 
4414efffd9aSJohnny Chen     if (sect_name && IsValid())
442cac9c5f9SGreg Clayton     {
443cac9c5f9SGreg Clayton         ObjectFile *objfile = m_opaque_sp->GetObjectFile();
444cac9c5f9SGreg Clayton         if (objfile)
445cac9c5f9SGreg Clayton         {
446cac9c5f9SGreg Clayton             SectionList *section_list = objfile->GetSectionList();
447cac9c5f9SGreg Clayton             if (section_list)
448cac9c5f9SGreg Clayton             {
449cac9c5f9SGreg Clayton                 ConstString const_sect_name(sect_name);
450cac9c5f9SGreg Clayton                 SectionSP section_sp (section_list->FindSectionByName(const_sect_name));
451cac9c5f9SGreg Clayton                 if (section_sp)
452cac9c5f9SGreg Clayton                 {
453cac9c5f9SGreg Clayton                     sb_section.SetSection(section_sp.get());
454cac9c5f9SGreg Clayton                 }
455cac9c5f9SGreg Clayton             }
456cac9c5f9SGreg Clayton         }
457cac9c5f9SGreg Clayton     }
458cac9c5f9SGreg Clayton     return sb_section;
459cac9c5f9SGreg Clayton }
460cac9c5f9SGreg Clayton 
46113d1950aSGreg Clayton lldb::ByteOrder
46213d1950aSGreg Clayton SBModule::GetByteOrder ()
46313d1950aSGreg Clayton {
46413d1950aSGreg Clayton     if (m_opaque_sp)
46513d1950aSGreg Clayton         return m_opaque_sp->GetArchitecture().GetByteOrder();
46613d1950aSGreg Clayton     return eByteOrderInvalid;
46713d1950aSGreg Clayton }
46813d1950aSGreg Clayton 
46913d1950aSGreg Clayton const char *
47013d1950aSGreg Clayton SBModule::GetTriple ()
47113d1950aSGreg Clayton {
47213d1950aSGreg Clayton     if (m_opaque_sp)
47313d1950aSGreg Clayton     {
47413d1950aSGreg Clayton         std::string triple (m_opaque_sp->GetArchitecture().GetTriple().str());
47513d1950aSGreg Clayton         // Unique the string so we don't run into ownership issues since
47613d1950aSGreg Clayton         // the const strings put the string into the string pool once and
47713d1950aSGreg Clayton         // the strings never comes out
47813d1950aSGreg Clayton         ConstString const_triple (triple.c_str());
47913d1950aSGreg Clayton         return const_triple.GetCString();
48013d1950aSGreg Clayton     }
48113d1950aSGreg Clayton     return NULL;
48213d1950aSGreg Clayton }
48313d1950aSGreg Clayton 
48413d1950aSGreg Clayton uint32_t
48513d1950aSGreg Clayton SBModule::GetAddressByteSize()
48613d1950aSGreg Clayton {
48713d1950aSGreg Clayton     if (m_opaque_sp)
48813d1950aSGreg Clayton         return m_opaque_sp->GetArchitecture().GetAddressByteSize();
48913d1950aSGreg Clayton     return sizeof(void*);
49013d1950aSGreg Clayton }
49113d1950aSGreg Clayton 
492