Module.cpp revision 13d24fb1817faa7ccc4cfd799113ba1a2b8968eb
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"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
16df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in
26899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection
27899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive
28899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection;
29899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
30899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection &
31899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection()
32899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
33b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // This module collection needs to live past any module, so we could either make it a
34b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // shared pointer in each module or just leak is.  Since it is only an empty vector by
35b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // the time all the modules have gone away, we just leak it for now.  If we decide this
36b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // is a big problem we can introduce a Finalize method that will tear everything down in
37b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // a predictable order.
38b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
39b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    static ModuleCollection *g_module_collection = NULL;
40b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    if (g_module_collection == NULL)
41b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham        g_module_collection = new ModuleCollection();
42b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
43b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    return *g_module_collection;
44899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
46c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex *
47899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex()
48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
49c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // NOTE: The mutex below must be leaked since the global module list in
50c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // the ModuleList class will get torn at some point, and we can't know
51c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // if it will tear itself down before the "g_module_collection_mutex" below
52c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // will. So we leak a Mutex object below to safeguard against that
53c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton
54c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    static Mutex *g_module_collection_mutex = NULL;
55c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    if (g_module_collection_mutex == NULL)
56c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton        g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
57c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    return g_module_collection_mutex;
58899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
59899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
60899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t
61899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules ()
62899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
63899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
64899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return GetModuleCollection().size();
65899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
66899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
67899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule *
68899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx)
69899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
70899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
71899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    ModuleCollection &modules = GetModuleCollection();
72899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    if (idx < modules.size())
73899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        return modules[idx];
74899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return NULL;
75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
7608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0
77899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
7808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that
7908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger.
8008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb {
81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
8208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
8308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    ClearModuleInfo (void)
8408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
8508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        ModuleList::RemoveOrphanSharedModules();
8608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
8708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
8808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
8908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    DumpModuleInfo (void)
9008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
9108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        ModuleCollection &modules = GetModuleCollection();
9308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        const size_t count = modules.size();
9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        printf ("%s: %zu modules:\n", __PRETTY_FUNCTION__, count);
9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        for (size_t i=0; i<count; ++i)
9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        {
9708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            StreamString strm;
9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            Module *module = modules[i];
10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
10108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            module->GetDescription(&strm, eDescriptionLevelFull);
10208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    module,
10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    in_shared_module_list,
10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    (uint32_t)module->use_count(),
10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    strm.GetString().c_str());
10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        }
10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton}
11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
11108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif
112899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
113899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) :
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time (file_spec.GetModificationTime()),
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_arch (arch),
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_uuid (),
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file (file_spec),
12024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_platform_file(),
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name (),
122b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_object_offset (object_offset),
123e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp (),
124236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_symfile_ap (),
125b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast (),
126236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_objfile (false),
127236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_symbol_vendor (false),
128236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_parse_uuid (false),
129b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_did_init_ast (false),
130df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_is_dynamic_loader_module (false),
131df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_was_modified (false)
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
133899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
134899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
135899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
136899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        GetModuleCollection().push_back(this);
137899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
138899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (object_name)
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_object_name = *object_name;
141e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
145940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module()
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
155899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
156899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
157899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
158899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection &modules = GetModuleCollection();
159899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator end = modules.end();
160899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
161899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        if (pos != end)
162899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton            modules.erase(pos);
163899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
164e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
168940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
174b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Release any auto pointers before we start tearing down our member
175b01000fd063629facd45044f137446fb748ee179Greg Clayton    // variables since the object file and symbol files might need to make
176b01000fd063629facd45044f137446fb748ee179Greg Clayton    // function calls back into this module object. The ordering is important
177b01000fd063629facd45044f137446fb748ee179Greg Clayton    // here because symbol files can require the module object file. So we tear
178b01000fd063629facd45044f137446fb748ee179Greg Clayton    // down the symbol file first, then the object file.
179b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_symfile_ap.reset();
180e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp.reset();
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1840467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID&
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID()
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
188236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_parse_uuid == false)
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile * obj_file = GetObjectFile ();
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            obj_file->GetUUID(&m_uuid);
195236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_parse_uuid = true;
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_uuid;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext &
202b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext ()
203b01000fd063629facd45044f137446fb748ee179Greg Clayton{
204b01000fd063629facd45044f137446fb748ee179Greg Clayton    Mutex::Locker locker (m_mutex);
205b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_did_init_ast == false)
206b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
207b01000fd063629facd45044f137446fb748ee179Greg Clayton        ObjectFile * objfile = GetObjectFile();
208395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        ArchSpec object_arch;
209395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        if (objfile && objfile->GetArchitecture(object_arch))
210b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
211b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_did_init_ast = true;
212395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            m_ast.SetArchitecture (object_arch);
213b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
214b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
215b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast;
216b01000fd063629facd45044f137446fb748ee179Greg Clayton}
217b01000fd063629facd45044f137446fb748ee179Greg Clayton
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols()
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits();
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_comp_units == 0)
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22602e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    SymbolContext sc;
22713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t cu_idx;
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit)
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseVariablesForContext(sc);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseCompileUnitFunctions(sc);
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t func_idx;
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseFunctionBlocks(sc);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Parse the variables for this function and all its blocks
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseVariablesForContext(sc);
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Parse all types for this compile unit
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseTypes(sc);
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc)
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc->module_sp = shared_from_this();
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
264c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule *
265c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule ()
266c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
267c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return this;
268c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
269c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s)
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2737e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf(", Module{%p}", this);
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits()
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->GetNumCompileUnits();
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index)
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits ();
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP cu_sp;
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index < num_comp_units)
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolVendor *symbols = GetSymbolVendor ();
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symbols)
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cu_sp = symbols->GetCompileUnitAtIndex(index);
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cu_sp;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile* ofile = GetObjectFile();
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ofile)
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the result symbol context in case we don't find anything
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc.Clear();
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the section from the section/offset address.
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Section *section = so_addr.GetSection();
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure the section matches this module before we try and match anything
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (section && section->GetModule() == this)
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If the section offset based address resolved itself, then this
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is the right module.
33113d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton        sc.module_sp = shared_from_this();
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        resolved_flags |= eSymbolContextModule;
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Resolve the compile unit, function, block, line table or line
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // entry if requested.
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (resolve_scope & eSymbolContextCompUnit    ||
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextFunction    ||
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextBlock       ||
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextLineEntry   )
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolVendor *symbols = GetSymbolVendor ();
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (symbols)
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
346bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
347bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFile* ofile = GetObjectFile();
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ofile)
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *symtab = ofile->GetSymtab();
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symtab)
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (so_addr.IsSectionOffset())
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sc.symbol)
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            resolved_flags |= eSymbolContextSymbol;
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
369537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath
370537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton(
371537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    const char *file_path,
372537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t line,
373537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    bool check_inlines,
374537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t resolve_scope,
375537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    SymbolContextList& sc_list
376537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton)
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
378537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    FileSpec file_spec(file_path, false);
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory().AsCString(""),
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory() ? "/" : "",
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetFilename().AsCString(""),
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       line,
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       check_inlines ? "yes" : "no",
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       resolve_scope);
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t initial_count = sc_list.GetSize();
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor  ();
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_count;
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
4063e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindGlobalVariables(const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables)
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
4100fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
423801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path,
424801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          bool append,
425801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          SymbolContextList &sc_list)
426801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
427801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    if (!append)
428801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc_list.Clear();
429801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
430801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t start_size = sc_list.GetSize();
431801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t num_compile_units = GetNumCompileUnits();
432801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SymbolContext sc;
43313d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
434801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const bool compare_directory = path.GetDirectory();
435801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    for (uint32_t i=0; i<num_compile_units; ++i)
436801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
437801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc.comp_unit = GetCompileUnitAtIndex(i).get();
438801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
439801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            sc_list.Append(sc);
440801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
441801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    return sc_list.GetSize() - start_size;
442801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
443801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
444801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t
4453e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name,
4463e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan                       const ClangNamespaceDecl *namespace_decl,
44728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       uint32_t name_type_mask,
44828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool include_symbols,
44928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
45028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
45328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
45428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
45528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
45628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
45728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Find all the functions (not symbols, but debug information functions...
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
4600fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        symbols->FindFunctions(name, namespace_decl, name_type_mask, append, sc_list);
46128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
46228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
46328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
46428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
46528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
46628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
46728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
46828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
46928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
47028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
47128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
47228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
47328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
47428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
47528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
476889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
47728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
47828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
47928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
48028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
481889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
48228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
48328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
48428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
48528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
48628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
48728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
49128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex,
49228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool include_symbols,
49328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
49428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
49728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
49828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
49928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
50028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
5039935a860350721f6bb32e841d89e1c25c07b98a7Jim Ingham        symbols->FindFunctions(regex, append, sc_list);
50428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
50528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
50628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
50728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
50828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
50928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
51028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
51128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
51228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
51328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
51428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
51528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
51628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
51728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
518889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
51928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
52028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
52128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
52228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
523889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
52428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
52528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
52628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
52728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
52828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
52928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5327aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t
5330fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananModule::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
5347aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{
5357aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
5367aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
5377aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    {
5387aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        SymbolVendor *symbols = GetSymbolVendor ();
5397aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        if (symbols)
5400fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
5417aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    }
5427aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    return 0;
5437aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton}
5447aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton
545979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// depending on implementation details, type lookup might fail because of
546979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// embedded spurious namespace:: prefixes. this call strips them, paying
547979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// attention to the fact that a type might have namespace'd type names as
548979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// arguments to templates, and those must not be stripped off
549979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatastatic const char*
550979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataStripTypeName(const char* name_cstr)
551979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
552cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen    // Protect against null c string.
553cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen    if (!name_cstr)
554cd186e5ef6dacca7bd4914e99ef6b7551b5e79e4Johnny Chen        return name_cstr;
555979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    const char* skip_namespace = strstr(name_cstr, "::");
556979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    const char* template_arg_char = strchr(name_cstr, '<');
557979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    while (skip_namespace != NULL)
558979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
559979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        if (template_arg_char != NULL &&
560979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go
561979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            break;
562979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        name_cstr = skip_namespace+2;
563979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        skip_namespace = strstr(name_cstr, "::");
564979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
565979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    return name_cstr;
566979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
567979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
568979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t
5693e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindTypes (const SymbolContext& sc,  const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, TypeList& types)
570979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
5710fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan    uint32_t retval = FindTypes_Impl(sc, name, namespace_decl, append, max_matches, types);
572979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
573979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (retval == 0)
574979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
575a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        const char *orig_name = name.GetCString();
576a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        const char *stripped = StripTypeName(orig_name);
577a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        // Only do this lookup if StripTypeName has stripped the name:
578a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        if (stripped != orig_name)
579a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham           return FindTypes_Impl(sc, ConstString(stripped), namespace_decl, append, max_matches, types);
580a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham        else
581a334c9d5f5a563bb55b424173c5c52b9295c11baJim Ingham            return 0;
582979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
583979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    else
584979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return retval;
585979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
586979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
587979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Timer scoped_timer(__PRETTY_FUNCTION__);
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolVendor *symbols = GetSymbolVendor ();
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (symbols)
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor*
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create)
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
603236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_symbol_vendor == false && can_create)
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *obj_file = GetObjectFile ();
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_symfile_ap.reset(SymbolVendor::FindPlugin(this));
610236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_load_symbol_vendor = true;
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symfile_ap.get();
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Container objects whose paths do not specify a file directly can call
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // this function to correct the file and object names.
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file = file;
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time = file.GetModificationTime();
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name = object_name;
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec&
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_arch;
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
63375d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level)
6347826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
6357826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Mutex::Locker locker (m_mutex);
6367826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
63775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level >= eDescriptionLevelFull)
63875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
63975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_arch.IsValid())
64075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->Printf("(%s) ", m_arch.GetArchitectureName());
64175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
6427826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
64375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level == eDescriptionLevelBrief)
64475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
64575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        const char *filename = m_file.GetFilename().GetCString();
64675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (filename)
64775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString (filename);
64875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
64975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    else
65075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
65175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        char path[PATH_MAX];
65275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_file.GetPath(path, sizeof(path)))
65375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString(path);
65475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
65549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
65649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    const char *object_name = m_object_name.GetCString();
65749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (object_name)
65849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        s->Printf("(%s)", object_name);
6597826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
6607826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
6617826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid
66275d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...)
66375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
664df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
665df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
666df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
667df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("error: ");
668df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        GetDescription(&strm, lldb::eDescriptionLevelBrief);
6697129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
670df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
671df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
672df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
673df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
674df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
675df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
676df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
677df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
678df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
679df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
680df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
681df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
682df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
683df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
684df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
685df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
686df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
687df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid
688df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...)
689df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
690df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (!GetModified(true) && GetModified(false))
691df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
692df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format)
693df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
694df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            StreamString strm;
695df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString("error: the object file ");
696df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            GetDescription(&strm, lldb::eDescriptionLevelFull);
697df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString (" has been modified\n");
698df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
699df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_list args;
700df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_start (args, format);
701df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PrintfVarArg(format, args);
702df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            va_end (args);
703df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
704df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const int format_len = strlen(format);
705df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (format_len > 0)
706df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            {
707df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                const char last_char = format[format_len-1];
708df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                if (last_char != '\n' || last_char != '\r')
709df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                    strm.EOL();
710df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            }
711df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
712df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
713df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
714df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
71575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
71675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
71775d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
71875d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...)
71975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
720df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
721df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
722df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
723df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("warning: ");
7247129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&strm, lldb::eDescriptionLevelFull);
7257129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
726df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
727df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
728df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
729df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
730df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
731df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
732df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
733df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
734df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
735df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
736df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
737df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
738df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
739df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
740df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
74175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
74275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
74375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
74475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...)
74575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
74675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (log)
74775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
74875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        StreamString log_message;
7497129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&log_message, lldb::eDescriptionLevelFull);
75075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PutCString (": ");
75175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_list args;
75275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_start (args, format);
75375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PrintfVarArg (format, args);
75475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_end (args);
75575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log->PutCString(log_message.GetString().c_str());
75675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
75775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
75875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
759df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool
760df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::GetModified (bool use_cached_only)
761df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
762df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (m_was_modified == false && use_cached_only == false)
763df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
764df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        TimeValue curr_mod_time (m_file.GetModificationTime());
765df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        m_was_modified = curr_mod_time != m_mod_time;
766df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
767df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    return m_was_modified;
768df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
769df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
770df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonbool
771df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::SetModified (bool b)
772df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
773df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    const bool prev_value = m_was_modified;
774df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_was_modified = b;
775df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    return prev_value;
776df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
777df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
778df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
77975d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s)
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
7833fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("Module %s/%s%s%s%s\n",
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetDirectory().AsCString(),
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetFilename().AsCString(),
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? "(" : "",
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? m_object_name.GetCString() : "",
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? ")" : "");
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        objfile->Dump(s);
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->Dump(s);
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList*
80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList ()
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &symbols->GetTypeList();
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_object_name;
82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile()
82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
826236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_objfile == false)
82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
828236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton        m_did_load_objfile = true;
82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer(__PRETTY_FUNCTION__,
83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
831db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton        DataBufferSP file_data_sp;
832db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton        m_objfile_sp = ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize(), file_data_sp);
8336a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        if (m_objfile_sp)
8346a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        {
8356a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// Once we get the object file, update our module with the object file's
8366a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// architecture since it might differ in vendor/os if some parts were
8376a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton			// unknown.
8386a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton            m_objfile_sp->GetArchitecture (m_arch);
8396a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        }
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
841e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return m_objfile_sp.get();
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol *
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile();
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
8577c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_indices = symbol_indexes.size();
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_indices > 0)
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext (&sc);
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i = 0; i < num_indices; i++)
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.symbol)
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sc_list.Append (sc);
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
882aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
88524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
91324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       regex.GetText(),
91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
91924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
92024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
92124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
92224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
92324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
92424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
9257c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
92624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
92724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
92824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
92924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue &
93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const
93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mod_time;
93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
9387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
9397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable ()
9407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
9417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (GetObjectFile() == NULL)
9427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
9437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
9447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return GetObjectFile()->IsExecutable();
9457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
9467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
94751b11e06de746667396f56b303d1867f007baf8bJim Inghambool
94851b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target)
94951b11e06de746667396f56b303d1867f007baf8bJim Ingham{
95051b11e06de746667396f56b303d1867f007baf8bJim Ingham    ObjectFile *obj_file = GetObjectFile();
95151b11e06de746667396f56b303d1867f007baf8bJim Ingham    if (obj_file)
95251b11e06de746667396f56b303d1867f007baf8bJim Ingham    {
95351b11e06de746667396f56b303d1867f007baf8bJim Ingham        SectionList *sections = obj_file->GetSectionList();
95451b11e06de746667396f56b303d1867f007baf8bJim Ingham        if (sections != NULL)
95551b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
95651b11e06de746667396f56b303d1867f007baf8bJim Ingham            size_t num_sections = sections->GetSize();
95751b11e06de746667396f56b303d1867f007baf8bJim Ingham            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
95851b11e06de746667396f56b303d1867f007baf8bJim Ingham            {
95951b11e06de746667396f56b303d1867f007baf8bJim Ingham                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
96051b11e06de746667396f56b303d1867f007baf8bJim Ingham                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
96151b11e06de746667396f56b303d1867f007baf8bJim Ingham                {
96251b11e06de746667396f56b303d1867f007baf8bJim Ingham                    return true;
96351b11e06de746667396f56b303d1867f007baf8bJim Ingham                }
96451b11e06de746667396f56b303d1867f007baf8bJim Ingham            }
96551b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
96651b11e06de746667396f56b303d1867f007baf8bJim Ingham    }
96751b11e06de746667396f56b303d1867f007baf8bJim Ingham    return false;
96851b11e06de746667396f56b303d1867f007baf8bJim Ingham}
9697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
9707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch)
9717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
972940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    if (!m_arch.IsValid())
9737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
9747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        m_arch = new_arch;
9757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
976940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    }
977940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    return m_arch == new_arch;
9787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
9797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
980