12341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===-- DYLDRendezvous.h ----------------------------------------*- C++ -*-===//
22341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
32341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//                     The LLVM Compiler Infrastructure
42341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
52341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// This file is distributed under the University of Illinois Open Source
62341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// License. See LICENSE.TXT for details.
72341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//
82341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen//===----------------------------------------------------------------------===//
92341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#ifndef liblldb_Rendezvous_H_
112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#define liblldb_Rendezvous_H_
122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C Includes
142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// C++ Includes
152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <list>
162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include <string>
172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen// Other libraries and framework includes
192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/lldb-defines.h"
202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#include "lldb/lldb-types.h"
212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chennamespace lldb_private {
232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass Process;
242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen}
252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// @class DYLDRendezvous
272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// @brief Interface to the runtime linker.
282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen///
292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// A structure is present in a processes memory space which is updated by the
302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// runtime liker each time a module is loaded or unloaded.  This class provides
312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// an interface to this structure and maintains a consistent snapshot of the
322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen/// currently loaded modules.
332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenclass DYLDRendezvous {
342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // This structure is used to hold the contents of the debug rendezvous
362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // information (struct r_debug) as found in the inferiors memory.  Note that
372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // the layout of this struct is not binary compatible, it is simply large
382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // enough to hold the information on both 32 and 64 bit platforms.
392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    struct Rendezvous {
402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        uint64_t     version;
412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t map_addr;
422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t brk;
432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        uint64_t     state;
442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t ldbase;
452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        Rendezvous()
472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            : version(0), map_addr(0), brk(0), state(0), ldbase(0) { }
482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    };
492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic:
512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    DYLDRendezvous(lldb_private::Process *process);
522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Update the internal snapshot of runtime linker rendezvous and recompute
542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// the currently loaded modules.
552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// This method should be called once one start up, then once each time the
572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// runtime linker enters the function given by GetBreakAddress().
582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns true on success and false on failure.
602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @see GetBreakAddress().
622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Resolve();
642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns true if this rendezvous has been located in the inferiors
662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// address space and false otherwise.
672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    IsValid();
692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns the address of the rendezvous structure in the inferiors
712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// address space.
722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::addr_t
732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetRendezvousAddress() const { return m_rendezvous_addr; }
742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns the version of the rendezvous protocol being used.
7636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    uint64_t
772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetVersion() const { return m_current.version; }
782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns address in the inferiors address space containing the linked
802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// list of shared object descriptors.
812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::addr_t
822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetLinkMapAddress() const { return m_current.map_addr; }
832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// A breakpoint should be set at this address and Resolve called on each
852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// hit.
862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns the address of a function called by the runtime linker each
882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// time a module is loaded/unloaded, or about to be loaded/unloaded.
892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @see Resolve()
912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::addr_t
922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetBreakAddress() const { return m_current.brk; }
932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Returns the current state of the rendezvous structure.
9536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    uint64_t
962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetState() const { return m_current.state; }
972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns the base address of the runtime linker in the inferiors address
992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// space.
1002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::addr_t
1012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    GetLDBase() const { return m_current.ldbase; }
1022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns true if modules have been loaded into the inferior since the
1042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// last call to Resolve().
1052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
1062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ModulesDidLoad() const { return !m_added_soentries.empty(); }
1072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns true if modules have been unloaded from the inferior since the
1092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// last call to Resolve().
1102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
1112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ModulesDidUnload() const { return !m_removed_soentries.empty(); }
1122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    void
114952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    DumpToLog(lldb_private::Log *log) const;
1152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @brief Constants describing the state of the rendezvous.
1172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
1182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @see GetState().
1192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    enum RendezvousState {
1202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        eConsistent,
1212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        eAdd,
1222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        eDelete
1232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    };
1242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @brief Structure representing the shared objects currently loaded into
1262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// the inferior process.
1272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
1282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// This object is a rough analogue to the struct link_map object which
1292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// actually lives in the inferiors memory.
1302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    struct SOEntry {
1312341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t base_addr; ///< Base address of the loaded object.
1322341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t path_addr; ///< String naming the shared object.
1332341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t dyn_addr;  ///< Dynamic section of shared object.
1342341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t next;      ///< Address of next so_entry.
1352341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        lldb::addr_t prev;      ///< Address of previous so_entry.
1362341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        std::string  path;      ///< File name of shared object.
1372341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1382341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        SOEntry() { clear(); }
1392341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1402341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        bool operator ==(const SOEntry &entry) {
1412341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            return this->path == entry.path;
1422341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        }
1432341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1442341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        void clear() {
1452341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            base_addr = 0;
1462341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            path_addr = 0;
1472341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            dyn_addr  = 0;
1482341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            next = 0;
1492341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            prev = 0;
1502341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen            path.clear();
1512341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen        }
1522341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    };
1532341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1542341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprotected:
1552341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    typedef std::list<SOEntry> SOEntryList;
1562341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1572341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenpublic:
1582341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    typedef SOEntryList::const_iterator iterator;
1592341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1602341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Iterators over all currently loaded modules.
1612341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    iterator begin() const { return m_soentries.begin(); }
1622341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    iterator end() const { return m_soentries.end(); }
1632341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1642341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Iterators over all modules loaded into the inferior since the last call
1652341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// to Resolve().
1662341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    iterator loaded_begin() const { return m_added_soentries.begin(); }
1672341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    iterator loaded_end() const { return m_added_soentries.end(); }
1682341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1692341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Iterators over all modules unloaded from the inferior since the last
1702341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// call to Resolve().
1712341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    iterator unloaded_begin() const { return m_removed_soentries.begin(); }
1722341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    iterator unloaded_end() const { return m_removed_soentries.end(); }
1732341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1742341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chenprotected:
1752341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb_private::Process *m_process;
1762341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1772341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    // Cached copy of executable pathname
1782341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    char m_exe_path[PATH_MAX];
1792341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1802341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Location of the r_debug structure in the inferiors address space.
1812341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::addr_t m_rendezvous_addr;
1822341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1832341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Current and previous snapshots of the rendezvous structure.
1842341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Rendezvous m_current;
1852341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    Rendezvous m_previous;
1862341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1872341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// List of SOEntry objects corresponding to the current link map state.
1882341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SOEntryList m_soentries;
1892341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1902341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// List of SOEntry's added to the link map since the last call to Resolve().
1912341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SOEntryList m_added_soentries;
1922341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1932341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// List of SOEntry's removed from the link map since the last call to
1942341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Resolve().
1952341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    SOEntryList m_removed_soentries;
1962341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
1972341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Reads @p size bytes from the inferiors address space starting at @p
1982341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// addr.
1992341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ///
2002341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// @returns addr + size if the read was successful and false otherwise.
2012341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    lldb::addr_t
2022341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ReadMemory(lldb::addr_t addr, void *dst, size_t size);
2032341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2042341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Reads a null-terminated C string from the memory location starting at @p
2052341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// addr.
2062341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    std::string
2072341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ReadStringFromMemory(lldb::addr_t addr);
2082341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2092341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Reads an SOEntry starting at @p addr.
2102341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
2112341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    ReadSOEntryFromMemory(lldb::addr_t addr, SOEntry &entry);
2122341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2132341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Updates the current set of SOEntries, the set of added entries, and the
2142341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// set of removed entries.
2152341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
2162341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    UpdateSOEntries();
2172341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2182341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
2192341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    UpdateSOEntriesForAddition();
2202341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2212341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
2222341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    UpdateSOEntriesForDeletion();
2232341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2242341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// Reads the current list of shared objects according to the link map
2252341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    /// supplied by the runtime linker.
2262341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    bool
2272341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen    TakeSnapshot(SOEntryList &entry_list);
2282341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen};
2292341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen
2302341d35bc77ffa8597a85b1ffe50b5653a2ec46dJohnny Chen#endif
231