ProcessMachCore.cpp revision 94a5d0de4433dce556db59758f3d6124eb0e1a2a
146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//===-- ProcessMachCore.cpp ------------------------------------------*- C++ -*-===//
246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//
346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//                     The LLVM Compiler Infrastructure
446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//
546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// This file is distributed under the University of Illinois Open Source
646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// License. See LICENSE.TXT for details.
746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//
846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//===----------------------------------------------------------------------===//
946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// C Includes
1146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include <errno.h>
1246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include <stdlib.h>
1346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// C++ Includes
1546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "llvm/Support/MachO.h"
169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "llvm/Support/MathExtras.h"
1746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Other libraries and framework includes
1946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/Debugger.h"
2046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/PluginManager.h"
2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h"
2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h"
2446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/State.h"
2546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Host/Host.h"
2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ObjectFile.h"
2746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Target.h"
2846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Thread.h"
2946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
3046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Project includes
3146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ProcessMachCore.h"
3246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ThreadMachCore.h"
3346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "StopInfoMachException.h"
3446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb;
3946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb_private;
4046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
4146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
4246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginNameStatic()
4346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
4446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return "mach-o-core";
4546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
4646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
4746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
4846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginDescriptionStatic()
4946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
5046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return "Mach-O core file debugging plug-in.";
5146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
5246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
5346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
5446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Terminate()
5546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
5646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    PluginManager::UnregisterPlugin (ProcessMachCore::CreateInstance);
5746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
5846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
5946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
6046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::ProcessSP
6146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file)
6246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
6346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    lldb::ProcessSP process_sp;
6446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (crash_file)
6546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        process_sp.reset(new ProcessMachCore (target, listener, *crash_file));
6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return process_sp;
6746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
6846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
6946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool
7046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CanDebug(Target &target, bool plugin_specified_by_name)
7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
7246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (plugin_specified_by_name)
7346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return true;
7446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
7546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // For now we are just making sure the file exists for a given module
7646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (!m_core_module_sp && m_core_file.Exists())
7746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
78444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        ModuleSpec core_module_spec(m_core_file, target.GetArchitecture());
79444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        Error error (ModuleList::GetSharedModule (core_module_spec,
809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  m_core_module_sp,
819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL,
829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL,
839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL));
8446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
8546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (m_core_module_sp)
8646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
8746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const llvm::Triple &triple_ref = m_core_module_sp->GetArchitecture().GetTriple();
88b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            if (triple_ref.getVendor() == llvm::Triple::Apple)
8946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
9046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
9146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                if (core_objfile && core_objfile->GetType() == ObjectFile::eTypeCoreFile)
9246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    return true;
9346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
9446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
9546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
9646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return false;
9746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
9846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
9946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
10046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// ProcessMachCore constructor
10146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
10246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::ProcessMachCore(Target& target, Listener &listener, const FileSpec &core_file) :
10346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Process (target, listener),
10446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_aranges (),
10546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_module_sp (),
10646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_file (core_file),
1079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    m_dyld_addr (LLDB_INVALID_ADDRESS),
1089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    m_dyld_plugin_name ()
10946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
11046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
11146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
11246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
11346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Destructor
11446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
11546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::~ProcessMachCore()
11646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
11746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Clear();
11846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // We need to call finalize on the process before destroying ourselves
11946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // to make sure all of the broadcaster cleanup goes as planned. If we
12046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // destruct this class, then Process::~Process() might have problems
12146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // trying to fully destroy the broadcaster.
12246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Finalize();
12346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
12446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
12546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
12646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// PluginInterface
12746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
12846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
12946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginName()
13046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
13146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return "Process debugging plug-in that loads mach-o core files.";
13246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
13346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
13446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
13546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetShortPluginName()
13646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
13746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return GetPluginNameStatic();
13846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
13946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
14046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonuint32_t
14146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginVersion()
14246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
14346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return 1;
14446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
14546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonbool
1479ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoaderAddress (lldb::addr_t addr)
1489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
1499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    llvm::MachO::mach_header header;
1509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    Error error;
1519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (DoReadMemory (addr, &header, sizeof(header), error) != sizeof(header))
1529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return false;
1539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (header.magic == llvm::MachO::HeaderMagic32Swapped ||
1549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.magic == llvm::MachO::HeaderMagic64Swapped)
1559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.magic        = llvm::ByteSwap_32(header.magic);
1579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.cputype      = llvm::ByteSwap_32(header.cputype);
1589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.cpusubtype   = llvm::ByteSwap_32(header.cpusubtype);
1599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.filetype     = llvm::ByteSwap_32(header.filetype);
1609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.ncmds        = llvm::ByteSwap_32(header.ncmds);
1619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.sizeofcmds   = llvm::ByteSwap_32(header.sizeofcmds);
1629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.flags        = llvm::ByteSwap_32(header.flags);
1639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // TODO: swap header if needed...
1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    //printf("0x%16.16llx: magic = 0x%8.8x, file_type= %u\n", vaddr, header.magic, header.filetype);
1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (header.magic == llvm::MachO::HeaderMagic32 ||
1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.magic == llvm::MachO::HeaderMagic64)
1699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Check MH_EXECUTABLE to see if we can find the mach image
1719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // that contains the shared library list. The dynamic loader
1729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // (dyld) is what contains the list for user applications,
1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // and the mach kernel contains a global that has the list
1749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // of kexts to load
1759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        switch (header.filetype)
1769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
1779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        case llvm::MachO::HeaderFileTypeDynamicLinkEditor:
1789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            //printf("0x%16.16llx: file_type = MH_DYLINKER\n", vaddr);
1799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // Address of dyld "struct mach_header" in the core file
1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            m_dyld_plugin_name = DynamicLoaderMacOSXDYLD::GetPluginNameStatic();
1819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            m_dyld_addr = addr;
1829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            return true;
1839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        case llvm::MachO::HeaderFileTypeExecutable:
1859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            //printf("0x%16.16llx: file_type = MH_EXECUTE\n", vaddr);
1869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // Check MH_EXECUTABLE file types to see if the dynamic link object flag
1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // is NOT set. If it isn't, then we have a mach_kernel.
1889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if ((header.flags & llvm::MachO::HeaderFlagBitIsDynamicLinkObject) == 0)
1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            {
1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic();
1919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // Address of the mach kernel "struct mach_header" in the core file.
1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                m_dyld_addr = addr;
1939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                return true;
1949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            }
1959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            break;
1969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
1979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return false;
1999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
2009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
20146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
20246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Control
20346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
20446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError
20546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoLoadCore ()
20646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
20746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Error error;
2089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (!m_core_module_sp)
2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        error.SetErrorString ("invalid core module");
2119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return error;
2129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
21446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
21546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (core_objfile == NULL)
21646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
21746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("invalid core object file");
21846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
21946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
22046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    SectionList *section_list = core_objfile->GetSectionList();
22146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (section_list == NULL)
22246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
22346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("core file has no sections");
22446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
22546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
22646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
22746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    const uint32_t num_sections = section_list->GetNumSections(0);
22846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (num_sections == 0)
22946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
23046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("core file has no sections");
23146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
23246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
234d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda    SetCanJIT(false);
235d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
2369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    llvm::MachO::mach_header header;
2379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DataExtractor data (&header,
2389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        sizeof(header),
2399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        m_core_module_sp->GetArchitecture().GetByteOrder(),
2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        m_core_module_sp->GetArchitecture().GetAddressByteSize());
2419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
24246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    bool ranges_are_sorted = true;
24346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    addr_t vm_addr = 0;
24446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    for (uint32_t i=0; i<num_sections; ++i)
24546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
24646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        Section *section = section_list->GetSectionAtIndex (i).get();
24746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (section)
24846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
24946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            lldb::addr_t section_vm_addr = section->GetFileAddress();
25046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            FileRange file_range (section->GetFileOffset(), section->GetFileSize());
25146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            VMRangeToFileOffset::Entry range_entry (section_vm_addr,
25246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                                    section->GetByteSize(),
25346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                                    file_range);
25446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
25546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (vm_addr > section_vm_addr)
25646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                ranges_are_sorted = false;
25746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            vm_addr = section->GetFileAddress();
25846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            VMRangeToFileOffset::Entry *last_entry = m_core_aranges.Back();
2599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            printf ("LC_SEGMENT[%u] arange=[0x%16.16llx - 0x%16.16llx), frange=[0x%8.8x - 0x%8.8x)\n",
2609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    i,
2619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.GetRangeBase(),
2629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.GetRangeEnd(),
2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.data.GetRangeBase(),
2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.data.GetRangeEnd());
2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
26646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (last_entry &&
26746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->GetRangeEnd() == range_entry.GetRangeBase() &&
26846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->data.GetRangeEnd() == range_entry.data.GetRangeBase())
26946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
27046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->SetRangeEnd (range_entry.GetRangeEnd());
27146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->data.SetRangeEnd (range_entry.data.GetRangeEnd());
2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                //puts("combine");
27346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
27446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            else
27546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
27646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                m_core_aranges.Append(range_entry);
27746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
2789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // After we have added this section to our m_core_aranges map,
2809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // we can check the start of the section to see if it might
2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // contain dyld for user space apps, or the mach kernel file
2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // for kernel cores.
2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (m_dyld_addr == LLDB_INVALID_ADDRESS)
2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                GetDynamicLoaderAddress (section_vm_addr);
28546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
28646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
28746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (!ranges_are_sorted)
28846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
28946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        m_core_aranges.Sort();
29046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // Even if the architecture is set in the target, we need to override
2939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // it to match the core file which is always single arch.
2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    ArchSpec arch (m_core_module_sp->GetArchitecture());
2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (arch.GetCore() == ArchSpec::eCore_x86_32_i486)
2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        arch.SetTriple ("i386", m_target.GetPlatform().get());
2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (arch.IsValid())
3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_target.SetArchitecture(arch);
3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (m_dyld_addr == LLDB_INVALID_ADDRESS)
3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Check the magic kernel address for the mach image header address in case
3059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // it is there.
3069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (arch.GetAddressByteSize() == 8)
3079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
3089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            Error header_addr_error;
3099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            addr_t header_addr = ReadPointerFromMemory (0xffffff8000002010ull, header_addr_error);
3109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (header_addr != LLDB_INVALID_ADDRESS)
3119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                GetDynamicLoaderAddress (header_addr);
3129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
3134952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        else
3144952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        {
3154952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            Error header_addr_error;
3164952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            addr_t header_addr = ReadPointerFromMemory (0xffff0110, header_addr_error);
3174952db8c76f619e3d8a0cf13456097128009d67bJason Molenda            if (header_addr != LLDB_INVALID_ADDRESS)
3184952db8c76f619e3d8a0cf13456097128009d67bJason Molenda                GetDynamicLoaderAddress (header_addr);
3194952db8c76f619e3d8a0cf13456097128009d67bJason Molenda        }
3209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
32146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
32246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return error;
32346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
32446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
3259ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonlldb_private::DynamicLoader *
3269ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoader ()
3279ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
3289ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (m_dyld_ap.get() == NULL)
3299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.empty() ? NULL : m_dyld_plugin_name.c_str()));
3309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return m_dyld_ap.get();
3319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
33246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
333ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonbool
33446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
33546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
33646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (old_thread_list.GetSize(false) == 0)
33746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
33846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // Make up the thread the first time this is called so we can setup our one and only
33946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // core thread state.
34046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
34146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
34246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (core_objfile)
34346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
34446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const uint32_t num_threads = core_objfile->GetNumThreadContexts ();
34546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            for (lldb::tid_t tid = 0; tid < num_threads; ++tid)
34646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
34794a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham                ThreadSP thread_sp(new ThreadMachCore (*this, tid));
34846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                new_thread_list.AddThread (thread_sp);
34946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
35046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
35146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
35246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    else
35346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
35446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        const uint32_t num_threads = old_thread_list.GetSize(false);
35546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        for (uint32_t i=0; i<num_threads; ++i)
35646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            new_thread_list.AddThread (old_thread_list.GetThreadAtIndex (i));
35746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
358ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    return new_thread_list.GetSize(false) > 0;
35946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
36046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
36146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
36246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::RefreshStateAfterStop ()
36346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
36446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // Let all threads recover from stopping and do any clean up based
36546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // on the previous thread state (if any).
36646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_list.RefreshStateAfterStop();
36746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    //SetThreadStopInfo (m_last_stop_packet);
36846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
36946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
37046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError
37146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoDestroy ()
37246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
37346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return Error();
37446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
37546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
37646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
37746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Queries
37846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
37946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
38046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool
38146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::IsAlive ()
38246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
38346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return true;
38446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
38546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
38646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
38746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Memory
38846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
38946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonsize_t
3909ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
3919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
3929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // Don't allow the caching that lldb_private::Process::ReadMemory does
3939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // since in core files we have it all cached our our core file anyway.
3949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return DoReadMemory (addr, buf, size, error);
3959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
3969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3979ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonsize_t
39846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error)
39946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
40046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
40146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
40246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (core_objfile)
40346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
40446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        const VMRangeToFileOffset::Entry *core_memory_entry = m_core_aranges.FindEntryThatContains (addr);
40546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (core_memory_entry)
40646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
40746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const addr_t offset = addr - core_memory_entry->GetRangeBase();
40846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const addr_t bytes_left = core_memory_entry->GetRangeEnd() - addr;
40946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            size_t bytes_to_read = size;
41046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (bytes_to_read > bytes_left)
41146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                bytes_to_read = bytes_left;
41246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            return core_objfile->CopyData (core_memory_entry->data.GetRangeBase() + offset, bytes_to_read, buf);
41346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
41446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        else
41546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
41646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            error.SetErrorStringWithFormat ("core file does not contain 0x%llx", addr);
41746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
41846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
41946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return 0;
42046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
42146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
42246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
42346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Clear()
42446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
42546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_list.Clear();
42646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
42746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
42846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
42946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Initialize()
43046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
43146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    static bool g_initialized = false;
43246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
43346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (g_initialized == false)
43446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
43546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        g_initialized = true;
43646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        PluginManager::RegisterPlugin (GetPluginNameStatic(),
43746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                       GetPluginDescriptionStatic(),
43846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                       CreateInstance);
43946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
44046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
44146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
44246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonaddr_t
44346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetImageInfoAddress()
44446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
4459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return m_dyld_addr;
44646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
44746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
44846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
44949ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ObjectFile *
45049ce8969d3154e1560106cfe530444c09410f217Greg ClaytonProcessMachCore::GetCoreObjectFile ()
45149ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
45249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return m_core_module_sp->GetObjectFile();
45349ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
454