]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/tools/lldb/source/Plugins/Process/Darwin/MachException.h
MFV r337022:
[FreeBSD/FreeBSD.git] / contrib / llvm / tools / lldb / source / Plugins / Process / Darwin / MachException.h
1 //===-- MachException.h -----------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 //  Created by Greg Clayton on 6/18/07.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef __MachException_h__
15 #define __MachException_h__
16
17 #include <mach/mach.h>
18 #include <vector>
19
20 #include "lldb/Host/Debug.h"
21 #include "lldb/lldb-private-forward.h"
22 #include "lldb/lldb-types.h"
23
24 namespace lldb_private {
25 namespace process_darwin {
26
27 typedef union MachMessageTag {
28   mach_msg_header_t hdr;
29   char data[1024];
30 } MachMessage;
31
32 class MachException {
33 public:
34   struct PortInfo {
35     exception_mask_t mask; // the exception mask for this device which may be a
36                            // subset of EXC_MASK_ALL...
37     exception_mask_t masks[EXC_TYPES_COUNT];
38     mach_port_t ports[EXC_TYPES_COUNT];
39     exception_behavior_t behaviors[EXC_TYPES_COUNT];
40     thread_state_flavor_t flavors[EXC_TYPES_COUNT];
41     mach_msg_type_number_t count;
42
43     Status Save(task_t task);
44
45     Status Restore(task_t task);
46   };
47
48   struct Data {
49     task_t task_port;
50     thread_t thread_port;
51     exception_type_t exc_type;
52     std::vector<mach_exception_data_type_t> exc_data;
53     Data()
54         : task_port(TASK_NULL), thread_port(THREAD_NULL), exc_type(0),
55           exc_data() {}
56
57     void Clear() {
58       task_port = TASK_NULL;
59       thread_port = THREAD_NULL;
60       exc_type = 0;
61       exc_data.clear();
62     }
63
64     bool IsValid() const {
65       return task_port != TASK_NULL && thread_port != THREAD_NULL &&
66              exc_type != 0;
67     }
68
69     // Return the SoftSignal for this MachException data, or zero if there is
70     // none
71     int SoftSignal() const {
72       if (exc_type == EXC_SOFTWARE && exc_data.size() == 2 &&
73           exc_data[0] == EXC_SOFT_SIGNAL)
74         return static_cast<int>(exc_data[1]);
75       return 0;
76     }
77
78     bool IsBreakpoint() const {
79       return (exc_type == EXC_BREAKPOINT ||
80               ((exc_type == EXC_SOFTWARE) && exc_data[0] == 1));
81     }
82
83     bool GetStopInfo(ThreadStopInfo *stop_info, const UnixSignals &signals,
84                      Stream &stream) const;
85   };
86
87   struct Message {
88     MachMessage exc_msg;
89     MachMessage reply_msg;
90     Data state;
91
92     Message() : state() {
93       memset(&exc_msg, 0, sizeof(exc_msg));
94       memset(&reply_msg, 0, sizeof(reply_msg));
95     }
96
97     bool CatchExceptionRaise(task_t task);
98
99     Status Reply(::pid_t inferior_pid, task_t inferior_task, int signal);
100
101     Status Receive(mach_port_t receive_port, mach_msg_option_t options,
102                    mach_msg_timeout_t timeout,
103                    mach_port_t notify_port = MACH_PORT_NULL);
104
105     void Dump(Stream &stream) const;
106
107     typedef std::vector<Message> collection;
108     typedef collection::iterator iterator;
109     typedef collection::const_iterator const_iterator;
110   };
111
112   enum {
113     e_actionForward, // Forward signal to inferior process
114     e_actionStop,    // Stop when this signal is received
115   };
116   struct Action {
117     task_t task_port;          // Set to TASK_NULL for any TASK
118     thread_t thread_port;      // Set to THREAD_NULL for any thread
119     exception_type_t exc_mask; // Mach exception mask to watch for
120     std::vector<mach_exception_data_type_t> exc_data_mask; // Mask to apply to
121                                                            // exception data, or
122                                                            // empty to ignore
123                                                            // exc_data value for
124                                                            // exception
125     std::vector<mach_exception_data_type_t> exc_data_value; // Value to compare
126                                                             // to exception data
127                                                             // after masking, or
128                                                             // empty to ignore
129                                                             // exc_data value
130                                                             // for exception
131     uint8_t flags; // Action flags describing what to do with the exception
132   };
133
134   static const char *Name(exception_type_t exc_type);
135 };
136
137 } // namespace process_darwin
138 } // namespace lldb_private
139
140 #endif