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
354d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton// Needed for the plug-in names for the dynamic loaders.
369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb;
4046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb_private;
4146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
420e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString
4346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginNameStatic()
4446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
450e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static ConstString g_name("mach-o-core");
460e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return g_name;
4746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
4846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
4946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
5046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginDescriptionStatic()
5146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
5246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return "Mach-O core file debugging plug-in.";
5346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
5446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
5546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
5646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Terminate()
5746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
5846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    PluginManager::UnregisterPlugin (ProcessMachCore::CreateInstance);
5946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
6046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
6146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
6246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::ProcessSP
6346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file)
6446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
6546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    lldb::ProcessSP process_sp;
6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (crash_file)
6746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        process_sp.reset(new ProcessMachCore (target, listener, *crash_file));
6846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return process_sp;
6946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
7046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool
7246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CanDebug(Target &target, bool plugin_specified_by_name)
7346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
7446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (plugin_specified_by_name)
7546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return true;
7646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
7746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // For now we are just making sure the file exists for a given module
7846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (!m_core_module_sp && m_core_file.Exists())
7946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
80444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        ModuleSpec core_module_spec(m_core_file, target.GetArchitecture());
81444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        Error error (ModuleList::GetSharedModule (core_module_spec,
829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  m_core_module_sp,
839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL,
849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL,
859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL));
8646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
8746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (m_core_module_sp)
8846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
8946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const llvm::Triple &triple_ref = m_core_module_sp->GetArchitecture().GetTriple();
90b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            if (triple_ref.getVendor() == llvm::Triple::Apple)
9146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
9246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
9346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                if (core_objfile && core_objfile->GetType() == ObjectFile::eTypeCoreFile)
9446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    return true;
9546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
9646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
9746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
9846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return false;
9946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
10046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
10146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
10246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// ProcessMachCore constructor
10346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
10446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::ProcessMachCore(Target& target, Listener &listener, const FileSpec &core_file) :
10546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Process (target, listener),
10646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_aranges (),
10746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_module_sp (),
10846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_file (core_file),
1099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    m_dyld_addr (LLDB_INVALID_ADDRESS),
1109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    m_dyld_plugin_name ()
11146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
11246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
11346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
11446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
11546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Destructor
11646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
11746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::~ProcessMachCore()
11846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
11946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Clear();
12046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // We need to call finalize on the process before destroying ourselves
12146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // to make sure all of the broadcaster cleanup goes as planned. If we
12246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // destruct this class, then Process::~Process() might have problems
12346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // trying to fully destroy the broadcaster.
12446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Finalize();
12546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
12646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
12746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
12846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// PluginInterface
12946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
1300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString
13146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginName()
13246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
13346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return GetPluginNameStatic();
13446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
13546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
13646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonuint32_t
13746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginVersion()
13846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
13946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return 1;
14046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
14146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1429ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonbool
1439ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoaderAddress (lldb::addr_t addr)
1449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
1459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    llvm::MachO::mach_header header;
1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    Error error;
1479ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (DoReadMemory (addr, &header, sizeof(header), error) != sizeof(header))
1489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return false;
1499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (header.magic == llvm::MachO::HeaderMagic32Swapped ||
1509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.magic == llvm::MachO::HeaderMagic64Swapped)
1519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.magic        = llvm::ByteSwap_32(header.magic);
1539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.cputype      = llvm::ByteSwap_32(header.cputype);
1549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.cpusubtype   = llvm::ByteSwap_32(header.cpusubtype);
1559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.filetype     = llvm::ByteSwap_32(header.filetype);
1569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.ncmds        = llvm::ByteSwap_32(header.ncmds);
1579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.sizeofcmds   = llvm::ByteSwap_32(header.sizeofcmds);
1589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.flags        = llvm::ByteSwap_32(header.flags);
1599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // TODO: swap header if needed...
1625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    //printf("0x%16.16" PRIx64 ": magic = 0x%8.8x, file_type= %u\n", vaddr, header.magic, header.filetype);
1639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (header.magic == llvm::MachO::HeaderMagic32 ||
1649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        header.magic == llvm::MachO::HeaderMagic64)
1659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Check MH_EXECUTABLE to see if we can find the mach image
1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // that contains the shared library list. The dynamic loader
1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // (dyld) is what contains the list for user applications,
1699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // and the mach kernel contains a global that has the list
1709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // of kexts to load
1719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        switch (header.filetype)
1729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        case llvm::MachO::HeaderFileTypeDynamicLinkEditor:
1745f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            //printf("0x%16.16" PRIx64 ": file_type = MH_DYLINKER\n", vaddr);
1759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // Address of dyld "struct mach_header" in the core file
1769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            m_dyld_plugin_name = DynamicLoaderMacOSXDYLD::GetPluginNameStatic();
1779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            m_dyld_addr = addr;
1789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            return true;
1799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        case llvm::MachO::HeaderFileTypeExecutable:
1815f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            //printf("0x%16.16" PRIx64 ": file_type = MH_EXECUTE\n", vaddr);
1829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // Check MH_EXECUTABLE file types to see if the dynamic link object flag
1839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // is NOT set. If it isn't, then we have a mach_kernel.
1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if ((header.flags & llvm::MachO::HeaderFlagBitIsDynamicLinkObject) == 0)
1859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            {
1869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic();
1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                // Address of the mach kernel "struct mach_header" in the core file.
1889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                m_dyld_addr = addr;
1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                return true;
1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            }
1919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            break;
1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
1939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
1949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return false;
1959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
1969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
19746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
19846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Control
19946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
20046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError
20146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoLoadCore ()
20246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
20346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Error error;
2049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (!m_core_module_sp)
2059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        error.SetErrorString ("invalid core module");
2079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        return error;
2089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
21046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
21146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (core_objfile == NULL)
21246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
21346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("invalid core object file");
21446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
21546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2168775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton
2178775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton    if (core_objfile->GetNumThreadContexts() == 0)
2188775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton    {
2197cba7deac40f09618f8acf8aee08fe80bbb306bfGreg Clayton        error.SetErrorString ("core file doesn't contain any LC_THREAD load commands, or the LC_THREAD architecture is not supported in this lldb");
2208775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton        return error;
2218775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton    }
2228775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton
22346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    SectionList *section_list = core_objfile->GetSectionList();
22446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (section_list == NULL)
22546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
22646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("core file has no sections");
22746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
22846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
22946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
23046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    const uint32_t num_sections = section_list->GetNumSections(0);
23146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (num_sections == 0)
23246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
23346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("core file has no sections");
23446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
23546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
237d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda    SetCanJIT(false);
238d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda
2399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    llvm::MachO::mach_header header;
2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DataExtractor data (&header,
2419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        sizeof(header),
2429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        m_core_module_sp->GetArchitecture().GetByteOrder(),
2439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        m_core_module_sp->GetArchitecture().GetAddressByteSize());
2449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
24546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    bool ranges_are_sorted = true;
24646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    addr_t vm_addr = 0;
24746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    for (uint32_t i=0; i<num_sections; ++i)
24846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
24946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        Section *section = section_list->GetSectionAtIndex (i).get();
25046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (section)
25146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
25246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            lldb::addr_t section_vm_addr = section->GetFileAddress();
25346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            FileRange file_range (section->GetFileOffset(), section->GetFileSize());
25446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            VMRangeToFileOffset::Entry range_entry (section_vm_addr,
25546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                                    section->GetByteSize(),
25646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                                    file_range);
25746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
25846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (vm_addr > section_vm_addr)
25946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                ranges_are_sorted = false;
26046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            vm_addr = section->GetFileAddress();
26146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            VMRangeToFileOffset::Entry *last_entry = m_core_aranges.Back();
2625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea//            printf ("LC_SEGMENT[%u] arange=[0x%16.16" PRIx64 " - 0x%16.16" PRIx64 "), frange=[0x%8.8x - 0x%8.8x)\n",
2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    i,
2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.GetRangeBase(),
2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.GetRangeEnd(),
2669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.data.GetRangeBase(),
2679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.data.GetRangeEnd());
2689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
26946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (last_entry &&
27046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->GetRangeEnd() == range_entry.GetRangeBase() &&
27146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->data.GetRangeEnd() == range_entry.data.GetRangeBase())
27246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
27346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->SetRangeEnd (range_entry.GetRangeEnd());
27446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->data.SetRangeEnd (range_entry.data.GetRangeEnd());
2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                //puts("combine");
27646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
27746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            else
27846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
27946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                m_core_aranges.Append(range_entry);
28046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // After we have added this section to our m_core_aranges map,
2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // we can check the start of the section to see if it might
2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // contain dyld for user space apps, or the mach kernel file
2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // for kernel cores.
2869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (m_dyld_addr == LLDB_INVALID_ADDRESS)
2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                GetDynamicLoaderAddress (section_vm_addr);
28846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
28946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
29046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (!ranges_are_sorted)
29146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
29246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        m_core_aranges.Sort();
29346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // Even if the architecture is set in the target, we need to override
2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // it to match the core file which is always single arch.
2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    ArchSpec arch (m_core_module_sp->GetArchitecture());
2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (arch.GetCore() == ArchSpec::eCore_x86_32_i486)
2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        arch.SetTriple ("i386", m_target.GetPlatform().get());
3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (arch.IsValid())
3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_target.SetArchitecture(arch);
3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
305cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    if (m_dyld_addr == LLDB_INVALID_ADDRESS)
306cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    {
3074d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton        // We need to locate the main executable in the memory ranges
3084d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton        // we have in the core file. We already checked the first address
3094d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton        // in each memory zone above, so we just need to check each page
3104d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton        // except the first page in each range and stop once we have found
3114d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton        // our main executable
3124d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton        const size_t num_core_aranges = m_core_aranges.GetSize();
3134d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton        for (size_t i=0; i<num_core_aranges && m_dyld_addr == LLDB_INVALID_ADDRESS; ++i)
314cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda        {
3154d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton            const VMRangeToFileOffset::Entry *entry = m_core_aranges.GetEntryAtIndex(i);
3164d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton            lldb::addr_t section_vm_addr_start = entry->GetRangeBase();
3174d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton            lldb::addr_t section_vm_addr_end = entry->GetRangeEnd();
3184d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton            for (lldb::addr_t section_vm_addr = section_vm_addr_start + 0x1000;
3194d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton                 section_vm_addr < section_vm_addr_end;
3204d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton                 section_vm_addr += 0x1000)
3214d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton            {
3224d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton                if (GetDynamicLoaderAddress (section_vm_addr))
3234d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton                {
3244d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton                    break;
3254d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton                }
3264d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton            }
327cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda        }
328cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda    }
32946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return error;
33046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
33146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
3329ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonlldb_private::DynamicLoader *
3339ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoader ()
3349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
3359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (m_dyld_ap.get() == NULL)
336f0c0882ff3fd98456c1814b495888092da2f13f6Jason Molenda        m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.IsEmpty() ? NULL : m_dyld_plugin_name.GetCString()));
3379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return m_dyld_ap.get();
3389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
33946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
340ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonbool
34146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
34246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
34346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (old_thread_list.GetSize(false) == 0)
34446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
34546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // Make up the thread the first time this is called so we can setup our one and only
34646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // core thread state.
34746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
34846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
34946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (core_objfile)
35046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
35146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const uint32_t num_threads = core_objfile->GetNumThreadContexts ();
35246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            for (lldb::tid_t tid = 0; tid < num_threads; ++tid)
35346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
35494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham                ThreadSP thread_sp(new ThreadMachCore (*this, tid));
35546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                new_thread_list.AddThread (thread_sp);
35646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
35746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
35846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
35946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    else
36046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
36146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        const uint32_t num_threads = old_thread_list.GetSize(false);
36246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        for (uint32_t i=0; i<num_threads; ++i)
36346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            new_thread_list.AddThread (old_thread_list.GetThreadAtIndex (i));
36446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
365ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    return new_thread_list.GetSize(false) > 0;
36646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
36746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
36846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
36946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::RefreshStateAfterStop ()
37046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
37146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // Let all threads recover from stopping and do any clean up based
37246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // on the previous thread state (if any).
37346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_list.RefreshStateAfterStop();
37446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    //SetThreadStopInfo (m_last_stop_packet);
37546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
37646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
37746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError
37846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoDestroy ()
37946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
38046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return Error();
38146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
38246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
38346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
38446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Queries
38546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
38646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
38746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool
38846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::IsAlive ()
38946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
39046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return true;
39146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
39246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
393ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molendabool
394ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason MolendaProcessMachCore::WarnBeforeDetach () const
395ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda{
396ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda    return false;
397ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda}
398ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda
39946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
40046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Memory
40146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
40246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonsize_t
4039ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
4049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
4059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // Don't allow the caching that lldb_private::Process::ReadMemory does
4069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // since in core files we have it all cached our our core file anyway.
4079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return DoReadMemory (addr, buf, size, error);
4089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
4099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
4109ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonsize_t
41146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error)
41246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
41346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
41446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
41546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (core_objfile)
41646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
41746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        const VMRangeToFileOffset::Entry *core_memory_entry = m_core_aranges.FindEntryThatContains (addr);
41846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (core_memory_entry)
41946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
42046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const addr_t offset = addr - core_memory_entry->GetRangeBase();
42146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const addr_t bytes_left = core_memory_entry->GetRangeEnd() - addr;
42246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            size_t bytes_to_read = size;
42346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (bytes_to_read > bytes_left)
42446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                bytes_to_read = bytes_left;
42546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            return core_objfile->CopyData (core_memory_entry->data.GetRangeBase() + offset, bytes_to_read, buf);
42646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
42746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        else
42846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
4295f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            error.SetErrorStringWithFormat ("core file does not contain 0x%" PRIx64, addr);
43046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
43146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
43246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return 0;
43346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
43446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
43546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
43646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Clear()
43746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
43846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_list.Clear();
43946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
44046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
44146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
44246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Initialize()
44346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
44446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    static bool g_initialized = false;
44546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
44646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (g_initialized == false)
44746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
44846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        g_initialized = true;
44946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        PluginManager::RegisterPlugin (GetPluginNameStatic(),
45046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                       GetPluginDescriptionStatic(),
45146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                       CreateInstance);
45246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
45346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
45446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
45546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonaddr_t
45646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetImageInfoAddress()
45746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
4589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return m_dyld_addr;
45946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
46046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
46146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
46249ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ObjectFile *
46349ce8969d3154e1560106cfe530444c09410f217Greg ClaytonProcessMachCore::GetCoreObjectFile ()
46449ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
46549ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return m_core_module_sp->GetObjectFile();
46649ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
467