124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DynamicLoaderMacOSXDYLD.cpp -----------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "llvm/Support/MachO.h"
1246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Breakpoint/StoppointCallbackContext.h"
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBuffer.h"
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBufferHeap.h"
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Log.h"
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Module.h"
1849ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h"
2049ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/State.h"
2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/Function.h"
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Symbol/ObjectFile.h"
24b66cd074ec097b5b0a6f2ce292f5072aa1217ca6Jim Ingham#include "lldb/Target/ObjCLanguageRuntime.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/RegisterContext.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/ThreadPlanRunToAddress.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/StackFrame.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DynamicLoaderMacOSXDYLD.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//#define ENABLE_DEBUG_PRINTF // COMMENT THIS LINE OUT PRIOR TO CHECKIN
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifdef ENABLE_DEBUG_PRINTF
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdio.h>
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define DEBUG_PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__)
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#else
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define DEBUG_PRINTF(fmt, ...)
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
413e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea#ifndef __APPLE__
423e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea#include "Utility/UuidCompatibility.h"
433e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea#endif
443e649057fa43a75d9db4498ea30d24907c0de5e3Daniel Malea
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// FIXME - The ObjC Runtime trampoline handler doesn't really belong here.
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// I am putting it here so I can invoke it in the Trampoline code here, but
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// it should be moved to the ObjC Runtime support when it is set up.
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
52ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton
53ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg ClaytonDynamicLoaderMacOSXDYLD::DYLDImageInfo *
5424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonDynamicLoaderMacOSXDYLD::GetImageInfo (Module *module)
55ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton{
5624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const UUID &module_uuid = module->GetUUID();
57ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton    DYLDImageInfo::collection::iterator pos, end = m_dyld_image_infos.end();
5824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
5924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // First try just by UUID as it is the safest.
6024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (module_uuid.IsValid())
6124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
6224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        for (pos = m_dyld_image_infos.begin(); pos != end; ++pos)
6324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
6424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            if (pos->uuid == module_uuid)
6524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                return &(*pos);
6624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
6724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
6824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (m_dyld.uuid == module_uuid)
6924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return &m_dyld;
7024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
7124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
7224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Next try by platform path only for things that don't have a valid UUID
7324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // since if a file has a valid UUID in real life it should also in the
7424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // dyld info. This is the next safest because the paths in the dyld info
7524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // are platform paths, not local paths. For local debugging platform == local
7624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // paths.
7724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    const FileSpec &platform_file_spec = module->GetPlatformFileSpec();
78ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton    for (pos = m_dyld_image_infos.begin(); pos != end; ++pos)
79ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton    {
8024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (pos->file_spec == platform_file_spec && pos->uuid.IsValid() == false)
81ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton            return &(*pos);
82ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton    }
83ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton
8424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (m_dyld.file_spec == platform_file_spec && m_dyld.uuid.IsValid() == false)
85ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        return &m_dyld;
86ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton
87ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton    return NULL;
88ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton}
89ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Create an instance of this class. This function is filled into
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// the plugin info class that gets handed out by the plugin factory and
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// allows the lldb to instantiate an instance of this class.
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoader *
9675c703dd8b492bad25a987b96853626641ae7246Greg ClaytonDynamicLoaderMacOSXDYLD::CreateInstance (Process* process, bool force)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9875c703dd8b492bad25a987b96853626641ae7246Greg Clayton    bool create = force;
9975c703dd8b492bad25a987b96853626641ae7246Greg Clayton    if (!create)
10075c703dd8b492bad25a987b96853626641ae7246Greg Clayton    {
10140f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        create = true;
1025beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton        Module* exe_module = process->GetTarget().GetExecutableModulePointer();
10340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        if (exe_module)
10440f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        {
10540f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            ObjectFile *object_file = exe_module->GetObjectFile();
10640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            if (object_file)
10740f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            {
108ac725afac61b48d1dc0e38370d824fe45c52c3b7Sean Callanan                create = (object_file->GetStrata() == ObjectFile::eStrataUser);
10940f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            }
11040f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        }
11140f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton
11240f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        if (create)
11340f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        {
11440f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton            const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
115b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            switch (triple_ref.getOS())
116b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            {
117b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::Darwin:
118b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::MacOSX:
119b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                case llvm::Triple::IOS:
120b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = triple_ref.getVendor() == llvm::Triple::Apple;
121b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
122b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                default:
123b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    create = false;
124b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton                    break;
125b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton            }
12640f79177b1b63f4b718a6f1160ee6485a547365eGreg Clayton        }
12775c703dd8b492bad25a987b96853626641ae7246Greg Clayton    }
12875c703dd8b492bad25a987b96853626641ae7246Greg Clayton
12975c703dd8b492bad25a987b96853626641ae7246Greg Clayton    if (create)
13075c703dd8b492bad25a987b96853626641ae7246Greg Clayton        return new DynamicLoaderMacOSXDYLD (process);
13175c703dd8b492bad25a987b96853626641ae7246Greg Clayton    return NULL;
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Constructor
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::DynamicLoaderMacOSXDYLD (Process* process) :
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DynamicLoader(process),
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld(),
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_all_image_infos_addr(LLDB_INVALID_ADDRESS),
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_all_image_infos(),
14220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_dyld_all_image_infos_stop_id (UINT32_MAX),
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_break_id(LLDB_INVALID_BREAK_ID),
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_image_infos(),
14520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    m_dyld_image_infos_stop_id (UINT32_MAX),
1460bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    m_mutex(Mutex::eMutexTypeRecursive),
1470bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    m_process_image_addr_is_all_images_infos (false)
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::~DynamicLoaderMacOSXDYLD()
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear(true);
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Called after attaching a process.
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Allow DynamicLoader plug-ins to execute some code after
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// attaching to a process.
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::DidAttach ()
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PrivateInitialize(m_process);
16920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    LocateDYLD ();
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetNotificationBreakpoint ();
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Called after attaching a process.
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Allow DynamicLoader plug-ins to execute some code after
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// attaching to a process.
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::DidLaunch ()
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PrivateInitialize(m_process);
18320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    LocateDYLD ();
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetNotificationBreakpoint ();
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1870bce9a22354df3f00e68ffd912119a0741753b7fGreg Claytonbool
1880bce9a22354df3f00e68ffd912119a0741753b7fGreg ClaytonDynamicLoaderMacOSXDYLD::ProcessDidExec ()
1890bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton{
1900bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    if (m_process)
1910bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    {
1920bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        // If we are stopped after an exec, we will have only one thread...
1930bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        if (m_process->GetThreadList().GetSize() == 1)
1940bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        {
1950bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            // We know if a process has exec'ed if our "m_dyld_all_image_infos_addr"
1960bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            // value differs from the Process' image info address. When a process
1970bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            // execs itself it might cause a change if ASLR is enabled.
1980bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            const addr_t shlib_addr = m_process->GetImageInfoAddress ();
1990bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            if (m_process_image_addr_is_all_images_infos == true && shlib_addr != m_dyld_all_image_infos_addr)
2000bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            {
2010bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                // The image info address from the process is the 'dyld_all_image_infos'
2020bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                // address and it has changed.
2030bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                return true;
2040bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            }
2050bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
2060bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            if (m_process_image_addr_is_all_images_infos == false && shlib_addr == m_dyld.address)
2070bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            {
2080bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                // The image info address from the process is the mach_header
2090bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                // address for dyld and it has changed.
2100bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                return true;
2110bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            }
2120bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
2130bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            // ASLR might be disabled and dyld could have ended up in the same
2140bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            // location. We should try and detect if we are stopped at '_dyld_start'
2150bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            ThreadSP thread_sp (m_process->GetThreadList().GetThreadAtIndex(0));
2160bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            if (thread_sp)
2170bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            {
2180bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                lldb::StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex(0));
2190bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                if (frame_sp)
2200bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                {
2210bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                    const Symbol *symbol = frame_sp->GetSymbolContext(eSymbolContextSymbol).symbol;
2220bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                    if (symbol)
2230bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                    {
2240bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                        if (symbol->GetName() == ConstString("_dyld_start"))
2250bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                            return true;
2260bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                    }
2270bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton                }
2280bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton            }
2290bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton        }
2300bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    }
2310bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    return false;
2320bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton}
2330bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
2340bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Clear out the state of this class.
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::Clear (bool clear_process)
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_process->IsAlive() && LLDB_BREAK_ID_IS_VALID(m_break_id))
245090f83176695d86197b0e86b67dee4160ec5003dJim Ingham        m_process->GetTarget().RemoveBreakpointByID (m_break_id);
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (clear_process)
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_process = NULL;
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld.Clear(false);
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_all_image_infos_addr = LLDB_INVALID_ADDRESS;
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_all_image_infos.Clear();
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_break_id = LLDB_INVALID_BREAK_ID;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_image_infos.clear();
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Check if we have found DYLD yet
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::DidSetNotificationBreakpoint() const
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return LLDB_BREAK_ID_IS_VALID (m_break_id);
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Try and figure out where dyld is by first asking the Process
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if it knows (which currently calls down in the the lldb::Process
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// to get the DYLD info (available on SnowLeopard only). If that fails,
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// then check in the default addresses.
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::LocateDYLD()
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_dyld_all_image_infos_addr == LLDB_INVALID_ADDRESS)
27546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    {
27646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // Check the image info addr as it might point to the
27746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // mach header for dyld, or it might point to the
27846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        // dyld_all_image_infos struct
2799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton        const addr_t shlib_addr = m_process->GetImageInfoAddress ();
2802ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton        if (shlib_addr != LLDB_INVALID_ADDRESS)
28146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        {
2822ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            ByteOrder byte_order = m_process->GetTarget().GetArchitecture().GetByteOrder();
2832ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            uint8_t buf[4];
2842ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            DataExtractor data (buf, sizeof(buf), byte_order, 4);
2852ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            Error error;
2862ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            if (m_process->ReadMemory (shlib_addr, buf, 4, error) == 4)
28746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            {
2882ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                lldb::offset_t offset = 0;
2892ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                uint32_t magic = data.GetU32 (&offset);
2902ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                switch (magic)
2912ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                {
2922ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                case llvm::MachO::HeaderMagic32:
2932ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                case llvm::MachO::HeaderMagic64:
2942ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                case llvm::MachO::HeaderMagic32Swapped:
2952ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                case llvm::MachO::HeaderMagic64Swapped:
2962ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                    m_process_image_addr_is_all_images_infos = false;
2972ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                    return ReadDYLDInfoFromMemoryAndSetNotificationCallback(shlib_addr);
2982ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton
2992ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                default:
3002ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                    break;
3012ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                }
30246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton            }
3032ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            // Maybe it points to the all image infos?
3042ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            m_dyld_all_image_infos_addr = shlib_addr;
3052ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            m_process_image_addr_is_all_images_infos = true;
30646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton        }
30746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton    }
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_dyld_all_image_infos_addr != LLDB_INVALID_ADDRESS)
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ReadAllImageInfosStructure ())
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_dyld_all_image_infos.dyldImageLoadAddress != LLDB_INVALID_ADDRESS)
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ReadDYLDInfoFromMemoryAndSetNotificationCallback (m_dyld_all_image_infos.dyldImageLoadAddress);
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return ReadDYLDInfoFromMemoryAndSetNotificationCallback (m_dyld_all_image_infos_addr & 0xfffffffffff00000ull);
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Check some default values
3215beb99d65c72cd4a4f7529c4ff8cc04a1a40769dGreg Clayton    Module *executable = m_process->GetTarget().GetExecutableModulePointer();
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (executable)
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3253e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton        const ArchSpec &exe_arch = executable->GetArchitecture();
3263e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton        if (exe_arch.GetAddressByteSize() == 8)
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return ReadDYLDInfoFromMemoryAndSetNotificationCallback(0x7fff5fc00000ull);
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
3303e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton        else if (exe_arch.GetMachine() == llvm::Triple::arm || exe_arch.GetMachine() == llvm::Triple::thumb)
3313e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton        {
3323e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton            return ReadDYLDInfoFromMemoryAndSetNotificationCallback(0x2fe00000);
3333e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton        }
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
3363e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton            return ReadDYLDInfoFromMemoryAndSetNotificationCallback(0x8fe00000);
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonModuleSP
3432ddb2b8aed6d43665c6955255f6a077574a08412Greg ClaytonDynamicLoaderMacOSXDYLD::FindTargetModuleForDYLDImageInfo (DYLDImageInfo &image_info, bool can_create, bool *did_create_ptr)
34424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton{
34524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (did_create_ptr)
34624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        *did_create_ptr = false;
347146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata
3482ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    Target &target = m_process->GetTarget();
3492ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    const ModuleList &target_images = target.GetImages();
350444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    ModuleSpec module_spec (image_info.file_spec, image_info.GetArchitecture ());
351444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    module_spec.GetUUID() = image_info.uuid;
352444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    ModuleSP module_sp (target_images.FindFirstModule (module_spec));
35324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
3544f397a2220c644e1ae9c089958705cf2f9493731Jim Ingham    if (module_sp && !module_spec.GetUUID().IsValid() && !module_sp->GetUUID().IsValid())
35524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    {
356444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        // No UUID, we must rely upon the cached module modification
357444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        // time and the modification time of the file on disk
358444fe998bf707bd076a70c3a779db8575533695eGreg Clayton        if (module_sp->GetModificationTime() != module_sp->GetFileSpec().GetModificationTime())
359444fe998bf707bd076a70c3a779db8575533695eGreg Clayton            module_sp.reset();
360444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    }
36124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
362444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    if (!module_sp)
363444fe998bf707bd076a70c3a779db8575533695eGreg Clayton    {
364153ccd72f52a6cc3595d7614558e2954f67833ebGreg Clayton        if (can_create)
36524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
3662ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            module_sp = target.GetSharedModule (module_spec);
3674f397a2220c644e1ae9c089958705cf2f9493731Jim Ingham            if (!module_sp || module_sp->GetObjectFile() == NULL)
3682ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                module_sp = m_process->ReadModuleFromMemory (image_info.file_spec, image_info.address);
3694f397a2220c644e1ae9c089958705cf2f9493731Jim Ingham
3704f397a2220c644e1ae9c089958705cf2f9493731Jim Ingham            if (did_create_ptr)
3719880efacdd3a5e855b405d89433a01170422a889Jim Ingham                *did_create_ptr = (bool) module_sp;
37224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
37324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    }
37424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    return module_sp;
37524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton}
37624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Assume that dyld is in memory at ADDR and try to parse it's load
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// commands
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::ReadDYLDInfoFromMemoryAndSetNotificationCallback(lldb::addr_t addr)
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DataExtractor data; // Load command data
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (ReadMachHeader (addr, &m_dyld.header, &data))
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (m_dyld.header.filetype == llvm::MachO::HeaderFileTypeDynamicLinkEditor)
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dyld.address = addr;
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ModuleSP dyld_module_sp;
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (ParseLoadCommands (data, m_dyld, &m_dyld.file_spec))
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (m_dyld.file_spec)
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
39524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    dyld_module_sp = FindTargetModuleForDYLDImageInfo (m_dyld, true, NULL);
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                    if (dyld_module_sp)
39824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                        UpdateImageLoadAddress (dyld_module_sp.get(), m_dyld);
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4022ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            Target &target = m_process->GetTarget();
4032ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_dyld_all_image_infos_addr == LLDB_INVALID_ADDRESS && dyld_module_sp.get())
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                static ConstString g_dyld_all_image_infos ("dyld_all_image_infos");
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                const Symbol *symbol = dyld_module_sp->FindFirstSymbolWithNameAndType (g_dyld_all_image_infos, eSymbolTypeData);
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (symbol)
4092ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                    m_dyld_all_image_infos_addr = symbol->GetAddress().GetLoadAddress(&target);
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Update all image infos
413e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            InitializeFromAllImageInfos ();
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // If we didn't have an executable before, but now we do, then the
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // dyld module shared pointer might be unique and we may need to add
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // it again (since Target::SetExecutableModule() will clear the
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // images). So append the dyld module back to the list if it is
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            /// unique!
4201cf173c379c1932f1d7d706eebb6eae25ac71e14Jim Ingham            if (dyld_module_sp)
4211cf173c379c1932f1d7d706eebb6eae25ac71e14Jim Ingham            {
4222ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                target.GetImages().AppendIfNeeded (dyld_module_sp);
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4241cf173c379c1932f1d7d706eebb6eae25ac71e14Jim Ingham                // At this point we should have read in dyld's module, and so we should set breakpoints in it:
4251cf173c379c1932f1d7d706eebb6eae25ac71e14Jim Ingham                ModuleList modules;
4261cf173c379c1932f1d7d706eebb6eae25ac71e14Jim Ingham                modules.Append(dyld_module_sp);
4272ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                target.ModulesDidLoad(modules);
4281cf173c379c1932f1d7d706eebb6eae25ac71e14Jim Ingham            }
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::NeedToLocateDYLD () const
43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_dyld_all_image_infos_addr == LLDB_INVALID_ADDRESS;
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Update the load addresses for all segments in MODULE using the
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// updated INFO that is passed in.
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
44624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonDynamicLoaderMacOSXDYLD::UpdateImageLoadAddress (Module *module, DYLDImageInfo& info)
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool changed = false;
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (module)
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *image_object_file = module->GetObjectFile();
45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (image_object_file)
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SectionList *section_list = image_object_file->GetSectionList ();
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (section_list)
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
457761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                std::vector<uint32_t> inaccessible_segment_indexes;
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We now know the slide amount, so go through all sections
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // and update the load addresses with the correct values.
46036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                const size_t num_segments = info.segments.size();
46136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                for (size_t i=0; i<num_segments; ++i)
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
463761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    // Only load a segment if it has protections. Things like
464761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    // __PAGEZERO don't have any protections, and they shouldn't
465761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    // be slid
46624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SectionSP section_sp(section_list->FindSectionByName(info.segments[i].name));
4679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton
468761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    if (info.segments[i].maxprot == 0)
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
470761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        inaccessible_segment_indexes.push_back(i);
471761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    }
472761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    else
473761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    {
474761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        const addr_t new_section_load_addr = info.segments[i].vmaddr + info.slide;
475761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        static ConstString g_section_name_LINKEDIT ("__LINKEDIT");
476761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton
477761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        if (section_sp)
4781c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                        {
479a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                            // __LINKEDIT sections from files in the shared cache
480a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                            // can overlap so check to see what the segment name is
481a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                            // and pass "false" so we don't warn of overlapping
482a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                            // "Section" objects, and "true" for all other sections.
483a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                            const bool warn_multiple = section_sp->GetName() != g_section_name_LINKEDIT;
484a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton
485545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                            const addr_t old_section_load_addr = m_process->GetTarget().GetSectionLoadList().GetSectionLoadAddress (section_sp);
486a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                            if (old_section_load_addr == LLDB_INVALID_ADDRESS ||
487a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                                old_section_load_addr != new_section_load_addr)
4889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            {
489545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                                if (m_process->GetTarget().GetSectionLoadList().SetSectionLoadAddress (section_sp, new_section_load_addr, warn_multiple))
490a414e679c425c5bd1574f801c5bd8f516faa74cbGreg Clayton                                    changed = true;
4919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            }
4921c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                        }
493761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        else
494761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        {
495761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                            Host::SystemLog (Host::eSystemLogWarning,
49697a19b21dacd9063bb5475812df7781777262198Greg Clayton                                             "warning: unable to find and load segment named '%s' at 0x%" PRIx64 " in '%s' in macosx dynamic loader plug-in.\n",
497761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                                             info.segments[i].name.AsCString("<invalid>"),
498761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                                             (uint64_t)new_section_load_addr,
49997a19b21dacd9063bb5475812df7781777262198Greg Clayton                                             image_object_file->GetFileSpec().GetPath().c_str());
500761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        }
5011c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    }
502761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                }
503761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton
504761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                // If the loaded the file (it changed) and we have segments that
505761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                // are not readable or writeable, add them to the invalid memory
506761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                // region cache for the process. This will typically only be
507761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                // the __PAGEZERO segment in the main executable. We might be able
508761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                // to apply this more generally to more sections that have no
509761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                // protections in the future, but for now we are going to just
510761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                // do __PAGEZERO.
511761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                if (changed && !inaccessible_segment_indexes.empty())
512761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                {
513761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                    for (uint32_t i=0; i<inaccessible_segment_indexes.size(); ++i)
5141c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    {
515761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        const uint32_t seg_idx = inaccessible_segment_indexes[i];
516761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        SectionSP section_sp(section_list->FindSectionByName(info.segments[seg_idx].name));
517761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton
518761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        if (section_sp)
519761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        {
520761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                            static ConstString g_pagezero_section_name("__PAGEZERO");
521761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                            if (g_pagezero_section_name == section_sp->GetName())
522761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                            {
523761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                                // __PAGEZERO never slides...
524761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                                const lldb::addr_t vmaddr = info.segments[seg_idx].vmaddr;
525761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                                const lldb::addr_t vmsize = info.segments[seg_idx].vmsize;
526761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                                Process::LoadRange pagezero_range (vmaddr, vmsize);
527761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                                m_process->AddInvalidMemoryRegion(pagezero_range);
528761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                            }
529761133029ba2d5bb0c21c3a871dede340b2775fcGreg Clayton                        }
53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
5352ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    // We might have an in memory image that was loaded as soon as it was created
5362ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    if (info.load_stop_id == m_process->GetStopID())
5372ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton        changed = true;
5382ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    else if (changed)
5392ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    {
5402ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton        // Update the stop ID when this library was updated
5412ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton        info.load_stop_id = m_process->GetStopID();
5422ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    }
54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return changed;
54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
54524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Update the load addresses for all segments in MODULE using the
54824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// updated INFO that is passed in.
54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
55124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonDynamicLoaderMacOSXDYLD::UnloadImageLoadAddress (Module *module, DYLDImageInfo& info)
55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool changed = false;
55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (module)
55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ObjectFile *image_object_file = module->GetObjectFile();
55724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (image_object_file)
55824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SectionList *section_list = image_object_file->GetSectionList ();
56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (section_list)
56124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
56236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                const size_t num_segments = info.segments.size();
56336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                for (size_t i=0; i<num_segments; ++i)
56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    SectionSP section_sp(section_list->FindSectionByName(info.segments[i].name));
5661c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    if (section_sp)
5671c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    {
5681c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                        const addr_t old_section_load_addr = info.segments[i].vmaddr + info.slide;
569545762f7780bece4e9255e052c0a50a1ea66ce57Greg Clayton                        if (m_process->GetTarget().GetSectionLoadList().SetSectionUnloaded (section_sp, old_section_load_addr))
5701c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                            changed = true;
5711c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    }
5721c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    else
5731c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    {
574df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                        Host::SystemLog (Host::eSystemLogWarning,
57597a19b21dacd9063bb5475812df7781777262198Greg Clayton                                         "warning: unable to find and unload segment named '%s' in '%s' in macosx dynamic loader plug-in.\n",
576df6dc88322f103b263092d752db4490e628a1cbdGreg Clayton                                         info.segments[i].name.AsCString("<invalid>"),
57797a19b21dacd9063bb5475812df7781777262198Greg Clayton                                         image_object_file->GetFileSpec().GetPath().c_str());
5781c96341e2616cf5bfc76732a3ac4275a0b32e709Greg Clayton                    }
57924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
58224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return changed;
58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
58724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
58824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Static callback function that gets called when our DYLD notification
58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// breakpoint gets hit. We update all of our image infos and then
59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// let our super class DynamicLoader class decide if we should stop
59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// or not (based on global preference).
59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
59324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
594e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim InghamDynamicLoaderMacOSXDYLD::NotifyBreakpointHit (void *baton,
595e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                              StoppointCallbackContext *context,
596e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                              lldb::user_id_t break_id,
597e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                              lldb::user_id_t break_loc_id)
59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Let the event know that the images have changed
600e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // DYLD passes three arguments to the notification breakpoint.
601e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // Arg1: enum dyld_image_mode mode - 0 = adding, 1 = removing
602e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // Arg2: uint32_t infoCount        - Number of shared libraries added
603e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // Arg3: dyld_image_info info[]    - Array of structs of the form:
604e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    //                                     const struct mach_header *imageLoadAddress
605e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    //                                     const char               *imageFilePath
606e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    //                                     uintptr_t                 imageFileModDate (a time_t)
607e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DynamicLoaderMacOSXDYLD* dyld_instance = (DynamicLoaderMacOSXDYLD*) baton;
609e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
610e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // First step is to see if we've already initialized the all image infos.  If we haven't then this function
611e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // will do so and return true.  In the course of initializing the all_image_infos it will read the complete
612e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // current state, so we don't need to figure out what has changed from the data passed in to us.
613e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
614e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (dyld_instance->InitializeFromAllImageInfos())
615e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return dyld_instance->GetStopWhenImagesChange();
616e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
617f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    ExecutionContext exe_ctx (context->exe_ctx_ref);
618f4124deeb9532044a38c0774ced872f2709347daGreg Clayton    Process *process = exe_ctx.GetProcessPtr();
619e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    const lldb::ABISP &abi = process->GetABI();
620b386d82334b65fb984348f2027b1cb7714de993fSean Callanan    if (abi)
621e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
622e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // Build up the value array to store the three arguments given above, then get the values from the ABI:
623e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
624e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        ClangASTContext *clang_ast_context = process->GetTarget().GetScratchClangASTContext();
625e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        ValueList argument_values;
626e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        Value input_value;
627e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
62852f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType clang_void_ptr_type = clang_ast_context->GetBasicType(eBasicTypeVoid).GetPointerType();
62952f792329be5db8e38961350589e97e8f2823acdGreg Clayton        ClangASTType clang_uint32_type = clang_ast_context->GetBuiltinTypeForEncodingAndBitSize(lldb::eEncodingUint, 32);
630e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        input_value.SetValueType (Value::eValueTypeScalar);
63152f792329be5db8e38961350589e97e8f2823acdGreg Clayton        input_value.SetClangType (clang_uint32_type);
63252f792329be5db8e38961350589e97e8f2823acdGreg Clayton//        input_value.SetContext (Value::eContextTypeClangType, clang_uint32_type);
63352f792329be5db8e38961350589e97e8f2823acdGreg Clayton        argument_values.PushValue (input_value);
63452f792329be5db8e38961350589e97e8f2823acdGreg Clayton        argument_values.PushValue (input_value);
63552f792329be5db8e38961350589e97e8f2823acdGreg Clayton        input_value.SetClangType (clang_void_ptr_type);
63652f792329be5db8e38961350589e97e8f2823acdGreg Clayton        //        input_value.SetContext (Value::eContextTypeClangType, clang_void_ptr_type);
637e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        argument_values.PushValue (input_value);
638e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
639f4124deeb9532044a38c0774ced872f2709347daGreg Clayton        if (abi->GetArgumentValues (exe_ctx.GetThreadRef(), argument_values))
640e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        {
641e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            uint32_t dyld_mode = argument_values.GetValueAtIndex(0)->GetScalar().UInt (-1);
642e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (dyld_mode != -1)
643e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            {
644e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                // Okay the mode was right, now get the number of elements, and the array of new elements...
645e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                uint32_t image_infos_count = argument_values.GetValueAtIndex(1)->GetScalar().UInt (-1);
646e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                if (image_infos_count != -1)
647e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                {
648e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    // Got the number added, now go through the array of added elements, putting out the mach header
649e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    // address, and adding the image.
650e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    // Note, I'm not putting in logging here, since the AddModules & RemoveModules functions do
651e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    // all the logging internally.
652e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
653e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    lldb::addr_t image_infos_addr = argument_values.GetValueAtIndex(2)->GetScalar().ULongLong();
654e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    if (dyld_mode == 0)
655e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    {
656e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        // This is add:
657e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        dyld_instance->AddModulesUsingImageInfosAddress (image_infos_addr, image_infos_count);
658e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    }
659e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    else
660e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    {
661e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        // This is remove:
662e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        dyld_instance->RemoveModulesUsingImageInfosAddress (image_infos_addr, image_infos_count);
663e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    }
664e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
665e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                }
666e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            }
667e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        }
668e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    }
669e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Return true to stop the target, false to just let the target run
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return dyld_instance->GetStopWhenImagesChange();
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::ReadAllImageInfosStructure ()
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
67820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
67920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    // the all image infos is already valid for this process stop ID
68020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    if (m_process->GetStopID() == m_dyld_all_image_infos_stop_id)
68120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        return true;
68220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_dyld_all_image_infos.Clear();
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_dyld_all_image_infos_addr != LLDB_INVALID_ADDRESS)
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
686395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton        ByteOrder byte_order = m_process->GetTarget().GetArchitecture().GetByteOrder();
68720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        uint32_t addr_size = 4;
68820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        if (m_dyld_all_image_infos_addr > UINT32_MAX)
68920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            addr_size = 8;
69020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint8_t buf[256];
69220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        DataExtractor data (buf, sizeof(buf), byte_order, addr_size);
69336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
69420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
6951f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        const size_t count_v2 =  sizeof (uint32_t) + // version
6961f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 sizeof (uint32_t) + // infoArrayCount
6971f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // infoArray
6981f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // notification
6991f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // processDetachedFromSharedRegion + libSystemInitialized + pad
7001f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size;          // dyldImageLoadAddress
7011f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        const size_t count_v11 = count_v2 +
7021f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // jitInfo
7031f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // dyldVersion
7041f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // errorMessage
7051f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // terminationFlags
7061f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // coreSymbolicationShmPage
7071f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // systemOrderFlag
7081f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // uuidArrayCount
7091f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // uuidArray
7101f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // dyldAllImageInfosAddress
7111f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // initialImageCount
7121f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // errorKind
7131f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // errorClientOfDylibPath
7141f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size +         // errorTargetDylibPath
7151f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                                 addr_size;          // errorSymbol
716482bd43afe0ae2d9af9b803c0594d82081255172Jason Molenda        const size_t count_v13 = count_v11 +
717482bd43afe0ae2d9af9b803c0594d82081255172Jason Molenda                                 addr_size +         // sharedCacheSlide
718482bd43afe0ae2d9af9b803c0594d82081255172Jason Molenda                                 sizeof (uuid_t);    // sharedCacheUUID
719482bd43afe0ae2d9af9b803c0594d82081255172Jason Molenda        assert (sizeof (buf) >= count_v13);
7201f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Error error;
7221f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        if (m_process->ReadMemory (m_dyld_all_image_infos_addr, buf, 4, error) == 4)
7231f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        {
7241f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda            m_dyld_all_image_infos.version = data.GetU32(&offset);
72520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // If anything in the high byte is set, we probably got the byte
72620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // order incorrect (the process might not have it set correctly
72720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            // yet due to attaching to a program without a specified file).
72820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            if (m_dyld_all_image_infos.version & 0xff000000)
72920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            {
73020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                // We have guessed the wrong byte order. Swap it and try
73120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                // reading the version again.
73220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                if (byte_order == eByteOrderLittle)
73320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    byte_order = eByteOrderBig;
73420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                else
73520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    byte_order = eByteOrderLittle;
73620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
73720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                data.SetByteOrder (byte_order);
73820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                offset = 0;
73920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                m_dyld_all_image_infos.version = data.GetU32(&offset);
74020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            }
7411f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        }
7421f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        else
7431f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        {
7441f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda            return false;
7451f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda        }
7461f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda
74736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const size_t count = (m_dyld_all_image_infos.version >= 11) ? count_v11 : count_v2;
7481f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda
74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const size_t bytes_read = m_process->ReadMemory (m_dyld_all_image_infos_addr, buf, count, error);
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (bytes_read == count)
75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
75220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            offset = 0;
75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dyld_all_image_infos.version = data.GetU32(&offset);
75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dyld_all_image_infos.dylib_info_count = data.GetU32(&offset);
75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dyld_all_image_infos.dylib_info_addr = data.GetPointer(&offset);
75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dyld_all_image_infos.notification = data.GetPointer(&offset);
75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dyld_all_image_infos.processDetachedFromSharedRegion = data.GetU8(&offset);
7581f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda            m_dyld_all_image_infos.libSystemInitialized = data.GetU8(&offset);
7591f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda            // Adjust for padding.
7601f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda            offset += addr_size - 2;
7611f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda            m_dyld_all_image_infos.dyldImageLoadAddress = data.GetPointer(&offset);
7621f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda            if (m_dyld_all_image_infos.version >= 11)
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
7641f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                offset += addr_size * 8;
7651f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                uint64_t dyld_all_image_infos_addr = data.GetPointer(&offset);
7661f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda
7671f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // When we started, we were given the actual address of the all_image_infos
7681f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // struct (probably via TASK_DYLD_INFO) in memory - this address is stored in
7691f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // m_dyld_all_image_infos_addr and is the most accurate address we have.
7701f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda
7711f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // We read the dyld_all_image_infos struct from memory; it contains its own address.
7721f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // If the address in the struct does not match the actual address,
7731f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // the dyld we're looking at has been loaded at a different location (slid) from
7741f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // where it intended to load.  The addresses in the dyld_all_image_infos struct
7751f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // are the original, non-slid addresses, and need to be adjusted.  Most importantly
7761f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                // the address of dyld and the notification address need to be adjusted.
7771f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda
7781f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                if (dyld_all_image_infos_addr != m_dyld_all_image_infos_addr)
7791f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                {
7801f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                    uint64_t image_infos_offset = dyld_all_image_infos_addr - m_dyld_all_image_infos.dyldImageLoadAddress;
7811f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                    uint64_t notification_offset = m_dyld_all_image_infos.notification - m_dyld_all_image_infos.dyldImageLoadAddress;
7821f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                    m_dyld_all_image_infos.dyldImageLoadAddress = m_dyld_all_image_infos_addr - image_infos_offset;
7831f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                    m_dyld_all_image_infos.notification = m_dyld_all_image_infos.dyldImageLoadAddress + notification_offset;
7841f3af545e911684b8b3927e15f1093cc4e7a00a5Jason Molenda                }
78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
78620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            m_dyld_all_image_infos_stop_id = m_process->GetStopID();
78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return true;
78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
793e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
794e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Inghambool
795e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim InghamDynamicLoaderMacOSXDYLD::AddModulesUsingImageInfosAddress (lldb::addr_t image_infos_addr, uint32_t image_infos_count)
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
797e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    DYLDImageInfo::collection image_infos;
798952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
799e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (log)
8007e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda        log->Printf ("Adding %d modules.\n", image_infos_count);
801e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
802e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    Mutex::Locker locker(m_mutex);
803e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (m_process->GetStopID() == m_dyld_image_infos_stop_id)
804e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return true;
80524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
806e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (!ReadImageInfos (image_infos_addr, image_infos_count, image_infos))
807e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return false;
808e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
809e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    UpdateImageInfosHeaderAndLoadCommands (image_infos, image_infos_count, false);
810e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    bool return_value = AddModulesUsingImageInfos (image_infos);
811e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    m_dyld_image_infos_stop_id = m_process->GetStopID();
812e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    return return_value;
813e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham}
81420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
815e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham// Adds the modules in image_infos to m_dyld_image_infos.
816e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham// NB don't call this passing in m_dyld_image_infos.
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
818e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Inghambool
819e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim InghamDynamicLoaderMacOSXDYLD::AddModulesUsingImageInfos (DYLDImageInfo::collection &image_infos)
820e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham{
821e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // Now add these images to the main list.
822e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    ModuleList loaded_module_list;
823952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
8242ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    Target &target = m_process->GetTarget();
8252ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    ModuleList& target_images = target.GetImages();
826e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
827e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    for (uint32_t idx = 0; idx < image_infos.size(); ++idx)
828e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
829e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (log)
830e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        {
8315f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            log->Printf ("Adding new image at address=0x%16.16" PRIx64 ".", image_infos[idx].address);
832952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            image_infos[idx].PutToLog (log);
833e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        }
834e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
835e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        m_dyld_image_infos.push_back(image_infos[idx]);
836e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
837e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        ModuleSP image_module_sp (FindTargetModuleForDYLDImageInfo (image_infos[idx], true, NULL));
83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
839e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (image_module_sp)
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
841e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (image_infos[idx].header.filetype == llvm::MachO::HeaderFileTypeDynamicLinkEditor)
842e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                image_module_sp->SetIsDynamicLinkEditor (true);
843e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
844e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            ObjectFile *objfile = image_module_sp->GetObjectFile ();
845e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (objfile)
84624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
847e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                SectionList *sections = objfile->GetSectionList();
848e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                if (sections)
84924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
850e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    ConstString commpage_dbstr("__commpage");
851e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    Section *commpage_section = sections->FindSectionByName(commpage_dbstr).get();
852e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    if (commpage_section)
85324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
854444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        ModuleSpec module_spec (objfile->GetFileSpec(), image_infos[idx].GetArchitecture ());
855444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        module_spec.GetObjectName() = commpage_dbstr;
856444fe998bf707bd076a70c3a779db8575533695eGreg Clayton                        ModuleSP commpage_image_module_sp(target_images.FindFirstModule (module_spec));
857e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        if (!commpage_image_module_sp)
858e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        {
859cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton                            module_spec.SetObjectOffset (objfile->GetFileOffset() + commpage_section->GetFileOffset());
8602ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                            commpage_image_module_sp  = target.GetSharedModule (module_spec);
861b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                            if (!commpage_image_module_sp || commpage_image_module_sp->GetObjectFile() == NULL)
8629ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            {
863b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton                                commpage_image_module_sp = m_process->ReadModuleFromMemory (image_infos[idx].file_spec,
8642ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                                                                            image_infos[idx].address);
8652ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                // Always load a memory image right away in the target in case
8662ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                // we end up trying to read the symbol table from memory... The
8672ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                // __LINKEDIT will need to be mapped so we can figure out where
8682ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                // the symbol table bits are...
8692ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                bool changed = false;
8702ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                UpdateImageLoadAddress (commpage_image_module_sp.get(), image_infos[idx]);
8712ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                target.GetImages().Append(commpage_image_module_sp);
8722ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                if (changed)
8732ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                {
8742ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                    image_infos[idx].load_stop_id = m_process->GetStopID();
8752ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                    loaded_module_list.AppendIfNeeded (commpage_image_module_sp);
8762ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                                }
8779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton                            }
878e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        }
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
883e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            // UpdateImageLoadAddress will return true if any segments
884e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            // change load address. We need to check this so we don't
885e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            // mention that all loaded shared libraries are newly loaded
886e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            // each time we hit out dyld breakpoint since dyld will list all
887e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            // shared libraries each time.
888e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (UpdateImageLoadAddress (image_module_sp.get(), image_infos[idx]))
889e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            {
8902ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton                target_images.AppendIfNeeded(image_module_sp);
891e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                loaded_module_list.AppendIfNeeded (image_module_sp);
892e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            }
893e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        }
894e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    }
895e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
896e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (loaded_module_list.GetSize() > 0)
897e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
898e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // FIXME: This should really be in the Runtime handlers class, which should get
899e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // called by the target's ModulesDidLoad, but we're doing it all locally for now
900e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // to save time.
901e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // Also, I'm assuming there can be only one libobjc dylib loaded...
902e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
903e31176627725f4236c9ca049edc027756709780bJim Ingham        ObjCLanguageRuntime *objc_runtime = m_process->GetObjCLanguageRuntime(true);
904e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (objc_runtime != NULL && !objc_runtime->HasReadObjCLibrary())
90524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
906e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            size_t num_modules = loaded_module_list.GetSize();
9073e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs            for (size_t i = 0; i < num_modules; i++)
908ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton            {
909e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                if (objc_runtime->IsModuleObjCLibrary (loaded_module_list.GetModuleAtIndex (i)))
910ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton                {
911e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    objc_runtime->ReadObjCLibrary (loaded_module_list.GetModuleAtIndex (i));
912e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    break;
913ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton                }
914ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton            }
915e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        }
916e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (log)
917e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            loaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderMacOSXDYLD::ModulesDidLoad");
918e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        m_process->GetTarget().ModulesDidLoad (loaded_module_list);
919e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    }
920e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    return true;
921e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham}
922e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
923e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Inghambool
924e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim InghamDynamicLoaderMacOSXDYLD::RemoveModulesUsingImageInfosAddress (lldb::addr_t image_infos_addr, uint32_t image_infos_count)
925e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham{
926e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    DYLDImageInfo::collection image_infos;
927952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
928e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
929e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    Mutex::Locker locker(m_mutex);
930e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (m_process->GetStopID() == m_dyld_image_infos_stop_id)
931e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return true;
932e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
933e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // First read in the image_infos for the removed modules, and their headers & load commands.
934e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (!ReadImageInfos (image_infos_addr, image_infos_count, image_infos))
935e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
936e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (log)
937e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            log->PutCString ("Failed reading image infos array.");
938e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return false;
939e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    }
940e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
941e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (log)
942e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        log->Printf ("Removing %d modules.", image_infos_count);
943e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
944e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    ModuleList unloaded_module_list;
945e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    for (uint32_t idx = 0; idx < image_infos.size(); ++idx)
946e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
947e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (log)
948e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        {
9495f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            log->Printf ("Removing module at address=0x%16.16" PRIx64 ".", image_infos[idx].address);
950952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton            image_infos[idx].PutToLog (log);
951e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        }
952e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
953e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // Remove this image_infos from the m_all_image_infos.  We do the comparision by address
954e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // rather than by file spec because we can have many modules with the same "file spec" in the
955e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // case that they are modules loaded from memory.
956e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        //
957e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // Also copy over the uuid from the old entry to the removed entry so we can
958e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        // use it to lookup the module in the module list.
959e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
960e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        DYLDImageInfo::collection::iterator pos, end = m_dyld_image_infos.end();
961e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        for (pos = m_dyld_image_infos.begin(); pos != end; pos++)
962e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        {
963e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (image_infos[idx].address == (*pos).address)
96424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
965e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                image_infos[idx].uuid = (*pos).uuid;
966e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
967e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                // Add the module from this image_info to the "unloaded_module_list".  We'll remove them all at
968e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                // one go later on.
969e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
970e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                ModuleSP unload_image_module_sp (FindTargetModuleForDYLDImageInfo (image_infos[idx], false, NULL));
971e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                if (unload_image_module_sp.get())
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
973eaaa8fd0c14124d10084e58feea32d1d58e581c9Jim Ingham                    // When we unload, be sure to use the image info from the old list,
974eaaa8fd0c14124d10084e58feea32d1d58e581c9Jim Ingham                    // since that has sections correctly filled in.
975eaaa8fd0c14124d10084e58feea32d1d58e581c9Jim Ingham                    UnloadImageLoadAddress (unload_image_module_sp.get(), *pos);
976e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    unloaded_module_list.AppendIfNeeded (unload_image_module_sp);
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
978e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                else
9799d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton                {
980e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    if (log)
9819d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton                    {
982e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                        log->Printf ("Could not find module for unloading info entry:");
983952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                        image_infos[idx].PutToLog(log);
9849d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton                    }
9859d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton                }
986e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
987e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                // Then remove it from the m_dyld_image_infos:
988e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
989e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                m_dyld_image_infos.erase(pos);
990e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                break;
9919d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton            }
992e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        }
993e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
994e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (pos == end)
995e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        {
996e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (log)
997427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            {
998e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                log->Printf ("Could not find image_info entry for unloading image:");
999952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton                image_infos[idx].PutToLog(log);
1000427f290ff96f3ab9f2cf3a1af7001d2c560424c7Greg Clayton            }
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1002e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    }
1003e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (unloaded_module_list.GetSize() > 0)
1004e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
1005e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (log)
10069d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton        {
1007e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            log->PutCString("Unloaded:");
1008e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            unloaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderMacOSXDYLD::ModulesDidUnload");
1009e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        }
1010146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        m_process->GetTarget().GetImages().Remove (unloaded_module_list);
1011e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    }
1012e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    m_dyld_image_infos_stop_id = m_process->GetStopID();
1013e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    return true;
1014e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham}
1015e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
1016e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Inghambool
1017e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim InghamDynamicLoaderMacOSXDYLD::ReadImageInfos (lldb::addr_t image_infos_addr,
1018e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                         uint32_t image_infos_count,
1019e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                         DYLDImageInfo::collection &image_infos)
1020e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham{
1021e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    const ByteOrder endian = m_dyld.GetByteOrder();
1022e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    const uint32_t addr_size = m_dyld.GetAddressByteSize();
1023e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
1024e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    image_infos.resize(image_infos_count);
1025e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    const size_t count = image_infos.size() * 3 * addr_size;
1026e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    DataBufferHeap info_data(count, 0);
1027e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    Error error;
1028e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    const size_t bytes_read = m_process->ReadMemory (image_infos_addr,
1029e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                                     info_data.GetBytes(),
1030e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                                     info_data.GetByteSize(),
1031e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                                     error);
1032e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (bytes_read == count)
1033e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    {
103436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t info_data_offset = 0;
1035e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        DataExtractor info_data_ref(info_data.GetBytes(), info_data.GetByteSize(), endian, addr_size);
10363e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs        for (size_t i = 0; i < image_infos.size() && info_data_ref.ValidOffset(info_data_offset); i++)
1037e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        {
1038e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            image_infos[i].address = info_data_ref.GetPointer(&info_data_offset);
1039e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            lldb::addr_t path_addr = info_data_ref.GetPointer(&info_data_offset);
1040e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            image_infos[i].mod_date = info_data_ref.GetPointer(&info_data_offset);
1041e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
1042e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            char raw_path[PATH_MAX];
10434a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton            m_process->ReadCStringFromMemory (path_addr, raw_path, sizeof(raw_path), error);
1044e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            // don't resolve the path
10454a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton            if (error.Success())
10464a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton            {
10474a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton                const bool resolve_path = false;
10484a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton                image_infos[i].file_spec.SetFile(raw_path, resolve_path);
10494a2e33769873d68d5703da5742c0e248f46e3a72Greg Clayton            }
10509d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton        }
1051e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return true;
105224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1055e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return false;
105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1057e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham}
1058e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
1059e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham//----------------------------------------------------------------------
1060e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham// If we have found where the "_dyld_all_image_infos" lives in memory,
1061e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham// read the current info from it, and then update all image load
1062e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham// addresses (or lack thereof).  Only do this if this is the first time
1063e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham// we're reading the dyld infos.  Return true if we actually read anything,
1064e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham// and false otherwise.
1065e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham//----------------------------------------------------------------------
1066e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Inghambool
1067e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim InghamDynamicLoaderMacOSXDYLD::InitializeFromAllImageInfos ()
1068e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham{
1069952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
1070e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
1071e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    Mutex::Locker locker(m_mutex);
1072e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (m_process->GetStopID() == m_dyld_image_infos_stop_id
1073e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham          || m_dyld_image_infos.size() != 0)
1074e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return false;
107524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1076e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (ReadAllImageInfosStructure ())
107724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10788c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        // Nothing to load or unload?
10798c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        if (m_dyld_all_image_infos.dylib_info_count == 0)
10808c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton            return true;
10818c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton
10828c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        if (m_dyld_all_image_infos.dylib_info_addr == 0)
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
10848c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton            // DYLD is updating the images now.  So we should say we have no images, and then we'll
10858c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton            // figure it out when we hit the added breakpoint.
10868c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton            return false;
10878c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        }
10888c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        else
10898c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        {
10908c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton            if (!AddModulesUsingImageInfosAddress (m_dyld_all_image_infos.dylib_info_addr,
10918c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton                                                   m_dyld_all_image_infos.dylib_info_count))
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1093b9db9d5bb01963774f28540dbe2c5a11f586ff29Daniel Malea                DEBUG_PRINTF("%s", "unable to read all data for all_dylib_infos.");
10948c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton                m_dyld_image_infos.clear();
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
10978c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton
109851b11e06de746667396f56b303d1867f007baf8bJim Ingham        // Now we have one more bit of business.  If there is a library left in the images for our target that
109951b11e06de746667396f56b303d1867f007baf8bJim Ingham        // doesn't have a load address, then it must be something that we were expecting to load (for instance we
110051b11e06de746667396f56b303d1867f007baf8bJim Ingham        // read a load command for it) but it didn't in fact load - probably because DYLD_*_PATH pointed
110151b11e06de746667396f56b303d1867f007baf8bJim Ingham        // to an equivalent version.  We don't want it to stay in the target's module list or it will confuse
110251b11e06de746667396f56b303d1867f007baf8bJim Ingham        // us, so unload it here.
11038c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        Target &target = m_process->GetTarget();
1104146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata        const ModuleList &target_modules = target.GetImages();
110551b11e06de746667396f56b303d1867f007baf8bJim Ingham        ModuleList not_loaded_modules;
11069336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham        Mutex::Locker modules_locker(target_modules.GetMutex());
11079336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham
11089336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham        size_t num_modules = target_modules.GetSize();
110928c83e90ec04493a2bd0c44aba7f1ffa9ea17ea1Greg Clayton        for (size_t i = 0; i < num_modules; i++)
111051b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
11119336790a758b8f8b87d95e6658bb8fdb34766c2fJim Ingham            ModuleSP module_sp = target_modules.GetModuleAtIndexUnlocked (i);
11128c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton            if (!module_sp->IsLoadedInTarget (&target))
111351b11e06de746667396f56b303d1867f007baf8bJim Ingham            {
111451b11e06de746667396f56b303d1867f007baf8bJim Ingham                if (log)
111551b11e06de746667396f56b303d1867f007baf8bJim Ingham                {
111651b11e06de746667396f56b303d1867f007baf8bJim Ingham                    StreamString s;
111751b11e06de746667396f56b303d1867f007baf8bJim Ingham                    module_sp->GetDescription (&s);
111851b11e06de746667396f56b303d1867f007baf8bJim Ingham                    log->Printf ("Unloading pre-run module: %s.", s.GetData ());
111951b11e06de746667396f56b303d1867f007baf8bJim Ingham                }
112051b11e06de746667396f56b303d1867f007baf8bJim Ingham                not_loaded_modules.Append (module_sp);
112151b11e06de746667396f56b303d1867f007baf8bJim Ingham            }
112251b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
112351b11e06de746667396f56b303d1867f007baf8bJim Ingham
112451b11e06de746667396f56b303d1867f007baf8bJim Ingham        if (not_loaded_modules.GetSize() != 0)
112551b11e06de746667396f56b303d1867f007baf8bJim Ingham        {
1126146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata            target.GetImages().Remove(not_loaded_modules);
112751b11e06de746667396f56b303d1867f007baf8bJim Ingham        }
11288c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton
1129e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return true;
113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1131e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    else
1132e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        return false;
113324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
113424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
113524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
113624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Read a mach_header at ADDR into HEADER, and also fill in the load
113724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// command data into LOAD_COMMAND_DATA if it is non-NULL.
113824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
113924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if we succeed, false if we fail for any reason.
114024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
114124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
114224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonDynamicLoaderMacOSXDYLD::ReadMachHeader (lldb::addr_t addr, llvm::MachO::mach_header *header, DataExtractor *load_command_data)
114324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
114424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    DataBufferHeap header_bytes(sizeof(llvm::MachO::mach_header), 0);
114524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Error error;
114624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t bytes_read = m_process->ReadMemory (addr,
114724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               header_bytes.GetBytes(),
114824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               header_bytes.GetByteSize(),
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                               error);
115024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    if (bytes_read == sizeof(llvm::MachO::mach_header))
115124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
115236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        lldb::offset_t offset = 0;
11536fe03ce1dbc7fff934174ca8add96e6d72f0e126Greg Clayton        ::memset (header, 0, sizeof(llvm::MachO::mach_header));
115424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Get the magic byte unswapped so we can figure out what we are dealing with
1156cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton        DataExtractor data(header_bytes.GetBytes(), header_bytes.GetByteSize(), lldb::endian::InlHostByteOrder(), 4);
115724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        header->magic = data.GetU32(&offset);
115824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t load_cmd_addr = addr;
115924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        data.SetByteOrder(DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic(header->magic));
116024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (header->magic)
116124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11621674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case llvm::MachO::HeaderMagic32:
11631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case llvm::MachO::HeaderMagic32Swapped:
116424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            data.SetAddressByteSize(4);
116524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            load_cmd_addr += sizeof(llvm::MachO::mach_header);
116624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
116724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11681674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case llvm::MachO::HeaderMagic64:
11691674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton        case llvm::MachO::HeaderMagic64Swapped:
117024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            data.SetAddressByteSize(8);
117124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            load_cmd_addr += sizeof(llvm::MachO::mach_header_64);
117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        default:
117524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
117824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Read the rest of dyld's mach header
117924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (data.GetU32(&offset, &header->cputype, (sizeof(llvm::MachO::mach_header)/sizeof(uint32_t)) - 1))
118024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
118124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (load_command_data == NULL)
118224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true; // We were able to read the mach_header and weren't asked to read the load command bytes
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DataBufferSP load_cmd_data_sp(new DataBufferHeap(header->sizeofcmds, 0));
118524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
118624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size_t load_cmd_bytes_read = m_process->ReadMemory (load_cmd_addr,
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                load_cmd_data_sp->GetBytes(),
118824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                load_cmd_data_sp->GetByteSize(),
118924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                error);
119024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
119124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (load_cmd_bytes_read == header->sizeofcmds)
119224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
119324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // Set the load command data and also set the correct endian
119424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // swap settings and the correct address size
119524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                load_command_data->SetData(load_cmd_data_sp, 0, header->sizeofcmds);
119624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                load_command_data->SetByteOrder(data.GetByteOrder());
119724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                load_command_data->SetAddressByteSize(data.GetAddressByteSize());
119824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return true; // We successfully read the mach_header and the load command data
119924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
120024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false; // We weren't able to read the load command data
120224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
120324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
120424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false; // We failed the read the mach_header
120524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
120624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
120924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Parse the load commands for an image
121024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
121124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
121224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg ClaytonDynamicLoaderMacOSXDYLD::ParseLoadCommands (const DataExtractor& data, DYLDImageInfo& dylib_info, FileSpec *lc_id_dylinker)
121324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
121436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    lldb::offset_t offset = 0;
121524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t cmd_idx;
121624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Segment segment;
121724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    dylib_info.Clear (true);
121824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
121924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (cmd_idx = 0; cmd_idx < dylib_info.header.ncmds; cmd_idx++)
122024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
122124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Clear out any load command specific data from DYLIB_INFO since
122224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // we are about to read it.
122324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
122424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (data.ValidOffsetForDataOfSize (offset, sizeof(llvm::MachO::load_command)))
122524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
122624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            llvm::MachO::load_command load_cmd;
122736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            lldb::offset_t load_cmd_offset = offset;
122824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            load_cmd.cmd = data.GetU32 (&offset);
122924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            load_cmd.cmdsize = data.GetU32 (&offset);
123024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            switch (load_cmd.cmd)
123124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
123224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            case llvm::MachO::LoadCommandSegment32:
123324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
123424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    segment.name.SetTrimmedCStringWithLength ((const char *)data.GetData(&offset, 16), 16);
12356e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    // We are putting 4 uint32_t values 4 uint64_t values so
12366e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    // we have to use multiple 32 bit gets below.
12376e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    segment.vmaddr = data.GetU32 (&offset);
12386e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    segment.vmsize = data.GetU32 (&offset);
12396e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    segment.fileoff = data.GetU32 (&offset);
12406e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    segment.filesize = data.GetU32 (&offset);
12416e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    // Extract maxprot, initprot, nsects and flags all at once
12426e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    data.GetU32(&offset, &segment.maxprot, 4);
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    dylib_info.segments.push_back (segment);
124424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
124524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
124624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            case llvm::MachO::LoadCommandSegment64:
124824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
124924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    segment.name.SetTrimmedCStringWithLength ((const char *)data.GetData(&offset, 16), 16);
12506e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    // Extract vmaddr, vmsize, fileoff, and filesize all at once
12516e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    data.GetU64(&offset, &segment.vmaddr, 4);
12526e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    // Extract maxprot, initprot, nsects and flags all at once
12536e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                    data.GetU32(&offset, &segment.maxprot, 4);
125424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    dylib_info.segments.push_back (segment);
125524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
125624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
125824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            case llvm::MachO::LoadCommandDynamicLinkerIdent:
125924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (lc_id_dylinker)
126024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
126136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    const lldb::offset_t name_offset = load_cmd_offset + data.GetU32 (&offset);
126224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    const char *path = data.PeekCStr (name_offset);
1263537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton                    lc_id_dylinker->SetFile (path, true);
126424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
126524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
126624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
126724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            case llvm::MachO::LoadCommandUUID:
126824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                dylib_info.uuid.SetBytes(data.GetData (&offset, 16));
126924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
127024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
127124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
127224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
127324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
127424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Set offset to be the beginning of the next load command.
127524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            offset = load_cmd_offset + load_cmd.cmdsize;
127624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
127724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
12786e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton
12796e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    // All sections listed in the dyld image info structure will all
12806e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    // either be fixed up already, or they will all be off by a single
12816e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    // slide amount that is determined by finding the first segment
12826e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    // that is at file offset zero which also has bytes (a file size
12836e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    // that is greater than zero) in the object file.
12846e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton
12856e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    // Determine the slide amount (if any)
12866e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    const size_t num_sections = dylib_info.segments.size();
12876e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    for (size_t i = 0; i < num_sections; ++i)
12886e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    {
12896e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        // Iterate through the object file sections to find the
12906e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        // first section that starts of file offset zero and that
12916e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        // has bytes in the file...
12926e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        if (dylib_info.segments[i].fileoff == 0 && dylib_info.segments[i].filesize > 0)
12936e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        {
12946e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            dylib_info.slide = dylib_info.address - dylib_info.segments[i].vmaddr;
12956e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            // We have found the slide amount, so we can exit
12966e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            // this for loop.
12976e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            break;
12986e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        }
12996e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    }
130024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return cmd_idx;
130124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
130224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
130324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
130424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Read the mach_header and load commands for each image that the
130524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// _dyld_all_image_infos structure points to and cache the results.
130624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
1307e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
130824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1309e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim InghamDynamicLoaderMacOSXDYLD::UpdateImageInfosHeaderAndLoadCommands(DYLDImageInfo::collection &image_infos,
1310e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                                               uint32_t infos_count,
1311e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                                               bool update_executable)
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
131324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t exe_idx = UINT32_MAX;
131424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Read any UUID values that we can get
1315e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    for (uint32_t i = 0; i < infos_count; i++)
131624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1317e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham        if (!image_infos[i].UUIDValid())
131824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
131924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            DataExtractor data; // Load command data
1320e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (!ReadMachHeader (image_infos[i].address, &image_infos[i].header, &data))
132124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                continue;
132224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1323e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            ParseLoadCommands (data, image_infos[i], NULL);
132424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1325e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham            if (image_infos[i].header.filetype == llvm::MachO::HeaderFileTypeExecutable)
132624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                exe_idx = i;
132724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
132824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
132924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
133024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13312ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    Target &target = m_process->GetTarget();
13322ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton
1333e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    if (exe_idx < image_infos.size())
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13358c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        const bool can_create = true;
13368c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton        ModuleSP exe_module_sp (FindTargetModuleForDYLDImageInfo (image_infos[exe_idx], can_create, NULL));
133724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
133824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        if (exe_module_sp)
133924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
13402ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            UpdateImageLoadAddress (exe_module_sp.get(), image_infos[exe_idx]);
13412ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton
13422ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            if (exe_module_sp.get() != target.GetExecutableModulePointer())
134324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
134424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // Don't load dependent images since we are in dyld where we will know
134524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                // and find out about all images that are loaded
13468c1d7203f726e3a62b832dbeeaf0ae76f9f65222Greg Clayton                const bool get_dependent_images = false;
134724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                m_process->GetTarget().SetExecutableModule (exe_module_sp,
134824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                                            get_dependent_images);
134924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
135024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
135124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
135224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
135324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
135424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
135584985174d8b0fe4913caf446f7789f1531317650Jason Molenda// On Mac OS X libobjc (the Objective-C runtime) has several critical dispatch
135684985174d8b0fe4913caf446f7789f1531317650Jason Molenda// functions written in hand-written assembly, and also have hand-written unwind
135784985174d8b0fe4913caf446f7789f1531317650Jason Molenda// information in the eh_frame section.  Normally we prefer analyzing the
135884985174d8b0fe4913caf446f7789f1531317650Jason Molenda// assembly instructions of a curently executing frame to unwind from that frame --
135984985174d8b0fe4913caf446f7789f1531317650Jason Molenda// but on hand-written functions this profiling can fail.  We should use the
136084985174d8b0fe4913caf446f7789f1531317650Jason Molenda// eh_frame instructions for these functions all the time.
136184985174d8b0fe4913caf446f7789f1531317650Jason Molenda//
136284985174d8b0fe4913caf446f7789f1531317650Jason Molenda// As an aside, it would be better if the eh_frame entries had a flag (or were
136384985174d8b0fe4913caf446f7789f1531317650Jason Molenda// extensible so they could have an Apple-specific flag) which indicates that
136484985174d8b0fe4913caf446f7789f1531317650Jason Molenda// the instructions are asynchronous -- accurate at every instruction, instead
136584985174d8b0fe4913caf446f7789f1531317650Jason Molenda// of our normal default assumption that they are not.
136684985174d8b0fe4913caf446f7789f1531317650Jason Molenda//----------------------------------------------------------------------
136784985174d8b0fe4913caf446f7789f1531317650Jason Molenda
136884985174d8b0fe4913caf446f7789f1531317650Jason Molendabool
136984985174d8b0fe4913caf446f7789f1531317650Jason MolendaDynamicLoaderMacOSXDYLD::AlwaysRelyOnEHUnwindInfo (SymbolContext &sym_ctx)
137084985174d8b0fe4913caf446f7789f1531317650Jason Molenda{
137184985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ModuleSP module_sp;
137284985174d8b0fe4913caf446f7789f1531317650Jason Molenda    if (sym_ctx.symbol)
137384985174d8b0fe4913caf446f7789f1531317650Jason Molenda    {
13740c31d3d3a4a1d00d53346d8a23b0519f47e55d1fGreg Clayton        module_sp = sym_ctx.symbol->GetAddress().GetModule();
137584985174d8b0fe4913caf446f7789f1531317650Jason Molenda    }
137684985174d8b0fe4913caf446f7789f1531317650Jason Molenda    if (module_sp.get() == NULL && sym_ctx.function)
137784985174d8b0fe4913caf446f7789f1531317650Jason Molenda    {
13783508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton        module_sp = sym_ctx.function->GetAddressRange().GetBaseAddress().GetModule();
137984985174d8b0fe4913caf446f7789f1531317650Jason Molenda    }
138084985174d8b0fe4913caf446f7789f1531317650Jason Molenda    if (module_sp.get() == NULL)
138184985174d8b0fe4913caf446f7789f1531317650Jason Molenda        return false;
138284985174d8b0fe4913caf446f7789f1531317650Jason Molenda
138384985174d8b0fe4913caf446f7789f1531317650Jason Molenda    ObjCLanguageRuntime *objc_runtime = m_process->GetObjCLanguageRuntime();
138484985174d8b0fe4913caf446f7789f1531317650Jason Molenda    if (objc_runtime != NULL && objc_runtime->IsModuleObjCLibrary (module_sp))
138584985174d8b0fe4913caf446f7789f1531317650Jason Molenda    {
138684985174d8b0fe4913caf446f7789f1531317650Jason Molenda        return true;
138784985174d8b0fe4913caf446f7789f1531317650Jason Molenda    }
138884985174d8b0fe4913caf446f7789f1531317650Jason Molenda
138984985174d8b0fe4913caf446f7789f1531317650Jason Molenda    return false;
139084985174d8b0fe4913caf446f7789f1531317650Jason Molenda}
139184985174d8b0fe4913caf446f7789f1531317650Jason Molenda
139284985174d8b0fe4913caf446f7789f1531317650Jason Molenda
139384985174d8b0fe4913caf446f7789f1531317650Jason Molenda
139484985174d8b0fe4913caf446f7789f1531317650Jason Molenda//----------------------------------------------------------------------
139524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump a Segment to the file handle provided.
139624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
139724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
139824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::Segment::PutToLog (Log *log, lldb::addr_t slide) const
139924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
140024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log)
14016e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    {
14026e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        if (slide == 0)
14035f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            log->Printf ("\t\t%16s [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ")",
14046e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                         name.AsCString(""),
14056e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                         vmaddr + slide,
14066e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                         vmaddr + slide + vmsize);
14076e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        else
14085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea            log->Printf ("\t\t%16s [0x%16.16" PRIx64 " - 0x%16.16" PRIx64 ") slide = 0x%" PRIx64,
14096e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                         name.AsCString(""),
14106e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                         vmaddr + slide,
14116e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                         vmaddr + slide + vmsize,
14126e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton                         slide);
14136e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton    }
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
141524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
141624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst DynamicLoaderMacOSXDYLD::Segment *
141724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::DYLDImageInfo::FindSegment (const ConstString &name) const
141824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t num_segments = segments.size();
142024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (size_t i=0; i<num_segments; ++i)
142124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
142224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (segments[i].name == name)
142324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return &segments[i];
142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump an image info structure to the file handle provided.
143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
143324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::DYLDImageInfo::PutToLog (Log *log) const
143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log == NULL)
143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint8_t *u = (uint8_t *)uuid.GetBytes();
143824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
143924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (address == LLDB_INVALID_ADDRESS)
144024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (u)
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
144397a19b21dacd9063bb5475812df7781777262198Greg Clayton            log->Printf("\t                           modtime=0x%8.8" PRIx64 " uuid=%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X path='%s' (UNLOADED)",
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        mod_date,
144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[ 0], u[ 1], u[ 2], u[ 3],
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[ 4], u[ 5], u[ 6], u[ 7],
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[ 8], u[ 9], u[10], u[11],
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[12], u[13], u[14], u[15],
144997a19b21dacd9063bb5475812df7781777262198Greg Clayton                        file_spec.GetPath().c_str());
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
145124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
145297a19b21dacd9063bb5475812df7781777262198Greg Clayton            log->Printf("\t                           modtime=0x%8.8" PRIx64 " path='%s' (UNLOADED)",
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        mod_date,
145497a19b21dacd9063bb5475812df7781777262198Greg Clayton                        file_spec.GetPath().c_str());
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (u)
145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
146097a19b21dacd9063bb5475812df7781777262198Greg Clayton            log->Printf("\taddress=0x%16.16" PRIx64 " modtime=0x%8.8" PRIx64 " uuid=%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X path='%s'",
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        address,
146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        mod_date,
146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[ 0], u[ 1], u[ 2], u[ 3],
146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[ 4], u[ 5], u[ 6], u[ 7],
146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[ 8], u[ 9], u[10], u[11],
146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        u[12], u[13], u[14], u[15],
146797a19b21dacd9063bb5475812df7781777262198Greg Clayton                        file_spec.GetPath().c_str());
146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
146924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
147197a19b21dacd9063bb5475812df7781777262198Greg Clayton            log->Printf("\taddress=0x%16.16" PRIx64 " modtime=0x%8.8" PRIx64 " path='%s'",
147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        address,
147324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        mod_date,
147497a19b21dacd9063bb5475812df7781777262198Greg Clayton                        file_spec.GetPath().c_str());
147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (uint32_t i=0; i<segments.size(); ++i)
147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            segments[i].PutToLog(log, slide);
147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
148224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
148324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump the _dyld_all_image_infos members and all current image infos
148424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// that we have parsed to the file handle provided.
148524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
148624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
148724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::PutToLog(Log *log) const
148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (log == NULL)
149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Mutex::Locker locker(m_mutex);
14935f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea    log->Printf("dyld_all_image_infos = { version=%d, count=%d, addr=0x%8.8" PRIx64 ", notify=0x%8.8" PRIx64 " }",
149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_dyld_all_image_infos.version,
149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    m_dyld_all_image_infos.dylib_info_count,
149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    (uint64_t)m_dyld_all_image_infos.dylib_info_addr,
149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    (uint64_t)m_dyld_all_image_infos.notification);
149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t i;
149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const size_t count = m_dyld_image_infos.size();
150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (count > 0)
150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15029d2993d9b4663c02aaada6c1a887f348f43438cdGreg Clayton        log->PutCString("Loaded:");
150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (i = 0; i<count; i++)
150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_dyld_image_infos[i].PutToLog(log);
150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::PrivateInitialize(Process *process)
151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DEBUG_PRINTF("DynamicLoaderMacOSXDYLD::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear(true);
151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_process = process;
151458e844b3561848e73e69d6d98746d4851e78306eGreg Clayton    m_process->GetTarget().GetSectionLoadList().Clear();
151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::SetNotificationBreakpoint ()
151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DEBUG_PRINTF("DynamicLoaderMacOSXDYLD::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (m_break_id == LLDB_INVALID_BREAK_ID)
152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (m_dyld_all_image_infos.notification != LLDB_INVALID_ADDRESS)
152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
152524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            Address so_addr;
152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Set the notification breakpoint and install a breakpoint
152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // callback function that will get called each time the
152824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // breakpoint gets hit. We will use this to track when shared
152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // libraries get loaded/unloaded.
153024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1531eea264007bc5fb42c8f3239726a9d28ae42e1b7bGreg Clayton            if (m_process->GetTarget().GetSectionLoadList().ResolveLoadAddress(m_dyld_all_image_infos.notification, so_addr))
153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                Breakpoint *dyld_break = m_process->GetTarget().CreateBreakpoint (so_addr, true).get();
153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                dyld_break->SetCallback (DynamicLoaderMacOSXDYLD::NotifyBreakpointHit, this, true);
1535090f83176695d86197b0e86b67dee4160ec5003dJim Ingham                dyld_break->SetBreakpointKind ("shared-library-event");
153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                m_break_id = dyld_break->GetID();
153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_break_id != LLDB_INVALID_BREAK_ID;
154124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
154224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15437508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham//----------------------------------------------------------------------
154424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Member function that gets called when the process state changes.
154524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
154624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
154724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::PrivateProcessStateChanged (Process *process, StateType state)
154824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
154924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DEBUG_PRINTF("DynamicLoaderMacOSXDYLD::%s(%s)\n", __FUNCTION__, StateAsCString(state));
155024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    switch (state)
155124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1552e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton    case eStateConnected:
155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateAttaching:
155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateLaunching:
155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateInvalid:
155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateUnloaded:
155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateExited:
155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateDetached:
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Clear(false);
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateStopped:
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Keep trying find dyld and set our notification breakpoint each time
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // we stop until we succeed
156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (!DidSetNotificationBreakpoint () && m_process->IsAlive())
156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (NeedToLocateDYLD ())
156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                LocateDYLD ();
156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            SetNotificationBreakpoint ();
157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateRunning:
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateStepping:
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateCrashed:
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    case eStateSuspended:
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        break;
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1582323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham// This bit in the n_desc field of the mach file means that this is a
1583323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham// stub that runs arbitrary code to determine the trampoline target.
1584323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham// We've established a naming convention with the CoreOS folks for the
1585323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham// equivalent symbols they will use for this (which the objc guys didn't follow...)
1586323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham// For now we'll just look for all symbols matching that naming convention...
1587323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1588323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham#define MACH_O_N_SYMBOL_RESOLVER 0x100
1589323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerThreadPlanSP
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others)
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ThreadPlanSP thread_plan_sp;
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StackFrame *current_frame = thread.GetStackFrameAtIndex(0).get();
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const SymbolContext &current_context = current_frame->GetSymbolContext(eSymbolContextSymbol);
159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Symbol *current_symbol = current_context.symbol;
1597952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP));
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (current_symbol != NULL)
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (current_symbol->IsTrampoline())
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
160317454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            const ConstString &trampoline_name = current_symbol->GetMangled().GetName(Mangled::ePreferMangled);
160417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (trampoline_name)
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                SymbolContextList target_symbols;
1608f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                TargetSP target_sp (thread.CalculateTarget());
1609146d9522c95c0c8c5409539813b55e08b99196eeEnrico Granata                const ModuleList &images = target_sp->GetImages();
1610323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                images.FindSymbolsWithNameAndType(trampoline_name, eSymbolTypeCode, target_symbols);
1612323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1613323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                size_t num_original_symbols = target_symbols.GetSize();
1614d2a1143a67661c65c6df4f4f1321ba4acdfe84c1Jim Ingham                // FIXME: The resolver symbol is only valid in object files.  In binaries it is reused for the
1615d2a1143a67661c65c6df4f4f1321ba4acdfe84c1Jim Ingham                // shared library slot number.  So we'll have to look this up in the dyld info.
1616d2a1143a67661c65c6df4f4f1321ba4acdfe84c1Jim Ingham                // For now, just turn this off.
1617d2a1143a67661c65c6df4f4f1321ba4acdfe84c1Jim Ingham
1618d2a1143a67661c65c6df4f4f1321ba4acdfe84c1Jim Ingham                // bool orig_is_resolver = (current_symbol->GetFlags() & MACH_O_N_SYMBOL_RESOLVER) == MACH_O_N_SYMBOL_RESOLVER;
1619ca57bc559aa729a503bbe25f155b5150403041cbJim Ingham                // FIXME: Actually that isn't true, the N_SYMBOL_RESOLVER bit is only valid in .o files.  You can't use
1620ca57bc559aa729a503bbe25f155b5150403041cbJim Ingham                // the symbol flags to tell whether something is a symbol resolver in a linked image.
1621d2a1143a67661c65c6df4f4f1321ba4acdfe84c1Jim Ingham                bool orig_is_resolver = false;
1622323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1623323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                if (num_original_symbols > 0)
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
1625323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // We found symbols that look like they are the targets to our symbol.  Now look through the
1626323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // modules containing our symbols to see if there are any for our symbol.
1627323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1628323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    ModuleList modules_to_search;
1629323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1630323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    for (size_t i = 0; i < num_original_symbols; i++)
163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
1632323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        SymbolContext sc;
1633323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        target_symbols.GetContextAtIndex(i, sc);
1634323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
16353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                        ModuleSP module_sp (sc.symbol->CalculateSymbolContextModule());
16363508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                        if (module_sp)
16373508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton                             modules_to_search.AppendIfNeeded(module_sp);
163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
1639323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1640323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // If the original stub symbol is a resolver, then we don't want to break on the symbol with the
1641323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // original name, but instead on all the symbols it could resolve to since otherwise we would stop
1642323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // in the middle of the resolution...
1643323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // Note that the stub is not of the resolver type it will point to the equivalent symbol,
1644323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // not the original name, so in that case we don't need to do anything.
1645323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1646323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    if (orig_is_resolver)
164717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                    {
1648323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        target_symbols.Clear();
1649323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1650323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        FindEquivalentSymbols (current_symbol, modules_to_search, target_symbols);
165117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                    }
1652323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1653323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // FIXME - Make the Run to Address take multiple addresses, and
1654323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    // run to any of them.
1655323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    uint32_t num_symbols = target_symbols.GetSize();
1656323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                    if (num_symbols > 0)
165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
1658323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        std::vector<lldb::addr_t>  addresses;
1659323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        addresses.resize (num_symbols);
1660323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        for (uint32_t i = 0; i < num_symbols; i++)
1661323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        {
1662323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            SymbolContext context;
1663323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            AddressRange addr_range;
1664323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            if (target_symbols.GetContextAtIndex(i, context))
1665323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            {
1666323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                                context.GetAddressRange (eSymbolContextEverything, 0, false, addr_range);
1667f4124deeb9532044a38c0774ced872f2709347daGreg Clayton                                lldb::addr_t load_addr = addr_range.GetBaseAddress().GetLoadAddress(target_sp.get());
1668323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                                addresses[i] = load_addr;
1669323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            }
1670323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        }
1671323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        if (addresses.size() > 0)
1672323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            thread_plan_sp.reset (new ThreadPlanRunToAddress (thread, addresses, stop_others));
1673323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        else
167417454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                        {
1675323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            if (log)
1676323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                                log->Printf ("Couldn't resolve the symbol contexts.");
167717454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                        }
167817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                    }
167917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                    else
168017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                    {
168117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham                        if (log)
1682323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        {
1683323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                            log->Printf ("Found a resolver stub for: \"%s\" but could not find any symbols it resolves to.",
1684323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                                         trampoline_name.AsCString());
1685323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                        }
168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
168824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
168924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (log)
169124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
169224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        log->Printf ("Could not find symbol for trampoline target: \"%s\"", trampoline_name.AsCString());
169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
169817454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    else
169917454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    {
170017454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham        if (log)
170117454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham            log->Printf ("Could not find symbol for step through.");
170217454cfc6a757305a7d9d4c31313c38981b57b01Jim Ingham    }
170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return thread_plan_sp;
170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
170624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1707323ce42219c4b036e21212ce7d1398253a91e9dbJim Inghamsize_t
1708323ce42219c4b036e21212ce7d1398253a91e9dbJim InghamDynamicLoaderMacOSXDYLD::FindEquivalentSymbols (lldb_private::Symbol *original_symbol,
1709323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                                               lldb_private::ModuleList &images,
1710323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                                               lldb_private::SymbolContextList &equivalent_symbols)
1711323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham{
1712323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    const ConstString &trampoline_name = original_symbol->GetMangled().GetName(Mangled::ePreferMangled);
1713323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    if (!trampoline_name)
1714323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham        return 0;
1715323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1716323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    size_t initial_size = equivalent_symbols.GetSize();
1717323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1718323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    static const char *resolver_name_regex = "(_gc|_non_gc|\\$[A-Z0-9]+)$";
1719323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    std::string equivalent_regex_buf("^");
1720323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    equivalent_regex_buf.append (trampoline_name.GetCString());
1721323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    equivalent_regex_buf.append (resolver_name_regex);
1722323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1723323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    RegularExpression equivalent_name_regex (equivalent_regex_buf.c_str());
1724323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    const bool append = true;
1725323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    images.FindSymbolsMatchingRegExAndType (equivalent_name_regex, eSymbolTypeCode, equivalent_symbols, append);
1726323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
1727323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    return equivalent_symbols.GetSize() - initial_size;
1728323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham}
1729323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
17300baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonError
17310baa394cd55c6dfb7a6259d215d0dea2b708067bGreg ClaytonDynamicLoaderMacOSXDYLD::CanLoadImage ()
17320baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton{
17330baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    Error error;
17340baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    // In order for us to tell if we can load a shared library we verify that
17350baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    // the dylib_info_addr isn't zero (which means no shared libraries have
17360baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    // been set yet, or dyld is currently mucking with the shared library list).
17370baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    if (ReadAllImageInfosStructure ())
17380baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    {
17390baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        // TODO: also check the _dyld_global_lock_held variable in libSystem.B.dylib?
17400baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        // TODO: check the malloc lock?
17410baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        // TODO: check the objective C lock?
17420baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton        if (m_dyld_all_image_infos.dylib_info_addr != 0)
17430baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton            return error; // Success
17440baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    }
17450baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
17460baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    error.SetErrorString("unsafe to load or unload shared libraries");
17470baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    return error;
17480baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton}
17490baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::Initialize()
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::RegisterPlugin (GetPluginNameStatic(),
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   GetPluginDescriptionStatic(),
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                   CreateInstance);
175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::Terminate()
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PluginManager::UnregisterPlugin (CreateInstance);
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17650e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::GetPluginNameStatic()
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
17680e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static ConstString g_name("macosx-dyld");
17690e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    return g_name;
177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::GetPluginDescriptionStatic()
177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "Dynamic loader plug-in that watches for shared library loads/unloads in MacOSX user processes.";
177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// PluginInterface protocol
178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------
17820e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString
178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::GetPluginName()
178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return GetPluginNameStatic();
178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerDynamicLoaderMacOSXDYLD::GetPluginVersion()
179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return 1;
179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179449ce8969d3154e1560106cfe530444c09410f217Greg Claytonuint32_t
179549ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderMacOSXDYLD::AddrByteSize()
179649ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
179749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    switch (m_dyld.header.magic)
179849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
179949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32:
180049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32Swapped:
180149ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return 4;
180249ce8969d3154e1560106cfe530444c09410f217Greg Clayton
180349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64:
180449ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64Swapped:
180549ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return 8;
180649ce8969d3154e1560106cfe530444c09410f217Greg Clayton
180749ce8969d3154e1560106cfe530444c09410f217Greg Clayton        default:
180849ce8969d3154e1560106cfe530444c09410f217Greg Clayton            break;
180949ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
181049ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return 0;
181149ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
181249ce8969d3154e1560106cfe530444c09410f217Greg Clayton
181349ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder
181449ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderMacOSXDYLD::GetByteOrderFromMagic (uint32_t magic)
181549ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
181649ce8969d3154e1560106cfe530444c09410f217Greg Clayton    switch (magic)
181749ce8969d3154e1560106cfe530444c09410f217Greg Clayton    {
181849ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32:
181949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64:
182049ce8969d3154e1560106cfe530444c09410f217Greg Clayton            return lldb::endian::InlHostByteOrder();
182149ce8969d3154e1560106cfe530444c09410f217Greg Clayton
182249ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic32Swapped:
182349ce8969d3154e1560106cfe530444c09410f217Greg Clayton        case llvm::MachO::HeaderMagic64Swapped:
182449ce8969d3154e1560106cfe530444c09410f217Greg Clayton            if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
182549ce8969d3154e1560106cfe530444c09410f217Greg Clayton                return lldb::eByteOrderLittle;
182649ce8969d3154e1560106cfe530444c09410f217Greg Clayton            else
182749ce8969d3154e1560106cfe530444c09410f217Greg Clayton                return lldb::eByteOrderBig;
182849ce8969d3154e1560106cfe530444c09410f217Greg Clayton
182949ce8969d3154e1560106cfe530444c09410f217Greg Clayton        default:
183049ce8969d3154e1560106cfe530444c09410f217Greg Clayton            break;
183149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    }
183249ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return lldb::eByteOrderInvalid;
183349ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
183449ce8969d3154e1560106cfe530444c09410f217Greg Clayton
183549ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb::ByteOrder
183649ce8969d3154e1560106cfe530444c09410f217Greg ClaytonDynamicLoaderMacOSXDYLD::DYLDImageInfo::GetByteOrder()
183749ce8969d3154e1560106cfe530444c09410f217Greg Clayton{
183849ce8969d3154e1560106cfe530444c09410f217Greg Clayton    return DynamicLoaderMacOSXDYLD::GetByteOrderFromMagic(header.magic);
183949ce8969d3154e1560106cfe530444c09410f217Greg Clayton}
184049ce8969d3154e1560106cfe530444c09410f217Greg Clayton
1841