Module.cpp revision 02e210cad27e36108bef493b798c2c1eb3b04cb8
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"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in
24899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection
25899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive
26899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection;
27899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
28899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection &
29899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection()
30899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
31899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    static ModuleCollection g_module_collection;
32899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return g_module_collection;
33899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
34899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
35899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonMutex &
36899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex()
37899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
38899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    static Mutex g_module_collection_mutex(Mutex::eMutexTypeRecursive);
39899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return g_module_collection_mutex;
40899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
41899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
42899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t
43899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules ()
44899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
46899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return GetModuleCollection().size();
47899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
49899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule *
50899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx)
51899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
52899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
53899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    ModuleCollection &modules = GetModuleCollection();
54899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    if (idx < modules.size())
55899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        return modules[idx];
56899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return NULL;
57899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
58899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
59899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
60899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
61899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) :
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time (file_spec.GetModificationTime()),
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_arch (arch),
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_uuid (),
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file (file_spec),
6824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_platform_file(),
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name (),
70b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_object_offset (object_offset),
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_objfile_ap (),
72236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_symfile_ap (),
73b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast (),
74236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_objfile (false),
75236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_symbol_vendor (false),
76236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_parse_uuid (false),
77b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_did_init_ast (false),
78236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_is_dynamic_loader_module (false)
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
80899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
82899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
83899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        GetModuleCollection().push_back(this);
84899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (object_name)
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_object_name = *object_name;
88e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
92940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module()
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
102899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
103899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
104899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
105899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection &modules = GetModuleCollection();
106899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator end = modules.end();
107899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
108899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        if (pos != end)
109899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton            modules.erase(pos);
110899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
111e005f2ce03c489ebde9110678a29cbfe8488d5b4Greg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
115940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
121b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Release any auto pointers before we start tearing down our member
122b01000fd063629facd45044f137446fb748ee179Greg Clayton    // variables since the object file and symbol files might need to make
123b01000fd063629facd45044f137446fb748ee179Greg Clayton    // function calls back into this module object. The ordering is important
124b01000fd063629facd45044f137446fb748ee179Greg Clayton    // here because symbol files can require the module object file. So we tear
125b01000fd063629facd45044f137446fb748ee179Greg Clayton    // down the symbol file first, then the object file.
126b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_symfile_ap.reset();
127b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_objfile_ap.reset();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1310467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID&
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID()
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
135236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_parse_uuid == false)
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile * obj_file = GetObjectFile ();
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            obj_file->GetUUID(&m_uuid);
142236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_parse_uuid = true;
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_uuid;
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
148b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext &
149b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext ()
150b01000fd063629facd45044f137446fb748ee179Greg Clayton{
151b01000fd063629facd45044f137446fb748ee179Greg Clayton    Mutex::Locker locker (m_mutex);
152b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_did_init_ast == false)
153b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
154b01000fd063629facd45044f137446fb748ee179Greg Clayton        ObjectFile * objfile = GetObjectFile();
155395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        ArchSpec object_arch;
156395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        if (objfile && objfile->GetArchitecture(object_arch))
157b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
158b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_did_init_ast = true;
159395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            m_ast.SetArchitecture (object_arch);
160b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
161b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
162b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast;
163b01000fd063629facd45044f137446fb748ee179Greg Clayton}
164b01000fd063629facd45044f137446fb748ee179Greg Clayton
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols()
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits();
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_comp_units == 0)
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17302e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    SymbolContext sc;
17402e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    sc.module_sp = this;
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t cu_idx;
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit)
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseVariablesForContext(sc);
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseCompileUnitFunctions(sc);
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t func_idx;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseFunctionBlocks(sc);
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Parse the variables for this function and all its blocks
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseVariablesForContext(sc);
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Parse all types for this compile unit
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseTypes(sc);
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc)
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20802e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    sc->module_sp = this;
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
211c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule *
212c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule ()
213c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
214c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton    return this;
215c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
216c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s)
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf(", Module{0x%8.8x}", this);
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits()
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->GetNumCompileUnits();
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index)
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits ();
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP cu_sp;
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index < num_comp_units)
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolVendor *symbols = GetSymbolVendor ();
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symbols)
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cu_sp = symbols->GetCompileUnitAtIndex(index);
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cu_sp;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile* ofile = GetObjectFile();
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ofile)
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the result symbol context in case we don't find anything
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc.Clear();
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the section from the section/offset address.
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Section *section = so_addr.GetSection();
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure the section matches this module before we try and match anything
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (section && section->GetModule() == this)
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If the section offset based address resolved itself, then this
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is the right module.
27802e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton        sc.module_sp = this;
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        resolved_flags |= eSymbolContextModule;
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Resolve the compile unit, function, block, line table or line
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // entry if requested.
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (resolve_scope & eSymbolContextCompUnit    ||
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextFunction    ||
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextBlock       ||
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextLineEntry   )
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolVendor *symbols = GetSymbolVendor ();
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (symbols)
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
293bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
294bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFile* ofile = GetObjectFile();
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ofile)
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *symtab = ofile->GetSymtab();
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symtab)
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (so_addr.IsSectionOffset())
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sc.symbol)
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            resolved_flags |= eSymbolContextSymbol;
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
316537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath
317537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton(
318537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    const char *file_path,
319537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t line,
320537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    bool check_inlines,
321537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t resolve_scope,
322537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    SymbolContextList& sc_list
323537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton)
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
325537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    FileSpec file_spec(file_path, false);
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory().AsCString(""),
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory() ? "/" : "",
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetFilename().AsCString(""),
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       line,
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       check_inlines ? "yes" : "no",
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       resolve_scope);
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t initial_count = sc_list.GetSize();
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor  ();
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_count;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables)
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(name, append, max_matches, variables);
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
370801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path,
371801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          bool append,
372801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          SymbolContextList &sc_list)
373801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
374801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    if (!append)
375801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc_list.Clear();
376801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
377801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t start_size = sc_list.GetSize();
378801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const uint32_t num_compile_units = GetNumCompileUnits();
379801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SymbolContext sc;
38002e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    sc.module_sp = this;
381801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const bool compare_directory = path.GetDirectory();
382801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    for (uint32_t i=0; i<num_compile_units; ++i)
383801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
384801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc.comp_unit = GetCompileUnitAtIndex(i).get();
385801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
386801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton            sc_list.Append(sc);
387801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
388801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    return sc_list.GetSize() - start_size;
389801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
390801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
391801417e453f8531ac176cd952200587bf15d9ccfGreg Claytonuint32_t
39228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const ConstString &name,
39328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       uint32_t name_type_mask,
39428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool include_symbols,
39528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
39628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
39928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
40028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
40128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
40228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
40328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Find all the functions (not symbols, but debug information functions...
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
40628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        symbols->FindFunctions(name, name_type_mask, append, sc_list);
40728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
40828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
40928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
41028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
41128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
41228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
41328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
41428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
41528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
41628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
41728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
41828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
41928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
42028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
42128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
422889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
42328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
42428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
42528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
42628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
427889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
42828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
42928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
43028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
43128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
43228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
43328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
43728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex,
43828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool include_symbols,
43928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
44028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
44328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
44428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
44528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    const uint32_t start_size = sc_list.GetSize();
44628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
4499935a860350721f6bb32e841d89e1c25c07b98a7Jim Ingham        symbols->FindFunctions(regex, append, sc_list);
45028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Now check our symbol table for symbols that are code symbols if requested
45128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (include_symbols)
45228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
45328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        ObjectFile *objfile = GetObjectFile();
45428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        if (objfile)
45528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
45628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            Symtab *symtab = objfile->GetSymtab();
45728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
45828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
45928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
46028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
46128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                const uint32_t num_matches = symbol_indexes.size();
46228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
46328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
464889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                    const bool merge_symbol_into_function = true;
46528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
46628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    for (uint32_t i=0; i<num_matches; i++)
46728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
46828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                        sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
469889fbd0581c24523642e0a04d659cc8f3dcdb4edGreg Clayton                        sc_list.AppendIfUnique (sc, merge_symbol_into_function);
47028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
47128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
47228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
47328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
47428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
47528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4787aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t
479979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataModule::FindTypes_Impl (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
4807aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{
4817aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
4827aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
4837aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    {
4847aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        SymbolVendor *symbols = GetSymbolVendor ();
4857aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        if (symbols)
4867aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton            return symbols->FindTypes(sc, name, append, max_matches, types);
4877aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    }
4887aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    return 0;
4897aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton}
4907aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton
491979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// depending on implementation details, type lookup might fail because of
492979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// embedded spurious namespace:: prefixes. this call strips them, paying
493979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// attention to the fact that a type might have namespace'd type names as
494979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata// arguments to templates, and those must not be stripped off
495979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatastatic const char*
496979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataStripTypeName(const char* name_cstr)
497979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
498979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    const char* skip_namespace = strstr(name_cstr, "::");
499979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    const char* template_arg_char = strchr(name_cstr, '<');
500979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    while (skip_namespace != NULL)
501979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
502979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        if (template_arg_char != NULL &&
503979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            skip_namespace > template_arg_char) // but namespace'd template arguments are still good to go
504979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata            break;
505979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        name_cstr = skip_namespace+2;
506979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        skip_namespace = strstr(name_cstr, "::");
507979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
508979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    return name_cstr;
509979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
510979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
511979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granatauint32_t
512979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico GranataModule::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
513979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
514979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    uint32_t retval = FindTypes_Impl(sc, name, append, max_matches, types);
515979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
516979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    if (retval == 0)
517979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
518979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        const char *stripped = StripTypeName(name.GetCString());
519979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return FindTypes_Impl(sc, ConstString(stripped), append, max_matches, types);
520979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
521979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    else
522979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata        return retval;
523979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
524979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
525979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Timer scoped_timer(__PRETTY_FUNCTION__);
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolVendor *symbols = GetSymbolVendor ();
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (symbols)
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor*
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create)
53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
541236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_symbol_vendor == false && can_create)
54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *obj_file = GetObjectFile ();
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_symfile_ap.reset(SymbolVendor::FindPlugin(this));
548236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_load_symbol_vendor = true;
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symfile_ap.get();
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Container objects whose paths do not specify a file directly can call
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // this function to correct the file and object names.
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file = file;
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time = file.GetModificationTime();
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name = object_name;
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec&
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const
56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_arch;
56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
5717826c8894803dc729f29789ebc038956a94d3e7aCaroline TiceModule::GetDescription (Stream *s)
5727826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
5737826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Mutex::Locker locker (m_mutex);
5747826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
57549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (m_arch.IsValid())
576940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton        s->Printf("(%s) ", m_arch.GetArchitectureName());
5777826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
57849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    char path[PATH_MAX];
57949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (m_file.GetPath(path, sizeof(path)))
58049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        s->PutCString(path);
58149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
58249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    const char *object_name = m_object_name.GetCString();
58349ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (object_name)
58449ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        s->Printf("(%s)", object_name);
5857826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
5867826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
5877826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s)
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
5913fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("Module %s/%s%s%s%s\n",
59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetDirectory().AsCString(),
59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetFilename().AsCString(),
59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? "(" : "",
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? m_object_name.GetCString() : "",
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? ")" : "");
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        objfile->Dump(s);
60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->Dump(s);
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList*
61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList ()
61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &symbols->GetTypeList();
62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_object_name;
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile()
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
634236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_objfile == false)
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
636236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton        m_did_load_objfile = true;
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer(__PRETTY_FUNCTION__,
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
639b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        m_objfile_ap.reset(ObjectFile::FindPlugin(this, &m_file, m_object_offset, m_file.GetByteSize()));
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_objfile_ap.get();
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol *
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile();
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
6577c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_indices = symbol_indexes.size();
66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_indices > 0)
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext (&sc);
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i = 0; i < num_indices; i++)
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.symbol)
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sc_list.Append (sc);
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       regex.GetText(),
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
7257c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue &
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mod_time;
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
7387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
7397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable ()
7407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
7417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (GetObjectFile() == NULL)
7427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
7437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
7447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return GetObjectFile()->IsExecutable();
7457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
7467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
74751b11e06de746667396f56b303d1867f007baf8bJim Inghambool
74851b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target)
74951b11e06de746667396f56b303d1867f007baf8bJim Ingham{
75051b11e06de746667396f56b303d1867f007baf8bJim Ingham    ObjectFile *obj_file = GetObjectFile();
75151b11e06de746667396f56b303d1867f007baf8bJim Ingham    if (obj_file)
75251b11e06de746667396f56b303d1867f007baf8bJim Ingham    {
75351b11e06de746667396f56b303d1867f007baf8bJim Ingham        SectionList *sections = obj_file->GetSectionList();
75451b11e06de746667396f56b303d1867f007baf8bJim Ingham        if (sections != NULL)
75551b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
75651b11e06de746667396f56b303d1867f007baf8bJim Ingham            size_t num_sections = sections->GetSize();
75751b11e06de746667396f56b303d1867f007baf8bJim Ingham            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
75851b11e06de746667396f56b303d1867f007baf8bJim Ingham            {
75951b11e06de746667396f56b303d1867f007baf8bJim Ingham                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
76051b11e06de746667396f56b303d1867f007baf8bJim Ingham                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
76151b11e06de746667396f56b303d1867f007baf8bJim Ingham                {
76251b11e06de746667396f56b303d1867f007baf8bJim Ingham                    return true;
76351b11e06de746667396f56b303d1867f007baf8bJim Ingham                }
76451b11e06de746667396f56b303d1867f007baf8bJim Ingham            }
76551b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
76651b11e06de746667396f56b303d1867f007baf8bJim Ingham    }
76751b11e06de746667396f56b303d1867f007baf8bJim Ingham    return false;
76851b11e06de746667396f56b303d1867f007baf8bJim Ingham}
7697508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
7707508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch)
7717508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
772940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    if (!m_arch.IsValid())
7737508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
7747508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        m_arch = new_arch;
7757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
776940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    }
777940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    return m_arch == new_arch;
7787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
7797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
780