Module.cpp revision 860b9ea0038cdcea2dda00b1657f945363c96d00
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
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
11b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBuffer.h"
12b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBufferHeap.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
18df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
23b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h"
24b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Target.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in
30899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection
31899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive
32899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection;
33899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
34899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection &
35899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection()
36899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
37b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // This module collection needs to live past any module, so we could either make it a
38b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // shared pointer in each module or just leak is.  Since it is only an empty vector by
39b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // the time all the modules have gone away, we just leak it for now.  If we decide this
40b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // is a big problem we can introduce a Finalize method that will tear everything down in
41b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // a predictable order.
42b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
43b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    static ModuleCollection *g_module_collection = NULL;
44b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    if (g_module_collection == NULL)
45b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham        g_module_collection = new ModuleCollection();
46b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
47b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    return *g_module_collection;
48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
49899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
50c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex *
51899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex()
52899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
53c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // NOTE: The mutex below must be leaked since the global module list in
54c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // the ModuleList class will get torn at some point, and we can't know
55c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // if it will tear itself down before the "g_module_collection_mutex" below
56c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // will. So we leak a Mutex object below to safeguard against that
57c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton
58c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    static Mutex *g_module_collection_mutex = NULL;
59c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    if (g_module_collection_mutex == NULL)
60c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton        g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
61c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    return g_module_collection_mutex;
62899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
63899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
64899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t
65899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules ()
66899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
67899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
68899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return GetModuleCollection().size();
69899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
70899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
71899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule *
72899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx)
73899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
74899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    ModuleCollection &modules = GetModuleCollection();
76899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    if (idx < modules.size())
77899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        return modules[idx];
78899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return NULL;
79899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
8008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0
81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
8208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that
8308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger.
8408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb {
85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
8608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
8708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    ClearModuleInfo (void)
8808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
89860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton        const bool mandatory = true;
90860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton        ModuleList::RemoveOrphanSharedModules(mandatory);
9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    DumpModuleInfo (void)
9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        ModuleCollection &modules = GetModuleCollection();
9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        const size_t count = modules.size();
9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count);
10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        for (size_t i=0; i<count; ++i)
10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        {
10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            StreamString strm;
10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            Module *module = modules[i];
10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            module->GetDescription(&strm, eDescriptionLevelFull);
10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    module,
10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    in_shared_module_list,
11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    (uint32_t)module->use_count(),
11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    strm.GetString().c_str());
11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        }
11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton}
11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
11608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif
117899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
118444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::Module (const ModuleSpec &module_spec) :
119444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_mutex (Mutex::eMutexTypeRecursive),
120444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_mod_time (module_spec.GetFileSpec().GetModificationTime()),
121444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_arch (module_spec.GetArchitecture()),
122444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_uuid (),
123444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_file (module_spec.GetFileSpec()),
124444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_platform_file(module_spec.GetPlatformFileSpec()),
125444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_symfile_spec (module_spec.GetSymbolFileSpec()),
126444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_object_name (module_spec.GetObjectName()),
127444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_object_offset (module_spec.GetObjectOffset()),
128444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_objfile_sp (),
129444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_symfile_ap (),
130444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_ast (),
131964deba8853eb794e59263322b59b09b43669618Greg Clayton    m_source_mappings (),
132444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_load_objfile (false),
133444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_load_symbol_vendor (false),
134444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_parse_uuid (false),
135444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_init_ast (false),
136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_is_dynamic_loader_module (false),
137444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_was_modified (false)
138444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{
139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    // Scope for locker below...
140444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        GetModuleCollection().push_back(this);
143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
146444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (log)
147444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     this,
149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_arch.GetArchitectureName(),
150444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_file.GetDirectory().AsCString(""),
151444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_file.GetFilename().AsCString(""),
152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : "(",
153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : ")");
155444fe998bf707bd076a70c3a779db8575533695eGreg Clayton}
156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1573508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec,
1583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ArchSpec& arch,
1593508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ConstString *object_name,
1603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               off_t object_offset) :
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time (file_spec.GetModificationTime()),
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_arch (arch),
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_uuid (),
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file (file_spec),
16624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_platform_file(),
1673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    m_symfile_spec (),
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name (),
169b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_object_offset (object_offset),
170e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp (),
171236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_symfile_ap (),
172b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast (),
173964deba8853eb794e59263322b59b09b43669618Greg Clayton    m_source_mappings (),
174236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_objfile (false),
175236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_symbol_vendor (false),
176236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_parse_uuid (false),
177b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_did_init_ast (false),
178df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_is_dynamic_loader_module (false),
179df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_was_modified (false)
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
181899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
182899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
183899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
184899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        GetModuleCollection().push_back(this);
185899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
186899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (object_name)
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_object_name = *object_name;
189e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
193940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module()
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
203899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
204899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
205899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
206899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection &modules = GetModuleCollection();
207899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator end = modules.end();
208899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
209899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        if (pos != end)
210899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton            modules.erase(pos);
211899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
212e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
216940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
222b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Release any auto pointers before we start tearing down our member
223b01000fd063629facd45044f137446fb748ee179Greg Clayton    // variables since the object file and symbol files might need to make
224b01000fd063629facd45044f137446fb748ee179Greg Clayton    // function calls back into this module object. The ordering is important
225b01000fd063629facd45044f137446fb748ee179Greg Clayton    // here because symbol files can require the module object file. So we tear
226b01000fd063629facd45044f137446fb748ee179Greg Clayton    // down the symbol file first, then the object file.
227b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_symfile_ap.reset();
228e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp.reset();
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2316c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonObjectFile *
2326c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonModule::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error)
2336c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{
2346c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    if (m_objfile_sp)
2356c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    {
2366c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        error.SetErrorString ("object file already exists");
2376c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    }
2386c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    else
2396c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    {
2406c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        Mutex::Locker locker (m_mutex);
2416c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        if (process_sp)
2426c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        {
2436c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            StreamString s;
2446c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            if (m_file.GetFilename())
2456c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                s << m_file.GetFilename();
2466c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                s.Printf("[0x%16.16llx]", header_addr);
2476c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                m_file.GetFilename().SetCString (s.GetData());
2486c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            m_did_load_objfile = true;
2496c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0));
2506c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            Error readmem_error;
2516c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            const size_t bytes_read = process_sp->ReadMemory (header_addr,
2526c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              data_ap->GetBytes(),
2536c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              data_ap->GetByteSize(),
2546c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              readmem_error);
2556c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            if (bytes_read == 512)
2566c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            {
2576c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                DataBufferSP data_sp(data_ap.release());
2586c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp);
2596c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                if (m_objfile_sp)
2606c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                {
2616c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    // Once we get the object file, update our module with the object file's
2626c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    // architecture since it might differ in vendor/os if some parts were
2636c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    // unknown.
2646c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    m_objfile_sp->GetArchitecture (m_arch);
2656c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                }
2666c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                else
2676c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                {
2686c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    error.SetErrorString ("unable to find suitable object file plug-in");
2696c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                }
2706c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            }
2716c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            else
2726c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            {
2736c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString());
2746c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            }
2756c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        }
2766c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        else
2776c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        {
2786c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            error.SetErrorString ("invalid process");
2796c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        }
2806c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    }
2816c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    return m_objfile_sp.get();
2826c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton}
2836c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2850467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID&
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID()
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
289236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_parse_uuid == false)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile * obj_file = GetObjectFile ();
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            obj_file->GetUUID(&m_uuid);
296236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_parse_uuid = true;
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_uuid;
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
302b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext &
303b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext ()
304b01000fd063629facd45044f137446fb748ee179Greg Clayton{
305b01000fd063629facd45044f137446fb748ee179Greg Clayton    Mutex::Locker locker (m_mutex);
306b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_did_init_ast == false)
307b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
308b01000fd063629facd45044f137446fb748ee179Greg Clayton        ObjectFile * objfile = GetObjectFile();
309395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        ArchSpec object_arch;
310395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        if (objfile && objfile->GetArchitecture(object_arch))
311b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
312b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_did_init_ast = true;
313395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            m_ast.SetArchitecture (object_arch);
314b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
315b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
316b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast;
317b01000fd063629facd45044f137446fb748ee179Greg Clayton}
318b01000fd063629facd45044f137446fb748ee179Greg Clayton
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols()
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits();
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_comp_units == 0)
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32702e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    SymbolContext sc;
32813d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t cu_idx;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit)
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseVariablesForContext(sc);
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseCompileUnitFunctions(sc);
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t func_idx;
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseFunctionBlocks(sc);
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Parse the variables for this function and all its blocks
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseVariablesForContext(sc);
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Parse all types for this compile unit
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseTypes(sc);
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc)
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc->module_sp = shared_from_this();
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3653508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP
366c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule ()
367c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
3683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    return shared_from_this();
369c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
370c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s)
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3747e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf(", Module{%p}", this);
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits()
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->GetNumCompileUnits();
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index)
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits ();
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP cu_sp;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index < num_comp_units)
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolVendor *symbols = GetSymbolVendor ();
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symbols)
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cu_sp = symbols->GetCompileUnitAtIndex(index);
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cu_sp;
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile* ofile = GetObjectFile();
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ofile)
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the result symbol context in case we don't find anything
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc.Clear();
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the section from the section/offset address.
4253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    SectionSP section_sp (so_addr.GetSection());
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure the section matches this module before we try and match anything
4283508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    if (section_sp && section_sp->GetModule().get() == this)
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If the section offset based address resolved itself, then this
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is the right module.
43213d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton        sc.module_sp = shared_from_this();
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        resolved_flags |= eSymbolContextModule;
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Resolve the compile unit, function, block, line table or line
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // entry if requested.
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (resolve_scope & eSymbolContextCompUnit    ||
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextFunction    ||
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextBlock       ||
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextLineEntry   )
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolVendor *symbols = GetSymbolVendor ();
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (symbols)
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
447bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
448bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFile* ofile = GetObjectFile();
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ofile)
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *symtab = ofile->GetSymtab();
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symtab)
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (so_addr.IsSectionOffset())
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sc.symbol)
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            resolved_flags |= eSymbolContextSymbol;
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
470537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath
471537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton(
472537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    const char *file_path,
473537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t line,
474537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    bool check_inlines,
475537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t resolve_scope,
476537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    SymbolContextList& sc_list
477537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton)
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
479537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    FileSpec file_spec(file_path, false);
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory().AsCString(""),
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory() ? "/" : "",
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetFilename().AsCString(""),
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       line,
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       check_inlines ? "yes" : "no",
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       resolve_scope);
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t initial_count = sc_list.GetSize();
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor  ();
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_count;
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
5073e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
5110fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
524801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path,
525801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          bool append,
526801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          SymbolContextList &sc_list)
527801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
528801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    if (!append)
529801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc_list.Clear();
530801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
531801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t start_size = sc_list.GetSize();
532801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t num_compile_units = GetNumCompileUnits();
533801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SymbolContext sc;
53413d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
535801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const bool compare_directory = path.GetDirectory();
536801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    for (uint32_t i=0; i<num_compile_units; ++i)
537801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
538801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc.comp_unit = GetCompileUnitAtIndex(i).get();
539801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
540801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            sc_list.Append(sc);
541801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
542801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    return sc_list.GetSize() - start_size;
543801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
544801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
545801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t
5463e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name,
5473e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan                       const ClangNamespaceDecl *namespace_decl,
54828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       uint32_t name_type_mask,
549302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
550302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
55128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
55228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
55528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
55628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
55728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
55828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
55928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Find all the functions (not symbols, but debug information functions...
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
562302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
56328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
56428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
56528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
56628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
56728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
56828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
56928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
57028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
57128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
57228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
57328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
57428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
57528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
57628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
57728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
578889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
57928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
58028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
58128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
58228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
583889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
58428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
58528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
58628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
58728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
58828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
58928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
59328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex,
594302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
595302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
59628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
59728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
60028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
60128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
60228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
60328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
606302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        symbols->FindFunctions(regex, include_inlines, append, sc_list);
60728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
60828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
60928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
61028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
61128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
61228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
61328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
61428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
61528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
61628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
61728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
61828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
61928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
62028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
621889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
62228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
62328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
62428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
62528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
626889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
62728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
62828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
62928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
63028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
63128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
63228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6357aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t
636dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes_Impl (const SymbolContext& sc,
637dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        const ConstString &name,
638dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        const ClangNamespaceDecl *namespace_decl,
639dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        bool append,
640dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        uint32_t max_matches,
641dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        TypeList& types)
6427aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{
6437aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
6447aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
6457aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    {
6467aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        SymbolVendor *symbols = GetSymbolVendor ();
6477aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        if (symbols)
6480fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
6497aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    }
6507aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    return 0;
6517aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton}
6527aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton
653dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Claytonuint32_t
654dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypesInNamespace (const SymbolContext& sc,
655dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              const ConstString &type_name,
656dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              const ClangNamespaceDecl *namespace_decl,
657dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              uint32_t max_matches,
658dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              TypeList& type_list)
659979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
660dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const bool append = true;
661dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return FindTypes_Impl(sc, type_name, namespace_decl, append, max_matches, type_list);
662979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
663979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
664979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t
665dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes (const SymbolContext& sc,
666dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   const ConstString &name,
667dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   bool exact_match,
668dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   uint32_t max_matches,
669dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   TypeList& types)
670979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
671dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    uint32_t num_matches = 0;
672dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const char *type_name_cstr = name.GetCString();
673dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    std::string type_scope;
674dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    std::string type_basename;
675dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const bool append = true;
676dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename))
677979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
678dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // Check if "name" starts with "::" which means the qualified type starts
679dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // from the root namespace and implies and exact match. The typenames we
680dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // get back from clang do not start with "::" so we need to strip this off
681dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // in order to get the qualfied names to match
682dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
683dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (type_scope.size() >= 2 && type_scope[0] == ':' && type_scope[1] == ':')
684dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
685dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            type_scope.erase(0,2);
686dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            exact_match = true;
687dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
688dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        ConstString type_basename_const_str (type_basename.c_str());
689dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types))
690dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
691dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            types.RemoveMismatchedTypes (type_scope, type_basename, exact_match);
692dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            num_matches = types.GetSize();
693dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
694a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        else
695dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
696dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            types.Clear();
697dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
698979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
699979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    else
700dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    {
701dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // The type is not in a namespace/class scope, just search for it by basename
702dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types);
703dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    }
704dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
705dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return num_matches;
706979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
707979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
708979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Timer scoped_timer(__PRETTY_FUNCTION__);
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolVendor *symbols = GetSymbolVendor ();
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (symbols)
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor*
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create)
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
724236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_symbol_vendor == false && can_create)
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *obj_file = GetObjectFile ();
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
7303508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this()));
731236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_load_symbol_vendor = true;
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symfile_ap.get();
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Container objects whose paths do not specify a file directly can call
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // this function to correct the file and object names.
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file = file;
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time = file.GetModificationTime();
74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name = object_name;
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec&
74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_arch;
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
75475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level)
7557826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
7567826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Mutex::Locker locker (m_mutex);
7577826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
75875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level >= eDescriptionLevelFull)
75975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
76075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_arch.IsValid())
76175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->Printf("(%s) ", m_arch.GetArchitectureName());
76275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
7637826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
76475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level == eDescriptionLevelBrief)
76575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
76675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        const char *filename = m_file.GetFilename().GetCString();
76775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (filename)
76875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString (filename);
76975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
77075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    else
77175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
77275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        char path[PATH_MAX];
77375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_file.GetPath(path, sizeof(path)))
77475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString(path);
77575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
77649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
77749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    const char *object_name = m_object_name.GetCString();
77849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (object_name)
77949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        s->Printf("(%s)", object_name);
7807826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
7817826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
7827826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid
78375d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...)
78475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
785df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
786df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
787df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
788df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("error: ");
789df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        GetDescription(&strm, lldb::eDescriptionLevelBrief);
7907129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
791df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
792df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
793df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
794df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
795df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
796df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
797df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
798df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
799df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
800df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
801df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
802df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
803df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
804df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
805df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
806df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
807df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
808df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid
809df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...)
810df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
811df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (!GetModified(true) && GetModified(false))
812df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
813df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format)
814df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
815df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            StreamString strm;
816df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString("error: the object file ");
817df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            GetDescription(&strm, lldb::eDescriptionLevelFull);
818df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString (" has been modified\n");
819df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
820df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_list args;
821df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_start (args, format);
822df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PrintfVarArg(format, args);
823df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_end (args);
824df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
825df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const int format_len = strlen(format);
826df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (format_len > 0)
827df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            {
828df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                const char last_char = format[format_len-1];
829df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                if (last_char != '\n' || last_char != '\r')
830df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                    strm.EOL();
831df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            }
832df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
833df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
834df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
835df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
83675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
83775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
83875d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
83975d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...)
84075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
841df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
842df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
843df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
844df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("warning: ");
8457129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&strm, lldb::eDescriptionLevelFull);
8467129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
847df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
848df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
849df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
850df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
851df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
852df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
853df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
854df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
855df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
856df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
857df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
858df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
859df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
860df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
861df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
86275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
86375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
86475d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
86575d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...)
86675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
86775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (log)
86875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
86975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        StreamString log_message;
8707129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&log_message, lldb::eDescriptionLevelFull);
87175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PutCString (": ");
87275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_list args;
87375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_start (args, format);
87475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PrintfVarArg (format, args);
87575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_end (args);
87675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log->PutCString(log_message.GetString().c_str());
87775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
87875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
87975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
880df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool
881df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::GetModified (bool use_cached_only)
882df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
883df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (m_was_modified == false && use_cached_only == false)
884df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
885df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        TimeValue curr_mod_time (m_file.GetModificationTime());
886df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        m_was_modified = curr_mod_time != m_mod_time;
887df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
888df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    return m_was_modified;
889df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
890df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
891df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool
892df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::SetModified (bool b)
893df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
894df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    const bool prev_value = m_was_modified;
895df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_was_modified = b;
896df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    return prev_value;
897df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
898df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
899df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
90075d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s)
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
9043fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("Module %s/%s%s%s%s\n",
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetDirectory().AsCString(),
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetFilename().AsCString(),
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? "(" : "",
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? m_object_name.GetCString() : "",
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? ")" : "");
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        objfile->Dump(s);
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->Dump(s);
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList*
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList ()
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &symbols->GetTypeList();
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_object_name;
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile()
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
947236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_objfile == false)
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
949236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton        m_did_load_objfile = true;
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer(__PRETTY_FUNCTION__,
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
952db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton        DataBufferSP file_data_sp;
9533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(),
9543508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               &m_file,
9553508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_object_offset,
9563508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_file.GetByteSize(),
9573508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               file_data_sp);
9586a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        if (m_objfile_sp)
9596a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        {
9606a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// Once we get the object file, update our module with the object file's
9616a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// architecture since it might differ in vendor/os if some parts were
9626a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// unknown.
9636a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton            m_objfile_sp->GetArchitecture (m_arch);
9646a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        }
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
966e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return m_objfile_sp.get();
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol *
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile();
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
9827c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_indices = symbol_indexes.size();
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_indices > 0)
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext (&sc);
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i = 0; i < num_indices; i++)
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.symbol)
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sc_list.Append (sc);
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
1007aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
101924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       regex.GetText(),
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
10507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue &
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const
105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mod_time;
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10627508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
10637508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
10647508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable ()
10657508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
10667508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (GetObjectFile() == NULL)
10677508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
10687508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
10697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return GetObjectFile()->IsExecutable();
10707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
10717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
107251b11e06de746667396f56b303d1867f007baf8bJim Inghambool
107351b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target)
107451b11e06de746667396f56b303d1867f007baf8bJim Ingham{
107551b11e06de746667396f56b303d1867f007baf8bJim Ingham    ObjectFile *obj_file = GetObjectFile();
107651b11e06de746667396f56b303d1867f007baf8bJim Ingham    if (obj_file)
107751b11e06de746667396f56b303d1867f007baf8bJim Ingham    {
107851b11e06de746667396f56b303d1867f007baf8bJim Ingham        SectionList *sections = obj_file->GetSectionList();
107951b11e06de746667396f56b303d1867f007baf8bJim Ingham        if (sections != NULL)
108051b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
108151b11e06de746667396f56b303d1867f007baf8bJim Ingham            size_t num_sections = sections->GetSize();
108251b11e06de746667396f56b303d1867f007baf8bJim Ingham            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
108351b11e06de746667396f56b303d1867f007baf8bJim Ingham            {
108451b11e06de746667396f56b303d1867f007baf8bJim Ingham                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
108551b11e06de746667396f56b303d1867f007baf8bJim Ingham                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
108651b11e06de746667396f56b303d1867f007baf8bJim Ingham                {
108751b11e06de746667396f56b303d1867f007baf8bJim Ingham                    return true;
108851b11e06de746667396f56b303d1867f007baf8bJim Ingham                }
108951b11e06de746667396f56b303d1867f007baf8bJim Ingham            }
109051b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
109151b11e06de746667396f56b303d1867f007baf8bJim Ingham    }
109251b11e06de746667396f56b303d1867f007baf8bJim Ingham    return false;
109351b11e06de746667396f56b303d1867f007baf8bJim Ingham}
10947508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
10957508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch)
10967508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
1097940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    if (!m_arch.IsValid())
10987508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
10997508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        m_arch = new_arch;
11007508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
1101940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    }
1102940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    return m_arch == new_arch;
11037508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
11047508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
1105b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool
1106b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
1107b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
11089ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    size_t num_loaded_sections = 0;
11099ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    ObjectFile *objfile = GetObjectFile();
11109ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    if (objfile)
1111b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
11129ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton        SectionList *section_list = objfile->GetSectionList ();
1113b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (section_list)
1114b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
1115b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            const size_t num_sections = section_list->GetSize();
1116b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            size_t sect_idx = 0;
1117b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1118b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
1119b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // Iterate through the object file sections to find the
1120b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // first section that starts of file offset zero and that
1121b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // has bytes in the file...
1122b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                Section *section = section_list->GetSectionAtIndex (sect_idx).get();
11239ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton                // Only load non-thread specific sections when given a slide
11249ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton                if (section && !section->IsThreadSpecific())
1125b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                {
1126b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                    if (target.GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress() + offset))
11279ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton                        ++num_loaded_sections;
1128b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                }
1129b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
1130b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
1131b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
11329ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    changed = num_loaded_sections > 0;
11339ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    return num_loaded_sections > 0;
1134b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
1135b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
1136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1137444fe998bf707bd076a70c3a779db8575533695eGreg Claytonbool
1138444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::MatchesModuleSpec (const ModuleSpec &module_ref)
1139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{
1140444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const UUID &uuid = module_ref.GetUUID();
1141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (uuid.IsValid())
1143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1144444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        // If the UUID matches, then nothing more needs to match...
1145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (uuid == GetUUID())
1146444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return true;
1147444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        else
1148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1150444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1151444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const FileSpec &file_spec = module_ref.GetFileSpec();
1152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (file_spec)
1153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory()))
1155444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1157444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1158444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec();
1159444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (platform_file_spec)
1160444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1161444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (!FileSpec::Equal (platform_file_spec, m_platform_file, platform_file_spec.GetDirectory()))
1162444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1163444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1164444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1165444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const ArchSpec &arch = module_ref.GetArchitecture();
1166444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (arch.IsValid())
1167444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1168444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (m_arch != arch)
1169444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1170444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1171444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1172444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const ConstString &object_name = module_ref.GetObjectName();
1173444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (object_name)
1174444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1175444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (object_name != GetObjectName())
1176444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1177444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1178444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    return true;
1179444fe998bf707bd076a70c3a779db8575533695eGreg Clayton}
1180444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1181964deba8853eb794e59263322b59b09b43669618Greg Claytonbool
1182964deba8853eb794e59263322b59b09b43669618Greg ClaytonModule::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const
1183964deba8853eb794e59263322b59b09b43669618Greg Clayton{
1184964deba8853eb794e59263322b59b09b43669618Greg Clayton    Mutex::Locker locker (m_mutex);
1185964deba8853eb794e59263322b59b09b43669618Greg Clayton    return m_source_mappings.FindFile (orig_spec, new_spec);
1186964deba8853eb794e59263322b59b09b43669618Greg Clayton}
1187964deba8853eb794e59263322b59b09b43669618Greg Clayton
11882418fddf2e200c827da5bc6c855f3d4971b2d867Greg Claytonbool
11892418fddf2e200c827da5bc6c855f3d4971b2d867Greg ClaytonModule::RemapSourceFile (const char *path, std::string &new_path) const
11902418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton{
11912418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    Mutex::Locker locker (m_mutex);
11922418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    return m_source_mappings.RemapPath(path, new_path);
11932418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton}
11942418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton
1195