1 //===-- MachException.h -----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Created by Greg Clayton on 6/18/07.
12 //===----------------------------------------------------------------------===//
14 #ifndef __MachException_h__
15 #define __MachException_h__
17 #include <mach/mach.h>
23 typedef union MachMessageTag {
24 mach_msg_header_t hdr;
31 exception_mask_t mask; // the exception mask for this device which may be a
32 // subset of EXC_MASK_ALL...
33 exception_mask_t masks[EXC_TYPES_COUNT];
34 mach_port_t ports[EXC_TYPES_COUNT];
35 exception_behavior_t behaviors[EXC_TYPES_COUNT];
36 thread_state_flavor_t flavors[EXC_TYPES_COUNT];
37 mach_msg_type_number_t count;
39 kern_return_t Save(task_t task);
40 kern_return_t Restore(task_t task);
46 exception_type_t exc_type;
47 std::vector<mach_exception_data_type_t> exc_data;
49 : task_port(TASK_NULL), thread_port(THREAD_NULL), exc_type(0),
53 task_port = TASK_NULL;
54 thread_port = THREAD_NULL;
58 bool IsValid() const {
59 return task_port != TASK_NULL && thread_port != THREAD_NULL &&
62 // Return the SoftSignal for this MachException data, or zero if there is
64 int SoftSignal() const {
65 if (exc_type == EXC_SOFTWARE && exc_data.size() == 2 &&
66 exc_data[0] == EXC_SOFT_SIGNAL)
67 return static_cast<int>(exc_data[1]);
70 bool IsBreakpoint() const {
71 return (exc_type == EXC_BREAKPOINT ||
72 ((exc_type == EXC_SOFTWARE) && exc_data[0] == 1));
75 void DumpStopReason() const;
76 bool GetStopInfo(struct DNBThreadStopInfo *stop_info) const;
81 MachMessage reply_msg;
85 memset(&exc_msg, 0, sizeof(exc_msg));
86 memset(&reply_msg, 0, sizeof(reply_msg));
88 bool CatchExceptionRaise(task_t task);
90 kern_return_t Reply(MachProcess *process, int signal);
91 kern_return_t Receive(mach_port_t receive_port, mach_msg_option_t options,
92 mach_msg_timeout_t timeout,
93 mach_port_t notify_port = MACH_PORT_NULL);
95 typedef std::vector<Message> collection;
96 typedef collection::iterator iterator;
97 typedef collection::const_iterator const_iterator;
101 e_actionForward, // Forward signal to inferior process
102 e_actionStop, // Stop when this signal is received
105 task_t task_port; // Set to TASK_NULL for any TASK
106 thread_t thread_port; // Set to THREAD_NULL for any thread
107 exception_type_t exc_mask; // Mach exception mask to watch for
108 std::vector<mach_exception_data_type_t> exc_data_mask; // Mask to apply to
109 // exception data, or
111 // exc_data value for
113 std::vector<mach_exception_data_type_t> exc_data_value; // Value to compare
119 uint8_t flags; // Action flags describing what to do with the exception
121 static const char *Name(exception_type_t exc_type);