SBModule.cpp revision 3508c387c3f0c9ecc439d98048fd7694d41bab1b
1//===-- SBModule.cpp --------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/API/SBModule.h"
11#include "lldb/API/SBAddress.h"
12#include "lldb/API/SBFileSpec.h"
13#include "lldb/API/SBProcess.h"
14#include "lldb/API/SBStream.h"
15#include "lldb/API/SBSymbolContextList.h"
16#include "lldb/Core/Module.h"
17#include "lldb/Core/Log.h"
18#include "lldb/Core/StreamString.h"
19#include "lldb/Core/ValueObjectList.h"
20#include "lldb/Core/ValueObjectVariable.h"
21#include "lldb/Symbol/SymbolVendor.h"
22#include "lldb/Symbol/VariableList.h"
23#include "lldb/Target/Target.h"
24
25using namespace lldb;
26using namespace lldb_private;
27
28
29SBModule::SBModule () :
30    m_opaque_sp ()
31{
32}
33
34SBModule::SBModule (const lldb::ModuleSP& module_sp) :
35    m_opaque_sp (module_sp)
36{
37}
38
39SBModule::SBModule(const SBModule &rhs) :
40    m_opaque_sp (rhs.m_opaque_sp)
41{
42}
43
44SBModule::SBModule (lldb::SBProcess &process, lldb::addr_t header_addr) :
45    m_opaque_sp ()
46{
47    ProcessSP process_sp (process.GetSP());
48    if (process_sp)
49    {
50        const bool add_image_to_target = true;
51        const bool load_image_sections_in_target = true;
52        m_opaque_sp = process_sp->ReadModuleFromMemory (FileSpec(),
53                                                        header_addr,
54                                                        add_image_to_target,
55                                                        load_image_sections_in_target);
56    }
57}
58
59const SBModule &
60SBModule::operator = (const SBModule &rhs)
61{
62    if (this != &rhs)
63        m_opaque_sp = rhs.m_opaque_sp;
64    return *this;
65}
66
67SBModule::~SBModule ()
68{
69}
70
71bool
72SBModule::IsValid () const
73{
74    return m_opaque_sp.get() != NULL;
75}
76
77void
78SBModule::Clear()
79{
80    m_opaque_sp.reset();
81}
82
83SBFileSpec
84SBModule::GetFileSpec () const
85{
86    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
87
88    SBFileSpec file_spec;
89    ModuleSP module_sp (GetSP ());
90    if (module_sp)
91        file_spec.SetFileSpec(module_sp->GetFileSpec());
92
93    if (log)
94    {
95        log->Printf ("SBModule(%p)::GetFileSpec () => SBFileSpec(%p)",
96        module_sp.get(), file_spec.get());
97    }
98
99    return file_spec;
100}
101
102lldb::SBFileSpec
103SBModule::GetPlatformFileSpec () const
104{
105    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
106
107    SBFileSpec file_spec;
108    ModuleSP module_sp (GetSP ());
109    if (module_sp)
110        file_spec.SetFileSpec(module_sp->GetPlatformFileSpec());
111
112    if (log)
113    {
114        log->Printf ("SBModule(%p)::GetPlatformFileSpec () => SBFileSpec(%p)",
115                     module_sp.get(), file_spec.get());
116    }
117
118    return file_spec;
119
120}
121
122bool
123SBModule::SetPlatformFileSpec (const lldb::SBFileSpec &platform_file)
124{
125    bool result = false;
126    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
127
128    ModuleSP module_sp (GetSP ());
129    if (module_sp)
130    {
131        module_sp->SetPlatformFileSpec(*platform_file);
132        result = true;
133    }
134
135    if (log)
136    {
137        log->Printf ("SBModule(%p)::SetPlatformFileSpec (SBFileSpec(%p (%s%s%s)) => %i",
138                     module_sp.get(),
139                     platform_file.get(),
140                     platform_file->GetDirectory().GetCString(),
141                     platform_file->GetDirectory() ? "/" : "",
142                     platform_file->GetFilename().GetCString(),
143                     result);
144    }
145    return result;
146}
147
148
149
150const uint8_t *
151SBModule::GetUUIDBytes () const
152{
153    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
154
155    const uint8_t *uuid_bytes = NULL;
156    ModuleSP module_sp (GetSP ());
157    if (module_sp)
158        uuid_bytes = (const uint8_t *)module_sp->GetUUID().GetBytes();
159
160    if (log)
161    {
162        if (uuid_bytes)
163        {
164            StreamString s;
165            module_sp->GetUUID().Dump (&s);
166            log->Printf ("SBModule(%p)::GetUUIDBytes () => %s", module_sp.get(), s.GetData());
167        }
168        else
169            log->Printf ("SBModule(%p)::GetUUIDBytes () => NULL", module_sp.get());
170    }
171    return uuid_bytes;
172}
173
174
175const char *
176SBModule::GetUUIDString () const
177{
178    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
179
180    static char uuid_string[80];
181    const char * uuid_c_string = NULL;
182    ModuleSP module_sp (GetSP ());
183    if (module_sp)
184        uuid_c_string = (const char *)module_sp->GetUUID().GetAsCString(uuid_string, sizeof(uuid_string));
185
186    if (log)
187    {
188        if (uuid_c_string)
189        {
190            StreamString s;
191            module_sp->GetUUID().Dump (&s);
192            log->Printf ("SBModule(%p)::GetUUIDString () => %s", module_sp.get(), s.GetData());
193        }
194        else
195            log->Printf ("SBModule(%p)::GetUUIDString () => NULL", module_sp.get());
196    }
197    return uuid_c_string;
198}
199
200
201bool
202SBModule::operator == (const SBModule &rhs) const
203{
204    if (m_opaque_sp)
205        return m_opaque_sp.get() == rhs.m_opaque_sp.get();
206    return false;
207}
208
209bool
210SBModule::operator != (const SBModule &rhs) const
211{
212    if (m_opaque_sp)
213        return m_opaque_sp.get() != rhs.m_opaque_sp.get();
214    return false;
215}
216
217ModuleSP
218SBModule::GetSP () const
219{
220    return m_opaque_sp;
221}
222
223void
224SBModule::SetSP (const ModuleSP &module_sp)
225{
226    m_opaque_sp = module_sp;
227}
228
229SBAddress
230SBModule::ResolveFileAddress (lldb::addr_t vm_addr)
231{
232    lldb::SBAddress sb_addr;
233    ModuleSP module_sp (GetSP ());
234    if (module_sp)
235    {
236        Address addr;
237        if (module_sp->ResolveFileAddress (vm_addr, addr))
238            sb_addr.ref() = addr;
239    }
240    return sb_addr;
241}
242
243SBSymbolContext
244SBModule::ResolveSymbolContextForAddress (const SBAddress& addr, uint32_t resolve_scope)
245{
246    SBSymbolContext sb_sc;
247    ModuleSP module_sp (GetSP ());
248    if (module_sp && addr.IsValid())
249        module_sp->ResolveSymbolContextForAddress (addr.ref(), resolve_scope, *sb_sc);
250    return sb_sc;
251}
252
253bool
254SBModule::GetDescription (SBStream &description)
255{
256    Stream &strm = description.ref();
257
258    ModuleSP module_sp (GetSP ());
259    if (module_sp)
260    {
261        module_sp->GetDescription (&strm);
262    }
263    else
264        strm.PutCString ("No value");
265
266    return true;
267}
268
269size_t
270SBModule::GetNumSymbols ()
271{
272    ModuleSP module_sp (GetSP ());
273    if (module_sp)
274    {
275        ObjectFile *obj_file = module_sp->GetObjectFile();
276        if (obj_file)
277        {
278            Symtab *symtab = obj_file->GetSymtab();
279            if (symtab)
280                return symtab->GetNumSymbols();
281        }
282    }
283    return 0;
284}
285
286SBSymbol
287SBModule::GetSymbolAtIndex (size_t idx)
288{
289    SBSymbol sb_symbol;
290    ModuleSP module_sp (GetSP ());
291    if (module_sp)
292    {
293        ObjectFile *obj_file = module_sp->GetObjectFile();
294        if (obj_file)
295        {
296            Symtab *symtab = obj_file->GetSymtab();
297            if (symtab)
298                sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx));
299        }
300    }
301    return sb_symbol;
302}
303
304size_t
305SBModule::GetNumSections ()
306{
307    ModuleSP module_sp (GetSP ());
308    if (module_sp)
309    {
310        ObjectFile *obj_file = module_sp->GetObjectFile();
311        if (obj_file)
312        {
313            SectionList *section_list = obj_file->GetSectionList ();
314            if (section_list)
315                return section_list->GetSize();
316        }
317    }
318    return 0;
319}
320
321SBSection
322SBModule::GetSectionAtIndex (size_t idx)
323{
324    SBSection sb_section;
325    ModuleSP module_sp (GetSP ());
326    if (module_sp)
327    {
328        ObjectFile *obj_file = module_sp->GetObjectFile();
329        if (obj_file)
330        {
331            SectionList *section_list = obj_file->GetSectionList ();
332
333            if (section_list)
334                sb_section.SetSP(section_list->GetSectionAtIndex (idx));
335        }
336    }
337    return sb_section;
338}
339
340lldb::SBSymbolContextList
341SBModule::FindFunctions (const char *name,
342                         uint32_t name_type_mask)
343{
344    lldb::SBSymbolContextList sb_sc_list;
345    ModuleSP module_sp (GetSP ());
346    if (name && module_sp)
347    {
348        const bool append = true;
349        const bool symbols_ok = true;
350        const bool inlines_ok = true;
351        module_sp->FindFunctions (ConstString(name),
352                                  NULL,
353                                  name_type_mask,
354                                  symbols_ok,
355                                  inlines_ok,
356                                  append,
357                                  *sb_sc_list);
358    }
359    return sb_sc_list;
360}
361
362
363SBValueList
364SBModule::FindGlobalVariables (SBTarget &target, const char *name, uint32_t max_matches)
365{
366    SBValueList sb_value_list;
367    ModuleSP module_sp (GetSP ());
368    if (name && module_sp)
369    {
370        VariableList variable_list;
371        const uint32_t match_count = module_sp->FindGlobalVariables (ConstString (name),
372                                                                     NULL,
373                                                                     false,
374                                                                     max_matches,
375                                                                     variable_list);
376
377        if (match_count > 0)
378        {
379            ValueObjectList &value_object_list = sb_value_list.ref();
380            for (uint32_t i=0; i<match_count; ++i)
381            {
382                lldb::ValueObjectSP valobj_sp;
383                TargetSP target_sp (target.GetSP());
384                valobj_sp = ValueObjectVariable::Create (target_sp.get(), variable_list.GetVariableAtIndex(i));
385                if (valobj_sp)
386                    value_object_list.Append(valobj_sp);
387            }
388        }
389    }
390
391    return sb_value_list;
392}
393
394lldb::SBType
395SBModule::FindFirstType (const char *name_cstr)
396{
397    SBType sb_type;
398    ModuleSP module_sp (GetSP ());
399    if (name_cstr && module_sp)
400    {
401        SymbolContext sc;
402        TypeList type_list;
403        uint32_t num_matches = 0;
404        ConstString name(name_cstr);
405
406        num_matches = module_sp->FindTypes (sc,
407                                            name,
408                                            NULL,
409                                            false,
410                                            1,
411                                            type_list);
412
413        if (num_matches)
414            sb_type = lldb::SBType(type_list.GetTypeAtIndex(0));
415    }
416    return sb_type;
417}
418
419lldb::SBTypeList
420SBModule::FindTypes (const char *type)
421{
422
423    SBTypeList retval;
424
425    ModuleSP module_sp (GetSP ());
426    if (type && module_sp)
427    {
428        SymbolContext sc;
429        TypeList type_list;
430        uint32_t num_matches = 0;
431        ConstString name(type);
432
433        num_matches = module_sp->FindTypes (sc,
434                                            name,
435                                            NULL,
436                                            false,
437                                            UINT32_MAX,
438                                            type_list);
439
440        for (size_t idx = 0; idx < num_matches; idx++)
441        {
442            TypeSP type_sp (type_list.GetTypeAtIndex(idx));
443            if (type_sp)
444                retval.Append(SBType(type_sp));
445        }
446    }
447
448    return retval;
449}
450
451
452SBSection
453SBModule::FindSection (const char *sect_name)
454{
455    SBSection sb_section;
456
457    ModuleSP module_sp (GetSP ());
458    if (sect_name && module_sp)
459    {
460        ObjectFile *objfile = module_sp->GetObjectFile();
461        if (objfile)
462        {
463            SectionList *section_list = objfile->GetSectionList();
464            if (section_list)
465            {
466                ConstString const_sect_name(sect_name);
467                SectionSP section_sp (section_list->FindSectionByName(const_sect_name));
468                if (section_sp)
469                {
470                    sb_section.SetSP (section_sp);
471                }
472            }
473        }
474    }
475    return sb_section;
476}
477
478lldb::ByteOrder
479SBModule::GetByteOrder ()
480{
481    ModuleSP module_sp (GetSP ());
482    if (module_sp)
483        return module_sp->GetArchitecture().GetByteOrder();
484    return eByteOrderInvalid;
485}
486
487const char *
488SBModule::GetTriple ()
489{
490    ModuleSP module_sp (GetSP ());
491    if (module_sp)
492    {
493        std::string triple (module_sp->GetArchitecture().GetTriple().str());
494        // Unique the string so we don't run into ownership issues since
495        // the const strings put the string into the string pool once and
496        // the strings never comes out
497        ConstString const_triple (triple.c_str());
498        return const_triple.GetCString();
499    }
500    return NULL;
501}
502
503uint32_t
504SBModule::GetAddressByteSize()
505{
506    ModuleSP module_sp (GetSP ());
507    if (module_sp)
508        return module_sp->GetArchitecture().GetAddressByteSize();
509    return sizeof(void*);
510}
511
512
513uint32_t
514SBModule::GetVersion (uint32_t *versions, uint32_t num_versions)
515{
516    ModuleSP module_sp (GetSP ());
517    if (module_sp)
518    {
519        ObjectFile *obj_file = module_sp->GetObjectFile();
520        if (obj_file)
521            return obj_file->GetVersion (versions, num_versions);
522    }
523
524    if (versions && num_versions)
525    {
526        for (uint32_t i=0; i<num_versions; ++i)
527            versions[i] = UINT32_MAX;
528    }
529    return 0;
530}
531
532