summaryrefslogtreecommitdiffstats
path: root/lldb/tools/debugserver/source/MacOSX/MachDYLD.h
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/tools/debugserver/source/MacOSX/MachDYLD.h')
-rw-r--r--lldb/tools/debugserver/source/MacOSX/MachDYLD.h145
1 files changed, 145 insertions, 0 deletions
diff --git a/lldb/tools/debugserver/source/MacOSX/MachDYLD.h b/lldb/tools/debugserver/source/MacOSX/MachDYLD.h
new file mode 100644
index 00000000000..1c7747cd137
--- /dev/null
+++ b/lldb/tools/debugserver/source/MacOSX/MachDYLD.h
@@ -0,0 +1,145 @@
+//===-- MachDYLD.h ----------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// Created by Greg Clayton on 6/29/07.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef __MachDYLD_h__
+#define __MachDYLD_h__
+
+#include "DNBDefs.h"
+#include "DNBRuntimeAction.h"
+#include "PThreadMutex.h"
+#include <map>
+#include <vector>
+#include <string>
+
+class DNBBreakpoint;
+class MachProcess;
+
+class MachDYLD : public DNBRuntimeAction
+{
+public:
+ MachDYLD ();
+ virtual ~MachDYLD ();
+
+ //------------------------------------------------------------------
+ // DNBRuntimeAction required functions
+ //------------------------------------------------------------------
+ virtual void Initialize(nub_process_t pid);
+ virtual void ProcessStateChanged(nub_state_t state);
+ virtual void SharedLibraryStateChanged(DNBExecutableImageInfo *image_infos, nub_size_t num_image_infos);
+
+protected:
+ bool CheckForDYLDInMemory();
+ bool FoundDYLD() const;
+ void Clear();
+ void Dump(FILE *f) const;
+ nub_process_t ProcessID() const { return m_pid; }
+ uint32_t AddrByteSize() const { return m_addr_size; }
+ nub_size_t CopyCurrentShlibInfo(DNBExecutableImageInfo **image_infos);
+ nub_size_t CopyChangedShlibInfo(DNBExecutableImageInfo **image_infos);
+ nub_addr_t GetSharedLibraryHeaderAddress(const char *shlib_path) const;
+ bool CheckForDYLDInMemory(nub_addr_t addr);
+ bool ReadDYLIBInfo ();
+ static nub_bool_t BreakpointHit (nub_process_t pid, nub_thread_t tid, nub_break_t breakID, void *baton);
+ void UpdateUUIDs();
+
+ struct DYLIBInfo
+ {
+ nub_addr_t address; // Address of mach header for this dylib
+ nub_addr_t mod_date; // Modification date for this dylib
+ std::string path; // Resolved path for this dylib
+ uint8_t uuid[16]; // UUID for this dylib if it has one, else all zeros
+ std::vector<DNBSegment> segments; // All segment vmaddr and vmsize pairs for this executable (from memory of inferior)
+
+ DYLIBInfo() :
+ address(INVALID_NUB_ADDRESS),
+ mod_date(0),
+ path(),
+ segments()
+ {
+ memset(uuid, 0, 16);
+ }
+
+ void Clear()
+ {
+ address = INVALID_NUB_ADDRESS;
+ mod_date = 0;
+ path.clear();
+ segments.clear();
+ memset(uuid, 0, 16);
+ }
+
+ bool operator == (const DYLIBInfo& rhs) const
+ {
+ return address == rhs.address
+ && mod_date == rhs.mod_date
+ && path == rhs.path
+ && memcmp(uuid, rhs.uuid, 16) == 0;
+ }
+ bool UUIDValid() const
+ {
+ return uuid[ 0] || uuid[ 1] || uuid[ 2] || uuid[ 3] ||
+ uuid[ 4] || uuid[ 5] || uuid[ 6] || uuid[ 7] ||
+ uuid[ 8] || uuid[ 9] || uuid[10] || uuid[11] ||
+ uuid[12] || uuid[13] || uuid[14] || uuid[15];
+ }
+
+ void Dump(FILE *f) const;
+ typedef std::vector<DYLIBInfo> collection;
+ typedef collection::iterator iterator;
+ typedef collection::const_iterator const_iterator;
+ };
+ struct InfoHeader
+ {
+ uint32_t version; /* == 1 in Mac OS X 10.4, == 2 in Mac OS 10.5 */
+ uint32_t dylib_info_count;
+ nub_addr_t dylib_info_addr;
+ nub_addr_t notification;
+ bool processDetachedFromSharedRegion;
+
+ InfoHeader() :
+ version(0),
+ dylib_info_count(0),
+ dylib_info_addr(INVALID_NUB_ADDRESS),
+ notification(INVALID_NUB_ADDRESS),
+ processDetachedFromSharedRegion(false)
+ {
+ }
+
+ void Clear()
+ {
+ version = 0;
+ dylib_info_count = 0;
+ dylib_info_addr = INVALID_NUB_ADDRESS;
+ notification = INVALID_NUB_ADDRESS;
+ processDetachedFromSharedRegion = false;
+ }
+
+ bool IsValid() const
+ {
+ return version == 1 || version == 2;
+ }
+ };
+ static nub_size_t CopySharedLibraryInfo(DYLIBInfo::collection& dylib_coll, DNBExecutableImageInfo **image_infos);
+ static nub_size_t CopySharedInfoCallback(nub_process_t pid, struct DNBExecutableImageInfo **image_infos, nub_bool_t only_changed, void *baton);
+ nub_process_t m_pid;
+ uint32_t m_addr_size;
+ nub_addr_t m_dyld_addr;
+ nub_addr_t m_dyld_all_image_infos_addr;
+ InfoHeader m_dylib_info_header;
+ DYLIBInfo::collection m_current_dylibs; // Current shared libraries information
+ DYLIBInfo::collection m_changed_dylibs; // Shared libraries that changed since last shared library update
+ nub_break_t m_notify_break_id;
+ mutable PThreadMutex m_dyld_info_mutex;
+};
+
+#endif // #ifndef __MachDYLD_h__
OpenPOWER on IntegriCloud