]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/m2-lang.c
gdb: move a bunch of quit-related things to event-top.{c,h}
[thirdparty/binutils-gdb.git] / gdb / m2-lang.c
CommitLineData
c906108c 1/* Modula 2 language support routines for GDB, the GNU debugger.
ce27fb25 2
1d506c26 3 Copyright (C) 1992-2024 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
c5aa993b 10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b 17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c 19
e5dc0d5d 20#include "event-top.h"
c906108c
SS
21#include "symtab.h"
22#include "gdbtypes.h"
23#include "expression.h"
24#include "parser-defs.h"
25#include "language.h"
a53b64ea 26#include "varobj.h"
c906108c
SS
27#include "m2-lang.h"
28#include "c-lang.h"
745b8ca0 29#include "valprint.h"
0d12e84c 30#include "gdbarch.h"
2bc9b40c 31#include "m2-exp.h"
c906108c 32
41bdced5
TT
33/* A helper function for UNOP_HIGH. */
34
2bc9b40c 35struct value *
41bdced5
TT
36eval_op_m2_high (struct type *expect_type, struct expression *exp,
37 enum noside noside,
38 struct value *arg1)
39{
0b2b0b82 40 if (noside == EVAL_AVOID_SIDE_EFFECTS)
41bdced5
TT
41 return arg1;
42 else
43 {
44 arg1 = coerce_ref (arg1);
d0c97917 45 struct type *type = check_typedef (arg1->type ());
41bdced5
TT
46
47 if (m2_is_unbounded_array (type))
48 {
49 struct value *temp = arg1;
50
51 type = type->field (1).type ();
52 /* i18n: Do not translate the "_m2_high" part! */
158cc4fe 53 arg1 = value_struct_elt (&temp, {}, "_m2_high", NULL,
41bdced5
TT
54 _("unbounded structure "
55 "missing _m2_high field"));
56
d0c97917 57 if (arg1->type () != type)
41bdced5
TT
58 arg1 = value_cast (type, arg1);
59 }
60 }
61 return arg1;
62}
63
a49881f7
TT
64/* A helper function for BINOP_SUBSCRIPT. */
65
2bc9b40c 66struct value *
a49881f7
TT
67eval_op_m2_subscript (struct type *expect_type, struct expression *exp,
68 enum noside noside,
69 struct value *arg1, struct value *arg2)
70{
a49881f7
TT
71 /* If the user attempts to subscript something that is not an
72 array or pointer type (like a plain int variable for example),
73 then report this as an error. */
74
75 arg1 = coerce_ref (arg1);
d0c97917 76 struct type *type = check_typedef (arg1->type ());
a49881f7
TT
77
78 if (m2_is_unbounded_array (type))
79 {
80 struct value *temp = arg1;
81 type = type->field (0).type ();
82 if (type == NULL || (type->code () != TYPE_CODE_PTR))
83 error (_("internal error: unbounded "
84 "array structure is unknown"));
85 /* i18n: Do not translate the "_m2_contents" part! */
158cc4fe 86 arg1 = value_struct_elt (&temp, {}, "_m2_contents", NULL,
a49881f7
TT
87 _("unbounded structure "
88 "missing _m2_contents field"));
89
d0c97917 90 if (arg1->type () != type)
a49881f7
TT
91 arg1 = value_cast (type, arg1);
92
d0c97917 93 check_typedef (arg1->type ());
a49881f7
TT
94 return value_ind (value_ptradd (arg1, value_as_long (arg2)));
95 }
96 else
97 if (type->code () != TYPE_CODE_ARRAY)
98 {
99 if (type->name ())
100 error (_("cannot subscript something of type `%s'"),
101 type->name ());
102 else
103 error (_("cannot subscript requested type"));
104 }
105
106 if (noside == EVAL_AVOID_SIDE_EFFECTS)
736355f2 107 return value::zero (type->target_type (), arg1->lval ());
a49881f7
TT
108 else
109 return value_subscript (arg1, value_as_long (arg2));
110}
111
c906108c 112\f
c5aa993b 113
790e2a12 114/* Single instance of the M2 language. */
d711ee67 115
790e2a12 116static m2_language m2_language_defn;
4ffc13fb 117
790e2a12 118/* See language.h. */
4ffc13fb 119
790e2a12
AB
120void
121m2_language::language_arch_info (struct gdbarch *gdbarch,
122 struct language_arch_info *lai) const
123{
124 const struct builtin_m2_type *builtin = builtin_m2_type (gdbarch);
125
7bea47f0
AB
126 /* Helper function to allow shorter lines below. */
127 auto add = [&] (struct type * t)
128 {
129 lai->add_primitive_type (t);
130 };
131
132 add (builtin->builtin_char);
133 add (builtin->builtin_int);
134 add (builtin->builtin_card);
135 add (builtin->builtin_real);
136 add (builtin->builtin_bool);
137
138 lai->set_string_char_type (builtin->builtin_char);
139 lai->set_bool_type (builtin->builtin_bool, "BOOLEAN");
790e2a12 140}
4ffc13fb 141
33b5899f 142/* See language.h. */
39e7ecca 143
790e2a12
AB
144void
145m2_language::printchar (int c, struct type *type,
146 struct ui_file *stream) const
147{
0426ad51 148 gdb_puts ("'", stream);
790e2a12 149 emitchar (c, type, stream, '\'');
0426ad51 150 gdb_puts ("'", stream);
790e2a12 151}
39e7ecca 152
790e2a12 153/* See language.h. */
39e7ecca 154
790e2a12
AB
155void
156m2_language::printstr (struct ui_file *stream, struct type *elttype,
157 const gdb_byte *string, unsigned int length,
158 const char *encoding, int force_ellipses,
159 const struct value_print_options *options) const
160{
161 unsigned int i;
162 unsigned int things_printed = 0;
163 int in_quotes = 0;
164 int need_comma = 0;
67bd3fd5 165
790e2a12
AB
166 if (length == 0)
167 {
0426ad51 168 gdb_puts ("\"\"");
790e2a12
AB
169 return;
170 }
67bd3fd5 171
76b58849
AB
172 unsigned int print_max_chars = get_print_max_chars (options);
173 for (i = 0; i < length && things_printed < print_max_chars; ++i)
790e2a12
AB
174 {
175 /* Position of the character we are examining
176 to see whether it is repeated. */
177 unsigned int rep1;
178 /* Number of repetitions we have detected so far. */
179 unsigned int reps;
22c12a6c 180
790e2a12 181 QUIT;
22c12a6c 182
790e2a12
AB
183 if (need_comma)
184 {
0426ad51 185 gdb_puts (", ", stream);
790e2a12
AB
186 need_comma = 0;
187 }
efdf6a73 188
790e2a12
AB
189 rep1 = i + 1;
190 reps = 1;
191 while (rep1 < length && string[rep1] == string[i])
192 {
193 ++rep1;
194 ++reps;
195 }
efdf6a73 196
790e2a12
AB
197 if (reps > options->repeat_count_threshold)
198 {
199 if (in_quotes)
200 {
0426ad51 201 gdb_puts ("\", ", stream);
790e2a12
AB
202 in_quotes = 0;
203 }
204 printchar (string[i], elttype, stream);
6cb06a8c 205 gdb_printf (stream, " <repeats %u times>", reps);
790e2a12
AB
206 i = rep1 - 1;
207 things_printed += options->repeat_count_threshold;
208 need_comma = 1;
209 }
210 else
211 {
212 if (!in_quotes)
213 {
0426ad51 214 gdb_puts ("\"", stream);
790e2a12
AB
215 in_quotes = 1;
216 }
217 emitchar (string[i], elttype, stream, '"');
218 ++things_printed;
219 }
220 }
5aba6ebe 221
790e2a12
AB
222 /* Terminate the quotes if necessary. */
223 if (in_quotes)
0426ad51 224 gdb_puts ("\"", stream);
5aba6ebe 225
790e2a12 226 if (force_ellipses || i < length)
0426ad51 227 gdb_puts ("...", stream);
790e2a12 228}
b7c6e27d 229
790e2a12 230/* See language.h. */
b7c6e27d 231
790e2a12
AB
232void
233m2_language::emitchar (int ch, struct type *chtype,
234 struct ui_file *stream, int quoter) const
235{
236 ch &= 0xFF; /* Avoid sign bit follies. */
0874fd07 237
790e2a12
AB
238 if (PRINT_LITERAL_FORM (ch))
239 {
240 if (ch == '\\' || ch == quoter)
0426ad51 241 gdb_puts ("\\", stream);
6cb06a8c 242 gdb_printf (stream, "%c", ch);
790e2a12
AB
243 }
244 else
245 {
246 switch (ch)
247 {
248 case '\n':
0426ad51 249 gdb_puts ("\\n", stream);
790e2a12
AB
250 break;
251 case '\b':
0426ad51 252 gdb_puts ("\\b", stream);
790e2a12
AB
253 break;
254 case '\t':
0426ad51 255 gdb_puts ("\\t", stream);
790e2a12
AB
256 break;
257 case '\f':
0426ad51 258 gdb_puts ("\\f", stream);
790e2a12
AB
259 break;
260 case '\r':
0426ad51 261 gdb_puts ("\\r", stream);
790e2a12
AB
262 break;
263 case '\033':
0426ad51 264 gdb_puts ("\\e", stream);
790e2a12
AB
265 break;
266 case '\007':
0426ad51 267 gdb_puts ("\\a", stream);
790e2a12
AB
268 break;
269 default:
6cb06a8c 270 gdb_printf (stream, "\\%.3o", (unsigned int) ch);
790e2a12
AB
271 break;
272 }
273 }
274}
0874fd07 275
790e2a12
AB
276/* Called during architecture gdbarch initialisation to create language
277 specific types. */
0874fd07 278
cb275538 279static struct builtin_m2_type *
5760b90a 280build_m2_types (struct gdbarch *gdbarch)
c906108c 281{
cb275538 282 struct builtin_m2_type *builtin_m2_type = new struct builtin_m2_type;
5760b90a 283
2d39ccd3
TT
284 type_allocator alloc (gdbarch);
285
c906108c 286 /* Modula-2 "pervasive" types. NOTE: these can be redefined!!! */
e9bb382b 287 builtin_m2_type->builtin_int
2d39ccd3 288 = init_integer_type (alloc, gdbarch_int_bit (gdbarch), 0, "INTEGER");
e9bb382b 289 builtin_m2_type->builtin_card
2d39ccd3 290 = init_integer_type (alloc, gdbarch_int_bit (gdbarch), 1, "CARDINAL");
e9bb382b 291 builtin_m2_type->builtin_real
77c5f496 292 = init_float_type (alloc, gdbarch_float_bit (gdbarch), "REAL",
49f190bc 293 gdbarch_float_format (gdbarch));
e9bb382b 294 builtin_m2_type->builtin_char
f50b437c 295 = init_character_type (alloc, TARGET_CHAR_BIT, 1, "CHAR");
e9bb382b 296 builtin_m2_type->builtin_bool
46c04ea3 297 = init_boolean_type (alloc, gdbarch_int_bit (gdbarch), 1, "BOOLEAN");
c906108c 298
5760b90a
UW
299 return builtin_m2_type;
300}
301
cb275538 302static const registry<gdbarch>::key<struct builtin_m2_type> m2_type_data;
5760b90a
UW
303
304const struct builtin_m2_type *
305builtin_m2_type (struct gdbarch *gdbarch)
306{
cb275538
TT
307 struct builtin_m2_type *result = m2_type_data.get (gdbarch);
308 if (result == nullptr)
309 {
310 result = build_m2_types (gdbarch);
311 m2_type_data.set (gdbarch, result);
312 }
5760b90a 313
cb275538 314 return result;
c906108c 315}