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 1200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata#include "DWARFDebugAranges.h" 1300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata 1400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata#include "lldb/Core/RangeMap.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h" 20464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 21464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton//#define DEBUG_OSO_DMAP // DO NOT CHECKIN WITH THIS NOT COMMENTED OUT 2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#if defined(DEBUG_OSO_DMAP) 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h" 2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#endif 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 26b01000fd063629facd45044f137446fb748ee179Greg Clayton 27b01000fd063629facd45044f137446fb748ee179Greg Clayton#include "lldb/Symbol/ClangExternalASTSourceCallbacks.h" 2849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/CompileUnit.h" 29464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton#include "lldb/Symbol/LineTable.h" 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan#include "LogChannelDWARF.h" 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4049ce8969d3154e1560106cfe530444c09410f217Greg Clayton// Subclass lldb_private::Module so we can intercept the "Module::GetObjectFile()" 4149ce8969d3154e1560106cfe530444c09410f217Greg Clayton// (so we can fixup the object file sections) and also for "Module::GetSymbolVendor()" 4249ce8969d3154e1560106cfe530444c09410f217Greg Clayton// (so we can fixup the symbol file id. 4349ce8969d3154e1560106cfe530444c09410f217Greg Clayton 44464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 45464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 46464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 47464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonconst SymbolFileDWARFDebugMap::FileRangeMap & 48464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap(SymbolFileDWARFDebugMap *exe_symfile) 4949ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 50464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (file_range_map_valid) 51464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return file_range_map; 5249ce8969d3154e1560106cfe530444c09410f217Greg Clayton 53464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton file_range_map_valid = true; 54464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 55464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Module *oso_module = exe_symfile->GetModuleByCompUnitInfo (this); 56d93d69d12049dc1c99e0c828509730ea3d9b1aaaJim Ingham if (!oso_module) 57d93d69d12049dc1c99e0c828509730ea3d9b1aaaJim Ingham return file_range_map; 58d93d69d12049dc1c99e0c828509730ea3d9b1aaaJim Ingham 59464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ObjectFile *oso_objfile = oso_module->GetObjectFile(); 6053fde4be112df69d2b2f3d700b2556770f1223d5Greg Clayton if (!oso_objfile) 6153fde4be112df69d2b2f3d700b2556770f1223d5Greg Clayton return file_range_map; 62464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 63952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP)); 64464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (log) 6572a005e7ce67677d5180def2ae1c6bb65bd8129aGreg Clayton { 66464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ConstString object_name (oso_module->GetObjectName()); 6797a19b21dacd9063bb5475812df7781777262198Greg Clayton log->Printf("%p: SymbolFileDWARFDebugMap::CompileUnitInfo::GetFileRangeMap ('%s')", 68464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton this, 6997a19b21dacd9063bb5475812df7781777262198Greg Clayton oso_module->GetSpecificationDescription().c_str()); 7072a005e7ce67677d5180def2ae1c6bb65bd8129aGreg Clayton } 71464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 7272a005e7ce67677d5180def2ae1c6bb65bd8129aGreg Clayton 73464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton std::vector<SymbolFileDWARFDebugMap::CompileUnitInfo *> cu_infos; 74464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (exe_symfile->GetCompUnitInfosForModule(oso_module, cu_infos)) 7549ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 76464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton for (auto comp_unit_info : cu_infos) 7749ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 787940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Symtab *exe_symtab = exe_symfile->GetObjectFile()->GetSymtab(); 79464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ModuleSP oso_module_sp (oso_objfile->GetModule()); 807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Symtab *oso_symtab = oso_objfile->GetSymtab(); 81464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 82464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction; 83464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton //SectionList *oso_sections = oso_objfile->Sections(); 84464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // Now we need to make sections that map from zero based object 85464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // file addresses to where things eneded up in the main executable. 86464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 87464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton assert (comp_unit_info->first_symbol_index != UINT32_MAX); 88464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // End index is one past the last valid symbol index 89464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const uint32_t oso_end_idx = comp_unit_info->last_symbol_index + 1; 90464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton for (uint32_t idx = comp_unit_info->first_symbol_index + 2; // Skip the N_SO and N_OSO 91464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton idx < oso_end_idx; 92464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ++idx) 9349ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 94464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx); 95464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (exe_symbol) 9649ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 97464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (exe_symbol->IsDebug() == false) 98464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton continue; 99464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 100464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton switch (exe_symbol->GetType()) 10149ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 102464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton default: 103464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton break; 104464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 105464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton case eSymbolTypeCode: 10649ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 107464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // For each N_FUN, or function that we run into in the debug map 108464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // we make a new section that we add to the sections found in the 109464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // .o file. This new section has the file address set to what the 110464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // addresses are in the .o file, and the load address is adjusted 111464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // to match where it ended up in the final executable! We do this 112464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // before we parse any dwarf info so that when it goes get parsed 113464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // all section/offset addresses that get registered will resolve 114464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // correctly to the new addresses in the main executable. 115464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 116464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // First we find the original symbol in the .o file's symbol table 117464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), 118464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton eSymbolTypeCode, 119464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Symtab::eDebugNo, 120464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Symtab::eVisibilityAny); 121464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (oso_fun_symbol) 1223cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton { 123464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // Add the inverse OSO file address to debug map entry mapping 124464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton exe_symfile->AddOSOFileRange (this, 125464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton exe_symbol->GetAddress().GetFileAddress(), 126464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton oso_fun_symbol->GetAddress().GetFileAddress(), 127464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton std::min<addr_t>(exe_symbol->GetByteSize(), oso_fun_symbol->GetByteSize())); 1283cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton 12949ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 13049ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 131464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton break; 132464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 133464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton case eSymbolTypeData: 134464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 135464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // For each N_GSYM we remap the address for the global by making 136464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // a new section that we add to the sections found in the .o file. 137464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // This new section has the file address set to what the 138464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // addresses are in the .o file, and the load address is adjusted 139464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // to match where it ended up in the final executable! We do this 140464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // before we parse any dwarf info so that when it goes get parsed 141464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // all section/offset addresses that get registered will resolve 142464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // correctly to the new addresses in the main executable. We 143464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // initially set the section size to be 1 byte, but will need to 144464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // fix up these addresses further after all globals have been 145464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // parsed to span the gaps, or we can find the global variable 146464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // sizes from the DWARF info as we are parsing. 147464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 148464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file 149464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType (exe_symbol->GetMangled().GetName(Mangled::ePreferMangled), 150464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton eSymbolTypeData, 151464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Symtab::eDebugNo, 152464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Symtab::eVisibilityAny); 153464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 154464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (exe_symbol && oso_gsym_symbol && 155464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton exe_symbol->ValueIsAddress() && 156464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton oso_gsym_symbol->ValueIsAddress()) 157464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 158464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // Add the inverse OSO file address to debug map entry mapping 159464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton exe_symfile->AddOSOFileRange (this, 160464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton exe_symbol->GetAddress().GetFileAddress(), 161464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton oso_gsym_symbol->GetAddress().GetFileAddress(), 162464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton std::min<addr_t>(exe_symbol->GetByteSize(), oso_gsym_symbol->GetByteSize())); 163464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 164464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 165464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton break; 16649ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 16749ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 16849ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 169464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 170464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton exe_symfile->FinalizeOSOFileRanges (this); 171464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // We don't need the symbols anymore for the .o files 1727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton oso_objfile->ClearSymtab(); 17349ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 17449ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 175464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return file_range_map; 176464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 177464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 178464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 179464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonclass DebugMapModule : public Module 180464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 181464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonpublic: 182464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton DebugMapModule (const ModuleSP &exe_module_sp, 183464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton uint32_t cu_idx, 184464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const FileSpec& file_spec, 185464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const ArchSpec& arch, 186464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const ConstString *object_name, 1870e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton off_t object_offset, 1880e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton const TimeValue *object_mod_time_ptr) : 1890e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton Module (file_spec, arch, object_name, object_offset, object_mod_time_ptr), 190464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_exe_module_wp (exe_module_sp), 191464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_cu_idx (cu_idx) 192464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 193464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 194464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 195464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton virtual 196464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton ~DebugMapModule () 197464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 198464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 199464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 20049ce8969d3154e1560106cfe530444c09410f217Greg Clayton 20149ce8969d3154e1560106cfe530444c09410f217Greg Clayton virtual SymbolVendor* 202188091899842b140313b54e097f16efbe165c998Greg Clayton GetSymbolVendor(bool can_create = true, lldb_private::Stream *feedback_strm = NULL) 20349ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 20449ce8969d3154e1560106cfe530444c09410f217Greg Clayton // Scope for locker 20549ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (m_symfile_ap.get() || can_create == false) 20649ce8969d3154e1560106cfe530444c09410f217Greg Clayton return m_symfile_ap.get(); 20749ce8969d3154e1560106cfe530444c09410f217Greg Clayton 20849ce8969d3154e1560106cfe530444c09410f217Greg Clayton ModuleSP exe_module_sp (m_exe_module_wp.lock()); 20949ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (exe_module_sp) 21049ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 21149ce8969d3154e1560106cfe530444c09410f217Greg Clayton // Now get the object file outside of a locking scope 21249ce8969d3154e1560106cfe530444c09410f217Greg Clayton ObjectFile *oso_objfile = GetObjectFile (); 21349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_objfile) 21449ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 21549ce8969d3154e1560106cfe530444c09410f217Greg Clayton Mutex::Locker locker (m_mutex); 216188091899842b140313b54e097f16efbe165c998Greg Clayton SymbolVendor* symbol_vendor = Module::GetSymbolVendor(can_create, feedback_strm); 21749ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (symbol_vendor) 21849ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 21949ce8969d3154e1560106cfe530444c09410f217Greg Clayton // Set a a pointer to this class to set our OSO DWARF file know 22049ce8969d3154e1560106cfe530444c09410f217Greg Clayton // that the DWARF is being used along with a debug map and that 22149ce8969d3154e1560106cfe530444c09410f217Greg Clayton // it will have the remapped sections that we do below. 2220e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton SymbolFileDWARF *oso_symfile = SymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF(symbol_vendor->GetSymbolFile()); 22349ce8969d3154e1560106cfe530444c09410f217Greg Clayton 22449ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (!oso_symfile) 22549ce8969d3154e1560106cfe530444c09410f217Greg Clayton return NULL; 22649ce8969d3154e1560106cfe530444c09410f217Greg Clayton 22749ce8969d3154e1560106cfe530444c09410f217Greg Clayton ObjectFile *exe_objfile = exe_module_sp->GetObjectFile(); 22849ce8969d3154e1560106cfe530444c09410f217Greg Clayton SymbolVendor *exe_sym_vendor = exe_module_sp->GetSymbolVendor(); 22949ce8969d3154e1560106cfe530444c09410f217Greg Clayton 23049ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (exe_objfile && exe_sym_vendor) 23149ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 23249ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_symfile->GetNumCompileUnits() == 1) 23349ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 23449ce8969d3154e1560106cfe530444c09410f217Greg Clayton oso_symfile->SetDebugMapModule(exe_module_sp); 23549ce8969d3154e1560106cfe530444c09410f217Greg Clayton // Set the ID of the symbol file DWARF to the index of the OSO 23649ce8969d3154e1560106cfe530444c09410f217Greg Clayton // shifted left by 32 bits to provide a unique prefix for any 23749ce8969d3154e1560106cfe530444c09410f217Greg Clayton // UserID's that get created in the symbol file. 23849ce8969d3154e1560106cfe530444c09410f217Greg Clayton oso_symfile->SetID (((uint64_t)m_cu_idx + 1ull) << 32ull); 23949ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 24049ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 24149ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 24249ce8969d3154e1560106cfe530444c09410f217Greg Clayton oso_symfile->SetID (UINT64_MAX); 24349ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 24449ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 24549ce8969d3154e1560106cfe530444c09410f217Greg Clayton return symbol_vendor; 24649ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 24749ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 24849ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 24949ce8969d3154e1560106cfe530444c09410f217Greg Clayton return NULL; 25049ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 25149ce8969d3154e1560106cfe530444c09410f217Greg Clayton 25249ce8969d3154e1560106cfe530444c09410f217Greg Claytonprotected: 25349ce8969d3154e1560106cfe530444c09410f217Greg Clayton ModuleWP m_exe_module_wp; 25449ce8969d3154e1560106cfe530444c09410f217Greg Clayton const uint32_t m_cu_idx; 25549ce8969d3154e1560106cfe530444c09410f217Greg Clayton}; 25649ce8969d3154e1560106cfe530444c09410f217Greg Clayton 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Initialize() 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::RegisterPlugin (GetPluginNameStatic(), 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(), 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateInstance); 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Terminate() 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::UnregisterPlugin (CreateInstance); 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2720e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginNameStatic() 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2750e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("dwarf-debugmap"); 2760e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginDescriptionStatic() 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "DWARF and DWARF3 debug symbol file reader (debug map)."; 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile* 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file) 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return new SymbolFileDWARFDebugMap (obj_file); 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) : 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile(ofile), 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags(), 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos(), 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_func_indexes(), 297e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_glob_indexes(), 298e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type (eLazyBoolCalculate) 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap() 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 307b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 308b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::InitializeObject() 309e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{ 310b01000fd063629facd45044f137446fb748ee179Greg Clayton // Install our external AST source callbacks so we can complete Clang types. 311b01000fd063629facd45044f137446fb748ee179Greg Clayton llvm::OwningPtr<clang::ExternalASTSource> ast_source_ap ( 312b01000fd063629facd45044f137446fb748ee179Greg Clayton new ClangExternalASTSourceCallbacks (SymbolFileDWARFDebugMap::CompleteTagDecl, 313b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl, 314e6d72ca9a6b22cd062136bbff039c3d8217f798aGreg Clayton NULL, 3153fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARFDebugMap::LayoutRecordType, 316b01000fd063629facd45044f137446fb748ee179Greg Clayton this)); 317b01000fd063629facd45044f137446fb748ee179Greg Clayton 318b01000fd063629facd45044f137446fb748ee179Greg Clayton GetClangASTContext().SetExternalSource (ast_source_ap); 319e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton} 320e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 32249ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::InitOSO() 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_flags.test(kHaveInitializedOSOs)) 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 326464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.set(kHaveInitializedOSOs); 3287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 3297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // If the object file has been stripped, there is no sense in looking further 3307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // as all of the debug symbols for the debug map will not be available 3317940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (m_obj_file->IsStripped()) 3327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return; 3337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 3347940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Also make sure the file type is some sort of executable. Core files, debug 3357940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // info files (dSYM), object files (.o files), and stub libraries all can 3367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton switch (m_obj_file->GetType()) 3377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 3387940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeInvalid: 3397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeCoreFile: 3407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeDebugInfo: 3417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeObjectFile: 3427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeStubLibrary: 3437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeUnknown: 3447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return; 3457940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 3467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeExecutable: 3477940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeDynamicLinker: 3487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton case ObjectFile::eTypeSharedLibrary: 3497940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton break; 3507940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 3517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Symtab* symtab = m_obj_file->GetSymtab(); 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 360952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_MAP)); 361fafffe000eb4a3902ecefc82446d11e6838167c6Sean Callanan 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> oso_indexes; 363cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // When a mach-o symbol is encoded, the n_type field is encoded in bits 364cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // 23:16, and the n_desc field is encoded in bits 15:0. 365cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // 366cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // To find all N_OSO entries that are part of the DWARF + debug map 367cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // we find only object file symbols with the flags value as follows: 368cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // bits 23:16 == 0x66 (N_OSO) 369cd151697a4b4d32d8818488b793ea44712945448Greg Clayton // bits 15: 0 == 0x0001 (specifies this is a debug map object file) 370cd151697a4b4d32d8818488b793ea44712945448Greg Clayton const uint32_t k_oso_symbol_flags_value = 0x660001u; 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 372cd151697a4b4d32d8818488b793ea44712945448Greg Clayton const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithTypeAndFlagsValue(eSymbolTypeObjectFile, k_oso_symbol_flags_value, oso_indexes); 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 376cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->AppendSymbolIndexesWithType (eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes); 377cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->AppendSymbolIndexesWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, m_glob_indexes); 378cd151697a4b4d32d8818488b793ea44712945448Greg Clayton 379cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->SortSymbolIndexesByValue(m_func_indexes, true); 380cd151697a4b4d32d8818488b793ea44712945448Greg Clayton symtab->SortSymbolIndexesByValue(m_glob_indexes, true); 381cd151697a4b4d32d8818488b793ea44712945448Greg Clayton 382464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton for (uint32_t sym_idx : m_func_indexes) 383464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 384464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const Symbol *symbol = symtab->SymbolAtIndex(sym_idx); 385464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::addr_t file_addr = symbol->GetAddress().GetFileAddress(); 386464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::addr_t byte_size = symbol->GetByteSize(); 387464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton DebugMap::Entry debug_map_entry(file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS)); 388464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_debug_map.Append(debug_map_entry); 389464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 390464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton for (uint32_t sym_idx : m_glob_indexes) 391464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 392464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const Symbol *symbol = symtab->SymbolAtIndex(sym_idx); 393464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::addr_t file_addr = symbol->GetAddress().GetFileAddress(); 3947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton lldb::addr_t byte_size = symbol->GetByteSize(); 395464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton DebugMap::Entry debug_map_entry(file_addr, byte_size, OSOEntry(sym_idx, LLDB_INVALID_ADDRESS)); 396464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_debug_map.Append(debug_map_entry); 397464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 398464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_debug_map.Sort(); 399464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos.resize(oso_index_count); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<oso_index_count; ++i) 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4043cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton const uint32_t so_idx = oso_indexes[i] - 1; 4050be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton const uint32_t oso_idx = oso_indexes[i]; 4063cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton const Symbol *so_symbol = symtab->SymbolAtIndex(so_idx); 4070be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton const Symbol *oso_symbol = symtab->SymbolAtIndex(oso_idx); 4080be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton if (so_symbol && 4090be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton oso_symbol && 4100be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton so_symbol->GetType() == eSymbolTypeSourceFile && 4110be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton oso_symbol->GetType() == eSymbolTypeObjectFile) 41277f281deb58ad655b36d6fee402730713cb985d0Greg Clayton { 413c2fe09b1e9fb58e02b15dfc2a76dbbc9e9d36850Greg Clayton m_compile_unit_infos[i].so_file.SetFile(so_symbol->GetName().AsCString(), false); 4143cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton m_compile_unit_infos[i].oso_path = oso_symbol->GetName(); 4150e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton TimeValue oso_mod_time; 4160e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton oso_mod_time.OffsetWithSeconds(oso_symbol->GetAddress().GetOffset()); 4170e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton m_compile_unit_infos[i].oso_mod_time = oso_mod_time; 4180be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton uint32_t sibling_idx = so_symbol->GetSiblingIndex(); 4190be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton // The sibling index can't be less that or equal to the current index "i" 4200be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton if (sibling_idx <= i) 4210be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton { 4220be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton m_obj_file->GetModule()->ReportError ("N_SO in symbol with UID %u has invalid sibling in debug map, please file a bug and attach the binary listed in this error", so_symbol->GetID()); 4230be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton } 4240be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton else 4250be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton { 4260be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton const Symbol* last_symbol = symtab->SymbolAtIndex (sibling_idx - 1); 4273cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton m_compile_unit_infos[i].first_symbol_index = so_idx; 4283cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton m_compile_unit_infos[i].last_symbol_index = sibling_idx - 1; 4290be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton m_compile_unit_infos[i].first_symbol_id = so_symbol->GetID(); 4300be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton m_compile_unit_infos[i].last_symbol_id = last_symbol->GetID(); 4310be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton 4320be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton if (log) 4330be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton log->Printf("Initialized OSO 0x%8.8x: file=%s", i, oso_symbol->GetName().GetCString()); 4340be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton } 43577f281deb58ad655b36d6fee402730713cb985d0Greg Clayton } 43677f281deb58ad655b36d6fee402730713cb985d0Greg Clayton else 43777f281deb58ad655b36d6fee402730713cb985d0Greg Clayton { 4380be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton if (oso_symbol == NULL) 4390be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton m_obj_file->GetModule()->ReportError ("N_OSO symbol[%u] can't be found, please file a bug and attach the binary listed in this error", oso_idx); 4400be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton else if (so_symbol == NULL) 4410be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton m_obj_file->GetModule()->ReportError ("N_SO not found for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", oso_idx); 4420be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton else if (so_symbol->GetType() != eSymbolTypeSourceFile) 4430be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton m_obj_file->GetModule()->ReportError ("N_SO has incorrect symbol type (%u) for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", so_symbol->GetType(), oso_idx); 4440be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton else if (oso_symbol->GetType() != eSymbolTypeSourceFile) 4450be3134ed957ca5e357caec8928bfe754a1f978eGreg Clayton m_obj_file->GetModule()->ReportError ("N_OSO has incorrect symbol type (%u) for N_OSO symbol[%u], please file a bug and attach the binary listed in this error", oso_symbol->GetType(), oso_idx); 44677f281deb58ad655b36d6fee402730713cb985d0Greg Clayton } 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx) 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < cu_count) 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info) 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4643cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (!comp_unit_info->oso_sp) 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4663cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton auto pos = m_oso_map.find (comp_unit_info->oso_path); 4673cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (pos != m_oso_map.end()) 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 4693cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton comp_unit_info->oso_sp = pos->second; 4703cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton } 4713cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton else 4723cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton { 4730e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton ObjectFile *obj_file = GetObjectFile(); 4743cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton comp_unit_info->oso_sp.reset (new OSOInfo()); 4753cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton m_oso_map[comp_unit_info->oso_path] = comp_unit_info->oso_sp; 4763cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton const char *oso_path = comp_unit_info->oso_path.GetCString(); 4779eead7dccf47e0dd97fa1283f91234ba0ab046eeGreg Clayton FileSpec oso_file (oso_path, false); 4783cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton ConstString oso_object; 4790e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton if (oso_file.Exists()) 4800e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton { 4810e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton TimeValue oso_mod_time (oso_file.GetModificationTime()); 4820e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton if (oso_mod_time != comp_unit_info->oso_mod_time) 4830e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton { 4840e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton obj_file->GetModule()->ReportError ("debug map object file '%s' has changed (actual time is 0x%" PRIx64 ", debug map time is 0x%" PRIx64 ") since this executable was linked, file will be ignored", 4850e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton oso_file.GetPath().c_str(), 4860e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton oso_mod_time.GetAsSecondsSinceJan1_1970(), 4870e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton comp_unit_info->oso_mod_time.GetAsSecondsSinceJan1_1970()); 4880e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return NULL; 4890e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton } 4900e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton 4910e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton } 4920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton else 49349ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 4943cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton const bool must_exist = true; 4953cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton 4963cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (!ObjectFile::SplitArchivePathWithObject (oso_path, 4973cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton oso_file, 4983cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton oso_object, 4993cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton must_exist)) 5003cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton { 5013cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton return NULL; 5023cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton } 50349ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 5043cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton // Always create a new module for .o files. Why? Because we 5053cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton // use the debug map, to add new sections to each .o file and 5063cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton // even though a .o file might not have changed, the sections 5073cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton // that get added to the .o file can change. 5080e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton comp_unit_info->oso_sp->module_sp.reset (new DebugMapModule (obj_file->GetModule(), 5093cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton GetCompUnitInfoIndex(comp_unit_info), 5103cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton oso_file, 5113cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton m_obj_file->GetModule()->GetArchitecture(), 5123cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton oso_object ? &oso_object : NULL, 5130e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton 0, 5140e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton oso_object ? &comp_unit_info->oso_mod_time : NULL)); 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 5173cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (comp_unit_info->oso_sp) 5183cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton return comp_unit_info->oso_sp->module_sp.get(); 5193cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton return NULL; 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec) 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52849ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (m_compile_unit_infos[oso_idx].so_file) 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53049ce8969d3154e1560106cfe530444c09410f217Greg Clayton file_spec = m_compile_unit_infos[oso_idx].so_file; 53149ce8969d3154e1560106cfe530444c09410f217Greg Clayton return true; 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx) 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByOSOIndex (oso_idx); 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc) 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc); 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (comp_unit_info); 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info); 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 566444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 567444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonuint32_t 568444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetCompUnitInfoIndex (const CompileUnitInfo *comp_unit_info) 569444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{ 570444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (!m_compile_unit_infos.empty()) 571444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton { 572444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const CompileUnitInfo *first_comp_unit_info = &m_compile_unit_infos.front(); 573444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const CompileUnitInfo *last_comp_unit_info = &m_compile_unit_infos.back(); 574444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (first_comp_unit_info <= comp_unit_info && comp_unit_info <= last_comp_unit_info) 575444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return comp_unit_info - first_comp_unit_info; 576444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton } 577444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return UINT32_MAX; 578444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton} 579444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx) 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 5890e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonSymbolFileDWARFDebugMap::GetSymbolFileAsSymbolFileDWARF (SymbolFile *sym_file) 5900e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton{ 5910e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton if (sym_file && sym_file->GetPluginName() == SymbolFileDWARF::GetPluginNameStatic()) 5920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return (SymbolFileDWARF *)sym_file; 5930e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return NULL; 5940e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton} 5950e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton 5960e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonSymbolFileDWARF * 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59949ce8969d3154e1560106cfe530444c09410f217Greg Clayton Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info); 60049ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_module) 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60249ce8969d3154e1560106cfe530444c09410f217Greg Clayton SymbolVendor *sym_vendor = oso_module->GetSymbolVendor(); 60349ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (sym_vendor) 6040e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return GetSymbolFileAsSymbolFileDWARF (sym_vendor->GetSymbolFile()); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 610d0b7cfa22722fdaf4111a61d6eeb02a587710e16Sean CallananSymbolFileDWARFDebugMap::CalculateAbilities () 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = GetNumCompileUnits(); 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62049ce8969d3154e1560106cfe530444c09410f217Greg Clayton InitOSO(); 62149ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (!m_compile_unit_infos.empty()) 6227940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 6237940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return SymbolFile::CompileUnits | 6247940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SymbolFile::Functions | 6257940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SymbolFile::Blocks | 6267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SymbolFile::GlobalVariables | 6277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SymbolFile::LocalVariables | 6287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SymbolFile::VariableTypes | 6297940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SymbolFile::LineTables ; 6307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits() 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InitOSO (); 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_compile_unit_infos.size(); 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx) 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP comp_unit_sp; 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cu_idx < cu_count) 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6513cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton Module *oso_module = GetModuleByCompUnitInfo (&m_compile_unit_infos[cu_idx]); 6523cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (oso_module) 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 65449ce8969d3154e1560106cfe530444c09410f217Greg Clayton FileSpec so_file_spec; 65549ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (GetFileSpecForSO (cu_idx, so_file_spec)) 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 657464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // User zero as the ID to match the compile unit at offset 658464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // zero in each .o file since each .o file can only have 659464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // one compile unit for now. 660464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::user_id_t cu_id = 0; 661464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_compile_unit_infos[cu_idx].compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(), 662464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton NULL, 663464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton so_file_spec, 664464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton cu_id, 665464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton eLanguageTypeUnknown)); 66649ce8969d3154e1560106cfe530444c09410f217Greg Clayton 6673cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (m_compile_unit_infos[cu_idx].compile_unit_sp) 66849ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 669ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // Let our symbol vendor know about this compile unit 670464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (cu_idx, m_compile_unit_infos[cu_idx].compile_unit_sp); 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 6743cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton comp_unit_sp = m_compile_unit_infos[cu_idx].compile_unit_sp; 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_sp; 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo * 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc) 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6863cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (sc.comp_unit == m_compile_unit_infos[i].compile_unit_sp.get()) 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_compile_unit_infos[i]; 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69249ce8969d3154e1560106cfe530444c09410f217Greg Clayton 6933cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Claytonsize_t 6943cf7ab5462467121b4ac6cde09ee994030dad0c5Greg ClaytonSymbolFileDWARFDebugMap::GetCompUnitInfosForModule (const lldb_private::Module *module, std::vector<CompileUnitInfo *>& cu_infos) 69549ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 69649ce8969d3154e1560106cfe530444c09410f217Greg Clayton const uint32_t cu_count = GetNumCompileUnits(); 69749ce8969d3154e1560106cfe530444c09410f217Greg Clayton for (uint32_t i=0; i<cu_count; ++i) 69849ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 6993cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (module == GetModuleByCompUnitInfo (&m_compile_unit_infos[i])) 7003cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton cu_infos.push_back (&m_compile_unit_infos[i]); 70149ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 7023cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton return cu_infos.size(); 70349ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 70449ce8969d3154e1560106cfe530444c09410f217Greg Clayton 70549ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::LanguageType 70649ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::ParseCompileUnitLanguage (const SymbolContext& sc) 70749ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 70849ce8969d3154e1560106cfe530444c09410f217Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 70949ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_dwarf) 71049ce8969d3154e1560106cfe530444c09410f217Greg Clayton return oso_dwarf->ParseCompileUnitLanguage (sc); 71149ce8969d3154e1560106cfe530444c09410f217Greg Clayton return eLanguageTypeUnknown; 71249ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 71349ce8969d3154e1560106cfe530444c09410f217Greg Clayton 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitFunctions (sc); 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc) 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitLineTable (sc); 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files) 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files); 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc) 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseFunctionBlocks (sc); 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc) 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseTypes (sc); 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc) 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 76749ce8969d3154e1560106cfe530444c09410f217Greg Clayton return oso_dwarf->ParseVariablesForContext (sc); 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType* 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid) 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 776444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid); 777444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 778444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (oso_dwarf) 779464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return oso_dwarf->ResolveTypeUID (type_uid); 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78352f792329be5db8e38961350589e97e8f2823acdGreg Claytonbool 78452f792329be5db8e38961350589e97e8f2823acdGreg ClaytonSymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (ClangASTType& clang_type) 785462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 786462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton // We have a struct/union/class/enum that needs to be fully resolved. 78752f792329be5db8e38961350589e97e8f2823acdGreg Clayton return false; 788462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc) 79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 7947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Symtab* symtab = m_obj_file->GetSymtab(); 79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t exe_file_addr = exe_so_addr.GetFileAddress(); 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 799464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains (exe_file_addr); 800464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (debug_map_entry) 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 803464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton sc.symbol = symtab->SymbolAtIndex(debug_map_entry->data.GetExeSymbolIndex()); 80424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 805464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (sc.symbol != NULL) 806464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 807464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton resolved_flags |= eSymbolContextSymbol; 80824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 809464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton uint32_t oso_idx = 0; 810464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithID (sc.symbol->GetID(), &oso_idx); 811464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (comp_unit_info) 812464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 813d7d583f2e384a8d4d9c2fac0a10b812fd9fb0926Jim Ingham comp_unit_info->GetFileRangeMap(this); 814464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info); 815464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (oso_module) 81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 817464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::addr_t oso_file_addr = exe_file_addr - debug_map_entry->GetRangeBase() + debug_map_entry->data.GetOSOFileAddress(); 818464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Address oso_so_addr; 819464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (oso_module->ResolveFileAddress(oso_file_addr, oso_so_addr)) 820464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 821464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton resolved_flags |= oso_module->GetSymbolVendor()->ResolveSymbolContext (oso_so_addr, resolve_scope, sc); 822464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 82324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 82824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 82924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 83324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 83424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 83549ce8969d3154e1560106cfe530444c09410f217Greg Clayton const uint32_t initial = sc_list.GetSize(); 83624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 83724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84049ce8969d3154e1560106cfe530444c09410f217Greg Clayton // If we are checking for inlines, then we need to look through all 84149ce8969d3154e1560106cfe530444c09410f217Greg Clayton // compile units no matter if "file_spec" matches. 84249ce8969d3154e1560106cfe530444c09410f217Greg Clayton bool resolve = check_inlines; 84349ce8969d3154e1560106cfe530444c09410f217Greg Clayton 84449ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (!resolve) 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84649ce8969d3154e1560106cfe530444c09410f217Greg Clayton FileSpec so_file_spec; 84749ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (GetFileSpecForSO (i, so_file_spec)) 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 84949ce8969d3154e1560106cfe530444c09410f217Greg Clayton // Match the full path if the incoming file_spec has a directory (not just a basename) 85049ce8969d3154e1560106cfe530444c09410f217Greg Clayton const bool full_match = file_spec.GetDirectory(); 85149ce8969d3154e1560106cfe530444c09410f217Greg Clayton resolve = FileSpec::Equal (file_spec, so_file_spec, full_match); 85224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 85449ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (resolve) 85549ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 85649ce8969d3154e1560106cfe530444c09410f217Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i); 85749ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_dwarf) 85849ce8969d3154e1560106cfe530444c09410f217Greg Clayton oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list); 85949ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 86024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial; 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstString &name, 8680fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ClangNamespaceDecl *namespace_decl, 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const std::vector<uint32_t> &indexes, // Indexes into the symbol table that match "name" 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t max_matches, 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableList& variables 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 87524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t match_count = indexes.size(); 87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<match_count; ++i) 87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx; 87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx); 88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 8850fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan if (oso_dwarf->FindGlobalVariables(name, namespace_decl, true, max_matches, variables)) 88624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (variables.GetSize() > max_matches) 88724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 88824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 88924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 89124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 89224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 8950fcec13c6639ab49216fa9447b25888b7bc9ff59Sean CallananSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, const ClangNamespaceDecl *namespace_decl, bool append, uint32_t max_matches, VariableList& variables) 89624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 89724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 89924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 90024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variables.Clear(); 90124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 90224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many variables are in the list before we search in case 90324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 90424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 906e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton uint32_t total_matches = 0; 907e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton SymbolFileDWARF *oso_dwarf; 908e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 90924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9100fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (name, 9110fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan namespace_decl, 912e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton true, 913e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches, 914e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton variables); 915e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (oso_matches > 0) 91624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 917e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton total_matches += oso_matches; 918e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 919e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Are we getting all matches? 920e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches == UINT32_MAX) 921e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton continue; // Yep, continue getting everything 922e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 923e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // If we have found enough matches, lets get out 924e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches >= total_matches) 925e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton break; 926e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 927e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Update the max matches for any subsequent calls to find globals 928e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // in any other object files with DWARF 929e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches -= oso_matches; 93024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 93224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 93324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 93424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 93524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 93724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 93824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 93924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 940e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // If we aren't appending the results to this list, then clear the list 941e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (!append) 942e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton variables.Clear(); 943e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 944e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Remember how many variables are in the list before we search in case 945e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // we are appending the results to a variable list. 946e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton const uint32_t original_size = variables.GetSize(); 947e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 948e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton uint32_t total_matches = 0; 949e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton SymbolFileDWARF *oso_dwarf; 950e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 951e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton { 952e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton const uint32_t oso_matches = oso_dwarf->FindGlobalVariables (regex, 953e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton true, 954e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches, 955e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton variables); 956e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (oso_matches > 0) 957e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton { 958e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton total_matches += oso_matches; 959e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 960e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Are we getting all matches? 961e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches == UINT32_MAX) 962e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton continue; // Yep, continue getting everything 963e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 964e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // If we have found enough matches, lets get out 965e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton if (max_matches >= total_matches) 966e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton break; 967e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton 968e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Update the max matches for any subsequent calls to find globals 969e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // in any other object files with DWARF 970e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton max_matches -= oso_matches; 971e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton } 972e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton } 973e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton // Return the number of variable that were appended to the list 974e4b9df004d1fdd6ae10c9492fa0f504442829a10Greg Clayton return variables.GetSize() - original_size; 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 9797c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t symbol_idx = *symbol_idx_ptr; 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9837c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_idx < comp_unit_info->first_symbol_index) 9847c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return -1; 9857c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 9867c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_idx <= comp_unit_info->last_symbol_index) 9877c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return 0; 9887c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 9897c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return 1; 9907c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton} 9917c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 9927c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 9937c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Claytonint 9947c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) 9957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{ 9967c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton const user_id_t symbol_id = *symbol_idx_ptr; 9977c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 99849ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (symbol_id < comp_unit_info->first_symbol_id) 99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100149ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (symbol_id <= comp_unit_info->last_symbol_id) 100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo* 100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr) 101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = m_compile_unit_infos.size(); 101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = NULL; 101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count) 101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1015b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx, 1016b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton &m_compile_unit_infos[0], 1017b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton m_compile_unit_infos.size(), 1018b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton sizeof(CompileUnitInfo), 1019b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton (ComparisonFunction)SymbolContainsSymbolWithIndex); 102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx_ptr) 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info != NULL) 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0]; 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = UINT32_MAX; 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_info; 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10327c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo* 10337c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID (user_id_t symbol_id, uint32_t *oso_idx_ptr) 10347c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{ 10357c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton const uint32_t oso_index_count = m_compile_unit_infos.size(); 10367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton CompileUnitInfo *comp_unit_info = NULL; 10377c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (oso_index_count) 10387c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton { 1039b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton comp_unit_info = (CompileUnitInfo*)::bsearch (&symbol_id, 1040b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton &m_compile_unit_infos[0], 1041b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton m_compile_unit_infos.size(), 1042b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton sizeof(CompileUnitInfo), 1043b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton (ComparisonFunction)SymbolContainsSymbolWithID); 10447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton } 10457c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 10467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (oso_idx_ptr) 10477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton { 10487c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (comp_unit_info != NULL) 10497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0]; 10507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton else 10517c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton *oso_idx_ptr = UINT32_MAX; 10527c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton } 10537c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return comp_unit_info; 10547c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton} 10557c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 10567c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 105788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Claytonstatic void 10583508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonRemoveFunctionsWithModuleNotEqualTo (const ModuleSP &module_sp, SymbolContextList &sc_list, uint32_t start_idx) 105988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton{ 106088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // We found functions in .o files. Not all functions in the .o files 106188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // will have made it into the final output file. The ones that did 106288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // make it into the final output file will have a section whose module 106388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // matches the module from the ObjectFile for this SymbolFile. When 106488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // the modules don't match, then we have something that was in a 106588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // .o file, but doesn't map to anything in the final executable. 106688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t i=start_idx; 106788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton while (i < sc_list.GetSize()) 106888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 106988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton SymbolContext sc; 107088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton sc_list.GetContextAtIndex(i, sc); 107188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton if (sc.function) 107288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 10733508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const SectionSP section_sp (sc.function->GetAddressRange().GetBaseAddress().GetSection()); 10743508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (section_sp->GetModule() != module_sp) 107588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 107688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton sc_list.RemoveContextAtIndex(i); 107788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton continue; 107888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 107988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 108088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton ++i; 108188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 108288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton} 108388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton 108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 1085302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, const ClangNamespaceDecl *namespace_decl, uint32_t name_type_mask, bool include_inlines, bool append, SymbolContextList& sc_list) 108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 108724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 108824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (name = %s)", 108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.GetCString()); 109024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t initial_size = 0; 109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (append) 109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner initial_size = sc_list.GetSize(); 109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Clear(); 109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10977241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t oso_idx = 0; 10987241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton SymbolFileDWARF *oso_dwarf; 10997241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 110188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t sc_idx = sc_list.GetSize(); 1102302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan if (oso_dwarf->FindFunctions(name, namespace_decl, name_type_mask, include_inlines, true, sc_list)) 110388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 110488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx); 110588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 1113302d78c71902398ce1f422bd09216dd53a6abb88Sean CallananSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool include_inlines, bool append, SymbolContextList& sc_list) 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')", 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText()); 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11197241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t initial_size = 0; 11207241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton if (append) 11217241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton initial_size = sc_list.GetSize(); 11227241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton else 11237241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton sc_list.Clear(); 11247241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton 11257241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t oso_idx = 0; 11267241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton SymbolFileDWARF *oso_dwarf; 11277241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 11287241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton { 112988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t sc_idx = sc_list.GetSize(); 113088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton 1131302d78c71902398ce1f422bd09216dd53a6abb88Sean Callanan if (oso_dwarf->FindFunctions(regex, include_inlines, true, sc_list)) 113288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 113388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx); 113488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 11357241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton } 11367241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton 11377241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton return sc_list.GetSize() - initial_size; 113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1140a8b56238ce138e70433a0ce0b4218c9257beae38Greg Claytonsize_t 1141a8b56238ce138e70433a0ce0b4218c9257beae38Greg ClaytonSymbolFileDWARFDebugMap::GetTypes (SymbolContextScope *sc_scope, 1142a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton uint32_t type_mask, 1143a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton TypeList &type_list) 1144a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton{ 1145a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton Timer scoped_timer (__PRETTY_FUNCTION__, 1146a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton "SymbolFileDWARFDebugMap::GetTypes (type_mask = 0x%8.8x)", 1147a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton type_mask); 1148a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 1149a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 1150a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton uint32_t initial_size = type_list.GetSize(); 1151a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton SymbolFileDWARF *oso_dwarf = NULL; 1152a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (sc_scope) 1153a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 1154a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton SymbolContext sc; 1155a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton sc_scope->CalculateSymbolContext(&sc); 1156a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 1157a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton CompileUnitInfo *cu_info = GetCompUnitInfo (sc); 1158a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (cu_info) 1159a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 1160a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton oso_dwarf = GetSymbolFileByCompUnitInfo (cu_info); 1161a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton if (oso_dwarf) 1162a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton oso_dwarf->GetTypes (sc_scope, type_mask, type_list); 1163a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 1164a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 1165a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton else 1166a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 1167a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton uint32_t oso_idx = 0; 1168a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 1169a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton { 1170a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton oso_dwarf->GetTypes (sc_scope, type_mask, type_list); 1171a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 1172a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton } 1173a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton return type_list.GetSize() - initial_size; 1174a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton} 1175a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 1176a8b56238ce138e70433a0ce0b4218c9257beae38Greg Clayton 117795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonTypeSP 1178cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg ClaytonSymbolFileDWARFDebugMap::FindDefinitionTypeForDWARFDeclContext (const DWARFDeclContext &die_decl_ctx) 117995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton{ 118095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton TypeSP type_sp; 118195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton SymbolFileDWARF *oso_dwarf; 118295e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 118395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 1184cbff0fb344c17ef0699c1375f6ddeb5bcd1bdbe2Greg Clayton type_sp = oso_dwarf->FindDefinitionTypeForDWARFDeclContext (die_decl_ctx); 118595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton if (type_sp) 118695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton break; 118795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 118895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton return type_sp; 118995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton} 1190960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 119177917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 1192e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 1193e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Claytonbool 1194e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::Supports_DW_AT_APPLE_objc_complete_type (SymbolFileDWARF *skip_dwarf_oso) 1195e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton{ 1196e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolCalculate) 1197e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 1198e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolNo; 1199e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton SymbolFileDWARF *oso_dwarf; 1200e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 1201e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 1202e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton if (skip_dwarf_oso != oso_dwarf && oso_dwarf->Supports_DW_AT_APPLE_objc_complete_type(NULL)) 1203e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton { 1204e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton m_supports_DW_AT_APPLE_objc_complete_type = eLazyBoolYes; 1205e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton break; 1206e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 1207e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 1208e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton } 1209e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton return m_supports_DW_AT_APPLE_objc_complete_type == eLazyBoolYes; 1210e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton} 1211e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton 121277917228890a15d40ec6dd28c5865dd1b7895053Greg ClaytonTypeSP 1213e6b976d3f1c42f18c85c87cb179954af7df5a542Greg ClaytonSymbolFileDWARFDebugMap::FindCompleteObjCDefinitionTypeForDIE (const DWARFDebugInfoEntry *die, 1214e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton const ConstString &type_name, 1215e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton bool must_be_implementation) 121677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton{ 121777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton TypeSP type_sp; 121877917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton SymbolFileDWARF *oso_dwarf; 121977917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 122077917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton { 1221e6b976d3f1c42f18c85c87cb179954af7df5a542Greg Clayton type_sp = oso_dwarf->FindCompleteObjCDefinitionTypeForDIE (die, type_name, must_be_implementation); 122277917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton if (type_sp) 122377917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton break; 122477917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton } 122577917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton return type_sp; 122677917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton} 122777917228890a15d40ec6dd28c5865dd1b7895053Greg Clayton 1228960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonuint32_t 12291924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonSymbolFileDWARFDebugMap::FindTypes 12301924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton( 12311924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton const SymbolContext& sc, 12320fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ConstString &name, 12330fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ClangNamespaceDecl *namespace_decl, 12341924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton bool append, 12351924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton uint32_t max_matches, 12361924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton TypeList& types 12371924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton) 1238960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 1239960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (!append) 1240960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton types.Clear(); 12411924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 12421924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton const uint32_t initial_types_size = types.GetSize(); 12431924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton SymbolFileDWARF *oso_dwarf; 12441924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 12451924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton if (sc.comp_unit) 12461924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton { 12471924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton oso_dwarf = GetSymbolFile (sc); 12481924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton if (oso_dwarf) 12490fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan return oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types); 12501924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton } 12511924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton else 12521924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton { 12531924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton uint32_t oso_idx = 0; 12541924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 12550fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan oso_dwarf->FindTypes (sc, name, namespace_decl, append, max_matches, types); 12561924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton } 12571924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 12581924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton return types.GetSize() - initial_types_size; 1259960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 1260960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 126124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 126324943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_dwarf) 126724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types); 126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1271d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 12726916e358c9725b75ed91f31236c147f26c9af10eGreg ClaytonClangNamespaceDecl 1273d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg ClaytonSymbolFileDWARFDebugMap::FindNamespace (const lldb_private::SymbolContext& sc, 12740fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const lldb_private::ConstString &name, 12750fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan const ClangNamespaceDecl *parent_namespace_decl) 1276d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton{ 12776916e358c9725b75ed91f31236c147f26c9af10eGreg Clayton ClangNamespaceDecl matching_namespace; 1278d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton SymbolFileDWARF *oso_dwarf; 1279d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 1280d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton if (sc.comp_unit) 1281d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 1282d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton oso_dwarf = GetSymbolFile (sc); 1283d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton if (oso_dwarf) 12840fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl); 1285d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 1286d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton else 1287d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 1288d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton for (uint32_t oso_idx = 0; 1289d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); 1290d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton ++oso_idx) 1291d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton { 12920fcec13c6639ab49216fa9447b25888b7bc9ff59Sean Callanan matching_namespace = oso_dwarf->FindNamespace (sc, name, parent_namespace_decl); 1293d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 1294d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton if (matching_namespace) 1295d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton break; 1296d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 1297d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton } 1298d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 1299d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton return matching_namespace; 1300d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton} 1301d7cb26e87841731c6452a9f2e997ed0f9c92625cGreg Clayton 130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol 130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 13050e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName() 130724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetPluginNameStatic(); 130924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion() 131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 131524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 131749ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::CompUnitSP 131849ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::GetCompileUnit (SymbolFileDWARF *oso_dwarf) 1319ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton{ 132049ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_dwarf) 1321ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 132249ce8969d3154e1560106cfe530444c09410f217Greg Clayton const uint32_t cu_count = GetNumCompileUnits(); 132349ce8969d3154e1560106cfe530444c09410f217Greg Clayton for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx) 1324ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 132549ce8969d3154e1560106cfe530444c09410f217Greg Clayton SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]); 132649ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_symfile == oso_dwarf) 1327ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 13283cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (!m_compile_unit_infos[cu_idx].compile_unit_sp) 13293cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton m_compile_unit_infos[cu_idx].compile_unit_sp = ParseCompileUnitAtIndex (cu_idx); 133049ce8969d3154e1560106cfe530444c09410f217Greg Clayton 13313cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton return m_compile_unit_infos[cu_idx].compile_unit_sp; 1332ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 133349ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 133449ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 133549ce8969d3154e1560106cfe530444c09410f217Greg Clayton assert(!"this shouldn't happen"); 133649ce8969d3154e1560106cfe530444c09410f217Greg Clayton return lldb::CompUnitSP(); 133749ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 133849ce8969d3154e1560106cfe530444c09410f217Greg Clayton 1339464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo * 1340464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfo (SymbolFileDWARF *oso_dwarf) 1341464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 1342464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (oso_dwarf) 1343464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1344464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const uint32_t cu_count = GetNumCompileUnits(); 1345464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx) 1346464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1347464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]); 1348464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (oso_symfile == oso_dwarf) 1349464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1350464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return &m_compile_unit_infos[cu_idx]; 1351464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1352464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1353464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1354464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return NULL; 1355464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 1356464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 135749ce8969d3154e1560106cfe530444c09410f217Greg Clayton 135849ce8969d3154e1560106cfe530444c09410f217Greg Claytonvoid 135949ce8969d3154e1560106cfe530444c09410f217Greg ClaytonSymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp) 136049ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 136149ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_dwarf) 136249ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 136349ce8969d3154e1560106cfe530444c09410f217Greg Clayton const uint32_t cu_count = GetNumCompileUnits(); 136449ce8969d3154e1560106cfe530444c09410f217Greg Clayton for (uint32_t cu_idx=0; cu_idx<cu_count; ++cu_idx) 136549ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 136649ce8969d3154e1560106cfe530444c09410f217Greg Clayton SymbolFileDWARF *oso_symfile = GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[cu_idx]); 136749ce8969d3154e1560106cfe530444c09410f217Greg Clayton if (oso_symfile == oso_dwarf) 1368ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 13693cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton if (m_compile_unit_infos[cu_idx].compile_unit_sp) 137049ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 13713cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton assert (m_compile_unit_infos[cu_idx].compile_unit_sp.get() == cu_sp.get()); 137249ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 137349ce8969d3154e1560106cfe530444c09410f217Greg Clayton else 137449ce8969d3154e1560106cfe530444c09410f217Greg Clayton { 13753cf7ab5462467121b4ac6cde09ee994030dad0c5Greg Clayton m_compile_unit_infos[cu_idx].compile_unit_sp = cu_sp; 137649ce8969d3154e1560106cfe530444c09410f217Greg Clayton m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex(cu_idx, cu_sp); 137749ce8969d3154e1560106cfe530444c09410f217Greg Clayton } 1378ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1379ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1380ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1381ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton} 1382ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1383b01000fd063629facd45044f137446fb748ee179Greg Clayton 1384b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 1385b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteTagDecl (void *baton, clang::TagDecl *decl) 1386b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1387b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; 138852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 1389b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 1390b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1391b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARF *oso_dwarf; 1392b01000fd063629facd45044f137446fb748ee179Greg Clayton 1393b01000fd063629facd45044f137446fb748ee179Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 1394b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1395b01000fd063629facd45044f137446fb748ee179Greg Clayton if (oso_dwarf->HasForwardDeclForClangType (clang_type)) 1396b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1397b01000fd063629facd45044f137446fb748ee179Greg Clayton oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 1398b01000fd063629facd45044f137446fb748ee179Greg Clayton return; 1399b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1400b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1401b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1402b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1403b01000fd063629facd45044f137446fb748ee179Greg Clayton 1404b01000fd063629facd45044f137446fb748ee179Greg Claytonvoid 1405b01000fd063629facd45044f137446fb748ee179Greg ClaytonSymbolFileDWARFDebugMap::CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *decl) 1406b01000fd063629facd45044f137446fb748ee179Greg Clayton{ 1407b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; 140852f792329be5db8e38961350589e97e8f2823acdGreg Clayton ClangASTType clang_type = symbol_file_dwarf->GetClangASTContext().GetTypeForDecl (decl); 1409b01000fd063629facd45044f137446fb748ee179Greg Clayton if (clang_type) 1410b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1411b01000fd063629facd45044f137446fb748ee179Greg Clayton SymbolFileDWARF *oso_dwarf; 1412b01000fd063629facd45044f137446fb748ee179Greg Clayton 1413b01000fd063629facd45044f137446fb748ee179Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 1414b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1415b01000fd063629facd45044f137446fb748ee179Greg Clayton if (oso_dwarf->HasForwardDeclForClangType (clang_type)) 1416b01000fd063629facd45044f137446fb748ee179Greg Clayton { 1417b01000fd063629facd45044f137446fb748ee179Greg Clayton oso_dwarf->ResolveClangOpaqueTypeDefinition (clang_type); 1418b01000fd063629facd45044f137446fb748ee179Greg Clayton return; 1419b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1420b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1421b01000fd063629facd45044f137446fb748ee179Greg Clayton } 1422b01000fd063629facd45044f137446fb748ee179Greg Clayton} 1423b01000fd063629facd45044f137446fb748ee179Greg Clayton 14243fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Claytonbool 14253fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg ClaytonSymbolFileDWARFDebugMap::LayoutRecordType (void *baton, 14263fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton const clang::RecordDecl *record_decl, 14273fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &size, 14283fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton uint64_t &alignment, 14293fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::FieldDecl *, uint64_t> &field_offsets, 14303fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &base_offsets, 14313fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton llvm::DenseMap <const clang::CXXRecordDecl *, clang::CharUnits> &vbase_offsets) 14323fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton{ 14333fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; 14343fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton SymbolFileDWARF *oso_dwarf; 14353fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = symbol_file_dwarf->GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 14363fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton { 14373fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton if (oso_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets)) 14383fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton return true; 14393fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton } 14403fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton return false; 14413fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton} 14423fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 14433fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 14443fc0c4f12b19f1e2bd276d2b6eb0fdd096a01414Greg Clayton 1445444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext* 1446444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextContainingTypeUID (lldb::user_id_t type_uid) 1447444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{ 1448444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid); 1449444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 1450444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (oso_dwarf) 1451444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return oso_dwarf->GetClangDeclContextContainingTypeUID (type_uid); 1452444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return NULL; 1453444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton} 1454444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 1455444e35b5fdf15a25a427285650f06f1390e62c75Greg Claytonclang::DeclContext* 1456444e35b5fdf15a25a427285650f06f1390e62c75Greg ClaytonSymbolFileDWARFDebugMap::GetClangDeclContextForTypeUID (const lldb_private::SymbolContext &sc, lldb::user_id_t type_uid) 1457444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton{ 1458444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton const uint64_t oso_idx = GetOSOIndexFromUserID (type_uid); 1459444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 1460444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton if (oso_dwarf) 1461444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return oso_dwarf->GetClangDeclContextForTypeUID (sc, type_uid); 1462444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton return NULL; 1463444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton} 1464444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 1465464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonbool 1466464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::AddOSOFileRange (CompileUnitInfo *cu_info, 1467464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::addr_t exe_file_addr, 1468464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::addr_t oso_file_addr, 1469464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton lldb::addr_t oso_byte_size) 1470464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 1471464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const uint32_t debug_map_idx = m_debug_map.FindEntryIndexThatContains(exe_file_addr); 1472464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (debug_map_idx != UINT32_MAX) 1473464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1474464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(exe_file_addr); 1475464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton debug_map_entry->data.SetOSOFileAddress(oso_file_addr); 1476464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton cu_info->file_range_map.Append(FileRangeMap::Entry(oso_file_addr, oso_byte_size, exe_file_addr)); 1477464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return true; 1478464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1479464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return false; 1480464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 1481464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 1482464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonvoid 1483464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::FinalizeOSOFileRanges (CompileUnitInfo *cu_info) 1484464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 1485464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton cu_info->file_range_map.Sort(); 1486464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton#if defined(DEBUG_OSO_DMAP) 1487464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const FileRangeMap &oso_file_range_map = cu_info->GetFileRangeMap(this); 1488464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const size_t n = oso_file_range_map.GetSize(); 148997a19b21dacd9063bb5475812df7781777262198Greg Clayton printf ("SymbolFileDWARFDebugMap::FinalizeOSOFileRanges (cu_info = %p) %s\n", 1490a48b8eb95e4217e6ba0e6b3c0c3a909811766d4bGreg Clayton cu_info, 149197a19b21dacd9063bb5475812df7781777262198Greg Clayton cu_info->oso_sp->module_sp->GetFileSpec().GetPath().c_str()); 1492464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton for (size_t i=0; i<n; ++i) 1493464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1494464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const FileRangeMap::Entry &entry = oso_file_range_map.GetEntryRef(i); 1495464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton printf ("oso [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ") ==> exe [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n", 1496464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton entry.GetRangeBase(), entry.GetRangeEnd(), 1497464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton entry.data, entry.data + entry.GetByteSize()); 1498464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1499464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton#endif 1500464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 1501464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 1502464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonlldb::addr_t 1503464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::LinkOSOFileAddress (SymbolFileDWARF *oso_symfile, lldb::addr_t oso_file_addr) 1504464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 1505464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton CompileUnitInfo *cu_info = GetCompileUnitInfo (oso_symfile); 1506464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (cu_info) 1507464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1508464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const FileRangeMap::Entry *oso_range_entry = cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr); 1509464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (oso_range_entry) 1510464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1511464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(oso_range_entry->data); 1512464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (debug_map_entry) 1513464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1514464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const lldb::addr_t offset = oso_file_addr - oso_range_entry->GetRangeBase(); 1515464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const lldb::addr_t exe_file_addr = debug_map_entry->GetRangeBase() + offset; 1516464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return exe_file_addr; 1517464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1518464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1519464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1520464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return LLDB_INVALID_ADDRESS; 1521464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 1522464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 1523464a5063bc59755cb6ec063d0b2491097302d2abGreg Claytonbool 1524464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::LinkOSOAddress (Address &addr) 1525464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 1526464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton // Make sure this address hasn't been fixed already 1527464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Module *exe_module = GetObjectFile()->GetModule().get(); 1528464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton Module *addr_module = addr.GetModule().get(); 1529464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (addr_module == exe_module) 1530464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return true; // Address is already in terms of the main executable module 1531464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 15320e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton CompileUnitInfo *cu_info = GetCompileUnitInfo (GetSymbolFileAsSymbolFileDWARF(addr_module->GetSymbolVendor()->GetSymbolFile())); 1533464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (cu_info) 1534464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1535464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const lldb::addr_t oso_file_addr = addr.GetFileAddress(); 1536464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const FileRangeMap::Entry *oso_range_entry = cu_info->GetFileRangeMap(this).FindEntryThatContains(oso_file_addr); 1537464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (oso_range_entry) 1538464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1539464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const DebugMap::Entry *debug_map_entry = m_debug_map.FindEntryThatContains(oso_range_entry->data); 1540464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (debug_map_entry) 1541464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton { 1542464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const lldb::addr_t offset = oso_file_addr - oso_range_entry->GetRangeBase(); 1543464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton const lldb::addr_t exe_file_addr = debug_map_entry->GetRangeBase() + offset; 1544464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return exe_module->ResolveFileAddress(exe_file_addr, addr); 1545464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1546464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1547464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton } 1548464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return true; 1549464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 1550464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 1551464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonLineTable * 1552464a5063bc59755cb6ec063d0b2491097302d2abGreg ClaytonSymbolFileDWARFDebugMap::LinkOSOLineTable (SymbolFileDWARF *oso_dwarf, LineTable *line_table) 1553464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton{ 1554464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton CompileUnitInfo *cu_info = GetCompileUnitInfo (oso_dwarf); 1555464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton if (cu_info) 1556464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return line_table->LinkLineTable(cu_info->GetFileRangeMap(this)); 1557464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton return NULL; 1558464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton} 1559464a5063bc59755cb6ec063d0b2491097302d2abGreg Clayton 156000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granatasize_t 156100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico GranataSymbolFileDWARFDebugMap::AddOSOARanges (SymbolFileDWARF* dwarf2Data, DWARFDebugAranges* debug_aranges) 156200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata{ 156300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata size_t num_line_entries_added = 0; 156400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata if (debug_aranges && dwarf2Data) 156500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata { 156600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata CompileUnitInfo *compile_unit_info = GetCompileUnitInfo(dwarf2Data); 156700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata if (compile_unit_info) 156800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata { 156900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata const FileRangeMap &file_range_map = compile_unit_info->GetFileRangeMap(this); 157000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata for (size_t idx = 0; 157100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata idx < file_range_map.GetSize(); 157200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata idx++) 157300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata { 157400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata const FileRangeMap::Entry* entry = file_range_map.GetEntryAtIndex(idx); 157500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata if (entry) 157600f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata { 157700f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata printf ("[0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")\n", entry->GetRangeBase(), entry->GetRangeEnd()); 157800f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata debug_aranges->AppendRange(dwarf2Data->GetID(), entry->GetRangeBase(), entry->GetRangeEnd()); 157900f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata num_line_entries_added++; 158000f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata } 158100f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata } 158200f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata } 158300f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata } 158400f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata return num_line_entries_added; 158500f42bb3118bbeb887692de8b852e2eee3a72c0aEnrico Granata} 1586444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton 1587