uint64_t IRExecutionUnit::MemoryManager::getSymbolAddress(const std::string &Name) { Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); SymbolContextList sc_list; ExecutionContextScope *exe_scope = m_parent.GetBestExecutionContextScope(); lldb::TargetSP target_sp = exe_scope->CalculateTarget(); const char *name = Name.c_str(); ConstString bare_name_cs(name); ConstString name_cs; if (name[0] == '_') name_cs = ConstString(name + 1); if (!target_sp) { if (log) log->Printf("IRExecutionUnit::getSymbolAddress(Name=\"%s\") = <no target>", Name.c_str()); m_parent.ReportSymbolLookupError(name_cs); return 0xbad0bad0; } uint32_t num_matches = 0; lldb::ProcessSP process_sp = exe_scope->CalculateProcess(); if (!name_cs.IsEmpty()) { target_sp->GetImages().FindSymbolsWithNameAndType(name_cs, lldb::eSymbolTypeAny, sc_list); num_matches = sc_list.GetSize(); } if (!num_matches) { target_sp->GetImages().FindSymbolsWithNameAndType(bare_name_cs, lldb::eSymbolTypeAny, sc_list); num_matches = sc_list.GetSize(); } lldb::addr_t symbol_load_addr = LLDB_INVALID_ADDRESS; for (uint32_t i=0; i<num_matches && (symbol_load_addr == 0 || symbol_load_addr == LLDB_INVALID_ADDRESS); i++) { SymbolContext sym_ctx; sc_list.GetContextAtIndex(i, sym_ctx); symbol_load_addr = sym_ctx.symbol->ResolveCallableAddress(*target_sp); if (symbol_load_addr == LLDB_INVALID_ADDRESS) symbol_load_addr = sym_ctx.symbol->GetAddress().GetLoadAddress(target_sp.get()); } if (symbol_load_addr == LLDB_INVALID_ADDRESS && process_sp && name_cs) { // Try the Objective-C language runtime. ObjCLanguageRuntime *runtime = process_sp->GetObjCLanguageRuntime(); if (runtime) symbol_load_addr = runtime->LookupRuntimeSymbol(name_cs); } if (symbol_load_addr == LLDB_INVALID_ADDRESS) { if (log) log->Printf("IRExecutionUnit::getSymbolAddress(Name=\"%s\") = <not found>", name); m_parent.ReportSymbolLookupError(bare_name_cs); return 0xbad0bad0; } if (log) log->Printf("IRExecutionUnit::getSymbolAddress(Name=\"%s\") = %" PRIx64, name, symbol_load_addr); if (symbol_load_addr == 0) return 0xbad00add; return symbol_load_addr; }