SymbolFileDWARFDebugMap.cpp revision e98ac25604b3d967158917f6fdd5289b3096fd80
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolFileDWARFDebugMap.cpp ----------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARFDebugMap.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/ModuleList.h" 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/RegularExpression.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/StreamFile.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/SymbolVendor.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/VariableList.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "SymbolFileDWARF.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Initialize() 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::RegisterPlugin (GetPluginNameStatic(), 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(), 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateInstance); 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::Terminate() 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::UnregisterPlugin (CreateInstance); 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginNameStatic() 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "symbol-file.dwarf2-debugmap"; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginDescriptionStatic() 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "DWARF and DWARF3 debug symbol file reader (debug map)."; 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFile* 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CreateInstance (ObjectFile* obj_file) 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return new SymbolFileDWARFDebugMap (obj_file); 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::SymbolFileDWARFDebugMap (ObjectFile* ofile) : 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile(ofile), 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags(), 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos(), 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_func_indexes(), 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_glob_indexes() 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::~SymbolFileDWARFDebugMap() 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75e98ac25604b3d967158917f6fdd5289b3096fd80Greg Claytonlldb_private::ClangASTContext & 76e98ac25604b3d967158917f6fdd5289b3096fd80Greg ClaytonSymbolFileDWARFDebugMap::GetClangASTContext () 77e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton{ 78e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton return GetTypeList()->GetClangASTContext(); 79e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton} 80e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::InitOSO () 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_flags.test(kHaveInitializedOSOs)) 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return; 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.set(kHaveInitializedOSOs); 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //StreamFile s(0, 4, eByteOrderHost, stdout); 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> oso_indexes; 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = symtab->AppendSymbolIndexesWithType(eSymbolTypeObjectFile, oso_indexes); 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1007c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->AppendSymbolIndexesWithType (eSymbolTypeCode, Symtab::eDebugYes, Symtab::eVisibilityAny, m_func_indexes); 1017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton symtab->AppendSymbolIndexesWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, m_glob_indexes); 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->SortSymbolIndexesByValue(m_func_indexes, true); 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->SortSymbolIndexesByValue(m_glob_indexes, true); 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos.resize(oso_index_count); 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// s.Printf("%s N_OSO symbols:\n", __PRETTY_FUNCTION__); 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// symtab->Dump(&s, oso_indexes); 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<oso_index_count; ++i) 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 1); 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[i].so_symbol->GetSiblingIndex() == 0) 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].so_symbol = symtab->SymbolAtIndex(oso_indexes[i] - 2); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[i].oso_symbol = symtab->SymbolAtIndex(oso_indexes[i]); 1187c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton uint32_t sibling_idx = m_compile_unit_infos[i].so_symbol->GetSiblingIndex(); 1197c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton assert (sibling_idx != 0); 1207c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton assert (sibling_idx > i + 1); 1217c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton m_compile_unit_infos[i].last_symbol = symtab->SymbolAtIndex (sibling_idx - 1); 1227c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton m_compile_unit_infos[i].first_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].so_symbol); 1237c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton m_compile_unit_infos[i].last_symbol_index = symtab->GetIndexForSymbol(m_compile_unit_infos[i].last_symbol); 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByOSOIndex (uint32_t oso_idx) 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < cu_count) 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetModuleByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerModule * 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetModuleByCompUnitInfo (CompileUnitInfo *comp_unit_info) 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_module_sp.get() == NULL) 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *oso_symbol = comp_unit_info->oso_symbol; 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_symbol) 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 146537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton FileSpec oso_file_spec(oso_symbol->GetMangled().GetName().AsCString(), true); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ModuleList::GetSharedModule (oso_file_spec, 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_obj_file->GetModule()->GetArchitecture(), 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, // UUID pointer 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, // object name 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, // object offset 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->oso_module_sp, 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL); 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //comp_unit_info->oso_module_sp.reset(new Module (oso_file_spec, m_obj_file->GetModule()->GetArchitecture())); 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_info->oso_module_sp.get(); 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetFileSpecForSO (uint32_t oso_idx, FileSpec &file_spec) 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_compile_unit_infos[oso_idx].so_file) 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[oso_idx].so_symbol == NULL) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string so_path (m_compile_unit_infos[oso_idx].so_symbol->GetMangled().GetName().AsCString()); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[oso_idx].so_symbol[1].GetType() == eSymbolTypeSourceFile) 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner so_path += m_compile_unit_infos[oso_idx].so_symbol[1].GetMangled().GetName().AsCString(); 177537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton m_compile_unit_infos[oso_idx].so_file.SetFile(so_path.c_str(), true); 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner file_spec = m_compile_unit_infos[oso_idx].so_file; 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByOSOIndex (uint32_t oso_idx) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByOSOIndex (oso_idx); 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFile (const SymbolContext& sc) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = GetCompUnitInfo (sc); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (comp_unit_info); 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetObjectFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = GetModuleByCompUnitInfo (comp_unit_info); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_module) 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_module->GetObjectFile(); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByOSOIndex (uint32_t oso_idx) 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx < m_compile_unit_infos.size()) 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSymbolFileByCompUnitInfo (&m_compile_unit_infos[oso_idx]); 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARF * 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetSymbolFileByCompUnitInfo (CompileUnitInfo *comp_unit_info) 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor == NULL) 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *oso_objfile = GetObjectFileByCompUnitInfo (comp_unit_info); 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_objfile) 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->oso_symbol_vendor = oso_objfile->GetModule()->GetSymbolVendor(); 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = new SymbolFileDWARF(oso_objfile); 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// comp_unit_info->oso_dwarf_sp.reset (oso_dwarf); 23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor) 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 236ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // Set a a pointer to this class to set our OSO DWARF file know 237ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // that the DWARF is being used along with a debug map and that 238ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // it will have the remapped sections that we do below. 239ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton ((SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile())->SetDebugMapSymfile(this); 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp.reset(new SectionList); 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *exe_symtab = m_obj_file->GetSymtab(); 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Module *oso_module = oso_objfile->GetModule(); 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *oso_symtab = oso_objfile->GetSymtab(); 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define DEBUG_OSO_DMAP // Do not check in with this defined... 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP) 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamFile s(stdout); 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO symtab:\n"; 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_symtab->Dump(&s, NULL); 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO sections before:\n"; 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_objfile->GetSectionList()->Dump(&s, NULL, true); 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ///const uint32_t fun_resolve_flags = SymbolContext::Module | eSymbolContextCompUnit | eSymbolContextFunction; 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner //SectionList *oso_sections = oso_objfile->Sections(); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now we need to make sections that map from zero based object 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // file addresses to where things eneded up in the main executable. 2587c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton uint32_t oso_start_idx = exe_symtab->GetIndexForSymbol (comp_unit_info->oso_symbol); 2597c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton assert (oso_start_idx != UINT32_MAX); 2607c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton oso_start_idx += 1; 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_end_idx = comp_unit_info->so_symbol->GetSiblingIndex(); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t sect_id = 0x10000; 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t idx = oso_start_idx; idx < oso_end_idx; ++idx) 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *exe_symbol = exe_symtab->SymbolAtIndex(idx); 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_symbol) 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2687c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (exe_symbol->IsDebug() == false) 2697c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton continue; 2707c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (exe_symbol->GetType()) 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 2737c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton case eSymbolTypeCode: 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For each N_FUN, or function that we run into in the debug map 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we make a new section that we add to the sections found in the 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // .o file. This new section has the file address set to what the 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // addresses are in the .o file, and the load address is adjusted 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to match where it ended up in the final executable! We do this 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // before we parse any dwarf info so that when it goes get parsed 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all section/offset addresses that get registered will resolve 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // correctly to the new addresses in the main executable. 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // First we find the original symbol in the .o file's symbol table 2857c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton Symbol *oso_fun_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeCode, Symtab::eDebugNo, Symtab::eVisibilityAny); 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_fun_symbol) 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we found the symbol, then we 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* exe_fun_section = const_cast<Section *>(exe_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* oso_fun_section = const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_fun_section) 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now we create a section that we will add as a child of the 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // section in which the .o symbol (the N_FUN) exists. 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We use the exe_symbol size because the one in the .o file 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // will just be a symbol with no size, and the exe_symbol 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // size will reflect any size changes (ppc has been known to 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // shrink function sizes when it gets rid of jump islands that 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // aren't needed anymore). 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionSP oso_fun_section_sp (new Section (const_cast<Section *>(oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()), 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_module, // Module (the .o file) 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated! 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eSectionTypeDebug, 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), // File VM address offset in the current section 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetByteSize(), // File size (we need the size from the executable) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, 0, 0)); 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_section_sp->SetLinkedLocation (exe_fun_section, 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetValue().GetFileAddress() - exe_fun_section->GetFileAddress()); 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_fun_section->GetChildren().AddSection(oso_fun_section_sp); 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3197c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton case eSymbolTypeData: 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // For each N_GSYM we remap the address for the global by making 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // a new section that we add to the sections found in the .o file. 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // This new section has the file address set to what the 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // addresses are in the .o file, and the load address is adjusted 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // to match where it ended up in the final executable! We do this 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // before we parse any dwarf info so that when it goes get parsed 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // all section/offset addresses that get registered will resolve 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // correctly to the new addresses in the main executable. We 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // initially set the section size to be 1 byte, but will need to 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // fix up these addresses further after all globals have been 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // parsed to span the gaps, or we can find the global variable 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // sizes from the DWARF info as we are parsing. 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if 0 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // First we find the non-stab entry that corresponds to the N_GSYM in the executable 3367c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton Symbol *exe_gsym_symbol = exe_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData, Symtab::eDebugNo, Symtab::eVisibilityAny); 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#else 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The mach-o object file parser already matches up the N_GSYM with with the non-stab 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // entry, so we shouldn't have to do that. If this ever changes, enable the code above 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // in the "#if 0" block. STSYM's always match the symbol as found below. 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *exe_gsym_symbol = exe_symbol; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Next we find the non-stab entry that corresponds to the N_GSYM in the .o file 3447c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton Symbol *oso_gsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData, Symtab::eDebugNo, Symtab::eVisibilityAny); 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (exe_gsym_symbol && oso_gsym_symbol) 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we found the symbol, then we 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* exe_gsym_section = const_cast<Section *>(exe_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Section* oso_gsym_section = const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_gsym_section) 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionSP oso_gsym_section_sp (new Section (const_cast<Section *>(oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()), 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_module, // Module (the .o file) 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_symbol->GetMangled().GetName(), // Name the section the same as the symbol for which is was generated! 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner eSectionTypeDebug, 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), // File VM address offset in the current section 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1, // We don't know the size of the global, just do the main address for now. 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 0, 0, 0)); 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_section_sp->SetLinkedLocation (exe_gsym_section, 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner exe_gsym_symbol->GetValue().GetFileAddress() - exe_gsym_section->GetFileAddress()); 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_gsym_section->GetChildren().AddSection(oso_gsym_section_sp); 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_info->debug_map_sections_sp->AddSection(oso_gsym_section_sp); 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// case eSymbolTypeStatic: 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // For each N_STSYM we remap the address for the global by making 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // a new section that we add to the sections found in the .o file. 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // This new section has the file address set to what the 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // addresses are in the .o file, and the load address is adjusted 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // to match where it ended up in the final executable! We do this 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // before we parse any dwarf info so that when it goes get parsed 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // all section/offset addresses that get registered will resolve 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // correctly to the new addresses in the main executable. We 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // initially set the section size to be 1 byte, but will need to 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // fix up these addresses further after all globals have been 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // parsed to span the gaps, or we can find the global variable 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // sizes from the DWARF info as we are parsing. 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Symbol *exe_stsym_symbol = exe_symbol; 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // First we find the non-stab entry that corresponds to the N_STSYM in the .o file 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Symbol *oso_stsym_symbol = oso_symtab->FindFirstSymbolWithNameAndType(exe_symbol->GetMangled().GetName(), eSymbolTypeData); 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (exe_stsym_symbol && oso_stsym_symbol) 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // If we found the symbol, then we 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Section* exe_stsym_section = const_cast<Section *>(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Section* oso_stsym_section = const_cast<Section *>(oso_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection()); 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_stsym_section) 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// { 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // The load address of the symbol will use the section in the 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // executable that contains the debug map that corresponds to 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // the N_FUN symbol. We set the offset to reflect the offset 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // into that section since we are creating a new section. 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// AddressRange stsym_load_range(exe_stsym_section, exe_stsym_symbol->GetValue().GetFileAddress() - exe_stsym_section->GetFileAddress(), 1); 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // We need the symbol's section offset address from the .o file, but 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // we need a non-zero size. 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// AddressRange stsym_file_range(exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetSection(), exe_stsym_symbol->GetAddressRangePtr()->GetBaseAddress().GetOffset(), 1); 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // Now we create a section that we will add as a child of the 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// // section in which the .o symbol (the N_FUN) exists. 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// TODO: mimic what I did for N_FUN if that works... 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // We use the 1 byte for the size because we don't know the 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // size of the global symbol without seeing the DWARF. 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// SectionSP oso_fun_section_sp (new Section ( NULL, oso_module, // Module (the .o file) 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// sect_id++, // Section ID starts at 0x10000 and increments so the section IDs don't overlap with the standard mach IDs 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// exe_symbol->GetMangled().GetName(),// Name the section the same as the symbol for which is was generated! 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // &stsym_load_range, // Load offset is the offset into the executable section for the N_FUN from the debug map 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// &stsym_file_range, // File section/offset is just the same os the symbol on the .o file 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// 0, 0, 0)); 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // Now we add the new section to the .o file's sections as a child 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// // of the section in which the N_SECT symbol exists. 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// oso_stsym_section->GetChildren().AddSection(oso_fun_section_sp); 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//// comp_unit_info->debug_map_sections_sp->AddSection(oso_fun_section_sp); 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// } 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// break; 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined(DEBUG_OSO_DMAP) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s << "OSO sections after:\n"; 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_objfile->GetSectionList()->Dump(&s, NULL, true); 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info->oso_symbol_vendor) 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return (SymbolFileDWARF *)comp_unit_info->oso_symbol_vendor->GetSymbolFile(); 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetAbilities () 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // In order to get the abilities of this plug-in, we look at the list of 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // N_OSO entries (object files) from the symbol table and make sure that 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // these files exist and also contain valid DWARF. If we get any of that 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // then we return the abilities of the first N_OSO's DWARF. 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = GetNumCompileUnits(); 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count > 0) 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t dwarf_abilities = SymbolFile::CompileUnits | 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::Functions | 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::Blocks | 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::GlobalVariables | 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::LocalVariables | 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::VariableTypes | 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFile::LineTables; 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t oso_idx=0; oso_idx<oso_index_count; ++oso_idx) 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_abilities = oso_dwarf->GetAbilities(); 46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((oso_abilities & dwarf_abilities) == dwarf_abilities) 46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_abilities; 46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetNumCompileUnits() 47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner InitOSO (); 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_compile_unit_infos.size(); 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCompUnitSP 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitAtIndex(uint32_t cu_idx) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompUnitSP comp_unit_sp; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cu_idx < cu_count) 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL) 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (cu_idx); 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // There is only one compile unit for N_OSO entry right now, so 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // it will always exist at index zero. 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[cu_idx].oso_compile_unit_sp = m_compile_unit_infos[cu_idx].oso_symbol_vendor->GetCompileUnitAtIndex (0); 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_compile_unit_infos[cu_idx].oso_compile_unit_sp.get() == NULL) 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We weren't able to get the DWARF for this N_OSO entry (the 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // .o file may be missing or not at the specified path), make 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // one up as best we can from the debug map. We set the uid 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // of the compile unit to the symbol index with the MSBit set 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so that it doesn't collide with any uid values from the DWARF 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symbol *so_symbol = m_compile_unit_infos[cu_idx].so_symbol; 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (so_symbol) 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_compile_unit_infos[cu_idx].oso_compile_unit_sp.reset(new CompileUnit (m_obj_file->GetModule(), 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner NULL, 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner so_symbol->GetMangled().GetName().AsCString(), 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cu_idx, 5149488b7423b556c7c777b721d2094fd5ec4a47578Greg Clayton eLanguageTypeUnknown)); 515ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 516ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton // Let our symbol vendor know about this compile unit 517ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_obj_file->GetModule()->GetSymbolVendor()->SetCompileUnitAtIndex (m_compile_unit_infos[cu_idx].oso_compile_unit_sp, 518ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton cu_idx); 51924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner comp_unit_sp = m_compile_unit_infos[cu_idx].oso_compile_unit_sp; 52324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_sp; 52624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo * 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompUnitInfo (const SymbolContext& sc) 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.comp_unit == m_compile_unit_infos[i].oso_compile_unit_sp.get()) 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return &m_compile_unit_infos[i]; 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitFunctions (const SymbolContext& sc) 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitFunctions (sc); 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitLineTable (const SymbolContext& sc) 55124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitLineTable (sc); 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseCompileUnitSupportFiles (const SymbolContext& sc, FileSpecList &support_files) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 56224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseCompileUnitSupportFiles (sc, support_files); 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 56624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseFunctionBlocks (const SymbolContext& sc) 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 57224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseFunctionBlocks (sc); 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseTypes (const SymbolContext& sc) 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseTypes (sc); 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ParseVariablesForContext (const SymbolContext& sc) 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return oso_dwarf->ParseTypes (sc); 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerType* 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveTypeUID(lldb::user_id_t type_uid) 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 605462d4147f3bb9141bf62d904f58a623db00669dfGreg Claytonlldb::clang_type_t 606462d4147f3bb9141bf62d904f58a623db00669dfGreg ClaytonSymbolFileDWARFDebugMap::ResolveClangOpaqueTypeDefinition (lldb::clang_type_t clang_Type) 607462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton{ 608462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton // We have a struct/union/class/enum that needs to be fully resolved. 609462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton return NULL; 610462d4147f3bb9141bf62d904f58a623db00669dfGreg Clayton} 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const Address& exe_so_addr, uint32_t resolve_scope, SymbolContext& sc) 61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t resolved_flags = 0; 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const addr_t exe_file_addr = exe_so_addr.GetFileAddress(); 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc.symbol = symtab->FindSymbolContainingFileAddress (exe_file_addr, &m_func_indexes[0], m_func_indexes.size()); 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sc.symbol != NULL) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner resolved_flags |= eSymbolContextSymbol; 62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx = 0; 6277c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithID (sc.symbol->GetID(), &oso_idx); 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ObjectFile *oso_objfile = GetObjectFileByOSOIndex (oso_idx); 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf && oso_objfile) 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionList *oso_section_list = oso_objfile->GetSectionList(); 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 636178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton SectionSP oso_symbol_section_sp (oso_section_list->FindSectionContainingLinkedFileAddress (exe_file_addr, UINT32_MAX)); 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 638178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (oso_symbol_section_sp) 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 640178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton const addr_t linked_file_addr = oso_symbol_section_sp->GetLinkedFileAddress(); 641178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton Address oso_so_addr (oso_symbol_section_sp.get(), exe_file_addr - linked_file_addr); 642178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton if (oso_so_addr.IsSectionOffset()) 643178710cd4307f3d44dc76ebd70fc7daf7ebe17c5Greg Clayton resolved_flags |= oso_dwarf->ResolveSymbolContext (oso_so_addr, resolve_scope, sc); 64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return resolved_flags; 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ResolveSymbolContext (const FileSpec& file_spec, uint32_t line, bool check_inlines, uint32_t resolve_scope, SymbolContextList& sc_list) 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t initial = sc_list.GetSize(); 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t cu_count = GetNumCompileUnits(); 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner FileSpec so_file_spec; 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (uint32_t i=0; i<cu_count; ++i) 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (GetFileSpecForSO (i, so_file_spec)) 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // By passing false to the comparison we will be able to match 66524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // and files given a filename only. If both file_spec and 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // so_file_spec have directories, we will still do a full match. 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (FileSpec::Compare (file_spec, so_file_spec, false) == 0) 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (i); 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner oso_dwarf->ResolveSymbolContext(file_spec, line, check_inlines, resolve_scope, sc_list); 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial; 67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::PrivateFindGlobalVariables 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const ConstString &name, 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const std::vector<uint32_t> &indexes, // Indexes into the symbol table that match "name" 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t max_matches, 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner VariableList& variables 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t match_count = indexes.size(); 68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (size_t i=0; i<match_count; ++i) 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t oso_idx; 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo* comp_unit_info = GetCompileUnitInfoForSymbolWithIndex (indexes[i], &oso_idx); 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info) 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolFileDWARF *oso_dwarf = GetSymbolFileByOSOIndex (oso_idx); 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf) 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_dwarf->FindGlobalVariables(name, true, max_matches, variables)) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (variables.GetSize() > max_matches) 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const ConstString &name, bool append, uint32_t max_matches, VariableList& variables) 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // If we aren't appending the results to this list, then clear the list 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!append) 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner variables.Clear(); 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remember how many variables are in the list before we search in case 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // we are appending the results to a variable list. 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t original_size = variables.GetSize(); 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab* symtab = m_obj_file->GetSymtab(); 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<uint32_t> indexes; 7237c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton const size_t match_count = m_obj_file->GetSymtab()->FindAllSymbolsWithNameAndType (name, eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, indexes); 72424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (match_count) 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PrivateFindGlobalVariables (name, indexes, max_matches, variables); 72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Return the number of variable that were appended to the list 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return variables.GetSize() - original_size; 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindGlobalVariables (const RegularExpression& regex, bool append, uint32_t max_matches, VariableList& variables) 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 7427c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithIndex (uint32_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t symbol_idx = *symbol_idx_ptr; 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7467c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_idx < comp_unit_info->first_symbol_index) 7477c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return -1; 7487c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7497c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_idx <= comp_unit_info->last_symbol_index) 7507c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return 0; 7517c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7527c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return 1; 7537c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton} 7547c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7557c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7567c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Claytonint 7577c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::SymbolContainsSymbolWithID (user_id_t *symbol_idx_ptr, const CompileUnitInfo *comp_unit_info) 7587c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{ 7597c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton const user_id_t symbol_id = *symbol_idx_ptr; 7607c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 7617c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_id < comp_unit_info->so_symbol->GetID()) 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return -1; 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7647c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (symbol_id <= comp_unit_info->last_symbol->GetID()) 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::CompileUnitInfo* 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithIndex (uint32_t symbol_idx, uint32_t *oso_idx_ptr) 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint32_t oso_index_count = m_compile_unit_infos.size(); 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CompileUnitInfo *comp_unit_info = NULL; 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_index_count) 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7787c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_idx, &m_compile_unit_infos[0], m_compile_unit_infos.size(), sizeof(CompileUnitInfo), (comparison_function)SymbolContainsSymbolWithIndex); 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (oso_idx_ptr) 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (comp_unit_info != NULL) 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0]; 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *oso_idx_ptr = UINT32_MAX; 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return comp_unit_info; 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7917c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::CompileUnitInfo* 7927c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg ClaytonSymbolFileDWARFDebugMap::GetCompileUnitInfoForSymbolWithID (user_id_t symbol_id, uint32_t *oso_idx_ptr) 7937c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton{ 7947c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton const uint32_t oso_index_count = m_compile_unit_infos.size(); 7957c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton CompileUnitInfo *comp_unit_info = NULL; 7967c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (oso_index_count) 7977c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton { 7987c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton comp_unit_info = (CompileUnitInfo*)bsearch(&symbol_id, &m_compile_unit_infos[0], m_compile_unit_infos.size(), sizeof(CompileUnitInfo), (comparison_function)SymbolContainsSymbolWithID); 7997c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton } 8007c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 8017c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (oso_idx_ptr) 8027c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton { 8037c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton if (comp_unit_info != NULL) 8047c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton *oso_idx_ptr = comp_unit_info - &m_compile_unit_infos[0]; 8057c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton else 8067c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton *oso_idx_ptr = UINT32_MAX; 8077c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton } 8087c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton return comp_unit_info; 8097c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton} 8107c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 8117c36fa07bc2c2c7efc4a28ad540f7711491f379dGreg Clayton 81288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Claytonstatic void 81388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg ClaytonRemoveFunctionsWithModuleNotEqualTo (Module *module, SymbolContextList &sc_list, uint32_t start_idx) 81488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton{ 81588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // We found functions in .o files. Not all functions in the .o files 81688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // will have made it into the final output file. The ones that did 81788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // make it into the final output file will have a section whose module 81888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // matches the module from the ObjectFile for this SymbolFile. When 81988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // the modules don't match, then we have something that was in a 82088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton // .o file, but doesn't map to anything in the final executable. 82188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t i=start_idx; 82288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton while (i < sc_list.GetSize()) 82388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 82488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton SymbolContext sc; 82588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton sc_list.GetContextAtIndex(i, sc); 82688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton if (sc.function) 82788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 82888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton const Section *section = sc.function->GetAddressRange().GetBaseAddress().GetSection(); 82988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton if (section->GetModule() != module) 83088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 83188957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton sc_list.RemoveContextAtIndex(i); 83288957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton continue; 83388957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 83488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 83588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton ++i; 83688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 83788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton} 83888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 84012bec71b323dc520f0e985a86e09c4712559e115Greg ClaytonSymbolFileDWARFDebugMap::FindFunctions(const ConstString &name, uint32_t name_type_mask, bool append, SymbolContextList& sc_list) 84124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 84324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (name = %s)", 84424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.GetCString()); 84524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t initial_size = 0; 84724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (append) 84824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner initial_size = sc_list.GetSize(); 84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 85024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sc_list.Clear(); 85124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8527241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t oso_idx = 0; 8537241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton SymbolFileDWARF *oso_dwarf; 8547241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 85524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t sc_idx = sc_list.GetSize(); 85788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton if (oso_dwarf->FindFunctions(name, name_type_mask, true, sc_list)) 85888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 85988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx); 86088957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 86124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 86224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return sc_list.GetSize() - initial_size; 86424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 86524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 86724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 86824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::FindFunctions (const RegularExpression& regex, bool append, SymbolContextList& sc_list) 86924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 87024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 87124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner "SymbolFileDWARFDebugMap::FindFunctions (regex = '%s')", 87224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner regex.GetText()); 87324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8747241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t initial_size = 0; 8757241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton if (append) 8767241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton initial_size = sc_list.GetSize(); 8777241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton else 8787241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton sc_list.Clear(); 8797241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton 8807241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton uint32_t oso_idx = 0; 8817241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton SymbolFileDWARF *oso_dwarf; 8827241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 8837241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton { 88488957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton uint32_t sc_idx = sc_list.GetSize(); 88588957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton 88688957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton if (oso_dwarf->FindFunctions(regex, true, sc_list)) 88788957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton { 88888957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton RemoveFunctionsWithModuleNotEqualTo (m_obj_file->GetModule(), sc_list, sc_idx); 88988957ff55a292dd6fc050453bccd17b7c8bc3fd5Greg Clayton } 8907241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton } 8917241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton 8927241ba77d41c1a2f43552d676a0fb3d0113a9cefGreg Clayton return sc_list.GetSize() - initial_size; 89324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 89424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 89595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonTypeSP 89695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg ClaytonSymbolFileDWARFDebugMap::FindDefinitionTypeForDIE ( 89795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton DWARFCompileUnit* cu, 89895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton const DWARFDebugInfoEntry *die, 89995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton const ConstString &type_name 90095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton) 90195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton{ 90295e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton TypeSP type_sp; 90395e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton SymbolFileDWARF *oso_dwarf; 90495e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton for (uint32_t oso_idx = 0; ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx)) != NULL); ++oso_idx) 90595e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton { 90695e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton type_sp = oso_dwarf->FindDefinitionTypeForDIE (cu, die, type_name); 90795e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton if (type_sp) 90895e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton break; 90995e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton } 91095e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton return type_sp; 91195e33b7b4b832ff5a8dfd0720fe6a100be894df6Greg Clayton} 912960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 913960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Claytonuint32_t 9141924e2408687e0ee41976010c6b9410bdd01270dGreg ClaytonSymbolFileDWARFDebugMap::FindTypes 9151924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton( 9161924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton const SymbolContext& sc, 9171924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton const ConstString &name, 9181924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton bool append, 9191924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton uint32_t max_matches, 9201924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton TypeList& types 9211924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton) 922960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton{ 923960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton if (!append) 924960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton types.Clear(); 9251924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 9261924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton const uint32_t initial_types_size = types.GetSize(); 9271924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton SymbolFileDWARF *oso_dwarf; 9281924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 9291924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton if (sc.comp_unit) 9301924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton { 9311924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton oso_dwarf = GetSymbolFile (sc); 9321924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton if (oso_dwarf) 9331924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton return oso_dwarf->FindTypes (sc, name, append, max_matches, types); 9341924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton } 9351924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton else 9361924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton { 9371924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton uint32_t oso_idx = 0; 9381924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton while ((oso_dwarf = GetSymbolFileByOSOIndex (oso_idx++)) != NULL) 9391924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton oso_dwarf->FindTypes (sc, name, append, max_matches, types); 9401924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton } 9411924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton 9421924e2408687e0ee41976010c6b9410bdd01270dGreg Clayton return types.GetSize() - initial_types_size; 943960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton} 944960d6a40711f05effe6fcc5b66f0952450f79ea2Greg Clayton 94524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 94624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//uint32_t 94724943d2ee8bfaa7cf5893e4709143924157a5c1eChris 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) 94824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//{ 94924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolFileDWARF *oso_dwarf = GetSymbolFile (sc); 95024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (oso_dwarf) 95124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return oso_dwarf->FindTypes (sc, regex, append, max_matches, encoding, udt_uid, types); 95224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return 0; 95324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//} 95424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 95524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol 95724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 95824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 95924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginName() 96024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 96124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "SymbolFileDWARFDebugMap"; 96224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetShortPluginName() 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 96724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetPluginNameStatic(); 96824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 96924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 97124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginVersion() 97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::GetPluginCommandHelp (const char *command, Stream *strm) 97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerError 98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::ExecutePluginCommand (Args &command, Stream *strm) 98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Error error; 98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error.SetErrorString("No plug-in command are currently supported."); 98624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return error; 98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerLog * 99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolFileDWARFDebugMap::EnablePluginLogging (Stream *strm, Args &command) 99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 996ad60bf486dee699dd524225b63271ddc5b6329b9Greg Claytonvoid 997ad60bf486dee699dd524225b63271ddc5b6329b9Greg ClaytonSymbolFileDWARFDebugMap::SetCompileUnit (SymbolFileDWARF *oso_dwarf, const CompUnitSP &cu_sp) 998ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton{ 999ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton const uint32_t cu_count = GetNumCompileUnits(); 1000ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton for (uint32_t i=0; i<cu_count; ++i) 1001ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1002ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton if (m_compile_unit_infos[i].oso_symbol_vendor && 1003ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_compile_unit_infos[i].oso_symbol_vendor->GetSymbolFile() == oso_dwarf) 1004ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1005ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton if (m_compile_unit_infos[i].oso_compile_unit_sp) 1006ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1007ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton assert (m_compile_unit_infos[i].oso_compile_unit_sp.get() == cu_sp.get()); 1008ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1009ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton else 1010ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton { 1011ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton m_compile_unit_infos[i].oso_compile_unit_sp = cu_sp; 1012ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1013ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1014ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton } 1015ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton} 1016ad60bf486dee699dd524225b63271ddc5b6329b9Greg Clayton 1017