Module.cpp revision 537a7a86687683fd403ce652d178fbc89e06ef9f
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_object_name (), 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_objfile_ap (), 31236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_symfile_ap (), 32236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile (false), 33236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor (false), 34236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid (false), 35236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_is_dynamic_loader_module (false) 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (object_name) 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = *object_name; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT); 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch.AsCString(), 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::~Module() 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (log) 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner this, 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_arch.AsCString(), 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(""), 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(""), 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : "(", 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name.IsEmpty() ? "" : ")"); 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModuleSP 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSP () 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ModuleList::GetModuleSP (this); 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst UUID& 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetUUID() 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 76236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_parse_uuid == false) 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile * obj_file = GetObjectFile (); 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner obj_file->GetUUID(&m_uuid); 83236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_parse_uuid = true; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_uuid; 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ParseAllDebugSymbols() 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_comp_units == 0) 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner TargetSP null_target; 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc(null_target, GetSP()); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t cu_idx; 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit) 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseCompileUnitFunctions(sc); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t func_idx; 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseFunctionBlocks(sc); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse the variables for this function and all its blocks 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseVariablesForContext(sc); 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Parse all types for this compile unit 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.function = NULL; 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ParseTypes(sc); 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::CalculateSymbolContext(SymbolContext* sc) 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc->module_sp = GetSP(); 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::DumpSymbolContext(Stream *s) 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf(", Module{0x%8.8x}", this); 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetNumCompileUnits() 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->GetNumCompileUnits(); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetCompileUnitAtIndex (uint32_t index) 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP cu_sp; 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (index < num_comp_units) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return cu_sp; 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//CompUnitSP 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindCompUnit(lldb::user_id_t uid) 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CompUnitSP cu_sp; 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// cu_sp = symbols->FindCompUnit(uid); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return cu_sp; 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Clear the result symbol context in case we don't find anything 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.Clear(); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get the section from the section/offset address. 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const Section *section = so_addr.GetSection(); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the section matches this module before we try and match anything 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section && section->GetModule() == this) 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If the section offset based address resolved itself, then this 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is the right module. 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.module_sp = GetSP(); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextModule; 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resolve the compile unit, function, block, line table or line 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry if requested. 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (resolve_scope & eSymbolContextCompUnit || 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextFunction || 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextBlock || 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope & eSymbolContextLineEntry ) 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 221bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham // Resolve the symbol if requested, but don't re-look it up if we've already found it. 222bddb78944a140c3ca1324d356aa83495331ff50dJim Ingham if (resolve_scope & eSymbolContextSymbol && !(resolved_flags & eSymbolContextSymbol)) 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile* ofile = GetObjectFile(); 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ofile) 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = ofile->GetSymtab(); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_addr.IsSectionOffset()) 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 244537a7a86687683fd403ce652d178fbc89e06ef9fGreg ClaytonModule::ResolveSymbolContextForFilePath 245537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton( 246537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton const char *file_path, 247537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t line, 248537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton bool check_inlines, 249537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton uint32_t resolve_scope, 250537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton SymbolContextList& sc_list 251537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton) 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 253537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec file_spec(file_path, false); 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory().AsCString(""), 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetDirectory() ? "/" : "", 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec.GetFilename().AsCString(""), 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner line, 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner check_inlines ? "yes" : "no", 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolve_scope); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t initial_count = sc_list.GetSize(); 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_count; 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(name, append, max_matches, variables); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 29812bec71b323dc520f0e985a86e09c4712559e115Greg ClaytonModule::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list) 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 30212bec71b323dc520f0e985a86e09c4712559e115Greg Clayton return symbols->FindFunctions(name, name_type_mask, append, sc_list); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFunctions(const RegularExpression& regex, bool append, SymbolContextList& sc_list) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbols->FindFunctions(regex, append, sc_list); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3157aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Claytonuint32_t 3167aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg ClaytonModule::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, TypeList& types) 3177aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton{ 3187aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 3197aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (sc.module_sp.get() == NULL || sc.module_sp.get() == this) 3207aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton { 3217aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton SymbolVendor *symbols = GetSymbolVendor (); 3227aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton if (symbols) 3237aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return symbols->FindTypes(sc, name, append, max_matches, types); 3247aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton } 3257aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton return 0; 3267aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton} 3277aff9ffaec7ffc44dec3c64557dfadcc8a0833a6Greg Clayton 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Timer scoped_timer(__PRETTY_FUNCTION__); 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendor *symbols = GetSymbolVendor (); 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (symbols) 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetSymbolVendor (bool can_create) 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 343236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_symbol_vendor == false && can_create) 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *obj_file = GetObjectFile (); 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (obj_file != NULL) 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 350236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_symbol_vendor = true; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_symfile_ap.get(); 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst FileSpec & 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetFileSpec () const 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_file; 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Container objects whose paths do not specify a file directly can call 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // this function to correct the file and object names. 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = file; 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_mod_time = file.GetModificationTime(); 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name = object_name; 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ArchSpec& 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetArchitecture () const 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_arch; 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::Dump(Stream *s) 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 3823fed8b9b2696fc2ea78005c8f9b1c621d5748042Greg Clayton //s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Indent(); 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("Module %s/%s%s%s%s\n", 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetDirectory().AsCString(), 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file.GetFilename().AsCString(), 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? "(" : "", 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? m_object_name.GetCString() : "", 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_object_name ? ")" : ""); 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentMore(); 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner objfile->Dump(s); 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbols->Dump(s); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->IndentLess(); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerTypeList* 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetTypeList () 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbols) 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &symbols->GetTypeList(); 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst ConstString & 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectName() const 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_object_name; 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetObjectFile() 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker (m_mutex); 425236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton if (m_did_load_objfile == false) 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 427236c1c71fab5d56a4dbebaabb969a238f11d142eGreg Clayton m_did_load_objfile = true; 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_objfile_ap.reset(ObjectFile::FindPlugin(this, &m_file, 0, m_file.GetByteSize())); 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_objfile_ap.get(); 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Symbol * 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile(); 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 4487c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return symtab->FindFirstSymbolWithNameAndType (name, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny); 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t num_indices = symbol_indexes.size(); 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_indices > 0) 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolContext sc; 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CalculateSymbolContext (&sc); 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i = 0; i < num_indices; i++) 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol) 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Append (sc); 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.AsCString(), 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // No need to protect this call using m_mutex all other method calls are 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // already thread safe. 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText(), 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type); 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t initial_size = sc_list.GetSize(); 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *objfile = GetObjectFile (); 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (objfile) 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = objfile->GetSymtab(); 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> symbol_indexes; 5167c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst TimeValue & 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule::GetModificationTime () const 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_mod_time; 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5287508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 5297508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 5307508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::IsExecutable () 5317508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 5327508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (GetObjectFile() == NULL) 5337508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 5347508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 5357508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return GetObjectFile()->IsExecutable(); 5367508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 5377508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 5387508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 5397508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamModule::SetArchitecture (const ArchSpec &new_arch) 5407508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 5417508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham if (m_arch == new_arch) 5427508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 5437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else if (!m_arch.IsValid()) 5447508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 5457508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham m_arch = new_arch; 5467508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return true; 5477508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 5487508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham else 5497508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham { 5507508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham return false; 5517508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham } 5527508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 5537508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 5547508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 555