124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- SymbolVendorMacOSX.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 "SymbolVendorMacOSX.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 125c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton#include <libxml/parser.h> 135c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton#include <libxml/tree.h> 145c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton#include <string.h> 155c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <AvailabilityMacros.h> 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h" 1949ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Section.h" 229262cd52e254fb261334254a80a1b316d59b555cJohnny Chen#include "lldb/Core/StreamString.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h" 249262cd52e254fb261334254a80a1b316d59b555cJohnny Chen#include "lldb/Host/Host.h" 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Symbols.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// SymbolVendorMacOSX constructor 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonSymbolVendorMacOSX::SymbolVendorMacOSX(const lldb::ModuleSP &module_sp) : 353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SymbolVendor (module_sp) 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendorMacOSX::~SymbolVendorMacOSX() 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic bool 48188091899842b140313b54e097f16efbe165c998Greg ClaytonUUIDsMatch(Module *module, ObjectFile *ofile, lldb_private::Stream *feedback_strm) 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (module && ofile) 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make sure the UUIDs match 530467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg Clayton lldb_private::UUID dsym_uuid; 5467dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen 5567dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen if (!ofile->GetUUID(&dsym_uuid)) 5667dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen { 57188091899842b140313b54e097f16efbe165c998Greg Clayton if (feedback_strm) 58188091899842b140313b54e097f16efbe165c998Greg Clayton { 59188091899842b140313b54e097f16efbe165c998Greg Clayton feedback_strm->PutCString("warning: failed to get the uuid for object file: '"); 60188091899842b140313b54e097f16efbe165c998Greg Clayton ofile->GetFileSpec().Dump(feedback_strm); 61188091899842b140313b54e097f16efbe165c998Greg Clayton feedback_strm->PutCString("\n"); 62188091899842b140313b54e097f16efbe165c998Greg Clayton } 6367dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen return false; 6467dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen } 6567dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen 6667dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen if (dsym_uuid == module->GetUUID()) 6767dec777707e79761c98b1b2553b0d3a78756f80Johnny Chen return true; 689262cd52e254fb261334254a80a1b316d59b555cJohnny Chen 699262cd52e254fb261334254a80a1b316d59b555cJohnny Chen // Emit some warning messages since the UUIDs do not match! 70188091899842b140313b54e097f16efbe165c998Greg Clayton if (feedback_strm) 71188091899842b140313b54e097f16efbe165c998Greg Clayton { 72188091899842b140313b54e097f16efbe165c998Greg Clayton feedback_strm->PutCString("warning: UUID mismatch detected between modules:\n "); 73188091899842b140313b54e097f16efbe165c998Greg Clayton module->GetUUID().Dump(feedback_strm); 74188091899842b140313b54e097f16efbe165c998Greg Clayton feedback_strm->PutChar(' '); 75188091899842b140313b54e097f16efbe165c998Greg Clayton module->GetFileSpec().Dump(feedback_strm); 76188091899842b140313b54e097f16efbe165c998Greg Clayton feedback_strm->PutCString("\n "); 77188091899842b140313b54e097f16efbe165c998Greg Clayton dsym_uuid.Dump(feedback_strm); 78188091899842b140313b54e097f16efbe165c998Greg Clayton feedback_strm->PutChar(' '); 79188091899842b140313b54e097f16efbe165c998Greg Clayton ofile->GetFileSpec().Dump(feedback_strm); 80188091899842b140313b54e097f16efbe165c998Greg Clayton feedback_strm->EOL(); 81188091899842b140313b54e097f16efbe165c998Greg Clayton } 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendorMacOSX::Initialize() 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::RegisterPlugin (GetPluginNameStatic(), 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GetPluginDescriptionStatic(), 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CreateInstance); 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendorMacOSX::Terminate() 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PluginManager::UnregisterPlugin (CreateInstance); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1010e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendorMacOSX::GetPluginNameStatic() 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1040e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("macosx"); 1050e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendorMacOSX::GetPluginDescriptionStatic() 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return "Symbol vendor for MacOSX that looks for dSYM files that match executables."; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CreateInstance 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Platforms can register a callback to use when creating symbol 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// vendors to allow for complex debug information file setups, and to 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// also allow for finding separate debug information files. 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendor* 124188091899842b140313b54e097f16efbe165c998Greg ClaytonSymbolVendorMacOSX::CreateInstance (const lldb::ModuleSP &module_sp, lldb_private::Stream *feedback_strm) 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 126964deba8853eb794e59263322b59b09b43669618Greg Clayton if (!module_sp) 127964deba8853eb794e59263322b59b09b43669618Greg Clayton return NULL; 128964deba8853eb794e59263322b59b09b43669618Greg Clayton 129a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ObjectFile * obj_file = module_sp->GetObjectFile(); 130a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!obj_file) 131a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return NULL; 132a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 133a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain static ConstString obj_file_macho("mach-o"); 134a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ConstString obj_name = obj_file->GetPluginName(); 135a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (obj_name != obj_file_macho) 136a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return NULL; 137a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Timer scoped_timer (__PRETTY_FUNCTION__, 13997a19b21dacd9063bb5475812df7781777262198Greg Clayton "SymbolVendorMacOSX::CreateInstance (module = %s)", 14097a19b21dacd9063bb5475812df7781777262198Greg Clayton module_sp->GetFileSpec().GetPath().c_str()); 1413508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SymbolVendorMacOSX* symbol_vendor = new SymbolVendorMacOSX(module_sp); 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbol_vendor) 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char path[PATH_MAX]; 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner path[0] = '\0'; 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and locate the dSYM file on Mac OS X 148a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain Timer scoped_timer2 ("SymbolVendorMacOSX::CreateInstance () locate dSYM", 149a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain "SymbolVendorMacOSX::CreateInstance (module = %s) locate dSYM", 150a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain module_sp->GetFileSpec().GetPath().c_str()); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 152a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // First check to see if the module has a symbol file in mind already. 153a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // If it does, then we MUST use that. 154a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain FileSpec dsym_fspec (module_sp->GetSymbolFileFileSpec()); 1553508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 156a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ObjectFileSP dsym_objfile_sp; 157a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!dsym_fspec) 158a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 159a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // No symbol file was specified in the module, lets try and find 160a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // one ourselves. 161a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain FileSpec file_spec = obj_file->GetFileSpec(); 162a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!file_spec) 163a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain file_spec = module_sp->GetFileSpec(); 164f7a24e5ca4e48a12f600629d4df9849e68913724Greg Clayton 165a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ModuleSpec module_spec(file_spec, module_sp->GetArchitecture()); 166a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain module_spec.GetUUID() = module_sp->GetUUID(); 167a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain dsym_fspec = Symbols::LocateExecutableSymbolFile (module_spec); 168a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (module_spec.GetSourceMappingList().GetSize()) 169a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain module_sp->GetSourceMappingList().Append (module_spec.GetSourceMappingList (), true); 170a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1713508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 172a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (dsym_fspec) 173a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 174a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain DataBufferSP dsym_file_data_sp; 175a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb::offset_t dsym_file_data_offset = 0; 176a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain dsym_objfile_sp = ObjectFile::FindPlugin(module_sp, &dsym_fspec, 0, dsym_fspec.GetByteSize(), dsym_file_data_sp, dsym_file_data_offset); 177a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (UUIDsMatch(module_sp.get(), dsym_objfile_sp.get(), feedback_strm)) 1783508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton { 179a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain char dsym_path[PATH_MAX]; 180a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (module_sp->GetSourceMappingList().IsEmpty() && dsym_fspec.GetPath(dsym_path, sizeof(dsym_path))) 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 182a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb_private::UUID dsym_uuid; 183a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (dsym_objfile_sp->GetUUID(&dsym_uuid)) 1845c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 185a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain std::string uuid_str = dsym_uuid.GetAsString (); 186a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!uuid_str.empty()) 1875c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 188a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain char *resources = strstr (dsym_path, "/Contents/Resources/"); 189a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (resources) 1905c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 191a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain char dsym_uuid_plist_path[PATH_MAX]; 192a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain resources[strlen("/Contents/Resources/")] = '\0'; 193a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain snprintf(dsym_uuid_plist_path, sizeof(dsym_uuid_plist_path), "%s%s.plist", dsym_path, uuid_str.c_str()); 194a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain FileSpec dsym_uuid_plist_spec(dsym_uuid_plist_path, false); 195a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (dsym_uuid_plist_spec.Exists()) 1965c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 197a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain xmlDoc *doc = ::xmlReadFile (dsym_uuid_plist_path, NULL, 0); 198a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (doc) 1995c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 200a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain char DBGBuildSourcePath[PATH_MAX]; 201a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain char DBGSourcePath[PATH_MAX]; 202a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain DBGBuildSourcePath[0] = '\0'; 203a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain DBGSourcePath[0] = '\0'; 204a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain for (xmlNode *node = doc->children; node; node = node ? node->next : NULL) 2055c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 206a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (node->type == XML_ELEMENT_NODE) 2075c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 208a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (node->name && strcmp((const char*)node->name, "plist") == 0) 2095c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 210a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain xmlNode *dict_node = node->children; 211a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain while (dict_node && dict_node->type != XML_ELEMENT_NODE) 212a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain dict_node = dict_node->next; 213a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (dict_node && dict_node->name && strcmp((const char *)dict_node->name, "dict") == 0) 2145c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 215a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain for (xmlNode *key_node = dict_node->children; key_node; key_node = key_node->next) 2165c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 217a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (key_node && key_node->type == XML_ELEMENT_NODE && key_node->name) 2185c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 219a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (strcmp((const char *)key_node->name, "key") == 0) 2205c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 221a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const char *key_name = (const char *)::xmlNodeGetContent(key_node); 222a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (strcmp(key_name, "DBGBuildSourcePath") == 0) 2235c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 224a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain xmlNode *value_node = key_node->next; 225a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain while (value_node && value_node->type != XML_ELEMENT_NODE) 226a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain value_node = value_node->next; 227a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (value_node && value_node->name) 2285c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 229a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (strcmp((const char *)value_node->name, "string") == 0) 2305c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 231a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const char *node_content = (const char *)::xmlNodeGetContent(value_node); 232a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (node_content) 2335c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 234a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain strncpy(DBGBuildSourcePath, node_content, sizeof(DBGBuildSourcePath)); 235b090a397f40a5acb6d1bc014a21f82cfbccc55fcJim Ingham xmlFree((void *) node_content); 2365c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2375c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 238a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain key_node = value_node; 2395c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 240a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 241a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain else if (strcmp(key_name, "DBGSourcePath") == 0) 242a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 243a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain xmlNode *value_node = key_node->next; 244a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain while (value_node && value_node->type != XML_ELEMENT_NODE) 245a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain value_node = value_node->next; 246a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (value_node && value_node->name) 2475c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 248a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (strcmp((const char *)value_node->name, "string") == 0) 2495c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 250a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const char *node_content = (const char *)::xmlNodeGetContent(value_node); 251a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (node_content) 2525c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton { 253a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain FileSpec resolved_source_path(node_content, true); 254a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain resolved_source_path.GetPath(DBGSourcePath, sizeof(DBGSourcePath)); 255b090a397f40a5acb6d1bc014a21f82cfbccc55fcJim Ingham xmlFree ((void *) node_content); 2565c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2575c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 258a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain key_node = value_node; 2595c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2605c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 261b090a397f40a5acb6d1bc014a21f82cfbccc55fcJim Ingham if (key_name != NULL) 262b090a397f40a5acb6d1bc014a21f82cfbccc55fcJim Ingham xmlFree((void *) key_name); 2635c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2645c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2655c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2665c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2675c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2685c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 269a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 270a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ::xmlFreeDoc (doc); 2715c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton 272a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (DBGBuildSourcePath[0] && DBGSourcePath[0]) 273a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 274a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain module_sp->GetSourceMappingList().Append (ConstString(DBGBuildSourcePath), ConstString(DBGSourcePath), true); 2755c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2765c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2775c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2785c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2795c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 2805c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton } 281a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 2825c5a38e7c640e9448241ec2aca0c60047ec3273cGreg Clayton 283a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain symbol_vendor->AddSymbolFileRepresentation(dsym_objfile_sp); 284a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return symbol_vendor; 285a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 287a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 288a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Just create our symbol vendor using the current objfile as this is either 289a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // an executable with no dSYM (that we could locate), an executable with 290a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // a dSYM that has a UUID that doesn't match. 291a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain symbol_vendor->AddSymbolFileRepresentation(obj_file->shared_from_this()); 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return symbol_vendor; 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 3010e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendorMacOSX::GetPluginName() 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetPluginNameStatic(); 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymbolVendorMacOSX::GetPluginVersion() 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 1; 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 313