Module.cpp revision a7e864cb0a450c7ef65b6f9f6c9bae839c405906
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Module.cpp ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Core/Error.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
14b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBuffer.h"
15b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBufferHeap.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h"
2175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
23df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
24146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Host/Symbols.h"
25146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Interpreter/CommandInterpreter.h"
26146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Interpreter/ScriptInterpreter.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
32b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h"
33b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Target.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in
39899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection
40899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive
41899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection;
42899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
43899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection &
44899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection()
45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
46b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // This module collection needs to live past any module, so we could either make it a
47b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // shared pointer in each module or just leak is.  Since it is only an empty vector by
48b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // the time all the modules have gone away, we just leak it for now.  If we decide this
49b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // is a big problem we can introduce a Finalize method that will tear everything down in
50b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // a predictable order.
51b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
52b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    static ModuleCollection *g_module_collection = NULL;
53b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    if (g_module_collection == NULL)
54b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham        g_module_collection = new ModuleCollection();
55b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
56b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    return *g_module_collection;
57899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
58899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
59c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex *
60899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex()
61899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
62c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // NOTE: The mutex below must be leaked since the global module list in
63c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // the ModuleList class will get torn at some point, and we can't know
64c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // if it will tear itself down before the "g_module_collection_mutex" below
65c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // will. So we leak a Mutex object below to safeguard against that
66c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton
67c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    static Mutex *g_module_collection_mutex = NULL;
68c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    if (g_module_collection_mutex == NULL)
69c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton        g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
70c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    return g_module_collection_mutex;
71899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
72899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
73899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t
74899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules ()
75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
76899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
77899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return GetModuleCollection().size();
78899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
79899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
80899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule *
81899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx)
82899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
83899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
84899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    ModuleCollection &modules = GetModuleCollection();
85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    if (idx < modules.size())
86899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        return modules[idx];
87899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return NULL;
88899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
8908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0
90899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that
9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger.
9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb {
94899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    ClearModuleInfo (void)
9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
98860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton        const bool mandatory = true;
99860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton        ModuleList::RemoveOrphanSharedModules(mandatory);
10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    DumpModuleInfo (void)
10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        ModuleCollection &modules = GetModuleCollection();
10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        const size_t count = modules.size();
1085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        printf ("%s: %" PRIu64 " modules:\n", __PRETTY_FUNCTION__, (uint64_t)count);
10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        for (size_t i=0; i<count; ++i)
11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        {
11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            StreamString strm;
11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            Module *module = modules[i];
11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            module->GetDescription(&strm, eDescriptionLevelFull);
11608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
11708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    module,
11808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    in_shared_module_list,
11908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    (uint32_t)module->use_count(),
12008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    strm.GetString().c_str());
12108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        }
12208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
12308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton}
12408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
12508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif
126f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton
127444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::Module (const ModuleSpec &module_spec) :
128444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_mutex (Mutex::eMutexTypeRecursive),
129444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_mod_time (module_spec.GetFileSpec().GetModificationTime()),
130444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_arch (module_spec.GetArchitecture()),
131444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_uuid (),
132444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_file (module_spec.GetFileSpec()),
133444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_platform_file(module_spec.GetPlatformFileSpec()),
134444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_symfile_spec (module_spec.GetSymbolFileSpec()),
135444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_object_name (module_spec.GetObjectName()),
136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_object_offset (module_spec.GetObjectOffset()),
137444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_objfile_sp (),
138444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_symfile_ap (),
139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_ast (),
140964deba8853eb794e59263322b59b09b43669618Greg Clayton    m_source_mappings (),
141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_load_objfile (false),
142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_load_symbol_vendor (false),
143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_parse_uuid (false),
144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_init_ast (false),
145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_is_dynamic_loader_module (false),
146cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_file_has_changed (false),
147cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_first_file_changed_log (false)
148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{
149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    // Scope for locker below...
150444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
151444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        GetModuleCollection().push_back(this);
153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
155f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (log)
157444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
158444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     this,
159444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_arch.GetArchitectureName(),
160444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_file.GetDirectory().AsCString(""),
161444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_file.GetFilename().AsCString(""),
162444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : "(",
163444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
164444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : ")");
165444fe998bf707bd076a70c3a779db8575533695eGreg Clayton}
166444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec,
1683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ArchSpec& arch,
1693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ConstString *object_name,
1703508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               off_t object_offset) :
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time (file_spec.GetModificationTime()),
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_arch (arch),
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_uuid (),
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file (file_spec),
17624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_platform_file(),
1773508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    m_symfile_spec (),
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name (),
179b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_object_offset (object_offset),
180e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp (),
181236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_symfile_ap (),
182b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast (),
183964deba8853eb794e59263322b59b09b43669618Greg Clayton    m_source_mappings (),
184236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_objfile (false),
185236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_symbol_vendor (false),
186236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_parse_uuid (false),
187b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_did_init_ast (false),
188df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_is_dynamic_loader_module (false),
189cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_file_has_changed (false),
190cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_first_file_changed_log (false)
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
192899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
193899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
194899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
195899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        GetModuleCollection().push_back(this);
196899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
197899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (object_name)
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_object_name = *object_name;
200f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
204940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module()
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
214899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
215899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
216899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
217899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection &modules = GetModuleCollection();
218899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator end = modules.end();
219899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
220f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton        assert (pos != end);
221f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton        modules.erase(pos);
222899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
223f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton    LogSP log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
227940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
233b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Release any auto pointers before we start tearing down our member
234b01000fd063629facd45044f137446fb748ee179Greg Clayton    // variables since the object file and symbol files might need to make
235b01000fd063629facd45044f137446fb748ee179Greg Clayton    // function calls back into this module object. The ordering is important
236b01000fd063629facd45044f137446fb748ee179Greg Clayton    // here because symbol files can require the module object file. So we tear
237b01000fd063629facd45044f137446fb748ee179Greg Clayton    // down the symbol file first, then the object file.
238b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_symfile_ap.reset();
239e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp.reset();
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2426c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonObjectFile *
2436c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonModule::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error)
2446c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{
2456c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    if (m_objfile_sp)
2466c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    {
2476c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        error.SetErrorString ("object file already exists");
2486c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    }
2496c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    else
2506c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    {
2516c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        Mutex::Locker locker (m_mutex);
2526c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        if (process_sp)
2536c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        {
2546c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            m_did_load_objfile = true;
2556c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0));
2566c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            Error readmem_error;
2576c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            const size_t bytes_read = process_sp->ReadMemory (header_addr,
2586c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              data_ap->GetBytes(),
2596c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              data_ap->GetByteSize(),
2606c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              readmem_error);
2616c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            if (bytes_read == 512)
2626c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            {
2636c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                DataBufferSP data_sp(data_ap.release());
2646c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp);
2656c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                if (m_objfile_sp)
2666c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                {
267808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton                    StreamString s;
2685f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    s.Printf("0x%16.16" PRIx64, header_addr);
269808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton                    m_object_name.SetCString (s.GetData());
270808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton
271808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton                    // Once we get the object file, update our module with the object file's
2726c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    // architecture since it might differ in vendor/os if some parts were
2736c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    // unknown.
2746c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    m_objfile_sp->GetArchitecture (m_arch);
2756c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                }
2766c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                else
2776c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                {
2786c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    error.SetErrorString ("unable to find suitable object file plug-in");
2796c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                }
2806c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            }
2816c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            else
2826c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            {
2836c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString());
2846c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            }
2856c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        }
2866c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        else
2876c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        {
2886c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            error.SetErrorString ("invalid process");
2896c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        }
2906c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    }
2916c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    return m_objfile_sp.get();
2926c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton}
2936c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2950467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID&
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID()
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
299236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_parse_uuid == false)
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile * obj_file = GetObjectFile ();
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            obj_file->GetUUID(&m_uuid);
306236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_parse_uuid = true;
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_uuid;
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
312b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext &
313b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext ()
314b01000fd063629facd45044f137446fb748ee179Greg Clayton{
315b01000fd063629facd45044f137446fb748ee179Greg Clayton    Mutex::Locker locker (m_mutex);
316b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_did_init_ast == false)
317b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
318b01000fd063629facd45044f137446fb748ee179Greg Clayton        ObjectFile * objfile = GetObjectFile();
319395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        ArchSpec object_arch;
320395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        if (objfile && objfile->GetArchitecture(object_arch))
321b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
322b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_did_init_ast = true;
3231b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda
3241b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            // LLVM wants this to be set to iOS or MacOSX; if we're working on
3251b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            // a bare-boards type image, change the triple for llvm's benefit.
3261b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            if (object_arch.GetTriple().getVendor() == llvm::Triple::Apple
3271b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                && object_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
3281b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            {
3291b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                if (object_arch.GetTriple().getArch() == llvm::Triple::arm ||
3301b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                    object_arch.GetTriple().getArch() == llvm::Triple::thumb)
3311b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                {
3321b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                    object_arch.GetTriple().setOS(llvm::Triple::IOS);
3331b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                }
3341b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                else
3351b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                {
3361b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                    object_arch.GetTriple().setOS(llvm::Triple::MacOSX);
3371b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                }
3381b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            }
339395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            m_ast.SetArchitecture (object_arch);
340b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
341b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
342b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast;
343b01000fd063629facd45044f137446fb748ee179Greg Clayton}
344b01000fd063629facd45044f137446fb748ee179Greg Clayton
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols()
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
34936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t num_comp_units = GetNumCompileUnits();
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_comp_units == 0)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35302e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    SymbolContext sc;
35413d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    for (size_t cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit)
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseVariablesForContext(sc);
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseCompileUnitFunctions(sc);
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            for (size_t func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseFunctionBlocks(sc);
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Parse the variables for this function and all its blocks
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseVariablesForContext(sc);
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Parse all types for this compile unit
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseTypes(sc);
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc)
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc->module_sp = shared_from_this();
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3893508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP
390c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule ()
391c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
3923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    return shared_from_this();
393c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
394c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s)
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3987e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf(", Module{%p}", this);
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits()
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->GetNumCompileUnits();
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
41336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::GetCompileUnitAtIndex (size_t index)
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
41636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t num_comp_units = GetNumCompileUnits ();
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP cu_sp;
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index < num_comp_units)
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolVendor *symbols = GetSymbolVendor ();
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symbols)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cu_sp = symbols->GetCompileUnitAtIndex(index);
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cu_sp;
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
4325f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%" PRIx64 ")", vm_addr);
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile* ofile = GetObjectFile();
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ofile)
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
445a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton    // Clear the result symbol context in case we don't find anything, but don't clear the target
446a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton    sc.Clear(false);
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the section from the section/offset address.
4493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    SectionSP section_sp (so_addr.GetSection());
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure the section matches this module before we try and match anything
4523508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    if (section_sp && section_sp->GetModule().get() == this)
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If the section offset based address resolved itself, then this
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is the right module.
45613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton        sc.module_sp = shared_from_this();
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        resolved_flags |= eSymbolContextModule;
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Resolve the compile unit, function, block, line table or line
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // entry if requested.
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (resolve_scope & eSymbolContextCompUnit    ||
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextFunction    ||
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextBlock       ||
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextLineEntry   )
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolVendor *symbols = GetSymbolVendor ();
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (symbols)
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
471bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
472bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFile* ofile = GetObjectFile();
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ofile)
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *symtab = ofile->GetSymtab();
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symtab)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (so_addr.IsSectionOffset())
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sc.symbol)
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            resolved_flags |= eSymbolContextSymbol;
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
494537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath
495537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton(
496537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    const char *file_path,
497537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t line,
498537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    bool check_inlines,
499537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t resolve_scope,
500537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    SymbolContextList& sc_list
501537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton)
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
503537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    FileSpec file_spec(file_path, false);
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory().AsCString(""),
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory() ? "/" : "",
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetFilename().AsCString(""),
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       line,
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       check_inlines ? "yes" : "no",
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       resolve_scope);
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t initial_count = sc_list.GetSize();
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor  ();
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_count;
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
53136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const ConstString &name,
53236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             const ClangNamespaceDecl *namespace_decl,
53336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             bool append,
53436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             size_t max_matches,
53536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             VariableList& variables)
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
5390fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton
54336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
54436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const RegularExpression& regex,
54536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             bool append,
54636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             size_t max_matches,
54736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             VariableList& variables)
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
556801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path,
557801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          bool append,
558801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          SymbolContextList &sc_list)
559801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
560801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    if (!append)
561801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc_list.Clear();
562801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
56336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t start_size = sc_list.GetSize();
56436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t num_compile_units = GetNumCompileUnits();
565801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SymbolContext sc;
56613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
567801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const bool compare_directory = path.GetDirectory();
56836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    for (size_t i=0; i<num_compile_units; ++i)
569801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
570801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc.comp_unit = GetCompileUnitAtIndex(i).get();
571c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        if (sc.comp_unit)
572c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        {
573c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton            if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
574c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton                sc_list.Append(sc);
575c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        }
576801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
577801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    return sc_list.GetSize() - start_size;
578801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
579801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
58036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
5813e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name,
5823e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan                       const ClangNamespaceDecl *namespace_decl,
58336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                       uint32_t name_type_mask,
584302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
585302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
58628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
58728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
58928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
59028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
59128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
59236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t start_size = sc_list.GetSize();
59328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
59428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Find all the functions (not symbols, but debug information functions...
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
597302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
59828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
59928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
60028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
60128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
60228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
60328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
60428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
60528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
60628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
60728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
60828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
60928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
61036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                const size_t num_matches = symbol_indexes.size();
61128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
61228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
613889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
61428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
61536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    for (size_t i=0; i<num_matches; i++)
61628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
61728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
618889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
61928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
62028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
62128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
62228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
62328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
62428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
62828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex,
629302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
630302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
63128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
63228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
63528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
63628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
63736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t start_size = sc_list.GetSize();
63828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
641302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        symbols->FindFunctions(regex, include_inlines, append, sc_list);
64228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
64328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
64428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
64528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
64628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
64728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
64828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
64928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
65028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
65128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
65228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
65336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                const size_t num_matches = symbol_indexes.size();
65428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
65528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
656889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
65728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
65836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    for (size_t i=0; i<num_matches; i++)
65928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
66028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
661889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
66228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
66328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
66428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
66528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
66628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
66728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
671dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes_Impl (const SymbolContext& sc,
672dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        const ConstString &name,
673dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        const ClangNamespaceDecl *namespace_decl,
674dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        bool append,
67536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                        size_t max_matches,
676dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        TypeList& types)
6777aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{
6787aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
6797aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
6807aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    {
6817aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        SymbolVendor *symbols = GetSymbolVendor ();
6827aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        if (symbols)
6830fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
6847aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    }
6857aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    return 0;
6867aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton}
6877aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton
68836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
689dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypesInNamespace (const SymbolContext& sc,
690dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              const ConstString &type_name,
691dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              const ClangNamespaceDecl *namespace_decl,
69236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                              size_t max_matches,
693dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              TypeList& type_list)
694979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
695dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const bool append = true;
696dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return FindTypes_Impl(sc, type_name, namespace_decl, append, max_matches, type_list);
697979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
698979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
6990b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Claytonlldb::TypeSP
7000b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg ClaytonModule::FindFirstType (const SymbolContext& sc,
7010b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton                       const ConstString &name,
7020b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton                       bool exact_match)
7030b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton{
7040b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton    TypeList type_list;
70536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t num_matches = FindTypes (sc, name, exact_match, 1, type_list);
7060b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton    if (num_matches)
7070b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton        return type_list.GetTypeAtIndex(0);
7080b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton    return TypeSP();
7090b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton}
7100b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
7110b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
71236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
713dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes (const SymbolContext& sc,
714dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   const ConstString &name,
715dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   bool exact_match,
71636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                   size_t max_matches,
717dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   TypeList& types)
718979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
71936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t num_matches = 0;
720dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const char *type_name_cstr = name.GetCString();
721dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    std::string type_scope;
722dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    std::string type_basename;
723dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const bool append = true;
724b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton    TypeClass type_class = eTypeClassAny;
725b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton    if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename, type_class))
726979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
727dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // Check if "name" starts with "::" which means the qualified type starts
728dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // from the root namespace and implies and exact match. The typenames we
729dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // get back from clang do not start with "::" so we need to strip this off
730dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // in order to get the qualfied names to match
731dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
732dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (type_scope.size() >= 2 && type_scope[0] == ':' && type_scope[1] == ':')
733dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
734dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            type_scope.erase(0,2);
735dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            exact_match = true;
736dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
737dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        ConstString type_basename_const_str (type_basename.c_str());
738dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types))
739dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
740b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            types.RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match);
741dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            num_matches = types.GetSize();
742dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
743979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
744979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    else
745dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    {
746dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // The type is not in a namespace/class scope, just search for it by basename
747b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        if (type_class != eTypeClassAny)
748b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
749b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            // The "type_name_cstr" will have been modified if we have a valid type class
750b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            // prefix (like "struct", "class", "union", "typedef" etc).
751b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            num_matches = FindTypes_Impl(sc, ConstString(type_name_cstr), NULL, append, max_matches, types);
752b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            types.RemoveMismatchedTypes (type_class);
753b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            num_matches = types.GetSize();
754b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
755b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        else
756b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
757b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types);
758b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
759dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    }
760dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
761dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return num_matches;
762979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
763979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
764979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor*
766188091899842b140313b54e097f16efbe165c998Greg ClaytonModule::GetSymbolVendor (bool can_create, lldb_private::Stream *feedback_strm)
76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
769236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_symbol_vendor == false && can_create)
77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *obj_file = GetObjectFile ();
77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
775188091899842b140313b54e097f16efbe165c998Greg Clayton            m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this(), feedback_strm));
776236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_load_symbol_vendor = true;
77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symfile_ap.get();
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Container objects whose paths do not specify a file directly can call
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // this function to correct the file and object names.
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file = file;
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time = file.GetModificationTime();
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name = object_name;
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec&
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_arch;
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
79975d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level)
8007826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
8017826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Mutex::Locker locker (m_mutex);
8027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
80375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level >= eDescriptionLevelFull)
80475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
80575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_arch.IsValid())
80675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->Printf("(%s) ", m_arch.GetArchitectureName());
80775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
8087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
80975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level == eDescriptionLevelBrief)
81075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
81175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        const char *filename = m_file.GetFilename().GetCString();
81275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (filename)
81375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString (filename);
81475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
81575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    else
81675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
81775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        char path[PATH_MAX];
81875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_file.GetPath(path, sizeof(path)))
81975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString(path);
82075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
82149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
82249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    const char *object_name = m_object_name.GetCString();
82349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (object_name)
82449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        s->Printf("(%s)", object_name);
8257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
8267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
8277826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid
82875d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...)
82975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
830df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
831df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
832df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
833df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("error: ");
834df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        GetDescription(&strm, lldb::eDescriptionLevelBrief);
8357129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
836df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
837df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
838df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
839df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
840df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
841df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
842df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
843df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
844df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
845df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
846df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
847df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
848df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
849df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
850df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
851df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
852df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
853cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Claytonbool
854cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg ClaytonModule::FileHasChanged () const
855cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton{
856cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    if (m_file_has_changed == false)
857cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton        m_file_has_changed = (m_file.GetModificationTime() != m_mod_time);
858cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    return m_file_has_changed;
859cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton}
860cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton
861df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid
862df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...)
863df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
864cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    if (m_first_file_changed_log == false)
865df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
866cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton        if (FileHasChanged ())
867df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
868cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton            m_first_file_changed_log = true;
869cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton            if (format)
870df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            {
871cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                StreamString strm;
872cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PutCString("error: the object file ");
873cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                GetDescription(&strm, lldb::eDescriptionLevelFull);
874cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PutCString (" has been modified\n");
875cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton
876cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                va_list args;
877cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                va_start (args, format);
878cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PrintfVarArg(format, args);
879cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                va_end (args);
880cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton
881cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                const int format_len = strlen(format);
882cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                if (format_len > 0)
883cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                {
884cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                    const char last_char = format[format_len-1];
885cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                    if (last_char != '\n' || last_char != '\r')
886cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                        strm.EOL();
887cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                }
888cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
889cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
890df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            }
891df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
892df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
89375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
89475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
89575d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
89675d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...)
89775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
898df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
899df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
900df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
901df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("warning: ");
9027129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&strm, lldb::eDescriptionLevelFull);
9037129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
904df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
905df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
906df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
907df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
908df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
909df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
910df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
911df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
912df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
913df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
914df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
915df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
916df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
917df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
918df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
91975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
92075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
92175d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
92275d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...)
92375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
92475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (log)
92575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
92675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        StreamString log_message;
9277129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&log_message, lldb::eDescriptionLevelFull);
92875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PutCString (": ");
92975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_list args;
93075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_start (args, format);
93175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PrintfVarArg (format, args);
93275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_end (args);
93375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log->PutCString(log_message.GetString().c_str());
93475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
93575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
93675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
93773a35715708b65b1d96c1c8f439548bb0990df08Greg Claytonvoid
93873a35715708b65b1d96c1c8f439548bb0990df08Greg ClaytonModule::LogMessageVerboseBacktrace (Log *log, const char *format, ...)
93973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton{
94073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton    if (log)
94173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton    {
94273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        StreamString log_message;
94373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        GetDescription(&log_message, lldb::eDescriptionLevelFull);
94473a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        log_message.PutCString (": ");
94573a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        va_list args;
94673a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        va_start (args, format);
94773a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        log_message.PrintfVarArg (format, args);
94873a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        va_end (args);
94973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        if (log->GetVerbose())
95073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton            Host::Backtrace (log_message, 1024);
95173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        log->PutCString(log_message.GetString().c_str());
95273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton    }
95373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton}
95473a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton
95575d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s)
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
9593fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("Module %s/%s%s%s%s\n",
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetDirectory().AsCString(),
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetFilename().AsCString(),
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? "(" : "",
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? m_object_name.GetCString() : "",
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? ")" : "");
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        objfile->Dump(s);
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->Dump(s);
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList*
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList ()
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &symbols->GetTypeList();
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_object_name;
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile()
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
1002236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_objfile == false)
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1004236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton        m_did_load_objfile = true;
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer(__PRETTY_FUNCTION__,
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
1007cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        DataBufferSP data_sp;
1008cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        lldb::offset_t data_offset = 0;
1009cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(),
10103508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               &m_file,
10113508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_object_offset,
10123508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_file.GetByteSize(),
1013cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                               data_sp,
1014cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                               data_offset);
10156a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        if (m_objfile_sp)
10166a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        {
10176a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// Once we get the object file, update our module with the object file's
10186a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// architecture since it might differ in vendor/os if some parts were
10196a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// unknown.
10206a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton            m_objfile_sp->GetArchitecture (m_arch);
10216a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        }
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1023e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return m_objfile_sp.get();
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol *
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile();
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
10397c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_indices = symbol_indexes.size();
105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_indices > 0)
105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext (&sc);
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i = 0; i < num_indices; i++)
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.symbol)
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sc_list.Append (sc);
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
10642fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg ClaytonModule::FindFunctionSymbols (const ConstString &name,
10652fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                             uint32_t name_type_mask,
10662fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                             SymbolContextList& sc_list)
10672fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton{
10682fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__,
10692fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                       "Module::FindSymbolsFunctions (name = %s, mask = 0x%8.8x)",
10702fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                       name.AsCString(),
10712fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                       name_type_mask);
10722fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    ObjectFile *objfile = GetObjectFile ();
10732fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    if (objfile)
10742fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    {
10752fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton        Symtab *symtab = objfile->GetSymtab();
10762fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton        if (symtab)
10772fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton            return symtab->FindFunctionSymbols (name, name_type_mask, sc_list);
10782fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    }
10792fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    return 0;
10802fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton}
10812fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton
10822fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Claytonsize_t
1083aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       regex.GetText(),
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
112324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
112424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
112524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
11267c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
113224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue &
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mod_time;
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
11397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
11407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable ()
11417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
11427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (GetObjectFile() == NULL)
11437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
11447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
11457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return GetObjectFile()->IsExecutable();
11467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
11477508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
114851b11e06de746667396f56b303d1867f007baf8bJim Inghambool
114951b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target)
115051b11e06de746667396f56b303d1867f007baf8bJim Ingham{
115151b11e06de746667396f56b303d1867f007baf8bJim Ingham    ObjectFile *obj_file = GetObjectFile();
115251b11e06de746667396f56b303d1867f007baf8bJim Ingham    if (obj_file)
115351b11e06de746667396f56b303d1867f007baf8bJim Ingham    {
115451b11e06de746667396f56b303d1867f007baf8bJim Ingham        SectionList *sections = obj_file->GetSectionList();
115551b11e06de746667396f56b303d1867f007baf8bJim Ingham        if (sections != NULL)
115651b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
115751b11e06de746667396f56b303d1867f007baf8bJim Ingham            size_t num_sections = sections->GetSize();
115851b11e06de746667396f56b303d1867f007baf8bJim Ingham            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
115951b11e06de746667396f56b303d1867f007baf8bJim Ingham            {
116051b11e06de746667396f56b303d1867f007baf8bJim Ingham                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
116151b11e06de746667396f56b303d1867f007baf8bJim Ingham                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
116251b11e06de746667396f56b303d1867f007baf8bJim Ingham                {
116351b11e06de746667396f56b303d1867f007baf8bJim Ingham                    return true;
116451b11e06de746667396f56b303d1867f007baf8bJim Ingham                }
116551b11e06de746667396f56b303d1867f007baf8bJim Ingham            }
116651b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
116751b11e06de746667396f56b303d1867f007baf8bJim Ingham    }
116851b11e06de746667396f56b303d1867f007baf8bJim Ingham    return false;
116951b11e06de746667396f56b303d1867f007baf8bJim Ingham}
1170146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
1171146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool
1172146d9522c95c0c8c5409539813b55e08b99196eeEnrico GranataModule::LoadScriptingResourceInTarget (Target *target, Error& error)
1173146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{
1174146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    if (!target)
1175146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    {
1176146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        error.SetErrorString("invalid destination Target");
1177146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        return false;
1178146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    }
1179146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
1180d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton    Debugger &debugger = target->GetDebugger();
1181d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton    const ScriptLanguage script_language = debugger.GetScriptLanguage();
1182d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton    if (script_language != eScriptLanguageNone)
1183146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    {
1184d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton
1185d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        PlatformSP platform_sp(target->GetPlatform());
1186d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton
1187d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        if (!platform_sp)
1188d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        {
1189d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            error.SetErrorString("invalid Platform");
1190d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            return false;
1191d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        }
1192146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
1193146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        ScriptInterpreter *script_interpreter = debugger.GetCommandInterpreter().GetScriptInterpreter();
1194146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        if (script_interpreter)
1195146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        {
1196d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            FileSpecList file_specs = platform_sp->LocateExecutableScriptingResources (target,
1197d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                                                                                       *this);
1198d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton
1199d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton
1200d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            const uint32_t num_specs = file_specs.GetSize();
1201d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            if (num_specs)
1202d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            {
1203d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                for (uint32_t i=0; i<num_specs; ++i)
1204d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                {
1205d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    FileSpec scripting_fspec (file_specs.GetFileSpecAtIndex(i));
1206d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    if (scripting_fspec && scripting_fspec.Exists())
1207d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    {
1208d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton
1209d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        StreamString scripting_stream;
1210d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        scripting_fspec.Dump(&scripting_stream);
1211d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        const bool can_reload = false;
1212d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        const bool init_lldb_globals = false;
1213d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        bool did_load = script_interpreter->LoadScriptingModule(scripting_stream.GetData(), can_reload, init_lldb_globals, error);
1214d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        if (!did_load)
1215d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                            return false;
1216d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    }
1217d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                }
1218d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            }
1219146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        }
1220146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        else
1221146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        {
1222146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata            error.SetErrorString("invalid ScriptInterpreter");
1223146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata            return false;
1224146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        }
1225146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    }
1226146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    return true;
1227146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata}
1228146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
1229146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool
12307508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch)
12317508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
1232940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    if (!m_arch.IsValid())
12337508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
12347508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        m_arch = new_arch;
12357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
1236940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    }
123740e278caddf5442776f9408f20d757cc85fe630aSean Callanan    return m_arch.IsExactMatch(new_arch);
12387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
12397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
1240b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool
1241b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
1242b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
12439ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    size_t num_loaded_sections = 0;
12449ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    ObjectFile *objfile = GetObjectFile();
12459ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    if (objfile)
1246b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
12479ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton        SectionList *section_list = objfile->GetSectionList ();
1248b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (section_list)
1249b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
1250b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            const size_t num_sections = section_list->GetSize();
1251b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            size_t sect_idx = 0;
1252b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1253b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
1254b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // Iterate through the object file sections to find the
1255b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // first section that starts of file offset zero and that
1256b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // has bytes in the file...
1257545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
12589ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton                // Only load non-thread specific sections when given a slide
1259545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                if (section_sp && !section_sp->IsThreadSpecific())
1260b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                {
1261545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                    if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + offset))
12629ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton                        ++num_loaded_sections;
1263b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                }
1264b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
1265b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
1266b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
12679ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    changed = num_loaded_sections > 0;
12689ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    return num_loaded_sections > 0;
1269b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
1270b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
1271444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1272444fe998bf707bd076a70c3a779db8575533695eGreg Claytonbool
1273444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::MatchesModuleSpec (const ModuleSpec &module_ref)
1274444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{
1275444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const UUID &uuid = module_ref.GetUUID();
1276444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1277444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (uuid.IsValid())
1278444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1279444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        // If the UUID matches, then nothing more needs to match...
1280444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (uuid == GetUUID())
1281444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return true;
1282444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        else
1283444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1284444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1285444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1286444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const FileSpec &file_spec = module_ref.GetFileSpec();
1287444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (file_spec)
1288444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1289444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory()))
1290444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1291444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1292444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1293444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec();
1294444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (platform_file_spec)
1295444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
129658aa7152a7df8c9825c63026ec35c24759de948bGreg Clayton        if (!FileSpec::Equal (platform_file_spec, GetPlatformFileSpec (), platform_file_spec.GetDirectory()))
1297444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1298444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1299444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1300444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const ArchSpec &arch = module_ref.GetArchitecture();
1301444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (arch.IsValid())
1302444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
130340e278caddf5442776f9408f20d757cc85fe630aSean Callanan        if (!m_arch.IsCompatibleMatch(arch))
1304444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1305444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1306444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1307444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const ConstString &object_name = module_ref.GetObjectName();
1308444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (object_name)
1309444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1310444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (object_name != GetObjectName())
1311444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1312444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1313444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    return true;
1314444fe998bf707bd076a70c3a779db8575533695eGreg Clayton}
1315444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1316964deba8853eb794e59263322b59b09b43669618Greg Claytonbool
1317964deba8853eb794e59263322b59b09b43669618Greg ClaytonModule::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const
1318964deba8853eb794e59263322b59b09b43669618Greg Clayton{
1319964deba8853eb794e59263322b59b09b43669618Greg Clayton    Mutex::Locker locker (m_mutex);
1320964deba8853eb794e59263322b59b09b43669618Greg Clayton    return m_source_mappings.FindFile (orig_spec, new_spec);
1321964deba8853eb794e59263322b59b09b43669618Greg Clayton}
1322964deba8853eb794e59263322b59b09b43669618Greg Clayton
13232418fddf2e200c827da5bc6c855f3d4971b2d867Greg Claytonbool
13242418fddf2e200c827da5bc6c855f3d4971b2d867Greg ClaytonModule::RemapSourceFile (const char *path, std::string &new_path) const
13252418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton{
13262418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    Mutex::Locker locker (m_mutex);
13272418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    return m_source_mappings.RemapPath(path, new_path);
13282418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton}
13292418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton
1330ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granatauint32_t
1331ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico GranataModule::GetVersion (uint32_t *versions, uint32_t num_versions)
1332ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata{
1333ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    ObjectFile *obj_file = GetObjectFile();
1334ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    if (obj_file)
1335ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata        return obj_file->GetVersion (versions, num_versions);
1336ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata
1337ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    if (versions && num_versions)
1338ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    {
1339ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata        for (uint32_t i=0; i<num_versions; ++i)
1340ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata            versions[i] = UINT32_MAX;
1341ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    }
1342ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    return 0;
1343ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata}
1344