1*30fdc8d8SChris Lattner //===-- Module.cpp ----------------------------------------------*- C++ -*-===// 2*30fdc8d8SChris Lattner // 3*30fdc8d8SChris Lattner // The LLVM Compiler Infrastructure 4*30fdc8d8SChris Lattner // 5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source 6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details. 7*30fdc8d8SChris Lattner // 8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 9*30fdc8d8SChris Lattner 10*30fdc8d8SChris Lattner #include "lldb/Core/Module.h" 11*30fdc8d8SChris Lattner #include "lldb/Core/Log.h" 12*30fdc8d8SChris Lattner #include "lldb/Core/ModuleList.h" 13*30fdc8d8SChris Lattner #include "lldb/Core/RegularExpression.h" 14*30fdc8d8SChris Lattner #include "lldb/Core/Timer.h" 15*30fdc8d8SChris Lattner #include "lldb/lldb-private-log.h" 16*30fdc8d8SChris Lattner #include "lldb/Symbol/ObjectFile.h" 17*30fdc8d8SChris Lattner #include "lldb/Symbol/SymbolContext.h" 18*30fdc8d8SChris Lattner #include "lldb/Symbol/SymbolVendor.h" 19*30fdc8d8SChris Lattner 20*30fdc8d8SChris Lattner using namespace lldb; 21*30fdc8d8SChris Lattner using namespace lldb_private; 22*30fdc8d8SChris Lattner 23*30fdc8d8SChris Lattner Module::Module(const FileSpec& file_spec, const ArchSpec& arch, const ConstString *object_name, off_t object_offset) : 24*30fdc8d8SChris Lattner m_mutex (Mutex::eMutexTypeRecursive), 25*30fdc8d8SChris Lattner m_mod_time (file_spec.GetModificationTime()), 26*30fdc8d8SChris Lattner m_arch (arch), 27*30fdc8d8SChris Lattner m_uuid (), 28*30fdc8d8SChris Lattner m_file (file_spec), 29*30fdc8d8SChris Lattner m_flags (), 30*30fdc8d8SChris Lattner m_object_name (), 31*30fdc8d8SChris Lattner m_objfile_ap (), 32*30fdc8d8SChris Lattner m_symfile_ap () 33*30fdc8d8SChris Lattner { 34*30fdc8d8SChris Lattner if (object_name) 35*30fdc8d8SChris Lattner m_object_name = *object_name; 36*30fdc8d8SChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT); 37*30fdc8d8SChris Lattner if (log) 38*30fdc8d8SChris Lattner log->Printf ("%p Module::Module((%s) '%s/%s%s%s%s')", 39*30fdc8d8SChris Lattner this, 40*30fdc8d8SChris Lattner m_arch.AsCString(), 41*30fdc8d8SChris Lattner m_file.GetDirectory().AsCString(""), 42*30fdc8d8SChris Lattner m_file.GetFilename().AsCString(""), 43*30fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : "(", 44*30fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 45*30fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : ")"); 46*30fdc8d8SChris Lattner 47*30fdc8d8SChris Lattner } 48*30fdc8d8SChris Lattner 49*30fdc8d8SChris Lattner Module::~Module() 50*30fdc8d8SChris Lattner { 51*30fdc8d8SChris Lattner Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT); 52*30fdc8d8SChris Lattner if (log) 53*30fdc8d8SChris Lattner log->Printf ("%p Module::~Module((%s) '%s/%s%s%s%s')", 54*30fdc8d8SChris Lattner this, 55*30fdc8d8SChris Lattner m_arch.AsCString(), 56*30fdc8d8SChris Lattner m_file.GetDirectory().AsCString(""), 57*30fdc8d8SChris Lattner m_file.GetFilename().AsCString(""), 58*30fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : "(", 59*30fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : m_object_name.AsCString(""), 60*30fdc8d8SChris Lattner m_object_name.IsEmpty() ? "" : ")"); 61*30fdc8d8SChris Lattner } 62*30fdc8d8SChris Lattner 63*30fdc8d8SChris Lattner 64*30fdc8d8SChris Lattner ModuleSP 65*30fdc8d8SChris Lattner Module::GetSP () 66*30fdc8d8SChris Lattner { 67*30fdc8d8SChris Lattner return ModuleList::GetModuleSP (this); 68*30fdc8d8SChris Lattner } 69*30fdc8d8SChris Lattner 70*30fdc8d8SChris Lattner const UUID& 71*30fdc8d8SChris Lattner Module::GetUUID() 72*30fdc8d8SChris Lattner { 73*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 74*30fdc8d8SChris Lattner if (m_flags.IsClear(flagsParsedUUID)) 75*30fdc8d8SChris Lattner { 76*30fdc8d8SChris Lattner ObjectFile * obj_file = GetObjectFile (); 77*30fdc8d8SChris Lattner 78*30fdc8d8SChris Lattner if (obj_file != NULL) 79*30fdc8d8SChris Lattner { 80*30fdc8d8SChris Lattner obj_file->GetUUID(&m_uuid); 81*30fdc8d8SChris Lattner m_flags.Set(flagsParsedUUID); 82*30fdc8d8SChris Lattner } 83*30fdc8d8SChris Lattner } 84*30fdc8d8SChris Lattner return m_uuid; 85*30fdc8d8SChris Lattner } 86*30fdc8d8SChris Lattner 87*30fdc8d8SChris Lattner void 88*30fdc8d8SChris Lattner Module::ParseAllDebugSymbols() 89*30fdc8d8SChris Lattner { 90*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 91*30fdc8d8SChris Lattner uint32_t num_comp_units = GetNumCompileUnits(); 92*30fdc8d8SChris Lattner if (num_comp_units == 0) 93*30fdc8d8SChris Lattner return; 94*30fdc8d8SChris Lattner 95*30fdc8d8SChris Lattner TargetSP null_target; 96*30fdc8d8SChris Lattner SymbolContext sc(null_target, GetSP()); 97*30fdc8d8SChris Lattner uint32_t cu_idx; 98*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 99*30fdc8d8SChris Lattner 100*30fdc8d8SChris Lattner for (cu_idx = 0; cu_idx < num_comp_units; cu_idx++) 101*30fdc8d8SChris Lattner { 102*30fdc8d8SChris Lattner sc.comp_unit = symbols->GetCompileUnitAtIndex(cu_idx).get(); 103*30fdc8d8SChris Lattner if (sc.comp_unit) 104*30fdc8d8SChris Lattner { 105*30fdc8d8SChris Lattner sc.function = NULL; 106*30fdc8d8SChris Lattner symbols->ParseVariablesForContext(sc); 107*30fdc8d8SChris Lattner 108*30fdc8d8SChris Lattner symbols->ParseCompileUnitFunctions(sc); 109*30fdc8d8SChris Lattner 110*30fdc8d8SChris Lattner uint32_t func_idx; 111*30fdc8d8SChris Lattner for (func_idx = 0; (sc.function = sc.comp_unit->GetFunctionAtIndex(func_idx).get()) != NULL; ++func_idx) 112*30fdc8d8SChris Lattner { 113*30fdc8d8SChris Lattner symbols->ParseFunctionBlocks(sc); 114*30fdc8d8SChris Lattner 115*30fdc8d8SChris Lattner // Parse the variables for this function and all its blocks 116*30fdc8d8SChris Lattner symbols->ParseVariablesForContext(sc); 117*30fdc8d8SChris Lattner } 118*30fdc8d8SChris Lattner 119*30fdc8d8SChris Lattner 120*30fdc8d8SChris Lattner // Parse all types for this compile unit 121*30fdc8d8SChris Lattner sc.function = NULL; 122*30fdc8d8SChris Lattner symbols->ParseTypes(sc); 123*30fdc8d8SChris Lattner } 124*30fdc8d8SChris Lattner } 125*30fdc8d8SChris Lattner } 126*30fdc8d8SChris Lattner 127*30fdc8d8SChris Lattner void 128*30fdc8d8SChris Lattner Module::CalculateSymbolContext(SymbolContext* sc) 129*30fdc8d8SChris Lattner { 130*30fdc8d8SChris Lattner sc->module_sp = GetSP(); 131*30fdc8d8SChris Lattner } 132*30fdc8d8SChris Lattner 133*30fdc8d8SChris Lattner void 134*30fdc8d8SChris Lattner Module::DumpSymbolContext(Stream *s) 135*30fdc8d8SChris Lattner { 136*30fdc8d8SChris Lattner s->Printf(", Module{0x%8.8x}", this); 137*30fdc8d8SChris Lattner } 138*30fdc8d8SChris Lattner 139*30fdc8d8SChris Lattner uint32_t 140*30fdc8d8SChris Lattner Module::GetNumCompileUnits() 141*30fdc8d8SChris Lattner { 142*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 143*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::GetNumCompileUnits (module = %p)", this); 144*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 145*30fdc8d8SChris Lattner if (symbols) 146*30fdc8d8SChris Lattner return symbols->GetNumCompileUnits(); 147*30fdc8d8SChris Lattner return 0; 148*30fdc8d8SChris Lattner } 149*30fdc8d8SChris Lattner 150*30fdc8d8SChris Lattner CompUnitSP 151*30fdc8d8SChris Lattner Module::GetCompileUnitAtIndex (uint32_t index) 152*30fdc8d8SChris Lattner { 153*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 154*30fdc8d8SChris Lattner uint32_t num_comp_units = GetNumCompileUnits (); 155*30fdc8d8SChris Lattner CompUnitSP cu_sp; 156*30fdc8d8SChris Lattner 157*30fdc8d8SChris Lattner if (index < num_comp_units) 158*30fdc8d8SChris Lattner { 159*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 160*30fdc8d8SChris Lattner if (symbols) 161*30fdc8d8SChris Lattner cu_sp = symbols->GetCompileUnitAtIndex(index); 162*30fdc8d8SChris Lattner } 163*30fdc8d8SChris Lattner return cu_sp; 164*30fdc8d8SChris Lattner } 165*30fdc8d8SChris Lattner 166*30fdc8d8SChris Lattner //CompUnitSP 167*30fdc8d8SChris Lattner //Module::FindCompUnit(lldb::user_id_t uid) 168*30fdc8d8SChris Lattner //{ 169*30fdc8d8SChris Lattner // CompUnitSP cu_sp; 170*30fdc8d8SChris Lattner // SymbolVendor *symbols = GetSymbolVendor (); 171*30fdc8d8SChris Lattner // if (symbols) 172*30fdc8d8SChris Lattner // cu_sp = symbols->FindCompUnit(uid); 173*30fdc8d8SChris Lattner // return cu_sp; 174*30fdc8d8SChris Lattner //} 175*30fdc8d8SChris Lattner 176*30fdc8d8SChris Lattner bool 177*30fdc8d8SChris Lattner Module::ResolveFileAddress (lldb::addr_t vm_addr, Address& so_addr) 178*30fdc8d8SChris Lattner { 179*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 180*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, "Module::ResolveFileAddress (vm_addr = 0x%llx)", vm_addr); 181*30fdc8d8SChris Lattner ObjectFile* ofile = GetObjectFile(); 182*30fdc8d8SChris Lattner if (ofile) 183*30fdc8d8SChris Lattner return so_addr.ResolveAddressUsingFileSections(vm_addr, ofile->GetSectionList()); 184*30fdc8d8SChris Lattner return false; 185*30fdc8d8SChris Lattner } 186*30fdc8d8SChris Lattner 187*30fdc8d8SChris Lattner uint32_t 188*30fdc8d8SChris Lattner Module::ResolveSymbolContextForAddress (const Address& so_addr, uint32_t resolve_scope, SymbolContext& sc) 189*30fdc8d8SChris Lattner { 190*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 191*30fdc8d8SChris Lattner uint32_t resolved_flags = 0; 192*30fdc8d8SChris Lattner 193*30fdc8d8SChris Lattner // Clear the result symbol context in case we don't find anything 194*30fdc8d8SChris Lattner sc.Clear(); 195*30fdc8d8SChris Lattner 196*30fdc8d8SChris Lattner // Get the section from the section/offset address. 197*30fdc8d8SChris Lattner const Section *section = so_addr.GetSection(); 198*30fdc8d8SChris Lattner 199*30fdc8d8SChris Lattner // Make sure the section matches this module before we try and match anything 200*30fdc8d8SChris Lattner if (section && section->GetModule() == this) 201*30fdc8d8SChris Lattner { 202*30fdc8d8SChris Lattner // If the section offset based address resolved itself, then this 203*30fdc8d8SChris Lattner // is the right module. 204*30fdc8d8SChris Lattner sc.module_sp = GetSP(); 205*30fdc8d8SChris Lattner resolved_flags |= eSymbolContextModule; 206*30fdc8d8SChris Lattner 207*30fdc8d8SChris Lattner // Resolve the compile unit, function, block, line table or line 208*30fdc8d8SChris Lattner // entry if requested. 209*30fdc8d8SChris Lattner if (resolve_scope & eSymbolContextCompUnit || 210*30fdc8d8SChris Lattner resolve_scope & eSymbolContextFunction || 211*30fdc8d8SChris Lattner resolve_scope & eSymbolContextBlock || 212*30fdc8d8SChris Lattner resolve_scope & eSymbolContextLineEntry ) 213*30fdc8d8SChris Lattner { 214*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 215*30fdc8d8SChris Lattner if (symbols) 216*30fdc8d8SChris Lattner resolved_flags |= symbols->ResolveSymbolContext (so_addr, resolve_scope, sc); 217*30fdc8d8SChris Lattner } 218*30fdc8d8SChris Lattner 219*30fdc8d8SChris Lattner // Resolve the symbol if requested 220*30fdc8d8SChris Lattner if (resolve_scope & eSymbolContextSymbol) 221*30fdc8d8SChris Lattner { 222*30fdc8d8SChris Lattner ObjectFile* ofile = GetObjectFile(); 223*30fdc8d8SChris Lattner if (ofile) 224*30fdc8d8SChris Lattner { 225*30fdc8d8SChris Lattner Symtab *symtab = ofile->GetSymtab(); 226*30fdc8d8SChris Lattner if (symtab) 227*30fdc8d8SChris Lattner { 228*30fdc8d8SChris Lattner if (so_addr.IsSectionOffset()) 229*30fdc8d8SChris Lattner { 230*30fdc8d8SChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress(so_addr.GetFileAddress()); 231*30fdc8d8SChris Lattner if (sc.symbol) 232*30fdc8d8SChris Lattner resolved_flags |= eSymbolContextSymbol; 233*30fdc8d8SChris Lattner } 234*30fdc8d8SChris Lattner } 235*30fdc8d8SChris Lattner } 236*30fdc8d8SChris Lattner } 237*30fdc8d8SChris Lattner } 238*30fdc8d8SChris Lattner return resolved_flags; 239*30fdc8d8SChris Lattner } 240*30fdc8d8SChris Lattner 241*30fdc8d8SChris Lattner uint32_t 242*30fdc8d8SChris Lattner Module::ResolveSymbolContextForFilePath (const char *file_path, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 243*30fdc8d8SChris Lattner { 244*30fdc8d8SChris Lattner FileSpec file_spec(file_path); 245*30fdc8d8SChris Lattner return ResolveSymbolContextsForFileSpec (file_spec, line, check_inlines, resolve_scope, sc_list); 246*30fdc8d8SChris Lattner } 247*30fdc8d8SChris Lattner 248*30fdc8d8SChris Lattner uint32_t 249*30fdc8d8SChris Lattner Module::ResolveSymbolContextsForFileSpec (const FileSpec &file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 250*30fdc8d8SChris Lattner { 251*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 252*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 253*30fdc8d8SChris Lattner "Module::ResolveSymbolContextForFilePath (%s%s%s:%u, check_inlines = %s, resolve_scope = 0x%8.8x)", 254*30fdc8d8SChris Lattner file_spec.GetDirectory().AsCString(""), 255*30fdc8d8SChris Lattner file_spec.GetDirectory() ? "/" : "", 256*30fdc8d8SChris Lattner file_spec.GetFilename().AsCString(""), 257*30fdc8d8SChris Lattner line, 258*30fdc8d8SChris Lattner check_inlines ? "yes" : "no", 259*30fdc8d8SChris Lattner resolve_scope); 260*30fdc8d8SChris Lattner 261*30fdc8d8SChris Lattner const uint32_t initial_count = sc_list.GetSize(); 262*30fdc8d8SChris Lattner 263*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 264*30fdc8d8SChris Lattner if (symbols) 265*30fdc8d8SChris Lattner symbols->ResolveSymbolContext (file_spec, line, check_inlines, resolve_scope, sc_list); 266*30fdc8d8SChris Lattner 267*30fdc8d8SChris Lattner return sc_list.GetSize() - initial_count; 268*30fdc8d8SChris Lattner } 269*30fdc8d8SChris Lattner 270*30fdc8d8SChris Lattner 271*30fdc8d8SChris Lattner uint32_t 272*30fdc8d8SChris Lattner Module::FindGlobalVariables(const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 273*30fdc8d8SChris Lattner { 274*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 275*30fdc8d8SChris Lattner if (symbols) 276*30fdc8d8SChris Lattner return symbols->FindGlobalVariables(name, append, max_matches, variables); 277*30fdc8d8SChris Lattner return 0; 278*30fdc8d8SChris Lattner } 279*30fdc8d8SChris Lattner uint32_t 280*30fdc8d8SChris Lattner Module::FindGlobalVariables(const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 281*30fdc8d8SChris Lattner { 282*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 283*30fdc8d8SChris Lattner if (symbols) 284*30fdc8d8SChris Lattner return symbols->FindGlobalVariables(regex, append, max_matches, variables); 285*30fdc8d8SChris Lattner return 0; 286*30fdc8d8SChris Lattner } 287*30fdc8d8SChris Lattner 288*30fdc8d8SChris Lattner uint32_t 289*30fdc8d8SChris Lattner Module::FindFunctions(const ConstString &name, bool append, SymbolContextList& sc_list) 290*30fdc8d8SChris Lattner { 291*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 292*30fdc8d8SChris Lattner if (symbols) 293*30fdc8d8SChris Lattner return symbols->FindFunctions(name, append, sc_list); 294*30fdc8d8SChris Lattner return 0; 295*30fdc8d8SChris Lattner } 296*30fdc8d8SChris Lattner 297*30fdc8d8SChris Lattner uint32_t 298*30fdc8d8SChris Lattner Module::FindFunctions(const RegularExpression& regex, bool append, SymbolContextList& sc_list) 299*30fdc8d8SChris Lattner { 300*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 301*30fdc8d8SChris Lattner if (symbols) 302*30fdc8d8SChris Lattner return symbols->FindFunctions(regex, append, sc_list); 303*30fdc8d8SChris Lattner return 0; 304*30fdc8d8SChris Lattner } 305*30fdc8d8SChris Lattner 306*30fdc8d8SChris Lattner //uint32_t 307*30fdc8d8SChris Lattner //Module::FindTypes(const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 308*30fdc8d8SChris Lattner //{ 309*30fdc8d8SChris Lattner // Timer scoped_timer(__PRETTY_FUNCTION__); 310*30fdc8d8SChris Lattner // SymbolVendor *symbols = GetSymbolVendor (); 311*30fdc8d8SChris Lattner // if (symbols) 312*30fdc8d8SChris Lattner // return symbols->FindTypes(sc, name, append, max_matches, encoding, udt_name, types); 313*30fdc8d8SChris Lattner // return 0; 314*30fdc8d8SChris Lattner //} 315*30fdc8d8SChris Lattner // 316*30fdc8d8SChris Lattner //uint32_t 317*30fdc8d8SChris Lattner //Module::FindTypes(const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, const char *udt_name, TypeList& types) 318*30fdc8d8SChris Lattner //{ 319*30fdc8d8SChris Lattner // Timer scoped_timer(__PRETTY_FUNCTION__); 320*30fdc8d8SChris Lattner // SymbolVendor *symbols = GetSymbolVendor (); 321*30fdc8d8SChris Lattner // if (symbols) 322*30fdc8d8SChris Lattner // return symbols->FindTypes(sc, regex, append, max_matches, encoding, udt_name, types); 323*30fdc8d8SChris Lattner // return 0; 324*30fdc8d8SChris Lattner // 325*30fdc8d8SChris Lattner //} 326*30fdc8d8SChris Lattner 327*30fdc8d8SChris Lattner SymbolVendor* 328*30fdc8d8SChris Lattner Module::GetSymbolVendor (bool can_create) 329*30fdc8d8SChris Lattner { 330*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 331*30fdc8d8SChris Lattner if (m_flags.IsClear(flagsSearchedForSymVendor) && can_create) 332*30fdc8d8SChris Lattner { 333*30fdc8d8SChris Lattner ObjectFile *obj_file = GetObjectFile (); 334*30fdc8d8SChris Lattner if (obj_file != NULL) 335*30fdc8d8SChris Lattner { 336*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, __PRETTY_FUNCTION__); 337*30fdc8d8SChris Lattner m_symfile_ap.reset(SymbolVendor::FindPlugin(this)); 338*30fdc8d8SChris Lattner m_flags.Set (flagsSearchedForSymVendor); 339*30fdc8d8SChris Lattner } 340*30fdc8d8SChris Lattner } 341*30fdc8d8SChris Lattner return m_symfile_ap.get(); 342*30fdc8d8SChris Lattner } 343*30fdc8d8SChris Lattner 344*30fdc8d8SChris Lattner const FileSpec & 345*30fdc8d8SChris Lattner Module::GetFileSpec () const 346*30fdc8d8SChris Lattner { 347*30fdc8d8SChris Lattner return m_file; 348*30fdc8d8SChris Lattner } 349*30fdc8d8SChris Lattner 350*30fdc8d8SChris Lattner void 351*30fdc8d8SChris Lattner Module::SetFileSpecAndObjectName (const FileSpec &file, const ConstString &object_name) 352*30fdc8d8SChris Lattner { 353*30fdc8d8SChris Lattner // Container objects whose paths do not specify a file directly can call 354*30fdc8d8SChris Lattner // this function to correct the file and object names. 355*30fdc8d8SChris Lattner m_file = file; 356*30fdc8d8SChris Lattner m_mod_time = file.GetModificationTime(); 357*30fdc8d8SChris Lattner m_object_name = object_name; 358*30fdc8d8SChris Lattner } 359*30fdc8d8SChris Lattner 360*30fdc8d8SChris Lattner const ArchSpec& 361*30fdc8d8SChris Lattner Module::GetArchitecture () const 362*30fdc8d8SChris Lattner { 363*30fdc8d8SChris Lattner return m_arch; 364*30fdc8d8SChris Lattner } 365*30fdc8d8SChris Lattner 366*30fdc8d8SChris Lattner void 367*30fdc8d8SChris Lattner Module::Dump(Stream *s) 368*30fdc8d8SChris Lattner { 369*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 370*30fdc8d8SChris Lattner s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 371*30fdc8d8SChris Lattner s->Indent(); 372*30fdc8d8SChris Lattner s->Printf("Module %s/%s%s%s%s\n", 373*30fdc8d8SChris Lattner m_file.GetDirectory().AsCString(), 374*30fdc8d8SChris Lattner m_file.GetFilename().AsCString(), 375*30fdc8d8SChris Lattner m_object_name ? "(" : "", 376*30fdc8d8SChris Lattner m_object_name ? m_object_name.GetCString() : "", 377*30fdc8d8SChris Lattner m_object_name ? ")" : ""); 378*30fdc8d8SChris Lattner 379*30fdc8d8SChris Lattner s->IndentMore(); 380*30fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile (); 381*30fdc8d8SChris Lattner 382*30fdc8d8SChris Lattner if (objfile) 383*30fdc8d8SChris Lattner objfile->Dump(s); 384*30fdc8d8SChris Lattner 385*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 386*30fdc8d8SChris Lattner 387*30fdc8d8SChris Lattner if (symbols) 388*30fdc8d8SChris Lattner symbols->Dump(s); 389*30fdc8d8SChris Lattner 390*30fdc8d8SChris Lattner s->IndentLess(); 391*30fdc8d8SChris Lattner } 392*30fdc8d8SChris Lattner 393*30fdc8d8SChris Lattner 394*30fdc8d8SChris Lattner TypeList* 395*30fdc8d8SChris Lattner Module::GetTypeList () 396*30fdc8d8SChris Lattner { 397*30fdc8d8SChris Lattner SymbolVendor *symbols = GetSymbolVendor (); 398*30fdc8d8SChris Lattner if (symbols) 399*30fdc8d8SChris Lattner return &symbols->GetTypeList(); 400*30fdc8d8SChris Lattner return NULL; 401*30fdc8d8SChris Lattner } 402*30fdc8d8SChris Lattner 403*30fdc8d8SChris Lattner const ConstString & 404*30fdc8d8SChris Lattner Module::GetObjectName() const 405*30fdc8d8SChris Lattner { 406*30fdc8d8SChris Lattner return m_object_name; 407*30fdc8d8SChris Lattner } 408*30fdc8d8SChris Lattner 409*30fdc8d8SChris Lattner ObjectFile * 410*30fdc8d8SChris Lattner Module::GetObjectFile() 411*30fdc8d8SChris Lattner { 412*30fdc8d8SChris Lattner Mutex::Locker locker (m_mutex); 413*30fdc8d8SChris Lattner if (m_flags.IsClear(flagsSearchedForObjParser)) 414*30fdc8d8SChris Lattner { 415*30fdc8d8SChris Lattner m_flags.Set (flagsSearchedForObjParser); 416*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 417*30fdc8d8SChris Lattner "Module::GetObjectFile () module = %s", GetFileSpec().GetFilename().AsCString("")); 418*30fdc8d8SChris Lattner m_objfile_ap.reset(ObjectFile::FindPlugin(this, &m_file, 0, m_file.GetByteSize())); 419*30fdc8d8SChris Lattner } 420*30fdc8d8SChris Lattner return m_objfile_ap.get(); 421*30fdc8d8SChris Lattner } 422*30fdc8d8SChris Lattner 423*30fdc8d8SChris Lattner 424*30fdc8d8SChris Lattner const Symbol * 425*30fdc8d8SChris Lattner Module::FindFirstSymbolWithNameAndType (const ConstString &name, SymbolType symbol_type) 426*30fdc8d8SChris Lattner { 427*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 428*30fdc8d8SChris Lattner "Module::FindFirstSymbolWithNameAndType (name = %s, type = %i)", 429*30fdc8d8SChris Lattner name.AsCString(), 430*30fdc8d8SChris Lattner symbol_type); 431*30fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile(); 432*30fdc8d8SChris Lattner if (objfile) 433*30fdc8d8SChris Lattner { 434*30fdc8d8SChris Lattner Symtab *symtab = objfile->GetSymtab(); 435*30fdc8d8SChris Lattner if (symtab) 436*30fdc8d8SChris Lattner return symtab->FindFirstSymbolWithNameAndType (name, symbol_type); 437*30fdc8d8SChris Lattner } 438*30fdc8d8SChris Lattner return NULL; 439*30fdc8d8SChris Lattner } 440*30fdc8d8SChris Lattner void 441*30fdc8d8SChris Lattner Module::SymbolIndicesToSymbolContextList (Symtab *symtab, std::vector<uint32_t> &symbol_indexes, SymbolContextList &sc_list) 442*30fdc8d8SChris Lattner { 443*30fdc8d8SChris Lattner // No need to protect this call using m_mutex all other method calls are 444*30fdc8d8SChris Lattner // already thread safe. 445*30fdc8d8SChris Lattner 446*30fdc8d8SChris Lattner size_t num_indices = symbol_indexes.size(); 447*30fdc8d8SChris Lattner if (num_indices > 0) 448*30fdc8d8SChris Lattner { 449*30fdc8d8SChris Lattner SymbolContext sc; 450*30fdc8d8SChris Lattner CalculateSymbolContext (&sc); 451*30fdc8d8SChris Lattner for (size_t i = 0; i < num_indices; i++) 452*30fdc8d8SChris Lattner { 453*30fdc8d8SChris Lattner sc.symbol = symtab->SymbolAtIndex (symbol_indexes[i]); 454*30fdc8d8SChris Lattner if (sc.symbol) 455*30fdc8d8SChris Lattner sc_list.Append (sc); 456*30fdc8d8SChris Lattner } 457*30fdc8d8SChris Lattner } 458*30fdc8d8SChris Lattner } 459*30fdc8d8SChris Lattner 460*30fdc8d8SChris Lattner size_t 461*30fdc8d8SChris Lattner Module::FindSymbolsWithNameAndType (const ConstString &name, SymbolType symbol_type, SymbolContextList &sc_list) 462*30fdc8d8SChris Lattner { 463*30fdc8d8SChris Lattner // No need to protect this call using m_mutex all other method calls are 464*30fdc8d8SChris Lattner // already thread safe. 465*30fdc8d8SChris Lattner 466*30fdc8d8SChris Lattner 467*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 468*30fdc8d8SChris Lattner "Module::FindSymbolsWithNameAndType (name = %s, type = %i)", 469*30fdc8d8SChris Lattner name.AsCString(), 470*30fdc8d8SChris Lattner symbol_type); 471*30fdc8d8SChris Lattner const size_t initial_size = sc_list.GetSize(); 472*30fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile (); 473*30fdc8d8SChris Lattner if (objfile) 474*30fdc8d8SChris Lattner { 475*30fdc8d8SChris Lattner Symtab *symtab = objfile->GetSymtab(); 476*30fdc8d8SChris Lattner if (symtab) 477*30fdc8d8SChris Lattner { 478*30fdc8d8SChris Lattner std::vector<uint32_t> symbol_indexes; 479*30fdc8d8SChris Lattner symtab->FindAllSymbolsWithNameAndType (name, symbol_type, symbol_indexes); 480*30fdc8d8SChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 481*30fdc8d8SChris Lattner } 482*30fdc8d8SChris Lattner } 483*30fdc8d8SChris Lattner return sc_list.GetSize() - initial_size; 484*30fdc8d8SChris Lattner } 485*30fdc8d8SChris Lattner 486*30fdc8d8SChris Lattner size_t 487*30fdc8d8SChris Lattner Module::FindSymbolsMatchingRegExAndType (const RegularExpression ®ex, SymbolType symbol_type, SymbolContextList &sc_list) 488*30fdc8d8SChris Lattner { 489*30fdc8d8SChris Lattner // No need to protect this call using m_mutex all other method calls are 490*30fdc8d8SChris Lattner // already thread safe. 491*30fdc8d8SChris Lattner 492*30fdc8d8SChris Lattner Timer scoped_timer(__PRETTY_FUNCTION__, 493*30fdc8d8SChris Lattner "Module::FindSymbolsMatchingRegExAndType (regex = %s, type = %i)", 494*30fdc8d8SChris Lattner regex.GetText(), 495*30fdc8d8SChris Lattner symbol_type); 496*30fdc8d8SChris Lattner const size_t initial_size = sc_list.GetSize(); 497*30fdc8d8SChris Lattner ObjectFile *objfile = GetObjectFile (); 498*30fdc8d8SChris Lattner if (objfile) 499*30fdc8d8SChris Lattner { 500*30fdc8d8SChris Lattner Symtab *symtab = objfile->GetSymtab(); 501*30fdc8d8SChris Lattner if (symtab) 502*30fdc8d8SChris Lattner { 503*30fdc8d8SChris Lattner std::vector<uint32_t> symbol_indexes; 504*30fdc8d8SChris Lattner symtab->FindAllSymbolsMatchingRexExAndType (regex, symbol_type, symbol_indexes); 505*30fdc8d8SChris Lattner SymbolIndicesToSymbolContextList (symtab, symbol_indexes, sc_list); 506*30fdc8d8SChris Lattner } 507*30fdc8d8SChris Lattner } 508*30fdc8d8SChris Lattner return sc_list.GetSize() - initial_size; 509*30fdc8d8SChris Lattner } 510*30fdc8d8SChris Lattner 511*30fdc8d8SChris Lattner const TimeValue & 512*30fdc8d8SChris Lattner Module::GetModificationTime () const 513*30fdc8d8SChris Lattner { 514*30fdc8d8SChris Lattner return m_mod_time; 515*30fdc8d8SChris Lattner } 516