Module.cpp revision bddb78944a140c3ca1324d356aa83495331ff50d
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Module.cpp ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private-log.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolContext.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) :
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mutex (Mutex::eMutexTypeRecursive),
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time (file_spec.GetModificationTime()),
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_arch (arch),
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_uuid (),
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file (file_spec),
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags (),
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name (),
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_objfile_ap (),
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_symfile_ap ()
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (object_name)
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_object_name = *object_name;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT);
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')",
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_arch.AsCString(),
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module()
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT);
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')",
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     this,
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_arch.AsCString(),
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetDirectory().AsCString(""),
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_file.GetFilename().AsCString(""),
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : "(",
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""),
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                     m_object_name.IsEmpty() ? "" : ")");
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModuleSP
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSP ()
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ModuleList::GetModuleSP (this);
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst UUID&
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID()
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_flags.IsClear(flagsParsedUUID))
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile * obj_file = GetObjectFile ();
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            obj_file->GetUUID(&m_uuid);
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_flags.Set(flagsParsedUUID);
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_uuid;
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols()
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits();
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_comp_units == 0)
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    TargetSP null_target;
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolContext sc(null_target, GetSP());
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t cu_idx;
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++)
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get();
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (sc.comp_unit)
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseVariablesForContext(sc);
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseCompileUnitFunctions(sc);
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uint32_t func_idx;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx)
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseFunctionBlocks(sc);
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Parse the variables for this function and all its blocks
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                symbols->ParseVariablesForContext(sc);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Parse all types for this compile unit
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.function = NULL;
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symbols->ParseTypes(sc);
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc)
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc->module_sp = GetSP();
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s)
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf(", Module{0x%8.8x}", this);
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits()
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this);
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->GetNumCompileUnits();
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index)
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t num_comp_units = GetNumCompileUnits ();
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CompUnitSP cu_sp;
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (index < num_comp_units)
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolVendor *symbols = GetSymbolVendor ();
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symbols)
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cu_sp = symbols->GetCompileUnitAtIndex(index);
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cu_sp;
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//CompUnitSP
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindCompUnit(lldb::user_id_t uid)
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  CompUnitSP cu_sp;
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolVendor *symbols = GetSymbolVendor ();
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (symbols)
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      cu_sp = symbols->FindCompUnit(uid);
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return cu_sp;
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr)
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile* ofile = GetObjectFile();
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ofile)
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList());
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc)
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t resolved_flags = 0;
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Clear the result symbol context in case we don't find anything
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    sc.Clear();
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Get the section from the section/offset address.
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const Section *section = so_addr.GetSection();
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Make sure the section matches this module before we try and match anything
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (section && section->GetModule() == this)
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If the section offset based address resolved itself, then this
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // is the right module.
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        sc.module_sp = GetSP();
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        resolved_flags |= eSymbolContextModule;
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Resolve the compile unit, function, block, line table or line
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // entry if requested.
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (resolve_scope & eSymbolContextCompUnit    ||
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextFunction    ||
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextBlock       ||
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            resolve_scope & eSymbolContextLineEntry   )
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolVendor *symbols = GetSymbolVendor ();
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (symbols)
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc);
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
218bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        // Resolve the symbol if requested, but don't re-look it up if we've already found it.
219bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham        if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol))
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ObjectFile* ofile = GetObjectFile();
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ofile)
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Symtab *symtab = ofile->GetSymtab();
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symtab)
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (so_addr.IsSectionOffset())
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress());
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        if (sc.symbol)
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            resolved_flags |= eSymbolContextSymbol;
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return resolved_flags;
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForFilePath (const char *file_path, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    FileSpec file_spec(file_path);
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list);
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list)
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)",
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory().AsCString(""),
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetDirectory() ? "/" : "",
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       file_spec.GetFilename().AsCString(""),
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       line,
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       check_inlines ? "yes" : "no",
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       resolve_scope);
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const uint32_t initial_count = sc_list.GetSize();
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor  ();
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list);
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_count;
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables)
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(name, append, max_matches, variables);
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables)
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindGlobalVariables(regex, append, max_matches, variables);
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
28812bec71b323dc520f0e985a86e09c4712559e115Greg ClaytonModule::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list)
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
29212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton        return symbols->FindFunctions(name, name_type_mask, append, sc_list);
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFunctions(const RegularExpression& regex, bool append, SymbolContextList& sc_list)
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return symbols->FindFunctions(regex, append, sc_list);
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 0;
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3057aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t
3067aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg ClaytonModule::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types)
3077aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{
3087aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
3097aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    if (sc.module_sp.get() == NULL || sc.module_sp.get() == this)
3107aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    {
3117aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        SymbolVendor *symbols = GetSymbolVendor ();
3127aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton        if (symbols)
3137aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton            return symbols->FindTypes(sc, name, append, max_matches, types);
3147aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    }
3157aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton    return 0;
3167aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton}
3177aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types)
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Timer scoped_timer(__PRETTY_FUNCTION__);
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  SymbolVendor *symbols = GetSymbolVendor ();
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  if (symbols)
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//      return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types);
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  return 0;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//}
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor*
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create)
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_flags.IsClear(flagsSearchedForSymVendor) && can_create)
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *obj_file = GetObjectFile ();
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (obj_file != NULL)
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_symfile_ap.reset(SymbolVendor::FindPlugin(this));
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_flags.Set (flagsSearchedForSymVendor);
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_symfile_ap.get();
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst FileSpec &
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetFileSpec () const
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_file;
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name)
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Container objects whose paths do not specify a file directly can call
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // this function to correct the file and object names.
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_file = file;
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_mod_time = file.GetModificationTime();
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_object_name = object_name;
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec&
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_arch;
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s)
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("%.*p: ", (int)sizeof(void*) * 2, this);
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Indent();
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->Printf("Module %s/%s%s%s%s\n",
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetDirectory().AsCString(),
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_file.GetFilename().AsCString(),
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? "(" : "",
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? m_object_name.GetCString() : "",
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              m_object_name ? ")" : "");
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentMore();
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        objfile->Dump(s);
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        symbols->Dump(s);
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    s->IndentLess();
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList*
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList ()
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SymbolVendor *symbols = GetSymbolVendor ();
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (symbols)
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return &symbols->GetTypeList();
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString &
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_object_name;
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile *
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile()
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker (m_mutex);
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_flags.IsClear(flagsSearchedForObjParser))
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_flags.Set (flagsSearchedForObjParser);
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Timer scoped_timer(__PRETTY_FUNCTION__,
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                           "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString(""));
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_objfile_ap.reset(ObjectFile::FindPlugin(this, &m_file, 0, m_file.GetByteSize()));
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_objfile_ap.get();
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol *
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type)
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)",
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile();
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return symtab->FindFirstSymbolWithNameAndType (name, symbol_type);
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list)
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t num_indices = symbol_indexes.size();
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_indices > 0)
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        SymbolContext sc;
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CalculateSymbolContext (&sc);
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (size_t i = 0; i < num_indices; i++)
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]);
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sc.symbol)
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                sc_list.Append (sc);
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list)
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsWithNameAndType (name = %s, type = %i)",
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       name.AsCString(),
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes);
48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t
48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression &regex, SymbolType symbol_type, SymbolContextList &sc_list)
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // No need to protect this call using m_mutex all other method calls are
49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // already thread safe.
49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer(__PRETTY_FUNCTION__,
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)",
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       regex.GetText(),
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       symbol_type);
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t initial_size = sc_list.GetSize();
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ObjectFile *objfile = GetObjectFile ();
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (objfile)
50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Symtab *symtab = objfile->GetSymtab();
50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (symtab)
50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::vector<uint32_t> symbol_indexes;
50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, symbol_indexes);
50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list);
50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return sc_list.GetSize() - initial_size;
51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue &
51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const
51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_mod_time;
51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5187508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
5197508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
5207508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable ()
5217508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
5227508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (GetObjectFile() == NULL)
5237508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
5247508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
5257508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return GetObjectFile()->IsExecutable();
5267508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
5277508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
5287508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool
5297508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch)
5307508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{
5317508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    if (m_arch == new_arch)
5327508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
5337508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else if (!m_arch.IsValid())
5347508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
5357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        m_arch = new_arch;
5367508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return true;
5377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    }
5387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    else
5397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    {
5407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham        return false;
5417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham    }
5427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
5437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham}
5447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham
545