2012-03-02 Tom Tromey <tromey@redhat.com>
[deliverable/binutils-gdb.git] / gdb / m2-lang.c
CommitLineData
c906108c 1/* Modula 2 language support routines for GDB, the GNU debugger.
ce27fb25 2
0b302171
JB
3 Copyright (C) 1992-1996, 1998, 2000, 2002-2005, 2007-2012 Free
4 Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
20
21#include "defs.h"
22#include "symtab.h"
23#include "gdbtypes.h"
24#include "expression.h"
25#include "parser-defs.h"
26#include "language.h"
27#include "m2-lang.h"
28#include "c-lang.h"
745b8ca0 29#include "valprint.h"
c906108c 30
a14ed312 31extern void _initialize_m2_language (void);
6c7a06a3
TT
32static void m2_printchar (int, struct type *, struct ui_file *);
33static void m2_emit_char (int, struct type *, struct ui_file *, int);
c906108c
SS
34
35/* Print the character C on STREAM as part of the contents of a literal
36 string whose delimiter is QUOTER. Note that that format for printing
37 characters and strings is language specific.
38 FIXME: This is a copy of the same function from c-exp.y. It should
844781a1 39 be replaced with a true Modula version. */
c906108c
SS
40
41static void
6c7a06a3 42m2_emit_char (int c, struct type *type, struct ui_file *stream, int quoter)
c906108c
SS
43{
44
025bb325 45 c &= 0xFF; /* Avoid sign bit follies. */
c906108c
SS
46
47 if (PRINT_LITERAL_FORM (c))
48 {
49 if (c == '\\' || c == quoter)
50 {
51 fputs_filtered ("\\", stream);
52 }
53 fprintf_filtered (stream, "%c", c);
54 }
55 else
56 {
57 switch (c)
58 {
59 case '\n':
60 fputs_filtered ("\\n", stream);
61 break;
62 case '\b':
63 fputs_filtered ("\\b", stream);
64 break;
65 case '\t':
66 fputs_filtered ("\\t", stream);
67 break;
68 case '\f':
69 fputs_filtered ("\\f", stream);
70 break;
71 case '\r':
72 fputs_filtered ("\\r", stream);
73 break;
74 case '\033':
75 fputs_filtered ("\\e", stream);
76 break;
77 case '\007':
78 fputs_filtered ("\\a", stream);
79 break;
80 default:
81 fprintf_filtered (stream, "\\%.3o", (unsigned int) c);
82 break;
83 }
84 }
85}
86
87/* FIXME: This is a copy of the same function from c-exp.y. It should
844781a1 88 be replaced with a true Modula version. */
c906108c
SS
89
90static void
6c7a06a3 91m2_printchar (int c, struct type *type, struct ui_file *stream)
c906108c
SS
92{
93 fputs_filtered ("'", stream);
6c7a06a3 94 LA_EMIT_CHAR (c, type, stream, '\'');
c906108c
SS
95 fputs_filtered ("'", stream);
96}
97
98/* Print the character string STRING, printing at most LENGTH characters.
99 Printing stops early if the number hits print_max; repeat counts
100 are printed as appropriate. Print ellipses at the end if we
101 had to stop before printing LENGTH characters, or if FORCE_ELLIPSES.
102 FIXME: This is a copy of the same function from c-exp.y. It should
844781a1 103 be replaced with a true Modula version. */
c906108c
SS
104
105static void
6c7a06a3 106m2_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string,
be759fcf 107 unsigned int length, const char *encoding, int force_ellipses,
79a45b7d 108 const struct value_print_options *options)
c906108c 109{
f86f5ca3 110 unsigned int i;
c906108c
SS
111 unsigned int things_printed = 0;
112 int in_quotes = 0;
113 int need_comma = 0;
c906108c
SS
114
115 if (length == 0)
116 {
117 fputs_filtered ("\"\"", gdb_stdout);
118 return;
119 }
120
79a45b7d 121 for (i = 0; i < length && things_printed < options->print_max; ++i)
c906108c
SS
122 {
123 /* Position of the character we are examining
c5aa993b 124 to see whether it is repeated. */
c906108c
SS
125 unsigned int rep1;
126 /* Number of repetitions we have detected so far. */
127 unsigned int reps;
128
129 QUIT;
130
131 if (need_comma)
132 {
133 fputs_filtered (", ", stream);
134 need_comma = 0;
135 }
136
137 rep1 = i + 1;
138 reps = 1;
139 while (rep1 < length && string[rep1] == string[i])
140 {
141 ++rep1;
142 ++reps;
143 }
144
79a45b7d 145 if (reps > options->repeat_count_threshold)
c906108c
SS
146 {
147 if (in_quotes)
148 {
79a45b7d 149 if (options->inspect_it)
c906108c
SS
150 fputs_filtered ("\\\", ", stream);
151 else
152 fputs_filtered ("\", ", stream);
153 in_quotes = 0;
154 }
6c7a06a3 155 m2_printchar (string[i], type, stream);
c906108c
SS
156 fprintf_filtered (stream, " <repeats %u times>", reps);
157 i = rep1 - 1;
79a45b7d 158 things_printed += options->repeat_count_threshold;
c906108c
SS
159 need_comma = 1;
160 }
161 else
162 {
163 if (!in_quotes)
164 {
79a45b7d 165 if (options->inspect_it)
c906108c
SS
166 fputs_filtered ("\\\"", stream);
167 else
168 fputs_filtered ("\"", stream);
169 in_quotes = 1;
170 }
6c7a06a3 171 LA_EMIT_CHAR (string[i], type, stream, '"');
c906108c
SS
172 ++things_printed;
173 }
174 }
175
176 /* Terminate the quotes if necessary. */
177 if (in_quotes)
178 {
79a45b7d 179 if (options->inspect_it)
c906108c
SS
180 fputs_filtered ("\\\"", stream);
181 else
182 fputs_filtered ("\"", stream);
183 }
184
185 if (force_ellipses || i < length)
186 fputs_filtered ("...", stream);
187}
188
844781a1
GM
189static struct value *
190evaluate_subexp_modula2 (struct type *expect_type, struct expression *exp,
191 int *pos, enum noside noside)
192{
193 enum exp_opcode op = exp->elts[*pos].opcode;
194 struct value *arg1;
195 struct value *arg2;
196 struct type *type;
b8d56208 197
844781a1
GM
198 switch (op)
199 {
200 case UNOP_HIGH:
201 (*pos)++;
202 arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
203
204 if (noside == EVAL_SKIP || noside == EVAL_AVOID_SIDE_EFFECTS)
205 return arg1;
206 else
207 {
208 arg1 = coerce_ref (arg1);
209 type = check_typedef (value_type (arg1));
210
211 if (m2_is_unbounded_array (type))
212 {
213 struct value *temp = arg1;
b8d56208 214
844781a1
GM
215 type = TYPE_FIELD_TYPE (type, 1);
216 /* i18n: Do not translate the "_m2_high" part! */
217 arg1 = value_struct_elt (&temp, NULL, "_m2_high", NULL,
218 _("unbounded structure "
219 "missing _m2_high field"));
220
221 if (value_type (arg1) != type)
222 arg1 = value_cast (type, arg1);
223 }
224 }
225 return arg1;
226
227 case BINOP_SUBSCRIPT:
228 (*pos)++;
229 arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
230 arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
231 if (noside == EVAL_SKIP)
232 goto nosideret;
233 /* If the user attempts to subscript something that is not an
234 array or pointer type (like a plain int variable for example),
235 then report this as an error. */
236
237 arg1 = coerce_ref (arg1);
238 type = check_typedef (value_type (arg1));
239
240 if (m2_is_unbounded_array (type))
241 {
242 struct value *temp = arg1;
243 type = TYPE_FIELD_TYPE (type, 0);
b8d56208
MS
244 if (type == NULL || (TYPE_CODE (type) != TYPE_CODE_PTR))
245 {
025bb325
MS
246 warning (_("internal error: unbounded "
247 "array structure is unknown"));
b8d56208
MS
248 return evaluate_subexp_standard (expect_type, exp, pos, noside);
249 }
844781a1
GM
250 /* i18n: Do not translate the "_m2_contents" part! */
251 arg1 = value_struct_elt (&temp, NULL, "_m2_contents", NULL,
252 _("unbounded structure "
253 "missing _m2_contents field"));
254
255 if (value_type (arg1) != type)
256 arg1 = value_cast (type, arg1);
257
976aa66e 258 check_typedef (value_type (arg1));
2497b498 259 return value_ind (value_ptradd (arg1, value_as_long (arg2)));
844781a1
GM
260 }
261 else
262 if (TYPE_CODE (type) != TYPE_CODE_ARRAY)
263 {
264 if (TYPE_NAME (type))
265 error (_("cannot subscript something of type `%s'"),
266 TYPE_NAME (type));
267 else
268 error (_("cannot subscript requested type"));
269 }
270
271 if (noside == EVAL_AVOID_SIDE_EFFECTS)
272 return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1));
273 else
2497b498 274 return value_subscript (arg1, value_as_long (arg2));
844781a1
GM
275
276 default:
277 return evaluate_subexp_standard (expect_type, exp, pos, noside);
278 }
279
280 nosideret:
22601c15 281 return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1);
844781a1 282}
c906108c 283\f
c5aa993b 284
c906108c
SS
285/* Table of operators and their precedences for printing expressions. */
286
c5aa993b
JM
287static const struct op_print m2_op_print_tab[] =
288{
289 {"+", BINOP_ADD, PREC_ADD, 0},
290 {"+", UNOP_PLUS, PREC_PREFIX, 0},
291 {"-", BINOP_SUB, PREC_ADD, 0},
292 {"-", UNOP_NEG, PREC_PREFIX, 0},
293 {"*", BINOP_MUL, PREC_MUL, 0},
294 {"/", BINOP_DIV, PREC_MUL, 0},
295 {"DIV", BINOP_INTDIV, PREC_MUL, 0},
296 {"MOD", BINOP_REM, PREC_MUL, 0},
297 {":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
298 {"OR", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
299 {"AND", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
300 {"NOT", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
301 {"=", BINOP_EQUAL, PREC_EQUAL, 0},
302 {"<>", BINOP_NOTEQUAL, PREC_EQUAL, 0},
303 {"<=", BINOP_LEQ, PREC_ORDER, 0},
304 {">=", BINOP_GEQ, PREC_ORDER, 0},
305 {">", BINOP_GTR, PREC_ORDER, 0},
306 {"<", BINOP_LESS, PREC_ORDER, 0},
307 {"^", UNOP_IND, PREC_PREFIX, 0},
308 {"@", BINOP_REPEAT, PREC_REPEAT, 0},
309 {"CAP", UNOP_CAP, PREC_BUILTIN_FUNCTION, 0},
310 {"CHR", UNOP_CHR, PREC_BUILTIN_FUNCTION, 0},
311 {"ORD", UNOP_ORD, PREC_BUILTIN_FUNCTION, 0},
312 {"FLOAT", UNOP_FLOAT, PREC_BUILTIN_FUNCTION, 0},
313 {"HIGH", UNOP_HIGH, PREC_BUILTIN_FUNCTION, 0},
314 {"MAX", UNOP_MAX, PREC_BUILTIN_FUNCTION, 0},
315 {"MIN", UNOP_MIN, PREC_BUILTIN_FUNCTION, 0},
316 {"ODD", UNOP_ODD, PREC_BUILTIN_FUNCTION, 0},
317 {"TRUNC", UNOP_TRUNC, PREC_BUILTIN_FUNCTION, 0},
318 {NULL, 0, 0, 0}
c906108c
SS
319};
320\f
321/* The built-in types of Modula-2. */
322
cad351d1
UW
323enum m2_primitive_types {
324 m2_primitive_type_char,
325 m2_primitive_type_int,
326 m2_primitive_type_card,
327 m2_primitive_type_real,
328 m2_primitive_type_bool,
329 nr_m2_primitive_types
c906108c
SS
330};
331
cad351d1
UW
332static void
333m2_language_arch_info (struct gdbarch *gdbarch,
334 struct language_arch_info *lai)
335{
5760b90a
UW
336 const struct builtin_m2_type *builtin = builtin_m2_type (gdbarch);
337
338 lai->string_char_type = builtin->builtin_char;
cad351d1
UW
339 lai->primitive_type_vector
340 = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_m2_primitive_types + 1,
341 struct type *);
342
343 lai->primitive_type_vector [m2_primitive_type_char]
5760b90a 344 = builtin->builtin_char;
cad351d1 345 lai->primitive_type_vector [m2_primitive_type_int]
5760b90a 346 = builtin->builtin_int;
cad351d1 347 lai->primitive_type_vector [m2_primitive_type_card]
5760b90a 348 = builtin->builtin_card;
cad351d1 349 lai->primitive_type_vector [m2_primitive_type_real]
5760b90a 350 = builtin->builtin_real;
cad351d1 351 lai->primitive_type_vector [m2_primitive_type_bool]
5760b90a 352 = builtin->builtin_bool;
fbb06eb1
UW
353
354 lai->bool_type_symbol = "BOOLEAN";
355 lai->bool_type_default = builtin->builtin_bool;
cad351d1
UW
356}
357
844781a1
GM
358const struct exp_descriptor exp_descriptor_modula2 =
359{
360 print_subexp_standard,
361 operator_length_standard,
c0201579 362 operator_check_standard,
844781a1
GM
363 op_name_standard,
364 dump_subexp_body_standard,
365 evaluate_subexp_modula2
366};
367
c5aa993b
JM
368const struct language_defn m2_language_defn =
369{
c906108c
SS
370 "modula-2",
371 language_m2,
c906108c
SS
372 range_check_on,
373 type_check_on,
63872f9d 374 case_sensitive_on,
7ca2d3a3 375 array_row_major,
9a044a89 376 macro_expansion_no,
844781a1 377 &exp_descriptor_modula2,
c906108c
SS
378 m2_parse, /* parser */
379 m2_error, /* parser error function */
e85c3284 380 null_post_parser,
c906108c
SS
381 m2_printchar, /* Print character constant */
382 m2_printstr, /* function to print string constant */
383 m2_emit_char, /* Function to print a single character */
c906108c 384 m2_print_type, /* Print a type using appropriate syntax */
5c6ce71d 385 m2_print_typedef, /* Print a typedef using appropriate syntax */
c906108c
SS
386 m2_val_print, /* Print a value using appropriate syntax */
387 c_value_print, /* Print a top-level value */
f636b87d 388 NULL, /* Language specific skip_trampoline */
2b2d9e11 389 NULL, /* name_of_this */
5f9a71c3 390 basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
b368761e 391 basic_lookup_transparent_type,/* lookup_transparent_type */
9a3d7dfd 392 NULL, /* Language specific symbol demangler */
025bb325
MS
393 NULL, /* Language specific
394 class_name_from_physname */
c906108c
SS
395 m2_op_print_tab, /* expression operators for printing */
396 0, /* arrays are first-class (not c-style) */
397 0, /* String lower bound */
6084f43a 398 default_word_break_characters,
41d27058 399 default_make_symbol_completion_list,
cad351d1 400 m2_language_arch_info,
e79af960 401 default_print_array_index,
41f1b697 402 default_pass_by_reference,
ae6a3a4c 403 default_get_string,
1a119f36 404 NULL, /* la_get_symbol_name_cmp */
f8eba3c6 405 iterate_over_symbols,
c906108c
SS
406 LANG_MAGIC
407};
408
5760b90a
UW
409static void *
410build_m2_types (struct gdbarch *gdbarch)
c906108c 411{
5760b90a
UW
412 struct builtin_m2_type *builtin_m2_type
413 = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_m2_type);
414
c906108c 415 /* Modula-2 "pervasive" types. NOTE: these can be redefined!!! */
e9bb382b
UW
416 builtin_m2_type->builtin_int
417 = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 0, "INTEGER");
418 builtin_m2_type->builtin_card
419 = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 1, "CARDINAL");
420 builtin_m2_type->builtin_real
421 = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch), "REAL", NULL);
422 builtin_m2_type->builtin_char
423 = arch_character_type (gdbarch, TARGET_CHAR_BIT, 1, "CHAR");
424 builtin_m2_type->builtin_bool
425 = arch_boolean_type (gdbarch, gdbarch_int_bit (gdbarch), 1, "BOOLEAN");
c906108c 426
5760b90a
UW
427 return builtin_m2_type;
428}
429
430static struct gdbarch_data *m2_type_data;
431
432const struct builtin_m2_type *
433builtin_m2_type (struct gdbarch *gdbarch)
434{
435 return gdbarch_data (gdbarch, m2_type_data);
436}
437
438
439/* Initialization for Modula-2 */
440
441void
442_initialize_m2_language (void)
443{
444 m2_type_data = gdbarch_data_register_post_init (build_m2_types);
445
c906108c
SS
446 add_language (&m2_language_defn);
447}
This page took 1.125865 seconds and 4 git commands to generate.