SymbolFileDWARFDebugMap.cpp revision 12bec71b323dc520f0e985a86e09c4712559e115
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolFileDWARFDebugMap.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 "SymbolFileDWARFDebugMap.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Initialize() 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::RegisterPlugin (GetPluginNameStatic(), 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(), 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateInstance); 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Terminate() 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::UnregisterPlugin (CreateInstance); 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginNameStatic() 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "symbol-file.dwarf2-debugmap"; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginDescriptionStatic() 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "DWARF and DWARF3 debug symbol file reader (debug map)."; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile* 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file) 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return new SymbolFileDWARFDebugMap (obj_file); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) : 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile(ofile), 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags(), 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos(), 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_func_indexes(), 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_glob_indexes() 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap() 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::InitOSO () 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_flags.test(kHaveInitializedOSOs)) 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.set(kHaveInitializedOSOs); 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //StreamFile s(0, 4, eByteOrderHost, stdout); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> oso_indexes; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithType(eSymbolTypeObjectFile, oso_indexes); 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->AppendSymbolIndexesWithType(eSymbolTypeFunction, m_func_indexes); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->AppendSymbolIndexesWithType(eSymbolTypeGlobal, m_glob_indexes); 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->SortSymbolIndexesByValue(m_func_indexes, true); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->SortSymbolIndexesByValue(m_glob_indexes, true); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos.resize(oso_index_count); 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s.Printf("%s N_OSO symbols:\n", __PRETTY_FUNCTION__); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// symtab->Dump(&s, oso_indexes); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<oso_index_count; ++i) 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0) 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]); 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx) 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < cu_count) 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info) 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_module_sp.get() == NULL) 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *oso_symbol = comp_unit_info->oso_symbol; 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_symbol) 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString()); 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ModuleList::GetSharedModule (oso_file_spec, 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_obj_file->GetModule()->GetArchitecture(), 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, // UUID pointer 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, // object name 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // object offset 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->oso_module_sp, 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL); 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //comp_unit_info->oso_module_sp.reset(new Module (oso_file_spec, m_obj_file->GetModule()->GetArchitecture())); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_info->oso_module_sp.get(); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec) 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_compile_unit_infos[oso_idx].so_file) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[oso_idx].so_symbol == NULL) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString()); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile) 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString(); 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str()); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec = m_compile_unit_infos[oso_idx].so_file; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx) 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByOSOIndex (oso_idx); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc) 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (comp_unit_info); 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor == NULL) 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info); 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_objfile) 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor(); 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile); 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// comp_unit_info->oso_dwarf_sp.reset (oso_dwarf); 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor) 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Set a bit that lets this DWARF file know that it is being 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // used along with a debug map and that it will have the 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // remapped sections that we do below. 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ((SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile())->GetFlags().Set(SymbolFileDWARF::flagsDWARFIsOSOForDebugMap); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp.reset(new SectionList); 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *exe_symtab = m_obj_file->GetSymtab(); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = oso_objfile->GetModule(); 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *oso_symtab = oso_objfile->GetSymtab(); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define DEBUG_OSO_DMAP // Do not check in with this defined... 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP) 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamFile s(stdout); 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO symtab:\n"; 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_symtab->Dump(&s, NULL); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO sections before:\n"; 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_objfile->GetSectionList()->Dump(&s, NULL, true); 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction; 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //SectionList *oso_sections = oso_objfile->Sections(); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now we need to make sections that map from zero based object 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // file addresses to where things eneded up in the main executable. 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_start_idx = comp_unit_info->oso_symbol->GetID() + 1; 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex(); 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t sect_id = 0x10000; 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t idx = oso_start_idx; idx < oso_end_idx; ++idx) 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx); 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_symbol) 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (exe_symbol->GetType()) 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eSymbolTypeFunction: 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For each N_FUN, or function that we run into in the debug map 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we make a new section that we add to the sections found in the 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // .o file. This new section has the file address set to what the 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // addresses are in the .o file, and the load address is adjusted 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to match where it ended up in the final executable! We do this 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // before we parse any dwarf info so that when it goes get parsed 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all section/offset addresses that get registered will resolve 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // correctly to the new addresses in the main executable. 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // First we find the original symbol in the .o file's symbol table 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeCode); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_fun_symbol) 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we found the symbol, then we 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* exe_fun_section = const_cast<Section *>(exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* oso_fun_section = const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_fun_section) 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now we create a section that we will add as a child of the 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // section in which the .o symbol (the N_FUN) exists. 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We use the exe_symbol size because the one in the .o file 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // will just be a symbol with no size, and the exe_symbol 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // size will reflect any size changes (ppc has been known to 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // shrink function sizes when it gets rid of jump islands that 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // aren't needed anymore). 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionSP oso_fun_section_sp (new Section (const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()), 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_module, // Module (the .o file) 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated! 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eSectionTypeDebug, 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), // File VM address offset in the current section 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetByteSize(), // File size (we need the size from the executable) 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, 0, 0)); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_section_sp->SetLinkedLocation (exe_fun_section, 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetValue().GetFileAddress() - exe_fun_section->GetFileAddress()); 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_section->GetChildren().AddSection(oso_fun_section_sp); 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eSymbolTypeGlobal: 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case eSymbolTypeStatic: 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For each N_GSYM we remap the address for the global by making 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a new section that we add to the sections found in the .o file. 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This new section has the file address set to what the 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // addresses are in the .o file, and the load address is adjusted 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to match where it ended up in the final executable! We do this 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // before we parse any dwarf info so that when it goes get parsed 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all section/offset addresses that get registered will resolve 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // correctly to the new addresses in the main executable. We 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // initially set the section size to be 1 byte, but will need to 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // fix up these addresses further after all globals have been 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // parsed to span the gaps, or we can find the global variable 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sizes from the DWARF info as we are parsing. 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if 0 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // First we find the non-stab entry that corresponds to the N_GSYM in the executable 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *exe_gsym_symbol = exe_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData); 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#else 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The mach-o object file parser already matches up the N_GSYM with with the non-stab 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry, so we shouldn't have to do that. If this ever changes, enable the code above 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // in the "#if 0" block. STSYM's always match the symbol as found below. 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *exe_gsym_symbol = exe_symbol; 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData); 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_gsym_symbol && oso_gsym_symbol) 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we found the symbol, then we 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* exe_gsym_section = const_cast<Section *>(exe_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* oso_gsym_section = const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_gsym_section) 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionSP oso_gsym_section_sp (new Section (const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()), 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_module, // Module (the .o file) 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated! 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eSectionTypeDebug, 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), // File VM address offset in the current section 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1, // We don't know the size of the global, just do the main address for now. 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, 0, 0)); 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section, 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_gsym_symbol->GetValue().GetFileAddress() - exe_gsym_section->GetFileAddress()); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp); 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp); 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case eSymbolTypeStatic: 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // For each N_STSYM we remap the address for the global by making 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // a new section that we add to the sections found in the .o file. 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // This new section has the file address set to what the 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // addresses are in the .o file, and the load address is adjusted 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // to match where it ended up in the final executable! We do this 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // before we parse any dwarf info so that when it goes get parsed 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // all section/offset addresses that get registered will resolve 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // correctly to the new addresses in the main executable. We 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // initially set the section size to be 1 byte, but will need to 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // fix up these addresses further after all globals have been 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // parsed to span the gaps, or we can find the global variable 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // sizes from the DWARF info as we are parsing. 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Symbol *exe_stsym_symbol = exe_symbol; 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // First we find the non-stab entry that corresponds to the N_STSYM in the .o file 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Symbol *oso_stsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (exe_stsym_symbol && oso_stsym_symbol) 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // If we found the symbol, then we 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Section* exe_stsym_section = const_cast<Section *>(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Section* oso_stsym_section = const_cast<Section *>(oso_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_stsym_section) 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // The load address of the symbol will use the section in the 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // executable that contains the debug map that corresponds to 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // the N_FUN symbol. We set the offset to reflect the offset 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // into that section since we are creating a new section. 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// AddressRange stsym_load_range(exe_stsym_section, exe_stsym_symbol->GetValue().GetFileAddress() - exe_stsym_section->GetFileAddress(), 1); 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We need the symbol's section offset address from the .o file, but 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // we need a non-zero size. 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// AddressRange stsym_file_range(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(), exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), 1); 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // Now we create a section that we will add as a child of the 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // section in which the .o symbol (the N_FUN) exists. 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// TODO: mimic what I did for N_FUN if that works... 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // We use the 1 byte for the size because we don't know the 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // size of the global symbol without seeing the DWARF. 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// SectionSP oso_fun_section_sp (new Section ( NULL, oso_module, // Module (the .o file) 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// exe_symbol->GetMangled().GetName(),// Name the section the same as the symbol for which is was generated! 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // &stsym_load_range, // Load offset is the offset into the executable section for the N_FUN from the debug map 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// &stsym_file_range, // File section/offset is just the same os the symbol on the .o file 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// 0, 0, 0)); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // Now we add the new section to the .o file's sections as a child 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // of the section in which the N_SECT symbol exists. 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// oso_stsym_section->GetChildren().AddSection(oso_fun_section_sp); 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp); 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP) 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO sections after:\n"; 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_objfile->GetSectionList()->Dump(&s, NULL, true); 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor) 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile(); 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetAbilities () 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = GetNumCompileUnits(); 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t dwarf_abilities = SymbolFile::CompileUnits | 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::Functions | 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::Blocks | 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::GlobalVariables | 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::LocalVariables | 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::VariableTypes | 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::LineTables; 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx) 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_abilities = oso_dwarf->GetAbilities(); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((oso_abilities & dwarf_abilities) == dwarf_abilities) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_abilities; 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits() 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InitOSO (); 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_compile_unit_infos.size(); 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP comp_unit_sp; 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cu_idx < cu_count) 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL) 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx); 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There is only one compile unit for N_OSO entry right now, so 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // it will always exist at index zero. 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0); 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL) 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to get the DWARF for this N_OSO entry (the 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // .o file may be missing or not at the specified path), make 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // one up as best we can from the debug map. We set the uid 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of the compile unit to the symbol index with the MSBit set 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so that it doesn't collide with any uid values from the DWARF 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol; 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_symbol) 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(), 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner so_symbol->GetMangled().GetName().AsCString(), 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_idx, 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Language::Unknown)); 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_sp = m_compile_unit_infos[cu_idx].oso_compile_unit_sp; 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_sp; 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo * 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc) 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit == m_compile_unit_infos[i].oso_compile_unit_sp.get()) 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_compile_unit_infos[i]; 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc) 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitFunctions (sc); 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc) 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitLineTable (sc); 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files) 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files); 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc) 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseFunctionBlocks (sc); 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseTypes (sc); 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc) 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseTypes (sc); 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType* 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid) 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc) 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t exe_file_addr = exe_so_addr.GetFileAddress(); 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress (exe_file_addr, &m_func_indexes[0], m_func_indexes.size()); 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol != NULL) 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx = 0; 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (sc.symbol->GetID(), &oso_idx); 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *oso_objfile = GetObjectFileByOSOIndex (oso_idx); 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf && oso_objfile) 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionList *oso_section_list = oso_objfile->GetSectionList(); 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionSP oso_section_sp(oso_section_list->FindSectionByName(exe_so_addr.GetSection()->GetName())); 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_section_sp) 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionSP oso_symbol_section_sp (oso_section_sp->GetChildren().FindSectionContainingLinkedFileAddress (exe_file_addr)); 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_symbol_section_sp) 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress(); 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address oso_so_addr (oso_symbol_section_sp.get(), exe_file_addr - linked_file_addr); 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_so_addr.IsSectionOffset()) 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc); 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Map the load address from in the executable back to a 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // section/offset address in the .o file so we can do 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // lookups in the .o DWARF. 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Address oso_so_addr (exe_load_addr, false, comp_unit_info->debug_map_sections_sp.get()); 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // Make sure we were able to resolve this back to a .o 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // section offset address, and if so, resolve the context 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // for everything that was asked for. 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_so_addr.IsSectionOffset()) 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc); 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t initial = sc_list.GetSize(); 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileSpec so_file_spec; 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetFileSpecForSO (i, so_file_spec)) 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // By passing false to the comparison we will be able to match 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and files given a filename only. If both file_spec and 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so_file_spec have directories, we will still do a full match. 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (FileSpec::Compare (file_spec, so_file_spec, false) == 0) 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i); 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list); 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial; 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstString &name, 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const std::vector<uint32_t> &indexes, // Indexes into the symbol table that match "name" 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t max_matches, 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableList& variables 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t match_count = indexes.size(); 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<match_count; ++i) 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx; 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx); 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf->FindGlobalVariables(name, true, max_matches, variables)) 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (variables.GetSize() > max_matches) 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variables.Clear(); 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many variables are in the list before we search in case 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> indexes; 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t match_count = m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType (name, eSymbolTypeGlobal, indexes); 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_count) 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateFindGlobalVariables (name, indexes, max_matches, variables); 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolContainsSymbolIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t symbol_idx = *symbol_idx_ptr; 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbol_idx < comp_unit_info->so_symbol->GetID()) 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbol_idx < comp_unit_info->so_symbol->GetSiblingIndex()) 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo* 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = m_compile_unit_infos.size(); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = NULL; 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count) 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx, &m_compile_unit_infos[0], m_compile_unit_infos.size(), sizeof(CompileUnitInfo), (comparison_function)SymbolContainsSymbolIndex); 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx_ptr) 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info != NULL) 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0]; 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = UINT32_MAX; 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_info; 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 76612bec71b323dc520f0e985a86e09c4712559e115Greg ClaytonSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list) 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (name = %s)", 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.GetCString()); 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> indexes; 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t initial_size = 0; 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (append) 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner initial_size = sc_list.GetSize(); 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Clear(); 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t match_count = m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType (name, eSymbolTypeFunction, indexes); 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_count > 0) 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<match_count; ++i) 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx; 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx); 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 79112bec71b323dc520f0e985a86e09c4712559e115Greg Clayton oso_dwarf->FindFunctions(name, name_type_mask, true, sc_list); 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream s(stdout); 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// sc_list.Dump(&s); 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool append, SymbolContextList& sc_list) 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')", 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText()); 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const ConstString &name, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types) 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_dwarf) 81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return oso_dwarf->FindTypes (sc, name, append, max_matches, encoding, udt_uid, types); 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//SymbolFileDWARFDebugMap::FindTypes (const SymbolContext& sc, const RegularExpression& regex, bool append, uint32_t max_matches, Type::Encoding encoding, lldb::user_id_t udt_uid, TypeList& types) 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_dwarf) 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types); 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol 83524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName() 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "SymbolFileDWARFDebugMap"; 84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetShortPluginName() 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetPluginNameStatic(); 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion() 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginCommandHelp (const char *command, Stream *strm) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ExecutePluginCommand (Args &command, Stream *strm) 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("No plug-in command are currently supported."); 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog * 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::EnablePluginLogging (Stream *strm, Args &command) 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 874