Module.cpp revision 302d78c71902398ce1f422bd09216dd53a6abb88
15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===-- Module.cpp ----------------------------------------------*- C++ -*-===//
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// License. See LICENSE.TXT for details.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//===----------------------------------------------------------------------===//
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/Module.h"
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/DataBuffer.h"
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/DataBufferHeap.h"
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/Log.h"
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/ModuleList.h"
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/RegularExpression.h"
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/StreamString.h"
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Core/Timer.h"
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Host/Host.h"
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/lldb-private-log.h"
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Symbol/ObjectFile.h"
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Symbol/SymbolContext.h"
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Symbol/SymbolVendor.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Target/Process.h"
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "lldb/Target/Target.h"
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace lldb;
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace lldb_private;
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Shared pointers to modules track module lifetimes in
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// targets and in the global module, but this collection
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// will track all module objects that are still alive
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef std::vector<Module *> ModuleCollection;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static ModuleCollection &
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)GetModuleCollection()
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This module collection needs to live past any module, so we could either make it a
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // shared pointer in each module or just leak is.  Since it is only an empty vector by
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the time all the modules have gone away, we just leak it for now.  If we decide this
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is a big problem we can introduce a Finalize method that will tear everything down in
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // a predictable order.
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static ModuleCollection *g_module_collection = NULL;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (g_module_collection == NULL)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        g_module_collection = new ModuleCollection();
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *g_module_collection;
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Mutex *
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetAllocationModuleCollectionMutex()
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // NOTE: The mutex below must be leaked since the global module list in
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the ModuleList class will get torn at some point, and we can't know
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // if it will tear itself down before the "g_module_collection_mutex" below
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // will. So we leak a Mutex object below to safeguard against that
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static Mutex *g_module_collection_mutex = NULL;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (g_module_collection_mutex == NULL)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return g_module_collection_mutex;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetNumberAllocatedModules ()
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return GetModuleCollection().size();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module *
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetAllocatedModuleAtIndex (size_t idx)
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ModuleCollection &modules = GetModuleCollection();
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (idx < modules.size())
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return modules[idx];
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return NULL;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if 0
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// These functions help us to determine if modules are still loaded, yet don't require that
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// you have a command interpreter and can easily be called from an external debugger.
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace lldb {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ClearModuleInfo (void)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ModuleList::RemoveOrphanSharedModules();
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DumpModuleInfo (void)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ModuleCollection &modules = GetModuleCollection();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const size_t count = modules.size();
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i=0; i<count; ++i)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            StreamString strm;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Module *module = modules[i];
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            module->GetDescription(&strm, eDescriptionLevelFull);
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    module,
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    in_shared_module_list,
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    (uint32_t)module->use_count(),
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    strm.GetString().c_str());
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::Module(const FileSpec& file_spec, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) :
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mutex (Mutex::eMutexTypeRecursive),
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mod_time (),
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_arch (),
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_uuid (),
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_file (file_spec),
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_platform_file(),
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_object_name (),
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_object_offset (),
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_objfile_sp (),
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_symfile_ap (),
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_ast (),
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_load_objfile (false),
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_load_symbol_vendor (false),
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_parse_uuid (false),
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_init_ast (false),
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_is_dynamic_loader_module (false),
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_was_modified (false)
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Scope for locker below...
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GetModuleCollection().push_back(this);
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StreamString s;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_file.GetFilename())
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s << m_file.GetFilename();
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s.Printf("[0x%16.16llx]", header_addr);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_file.GetFilename().SetCString (s.GetData());
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DataBufferSP data_sp;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (process_sp)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_did_load_objfile = true;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0));
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Error error;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const size_t bytes_read = process_sp->ReadMemory (header_addr,
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                          data_ap->GetBytes(),
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                          data_ap->GetByteSize(),
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                          error);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (bytes_read == 512)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            data_sp.reset (data_ap.release());
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_objfile_sp = ObjectFile::FindPlugin(this, process_sp, header_addr, data_sp);
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (m_objfile_sp)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Once we get the object file, update our module with the object file's
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // architecture since it might differ in vendor/os if some parts were
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // unknown.
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                m_objfile_sp->GetArchitecture (m_arch);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) :
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mutex (Mutex::eMutexTypeRecursive),
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mod_time (file_spec.GetModificationTime()),
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_arch (arch),
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_uuid (),
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_file (file_spec),
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_platform_file(),
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_object_name (),
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_object_offset (object_offset),
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_objfile_sp (),
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_symfile_ap (),
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_ast (),
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_load_objfile (false),
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_load_symbol_vendor (false),
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_parse_uuid (false),
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_did_init_ast (false),
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_is_dynamic_loader_module (false),
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_was_modified (false)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Scope for locker below...
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GetModuleCollection().push_back(this);
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (object_name)
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_object_name = *object_name;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (log)
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     this,
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_arch.GetArchitectureName(),
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_file.GetDirectory().AsCString(""),
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_file.GetFilename().AsCString(""),
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_object_name.IsEmpty() ? "" : "(",
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_object_name.IsEmpty() ? "" : ")");
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::~Module()
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Scope for locker below...
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ModuleCollection &modules = GetModuleCollection();
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ModuleCollection::iterator end = modules.end();
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (pos != end)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            modules.erase(pos);
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (log)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     this,
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_arch.GetArchitectureName(),
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_file.GetDirectory().AsCString(""),
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_file.GetFilename().AsCString(""),
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_object_name.IsEmpty() ? "" : "(",
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                     m_object_name.IsEmpty() ? "" : ")");
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Release any auto pointers before we start tearing down our member
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // variables since the object file and symbol files might need to make
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // function calls back into this module object. The ordering is important
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // here because symbol files can require the module object file. So we tear
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // down the symbol file first, then the object file.
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_symfile_ap.reset();
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_objfile_sp.reset();
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const lldb_private::UUID&
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetUUID()
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_did_parse_uuid == false)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ObjectFile * obj_file = GetObjectFile ();
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (obj_file != NULL)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            obj_file->GetUUID(&m_uuid);
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_did_parse_uuid = true;
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_uuid;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ClangASTContext &
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetClangASTContext ()
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_did_init_ast == false)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ObjectFile * objfile = GetObjectFile();
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ArchSpec object_arch;
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (objfile && objfile->GetArchitecture(object_arch))
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_did_init_ast = true;
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_ast.SetArchitecture (object_arch);
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_ast;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ParseAllDebugSymbols()
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t num_comp_units = GetNumCompileUnits();
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (num_comp_units == 0)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolContext sc;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sc.module_sp = shared_from_this();
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t cu_idx;
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (sc.comp_unit)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sc.function = NULL;
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            symbols->ParseVariablesForContext(sc);
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            symbols->ParseCompileUnitFunctions(sc);
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            uint32_t func_idx;
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                symbols->ParseFunctionBlocks(sc);
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Parse the variables for this function and all its blocks
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                symbols->ParseVariablesForContext(sc);
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Parse all types for this compile unit
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sc.function = NULL;
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            symbols->ParseTypes(sc);
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::CalculateSymbolContext(SymbolContext* sc)
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sc->module_sp = shared_from_this();
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module *
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::CalculateSymbolContextModule ()
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return this;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::DumpSymbolContext(Stream *s)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s->Printf(", Module{%p}", this);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetNumCompileUnits()
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return symbols->GetNumCompileUnits();
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CompUnitSP
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetCompileUnitAtIndex (uint32_t index)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t num_comp_units = GetNumCompileUnits ();
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CompUnitSP cu_sp;
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (index < num_comp_units)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SymbolVendor *symbols = GetSymbolVendor ();
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (symbols)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            cu_sp = symbols->GetCompileUnitAtIndex(index);
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return cu_sp;
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ObjectFile* ofile = GetObjectFile();
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ofile)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t resolved_flags = 0;
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Clear the result symbol context in case we don't find anything
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sc.Clear();
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Get the section from the section/offset address.
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const Section *section = so_addr.GetSection();
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Make sure the section matches this module before we try and match anything
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (section && section->GetModule() == this)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the section offset based address resolved itself, then this
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // is the right module.
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sc.module_sp = shared_from_this();
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        resolved_flags |= eSymbolContextModule;
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Resolve the compile unit, function, block, line table or line
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // entry if requested.
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (resolve_scope & eSymbolContextCompUnit    ||
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resolve_scope & eSymbolContextFunction    ||
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resolve_scope & eSymbolContextBlock       ||
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            resolve_scope & eSymbolContextLineEntry   )
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            SymbolVendor *symbols = GetSymbolVendor ();
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (symbols)
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            ObjectFile* ofile = GetObjectFile();
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (ofile)
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Symtab *symtab = ofile->GetSymtab();
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (symtab)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                {
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (so_addr.IsSectionOffset())
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    {
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        if (sc.symbol)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                            resolved_flags |= eSymbolContextSymbol;
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return resolved_flags;
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ResolveSymbolContextForFilePath
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char *file_path,
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t line,
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool check_inlines,
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t resolve_scope,
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolContextList& sc_list
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles))
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    FileSpec file_spec(file_path, false);
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer scoped_timer(__PRETTY_FUNCTION__,
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       file_spec.GetDirectory().AsCString(""),
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       file_spec.GetDirectory() ? "/" : "",
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       file_spec.GetFilename().AsCString(""),
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       line,
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       check_inlines ? "yes" : "no",
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       resolve_scope);
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const uint32_t initial_count = sc_list.GetSize();
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor  ();
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return sc_list.GetSize() - initial_count;
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindCompileUnits (const FileSpec &path,
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          bool append,
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                          SymbolContextList &sc_list)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!append)
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sc_list.Clear();
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const uint32_t start_size = sc_list.GetSize();
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const uint32_t num_compile_units = GetNumCompileUnits();
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolContext sc;
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    sc.module_sp = shared_from_this();
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const bool compare_directory = path.GetDirectory();
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (uint32_t i=0; i<num_compile_units; ++i)
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sc.comp_unit = GetCompileUnitAtIndex(i).get();
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sc_list.Append(sc);
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return sc_list.GetSize() - start_size;
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindFunctions (const ConstString &name,
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       const ClangNamespaceDecl *namespace_decl,
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       uint32_t name_type_mask,
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       bool include_symbols,
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       bool include_inlines,
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       bool append,
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       SymbolContextList& sc_list)
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!append)
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sc_list.Clear();
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const uint32_t start_size = sc_list.GetSize();
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Find all the functions (not symbols, but debug information functions...
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now check our symbol table for symbols that are code symbols if requested
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (include_symbols)
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ObjectFile *objfile = GetObjectFile();
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (objfile)
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Symtab *symtab = objfile->GetSymtab();
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (symtab)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                std::vector<uint32_t> symbol_indexes;
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                const uint32_t num_matches = symbol_indexes.size();
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (num_matches)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                {
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    const bool merge_symbol_into_function = true;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    SymbolContext sc(this);
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    for (uint32_t i=0; i<num_matches; i++)
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    {
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return sc_list.GetSize() - start_size;
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindFunctions (const RegularExpression& regex,
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       bool include_symbols,
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       bool include_inlines,
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       bool append,
5555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       SymbolContextList& sc_list)
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!append)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        sc_list.Clear();
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const uint32_t start_size = sc_list.GetSize();
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        symbols->FindFunctions(regex, include_inlines, append, sc_list);
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Now check our symbol table for symbols that are code symbols if requested
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (include_symbols)
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ObjectFile *objfile = GetObjectFile();
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (objfile)
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Symtab *symtab = objfile->GetSymtab();
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (symtab)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                std::vector<uint32_t> symbol_indexes;
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                const uint32_t num_matches = symbol_indexes.size();
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (num_matches)
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                {
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    const bool merge_symbol_into_function = true;
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    SymbolContext sc(this);
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    for (uint32_t i=0; i<num_matches; i++)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    {
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    }
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return sc_list.GetSize() - start_size;
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SymbolVendor *symbols = GetSymbolVendor ();
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (symbols)
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// depending on implementation details, type lookup might fail because of
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// embedded spurious namespace:: prefixes. this call strips them, paying
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// attention to the fact that a type might have namespace'd type names as
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// arguments to templates, and those must not be stripped off
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const char*
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)StripTypeName(const char* name_cstr)
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Protect against null c string.
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!name_cstr)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return name_cstr;
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* skip_namespace = strstr(name_cstr, "::");
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char* template_arg_char = strchr(name_cstr, '<');
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    while (skip_namespace != NULL)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (template_arg_char != NULL &&
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            break;
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        name_cstr = skip_namespace+2;
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        skip_namespace = strstr(name_cstr, "::");
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return name_cstr;
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)uint32_t
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindTypes (const SymbolContext& sc,  const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types);
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (retval == 0)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const char *orig_name = name.GetCString();
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const char *stripped = StripTypeName(orig_name);
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Only do this lookup if StripTypeName has stripped the name:
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (stripped != orig_name)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)           return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types);
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return 0;
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return retval;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//uint32_t
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//{
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  Timer scoped_timer(__PRETTY_FUNCTION__);
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  SymbolVendor *symbols = GetSymbolVendor ();
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  if (symbols)
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//  return 0;
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)//}
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SymbolVendor*
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetSymbolVendor (bool can_create)
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_did_load_symbol_vendor == false && can_create)
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ObjectFile *obj_file = GetObjectFile ();
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (obj_file != NULL)
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_symfile_ap.reset(SymbolVendor::FindPlugin(this));
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_did_load_symbol_vendor = true;
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_symfile_ap.get();
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Container objects whose paths do not specify a file directly can call
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // this function to correct the file and object names.
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_file = file;
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_mod_time = file.GetModificationTime();
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_object_name = object_name;
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ArchSpec&
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetArchitecture () const
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_arch;
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetDescription (Stream *s, lldb::DescriptionLevel level)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (level >= eDescriptionLevelFull)
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_arch.IsValid())
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s->Printf("(%s) ", m_arch.GetArchitectureName());
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (level == eDescriptionLevelBrief)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const char *filename = m_file.GetFilename().GetCString();
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (filename)
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s->PutCString (filename);
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        char path[PATH_MAX];
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_file.GetPath(path, sizeof(path)))
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            s->PutCString(path);
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const char *object_name = m_object_name.GetCString();
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (object_name)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s->Printf("(%s)", object_name);
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ReportError (const char *format, ...)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (format && format[0])
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StreamString strm;
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strm.PutCString("error: ");
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GetDescription(&strm, lldb::eDescriptionLevelBrief);
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strm.PutChar (' ');
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_list args;
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_start (args, format);
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strm.PrintfVarArg(format, args);
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_end (args);
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const int format_len = strlen(format);
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (format_len > 0)
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const char last_char = format[format_len-1];
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (last_char != '\n' || last_char != '\r')
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                strm.EOL();
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ReportErrorIfModifyDetected (const char *format, ...)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!GetModified(true) && GetModified(false))
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (format)
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            StreamString strm;
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            strm.PutCString("error: the object file ");
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            GetDescription(&strm, lldb::eDescriptionLevelFull);
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            strm.PutCString (" has been modified\n");
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            va_list args;
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            va_start (args, format);
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            strm.PrintfVarArg(format, args);
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            va_end (args);
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const int format_len = strlen(format);
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (format_len > 0)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                const char last_char = format[format_len-1];
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (last_char != '\n' || last_char != '\r')
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    strm.EOL();
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::ReportWarning (const char *format, ...)
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (format && format[0])
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StreamString strm;
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strm.PutCString("warning: ");
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GetDescription(&strm, lldb::eDescriptionLevelFull);
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strm.PutChar (' ');
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_list args;
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_start (args, format);
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        strm.PrintfVarArg(format, args);
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_end (args);
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const int format_len = strlen(format);
7945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (format_len > 0)
7955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const char last_char = format[format_len-1];
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (last_char != '\n' || last_char != '\r')
7985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                strm.EOL();
7995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
8005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
8015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
8055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::LogMessage (Log *log, const char *format, ...)
8065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (log)
8085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        StreamString log_message;
8105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        GetDescription(&log_message, lldb::eDescriptionLevelFull);
8115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        log_message.PutCString (": ");
8125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_list args;
8135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_start (args, format);
8145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        log_message.PrintfVarArg (format, args);
8155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        va_end (args);
8165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        log->PutCString(log_message.GetString().c_str());
8175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool
8215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetModified (bool use_cached_only)
8225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_was_modified == false && use_cached_only == false)
8245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TimeValue curr_mod_time (m_file.GetModificationTime());
8265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_was_modified = curr_mod_time != m_mod_time;
8275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
8285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_was_modified;
8295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool
8325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::SetModified (bool b)
8335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const bool prev_value = m_was_modified;
8355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_was_modified = b;
8365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return prev_value;
8375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
8415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::Dump(Stream *s)
8425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
8445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
8455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s->Indent();
8465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s->Printf("Module %s/%s%s%s%s\n",
8475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              m_file.GetDirectory().AsCString(),
8485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              m_file.GetFilename().AsCString(),
8495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              m_object_name ? "(" : "",
8505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              m_object_name ? m_object_name.GetCString() : "",
8515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)              m_object_name ? ")" : "");
8525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s->IndentMore();
8545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ObjectFile *objfile = GetObjectFile ();
8555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (objfile)
8575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        objfile->Dump(s);
8585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
8605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
8625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        symbols->Dump(s);
8635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    s->IndentLess();
8655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TypeList*
8695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetTypeList ()
8705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SymbolVendor *symbols = GetSymbolVendor ();
8725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (symbols)
8735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return &symbols->GetTypeList();
8745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return NULL;
8755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const ConstString &
8785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetObjectName() const
8795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_object_name;
8815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
8825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ObjectFile *
8845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetObjectFile()
8855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Mutex::Locker locker (m_mutex);
8875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_did_load_objfile == false)
8885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
8895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_did_load_objfile = true;
8905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Timer scoped_timer(__PRETTY_FUNCTION__,
8915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
8925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DataBufferSP file_data_sp;
8935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_objfile_sp = ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize(), file_data_sp);
8945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_objfile_sp)
8955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
8965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			// Once we get the object file, update our module with the object file's
8975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			// architecture since it might differ in vendor/os if some parts were
8985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)			// unknown.
8995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_objfile_sp->GetArchitecture (m_arch);
9005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_objfile_sp.get();
9035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const Symbol *
9075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
9085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer scoped_timer(__PRETTY_FUNCTION__,
9105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
9115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       name.AsCString(),
9125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       symbol_type);
9135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ObjectFile *objfile = GetObjectFile();
9145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (objfile)
9155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Symtab *symtab = objfile->GetSymtab();
9175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (symtab)
9185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
9195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return NULL;
9215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void
9235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
9245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No need to protect this call using m_mutex all other method calls are
9265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // already thread safe.
9275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t num_indices = symbol_indexes.size();
9295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (num_indices > 0)
9305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SymbolContext sc;
9325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CalculateSymbolContext (&sc);
9335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (size_t i = 0; i < num_indices; i++)
9345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
9355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
9365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (sc.symbol)
9375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                sc_list.Append (sc);
9385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t
9435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
9445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No need to protect this call using m_mutex all other method calls are
9465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // already thread safe.
9475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer scoped_timer(__PRETTY_FUNCTION__,
9505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
9515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       name.AsCString(),
9525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       symbol_type);
9535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const size_t initial_size = sc_list.GetSize();
9545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ObjectFile *objfile = GetObjectFile ();
9555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (objfile)
9565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Symtab *symtab = objfile->GetSymtab();
9585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (symtab)
9595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
9605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            std::vector<uint32_t> symbol_indexes;
9615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
9625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
9635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return sc_list.GetSize() - initial_size;
9665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)size_t
9695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
9705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // No need to protect this call using m_mutex all other method calls are
9725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // already thread safe.
9735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Timer scoped_timer(__PRETTY_FUNCTION__,
9755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
9765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       regex.GetText(),
9775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                       symbol_type);
9785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const size_t initial_size = sc_list.GetSize();
9795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ObjectFile *objfile = GetObjectFile ();
9805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (objfile)
9815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
9825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        Symtab *symtab = objfile->GetSymtab();
9835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (symtab)
9845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
9855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            std::vector<uint32_t> symbol_indexes;
9865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
9875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
9885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
9895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
9905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return sc_list.GetSize() - initial_size;
9915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const TimeValue &
9945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::GetModificationTime () const
9955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
9965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_mod_time;
9975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
9985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool
10005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::IsExecutable ()
10015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (GetObjectFile() == NULL)
10035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
10045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
10055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return GetObjectFile()->IsExecutable();
10065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool
10095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::IsLoadedInTarget (Target *target)
10105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ObjectFile *obj_file = GetObjectFile();
10125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (obj_file)
10135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SectionList *sections = obj_file->GetSectionList();
10155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (sections != NULL)
10165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
10175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            size_t num_sections = sections->GetSize();
10185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
10195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
10205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
10215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
10225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                {
10235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return true;
10245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
10255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
10265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
10295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool
10315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::SetArchitecture (const ArchSpec &new_arch)
10325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_arch.IsValid())
10345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_arch = new_arch;
10365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
10375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_arch == new_arch;
10395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool
10425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Module::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
10435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
10445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    changed = false;
10455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ObjectFile *image_object_file = GetObjectFile();
10465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (image_object_file)
10475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SectionList *section_list = image_object_file->GetSectionList ();
10495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (section_list)
10505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        {
10515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            const size_t num_sections = section_list->GetSize();
10525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            size_t sect_idx = 0;
10535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
10545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            {
10555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // Iterate through the object file sections to find the
10565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // first section that starts of file offset zero and that
10575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                // has bytes in the file...
10585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                Section *section = section_list->GetSectionAtIndex (sect_idx).get();
10595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (section)
10605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                {
10615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    if (target.GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress() + offset))
10625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                        changed = true;
10635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
10645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
10655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return sect_idx > 0;
10665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
10675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
10685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
10695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
10705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)