Module.cpp revision 1b97a65e6ad77d797316a2f4b0aa3a1a793ec36f
1//===-- Module.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/Core/Module.h"
11#include "lldb/Core/DataBuffer.h"
12#include "lldb/Core/DataBufferHeap.h"
13#include "lldb/Core/Log.h"
14#include "lldb/Core/ModuleList.h"
15#include "lldb/Core/ModuleSpec.h"
16#include "lldb/Core/RegularExpression.h"
17#include "lldb/Core/Section.h"
18#include "lldb/Core/StreamString.h"
19#include "lldb/Core/Timer.h"
20#include "lldb/Host/Host.h"
21#include "lldb/lldb-private-log.h"
22#include "lldb/Symbol/CompileUnit.h"
23#include "lldb/Symbol/ObjectFile.h"
24#include "lldb/Symbol/SymbolContext.h"
25#include "lldb/Symbol/SymbolVendor.h"
26#include "lldb/Target/Process.h"
27#include "lldb/Target/Target.h"
28
29using namespace lldb;
30using namespace lldb_private;
31
32// Shared pointers to modules track module lifetimes in
33// targets and in the global module, but this collection
34// will track all module objects that are still alive
35typedef std::vector<Module *> ModuleCollection;
36
37static ModuleCollection &
38GetModuleCollection()
39{
40    // This module collection needs to live past any module, so we could either make it a
41    // shared pointer in each module or just leak is.  Since it is only an empty vector by
42    // the time all the modules have gone away, we just leak it for now.  If we decide this
43    // is a big problem we can introduce a Finalize method that will tear everything down in
44    // a predictable order.
45
46    static ModuleCollection *g_module_collection = NULL;
47    if (g_module_collection == NULL)
48        g_module_collection = new ModuleCollection();
49
50    return *g_module_collection;
51}
52
53Mutex *
54Module::GetAllocationModuleCollectionMutex()
55{
56    // NOTE: The mutex below must be leaked since the global module list in
57    // the ModuleList class will get torn at some point, and we can't know
58    // if it will tear itself down before the "g_module_collection_mutex" below
59    // will. So we leak a Mutex object below to safeguard against that
60
61    static Mutex *g_module_collection_mutex = NULL;
62    if (g_module_collection_mutex == NULL)
63        g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
64    return g_module_collection_mutex;
65}
66
67size_t
68Module::GetNumberAllocatedModules ()
69{
70    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
71    return GetModuleCollection().size();
72}
73
74Module *
75Module::GetAllocatedModuleAtIndex (size_t idx)
76{
77    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
78    ModuleCollection &modules = GetModuleCollection();
79    if (idx < modules.size())
80        return modules[idx];
81    return NULL;
82}
83#if 0
84
85// These functions help us to determine if modules are still loaded, yet don't require that
86// you have a command interpreter and can easily be called from an external debugger.
87namespace lldb {
88
89    void
90    ClearModuleInfo (void)
91    {
92        const bool mandatory = true;
93        ModuleList::RemoveOrphanSharedModules(mandatory);
94    }
95
96    void
97    DumpModuleInfo (void)
98    {
99        Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
100        ModuleCollection &modules = GetModuleCollection();
101        const size_t count = modules.size();
102        printf ("%s: %llu modules:\n", __PRETTY_FUNCTION__, (uint64_t)count);
103        for (size_t i=0; i<count; ++i)
104        {
105
106            StreamString strm;
107            Module *module = modules[i];
108            const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
109            module->GetDescription(&strm, eDescriptionLevelFull);
110            printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
111                    module,
112                    in_shared_module_list,
113                    (uint32_t)module->use_count(),
114                    strm.GetString().c_str());
115        }
116    }
117}
118
119#endif
120
121Module::Module (const ModuleSpec &module_spec) :
122    m_mutex (Mutex::eMutexTypeRecursive),
123    m_mod_time (module_spec.GetFileSpec().GetModificationTime()),
124    m_arch (module_spec.GetArchitecture()),
125    m_uuid (),
126    m_file (module_spec.GetFileSpec()),
127    m_platform_file(module_spec.GetPlatformFileSpec()),
128    m_symfile_spec (module_spec.GetSymbolFileSpec()),
129    m_object_name (module_spec.GetObjectName()),
130    m_object_offset (module_spec.GetObjectOffset()),
131    m_objfile_sp (),
132    m_symfile_ap (),
133    m_ast (),
134    m_source_mappings (),
135    m_did_load_objfile (false),
136    m_did_load_symbol_vendor (false),
137    m_did_parse_uuid (false),
138    m_did_init_ast (false),
139    m_is_dynamic_loader_module (false),
140    m_file_has_changed (false),
141    m_first_file_changed_log (false)
142{
143    // Scope for locker below...
144    {
145        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
146        GetModuleCollection().push_back(this);
147    }
148
149    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
150    if (log)
151        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
152                     this,
153                     m_arch.GetArchitectureName(),
154                     m_file.GetDirectory().AsCString(""),
155                     m_file.GetFilename().AsCString(""),
156                     m_object_name.IsEmpty() ? "" : "(",
157                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
158                     m_object_name.IsEmpty() ? "" : ")");
159}
160
161Module::Module(const FileSpec& file_spec,
162               const ArchSpec& arch,
163               const ConstString *object_name,
164               off_t object_offset) :
165    m_mutex (Mutex::eMutexTypeRecursive),
166    m_mod_time (file_spec.GetModificationTime()),
167    m_arch (arch),
168    m_uuid (),
169    m_file (file_spec),
170    m_platform_file(),
171    m_symfile_spec (),
172    m_object_name (),
173    m_object_offset (object_offset),
174    m_objfile_sp (),
175    m_symfile_ap (),
176    m_ast (),
177    m_source_mappings (),
178    m_did_load_objfile (false),
179    m_did_load_symbol_vendor (false),
180    m_did_parse_uuid (false),
181    m_did_init_ast (false),
182    m_is_dynamic_loader_module (false),
183    m_file_has_changed (false),
184    m_first_file_changed_log (false)
185{
186    // Scope for locker below...
187    {
188        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
189        GetModuleCollection().push_back(this);
190    }
191
192    if (object_name)
193        m_object_name = *object_name;
194    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
195    if (log)
196        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
197                     this,
198                     m_arch.GetArchitectureName(),
199                     m_file.GetDirectory().AsCString(""),
200                     m_file.GetFilename().AsCString(""),
201                     m_object_name.IsEmpty() ? "" : "(",
202                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
203                     m_object_name.IsEmpty() ? "" : ")");
204}
205
206Module::~Module()
207{
208    // Scope for locker below...
209    {
210        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
211        ModuleCollection &modules = GetModuleCollection();
212        ModuleCollection::iterator end = modules.end();
213        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
214        assert (pos != end);
215        modules.erase(pos);
216    }
217    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
218    if (log)
219        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
220                     this,
221                     m_arch.GetArchitectureName(),
222                     m_file.GetDirectory().AsCString(""),
223                     m_file.GetFilename().AsCString(""),
224                     m_object_name.IsEmpty() ? "" : "(",
225                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
226                     m_object_name.IsEmpty() ? "" : ")");
227    // Release any auto pointers before we start tearing down our member
228    // variables since the object file and symbol files might need to make
229    // function calls back into this module object. The ordering is important
230    // here because symbol files can require the module object file. So we tear
231    // down the symbol file first, then the object file.
232    m_symfile_ap.reset();
233    m_objfile_sp.reset();
234}
235
236ObjectFile *
237Module::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error)
238{
239    if (m_objfile_sp)
240    {
241        error.SetErrorString ("object file already exists");
242    }
243    else
244    {
245        Mutex::Locker locker (m_mutex);
246        if (process_sp)
247        {
248            m_did_load_objfile = true;
249            std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0));
250            Error readmem_error;
251            const size_t bytes_read = process_sp->ReadMemory (header_addr,
252                                                              data_ap->GetBytes(),
253                                                              data_ap->GetByteSize(),
254                                                              readmem_error);
255            if (bytes_read == 512)
256            {
257                DataBufferSP data_sp(data_ap.release());
258                m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp);
259                if (m_objfile_sp)
260                {
261                    StreamString s;
262                    s.Printf("0x%16.16llx", header_addr);
263                    m_object_name.SetCString (s.GetData());
264
265                    // Once we get the object file, update our module with the object file's
266                    // architecture since it might differ in vendor/os if some parts were
267                    // unknown.
268                    m_objfile_sp->GetArchitecture (m_arch);
269                }
270                else
271                {
272                    error.SetErrorString ("unable to find suitable object file plug-in");
273                }
274            }
275            else
276            {
277                error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString());
278            }
279        }
280        else
281        {
282            error.SetErrorString ("invalid process");
283        }
284    }
285    return m_objfile_sp.get();
286}
287
288
289const lldb_private::UUID&
290Module::GetUUID()
291{
292    Mutex::Locker locker (m_mutex);
293    if (m_did_parse_uuid == false)
294    {
295        ObjectFile * obj_file = GetObjectFile ();
296
297        if (obj_file != NULL)
298        {
299            obj_file->GetUUID(&m_uuid);
300            m_did_parse_uuid = true;
301        }
302    }
303    return m_uuid;
304}
305
306ClangASTContext &
307Module::GetClangASTContext ()
308{
309    Mutex::Locker locker (m_mutex);
310    if (m_did_init_ast == false)
311    {
312        ObjectFile * objfile = GetObjectFile();
313        ArchSpec object_arch;
314        if (objfile && objfile->GetArchitecture(object_arch))
315        {
316            m_did_init_ast = true;
317
318            // LLVM wants this to be set to iOS or MacOSX; if we're working on
319            // a bare-boards type image, change the triple for llvm's benefit.
320            if (object_arch.GetTriple().getVendor() == llvm::Triple::Apple
321                && object_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
322            {
323                if (object_arch.GetTriple().getArch() == llvm::Triple::arm ||
324                    object_arch.GetTriple().getArch() == llvm::Triple::thumb)
325                {
326                    object_arch.GetTriple().setOS(llvm::Triple::IOS);
327                }
328                else
329                {
330                    object_arch.GetTriple().setOS(llvm::Triple::MacOSX);
331                }
332            }
333            m_ast.SetArchitecture (object_arch);
334        }
335    }
336    return m_ast;
337}
338
339void
340Module::ParseAllDebugSymbols()
341{
342    Mutex::Locker locker (m_mutex);
343    uint32_t num_comp_units = GetNumCompileUnits();
344    if (num_comp_units == 0)
345        return;
346
347    SymbolContext sc;
348    sc.module_sp = shared_from_this();
349    uint32_t cu_idx;
350    SymbolVendor *symbols = GetSymbolVendor ();
351
352    for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
353    {
354        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
355        if (sc.comp_unit)
356        {
357            sc.function = NULL;
358            symbols->ParseVariablesForContext(sc);
359
360            symbols->ParseCompileUnitFunctions(sc);
361
362            uint32_t func_idx;
363            for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
364            {
365                symbols->ParseFunctionBlocks(sc);
366
367                // Parse the variables for this function and all its blocks
368                symbols->ParseVariablesForContext(sc);
369            }
370
371
372            // Parse all types for this compile unit
373            sc.function = NULL;
374            symbols->ParseTypes(sc);
375        }
376    }
377}
378
379void
380Module::CalculateSymbolContext(SymbolContext* sc)
381{
382    sc->module_sp = shared_from_this();
383}
384
385ModuleSP
386Module::CalculateSymbolContextModule ()
387{
388    return shared_from_this();
389}
390
391void
392Module::DumpSymbolContext(Stream *s)
393{
394    s->Printf(", Module{%p}", this);
395}
396
397uint32_t
398Module::GetNumCompileUnits()
399{
400    Mutex::Locker locker (m_mutex);
401    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
402    SymbolVendor *symbols = GetSymbolVendor ();
403    if (symbols)
404        return symbols->GetNumCompileUnits();
405    return 0;
406}
407
408CompUnitSP
409Module::GetCompileUnitAtIndex (uint32_t index)
410{
411    Mutex::Locker locker (m_mutex);
412    uint32_t num_comp_units = GetNumCompileUnits ();
413    CompUnitSP cu_sp;
414
415    if (index < num_comp_units)
416    {
417        SymbolVendor *symbols = GetSymbolVendor ();
418        if (symbols)
419            cu_sp = symbols->GetCompileUnitAtIndex(index);
420    }
421    return cu_sp;
422}
423
424bool
425Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
426{
427    Mutex::Locker locker (m_mutex);
428    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
429    ObjectFile* ofile = GetObjectFile();
430    if (ofile)
431        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
432    return false;
433}
434
435uint32_t
436Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
437{
438    Mutex::Locker locker (m_mutex);
439    uint32_t resolved_flags = 0;
440
441    // Clear the result symbol context in case we don't find anything
442    sc.Clear();
443
444    // Get the section from the section/offset address.
445    SectionSP section_sp (so_addr.GetSection());
446
447    // Make sure the section matches this module before we try and match anything
448    if (section_sp && section_sp->GetModule().get() == this)
449    {
450        // If the section offset based address resolved itself, then this
451        // is the right module.
452        sc.module_sp = shared_from_this();
453        resolved_flags |= eSymbolContextModule;
454
455        // Resolve the compile unit, function, block, line table or line
456        // entry if requested.
457        if (resolve_scope & eSymbolContextCompUnit    ||
458            resolve_scope & eSymbolContextFunction    ||
459            resolve_scope & eSymbolContextBlock       ||
460            resolve_scope & eSymbolContextLineEntry   )
461        {
462            SymbolVendor *symbols = GetSymbolVendor ();
463            if (symbols)
464                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
465        }
466
467        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
468        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
469        {
470            ObjectFile* ofile = GetObjectFile();
471            if (ofile)
472            {
473                Symtab *symtab = ofile->GetSymtab();
474                if (symtab)
475                {
476                    if (so_addr.IsSectionOffset())
477                    {
478                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
479                        if (sc.symbol)
480                            resolved_flags |= eSymbolContextSymbol;
481                    }
482                }
483            }
484        }
485    }
486    return resolved_flags;
487}
488
489uint32_t
490Module::ResolveSymbolContextForFilePath
491(
492    const char *file_path,
493    uint32_t line,
494    bool check_inlines,
495    uint32_t resolve_scope,
496    SymbolContextList& sc_list
497)
498{
499    FileSpec file_spec(file_path, false);
500    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
501}
502
503uint32_t
504Module::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
505{
506    Mutex::Locker locker (m_mutex);
507    Timer scoped_timer(__PRETTY_FUNCTION__,
508                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
509                       file_spec.GetDirectory().AsCString(""),
510                       file_spec.GetDirectory() ? "/" : "",
511                       file_spec.GetFilename().AsCString(""),
512                       line,
513                       check_inlines ? "yes" : "no",
514                       resolve_scope);
515
516    const uint32_t initial_count = sc_list.GetSize();
517
518    SymbolVendor *symbols = GetSymbolVendor  ();
519    if (symbols)
520        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
521
522    return sc_list.GetSize() - initial_count;
523}
524
525
526uint32_t
527Module::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
528{
529    SymbolVendor *symbols = GetSymbolVendor ();
530    if (symbols)
531        return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
532    return 0;
533}
534uint32_t
535Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
536{
537    SymbolVendor *symbols = GetSymbolVendor ();
538    if (symbols)
539        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
540    return 0;
541}
542
543uint32_t
544Module::FindCompileUnits (const FileSpec &path,
545                          bool append,
546                          SymbolContextList &sc_list)
547{
548    if (!append)
549        sc_list.Clear();
550
551    const uint32_t start_size = sc_list.GetSize();
552    const uint32_t num_compile_units = GetNumCompileUnits();
553    SymbolContext sc;
554    sc.module_sp = shared_from_this();
555    const bool compare_directory = path.GetDirectory();
556    for (uint32_t i=0; i<num_compile_units; ++i)
557    {
558        sc.comp_unit = GetCompileUnitAtIndex(i).get();
559        if (sc.comp_unit)
560        {
561            if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
562                sc_list.Append(sc);
563        }
564    }
565    return sc_list.GetSize() - start_size;
566}
567
568uint32_t
569Module::FindFunctions (const ConstString &name,
570                       const ClangNamespaceDecl *namespace_decl,
571                       uint32_t name_type_mask,
572                       bool include_symbols,
573                       bool include_inlines,
574                       bool append,
575                       SymbolContextList& sc_list)
576{
577    if (!append)
578        sc_list.Clear();
579
580    const uint32_t start_size = sc_list.GetSize();
581
582    // Find all the functions (not symbols, but debug information functions...
583    SymbolVendor *symbols = GetSymbolVendor ();
584    if (symbols)
585        symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
586
587    // Now check our symbol table for symbols that are code symbols if requested
588    if (include_symbols)
589    {
590        ObjectFile *objfile = GetObjectFile();
591        if (objfile)
592        {
593            Symtab *symtab = objfile->GetSymtab();
594            if (symtab)
595            {
596                std::vector<uint32_t> symbol_indexes;
597                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
598                const uint32_t num_matches = symbol_indexes.size();
599                if (num_matches)
600                {
601                    const bool merge_symbol_into_function = true;
602                    SymbolContext sc(this);
603                    for (uint32_t i=0; i<num_matches; i++)
604                    {
605                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
606                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
607                    }
608                }
609            }
610        }
611    }
612    return sc_list.GetSize() - start_size;
613}
614
615uint32_t
616Module::FindFunctions (const RegularExpression& regex,
617                       bool include_symbols,
618                       bool include_inlines,
619                       bool append,
620                       SymbolContextList& sc_list)
621{
622    if (!append)
623        sc_list.Clear();
624
625    const uint32_t start_size = sc_list.GetSize();
626
627    SymbolVendor *symbols = GetSymbolVendor ();
628    if (symbols)
629        symbols->FindFunctions(regex, include_inlines, append, sc_list);
630    // Now check our symbol table for symbols that are code symbols if requested
631    if (include_symbols)
632    {
633        ObjectFile *objfile = GetObjectFile();
634        if (objfile)
635        {
636            Symtab *symtab = objfile->GetSymtab();
637            if (symtab)
638            {
639                std::vector<uint32_t> symbol_indexes;
640                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
641                const uint32_t num_matches = symbol_indexes.size();
642                if (num_matches)
643                {
644                    const bool merge_symbol_into_function = true;
645                    SymbolContext sc(this);
646                    for (uint32_t i=0; i<num_matches; i++)
647                    {
648                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
649                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
650                    }
651                }
652            }
653        }
654    }
655    return sc_list.GetSize() - start_size;
656}
657
658uint32_t
659Module::FindTypes_Impl (const SymbolContext& sc,
660                        const ConstString &name,
661                        const ClangNamespaceDecl *namespace_decl,
662                        bool append,
663                        uint32_t max_matches,
664                        TypeList& types)
665{
666    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
667    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
668    {
669        SymbolVendor *symbols = GetSymbolVendor ();
670        if (symbols)
671            return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
672    }
673    return 0;
674}
675
676uint32_t
677Module::FindTypesInNamespace (const SymbolContext& sc,
678                              const ConstString &type_name,
679                              const ClangNamespaceDecl *namespace_decl,
680                              uint32_t max_matches,
681                              TypeList& type_list)
682{
683    const bool append = true;
684    return FindTypes_Impl(sc, type_name, namespace_decl, append, max_matches, type_list);
685}
686
687uint32_t
688Module::FindTypes (const SymbolContext& sc,
689                   const ConstString &name,
690                   bool exact_match,
691                   uint32_t max_matches,
692                   TypeList& types)
693{
694    uint32_t num_matches = 0;
695    const char *type_name_cstr = name.GetCString();
696    std::string type_scope;
697    std::string type_basename;
698    const bool append = true;
699    if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename))
700    {
701        // Check if "name" starts with "::" which means the qualified type starts
702        // from the root namespace and implies and exact match. The typenames we
703        // get back from clang do not start with "::" so we need to strip this off
704        // in order to get the qualfied names to match
705
706        if (type_scope.size() >= 2 && type_scope[0] == ':' && type_scope[1] == ':')
707        {
708            type_scope.erase(0,2);
709            exact_match = true;
710        }
711        ConstString type_basename_const_str (type_basename.c_str());
712        if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types))
713        {
714            types.RemoveMismatchedTypes (type_scope, type_basename, exact_match);
715            num_matches = types.GetSize();
716        }
717    }
718    else
719    {
720        // The type is not in a namespace/class scope, just search for it by basename
721        num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types);
722    }
723
724    return num_matches;
725
726}
727
728//uint32_t
729//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
730//{
731//  Timer scoped_timer(__PRETTY_FUNCTION__);
732//  SymbolVendor *symbols = GetSymbolVendor ();
733//  if (symbols)
734//      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
735//  return 0;
736//
737//}
738
739SymbolVendor*
740Module::GetSymbolVendor (bool can_create)
741{
742    Mutex::Locker locker (m_mutex);
743    if (m_did_load_symbol_vendor == false && can_create)
744    {
745        ObjectFile *obj_file = GetObjectFile ();
746        if (obj_file != NULL)
747        {
748            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
749            m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this()));
750            m_did_load_symbol_vendor = true;
751        }
752    }
753    return m_symfile_ap.get();
754}
755
756void
757Module::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
758{
759    // Container objects whose paths do not specify a file directly can call
760    // this function to correct the file and object names.
761    m_file = file;
762    m_mod_time = file.GetModificationTime();
763    m_object_name = object_name;
764}
765
766const ArchSpec&
767Module::GetArchitecture () const
768{
769    return m_arch;
770}
771
772void
773Module::GetDescription (Stream *s, lldb::DescriptionLevel level)
774{
775    Mutex::Locker locker (m_mutex);
776
777    if (level >= eDescriptionLevelFull)
778    {
779        if (m_arch.IsValid())
780            s->Printf("(%s) ", m_arch.GetArchitectureName());
781    }
782
783    if (level == eDescriptionLevelBrief)
784    {
785        const char *filename = m_file.GetFilename().GetCString();
786        if (filename)
787            s->PutCString (filename);
788    }
789    else
790    {
791        char path[PATH_MAX];
792        if (m_file.GetPath(path, sizeof(path)))
793            s->PutCString(path);
794    }
795
796    const char *object_name = m_object_name.GetCString();
797    if (object_name)
798        s->Printf("(%s)", object_name);
799}
800
801void
802Module::ReportError (const char *format, ...)
803{
804    if (format && format[0])
805    {
806        StreamString strm;
807        strm.PutCString("error: ");
808        GetDescription(&strm, lldb::eDescriptionLevelBrief);
809        strm.PutChar (' ');
810        va_list args;
811        va_start (args, format);
812        strm.PrintfVarArg(format, args);
813        va_end (args);
814
815        const int format_len = strlen(format);
816        if (format_len > 0)
817        {
818            const char last_char = format[format_len-1];
819            if (last_char != '\n' || last_char != '\r')
820                strm.EOL();
821        }
822        Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
823
824    }
825}
826
827bool
828Module::FileHasChanged () const
829{
830    if (m_file_has_changed == false)
831        m_file_has_changed = (m_file.GetModificationTime() != m_mod_time);
832    return m_file_has_changed;
833}
834
835void
836Module::ReportErrorIfModifyDetected (const char *format, ...)
837{
838    if (m_first_file_changed_log == false)
839    {
840        if (FileHasChanged ())
841        {
842            m_first_file_changed_log = true;
843            if (format)
844            {
845                StreamString strm;
846                strm.PutCString("error: the object file ");
847                GetDescription(&strm, lldb::eDescriptionLevelFull);
848                strm.PutCString (" has been modified\n");
849
850                va_list args;
851                va_start (args, format);
852                strm.PrintfVarArg(format, args);
853                va_end (args);
854
855                const int format_len = strlen(format);
856                if (format_len > 0)
857                {
858                    const char last_char = format[format_len-1];
859                    if (last_char != '\n' || last_char != '\r')
860                        strm.EOL();
861                }
862                strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
863                Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
864            }
865        }
866    }
867}
868
869void
870Module::ReportWarning (const char *format, ...)
871{
872    if (format && format[0])
873    {
874        StreamString strm;
875        strm.PutCString("warning: ");
876        GetDescription(&strm, lldb::eDescriptionLevelFull);
877        strm.PutChar (' ');
878
879        va_list args;
880        va_start (args, format);
881        strm.PrintfVarArg(format, args);
882        va_end (args);
883
884        const int format_len = strlen(format);
885        if (format_len > 0)
886        {
887            const char last_char = format[format_len-1];
888            if (last_char != '\n' || last_char != '\r')
889                strm.EOL();
890        }
891        Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
892    }
893}
894
895void
896Module::LogMessage (Log *log, const char *format, ...)
897{
898    if (log)
899    {
900        StreamString log_message;
901        GetDescription(&log_message, lldb::eDescriptionLevelFull);
902        log_message.PutCString (": ");
903        va_list args;
904        va_start (args, format);
905        log_message.PrintfVarArg (format, args);
906        va_end (args);
907        log->PutCString(log_message.GetString().c_str());
908    }
909}
910
911void
912Module::LogMessageVerboseBacktrace (Log *log, const char *format, ...)
913{
914    if (log)
915    {
916        StreamString log_message;
917        GetDescription(&log_message, lldb::eDescriptionLevelFull);
918        log_message.PutCString (": ");
919        va_list args;
920        va_start (args, format);
921        log_message.PrintfVarArg (format, args);
922        va_end (args);
923        if (log->GetVerbose())
924            Host::Backtrace (log_message, 1024);
925        log->PutCString(log_message.GetString().c_str());
926    }
927}
928
929void
930Module::Dump(Stream *s)
931{
932    Mutex::Locker locker (m_mutex);
933    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
934    s->Indent();
935    s->Printf("Module %s/%s%s%s%s\n",
936              m_file.GetDirectory().AsCString(),
937              m_file.GetFilename().AsCString(),
938              m_object_name ? "(" : "",
939              m_object_name ? m_object_name.GetCString() : "",
940              m_object_name ? ")" : "");
941
942    s->IndentMore();
943    ObjectFile *objfile = GetObjectFile ();
944
945    if (objfile)
946        objfile->Dump(s);
947
948    SymbolVendor *symbols = GetSymbolVendor ();
949
950    if (symbols)
951        symbols->Dump(s);
952
953    s->IndentLess();
954}
955
956
957TypeList*
958Module::GetTypeList ()
959{
960    SymbolVendor *symbols = GetSymbolVendor ();
961    if (symbols)
962        return &symbols->GetTypeList();
963    return NULL;
964}
965
966const ConstString &
967Module::GetObjectName() const
968{
969    return m_object_name;
970}
971
972ObjectFile *
973Module::GetObjectFile()
974{
975    Mutex::Locker locker (m_mutex);
976    if (m_did_load_objfile == false)
977    {
978        m_did_load_objfile = true;
979        Timer scoped_timer(__PRETTY_FUNCTION__,
980                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
981        DataBufferSP file_data_sp;
982        m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(),
983                                               &m_file,
984                                               m_object_offset,
985                                               m_file.GetByteSize(),
986                                               file_data_sp);
987        if (m_objfile_sp)
988        {
989			// Once we get the object file, update our module with the object file's
990			// architecture since it might differ in vendor/os if some parts were
991			// unknown.
992            m_objfile_sp->GetArchitecture (m_arch);
993        }
994    }
995    return m_objfile_sp.get();
996}
997
998
999const Symbol *
1000Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
1001{
1002    Timer scoped_timer(__PRETTY_FUNCTION__,
1003                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
1004                       name.AsCString(),
1005                       symbol_type);
1006    ObjectFile *objfile = GetObjectFile();
1007    if (objfile)
1008    {
1009        Symtab *symtab = objfile->GetSymtab();
1010        if (symtab)
1011            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
1012    }
1013    return NULL;
1014}
1015void
1016Module::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
1017{
1018    // No need to protect this call using m_mutex all other method calls are
1019    // already thread safe.
1020
1021    size_t num_indices = symbol_indexes.size();
1022    if (num_indices > 0)
1023    {
1024        SymbolContext sc;
1025        CalculateSymbolContext (&sc);
1026        for (size_t i = 0; i < num_indices; i++)
1027        {
1028            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
1029            if (sc.symbol)
1030                sc_list.Append (sc);
1031        }
1032    }
1033}
1034
1035size_t
1036Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
1037{
1038    // No need to protect this call using m_mutex all other method calls are
1039    // already thread safe.
1040
1041
1042    Timer scoped_timer(__PRETTY_FUNCTION__,
1043                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
1044                       name.AsCString(),
1045                       symbol_type);
1046    const size_t initial_size = sc_list.GetSize();
1047    ObjectFile *objfile = GetObjectFile ();
1048    if (objfile)
1049    {
1050        Symtab *symtab = objfile->GetSymtab();
1051        if (symtab)
1052        {
1053            std::vector<uint32_t> symbol_indexes;
1054            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
1055            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
1056        }
1057    }
1058    return sc_list.GetSize() - initial_size;
1059}
1060
1061size_t
1062Module::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
1063{
1064    // No need to protect this call using m_mutex all other method calls are
1065    // already thread safe.
1066
1067    Timer scoped_timer(__PRETTY_FUNCTION__,
1068                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
1069                       regex.GetText(),
1070                       symbol_type);
1071    const size_t initial_size = sc_list.GetSize();
1072    ObjectFile *objfile = GetObjectFile ();
1073    if (objfile)
1074    {
1075        Symtab *symtab = objfile->GetSymtab();
1076        if (symtab)
1077        {
1078            std::vector<uint32_t> symbol_indexes;
1079            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
1080            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
1081        }
1082    }
1083    return sc_list.GetSize() - initial_size;
1084}
1085
1086const TimeValue &
1087Module::GetModificationTime () const
1088{
1089    return m_mod_time;
1090}
1091
1092bool
1093Module::IsExecutable ()
1094{
1095    if (GetObjectFile() == NULL)
1096        return false;
1097    else
1098        return GetObjectFile()->IsExecutable();
1099}
1100
1101bool
1102Module::IsLoadedInTarget (Target *target)
1103{
1104    ObjectFile *obj_file = GetObjectFile();
1105    if (obj_file)
1106    {
1107        SectionList *sections = obj_file->GetSectionList();
1108        if (sections != NULL)
1109        {
1110            size_t num_sections = sections->GetSize();
1111            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
1112            {
1113                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
1114                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
1115                {
1116                    return true;
1117                }
1118            }
1119        }
1120    }
1121    return false;
1122}
1123bool
1124Module::SetArchitecture (const ArchSpec &new_arch)
1125{
1126    if (!m_arch.IsValid())
1127    {
1128        m_arch = new_arch;
1129        return true;
1130    }
1131    return m_arch == new_arch;
1132}
1133
1134bool
1135Module::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
1136{
1137    size_t num_loaded_sections = 0;
1138    ObjectFile *objfile = GetObjectFile();
1139    if (objfile)
1140    {
1141        SectionList *section_list = objfile->GetSectionList ();
1142        if (section_list)
1143        {
1144            const size_t num_sections = section_list->GetSize();
1145            size_t sect_idx = 0;
1146            for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1147            {
1148                // Iterate through the object file sections to find the
1149                // first section that starts of file offset zero and that
1150                // has bytes in the file...
1151                SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
1152                // Only load non-thread specific sections when given a slide
1153                if (section_sp && !section_sp->IsThreadSpecific())
1154                {
1155                    if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + offset))
1156                        ++num_loaded_sections;
1157                }
1158            }
1159        }
1160    }
1161    changed = num_loaded_sections > 0;
1162    return num_loaded_sections > 0;
1163}
1164
1165
1166bool
1167Module::MatchesModuleSpec (const ModuleSpec &module_ref)
1168{
1169    const UUID &uuid = module_ref.GetUUID();
1170
1171    if (uuid.IsValid())
1172    {
1173        // If the UUID matches, then nothing more needs to match...
1174        if (uuid == GetUUID())
1175            return true;
1176        else
1177            return false;
1178    }
1179
1180    const FileSpec &file_spec = module_ref.GetFileSpec();
1181    if (file_spec)
1182    {
1183        if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory()))
1184            return false;
1185    }
1186
1187    const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec();
1188    if (platform_file_spec)
1189    {
1190        if (!FileSpec::Equal (platform_file_spec, GetPlatformFileSpec (), platform_file_spec.GetDirectory()))
1191            return false;
1192    }
1193
1194    const ArchSpec &arch = module_ref.GetArchitecture();
1195    if (arch.IsValid())
1196    {
1197        if (m_arch != arch)
1198            return false;
1199    }
1200
1201    const ConstString &object_name = module_ref.GetObjectName();
1202    if (object_name)
1203    {
1204        if (object_name != GetObjectName())
1205            return false;
1206    }
1207    return true;
1208}
1209
1210bool
1211Module::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const
1212{
1213    Mutex::Locker locker (m_mutex);
1214    return m_source_mappings.FindFile (orig_spec, new_spec);
1215}
1216
1217bool
1218Module::RemapSourceFile (const char *path, std::string &new_path) const
1219{
1220    Mutex::Locker locker (m_mutex);
1221    return m_source_mappings.RemapPath(path, new_path);
1222}
1223
1224uint32_t
1225Module::GetVersion (uint32_t *versions, uint32_t num_versions)
1226{
1227    ObjectFile *obj_file = GetObjectFile();
1228    if (obj_file)
1229        return obj_file->GetVersion (versions, num_versions);
1230
1231    if (versions && num_versions)
1232    {
1233        for (uint32_t i=0; i<num_versions; ++i)
1234            versions[i] = UINT32_MAX;
1235    }
1236    return 0;
1237}
1238