1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
commit 762c974a09746bda8a5d64ed3ee887adeae742b9
Author: John Baldwin <jhb@FreeBSD.org>
Date: Wed Jun 28 08:14:06 2017 -0700
Implement the "get_siginfo_type" gdbarch method for FreeBSD architectures.
As with Linux architectures, cache the created type in the gdbarch when it
is first created. Currently FreeBSD uses an identical siginfo type on
all architectures, so there is no support for architecture-specific fields.
gdb/ChangeLog:
* fbsd-tdep.c (fbsd_gdbarch_data_handle, struct fbsd_gdbarch_data)
(init_fbsd_gdbarch_data, get_fbsd_gdbarch_data)
(fbsd_get_siginfo_type): New.
(fbsd_init_abi): Install gdbarch "get_siginfo_type" method.
(_initialize_fbsd_tdep): New.
diff --git gdb/fbsd-tdep.c gdb/fbsd-tdep.c
index b834ce38b4..24a3c20dd6 100644
--- gdb/fbsd-tdep.c
+++ gdb/fbsd-tdep.c
@@ -30,6 +30,26 @@
#include "fbsd-tdep.h"
+static struct gdbarch_data *fbsd_gdbarch_data_handle;
+
+struct fbsd_gdbarch_data
+ {
+ struct type *siginfo_type;
+ };
+
+static void *
+init_fbsd_gdbarch_data (struct gdbarch *gdbarch)
+{
+ return GDBARCH_OBSTACK_ZALLOC (gdbarch, struct fbsd_gdbarch_data);
+}
+
+static struct fbsd_gdbarch_data *
+get_fbsd_gdbarch_data (struct gdbarch *gdbarch)
+{
+ return ((struct fbsd_gdbarch_data *)
+ gdbarch_data (gdbarch, fbsd_gdbarch_data_handle));
+}
+
/* This is how we want PTIDs from core files to be printed. */
static const char *
@@ -314,6 +334,97 @@ fbsd_print_auxv_entry (struct gdbarch *gdbarch, struct ui_file *file,
fprint_auxv_entry (file, name, description, format, type, val);
}
+/* Implement the "get_siginfo_type" gdbarch method. */
+
+static struct type *
+fbsd_get_siginfo_type (struct gdbarch *gdbarch)
+{
+ struct fbsd_gdbarch_data *fbsd_gdbarch_data;
+ struct type *int_type, *int32_type, *uint32_type, *long_type, *void_ptr_type;
+ struct type *uid_type, *pid_type;
+ struct type *sigval_type, *reason_type;
+ struct type *siginfo_type;
+ struct type *type;
+
+ fbsd_gdbarch_data = get_fbsd_gdbarch_data (gdbarch);
+ if (fbsd_gdbarch_data->siginfo_type != NULL)
+ return fbsd_gdbarch_data->siginfo_type;
+
+ int_type = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch),
+ 0, "int");
+ int32_type = arch_integer_type (gdbarch, 32, 0, "int32_t");
+ uint32_type = arch_integer_type (gdbarch, 32, 1, "uint32_t");
+ long_type = arch_integer_type (gdbarch, gdbarch_long_bit (gdbarch),
+ 0, "long");
+ void_ptr_type = lookup_pointer_type (builtin_type (gdbarch)->builtin_void);
+
+ /* union sigval */
+ sigval_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
+ TYPE_NAME (sigval_type) = xstrdup ("sigval");
+ append_composite_type_field (sigval_type, "sival_int", int_type);
+ append_composite_type_field (sigval_type, "sival_ptr", void_ptr_type);
+
+ /* __pid_t */
+ pid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
+ TYPE_LENGTH (int32_type), "__pid_t");
+ TYPE_TARGET_TYPE (pid_type) = int32_type;
+ TYPE_TARGET_STUB (pid_type) = 1;
+
+ /* __uid_t */
+ uid_type = arch_type (gdbarch, TYPE_CODE_TYPEDEF,
+ TYPE_LENGTH (uint32_type), "__uid_t");
+ TYPE_TARGET_TYPE (uid_type) = uint32_type;
+ TYPE_TARGET_STUB (uid_type) = 1;
+
+ /* _reason */
+ reason_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_UNION);
+
+ /* _fault */
+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
+ append_composite_type_field (type, "si_trapno", int_type);
+ append_composite_type_field (reason_type, "_fault", type);
+
+ /* _timer */
+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
+ append_composite_type_field (type, "si_timerid", int_type);
+ append_composite_type_field (type, "si_overrun", int_type);
+ append_composite_type_field (reason_type, "_timer", type);
+
+ /* _mesgq */
+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
+ append_composite_type_field (type, "si_mqd", int_type);
+ append_composite_type_field (reason_type, "_mesgq", type);
+
+ /* _poll */
+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
+ append_composite_type_field (type, "si_band", long_type);
+ append_composite_type_field (reason_type, "_poll", type);
+
+ /* __spare__ */
+ type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
+ append_composite_type_field (type, "__spare1__", long_type);
+ append_composite_type_field (type, "__spare2__",
+ init_vector_type (int_type, 7));
+ append_composite_type_field (reason_type, "__spare__", type);
+
+ /* struct siginfo */
+ siginfo_type = arch_composite_type (gdbarch, NULL, TYPE_CODE_STRUCT);
+ TYPE_NAME (siginfo_type) = xstrdup ("siginfo");
+ append_composite_type_field (siginfo_type, "si_signo", int_type);
+ append_composite_type_field (siginfo_type, "si_errno", int_type);
+ append_composite_type_field (siginfo_type, "si_code", int_type);
+ append_composite_type_field (siginfo_type, "si_pid", pid_type);
+ append_composite_type_field (siginfo_type, "si_uid", uid_type);
+ append_composite_type_field (siginfo_type, "si_status", int_type);
+ append_composite_type_field (siginfo_type, "si_addr", void_ptr_type);
+ append_composite_type_field (siginfo_type, "si_value", sigval_type);
+ append_composite_type_field (siginfo_type, "_reason", reason_type);
+
+ fbsd_gdbarch_data->siginfo_type = siginfo_type;
+
+ return siginfo_type;
+}
+
/* Implement the "get_syscall_number" gdbarch method. */
static LONGEST
@@ -339,8 +450,19 @@ fbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
set_gdbarch_core_thread_name (gdbarch, fbsd_core_thread_name);
set_gdbarch_make_corefile_notes (gdbarch, fbsd_make_corefile_notes);
set_gdbarch_print_auxv_entry (gdbarch, fbsd_print_auxv_entry);
+ set_gdbarch_get_siginfo_type (gdbarch, fbsd_get_siginfo_type);
/* `catch syscall' */
set_xml_syscall_file_name (gdbarch, "syscalls/freebsd.xml");
set_gdbarch_get_syscall_number (gdbarch, fbsd_get_syscall_number);
}
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_fbsd_tdep;
+
+void
+_initialize_fbsd_tdep (void)
+{
+ fbsd_gdbarch_data_handle =
+ gdbarch_data_register_post_init (init_fbsd_gdbarch_data);
+}
|