diff options
Diffstat (limited to 'lldb/tools/debugserver/source/ProfileObjectiveC.h')
-rw-r--r-- | lldb/tools/debugserver/source/ProfileObjectiveC.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/lldb/tools/debugserver/source/ProfileObjectiveC.h b/lldb/tools/debugserver/source/ProfileObjectiveC.h new file mode 100644 index 00000000000..8a5c13db32a --- /dev/null +++ b/lldb/tools/debugserver/source/ProfileObjectiveC.h @@ -0,0 +1,82 @@ +//===-- ProfileObjectiveC.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 10/4/07. +// +//===----------------------------------------------------------------------===// + +#ifndef __ProfileObjectiveC_h__ +#define __ProfileObjectiveC_h__ + +#include "DNB.h" +#include "DNBRuntimeAction.h" +#include <map> +#include <sys/time.h> + +class ProfileObjectiveC : public DNBRuntimeAction +{ +public: + ProfileObjectiveC(); + virtual ~ProfileObjectiveC(); + //------------------------------------------------------------------ + // 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: + typedef uint32_t objc_selector_t; + typedef uint32_t objc_class_ptr_t; + void Clear(); + static nub_bool_t MessageSendBreakpointCallback(nub_process_t pid, nub_thread_t tid, nub_break_t breakID, void *userData); + static nub_bool_t MessageSendSuperBreakpointCallback(nub_process_t pid, nub_thread_t tid, nub_break_t breakID, void *userData); + void DumpStats(nub_process_t pid, FILE *f); + void SetStartTime(); + void SelectorHit(objc_class_ptr_t isa, objc_selector_t sel); + typedef std::map<objc_selector_t, uint32_t> SelectorHitCount; + typedef std::map<objc_class_ptr_t, SelectorHitCount> ClassStatsMap; + typedef struct Probe + { + nub_addr_t addr; + nub_break_t breakID; + Probe() : addr(INVALID_NUB_ADDRESS), breakID(INVALID_NUB_BREAK_ID) {} + void Clear() + { + addr = INVALID_NUB_ADDRESS; + breakID = INVALID_NUB_BREAK_ID; + } + bool IsValid() const + { + return (addr != INVALID_NUB_ADDRESS) && (NUB_BREAK_ID_IS_VALID(breakID)); + } + }; + + uint32_t IncrementHitCount() { return ++m_hit_count; } + bool ShouldDumpStats() const { return m_dump_count && (m_hit_count % m_dump_count) == 0; } + + nub_process_t m_pid; + Probe m_objc_msgSend; + Probe m_objc_msgSendSuper; + uint32_t m_hit_count; // Number of times we have gotten one of our breakpoints hit + uint32_t m_dump_count; // Dump stats every time the hit count reaches a multiple of this value +#if defined (__powerpc__) || defined (__ppc__) + enum + { + k_opcode_size = 4 + }; + uint8_t m_objc_msgSend_opcode[k_opcode_size]; // Saved copy of first opcode in objc_msgSend + Probe m_objc_msgSend_rtp; // COMM page probe info for objc_msgSend +#endif + struct timeval m_begin_time; + ClassStatsMap m_objcStats; +}; + + +#endif // #ifndef __ProfileObjectiveC_h__ |