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