ProcessMachCore.cpp revision b170aee2daacc83e3d71c3e3acc9d56c89893a7b
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"
2146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/State.h"
2246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Host/Host.h"
2346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Target.h"
2446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Thread.h"
2546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
2646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Project includes
2746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ProcessMachCore.h"
2846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ThreadMachCore.h"
2946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "StopInfoMachException.h"
3046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h"
329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h"
339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb;
3546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb_private;
3646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
3746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
3846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginNameStatic()
3946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
4046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return "mach-o-core";
4146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
4246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
4346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
4446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginDescriptionStatic()
4546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
4646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return "Mach-O core file debugging plug-in.";
4746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
4846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
4946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
5046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Terminate()
5146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
5246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    PluginManager::UnregisterPlugin (ProcessMachCore::CreateInstance);
5346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
5446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
5546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
5646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::ProcessSP
5746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file)
5846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
5946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    lldb::ProcessSP process_sp;
6046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (crash_file)
6146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        process_sp.reset(new ProcessMachCore (target, listener, *crash_file));
6246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return process_sp;
6346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
6446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
6546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool
6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CanDebug(Target &target, bool plugin_specified_by_name)
6746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
6846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (plugin_specified_by_name)
6946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return true;
7046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // For now we are just making sure the file exists for a given module
7246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (!m_core_module_sp && m_core_file.Exists())
7346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
74444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        ModuleSpec core_module_spec(m_core_file, target.GetArchitecture());
75444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        Error error (ModuleList::GetSharedModule (core_module_spec,
769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  m_core_module_sp,
779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL,
789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL,
799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                                                  NULL));
8046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
8146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (m_core_module_sp)
8246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
8346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const llvm::Triple &triple_ref = m_core_module_sp->GetArchitecture().GetTriple();
84b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            if (triple_ref.getVendor() == llvm::Triple::Apple)
8546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
8646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
8746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                if (core_objfile && core_objfile->GetType() == ObjectFile::eTypeCoreFile)
8846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                    return true;
8946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
9046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
9146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
9246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return false;
9346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
9446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
9546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
9646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// ProcessMachCore constructor
9746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
9846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::ProcessMachCore(Target& target, Listener &listener, const FileSpec &core_file) :
9946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Process (target, listener),
10046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_aranges (),
10146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_module_sp (),
10246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_core_file (core_file),
1039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    m_dyld_addr (LLDB_INVALID_ADDRESS),
1049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    m_dyld_plugin_name ()
10546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
10646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
10746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
10846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
10946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Destructor
11046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
11146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::~ProcessMachCore()
11246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
11346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Clear();
11446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // We need to call finalize on the process before destroying ourselves
11546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // to make sure all of the broadcaster cleanup goes as planned. If we
11646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // destruct this class, then Process::~Process() might have problems
11746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // trying to fully destroy the broadcaster.
11846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    Finalize();
11946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
12046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
12146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
12246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// PluginInterface
12346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//----------------------------------------------------------------------
12446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
12546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginName()
12646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
12746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return "Process debugging plug-in that loads mach-o core files.";
12846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
12946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
13046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char *
13146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetShortPluginName()
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...
1629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    //printf("0x%16.16llx: 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:
1749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            //printf("0x%16.16llx: 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:
1819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            //printf("0x%16.16llx: 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    }
21646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    SectionList *section_list = core_objfile->GetSectionList();
21746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (section_list == NULL)
21846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
21946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("core file has no sections");
22046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
22146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
22246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
22346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    const uint32_t num_sections = section_list->GetNumSections(0);
22446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (num_sections == 0)
22546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
22646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        error.SetErrorString ("core file has no sections");
22746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        return error;
22846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2299ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2309ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    llvm::MachO::mach_header header;
2319ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    DataExtractor data (&header,
2329ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        sizeof(header),
2339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        m_core_module_sp->GetArchitecture().GetByteOrder(),
2349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                        m_core_module_sp->GetArchitecture().GetAddressByteSize());
2359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
23646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    bool ranges_are_sorted = true;
23746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    addr_t vm_addr = 0;
23846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    for (uint32_t i=0; i<num_sections; ++i)
23946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
24046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        Section *section = section_list->GetSectionAtIndex (i).get();
24146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (section)
24246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
24346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            lldb::addr_t section_vm_addr = section->GetFileAddress();
24446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            FileRange file_range (section->GetFileOffset(), section->GetFileSize());
24546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            VMRangeToFileOffset::Entry range_entry (section_vm_addr,
24646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                                    section->GetByteSize(),
24746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                                    file_range);
24846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
24946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (vm_addr > section_vm_addr)
25046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                ranges_are_sorted = false;
25146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            vm_addr = section->GetFileAddress();
25246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            VMRangeToFileOffset::Entry *last_entry = m_core_aranges.Back();
2539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            printf ("LC_SEGMENT[%u] arange=[0x%16.16llx - 0x%16.16llx), frange=[0x%8.8x - 0x%8.8x)\n",
2549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    i,
2559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.GetRangeBase(),
2569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.GetRangeEnd(),
2579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.data.GetRangeBase(),
2589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    range_entry.data.GetRangeEnd());
2599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
26046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (last_entry &&
26146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->GetRangeEnd() == range_entry.GetRangeBase() &&
26246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->data.GetRangeEnd() == range_entry.data.GetRangeBase())
26346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
26446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->SetRangeEnd (range_entry.GetRangeEnd());
26546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                last_entry->data.SetRangeEnd (range_entry.data.GetRangeEnd());
2669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                //puts("combine");
26746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
26846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            else
26946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
27046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                m_core_aranges.Append(range_entry);
27146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
2729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // After we have added this section to our m_core_aranges map,
2749ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // we can check the start of the section to see if it might
2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // contain dyld for user space apps, or the mach kernel file
2769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            // for kernel cores.
2779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (m_dyld_addr == LLDB_INVALID_ADDRESS)
2789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                GetDynamicLoaderAddress (section_vm_addr);
27946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
28046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
28146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (!ranges_are_sorted)
28246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
28346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        m_core_aranges.Sort();
28446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // Even if the architecture is set in the target, we need to override
2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // it to match the core file which is always single arch.
2889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    ArchSpec arch (m_core_module_sp->GetArchitecture());
2899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (arch.GetCore() == ArchSpec::eCore_x86_32_i486)
2909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        arch.SetTriple ("i386", m_target.GetPlatform().get());
2929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
2939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (arch.IsValid())
2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_target.SetArchitecture(arch);
2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (m_dyld_addr == LLDB_INVALID_ADDRESS)
2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    {
2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // Check the magic kernel address for the mach image header address in case
2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        // it is there.
3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        if (arch.GetAddressByteSize() == 8)
3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        {
3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            Error header_addr_error;
3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            addr_t header_addr = ReadPointerFromMemory (0xffffff8000002010ull, header_addr_error);
3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton            if (header_addr != LLDB_INVALID_ADDRESS)
3059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                GetDynamicLoaderAddress (header_addr);
3069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        }
3079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
3089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//        if (m_dyld_addr == LLDB_INVALID_ADDRESS)
3099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//        {
3109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            // We haven't found our dyld or mach_kernel yet,
3119ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            // so we need to exhaustively look
3129ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            const size_t num_core_aranges = m_core_aranges.GetSize();
3139ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            bool done = false;
3149ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            for (size_t i=0; !done && i<num_core_aranges; ++i)
3159ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            {
3169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                const addr_t start_vaddr = m_core_aranges.GetEntryRef(i).GetRangeBase();
3179ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                const addr_t end_vaddr = m_core_aranges.GetEntryRef(i).GetRangeEnd();
3189ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                //            printf("core_arange[%u] [0x%16.16llx - 0x%16.16llx)\n", (uint32_t)i, start_vaddr, end_vaddr);
3199ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//
3209ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                for (addr_t vaddr = start_vaddr; !done && start_vaddr < end_vaddr; vaddr += 0x1000)
3219ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                {
3229ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                    done = GetDynamicLoaderAddress (vaddr);
3239ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//                }
3249ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//            }
3259ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton//        }
3269ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    }
32746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
32846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return error;
32946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
33046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
3319ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonlldb_private::DynamicLoader *
3329ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoader ()
3339ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
3349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    if (m_dyld_ap.get() == NULL)
3359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.empty() ? NULL : m_dyld_plugin_name.c_str()));
3369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return m_dyld_ap.get();
3379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
33846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
339ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonbool
34046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
34146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
34246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (old_thread_list.GetSize(false) == 0)
34346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
34446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // Make up the thread the first time this is called so we can setup our one and only
34546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // core thread state.
34646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
34746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
34846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (core_objfile)
34946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
35046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const uint32_t num_threads = core_objfile->GetNumThreadContexts ();
35146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            for (lldb::tid_t tid = 0; tid < num_threads; ++tid)
35246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
353f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                ThreadSP thread_sp(new ThreadMachCore (shared_from_this(), tid));
35446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                new_thread_list.AddThread (thread_sp);
35546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
35646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
35746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
35846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    else
35946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
36046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        const uint32_t num_threads = old_thread_list.GetSize(false);
36146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        for (uint32_t i=0; i<num_threads; ++i)
36246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            new_thread_list.AddThread (old_thread_list.GetThreadAtIndex (i));
36346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
364ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton    return new_thread_list.GetSize(false) > 0;
36546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
36646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
36746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
36846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::RefreshStateAfterStop ()
36946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
37046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // Let all threads recover from stopping and do any clean up based
37146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    // on the previous thread state (if any).
37246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_list.RefreshStateAfterStop();
37346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    //SetThreadStopInfo (m_last_stop_packet);
37446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
37546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
37646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError
37746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoDestroy ()
37846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
37946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return Error();
38046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
38146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
38246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
38346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Queries
38446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
38546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
38646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool
38746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::IsAlive ()
38846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
38946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return true;
39046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
39146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
39246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
39346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Memory
39446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------
39546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonsize_t
3969ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::ReadMemory (addr_t addr, void *buf, size_t size, Error &error)
3979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{
3989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // Don't allow the caching that lldb_private::Process::ReadMemory does
3999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    // since in core files we have it all cached our our core file anyway.
4009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return DoReadMemory (addr, buf, size, error);
4019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton}
4029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
4039ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonsize_t
40446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error)
40546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
40646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    ObjectFile *core_objfile = m_core_module_sp->GetObjectFile();
40746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
40846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (core_objfile)
40946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
41046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        const VMRangeToFileOffset::Entry *core_memory_entry = m_core_aranges.FindEntryThatContains (addr);
41146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        if (core_memory_entry)
41246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
41346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const addr_t offset = addr - core_memory_entry->GetRangeBase();
41446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            const addr_t bytes_left = core_memory_entry->GetRangeEnd() - addr;
41546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            size_t bytes_to_read = size;
41646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            if (bytes_to_read > bytes_left)
41746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                bytes_to_read = bytes_left;
41846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            return core_objfile->CopyData (core_memory_entry->data.GetRangeBase() + offset, bytes_to_read, buf);
41946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
42046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        else
42146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
42246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            error.SetErrorStringWithFormat ("core file does not contain 0x%llx", addr);
42346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
42446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
42546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    return 0;
42646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
42746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
42846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
42946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Clear()
43046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
43146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    m_thread_list.Clear();
43246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
43346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
43446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid
43546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Initialize()
43646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
43746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    static bool g_initialized = false;
43846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
43946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    if (g_initialized == false)
44046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
44146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        g_initialized = true;
44246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        PluginManager::RegisterPlugin (GetPluginNameStatic(),
44346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                       GetPluginDescriptionStatic(),
44446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton                                       CreateInstance);
44546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
44646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
44746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
44846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonaddr_t
44946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetImageInfoAddress()
45046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{
4519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton    return m_dyld_addr;
45246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton}
45346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
45446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
455