Module.cpp revision 3508c387c3f0c9ecc439d98048fd7694d41bab1b
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    {
8908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        ModuleList::RemoveOrphanSharedModules();
9008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    DumpModuleInfo (void)
9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        ModuleCollection &modules = GetModuleCollection();
9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        const size_t count = modules.size();
9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count);
9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        for (size_t i=0; i<count; ++i)
10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        {
10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            StreamString strm;
10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            Module *module = modules[i];
10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            module->GetDescription(&strm, eDescriptionLevelFull);
10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    module,
10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    in_shared_module_list,
10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    (uint32_t)module->use_count(),
11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    strm.GetString().c_str());
11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        }
11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton}
11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif
116899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
117899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
118b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::Module(const FileSpec& file_spec, const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) :
119b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_mutex (Mutex::eMutexTypeRecursive),
120b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_mod_time (),
121b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_arch (),
122b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_uuid (),
123b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_file (file_spec),
124b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_platform_file(),
1253508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    m_symfile_spec (),
126b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_object_name (),
127b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_object_offset (),
128b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_objfile_sp (),
129b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_symfile_ap (),
130b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_ast (),
131b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_did_load_objfile (false),
132b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_did_load_symbol_vendor (false),
133b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_did_parse_uuid (false),
134b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_did_init_ast (false),
135b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_is_dynamic_loader_module (false),
136b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_was_modified (false)
137b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
138b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    // Scope for locker below...
139b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
140b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
141b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        GetModuleCollection().push_back(this);
142b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
143b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    StreamString s;
144b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (m_file.GetFilename())
145b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        s << m_file.GetFilename();
146b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    s.Printf("[0x%16.16llx]", header_addr);
147b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    m_file.GetFilename().SetCString (s.GetData());
148b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    Mutex::Locker locker (m_mutex);
149b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    DataBufferSP data_sp;
150b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (process_sp)
151b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
152b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        m_did_load_objfile = true;
153b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        std::auto_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0));
154b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        Error error;
155b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        const size_t bytes_read = process_sp->ReadMemory (header_addr,
156b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                                          data_ap->GetBytes(),
157b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                                          data_ap->GetByteSize(),
158b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                                          error);
159b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (bytes_read == 512)
160b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
161b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            data_sp.reset (data_ap.release());
1623508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp);
163b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            if (m_objfile_sp)
164b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
165b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // Once we get the object file, update our module with the object file's
166b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // architecture since it might differ in vendor/os if some parts were
167b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // unknown.
168b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                m_objfile_sp->GetArchitecture (m_arch);
169b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
170b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
171b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
172b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
173b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
1743508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec,
1753508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ArchSpec& arch,
1763508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ConstString *object_name,
1773508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               off_t object_offset) :
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time (file_spec.GetModificationTime()),
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_arch (arch),
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_uuid (),
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file (file_spec),
18324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_platform_file(),
1843508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    m_symfile_spec (),
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name (),
186b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_object_offset (object_offset),
187e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp (),
188236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_symfile_ap (),
189b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast (),
190236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_objfile (false),
191236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_symbol_vendor (false),
192236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_parse_uuid (false),
193b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_did_init_ast (false),
194df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_is_dynamic_loader_module (false),
195df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_was_modified (false)
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
197899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
198899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
199899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
200899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        GetModuleCollection().push_back(this);
201899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
202899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (object_name)
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_object_name = *object_name;
205e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
209940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module()
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
219899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
220899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
221899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
222899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection &modules = GetModuleCollection();
223899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator end = modules.end();
224899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
225899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        if (pos != end)
226899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton            modules.erase(pos);
227899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
228e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
232940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
238b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Release any auto pointers before we start tearing down our member
239b01000fd063629facd45044f137446fb748ee179Greg Clayton    // variables since the object file and symbol files might need to make
240b01000fd063629facd45044f137446fb748ee179Greg Clayton    // function calls back into this module object. The ordering is important
241b01000fd063629facd45044f137446fb748ee179Greg Clayton    // here because symbol files can require the module object file. So we tear
242b01000fd063629facd45044f137446fb748ee179Greg Clayton    // down the symbol file first, then the object file.
243b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_symfile_ap.reset();
244e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp.reset();
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2480467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID&
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID()
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
252236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_parse_uuid == false)
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile * obj_file = GetObjectFile ();
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            obj_file->GetUUID(&m_uuid);
259236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_parse_uuid = true;
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_uuid;
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
265b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext &
266b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext ()
267b01000fd063629facd45044f137446fb748ee179Greg Clayton{
268b01000fd063629facd45044f137446fb748ee179Greg Clayton    Mutex::Locker locker (m_mutex);
269b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_did_init_ast == false)
270b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
271b01000fd063629facd45044f137446fb748ee179Greg Clayton        ObjectFile * objfile = GetObjectFile();
272395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        ArchSpec object_arch;
273395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        if (objfile && objfile->GetArchitecture(object_arch))
274b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
275b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_did_init_ast = true;
276395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            m_ast.SetArchitecture (object_arch);
277b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
278b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
279b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast;
280b01000fd063629facd45044f137446fb748ee179Greg Clayton}
281b01000fd063629facd45044f137446fb748ee179Greg Clayton
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols()
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits();
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_comp_units == 0)
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29002e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    SymbolContext sc;
29113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t cu_idx;
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit)
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseVariablesForContext(sc);
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseCompileUnitFunctions(sc);
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t func_idx;
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseFunctionBlocks(sc);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Parse the variables for this function and all its blocks
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseVariablesForContext(sc);
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Parse all types for this compile unit
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseTypes(sc);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc)
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
32513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc->module_sp = shared_from_this();
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3283508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP
329c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule ()
330c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
3313508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    return shared_from_this();
332c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
333c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s)
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3377e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf(", Module{%p}", this);
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits()
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->GetNumCompileUnits();
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index)
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits ();
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP cu_sp;
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index < num_comp_units)
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolVendor *symbols = GetSymbolVendor ();
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symbols)
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cu_sp = symbols->GetCompileUnitAtIndex(index);
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cu_sp;
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile* ofile = GetObjectFile();
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ofile)
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the result symbol context in case we don't find anything
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc.Clear();
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the section from the section/offset address.
3883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    SectionSP section_sp (so_addr.GetSection());
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure the section matches this module before we try and match anything
3913508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    if (section_sp && section_sp->GetModule().get() == this)
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If the section offset based address resolved itself, then this
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is the right module.
39513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton        sc.module_sp = shared_from_this();
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        resolved_flags |= eSymbolContextModule;
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Resolve the compile unit, function, block, line table or line
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // entry if requested.
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (resolve_scope & eSymbolContextCompUnit    ||
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextFunction    ||
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextBlock       ||
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextLineEntry   )
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolVendor *symbols = GetSymbolVendor ();
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (symbols)
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
410bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
411bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFile* ofile = GetObjectFile();
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ofile)
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *symtab = ofile->GetSymtab();
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symtab)
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (so_addr.IsSectionOffset())
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sc.symbol)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            resolved_flags |= eSymbolContextSymbol;
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
433537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath
434537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton(
435537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    const char *file_path,
436537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t line,
437537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    bool check_inlines,
438537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t resolve_scope,
439537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    SymbolContextList& sc_list
440537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton)
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
442537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    FileSpec file_spec(file_path, false);
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory().AsCString(""),
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory() ? "/" : "",
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetFilename().AsCString(""),
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       line,
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       check_inlines ? "yes" : "no",
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       resolve_scope);
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t initial_count = sc_list.GetSize();
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor  ();
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_count;
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
4703e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
4740fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
487801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path,
488801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          bool append,
489801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          SymbolContextList &sc_list)
490801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
491801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    if (!append)
492801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc_list.Clear();
493801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
494801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t start_size = sc_list.GetSize();
495801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t num_compile_units = GetNumCompileUnits();
496801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SymbolContext sc;
49713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
498801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const bool compare_directory = path.GetDirectory();
499801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    for (uint32_t i=0; i<num_compile_units; ++i)
500801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
501801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc.comp_unit = GetCompileUnitAtIndex(i).get();
502801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
503801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            sc_list.Append(sc);
504801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
505801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    return sc_list.GetSize() - start_size;
506801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
507801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
508801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t
5093e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name,
5103e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan                       const ClangNamespaceDecl *namespace_decl,
51128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       uint32_t name_type_mask,
512302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
513302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
51428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
51528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
51828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
51928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
52028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
52128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
52228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Find all the functions (not symbols, but debug information functions...
52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
525302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
52628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
52728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
52828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
52928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
53028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
53128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
53228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
53328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
53428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
53528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
53628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
53728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
53828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
53928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
54028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
541889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
54228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
54328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
54428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
54528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
546889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
54728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
54828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
54928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
55028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
55128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
55228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
55628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex,
557302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
558302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
55928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
56028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
56328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
56428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
56528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
56628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
569302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan        symbols->FindFunctions(regex, include_inlines, append, sc_list);
57028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
57128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
57228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
57328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
57428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
57528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
57628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
57728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
57828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
57928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
58028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
58128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
58228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
58328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
584889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
58528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
58628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
58728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
58828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
589889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
59028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
59128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
59228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
59328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
59428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
59528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5987aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t
5990fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananModule::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
6007aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{
6017aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
6027aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
6037aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    {
6047aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        SymbolVendor *symbols = GetSymbolVendor ();
6057aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        if (symbols)
6060fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
6077aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    }
6087aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    return 0;
6097aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton}
6107aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton
611979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// depending on implementation details, type lookup might fail because of
612979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// embedded spurious namespace:: prefixes. this call strips them, paying
613979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// attention to the fact that a type might have namespace'd type names as
614979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// arguments to templates, and those must not be stripped off
615979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatastatic const char*
616979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataStripTypeName(const char* name_cstr)
617979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
618cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen    // Protect against null c string.
619cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen    if (!name_cstr)
620cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen        return name_cstr;
621979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    const char* skip_namespace = strstr(name_cstr, "::");
622979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    const char* template_arg_char = strchr(name_cstr, '<');
623979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    while (skip_namespace != NULL)
624979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
625979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        if (template_arg_char != NULL &&
626979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go
627979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            break;
628979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        name_cstr = skip_namespace+2;
629979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        skip_namespace = strstr(name_cstr, "::");
630979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
631979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    return name_cstr;
632979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
633979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
634979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t
6353e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindTypes (const SymbolContext& sc,  const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
636979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
6370fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types);
638979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
639979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (retval == 0)
640979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
641a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        const char *orig_name = name.GetCString();
642a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        const char *stripped = StripTypeName(orig_name);
643a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        // Only do this lookup if StripTypeName has stripped the name:
644a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        if (stripped != orig_name)
645a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham           return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types);
646a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        else
647a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham            return 0;
648979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
649979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    else
650979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return retval;
651979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
652979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
653979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Timer scoped_timer(__PRETTY_FUNCTION__);
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolVendor *symbols = GetSymbolVendor ();
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (symbols)
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor*
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create)
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
669236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_symbol_vendor == false && can_create)
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *obj_file = GetObjectFile ();
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
6753508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton            m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this()));
676236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_load_symbol_vendor = true;
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symfile_ap.get();
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Container objects whose paths do not specify a file directly can call
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // this function to correct the file and object names.
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file = file;
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time = file.GetModificationTime();
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name = object_name;
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec&
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_arch;
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
69975d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level)
7007826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
7017826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Mutex::Locker locker (m_mutex);
7027826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
70375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level >= eDescriptionLevelFull)
70475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
70575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_arch.IsValid())
70675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->Printf("(%s) ", m_arch.GetArchitectureName());
70775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
7087826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
70975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level == eDescriptionLevelBrief)
71075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
71175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        const char *filename = m_file.GetFilename().GetCString();
71275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (filename)
71375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString (filename);
71475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
71575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    else
71675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
71775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        char path[PATH_MAX];
71875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_file.GetPath(path, sizeof(path)))
71975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString(path);
72075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
72149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
72249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    const char *object_name = m_object_name.GetCString();
72349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (object_name)
72449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        s->Printf("(%s)", object_name);
7257826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
7267826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
7277826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid
72875d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...)
72975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
730df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
731df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
732df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
733df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("error: ");
734df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        GetDescription(&strm, lldb::eDescriptionLevelBrief);
7357129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
736df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
737df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
738df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
739df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
740df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
741df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
742df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
743df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
744df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
745df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
746df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
747df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
748df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
749df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
750df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
751df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
752df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
753df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid
754df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...)
755df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
756df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (!GetModified(true) && GetModified(false))
757df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
758df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format)
759df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
760df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            StreamString strm;
761df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString("error: the object file ");
762df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            GetDescription(&strm, lldb::eDescriptionLevelFull);
763df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString (" has been modified\n");
764df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
765df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_list args;
766df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_start (args, format);
767df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PrintfVarArg(format, args);
768df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_end (args);
769df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
770df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const int format_len = strlen(format);
771df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (format_len > 0)
772df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            {
773df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                const char last_char = format[format_len-1];
774df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                if (last_char != '\n' || last_char != '\r')
775df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                    strm.EOL();
776df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            }
777df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
778df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
779df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
780df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
78175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
78275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
78375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
78475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...)
78575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
786df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
787df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
788df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
789df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("warning: ");
7907129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&strm, lldb::eDescriptionLevelFull);
7917129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
792df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
793df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
794df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
795df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
796df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
797df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
798df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
799df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
800df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
801df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
802df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
803df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
804df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
805df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
806df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
80775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
80875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
80975d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
81075d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...)
81175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
81275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (log)
81375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
81475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        StreamString log_message;
8157129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&log_message, lldb::eDescriptionLevelFull);
81675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PutCString (": ");
81775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_list args;
81875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_start (args, format);
81975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PrintfVarArg (format, args);
82075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_end (args);
82175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log->PutCString(log_message.GetString().c_str());
82275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
82375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
82475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
825df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool
826df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::GetModified (bool use_cached_only)
827df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
828df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (m_was_modified == false && use_cached_only == false)
829df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
830df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        TimeValue curr_mod_time (m_file.GetModificationTime());
831df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        m_was_modified = curr_mod_time != m_mod_time;
832df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
833df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    return m_was_modified;
834df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
835df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
836df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool
837df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::SetModified (bool b)
838df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
839df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    const bool prev_value = m_was_modified;
840df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_was_modified = b;
841df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    return prev_value;
842df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
843df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
844df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
84575d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s)
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
8493fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("Module %s/%s%s%s%s\n",
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetDirectory().AsCString(),
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetFilename().AsCString(),
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? "(" : "",
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? m_object_name.GetCString() : "",
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? ")" : "");
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        objfile->Dump(s);
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->Dump(s);
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList*
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList ()
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &symbols->GetTypeList();
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_object_name;
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile()
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
892236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_objfile == false)
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
894236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton        m_did_load_objfile = true;
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer(__PRETTY_FUNCTION__,
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
897db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton        DataBufferSP file_data_sp;
8983508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(),
8993508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               &m_file,
9003508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_object_offset,
9013508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_file.GetByteSize(),
9023508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               file_data_sp);
9036a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        if (m_objfile_sp)
9046a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        {
9056a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// Once we get the object file, update our module with the object file's
9066a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// architecture since it might differ in vendor/os if some parts were
9076a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// unknown.
9086a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton            m_objfile_sp->GetArchitecture (m_arch);
9096a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        }
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
911e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return m_objfile_sp.get();
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol *
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile();
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
92524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
9277c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_indices = symbol_indexes.size();
93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_indices > 0)
93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
94024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
94124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext (&sc);
94224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i = 0; i < num_indices; i++)
94324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
94424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.symbol)
94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sc_list.Append (sc);
94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
952aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       regex.GetText(),
98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
9957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue &
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mod_time;
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10077508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
10087508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
10097508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable ()
10107508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
10117508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (GetObjectFile() == NULL)
10127508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
10137508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
10147508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return GetObjectFile()->IsExecutable();
10157508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
10167508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
101751b11e06de746667396f56b303d1867f007baf8bJim Inghambool
101851b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target)
101951b11e06de746667396f56b303d1867f007baf8bJim Ingham{
102051b11e06de746667396f56b303d1867f007baf8bJim Ingham    ObjectFile *obj_file = GetObjectFile();
102151b11e06de746667396f56b303d1867f007baf8bJim Ingham    if (obj_file)
102251b11e06de746667396f56b303d1867f007baf8bJim Ingham    {
102351b11e06de746667396f56b303d1867f007baf8bJim Ingham        SectionList *sections = obj_file->GetSectionList();
102451b11e06de746667396f56b303d1867f007baf8bJim Ingham        if (sections != NULL)
102551b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
102651b11e06de746667396f56b303d1867f007baf8bJim Ingham            size_t num_sections = sections->GetSize();
102751b11e06de746667396f56b303d1867f007baf8bJim Ingham            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
102851b11e06de746667396f56b303d1867f007baf8bJim Ingham            {
102951b11e06de746667396f56b303d1867f007baf8bJim Ingham                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
103051b11e06de746667396f56b303d1867f007baf8bJim Ingham                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
103151b11e06de746667396f56b303d1867f007baf8bJim Ingham                {
103251b11e06de746667396f56b303d1867f007baf8bJim Ingham                    return true;
103351b11e06de746667396f56b303d1867f007baf8bJim Ingham                }
103451b11e06de746667396f56b303d1867f007baf8bJim Ingham            }
103551b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
103651b11e06de746667396f56b303d1867f007baf8bJim Ingham    }
103751b11e06de746667396f56b303d1867f007baf8bJim Ingham    return false;
103851b11e06de746667396f56b303d1867f007baf8bJim Ingham}
10397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
10407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch)
10417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
1042940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    if (!m_arch.IsValid())
10437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
10447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        m_arch = new_arch;
10457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
1046940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    }
1047940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    return m_arch == new_arch;
10487508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
10497508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
1050b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool
1051b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
1052b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
1053b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    changed = false;
1054b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    ObjectFile *image_object_file = GetObjectFile();
1055b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    if (image_object_file)
1056b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
1057b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        SectionList *section_list = image_object_file->GetSectionList ();
1058b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (section_list)
1059b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
1060b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            const size_t num_sections = section_list->GetSize();
1061b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            size_t sect_idx = 0;
1062b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1063b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
1064b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // Iterate through the object file sections to find the
1065b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // first section that starts of file offset zero and that
1066b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // has bytes in the file...
1067b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                Section *section = section_list->GetSectionAtIndex (sect_idx).get();
1068b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                if (section)
1069b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                {
1070b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                    if (target.GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress() + offset))
1071b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                        changed = true;
1072b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                }
1073b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
1074b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            return sect_idx > 0;
1075b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
1076b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
1077b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    return false;
1078b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
1079b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
1080