DynamicLoaderMacOSXDYLD.h revision 24bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- DynamicLoaderMacOSXDYLD.h -------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_DynamicLoaderMacOSXDYLD_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_DynamicLoaderMacOSXDYLD_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
201674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton#include "llvm/Support/MachO.h"
211674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/DynamicLoader.h"
235f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/UUID.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Host/Mutex.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
271674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass DynamicLoaderMacOSXDYLD : public lldb_private::DynamicLoader
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Static Functions
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Initialize();
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static void
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Terminate();
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginNameStatic();
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static const char *
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginDescriptionStatic();
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static lldb_private::DynamicLoader *
4775c703dd8b492bad25a987b96853626641ae7246Greg Clayton    CreateInstance (lldb_private::Process *process, bool force);
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DynamicLoaderMacOSXDYLD (lldb_private::Process *process);
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~DynamicLoaderMacOSXDYLD ();
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Called after attaching a process.
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Allow DynamicLoader plug-ins to execute some code after
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// attaching to a process.
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidAttach ();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual void
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidLaunch ();
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::ThreadPlanSP
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStepThroughTrampolinePlan (lldb_private::Thread &thread,
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                  bool stop_others);
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
690baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    virtual lldb_private::Error
700baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    CanLoadImage ();
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // PluginInterface protocol
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginName();
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual const char *
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetShortPluginName();
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginVersion();
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PrivateInitialize (lldb_private::Process *process);
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PrivateProcessStateChanged (lldb_private::Process *process,
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                lldb::StateType state);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LocateDYLD ();
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidSetNotificationBreakpoint () const;
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear (bool clear_process);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutToLog (lldb_private::Log *log) const;
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadDYLDInfoFromMemoryAndSetNotificationCallback (lldb::addr_t addr);
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateAllImageInfos ();
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NotifyBreakpointHit (void *baton,
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb_private::StoppointCallbackContext *context,
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb::user_id_t break_id,
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb::user_id_t break_loc_id);
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateAllImageInfosHeaderAndLoadCommands ();
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateCommPageLoadAddress (lldb_private::Module *module);
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    AddrByteSize()
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (m_dyld.header.magic)
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1251674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic32:
1261674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic32Swapped:
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 4;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1291674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic64:
1301674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic64Swapped:
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 8;
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return 0;
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static lldb::ByteOrder
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetByteOrderFromMagic (uint32_t magic)
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (magic)
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1441674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic32:
1451674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic64:
146cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                return lldb::endian::InlHostByteOrder();
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1481674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic32Swapped:
1491674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton            case llvm::MachO::HeaderMagic64Swapped:
150cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderBig)
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return lldb::eByteOrderLittle;
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                else
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    return lldb::eByteOrderBig;
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            default:
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                break;
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return lldb::eByteOrderInvalid;
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadMachHeader (lldb::addr_t addr,
1631674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    llvm::MachO::mach_header *header,
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb_private::DataExtractor *load_command_data);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class Segment
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Segment() :
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            name(),
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            addr(LLDB_INVALID_ADDRESS),
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size(0)
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb_private::ConstString name;
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t addr;
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t size;
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        operator==(const Segment& rhs) const
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return name == rhs.name && addr == rhs.addr && size == rhs.size;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        PutToLog (lldb_private::Log *log,
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                  lldb::addr_t slide) const;
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct DYLDImageInfo
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
194ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb::addr_t address;               // Address of mach header for this dylib
195ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb::addr_t slide;                 // The amount to slide all segments by if there is a global slide.
196ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb::addr_t mod_date;              // Modification date for this dylib
197ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb_private::FileSpec file_spec;   // Resolved path for this dylib
198ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb_private::UUID uuid;            // UUID for this dylib if it has one, else all zeros
199ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        llvm::MachO::mach_header header;    // The mach header for this image
200ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        std::vector<Segment> segments;      // All segment vmaddr and vmsize pairs for this executable (from memory of inferior)
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DYLDImageInfo() :
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            address(LLDB_INVALID_ADDRESS),
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            slide(0),
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            mod_date(0),
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            file_spec(),
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uuid(),
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            header(),
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            segments()
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Clear(bool load_cmd_data_only)
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!load_cmd_data_only)
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                address = LLDB_INVALID_ADDRESS;
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                slide = 0;
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                mod_date = 0;
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                file_spec.Clear();
222ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton                ::memset (&header, 0, sizeof(header));
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uuid.Clear();
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            segments.clear();
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        operator == (const DYLDImageInfo& rhs) const
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return  address == rhs.address
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && slide == rhs.slide
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && mod_date == rhs.mod_date
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && file_spec == rhs.file_spec
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && uuid == rhs.uuid
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && memcmp(&header, &rhs.header, sizeof(header)) == 0
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && segments == rhs.segments;
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        UUIDValid() const
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return uuid.IsValid();
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        uint32_t
24720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        GetAddressByteSize ()
24820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        {
24920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            if (header.cputype)
25020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            {
25120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                if (header.cputype & llvm::MachO::CPUArchABI64)
25220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    return 8;
25320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                else
25420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    return 4;
25520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            }
25620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            return 0;
25720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        }
25820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
25920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        lldb::ByteOrder
26020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        GetByteOrder()
26120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        {
26220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            switch (header.magic)
26320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            {
26420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            case llvm::MachO::HeaderMagic32:        // MH_MAGIC
26520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            case llvm::MachO::HeaderMagic64:        // MH_MAGIC_64
266cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                return lldb::endian::InlHostByteOrder();
26720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
26820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            case llvm::MachO::HeaderMagic32Swapped: // MH_CIGAM
26920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            case llvm::MachO::HeaderMagic64Swapped: // MH_CIGAM_64
270cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton                if (lldb::endian::InlHostByteOrder() == lldb::eByteOrderLittle)
27120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    return lldb::eByteOrderBig;
27220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                else
27320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    return lldb::eByteOrderLittle;
27420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            default:
27520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                assert (!"invalid header.magic value");
27620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                break;
27720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            }
278cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton            return lldb::endian::InlHostByteOrder();
27920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        }
28020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
28124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        lldb_private::ArchSpec
28224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetArchitecture () const
28324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
28424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return lldb_private::ArchSpec (lldb_private::eArchTypeMachO, header.cputype, header.cpusubtype);
28524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
28624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const Segment *
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        FindSegment (const lldb_private::ConstString &name) const;
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        PutToLog (lldb_private::Log *log) const;
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef std::vector<DYLDImageInfo> collection;
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::iterator iterator;
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::const_iterator const_iterator;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct DYLDAllImageInfos
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t version;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t dylib_info_count;              // Version >= 1
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t dylib_info_addr;           // Version >= 1
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t notification;              // Version >= 1
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool processDetachedFromSharedRegion;   // Version >= 1
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool libSystemInitialized;              // Version >= 2
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t dyldImageLoadAddress;      // Version >= 2
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DYLDAllImageInfos() :
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            version (0),
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_count (0),
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_addr (LLDB_INVALID_ADDRESS),
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            notification (LLDB_INVALID_ADDRESS),
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            processDetachedFromSharedRegion (false),
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            libSystemInitialized (false),
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dyldImageLoadAddress (LLDB_INVALID_ADDRESS)
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Clear()
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            version = 0;
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_count = 0;
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_addr = LLDB_INVALID_ADDRESS;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            notification = LLDB_INVALID_ADDRESS;
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            processDetachedFromSharedRegion = false;
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            libSystemInitialized = false;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dyldImageLoadAddress = LLDB_INVALID_ADDRESS;
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IsValid() const
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return version >= 1 || version <= 6;
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RegisterNotificationCallbacks();
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UnregisterNotificationCallbacks();
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ParseLoadCommands (const lldb_private::DataExtractor& data,
34624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                       DYLDImageInfo& dylib_info,
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       lldb_private::FileSpec *lc_id_dylinker);
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateImageLoadAddress(lldb_private::Module *module,
35124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           DYLDImageInfo& info);
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UnloadImageLoadAddress (lldb_private::Module *module,
35524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            DYLDImageInfo& info);
35624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
35724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    lldb::ModuleSP
35824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    FindTargetModuleForDYLDImageInfo (const DYLDImageInfo &image_info,
35924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                      bool can_create,
36024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                      bool *did_create_ptr);
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
362ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton    DYLDImageInfo *
36324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    GetImageInfo (lldb_private::Module *module);
364ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NeedToLocateDYLD () const;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetNotificationBreakpoint ();
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadAllImageInfosStructure ();
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3745d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    DYLDImageInfo m_dyld;               // Info about the current dyld being used
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t m_dyld_all_image_infos_addr;
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DYLDAllImageInfos m_dyld_all_image_infos;
37720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    uint32_t m_dyld_all_image_infos_stop_id;
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t m_break_id;
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DYLDImageInfo::collection m_dyld_image_infos;   // Current shared libraries information
38020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    uint32_t m_dyld_image_infos_stop_id;    // The process stop ID that "m_dyld_image_infos" is valid for
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable lldb_private::Mutex m_mutex;
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Process::Notifications m_notification_callbacks;
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (DynamicLoaderMacOSXDYLD);
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_DynamicLoaderMacOSXDYLD_h_
389