SymbolFileDWARFDebugMap.cpp revision 3508c387c3f0c9ecc439d98048fd7694d41bab1b
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" 18b01000fd063629facd45044f137446fb748ee179Greg Clayton 19b01000fd063629facd45044f137446fb748ee179Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Initialize() 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::RegisterPlugin (GetPluginNameStatic(), 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(), 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateInstance); 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Terminate() 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::UnregisterPlugin (CreateInstance); 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginNameStatic() 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47144188bc458a35997d2f2e52206ab69747439073Greg Clayton return "dwarf-debugmap"; 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginDescriptionStatic() 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "DWARF and DWARF3 debug symbol file reader (debug map)."; 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile* 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file) 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return new SymbolFileDWARFDebugMap (obj_file); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) : 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile(ofile), 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags(), 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos(), 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_func_indexes(), 68e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_glob_indexes(), 69e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate) 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap() 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 79b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::InitializeObject() 80e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{ 81b01000fd063629facd45044f137446fb748ee179Greg Clayton // Install our external AST source callbacks so we can complete Clang types. 82b01000fd063629facd45044f137446fb748ee179Greg Clayton llvm::OwningPtr<clang::ExternalASTSource> ast_source_ap ( 83b01000fd063629facd45044f137446fb748ee179Greg Clayton new ClangExternalASTSourceCallbacks (SymbolFileDWARFDebugMap::CompleteTagDecl, 84b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl, 85e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton NULL, 863fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARFDebugMap::LayoutRecordType, 87b01000fd063629facd45044f137446fb748ee179Greg Clayton this)); 88b01000fd063629facd45044f137446fb748ee179Greg Clayton 89b01000fd063629facd45044f137446fb748ee179Greg Clayton GetClangASTContext().SetExternalSource (ast_source_ap); 90e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton} 91e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 92b01000fd063629facd45044f137446fb748ee179Greg Clayton 93b01000fd063629facd45044f137446fb748ee179Greg Clayton 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::InitOSO () 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_flags.test(kHaveInitializedOSOs)) 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.set(kHaveInitializedOSOs); 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> oso_indexes; 110cd151697a4b4d32d8818488b793ea44712945448Greg Clayton// StreamFile s(stdout); 111cd151697a4b4d32d8818488b793ea44712945448Greg Clayton// symtab->Dump(&s, NULL, eSortOrderNone); 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 113cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // When a mach-o symbol is encoded, the n_type field is encoded in bits 114cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // 23:16, and the n_desc field is encoded in bits 15:0. 115cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // 116cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // To find all N_OSO entries that are part of the DWARF + debug map 117cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // we find only object file symbols with the flags value as follows: 118cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // bits 23:16 == 0x66 (N_OSO) 119cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // bits 15: 0 == 0x0001 (specifies this is a debug map object file) 120cd151697a4b4d32d8818488b793ea44712945448Greg Clayton const uint32_t k_oso_symbol_flags_value = 0x660001u; 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 122cd151697a4b4d32d8818488b793ea44712945448Greg Clayton const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithTypeAndFlagsValue(eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 126cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->AppendSymbolIndexesWithType (eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes); 127cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->AppendSymbolIndexesWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, m_glob_indexes); 128cd151697a4b4d32d8818488b793ea44712945448Greg Clayton 129cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->SortSymbolIndexesByValue(m_func_indexes, true); 130cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->SortSymbolIndexesByValue(m_glob_indexes, true); 131cd151697a4b4d32d8818488b793ea44712945448Greg Clayton 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos.resize(oso_index_count); 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s.Printf("%s N_OSO symbols:\n", __PRETTY_FUNCTION__); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// symtab->Dump(&s, oso_indexes); 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<oso_index_count; ++i) 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1); 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2); 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]); 1427c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton uint32_t sibling_idx = m_compile_unit_infos[i].so_symbol->GetSiblingIndex(); 1437c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton assert (sibling_idx != 0); 1447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton assert (sibling_idx > i + 1); 1457c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton m_compile_unit_infos[i].last_symbol = symtab->SymbolAtIndex (sibling_idx - 1); 1467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].so_symbol); 1477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].last_symbol); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx) 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < cu_count) 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info) 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_module_sp.get() == NULL) 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *oso_symbol = comp_unit_info->oso_symbol; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_symbol) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 170537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString(), true); 171e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // Always create a new module for .o files. Why? Because we 172e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // use the debug map, to add new sections to each .o file and 173e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // even though a .o file might not have changed, the sections 174e40b6424d9e49306392bec4b44060da36414c382Greg Clayton // that get added to the .o file can change. 17513d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton comp_unit_info->oso_module_sp.reset (new Module (oso_file_spec, 17613d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton m_obj_file->GetModule()->GetArchitecture(), 17713d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton NULL, 17813d24fb1817faa7ccc4cfd799113ba1a2b8968ebGreg Clayton 0)); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_info->oso_module_sp.get(); 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec) 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_compile_unit_infos[oso_idx].so_file) 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[oso_idx].so_symbol == NULL) 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString()); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString(); 199537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str(), true); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec = m_compile_unit_infos[oso_idx].so_file; 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx) 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByOSOIndex (oso_idx); 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc) 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc); 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (comp_unit_info); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 236444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 237444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonuint32_t 238444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info) 239444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{ 240444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (!m_compile_unit_infos.empty()) 241444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton { 242444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const CompileUnitInfo *first_comp_unit_info = &m_compile_unit_infos.front(); 243444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const CompileUnitInfo *last_comp_unit_info = &m_compile_unit_infos.back(); 244444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (first_comp_unit_info <= comp_unit_info && comp_unit_info <= last_comp_unit_info) 245444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return comp_unit_info - first_comp_unit_info; 246444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton } 247444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return UINT32_MAX; 248444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton} 249444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx) 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor == NULL) 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info); 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_objfile) 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor(); 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// comp_unit_info->oso_dwarf_sp.reset (oso_dwarf); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor) 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 272ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // Set a a pointer to this class to set our OSO DWARF file know 273ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // that the DWARF is being used along with a debug map and that 274ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // it will have the remapped sections that we do below. 275444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton SymbolFileDWARF *oso_symfile = (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile(); 276444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton oso_symfile->SetDebugMapSymfile(this); 277444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton // Set the ID of the symbol file DWARF to the index of the OSO 278444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton // shifted left by 32 bits to provide a unique prefix for any 279444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton // UserID's that get created in the symbol file. 280444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton oso_symfile->SetID (((uint64_t)GetCompUnitInfoIndex(comp_unit_info) + 1ull) << 32ull); 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp.reset(new SectionList); 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *exe_symtab = m_obj_file->GetSymtab(); 2843508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton ModuleSP oso_module_sp (oso_objfile->GetModule()); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *oso_symtab = oso_objfile->GetSymtab(); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define DEBUG_OSO_DMAP // Do not check in with this defined... 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP) 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamFile s(stdout); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO symtab:\n"; 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_symtab->Dump(&s, NULL); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO sections before:\n"; 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_objfile->GetSectionList()->Dump(&s, NULL, true); 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction; 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //SectionList *oso_sections = oso_objfile->Sections(); 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now we need to make sections that map from zero based object 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // file addresses to where things eneded up in the main executable. 2997c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton uint32_t oso_start_idx = exe_symtab->GetIndexForSymbol (comp_unit_info->oso_symbol); 3007c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton assert (oso_start_idx != UINT32_MAX); 3017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton oso_start_idx += 1; 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex(); 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t sect_id = 0x10000; 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t idx = oso_start_idx; idx < oso_end_idx; ++idx) 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx); 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_symbol) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3097c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (exe_symbol->IsDebug() == false) 3107c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton continue; 3117c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (exe_symbol->GetType()) 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3144fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton default: 3154fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton break; 3164fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton 3177c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton case eSymbolTypeCode: 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For each N_FUN, or function that we run into in the debug map 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we make a new section that we add to the sections found in the 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // .o file. This new section has the file address set to what the 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // addresses are in the .o file, and the load address is adjusted 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to match where it ended up in the final executable! We do this 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // before we parse any dwarf info so that when it goes get parsed 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all section/offset addresses that get registered will resolve 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // correctly to the new addresses in the main executable. 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // First we find the original symbol in the .o file's symbol table 3299d972a4057f2e72a004b5ab70e12cfdc78fd8cbaGreg Clayton Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny); 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_fun_symbol) 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we found the symbol, then we 3333508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP exe_fun_section (exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 3343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP oso_fun_section (oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_fun_section) 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now we create a section that we will add as a child of the 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // section in which the .o symbol (the N_FUN) exists. 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We use the exe_symbol size because the one in the .o file 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // will just be a symbol with no size, and the exe_symbol 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // size will reflect any size changes (ppc has been known to 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // shrink function sizes when it gets rid of jump islands that 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // aren't needed anymore). 3453508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP oso_fun_section_sp (new Section (oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(), 3463508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton oso_module_sp, // Module (the .o file) 3473508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 3483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated! 3493508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton eSectionTypeDebug, 3503508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), // File VM address offset in the current section 3513508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton exe_symbol->GetByteSize(), // File size (we need the size from the executable) 3523508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 0, 0, 0)); 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_section_sp->SetLinkedLocation (exe_fun_section, 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetValue().GetFileAddress() - exe_fun_section->GetFileAddress()); 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_section->GetChildren().AddSection(oso_fun_section_sp); 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp); 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3637c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton case eSymbolTypeData: 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For each N_GSYM we remap the address for the global by making 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a new section that we add to the sections found in the .o file. 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This new section has the file address set to what the 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // addresses are in the .o file, and the load address is adjusted 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to match where it ended up in the final executable! We do this 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // before we parse any dwarf info so that when it goes get parsed 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all section/offset addresses that get registered will resolve 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // correctly to the new addresses in the main executable. We 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // initially set the section size to be 1 byte, but will need to 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // fix up these addresses further after all globals have been 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // parsed to span the gaps, or we can find the global variable 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sizes from the DWARF info as we are parsing. 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file 379a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(), 380a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton eSymbolTypeData, 381a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton Symtab::eDebugNo, 382a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton Symtab::eVisibilityAny); 383a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton 384a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton if (exe_symbol && oso_gsym_symbol && exe_symbol->GetAddressRangePtr() && oso_gsym_symbol->GetAddressRangePtr()) 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we found the symbol, then we 3873508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP exe_gsym_section (exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 3883508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP oso_gsym_section (oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_gsym_section) 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 3913508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP oso_gsym_section_sp (new Section (oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(), 3923508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton oso_module_sp, // Module (the .o file) 393a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 394a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), // Name the section the same as the symbol for which is was generated! 395a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton eSectionTypeDebug, 396a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), // File VM address offset in the current section 397a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton 1, // We don't know the size of the global, just do the main address for now. 398a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton 0, 0, 0)); 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section, 401a1b9a90b7aef446302de9b845dc4f3b0e1473aa7Greg Clayton exe_symbol->GetValue().GetFileAddress() - exe_gsym_section->GetFileAddress()); 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp); 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp); 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP) 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO sections after:\n"; 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_objfile->GetSectionList()->Dump(&s, NULL, true); 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor) 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile(); 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 424d0b7cfa22722fdaf4111a61d6eeb02a587710e16Sean CallananSymbolFileDWARFDebugMap::CalculateAbilities () 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = GetNumCompileUnits(); 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t dwarf_abilities = SymbolFile::CompileUnits | 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::Functions | 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::Blocks | 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::GlobalVariables | 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::LocalVariables | 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::VariableTypes | 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::LineTables; 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx) 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_abilities = oso_dwarf->GetAbilities(); 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((oso_abilities & dwarf_abilities) == dwarf_abilities) 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_abilities; 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits() 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InitOSO (); 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_compile_unit_infos.size(); 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx) 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP comp_unit_sp; 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cu_idx < cu_count) 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL) 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx); 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There is only one compile unit for N_OSO entry right now, so 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // it will always exist at index zero. 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0); 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL) 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to get the DWARF for this N_OSO entry (the 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // .o file may be missing or not at the specified path), make 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // one up as best we can from the debug map. We set the uid 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of the compile unit to the symbol index with the MSBit set 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so that it doesn't collide with any uid values from the DWARF 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol; 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_symbol) 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(), 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner so_symbol->GetMangled().GetName().AsCString(), 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_idx, 4969488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton eLanguageTypeUnknown)); 497ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 498ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // Let our symbol vendor know about this compile unit 499ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (m_compile_unit_infos[cu_idx].oso_compile_unit_sp, 500ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton cu_idx); 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_sp = m_compile_unit_infos[cu_idx].oso_compile_unit_sp; 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_sp; 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo * 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc) 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 51424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit == m_compile_unit_infos[i].oso_compile_unit_sp.get()) 51724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_compile_unit_infos[i]; 51824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc) 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitFunctions (sc); 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc) 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitLineTable (sc); 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files) 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files); 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc) 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseFunctionBlocks (sc); 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc) 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseTypes (sc); 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc) 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseTypes (sc); 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType* 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid) 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 584444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid); 585444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 586444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (oso_dwarf) 587444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton oso_dwarf->ResolveTypeUID (type_uid); 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 591462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonlldb::clang_type_t 592444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_type) 593462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 594462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton // We have a struct/union/class/enum that needs to be fully resolved. 595462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 596462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc) 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t exe_file_addr = exe_so_addr.GetFileAddress(); 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress (exe_file_addr, &m_func_indexes[0], m_func_indexes.size()); 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol != NULL) 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx = 0; 6137c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithID (sc.symbol->GetID(), &oso_idx); 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *oso_objfile = GetObjectFileByOSOIndex (oso_idx); 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf && oso_objfile) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionList *oso_section_list = oso_objfile->GetSectionList(); 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 622178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SectionSP oso_symbol_section_sp (oso_section_list->FindSectionContainingLinkedFileAddress (exe_file_addr, UINT32_MAX)); 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 624178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (oso_symbol_section_sp) 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 626178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress(); 6273508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton Address oso_so_addr (oso_symbol_section_sp, exe_file_addr - linked_file_addr); 628178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (oso_so_addr.IsSectionOffset()) 629178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc); 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t initial = sc_list.GetSize(); 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileSpec so_file_spec; 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetFileSpecForSO (i, so_file_spec)) 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // By passing false to the comparison we will be able to match 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and files given a filename only. If both file_spec and 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so_file_spec have directories, we will still do a full match. 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (FileSpec::Compare (file_spec, so_file_spec, false) == 0) 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i); 656281700b2216e6b2aa7b09023e427130de473e3d9Jim Ingham if (oso_dwarf) 657281700b2216e6b2aa7b09023e427130de473e3d9Jim Ingham oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial; 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstString &name, 6680fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ClangNamespaceDecl *namespace_decl, 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const std::vector<uint32_t> &indexes, // Indexes into the symbol table that match "name" 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t max_matches, 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableList& variables 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t match_count = indexes.size(); 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<match_count; ++i) 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx; 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx); 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6850fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (oso_dwarf->FindGlobalVariables(name, namespace_decl, true, max_matches, variables)) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (variables.GetSize() > max_matches) 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 6950fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variables.Clear(); 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many variables are in the list before we search in case 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 706e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton uint32_t total_matches = 0; 707e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton SymbolFileDWARF *oso_dwarf; 708e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7100fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (name, 7110fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan namespace_decl, 712e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton true, 713e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches, 714e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton variables); 715e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (oso_matches > 0) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 717e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton total_matches += oso_matches; 718e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 719e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Are we getting all matches? 720e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches == UINT32_MAX) 721e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton continue; // Yep, continue getting everything 722e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 723e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // If we have found enough matches, lets get out 724e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches >= total_matches) 725e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton break; 726e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 727e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Update the max matches for any subsequent calls to find globals 728e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // in any other object files with DWARF 729e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches -= oso_matches; 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 740e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // If we aren't appending the results to this list, then clear the list 741e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (!append) 742e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton variables.Clear(); 743e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 744e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Remember how many variables are in the list before we search in case 745e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // we are appending the results to a variable list. 746e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton const uint32_t original_size = variables.GetSize(); 747e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 748e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton uint32_t total_matches = 0; 749e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton SymbolFileDWARF *oso_dwarf; 750e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 751e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton { 752e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (regex, 753e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton true, 754e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches, 755e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton variables); 756e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (oso_matches > 0) 757e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton { 758e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton total_matches += oso_matches; 759e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 760e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Are we getting all matches? 761e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches == UINT32_MAX) 762e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton continue; // Yep, continue getting everything 763e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 764e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // If we have found enough matches, lets get out 765e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches >= total_matches) 766e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton break; 767e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 768e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Update the max matches for any subsequent calls to find globals 769e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // in any other object files with DWARF 770e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches -= oso_matches; 771e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton } 772e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton } 773e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Return the number of variable that were appended to the list 774e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton return variables.GetSize() - original_size; 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 7797c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t symbol_idx = *symbol_idx_ptr; 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7837c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_idx < comp_unit_info->first_symbol_index) 7847c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return -1; 7857c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7867c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_idx <= comp_unit_info->last_symbol_index) 7877c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return 0; 7887c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7897c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return 1; 7907c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton} 7917c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7927c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7937c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Claytonint 7947c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) 7957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{ 7967c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton const user_id_t symbol_id = *symbol_idx_ptr; 7977c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7987c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_id < comp_unit_info->so_symbol->GetID()) 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_id <= comp_unit_info->last_symbol->GetID()) 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo* 80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr) 81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 81124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = m_compile_unit_infos.size(); 81224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = NULL; 81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count) 81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 815b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx, 816b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton &m_compile_unit_infos[0], 817b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton m_compile_unit_infos.size(), 818b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton sizeof(CompileUnitInfo), 819b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton (ComparisonFunction)SymbolContainsSymbolWithIndex); 82024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 82224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx_ptr) 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info != NULL) 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0]; 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = UINT32_MAX; 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_info; 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8327c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo* 8337c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID (user_id_t symbol_id, uint32_t *oso_idx_ptr) 8347c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{ 8357c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton const uint32_t oso_index_count = m_compile_unit_infos.size(); 8367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton CompileUnitInfo *comp_unit_info = NULL; 8377c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (oso_index_count) 8387c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton { 839b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton comp_unit_info = (CompileUnitInfo*)::bsearch (&symbol_id, 840b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton &m_compile_unit_infos[0], 841b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton m_compile_unit_infos.size(), 842b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton sizeof(CompileUnitInfo), 843b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton (ComparisonFunction)SymbolContainsSymbolWithID); 8447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton } 8457c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 8467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (oso_idx_ptr) 8477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton { 8487c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (comp_unit_info != NULL) 8497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0]; 8507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton else 8517c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton *oso_idx_ptr = UINT32_MAX; 8527c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton } 8537c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return comp_unit_info; 8547c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton} 8557c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 8567c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 85788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Claytonstatic void 8583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonRemoveFunctionsWithModuleNotEqualTo (const ModuleSP &module_sp, SymbolContextList &sc_list, uint32_t start_idx) 85988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton{ 86088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // We found functions in .o files. Not all functions in the .o files 86188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // will have made it into the final output file. The ones that did 86288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // make it into the final output file will have a section whose module 86388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // matches the module from the ObjectFile for this SymbolFile. When 86488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // the modules don't match, then we have something that was in a 86588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // .o file, but doesn't map to anything in the final executable. 86688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t i=start_idx; 86788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton while (i < sc_list.GetSize()) 86888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 86988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton SymbolContext sc; 87088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton sc_list.GetContextAtIndex(i, sc); 87188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton if (sc.function) 87288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 8733508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const SectionSP section_sp (sc.function->GetAddressRange().GetBaseAddress().GetSection()); 8743508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp->GetModule() != module_sp) 87588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 87688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton sc_list.RemoveContextAtIndex(i); 87788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton continue; 87888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 87988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 88088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton ++i; 88188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 88288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton} 88388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 885302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, const ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list) 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (name = %s)", 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.GetCString()); 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t initial_size = 0; 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (append) 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner initial_size = sc_list.GetSize(); 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 89524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Clear(); 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8977241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t oso_idx = 0; 8987241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton SymbolFileDWARF *oso_dwarf; 8997241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 90188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t sc_idx = sc_list.GetSize(); 902302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan if (oso_dwarf->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, true, sc_list)) 90388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 90488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx); 90588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 90624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 90724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 91024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 91224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 913302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list) 91424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 91524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')", 91724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText()); 91824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9197241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t initial_size = 0; 9207241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton if (append) 9217241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton initial_size = sc_list.GetSize(); 9227241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton else 9237241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton sc_list.Clear(); 9247241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton 9257241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t oso_idx = 0; 9267241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton SymbolFileDWARF *oso_dwarf; 9277241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 9287241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton { 92988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t sc_idx = sc_list.GetSize(); 93088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton 931302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan if (oso_dwarf->FindFunctions(regex, include_inlines, true, sc_list)) 93288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 93388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx); 93488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 9357241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton } 9367241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton 9377241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton return sc_list.GetSize() - initial_size; 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 94095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonTypeSP 94177917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonSymbolFileDWARFDebugMap::FindDefinitionTypeForDIE (DWARFCompileUnit* cu, 94277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton const DWARFDebugInfoEntry *die, 94377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton const ConstString &type_name) 94495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton{ 94595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton TypeSP type_sp; 94695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton SymbolFileDWARF *oso_dwarf; 94795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 94895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 94995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton type_sp = oso_dwarf->FindDefinitionTypeForDIE (cu, die, type_name); 95095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton if (type_sp) 95195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton break; 95295e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 95395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton return type_sp; 95495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton} 955960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 95677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 957e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 958e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool 959e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso) 960e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{ 961e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate) 962e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 963e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo; 964e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton SymbolFileDWARF *oso_dwarf; 965e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 966e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 967e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (skip_dwarf_oso != oso_dwarf && oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(NULL)) 968e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 969e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes; 970e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton break; 971e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 972e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 973e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 974e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes; 975e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton} 976e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 97777917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonTypeSP 978e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 979e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton const ConstString &type_name, 980e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton bool must_be_implementation) 98177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton{ 98277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton TypeSP type_sp; 98377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton SymbolFileDWARF *oso_dwarf; 98477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 98577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 986e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name, must_be_implementation); 98777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (type_sp) 98877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton break; 98977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 99077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton return type_sp; 99177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton} 99277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 993960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonuint32_t 9941924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonSymbolFileDWARFDebugMap::FindTypes 9951924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton( 9961924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton const SymbolContext& sc, 9970fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ConstString &name, 9980fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ClangNamespaceDecl *namespace_decl, 9991924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton bool append, 10001924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton uint32_t max_matches, 10011924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton TypeList& types 10021924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton) 1003960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 1004960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (!append) 1005960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton types.Clear(); 10061924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 10071924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton const uint32_t initial_types_size = types.GetSize(); 10081924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton SymbolFileDWARF *oso_dwarf; 10091924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 10101924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton if (sc.comp_unit) 10111924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton { 10121924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton oso_dwarf = GetSymbolFile (sc); 10131924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton if (oso_dwarf) 10140fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types); 10151924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton } 10161924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton else 10171924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton { 10181924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton uint32_t oso_idx = 0; 10191924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 10200fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types); 10211924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton } 10221924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 10231924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton return types.GetSize() - initial_types_size; 1024960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 1025960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_dwarf) 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types); 103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1036d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 10376916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangNamespaceDecl 1038d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg ClaytonSymbolFileDWARFDebugMap::FindNamespace (const lldb_private::SymbolContext& sc, 10390fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const lldb_private::ConstString &name, 10400fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ClangNamespaceDecl *parent_namespace_decl) 1041d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton{ 10426916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton ClangNamespaceDecl matching_namespace; 1043d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton SymbolFileDWARF *oso_dwarf; 1044d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 1045d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton if (sc.comp_unit) 1046d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 1047d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton oso_dwarf = GetSymbolFile (sc); 1048d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton if (oso_dwarf) 10490fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl); 1050d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 1051d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton else 1052d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 1053d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton for (uint32_t oso_idx = 0; 1054d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); 1055d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton ++oso_idx) 1056d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 10570fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl); 1058d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 1059d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton if (matching_namespace) 1060d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton break; 1061d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 1062d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 1063d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 1064d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton return matching_namespace; 1065d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton} 1066d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 106824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol 106924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 107024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName() 107224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 107324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "SymbolFileDWARFDebugMap"; 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 107624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetShortPluginName() 107824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 107924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetPluginNameStatic(); 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 108124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion() 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1089ad60bf486dee699dd524225b63271ddc5b6329b9Greg ClaytonSymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp) 1090ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton{ 1091ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton const uint32_t cu_count = GetNumCompileUnits(); 1092ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (uint32_t i=0; i<cu_count; ++i) 1093ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1094ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton if (m_compile_unit_infos[i].oso_symbol_vendor && 1095ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_compile_unit_infos[i].oso_symbol_vendor->GetSymbolFile() == oso_dwarf) 1096ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1097ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton if (m_compile_unit_infos[i].oso_compile_unit_sp) 1098ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1099ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton assert (m_compile_unit_infos[i].oso_compile_unit_sp.get() == cu_sp.get()); 1100ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1101ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton else 1102ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1103ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_compile_unit_infos[i].oso_compile_unit_sp = cu_sp; 1104ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1105ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1106ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1107ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton} 1108ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1109b01000fd063629facd45044f137446fb748ee179Greg Clayton 1110b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 1111b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteTagDecl (void *baton, clang::TagDecl *decl) 1112b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1113b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; 1114b01000fd063629facd45044f137446fb748ee179Greg Clayton clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 1115b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 1116b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1117b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARF *oso_dwarf; 1118b01000fd063629facd45044f137446fb748ee179Greg Clayton 1119b01000fd063629facd45044f137446fb748ee179Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 1120b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1121b01000fd063629facd45044f137446fb748ee179Greg Clayton if (oso_dwarf->HasForwardDeclForClangType (clang_type)) 1122b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1123b01000fd063629facd45044f137446fb748ee179Greg Clayton oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 1124b01000fd063629facd45044f137446fb748ee179Greg Clayton return; 1125b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1126b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1127b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1128b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1129b01000fd063629facd45044f137446fb748ee179Greg Clayton 1130b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 1131b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) 1132b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1133b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; 1134b01000fd063629facd45044f137446fb748ee179Greg Clayton clang_type_t clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 1135b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 1136b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1137b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARF *oso_dwarf; 1138b01000fd063629facd45044f137446fb748ee179Greg Clayton 1139b01000fd063629facd45044f137446fb748ee179Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 1140b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1141b01000fd063629facd45044f137446fb748ee179Greg Clayton if (oso_dwarf->HasForwardDeclForClangType (clang_type)) 1142b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1143b01000fd063629facd45044f137446fb748ee179Greg Clayton oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 1144b01000fd063629facd45044f137446fb748ee179Greg Clayton return; 1145b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1146b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1147b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1148b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1149b01000fd063629facd45044f137446fb748ee179Greg Clayton 11503fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Claytonbool 11513fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg ClaytonSymbolFileDWARFDebugMap::LayoutRecordType (void *baton, 11523fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton const clang::RecordDecl *record_decl, 11533fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &size, 11543fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &alignment, 11553fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets, 11563fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, 11573fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) 11583fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton{ 11593fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; 11603fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARF *oso_dwarf; 11613fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 11623fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 11633fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (oso_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets)) 11643fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton return true; 11653fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 11663fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton return false; 11673fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton} 11683fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 11693fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 11703fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 1171444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext* 1172444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) 1173444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{ 1174444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid); 1175444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 1176444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (oso_dwarf) 1177444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return oso_dwarf->GetClangDeclContextContainingTypeUID (type_uid); 1178444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return NULL; 1179444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton} 1180444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 1181444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext* 1182444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid) 1183444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{ 1184444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid); 1185444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 1186444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (oso_dwarf) 1187444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return oso_dwarf->GetClangDeclContextForTypeUID (sc, type_uid); 1188444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return NULL; 1189444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton} 1190444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 1191444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 1192