Module.cpp revision a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Module.cpp ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
12146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Core/Error.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
14b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBuffer.h"
15b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Core/DataBufferHeap.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h"
2175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton#include "lldb/Core/StreamString.h"
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
23df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton#include "lldb/Host/Host.h"
24146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Host/Symbols.h"
25146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Interpreter/CommandInterpreter.h"
26146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata#include "lldb/Interpreter/ScriptInterpreter.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
32296b06d325413723f5aac5988eed977b278a7807Greg Clayton#include "lldb/Target/CPPLanguageRuntime.h"
33296b06d325413723f5aac5988eed977b278a7807Greg Clayton#include "lldb/Target/ObjCLanguageRuntime.h"
34b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Process.h"
35b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton#include "lldb/Target/Target.h"
36a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain#include "lldb/Symbol/SymbolFile.h"
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// Shared pointers to modules track module lifetimes in
42899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// targets and in the global module, but this collection
43899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton// will track all module objects that are still alive
44899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytontypedef std::vector<Module *> ModuleCollection;
45899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
46899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonstatic ModuleCollection &
47899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonGetModuleCollection()
48899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
49b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // This module collection needs to live past any module, so we could either make it a
50b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // shared pointer in each module or just leak is.  Since it is only an empty vector by
51b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // the time all the modules have gone away, we just leak it for now.  If we decide this
52b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // is a big problem we can introduce a Finalize method that will tear everything down in
53b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    // a predictable order.
54b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
55b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    static ModuleCollection *g_module_collection = NULL;
56b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    if (g_module_collection == NULL)
57b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham        g_module_collection = new ModuleCollection();
58b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham
59b67c2a2f2a75fdba552a0eda0bf80df2095caa05Jim Ingham    return *g_module_collection;
60899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
61899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
62c149c8b3a88e5c8a94febdf956551e378c531797Greg ClaytonMutex *
63899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocationModuleCollectionMutex()
64899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
65c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // NOTE: The mutex below must be leaked since the global module list in
66c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // the ModuleList class will get torn at some point, and we can't know
67c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // if it will tear itself down before the "g_module_collection_mutex" below
68c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    // will. So we leak a Mutex object below to safeguard against that
69c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton
70c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    static Mutex *g_module_collection_mutex = NULL;
71c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    if (g_module_collection_mutex == NULL)
72c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton        g_module_collection_mutex = new Mutex (Mutex::eMutexTypeRecursive); // NOTE: known leak
73c149c8b3a88e5c8a94febdf956551e378c531797Greg Clayton    return g_module_collection_mutex;
74899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
75899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
76899025fb72c0430e3b02746ca11c9070e9ede951Greg Claytonsize_t
77899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetNumberAllocatedModules ()
78899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
79899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
80899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return GetModuleCollection().size();
81899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
82899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
83899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule *
84899025fb72c0430e3b02746ca11c9070e9ede951Greg ClaytonModule::GetAllocatedModuleAtIndex (size_t idx)
85899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton{
86899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    Mutex::Locker locker (GetAllocationModuleCollectionMutex());
87899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    ModuleCollection &modules = GetModuleCollection();
88899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    if (idx < modules.size())
89899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        return modules[idx];
90899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    return NULL;
91899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton}
9208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#if 0
93899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
9408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// These functions help us to determine if modules are still loaded, yet don't require that
9508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton// you have a command interpreter and can easily be called from an external debugger.
9608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Claytonnamespace lldb {
97899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
9808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
9908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    ClearModuleInfo (void)
10008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
101860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton        const bool mandatory = true;
102860b9ea0038cdcea2dda00b1657f945363c96d00Greg Clayton        ModuleList::RemoveOrphanSharedModules(mandatory);
10308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
10408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
10508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    void
10608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    DumpModuleInfo (void)
10708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    {
10808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        Mutex::Locker locker (Module::GetAllocationModuleCollectionMutex());
10908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        ModuleCollection &modules = GetModuleCollection();
11008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        const size_t count = modules.size();
1115f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea        printf ("%s: %" PRIu64 " modules:\n", __PRETTY_FUNCTION__, (uint64_t)count);
11208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        for (size_t i=0; i<count; ++i)
11308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        {
11408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
11508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            StreamString strm;
11608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            Module *module = modules[i];
11708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            const bool in_shared_module_list = ModuleList::ModuleIsInCache (module);
11808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            module->GetDescription(&strm, eDescriptionLevelFull);
11908205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton            printf ("%p: shared = %i, ref_count = %3u, module = %s\n",
12008205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    module,
12108205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    in_shared_module_list,
12208205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    (uint32_t)module->use_count(),
12308205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton                    strm.GetString().c_str());
12408205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton        }
12508205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton    }
12608205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton}
12708205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton
12808205a649cf8a94477f7f9ab8e42dd95ebfc9626Greg Clayton#endif
129f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton
130444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::Module (const ModuleSpec &module_spec) :
131444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_mutex (Mutex::eMutexTypeRecursive),
132444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_mod_time (module_spec.GetFileSpec().GetModificationTime()),
133444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_arch (module_spec.GetArchitecture()),
134444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_uuid (),
135444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_file (module_spec.GetFileSpec()),
136444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_platform_file(module_spec.GetPlatformFileSpec()),
137444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_symfile_spec (module_spec.GetSymbolFileSpec()),
138444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_object_name (module_spec.GetObjectName()),
139444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_object_offset (module_spec.GetObjectOffset()),
1400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    m_object_mod_time (module_spec.GetObjectModificationTime()),
141444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_objfile_sp (),
142444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_symfile_ap (),
143444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_ast (),
144964deba8853eb794e59263322b59b09b43669618Greg Clayton    m_source_mappings (),
145444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_load_objfile (false),
146444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_load_symbol_vendor (false),
147444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_parse_uuid (false),
148444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_did_init_ast (false),
149444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    m_is_dynamic_loader_module (false),
150cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_file_has_changed (false),
151cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_first_file_changed_log (false)
152444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{
153444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    // Scope for locker below...
154444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
155444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
156444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        GetModuleCollection().push_back(this);
157444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
158444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
159952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
160444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (log)
16197a19b21dacd9063bb5475812df7781777262198Greg Clayton        log->Printf ("%p Module::Module((%s) '%s%s%s%s')",
162444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     this,
163444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_arch.GetArchitectureName(),
16497a19b21dacd9063bb5475812df7781777262198Greg Clayton                     m_file.GetPath().c_str(),
165444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : "(",
166444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
167444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                     m_object_name.IsEmpty() ? "" : ")");
168444fe998bf707bd076a70c3a779db8575533695eGreg Clayton}
169444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1703508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModule::Module(const FileSpec& file_spec,
1713508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ArchSpec& arch,
1723508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton               const ConstString *object_name,
1730e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton               off_t object_offset,
1740e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton               const TimeValue *object_mod_time_ptr) :
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time (file_spec.GetModificationTime()),
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_arch (arch),
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_uuid (),
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file (file_spec),
18024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    m_platform_file(),
1813508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    m_symfile_spec (),
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name (),
183b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_object_offset (object_offset),
1840e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    m_object_mod_time (),
185e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp (),
186236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_symfile_ap (),
187b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_ast (),
188964deba8853eb794e59263322b59b09b43669618Greg Clayton    m_source_mappings (),
189236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_objfile (false),
190236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_load_symbol_vendor (false),
191236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    m_did_parse_uuid (false),
192b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_did_init_ast (false),
193df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    m_is_dynamic_loader_module (false),
194cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_file_has_changed (false),
195cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    m_first_file_changed_log (false)
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
197899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
198899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
199899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
200899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        GetModuleCollection().push_back(this);
201899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
202899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (object_name)
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_object_name = *object_name;
2050e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
2060e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    if (object_mod_time_ptr)
2070e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton        m_object_mod_time = *object_mod_time_ptr;
2080e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton
209952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
21197a19b21dacd9063bb5475812df7781777262198Greg Clayton        log->Printf ("%p Module::Module((%s) '%s%s%s%s')",
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
213940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
21497a19b21dacd9063bb5475812df7781777262198Greg Clayton                     m_file.GetPath().c_str(),
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module()
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
222a8aa5aba2497ba4e49295b6c2acb68975ed8406eGreg Clayton    // Lock our module down while we tear everything down to make sure
223a8aa5aba2497ba4e49295b6c2acb68975ed8406eGreg Clayton    // we don't get any access to the module while it is being destroyed
224a8aa5aba2497ba4e49295b6c2acb68975ed8406eGreg Clayton    Mutex::Locker locker (m_mutex);
225899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    // Scope for locker below...
226899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    {
227899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        Mutex::Locker locker (GetAllocationModuleCollectionMutex());
228899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection &modules = GetModuleCollection();
229899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator end = modules.end();
230899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton        ModuleCollection::iterator pos = std::find(modules.begin(), end, this);
231f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton        assert (pos != end);
232f737d372a9672c9feaedf4b2cd7b16e31357d38eGreg Clayton        modules.erase(pos);
233899025fb72c0430e3b02746ca11c9070e9ede951Greg Clayton    }
234952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_OBJECT|LIBLLDB_LOG_MODULES));
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
23697a19b21dacd9063bb5475812df7781777262198Greg Clayton        log->Printf ("%p Module::~Module((%s) '%s%s%s%s')",
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
238940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton                     m_arch.GetArchitectureName(),
23997a19b21dacd9063bb5475812df7781777262198Greg Clayton                     m_file.GetPath().c_str(),
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
243b01000fd063629facd45044f137446fb748ee179Greg Clayton    // Release any auto pointers before we start tearing down our member
244b01000fd063629facd45044f137446fb748ee179Greg Clayton    // variables since the object file and symbol files might need to make
245b01000fd063629facd45044f137446fb748ee179Greg Clayton    // function calls back into this module object. The ordering is important
246b01000fd063629facd45044f137446fb748ee179Greg Clayton    // here because symbol files can require the module object file. So we tear
247b01000fd063629facd45044f137446fb748ee179Greg Clayton    // down the symbol file first, then the object file.
248a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    m_unified_sections_ap.reset();
249b01000fd063629facd45044f137446fb748ee179Greg Clayton    m_symfile_ap.reset();
250e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    m_objfile_sp.reset();
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2536c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonObjectFile *
2546c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg ClaytonModule::GetMemoryObjectFile (const lldb::ProcessSP &process_sp, lldb::addr_t header_addr, Error &error)
2556c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton{
2566c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    if (m_objfile_sp)
2576c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    {
2586c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        error.SetErrorString ("object file already exists");
2596c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    }
2606c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    else
2616c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    {
2626c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        Mutex::Locker locker (m_mutex);
2636c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        if (process_sp)
2646c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        {
2656c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            m_did_load_objfile = true;
266102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton            std::unique_ptr<DataBufferHeap> data_ap (new DataBufferHeap (512, 0));
2676c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            Error readmem_error;
2686c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            const size_t bytes_read = process_sp->ReadMemory (header_addr,
2696c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              data_ap->GetBytes(),
2706c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              data_ap->GetByteSize(),
2716c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                                                              readmem_error);
2726c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            if (bytes_read == 512)
2736c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            {
2746c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                DataBufferSP data_sp(data_ap.release());
2756c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                m_objfile_sp = ObjectFile::FindPlugin(shared_from_this(), process_sp, header_addr, data_sp);
2766c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                if (m_objfile_sp)
2776c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                {
278808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton                    StreamString s;
2795f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea                    s.Printf("0x%16.16" PRIx64, header_addr);
280808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton                    m_object_name.SetCString (s.GetData());
281808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton
282808e92a12cf2b15ed5cb75e63de4ae0cbe997998Greg Clayton                    // Once we get the object file, update our module with the object file's
2836c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    // architecture since it might differ in vendor/os if some parts were
2846c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    // unknown.
2856c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    m_objfile_sp->GetArchitecture (m_arch);
2866c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                }
2876c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                else
2886c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                {
2896c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                    error.SetErrorString ("unable to find suitable object file plug-in");
2906c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                }
2916c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            }
2926c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            else
2936c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            {
2946c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton                error.SetErrorStringWithFormat ("unable to read header from memory: %s", readmem_error.AsCString());
2956c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            }
2966c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        }
2976c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        else
2986c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        {
2996c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton            error.SetErrorString ("invalid process");
3006c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton        }
3016c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    }
3026c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton    return m_objfile_sp.get();
3036c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton}
3046c5438bf1d7af0f0ef1e81a30ad53e3fe93c35a8Greg Clayton
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3060467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Claytonconst lldb_private::UUID&
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID()
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
310236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_parse_uuid == false)
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile * obj_file = GetObjectFile ();
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            obj_file->GetUUID(&m_uuid);
317236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_parse_uuid = true;
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_uuid;
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
323b01000fd063629facd45044f137446fb748ee179Greg ClaytonClangASTContext &
324b01000fd063629facd45044f137446fb748ee179Greg ClaytonModule::GetClangASTContext ()
325b01000fd063629facd45044f137446fb748ee179Greg Clayton{
326b01000fd063629facd45044f137446fb748ee179Greg Clayton    Mutex::Locker locker (m_mutex);
327b01000fd063629facd45044f137446fb748ee179Greg Clayton    if (m_did_init_ast == false)
328b01000fd063629facd45044f137446fb748ee179Greg Clayton    {
329b01000fd063629facd45044f137446fb748ee179Greg Clayton        ObjectFile * objfile = GetObjectFile();
330395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        ArchSpec object_arch;
331395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        if (objfile && objfile->GetArchitecture(object_arch))
332b01000fd063629facd45044f137446fb748ee179Greg Clayton        {
333b01000fd063629facd45044f137446fb748ee179Greg Clayton            m_did_init_ast = true;
3341b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda
3351b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            // LLVM wants this to be set to iOS or MacOSX; if we're working on
3361b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            // a bare-boards type image, change the triple for llvm's benefit.
3371b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            if (object_arch.GetTriple().getVendor() == llvm::Triple::Apple
3381b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                && object_arch.GetTriple().getOS() == llvm::Triple::UnknownOS)
3391b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            {
3401b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                if (object_arch.GetTriple().getArch() == llvm::Triple::arm ||
3411b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                    object_arch.GetTriple().getArch() == llvm::Triple::thumb)
3421b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                {
3431b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                    object_arch.GetTriple().setOS(llvm::Triple::IOS);
3441b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                }
3451b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                else
3461b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                {
3471b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                    object_arch.GetTriple().setOS(llvm::Triple::MacOSX);
3481b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda                }
3491b97a65e6ad77d797316a2f4b0aa3a1a793ec36fJason Molenda            }
350395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton            m_ast.SetArchitecture (object_arch);
351b01000fd063629facd45044f137446fb748ee179Greg Clayton        }
352b01000fd063629facd45044f137446fb748ee179Greg Clayton    }
353b01000fd063629facd45044f137446fb748ee179Greg Clayton    return m_ast;
354b01000fd063629facd45044f137446fb748ee179Greg Clayton}
355b01000fd063629facd45044f137446fb748ee179Greg Clayton
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols()
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
36036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t num_comp_units = GetNumCompileUnits();
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_comp_units == 0)
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36402e210cad27e36108bef493b798c2c1eb3b04cb8Greg Clayton    SymbolContext sc;
36513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    for (size_t cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit)
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseVariablesForContext(sc);
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseCompileUnitFunctions(sc);
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            for (size_t func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseFunctionBlocks(sc);
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Parse the variables for this function and all its blocks
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseVariablesForContext(sc);
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Parse all types for this compile unit
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseTypes(sc);
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc)
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc->module_sp = shared_from_this();
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4003508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonModuleSP
401c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg ClaytonModule::CalculateSymbolContextModule ()
402c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton{
4033508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    return shared_from_this();
404c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton}
405c51ffbf896e398ada5f7e89b2fa5aec6f2224f09Greg Clayton
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s)
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4097e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda    s->Printf(", Module{%p}", this);
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits()
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->GetNumCompileUnits();
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
42436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::GetCompileUnitAtIndex (size_t index)
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
42736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t num_comp_units = GetNumCompileUnits ();
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP cu_sp;
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index < num_comp_units)
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolVendor *symbols = GetSymbolVendor ();
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symbols)
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cu_sp = symbols->GetCompileUnitAtIndex(index);
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cu_sp;
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
4435f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%" PRIx64 ")", vm_addr);
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile* ofile = GetObjectFile();
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ofile)
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
456a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton    // Clear the result symbol context in case we don't find anything, but don't clear the target
457a7e864cb0a450c7ef65b6f9f6c9bae839c405906Greg Clayton    sc.Clear(false);
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the section from the section/offset address.
4603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    SectionSP section_sp (so_addr.GetSection());
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure the section matches this module before we try and match anything
4633508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton    if (section_sp && section_sp->GetModule().get() == this)
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If the section offset based address resolved itself, then this
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is the right module.
46713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton        sc.module_sp = shared_from_this();
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        resolved_flags |= eSymbolContextModule;
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Resolve the compile unit, function, block, line table or line
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // entry if requested.
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (resolve_scope & eSymbolContextCompUnit    ||
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextFunction    ||
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextBlock       ||
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextLineEntry   )
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolVendor *symbols = GetSymbolVendor ();
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (symbols)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
482bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
483bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
485a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            SymbolVendor* sym_vendor = GetSymbolVendor();
486a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            if (sym_vendor)
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
488a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                Symtab *symtab = sym_vendor->GetSymtab();
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symtab)
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (so_addr.IsSectionOffset())
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sc.symbol)
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            resolved_flags |= eSymbolContextSymbol;
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
505537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath
506537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton(
507537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    const char *file_path,
508537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t line,
509537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    bool check_inlines,
510537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    uint32_t resolve_scope,
511537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    SymbolContextList& sc_list
512537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton)
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
514537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton    FileSpec file_spec(file_path, false);
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
52397a19b21dacd9063bb5475812df7781777262198Greg Clayton                       "Module::ResolveSymbolContextForFilePath (%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
52497a19b21dacd9063bb5475812df7781777262198Greg Clayton                       file_spec.GetPath().c_str(),
52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       line,
52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       check_inlines ? "yes" : "no",
52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       resolve_scope);
52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t initial_count = sc_list.GetSize();
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor  ();
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_count;
53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
53936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
54036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const ConstString &name,
54136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             const ClangNamespaceDecl *namespace_decl,
54236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             bool append,
54336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             size_t max_matches,
54436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             VariableList& variables)
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
5480fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan        return symbols->FindGlobalVariables(name, namespace_decl, append, max_matches, variables);
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
55136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton
55236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
55336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonModule::FindGlobalVariables (const RegularExpression& regex,
55436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             bool append,
55536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             size_t max_matches,
55636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                             VariableList& variables)
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
56436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
565801417e453f8531ac176cd952200587bf15d9ccfGreg ClaytonModule::FindCompileUnits (const FileSpec &path,
566801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          bool append,
567801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton                          SymbolContextList &sc_list)
568801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton{
569801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    if (!append)
570801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc_list.Clear();
571801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
57236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t start_size = sc_list.GetSize();
57336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t num_compile_units = GetNumCompileUnits();
574801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    SymbolContext sc;
57513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton    sc.module_sp = shared_from_this();
576801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    const bool compare_directory = path.GetDirectory();
57736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    for (size_t i=0; i<num_compile_units; ++i)
578801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    {
579801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton        sc.comp_unit = GetCompileUnitAtIndex(i).get();
580c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        if (sc.comp_unit)
581c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        {
582c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton            if (FileSpec::Equal (*sc.comp_unit, path, compare_directory))
583c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton                sc_list.Append(sc);
584c705730b96ede40118fc7b06d2807e9a4e503139Greg Clayton        }
585801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    }
586801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton    return sc_list.GetSize() - start_size;
587801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton}
588801417e453f8531ac176cd952200587bf15d9ccfGreg Clayton
58936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
5903e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean CallananModule::FindFunctions (const ConstString &name,
5913e80cd9c9e6ae50ff54537551e2fe3ed5319b9b4Sean Callanan                       const ClangNamespaceDecl *namespace_decl,
59236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                       uint32_t name_type_mask,
593302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
594302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
59528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
59628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
59928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
60028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
601296b06d325413723f5aac5988eed977b278a7807Greg Clayton    const size_t old_size = sc_list.GetSize();
60228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
60328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    // Find all the functions (not symbols, but debug information functions...
60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
605296b06d325413723f5aac5988eed977b278a7807Greg Clayton
606296b06d325413723f5aac5988eed977b278a7807Greg Clayton    if (name_type_mask & eFunctionNameTypeAuto)
60728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
608296b06d325413723f5aac5988eed977b278a7807Greg Clayton        ConstString lookup_name;
609296b06d325413723f5aac5988eed977b278a7807Greg Clayton        uint32_t lookup_name_type_mask = 0;
610296b06d325413723f5aac5988eed977b278a7807Greg Clayton        bool match_name_after_lookup = false;
611296b06d325413723f5aac5988eed977b278a7807Greg Clayton        Module::PrepareForFunctionNameLookup (name,
612296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                              name_type_mask,
613296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                              lookup_name,
614296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                              lookup_name_type_mask,
615296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                              match_name_after_lookup);
616296b06d325413723f5aac5988eed977b278a7807Greg Clayton
617296b06d325413723f5aac5988eed977b278a7807Greg Clayton        if (symbols)
618a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        {
619296b06d325413723f5aac5988eed977b278a7807Greg Clayton            symbols->FindFunctions(lookup_name,
620296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                   namespace_decl,
621296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                   lookup_name_type_mask,
622296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                   include_inlines,
623296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                   append,
624296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                   sc_list);
625296b06d325413723f5aac5988eed977b278a7807Greg Clayton
626a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            // Now check our symbol table for symbols that are code symbols if requested
627a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            if (include_symbols)
62828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
629a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                Symtab *symtab = symbols->GetSymtab();
630296b06d325413723f5aac5988eed977b278a7807Greg Clayton                if (symtab)
631296b06d325413723f5aac5988eed977b278a7807Greg Clayton                    symtab->FindFunctionSymbols(lookup_name, lookup_name_type_mask, sc_list);
632296b06d325413723f5aac5988eed977b278a7807Greg Clayton            }
633296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
634296b06d325413723f5aac5988eed977b278a7807Greg Clayton
635296b06d325413723f5aac5988eed977b278a7807Greg Clayton        if (match_name_after_lookup)
636296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
637296b06d325413723f5aac5988eed977b278a7807Greg Clayton            SymbolContext sc;
638296b06d325413723f5aac5988eed977b278a7807Greg Clayton            size_t i = old_size;
639296b06d325413723f5aac5988eed977b278a7807Greg Clayton            while (i<sc_list.GetSize())
640296b06d325413723f5aac5988eed977b278a7807Greg Clayton            {
641296b06d325413723f5aac5988eed977b278a7807Greg Clayton                if (sc_list.GetContextAtIndex(i, sc))
64228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
643296b06d325413723f5aac5988eed977b278a7807Greg Clayton                    const char *func_name = sc.GetFunctionName().GetCString();
644296b06d325413723f5aac5988eed977b278a7807Greg Clayton                    if (func_name && strstr (func_name, name.GetCString()) == NULL)
64528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
646296b06d325413723f5aac5988eed977b278a7807Greg Clayton                        // Remove the current context
647296b06d325413723f5aac5988eed977b278a7807Greg Clayton                        sc_list.RemoveContextAtIndex(i);
648296b06d325413723f5aac5988eed977b278a7807Greg Clayton                        // Don't increment i and continue in the loop
649296b06d325413723f5aac5988eed977b278a7807Greg Clayton                        continue;
65028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
65128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
652296b06d325413723f5aac5988eed977b278a7807Greg Clayton                ++i;
65328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
65428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
65528d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
656296b06d325413723f5aac5988eed977b278a7807Greg Clayton    else
657296b06d325413723f5aac5988eed977b278a7807Greg Clayton    {
658296b06d325413723f5aac5988eed977b278a7807Greg Clayton        if (symbols)
659a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        {
660296b06d325413723f5aac5988eed977b278a7807Greg Clayton            symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list);
661296b06d325413723f5aac5988eed977b278a7807Greg Clayton
662a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            // Now check our symbol table for symbols that are code symbols if requested
663a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            if (include_symbols)
664296b06d325413723f5aac5988eed977b278a7807Greg Clayton            {
665a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                Symtab *symtab = symbols->GetSymtab();
666296b06d325413723f5aac5988eed977b278a7807Greg Clayton                if (symtab)
667296b06d325413723f5aac5988eed977b278a7807Greg Clayton                    symtab->FindFunctionSymbols(name, name_type_mask, sc_list);
668296b06d325413723f5aac5988eed977b278a7807Greg Clayton            }
669296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
670296b06d325413723f5aac5988eed977b278a7807Greg Clayton    }
671296b06d325413723f5aac5988eed977b278a7807Greg Clayton
672296b06d325413723f5aac5988eed977b278a7807Greg Clayton    return sc_list.GetSize() - old_size;
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
67628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg ClaytonModule::FindFunctions (const RegularExpression& regex,
677302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_symbols,
678302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan                       bool include_inlines,
67928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       bool append,
68028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                       SymbolContextList& sc_list)
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
68228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    if (!append)
68328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        sc_list.Clear();
68428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
68536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t start_size = sc_list.GetSize();
68628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
68928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    {
690a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        symbols->FindFunctions(regex, include_inlines, append, sc_list);
691a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain
692a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        // Now check our symbol table for symbols that are code symbols if requested
693a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        if (include_symbols)
69428d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        {
695a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            Symtab *symtab = symbols->GetSymtab();
69628d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            if (symtab)
69728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            {
69828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                std::vector<uint32_t> symbol_indexes;
6994f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec                symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeAny, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
70036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                const size_t num_matches = symbol_indexes.size();
70128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                if (num_matches)
70228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                {
70328d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    SymbolContext sc(this);
704ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    const size_t end_functions_added_index = sc_list.GetSize();
705ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    size_t num_functions_added_to_sc_list = end_functions_added_index - start_size;
706ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    if (num_functions_added_to_sc_list == 0)
70728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    {
708ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        // No functions were added, just symbols, so we can just append them
709ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        for (size_t i=0; i<num_matches; ++i)
710ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        {
711ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
712ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            SymbolType sym_type = sc.symbol->GetType();
713ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            if (sc.symbol && (sym_type == eSymbolTypeCode ||
714ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                              sym_type == eSymbolTypeResolver))
715ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                sc_list.Append(sc);
716ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        }
717ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    }
718ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    else
719ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                    {
720ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        typedef std::map<lldb::addr_t, uint32_t> FileAddrToIndexMap;
721ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        FileAddrToIndexMap file_addr_to_index;
722ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        for (size_t i=start_size; i<end_functions_added_index; ++i)
723ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        {
724ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            const SymbolContext &sc = sc_list[i];
725ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            if (sc.block)
726ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                continue;
727ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            file_addr_to_index[sc.function->GetAddressRange().GetBaseAddress().GetFileAddress()] = i;
728ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        }
729ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton
730ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        FileAddrToIndexMap::const_iterator end = file_addr_to_index.end();
731ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        // Functions were added so we need to merge symbols into any
732ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        // existing function symbol contexts
733ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        for (size_t i=start_size; i<num_matches; ++i)
734ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        {
735ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]);
736ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            SymbolType sym_type = sc.symbol->GetType();
737ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            if (sc.symbol && (sym_type == eSymbolTypeCode ||
738ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                              sym_type == eSymbolTypeResolver))
739ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            {
740ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                FileAddrToIndexMap::const_iterator pos = file_addr_to_index.find(sc.symbol->GetAddress().GetFileAddress());
741ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                if (pos == end)
742ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                    sc_list.Append(sc);
743ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                else
744ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                                    sc_list[pos->second].symbol = sc.symbol;
745ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                            }
746ac94caa68a4a5fa4bd939d7656a6a12d8fc06a33Greg Clayton                        }
74728d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                    }
74828d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton                }
74928d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton            }
75028d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton        }
75128d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    }
75228d5fcc3158aebf543e0f3d0a3608c1746f5ef15Greg Clayton    return sc_list.GetSize() - start_size;
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
756dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes_Impl (const SymbolContext& sc,
757dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        const ConstString &name,
758dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        const ClangNamespaceDecl *namespace_decl,
759dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        bool append,
76036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                        size_t max_matches,
761dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                        TypeList& types)
7627aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{
7637aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
7647aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
7657aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    {
7667aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        SymbolVendor *symbols = GetSymbolVendor ();
7677aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        if (symbols)
7680fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan            return symbols->FindTypes(sc, name, namespace_decl, append, max_matches, types);
7697aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    }
7707aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    return 0;
7717aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton}
7727aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton
77336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
774dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypesInNamespace (const SymbolContext& sc,
775dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              const ConstString &type_name,
776dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              const ClangNamespaceDecl *namespace_decl,
77736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                              size_t max_matches,
778dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                              TypeList& type_list)
779979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
780dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const bool append = true;
781dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return FindTypes_Impl(sc, type_name, namespace_decl, append, max_matches, type_list);
782979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
783979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
7840b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Claytonlldb::TypeSP
7850b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg ClaytonModule::FindFirstType (const SymbolContext& sc,
7860b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton                       const ConstString &name,
7870b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton                       bool exact_match)
7880b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton{
7890b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton    TypeList type_list;
79036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    const size_t num_matches = FindTypes (sc, name, exact_match, 1, type_list);
7910b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton    if (num_matches)
7920b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton        return type_list.GetTypeAtIndex(0);
7930b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton    return TypeSP();
7940b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton}
7950b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
7960b93a7546473b15fb14dbc129f1fe5ed6ee14976Greg Clayton
79736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t
798dc0a38c5a727cae5362b218a3180d0f4265a619dGreg ClaytonModule::FindTypes (const SymbolContext& sc,
799dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   const ConstString &name,
800dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   bool exact_match,
80136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                   size_t max_matches,
802dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton                   TypeList& types)
803979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata{
80436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t num_matches = 0;
805dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const char *type_name_cstr = name.GetCString();
806dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    std::string type_scope;
807dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    std::string type_basename;
808dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    const bool append = true;
809b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton    TypeClass type_class = eTypeClassAny;
810b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton    if (Type::GetTypeScopeAndBasename (type_name_cstr, type_scope, type_basename, type_class))
811979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    {
812dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // Check if "name" starts with "::" which means the qualified type starts
813dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // from the root namespace and implies and exact match. The typenames we
814dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // get back from clang do not start with "::" so we need to strip this off
815dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // in order to get the qualfied names to match
816dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
817dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (type_scope.size() >= 2 && type_scope[0] == ':' && type_scope[1] == ':')
818dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
819dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            type_scope.erase(0,2);
820dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            exact_match = true;
821dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
822dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        ConstString type_basename_const_str (type_basename.c_str());
823dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        if (FindTypes_Impl(sc, type_basename_const_str, NULL, append, max_matches, types))
824dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        {
825b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            types.RemoveMismatchedTypes (type_scope, type_basename, type_class, exact_match);
826dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton            num_matches = types.GetSize();
827dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        }
828979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    }
829979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata    else
830dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    {
831dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton        // The type is not in a namespace/class scope, just search for it by basename
832b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        if (type_class != eTypeClassAny)
833b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
834b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            // The "type_name_cstr" will have been modified if we have a valid type class
835b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            // prefix (like "struct", "class", "union", "typedef" etc).
836b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            num_matches = FindTypes_Impl(sc, ConstString(type_name_cstr), NULL, append, max_matches, types);
837b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            types.RemoveMismatchedTypes (type_class);
838b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            num_matches = types.GetSize();
839b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
840b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        else
841b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        {
842b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton            num_matches = FindTypes_Impl(sc, name, NULL, append, max_matches, types);
843b9bd4eeeb21dc4d634a61d00fa68f62c630bd38cGreg Clayton        }
844dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    }
845dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton
846dc0a38c5a727cae5362b218a3180d0f4265a619dGreg Clayton    return num_matches;
847979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
848979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata}
849979e20d127335143ffc89c2e37ec3a8b717ff22dEnrico Granata
85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor*
851188091899842b140313b54e097f16efbe165c998Greg ClaytonModule::GetSymbolVendor (bool can_create, lldb_private::Stream *feedback_strm)
85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
854236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_symbol_vendor == false && can_create)
85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *obj_file = GetObjectFile ();
85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
860188091899842b140313b54e097f16efbe165c998Greg Clayton            m_symfile_ap.reset(SymbolVendor::FindPlugin(shared_from_this(), feedback_strm));
861236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton            m_did_load_symbol_vendor = true;
86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symfile_ap.get();
86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Container objects whose paths do not specify a file directly can call
87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // this function to correct the file and object names.
87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file = file;
87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time = file.GetModificationTime();
87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name = object_name;
87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec&
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_arch;
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88397a19b21dacd9063bb5475812df7781777262198Greg Claytonstd::string
88497a19b21dacd9063bb5475812df7781777262198Greg ClaytonModule::GetSpecificationDescription () const
88597a19b21dacd9063bb5475812df7781777262198Greg Clayton{
88697a19b21dacd9063bb5475812df7781777262198Greg Clayton    std::string spec(GetFileSpec().GetPath());
88797a19b21dacd9063bb5475812df7781777262198Greg Clayton    if (m_object_name)
88897a19b21dacd9063bb5475812df7781777262198Greg Clayton    {
88997a19b21dacd9063bb5475812df7781777262198Greg Clayton        spec += '(';
89097a19b21dacd9063bb5475812df7781777262198Greg Clayton        spec += m_object_name.GetCString();
89197a19b21dacd9063bb5475812df7781777262198Greg Clayton        spec += ')';
89297a19b21dacd9063bb5475812df7781777262198Greg Clayton    }
89397a19b21dacd9063bb5475812df7781777262198Greg Clayton    return spec;
89497a19b21dacd9063bb5475812df7781777262198Greg Clayton}
89597a19b21dacd9063bb5475812df7781777262198Greg Clayton
89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
89775d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::GetDescription (Stream *s, lldb::DescriptionLevel level)
8987826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice{
8997826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice    Mutex::Locker locker (m_mutex);
9007826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
90175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level >= eDescriptionLevelFull)
90275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
90375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_arch.IsValid())
90475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->Printf("(%s) ", m_arch.GetArchitectureName());
90575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
9067826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
90775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (level == eDescriptionLevelBrief)
90875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
90975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        const char *filename = m_file.GetFilename().GetCString();
91075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (filename)
91175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString (filename);
91275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
91375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    else
91475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
91575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        char path[PATH_MAX];
91675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        if (m_file.GetPath(path, sizeof(path)))
91775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton            s->PutCString(path);
91875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
91949ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton
92049ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    const char *object_name = m_object_name.GetCString();
92149ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    if (object_name)
92249ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton        s->Printf("(%s)", object_name);
9237826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice}
9247826c8894803dc729f29789ebc038956a94d3e7aCaroline Tice
9257826c8894803dc729f29789ebc038956a94d3e7aCaroline Ticevoid
92675d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportError (const char *format, ...)
92775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
928df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
929df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
930df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
931df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("error: ");
932df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        GetDescription(&strm, lldb::eDescriptionLevelBrief);
9337129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
934df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
935df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
936df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
937df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
938df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
939df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
940df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
941df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
942df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
943df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
944df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
945df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
946df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
947df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
948df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
949df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton}
950df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
951cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Claytonbool
952cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg ClaytonModule::FileHasChanged () const
953cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton{
954cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    if (m_file_has_changed == false)
955cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton        m_file_has_changed = (m_file.GetModificationTime() != m_mod_time);
956cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    return m_file_has_changed;
957cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton}
958cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton
959df6dc88322f103b263092d752db4490e628a1cbdGreg Claytonvoid
960df6dc88322f103b263092d752db4490e628a1cbdGreg ClaytonModule::ReportErrorIfModifyDetected (const char *format, ...)
961df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton{
962cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton    if (m_first_file_changed_log == false)
963df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
964cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton        if (FileHasChanged ())
965df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
966cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton            m_first_file_changed_log = true;
967cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton            if (format)
968df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            {
969cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                StreamString strm;
970cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PutCString("error: the object file ");
971cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                GetDescription(&strm, lldb::eDescriptionLevelFull);
972cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PutCString (" has been modified\n");
973cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton
974cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                va_list args;
975cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                va_start (args, format);
976cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PrintfVarArg(format, args);
977cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                va_end (args);
978cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton
979cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                const int format_len = strlen(format);
980cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                if (format_len > 0)
981cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                {
982cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                    const char last_char = format[format_len-1];
983cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                    if (last_char != '\n' || last_char != '\r')
984cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                        strm.EOL();
985cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                }
986cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                strm.PutCString("The debug session should be aborted as the original debug information has been overwritten.\n");
987cbacba1f223ee4819a4b99924dd994c7e52fdf04Greg Clayton                Host::SystemLog (Host::eSystemLogError, "%s", strm.GetString().c_str());
988df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            }
989df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
990df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
99175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
99275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
99375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
99475d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::ReportWarning (const char *format, ...)
99575d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
996df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    if (format && format[0])
997df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    {
998df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        StreamString strm;
999df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PutCString("warning: ");
10007129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&strm, lldb::eDescriptionLevelFull);
10017129913a93594dc4d7b4e417212a366768337852Greg Clayton        strm.PutChar (' ');
1002df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
1003df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_list args;
1004df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_start (args, format);
1005df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        strm.PrintfVarArg(format, args);
1006df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        va_end (args);
1007df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton
1008df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        const int format_len = strlen(format);
1009df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        if (format_len > 0)
1010df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        {
1011df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            const char last_char = format[format_len-1];
1012df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton            if (last_char != '\n' || last_char != '\r')
1013df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                strm.EOL();
1014df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        }
1015df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton        Host::SystemLog (Host::eSystemLogWarning, "%s", strm.GetString().c_str());
1016df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton    }
101775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
101875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
101975d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
102075d8c2591f6c56a09338bf4967a41510165a907eGreg ClaytonModule::LogMessage (Log *log, const char *format, ...)
102175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton{
102275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    if (log)
102375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    {
102475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        StreamString log_message;
10257129913a93594dc4d7b4e417212a366768337852Greg Clayton        GetDescription(&log_message, lldb::eDescriptionLevelFull);
102675d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PutCString (": ");
102775d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_list args;
102875d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_start (args, format);
102975d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log_message.PrintfVarArg (format, args);
103075d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        va_end (args);
103175d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton        log->PutCString(log_message.GetString().c_str());
103275d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton    }
103375d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton}
103475d8c2591f6c56a09338bf4967a41510165a907eGreg Clayton
103573a35715708b65b1d96c1c8f439548bb0990df08Greg Claytonvoid
103673a35715708b65b1d96c1c8f439548bb0990df08Greg ClaytonModule::LogMessageVerboseBacktrace (Log *log, const char *format, ...)
103773a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton{
103873a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton    if (log)
103973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton    {
104073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        StreamString log_message;
104173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        GetDescription(&log_message, lldb::eDescriptionLevelFull);
104273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        log_message.PutCString (": ");
104373a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        va_list args;
104473a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        va_start (args, format);
104573a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        log_message.PrintfVarArg (format, args);
104673a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        va_end (args);
104773a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        if (log->GetVerbose())
104873a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton            Host::Backtrace (log_message, 1024);
104973a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton        log->PutCString(log_message.GetString().c_str());
105073a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton    }
105173a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton}
105273a35715708b65b1d96c1c8f439548bb0990df08Greg Clayton
105375d8c2591f6c56a09338bf4967a41510165a907eGreg Claytonvoid
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s)
105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
10573fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton    //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
105997a19b21dacd9063bb5475812df7781777262198Greg Clayton    s->Printf("Module %s%s%s%s\n",
106097a19b21dacd9063bb5475812df7781777262198Greg Clayton              m_file.GetPath().c_str(),
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? "(" : "",
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? m_object_name.GetCString() : "",
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? ")" : "");
106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
1066a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        objfile->Dump(s);
107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->Dump(s);
107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList*
108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList ()
108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &symbols->GetTypeList();
108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const
109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_object_name;
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile()
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
1098236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton    if (m_did_load_objfile == false)
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1100236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton        m_did_load_objfile = true;
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer(__PRETTY_FUNCTION__,
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
1103cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        DataBufferSP data_sp;
1104cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        lldb::offset_t data_offset = 0;
1105cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton        m_objfile_sp = ObjectFile::FindPlugin (shared_from_this(),
11063508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               &m_file,
11073508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_object_offset,
11083508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                                               m_file.GetByteSize(),
1109cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                               data_sp,
1110cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                                               data_offset);
11116a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        if (m_objfile_sp)
11126a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        {
1113a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            // Once we get the object file, update our module with the object file's
1114a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            // architecture since it might differ in vendor/os if some parts were
1115a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            // unknown.
11166a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton            m_objfile_sp->GetArchitecture (m_arch);
1117a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain
1118a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            // Populate m_unified_sections_ap with sections from objfile.
1119a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            SectionList *section_list = m_objfile_sp->GetSectionList();
1120a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            if (section_list)
1121a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            {
1122a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                m_unified_sections_ap.reset(new SectionList());
1123a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                section_list->Copy (m_unified_sections_ap.get());
1124a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                m_unified_sections_ap->Finalize();
1125a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            }
11266a64bbf41006e1184315b6593d7ec9d81c1c4654Greg Clayton        }
112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1128e40b6424d9e49306392bec4b44060da36414c382Greg Clayton    return m_objfile_sp.get();
112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1131a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainSectionList *
1132a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainModule::GetUnifiedSectionList()
1133a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain{
1134a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    return m_unified_sections_ap.get();
1135a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain}
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol *
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
114224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
1144a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    SymbolVendor* sym_vendor = GetSymbolVendor();
1145a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    if (sym_vendor)
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1147a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        Symtab *symtab = sym_vendor->GetSymtab();
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
11497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny);
115024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
115324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
115624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_indices = symbol_indexes.size();
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_indices > 0)
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
116224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
116324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext (&sc);
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i = 0; i < num_indices; i++)
116524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.symbol)
116824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sc_list.Append (sc);
116924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
117124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
11742fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg ClaytonModule::FindFunctionSymbols (const ConstString &name,
11752fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                             uint32_t name_type_mask,
11762fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                             SymbolContextList& sc_list)
11772fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton{
11782fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__,
11792fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                       "Module::FindSymbolsFunctions (name = %s, mask = 0x%8.8x)",
11802fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                       name.AsCString(),
11812fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton                       name_type_mask);
1182a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    SymbolVendor* sym_vendor = GetSymbolVendor();
1183a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    if (sym_vendor)
11842fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    {
1185a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        Symtab *symtab = sym_vendor->GetSymtab();
11862fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton        if (symtab)
11872fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton            return symtab->FindFunctionSymbols (name, name_type_mask, sc_list);
11882fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    }
11892fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton    return 0;
11902fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton}
11912fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Clayton
11922fcbf6e3d86ac0e6a95e11e5e232a9f72bd612d2Greg Claytonsize_t
1193aa4a553d4b8cd37f13bd4946f504265000a7bcc4Sean CallananModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
1204a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    SymbolVendor* sym_vendor = GetSymbolVendor();
1205a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    if (sym_vendor)
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1207a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        Symtab *symtab = sym_vendor->GetSymtab();
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
121224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
122624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       regex.GetText(),
122724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
1229a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    SymbolVendor* sym_vendor = GetSymbolVendor();
1230a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    if (sym_vendor)
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1232a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        Symtab *symtab = sym_vendor->GetSymtab();
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
123524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
12367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes);
123724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
123924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
124024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
124124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
124224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124381a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Claytonvoid
124481a96aa6242f7b559770f5dc62316253cb8cb0d4Greg ClaytonModule::SetSymbolFileFileSpec (const FileSpec &file)
124581a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton{
1246a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    // Remove any sections in the unified section list that come from the current symbol vendor.
1247a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    if (m_symfile_ap)
1248a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    {
1249a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        SectionList *section_list = GetUnifiedSectionList();
1250a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        SymbolFile *symbol_file = m_symfile_ap->GetSymbolFile();
1251a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        if (section_list && symbol_file)
1252a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        {
1253a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            ObjectFile *obj_file = symbol_file->GetObjectFile();
1254a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            if (obj_file)
1255a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            {
1256a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                size_t num_sections = section_list->GetNumSections (0);
1257a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                for (size_t idx = num_sections; idx > 0; --idx)
1258a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                {
1259a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    lldb::SectionSP section_sp (section_list->GetSectionAtIndex (idx - 1));
1260a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    if (section_sp->GetObjectFile() == obj_file)
1261a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    {
1262a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                        m_unified_sections_ap->DeleteSection (idx - 1);
1263a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                    }
1264a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                }
1265a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain                m_unified_sections_ap->Finalize();
1266a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain            }
1267a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain        }
1268a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain    }
1269a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain
127081a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton    m_symfile_spec = file;
127181a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton    m_symfile_ap.reset();
127281a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton    m_did_load_symbol_vendor = false;
127381a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton}
127481a96aa6242f7b559770f5dc62316253cb8cb0d4Greg Clayton
12757508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
12767508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable ()
12777508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
12787508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (GetObjectFile() == NULL)
12797508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
12807508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
12817508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return GetObjectFile()->IsExecutable();
12827508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
12837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
128451b11e06de746667396f56b303d1867f007baf8bJim Inghambool
128551b11e06de746667396f56b303d1867f007baf8bJim InghamModule::IsLoadedInTarget (Target *target)
128651b11e06de746667396f56b303d1867f007baf8bJim Ingham{
128751b11e06de746667396f56b303d1867f007baf8bJim Ingham    ObjectFile *obj_file = GetObjectFile();
128851b11e06de746667396f56b303d1867f007baf8bJim Ingham    if (obj_file)
128951b11e06de746667396f56b303d1867f007baf8bJim Ingham    {
129051b11e06de746667396f56b303d1867f007baf8bJim Ingham        SectionList *sections = obj_file->GetSectionList();
129151b11e06de746667396f56b303d1867f007baf8bJim Ingham        if (sections != NULL)
129251b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
129351b11e06de746667396f56b303d1867f007baf8bJim Ingham            size_t num_sections = sections->GetSize();
129451b11e06de746667396f56b303d1867f007baf8bJim Ingham            for (size_t sect_idx = 0; sect_idx < num_sections; sect_idx++)
129551b11e06de746667396f56b303d1867f007baf8bJim Ingham            {
129651b11e06de746667396f56b303d1867f007baf8bJim Ingham                SectionSP section_sp = sections->GetSectionAtIndex(sect_idx);
129751b11e06de746667396f56b303d1867f007baf8bJim Ingham                if (section_sp->GetLoadBaseAddress(target) != LLDB_INVALID_ADDRESS)
129851b11e06de746667396f56b303d1867f007baf8bJim Ingham                {
129951b11e06de746667396f56b303d1867f007baf8bJim Ingham                    return true;
130051b11e06de746667396f56b303d1867f007baf8bJim Ingham                }
130151b11e06de746667396f56b303d1867f007baf8bJim Ingham            }
130251b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
130351b11e06de746667396f56b303d1867f007baf8bJim Ingham    }
130451b11e06de746667396f56b303d1867f007baf8bJim Ingham    return false;
130551b11e06de746667396f56b303d1867f007baf8bJim Ingham}
1306146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
1307146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool
130802af494c397d62f22bea65d36ad47080b6adc8afEnrico GranataModule::LoadScriptingResourceInTarget (Target *target, Error& error, Stream* feedback_stream)
1309146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata{
1310146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    if (!target)
1311146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    {
1312146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        error.SetErrorString("invalid destination Target");
1313146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        return false;
1314146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    }
1315146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
131607e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata    LoadScriptFromSymFile shoud_load = target->TargetProperties::GetLoadScriptFromSymbolFile();
13171d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata
1318d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton    Debugger &debugger = target->GetDebugger();
1319d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton    const ScriptLanguage script_language = debugger.GetScriptLanguage();
1320d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton    if (script_language != eScriptLanguageNone)
1321146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    {
1322d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton
1323d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        PlatformSP platform_sp(target->GetPlatform());
1324d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton
1325d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        if (!platform_sp)
1326d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        {
1327d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            error.SetErrorString("invalid Platform");
1328d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            return false;
1329d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton        }
1330146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
1331986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton        FileSpecList file_specs = platform_sp->LocateExecutableScriptingResources (target,
1332986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton                                                                                   *this);
1333986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton
1334986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton
1335986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton        const uint32_t num_specs = file_specs.GetSize();
1336986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton        if (num_specs)
1337146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        {
1338986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton            ScriptInterpreter *script_interpreter = debugger.GetCommandInterpreter().GetScriptInterpreter();
1339986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton            if (script_interpreter)
1340d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            {
1341d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                for (uint32_t i=0; i<num_specs; ++i)
1342d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                {
1343d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    FileSpec scripting_fspec (file_specs.GetFileSpecAtIndex(i));
1344d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    if (scripting_fspec && scripting_fspec.Exists())
1345d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    {
134607e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata                        if (shoud_load == eLoadScriptFromSymFileFalse)
134707e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata                            return false;
134807e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata                        if (shoud_load == eLoadScriptFromSymFileWarn)
13491d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata                        {
135007e3124bfa7b1b8d782689a625e13f95402c389aEnrico Granata                            if (feedback_stream)
1351b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                feedback_stream->Printf("warning: '%s' contains a debug script. To run this script in "
1352b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                        "this debug session:\n\n    command script import \"%s\"\n\n"
1353b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                        "To run all discovered debug scripts in this session:\n\n"
1354b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                        "    settings set target.load-script-from-symbol-file true\n",
1355b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                        GetFileSpec().GetFileNameStrippingExtension().GetCString(),
1356b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                        scripting_fspec.GetPath().c_str());
13571d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata                            return false;
13581d3db0a71f507df5158eb160aaceefb6dd5f38c2Enrico Granata                        }
1359d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        StreamString scripting_stream;
1360d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        scripting_fspec.Dump(&scripting_stream);
136166068824402d94de2abe81c7e4472a4754572489Enrico Granata                        const bool can_reload = true;
1362d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        const bool init_lldb_globals = false;
1363b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                        bool did_load = script_interpreter->LoadScriptingModule(scripting_stream.GetData(),
1364b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                                                can_reload,
1365b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                                                init_lldb_globals,
1366b54b7dc48289727220869d25eb6f4362bf3169ecJim Ingham                                                                                error);
1367d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                        if (!did_load)
1368d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                            return false;
1369d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                    }
1370d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton                }
1371d9735a1b6ba4b5ff85551bf19045504e03eb3603Greg Clayton            }
1372986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton            else
1373986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton            {
1374986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton                error.SetErrorString("invalid ScriptInterpreter");
1375986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton                return false;
1376986a750709cb17e56d7f4ddddaae2b87af4eb311Greg Clayton            }
1377146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        }
1378146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    }
1379146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata    return true;
1380146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata}
1381146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
1382146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granatabool
13837508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch)
13847508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
1385940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    if (!m_arch.IsValid())
13867508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
13877508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        m_arch = new_arch;
13887508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
1389940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton    }
139040e278caddf5442776f9408f20d757cc85fe630aSean Callanan    return m_arch.IsExactMatch(new_arch);
13917508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
13927508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
1393b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Claytonbool
1394b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonModule::SetLoadAddress (Target &target, lldb::addr_t offset, bool &changed)
1395b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{
13969ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    size_t num_loaded_sections = 0;
13979ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    ObjectFile *objfile = GetObjectFile();
13989ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    if (objfile)
1399b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    {
14009ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton        SectionList *section_list = objfile->GetSectionList ();
1401b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        if (section_list)
1402b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        {
1403b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            const size_t num_sections = section_list->GetSize();
1404b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            size_t sect_idx = 0;
1405b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
1406b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            {
1407b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // Iterate through the object file sections to find the
1408b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // first section that starts of file offset zero and that
1409b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                // has bytes in the file...
1410545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
14119ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton                // Only load non-thread specific sections when given a slide
1412545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                if (section_sp && !section_sp->IsThreadSpecific())
1413b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                {
1414545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                    if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + offset))
14159ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton                        ++num_loaded_sections;
1416b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                }
1417b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton            }
1418b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton        }
1419b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton    }
14209ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    changed = num_loaded_sections > 0;
14219ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton    return num_loaded_sections > 0;
1422b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton}
1423b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton
1424444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1425444fe998bf707bd076a70c3a779db8575533695eGreg Claytonbool
1426444fe998bf707bd076a70c3a779db8575533695eGreg ClaytonModule::MatchesModuleSpec (const ModuleSpec &module_ref)
1427444fe998bf707bd076a70c3a779db8575533695eGreg Clayton{
1428444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const UUID &uuid = module_ref.GetUUID();
1429444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1430444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (uuid.IsValid())
1431444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1432444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        // If the UUID matches, then nothing more needs to match...
1433444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (uuid == GetUUID())
1434444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return true;
1435444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        else
1436444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1437444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1438444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1439444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const FileSpec &file_spec = module_ref.GetFileSpec();
1440444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (file_spec)
1441444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1442444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (!FileSpec::Equal (file_spec, m_file, file_spec.GetDirectory()))
1443444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1444444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1445444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1446444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const FileSpec &platform_file_spec = module_ref.GetPlatformFileSpec();
1447444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (platform_file_spec)
1448444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
144958aa7152a7df8c9825c63026ec35c24759de948bGreg Clayton        if (!FileSpec::Equal (platform_file_spec, GetPlatformFileSpec (), platform_file_spec.GetDirectory()))
1450444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1451444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1452444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1453444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const ArchSpec &arch = module_ref.GetArchitecture();
1454444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (arch.IsValid())
1455444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
145640e278caddf5442776f9408f20d757cc85fe630aSean Callanan        if (!m_arch.IsCompatibleMatch(arch))
1457444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1458444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1459444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1460444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    const ConstString &object_name = module_ref.GetObjectName();
1461444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (object_name)
1462444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
1463444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (object_name != GetObjectName())
1464444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            return false;
1465444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
1466444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    return true;
1467444fe998bf707bd076a70c3a779db8575533695eGreg Clayton}
1468444fe998bf707bd076a70c3a779db8575533695eGreg Clayton
1469964deba8853eb794e59263322b59b09b43669618Greg Claytonbool
1470964deba8853eb794e59263322b59b09b43669618Greg ClaytonModule::FindSourceFile (const FileSpec &orig_spec, FileSpec &new_spec) const
1471964deba8853eb794e59263322b59b09b43669618Greg Clayton{
1472964deba8853eb794e59263322b59b09b43669618Greg Clayton    Mutex::Locker locker (m_mutex);
1473964deba8853eb794e59263322b59b09b43669618Greg Clayton    return m_source_mappings.FindFile (orig_spec, new_spec);
1474964deba8853eb794e59263322b59b09b43669618Greg Clayton}
1475964deba8853eb794e59263322b59b09b43669618Greg Clayton
14762418fddf2e200c827da5bc6c855f3d4971b2d867Greg Claytonbool
14772418fddf2e200c827da5bc6c855f3d4971b2d867Greg ClaytonModule::RemapSourceFile (const char *path, std::string &new_path) const
14782418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton{
14792418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    Mutex::Locker locker (m_mutex);
14802418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton    return m_source_mappings.RemapPath(path, new_path);
14812418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton}
14822418fddf2e200c827da5bc6c855f3d4971b2d867Greg Clayton
1483ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granatauint32_t
1484ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico GranataModule::GetVersion (uint32_t *versions, uint32_t num_versions)
1485ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata{
1486ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    ObjectFile *obj_file = GetObjectFile();
1487ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    if (obj_file)
1488ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata        return obj_file->GetVersion (versions, num_versions);
1489ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata
1490ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    if (versions && num_versions)
1491ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    {
1492ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata        for (uint32_t i=0; i<num_versions; ++i)
1493ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata            versions[i] = UINT32_MAX;
1494ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    }
1495ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata    return 0;
1496ae2ae94bd72daf435204e99a0e03ccc64470a843Enrico Granata}
1497296b06d325413723f5aac5988eed977b278a7807Greg Clayton
1498296b06d325413723f5aac5988eed977b278a7807Greg Claytonvoid
1499296b06d325413723f5aac5988eed977b278a7807Greg ClaytonModule::PrepareForFunctionNameLookup (const ConstString &name,
1500296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                      uint32_t name_type_mask,
1501296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                      ConstString &lookup_name,
1502296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                      uint32_t &lookup_name_type_mask,
1503296b06d325413723f5aac5988eed977b278a7807Greg Clayton                                      bool &match_name_after_lookup)
1504296b06d325413723f5aac5988eed977b278a7807Greg Clayton{
1505296b06d325413723f5aac5988eed977b278a7807Greg Clayton    const char *name_cstr = name.GetCString();
1506296b06d325413723f5aac5988eed977b278a7807Greg Clayton    lookup_name_type_mask = eFunctionNameTypeNone;
1507296b06d325413723f5aac5988eed977b278a7807Greg Clayton    match_name_after_lookup = false;
1508296b06d325413723f5aac5988eed977b278a7807Greg Clayton    const char *base_name_start = NULL;
1509296b06d325413723f5aac5988eed977b278a7807Greg Clayton    const char *base_name_end = NULL;
1510296b06d325413723f5aac5988eed977b278a7807Greg Clayton
1511296b06d325413723f5aac5988eed977b278a7807Greg Clayton    if (name_type_mask & eFunctionNameTypeAuto)
1512296b06d325413723f5aac5988eed977b278a7807Greg Clayton    {
1513296b06d325413723f5aac5988eed977b278a7807Greg Clayton        if (CPPLanguageRuntime::IsCPPMangledName (name_cstr))
1514296b06d325413723f5aac5988eed977b278a7807Greg Clayton            lookup_name_type_mask = eFunctionNameTypeFull;
1515296b06d325413723f5aac5988eed977b278a7807Greg Clayton        else if (ObjCLanguageRuntime::IsPossibleObjCMethodName (name_cstr))
1516296b06d325413723f5aac5988eed977b278a7807Greg Clayton            lookup_name_type_mask = eFunctionNameTypeFull;
1517296b06d325413723f5aac5988eed977b278a7807Greg Clayton        else
1518296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
1519296b06d325413723f5aac5988eed977b278a7807Greg Clayton            if (ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr))
1520296b06d325413723f5aac5988eed977b278a7807Greg Clayton                lookup_name_type_mask |= eFunctionNameTypeSelector;
1521296b06d325413723f5aac5988eed977b278a7807Greg Clayton
152283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            CPPLanguageRuntime::MethodName cpp_method (name);
152383d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            llvm::StringRef basename (cpp_method.GetBasename());
152483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            if (basename.empty())
152583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            {
152683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                if (CPPLanguageRuntime::StripNamespacesFromVariableName (name_cstr, base_name_start, base_name_end))
152783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                    lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
152883d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            }
152983d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            else
153083d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            {
153183d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                base_name_start = basename.data();
153283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                base_name_end = base_name_start + basename.size();
1533296b06d325413723f5aac5988eed977b278a7807Greg Clayton                lookup_name_type_mask |= (eFunctionNameTypeMethod | eFunctionNameTypeBase);
153483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            }
1535296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
1536296b06d325413723f5aac5988eed977b278a7807Greg Clayton    }
1537296b06d325413723f5aac5988eed977b278a7807Greg Clayton    else
1538296b06d325413723f5aac5988eed977b278a7807Greg Clayton    {
1539296b06d325413723f5aac5988eed977b278a7807Greg Clayton        lookup_name_type_mask = name_type_mask;
1540296b06d325413723f5aac5988eed977b278a7807Greg Clayton        if (lookup_name_type_mask & eFunctionNameTypeMethod || name_type_mask & eFunctionNameTypeBase)
1541296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
1542296b06d325413723f5aac5988eed977b278a7807Greg Clayton            // If they've asked for a CPP method or function name and it can't be that, we don't
1543296b06d325413723f5aac5988eed977b278a7807Greg Clayton            // even need to search for CPP methods or names.
154483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            CPPLanguageRuntime::MethodName cpp_method (name);
154583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            if (cpp_method.IsValid())
1546296b06d325413723f5aac5988eed977b278a7807Greg Clayton            {
154783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                llvm::StringRef basename (cpp_method.GetBasename());
154883d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                base_name_start = basename.data();
154983d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                base_name_end = base_name_start + basename.size();
155083d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton
155183d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                if (!cpp_method.GetQualifiers().empty())
155283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                {
155383d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                    // There is a "const" or other qualifer following the end of the fucntion parens,
155483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                    // this can't be a eFunctionNameTypeBase
155583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                    lookup_name_type_mask &= ~(eFunctionNameTypeBase);
155683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                    if (lookup_name_type_mask == eFunctionNameTypeNone)
155783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                        return;
155883d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                }
155983d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            }
156083d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            else
156183d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton            {
156283d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                if (!CPPLanguageRuntime::StripNamespacesFromVariableName (name_cstr, base_name_start, base_name_end))
156383d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                {
156483d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                    lookup_name_type_mask &= ~(eFunctionNameTypeMethod | eFunctionNameTypeBase);
156583d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                    if (lookup_name_type_mask == eFunctionNameTypeNone)
156683d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                        return;
156783d90c5e68f4a977150c6791a49ade7a23c92177Greg Clayton                }
1568296b06d325413723f5aac5988eed977b278a7807Greg Clayton            }
1569296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
1570296b06d325413723f5aac5988eed977b278a7807Greg Clayton
1571296b06d325413723f5aac5988eed977b278a7807Greg Clayton        if (lookup_name_type_mask & eFunctionNameTypeSelector)
1572296b06d325413723f5aac5988eed977b278a7807Greg Clayton        {
1573296b06d325413723f5aac5988eed977b278a7807Greg Clayton            if (!ObjCLanguageRuntime::IsPossibleObjCSelector(name_cstr))
1574296b06d325413723f5aac5988eed977b278a7807Greg Clayton            {
1575296b06d325413723f5aac5988eed977b278a7807Greg Clayton                lookup_name_type_mask &= ~(eFunctionNameTypeSelector);
1576296b06d325413723f5aac5988eed977b278a7807Greg Clayton                if (lookup_name_type_mask == eFunctionNameTypeNone)
1577296b06d325413723f5aac5988eed977b278a7807Greg Clayton                    return;
1578296b06d325413723f5aac5988eed977b278a7807Greg Clayton            }
1579296b06d325413723f5aac5988eed977b278a7807Greg Clayton        }
1580296b06d325413723f5aac5988eed977b278a7807Greg Clayton    }
1581296b06d325413723f5aac5988eed977b278a7807Greg Clayton
1582296b06d325413723f5aac5988eed977b278a7807Greg Clayton    if (base_name_start &&
1583296b06d325413723f5aac5988eed977b278a7807Greg Clayton        base_name_end &&
1584296b06d325413723f5aac5988eed977b278a7807Greg Clayton        base_name_start != name_cstr &&
1585296b06d325413723f5aac5988eed977b278a7807Greg Clayton        base_name_start < base_name_end)
1586296b06d325413723f5aac5988eed977b278a7807Greg Clayton    {
1587296b06d325413723f5aac5988eed977b278a7807Greg Clayton        // The name supplied was a partial C++ path like "a::count". In this case we want to do a
1588296b06d325413723f5aac5988eed977b278a7807Greg Clayton        // lookup on the basename "count" and then make sure any matching results contain "a::count"
1589296b06d325413723f5aac5988eed977b278a7807Greg Clayton        // so that it would match "b::a::count" and "a::count". This is why we set "match_name_after_lookup"
1590296b06d325413723f5aac5988eed977b278a7807Greg Clayton        // to true
1591296b06d325413723f5aac5988eed977b278a7807Greg Clayton        lookup_name.SetCStringWithLength(base_name_start, base_name_end - base_name_start);
1592296b06d325413723f5aac5988eed977b278a7807Greg Clayton        match_name_after_lookup = true;
1593296b06d325413723f5aac5988eed977b278a7807Greg Clayton    }
1594296b06d325413723f5aac5988eed977b278a7807Greg Clayton    else
1595296b06d325413723f5aac5988eed977b278a7807Greg Clayton    {
1596296b06d325413723f5aac5988eed977b278a7807Greg Clayton        // The name is already correct, just use the exact name as supplied, and we won't need
1597296b06d325413723f5aac5988eed977b278a7807Greg Clayton        // to check if any matches contain "name"
1598296b06d325413723f5aac5988eed977b278a7807Greg Clayton        lookup_name = name;
1599296b06d325413723f5aac5988eed977b278a7807Greg Clayton        match_name_after_lookup = false;
1600296b06d325413723f5aac5988eed977b278a7807Greg Clayton    }
1601296b06d325413723f5aac5988eed977b278a7807Greg Clayton}