lldb::SBSymbolContextList SBModule::FindSymbols (const char *name, lldb::SymbolType symbol_type) { SBSymbolContextList sb_sc_list; if (name && name[0]) { ModuleSP module_sp (GetSP ()); Symtab *symtab = GetUnifiedSymbolTable (module_sp); if (symtab) { std::vector<uint32_t> matching_symbol_indexes; const size_t num_matches = symtab->FindAllSymbolsWithNameAndType(ConstString(name), symbol_type, matching_symbol_indexes); if (num_matches) { SymbolContext sc; sc.module_sp = module_sp; SymbolContextList &sc_list = *sb_sc_list; for (size_t i=0; i<num_matches; ++i) { sc.symbol = symtab->SymbolAtIndex (matching_symbol_indexes[i]); if (sc.symbol) sc_list.Append(sc); } } } } return sb_sc_list; }
SBSymbol SBModule::GetSymbolAtIndex(size_t idx) { SBSymbol sb_symbol; ModuleSP module_sp(GetSP()); Symtab *symtab = GetUnifiedSymbolTable(module_sp); if (symtab) sb_symbol.SetSymbol(symtab->SymbolAtIndex(idx)); return sb_symbol; }
uint32_t Module::FindFunctions (const ConstString &name, const ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_symbols, bool include_inlines, bool append, SymbolContextList& sc_list) { if (!append) sc_list.Clear(); const uint32_t start_size = sc_list.GetSize(); // Find all the functions (not symbols, but debug information functions... SymbolVendor *symbols = GetSymbolVendor (); if (symbols) symbols->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, append, sc_list); // Now check our symbol table for symbols that are code symbols if requested if (include_symbols) { ObjectFile *objfile = GetObjectFile(); if (objfile) { Symtab *symtab = objfile->GetSymtab(); if (symtab) { std::vector<uint32_t> symbol_indexes; symtab->FindAllSymbolsWithNameAndType (name, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); const uint32_t num_matches = symbol_indexes.size(); if (num_matches) { const bool merge_symbol_into_function = true; SymbolContext sc(this); for (uint32_t i=0; i<num_matches; i++) { sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); sc_list.AppendIfUnique (sc, merge_symbol_into_function); } } } } } return sc_list.GetSize() - start_size; }
SBSymbol SBModule::GetSymbolAtIndex (size_t idx) { SBSymbol sb_symbol; ModuleSP module_sp (GetSP ()); if (module_sp) { ObjectFile *obj_file = module_sp->GetObjectFile(); if (obj_file) { Symtab *symtab = obj_file->GetSymtab(); if (symtab) sb_symbol.SetSymbol(symtab->SymbolAtIndex (idx)); } } return sb_symbol; }
uint32_t Module::FindFunctions (const RegularExpression& regex, bool include_symbols, bool include_inlines, bool append, SymbolContextList& sc_list) { if (!append) sc_list.Clear(); const uint32_t start_size = sc_list.GetSize(); SymbolVendor *symbols = GetSymbolVendor (); if (symbols) symbols->FindFunctions(regex, include_inlines, append, sc_list); // Now check our symbol table for symbols that are code symbols if requested if (include_symbols) { ObjectFile *objfile = GetObjectFile(); if (objfile) { Symtab *symtab = objfile->GetSymtab(); if (symtab) { std::vector<uint32_t> symbol_indexes; symtab->AppendSymbolIndexesMatchingRegExAndType (regex, eSymbolTypeCode, Symtab::eDebugAny, Symtab::eVisibilityAny, symbol_indexes); const uint32_t num_matches = symbol_indexes.size(); if (num_matches) { const bool merge_symbol_into_function = true; SymbolContext sc(this); for (uint32_t i=0; i<num_matches; i++) { sc.symbol = symtab->SymbolAtIndex(symbol_indexes[i]); sc_list.AppendIfUnique (sc, merge_symbol_into_function); } } } } } return sc_list.GetSize() - start_size; }