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
400e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    static lldb_private::ConstString
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
650bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    virtual bool
660bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    ProcessDidExec ();
670bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual lldb::ThreadPlanSP
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetStepThroughTrampolinePlan (lldb_private::Thread &thread,
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                  bool stop_others);
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    virtual size_t
73323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham    FindEquivalentSymbols (lldb_private::Symbol *original_symbol,
74323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                           lldb_private::ModuleList &module_list,
75323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham                           lldb_private::SymbolContextList &equivalent_symbols);
76323ce42219c4b036e21212ce7d1398253a91e9dbJim Ingham
770baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    virtual lldb_private::Error
780baa394cd55c6dfb7a6259d215d0dea2b708067bGreg Clayton    CanLoadImage ();
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // PluginInterface protocol
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
830e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton    virtual lldb_private::ConstString
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginName();
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual uint32_t
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetPluginVersion();
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8984985174d8b0fe4913caf446f7789f1531317650Jason Molenda    virtual bool
9084985174d8b0fe4913caf446f7789f1531317650Jason Molenda    AlwaysRelyOnEHUnwindInfo (lldb_private::SymbolContext &sym_ctx);
9184985174d8b0fe4913caf446f7789f1531317650Jason Molenda
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PrivateInitialize (lldb_private::Process *process);
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PrivateProcessStateChanged (lldb_private::Process *process,
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                lldb::StateType state);
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LocateDYLD ();
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DidSetNotificationBreakpoint () const;
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Clear (bool clear_process);
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    PutToLog (lldb_private::Log *log) const;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadDYLDInfoFromMemoryAndSetNotificationCallback (lldb::addr_t addr);
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static bool
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NotifyBreakpointHit (void *baton,
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb_private::StoppointCallbackContext *context,
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb::user_id_t break_id,
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                         lldb::user_id_t break_loc_id);
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
12149ce8969d3154e1560106cfe530444c09410f217Greg Clayton    AddrByteSize();
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static lldb::ByteOrder
12449ce8969d3154e1560106cfe530444c09410f217Greg Clayton    GetByteOrderFromMagic (uint32_t magic);
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadMachHeader (lldb::addr_t addr,
1281674b12bbc3dae7b9543b8c5f958e90ddc767fa4Greg Clayton                    llvm::MachO::mach_header *header,
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    lldb_private::DataExtractor *load_command_data);
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    class Segment
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Segment() :
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            name(),
1366e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            vmaddr(LLDB_INVALID_ADDRESS),
1376e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            vmsize(0),
1386e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            fileoff(0),
1396e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            filesize(0),
1406e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            maxprot(0),
1416e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            initprot(0),
1426e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            nsects(0),
1436e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            flags(0)
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb_private::ConstString name;
1486e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        lldb::addr_t vmaddr;
1496e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        lldb::addr_t vmsize;
1506e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        lldb::addr_t fileoff;
1516e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        lldb::addr_t filesize;
1526e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        uint32_t maxprot;
1536e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        uint32_t initprot;
1546e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        uint32_t nsects;
1556e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton        uint32_t flags;
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        operator==(const Segment& rhs) const
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1606e3dc10663891a232585968ddd3b19df563dbb96Greg Clayton            return name == rhs.name && vmaddr == rhs.vmaddr && vmsize == rhs.vmsize;
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        PutToLog (lldb_private::Log *log,
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                  lldb::addr_t slide) const;
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct DYLDImageInfo
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
171ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb::addr_t address;               // Address of mach header for this dylib
172ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb::addr_t slide;                 // The amount to slide all segments by if there is a global slide.
173ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb::addr_t mod_date;              // Modification date for this dylib
174ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb_private::FileSpec file_spec;   // Resolved path for this dylib
175ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        lldb_private::UUID uuid;            // UUID for this dylib if it has one, else all zeros
176ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        llvm::MachO::mach_header header;    // The mach header for this image
177ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton        std::vector<Segment> segments;      // All segment vmaddr and vmsize pairs for this executable (from memory of inferior)
1782ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton        uint32_t load_stop_id;              // The process stop ID that the sections for this image were loadeded
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DYLDImageInfo() :
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            address(LLDB_INVALID_ADDRESS),
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            slide(0),
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            mod_date(0),
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            file_spec(),
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uuid(),
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            header(),
1872ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            segments(),
1882ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            load_stop_id(0)
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Clear(bool load_cmd_data_only)
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!load_cmd_data_only)
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                address = LLDB_INVALID_ADDRESS;
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                slide = 0;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                mod_date = 0;
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                file_spec.Clear();
201ddff7cca4b3d2507706ed9011e6f0a503b984195Greg Clayton                ::memset (&header, 0, sizeof(header));
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            uuid.Clear();
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            segments.clear();
2052ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton            load_stop_id = 0;
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        operator == (const DYLDImageInfo& rhs) const
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return  address == rhs.address
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && slide == rhs.slide
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && mod_date == rhs.mod_date
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && file_spec == rhs.file_spec
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && uuid == rhs.uuid
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && memcmp(&header, &rhs.header, sizeof(header)) == 0
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                && segments == rhs.segments;
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        UUIDValid() const
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return uuid.IsValid();
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        uint32_t
22720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        GetAddressByteSize ()
22820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        {
22920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            if (header.cputype)
23020d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            {
23120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                if (header.cputype & llvm::MachO::CPUArchABI64)
23220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    return 8;
23320d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                else
23420d338fad87eba91de65aa9bec76e01c04472848Greg Clayton                    return 4;
23520d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            }
23620d338fad87eba91de65aa9bec76e01c04472848Greg Clayton            return 0;
23720d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        }
23820d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
23920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton        lldb::ByteOrder
24049ce8969d3154e1560106cfe530444c09410f217Greg Clayton        GetByteOrder();
24120d338fad87eba91de65aa9bec76e01c04472848Greg Clayton
24224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        lldb_private::ArchSpec
24324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        GetArchitecture () const
24424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        {
24524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton            return lldb_private::ArchSpec (lldb_private::eArchTypeMachO, header.cputype, header.cpusubtype);
24624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton        }
24724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const Segment *
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        FindSegment (const lldb_private::ConstString &name) const;
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        PutToLog (lldb_private::Log *log) const;
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef std::vector<DYLDImageInfo> collection;
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::iterator iterator;
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        typedef collection::const_iterator const_iterator;
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct DYLDAllImageInfos
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t version;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        uint32_t dylib_info_count;              // Version >= 1
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t dylib_info_addr;           // Version >= 1
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t notification;              // Version >= 1
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool processDetachedFromSharedRegion;   // Version >= 1
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool libSystemInitialized;              // Version >= 2
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        lldb::addr_t dyldImageLoadAddress;      // Version >= 2
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        DYLDAllImageInfos() :
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            version (0),
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_count (0),
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_addr (LLDB_INVALID_ADDRESS),
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            notification (LLDB_INVALID_ADDRESS),
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            processDetachedFromSharedRegion (false),
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            libSystemInitialized (false),
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dyldImageLoadAddress (LLDB_INVALID_ADDRESS)
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        void
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Clear()
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            version = 0;
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_count = 0;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dylib_info_addr = LLDB_INVALID_ADDRESS;
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            notification = LLDB_INVALID_ADDRESS;
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            processDetachedFromSharedRegion = false;
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            libSystemInitialized = false;
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            dyldImageLoadAddress = LLDB_INVALID_ADDRESS;
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        IsValid() const
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return version >= 1 || version <= 6;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    };
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RegisterNotificationCallbacks();
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UnregisterNotificationCallbacks();
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ParseLoadCommands (const lldb_private::DataExtractor& data,
30724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                       DYLDImageInfo& dylib_info,
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       lldb_private::FileSpec *lc_id_dylinker);
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UpdateImageLoadAddress(lldb_private::Module *module,
31224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                           DYLDImageInfo& info);
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    UnloadImageLoadAddress (lldb_private::Module *module,
31624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                            DYLDImageInfo& info);
31724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
31824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    lldb::ModuleSP
3192ddb2b8aed6d43665c6955255f6a077574a08412Greg Clayton    FindTargetModuleForDYLDImageInfo (DYLDImageInfo &image_info,
32024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                      bool can_create,
32124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton                                      bool *did_create_ptr);
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
323ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton    DYLDImageInfo *
32424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    GetImageInfo (lldb_private::Module *module);
325ab429022ca0f47e4bd2ae1dc70f315e4824d5ae1Greg Clayton
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NeedToLocateDYLD () const;
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    SetNotificationBreakpoint ();
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
332e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // There is a little tricky bit where you might initially attach while dyld is updating
333e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // the all_image_infos, and you can't read the infos, so you have to continue and pick it
334e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // up when you hit the update breakpoint.  At that point, you need to run this initialize
335e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // function, but when you do it that way you DON'T need to do the extra work you would at
336e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // the breakpoint.
337e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // So this function will only do actual work if the image infos haven't been read yet.
338e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // If it does do any work, then it will return true, and false otherwise.  That way you can
339e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    // call it in the breakpoint action, and if it returns true you're done.
340e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    bool
341e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    InitializeFromAllImageInfos ();
342e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ReadAllImageInfosStructure ();
345e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
346e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    bool
347e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    AddModulesUsingImageInfosAddress (lldb::addr_t image_infos_addr, uint32_t image_infos_count);
348e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
349e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    bool
350e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    AddModulesUsingImageInfos (DYLDImageInfo::collection &image_infos);
351e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
352e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    bool
353e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    RemoveModulesUsingImageInfosAddress (lldb::addr_t image_infos_addr, uint32_t image_infos_count);
354e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
355e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    void
356e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    UpdateImageInfosHeaderAndLoadCommands(DYLDImageInfo::collection &image_infos,
357e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                          uint32_t infos_count,
358e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                                          bool update_executable);
359e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
360e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    bool
361e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham    ReadImageInfos (lldb::addr_t image_infos_addr,
362e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    uint32_t image_infos_count,
363e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham                    DYLDImageInfo::collection &image_infos);
364e6bd142d9fa7ed149bd37efd8a75637375f165b7Jim Ingham
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3665d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    DYLDImageInfo m_dyld;               // Info about the current dyld being used
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::addr_t m_dyld_all_image_infos_addr;
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DYLDAllImageInfos m_dyld_all_image_infos;
36920d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    uint32_t m_dyld_all_image_infos_stop_id;
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb::user_id_t m_break_id;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DYLDImageInfo::collection m_dyld_image_infos;   // Current shared libraries information
37220d338fad87eba91de65aa9bec76e01c04472848Greg Clayton    uint32_t m_dyld_image_infos_stop_id;    // The process stop ID that "m_dyld_image_infos" is valid for
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mutable lldb_private::Mutex m_mutex;
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    lldb_private::Process::Notifications m_notification_callbacks;
3750bce9a22354df3f00e68ffd912119a0741753b7fGreg Clayton    bool m_process_image_addr_is_all_images_infos;
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DISALLOW_COPY_AND_ASSIGN (DynamicLoaderMacOSXDYLD);
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_DynamicLoaderMacOSXDYLD_h_
382