]> Git Repo - binutils.git/blob - gdb/m2-lang.c
gmp-utils: Convert the read/write methods to using gdb::array_view
[binutils.git] / gdb / m2-lang.c
1 /* Modula 2 language support routines for GDB, the GNU debugger.
2
3    Copyright (C) 1992-2020 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
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
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
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.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "symtab.h"
22 #include "gdbtypes.h"
23 #include "expression.h"
24 #include "parser-defs.h"
25 #include "language.h"
26 #include "varobj.h"
27 #include "m2-lang.h"
28 #include "c-lang.h"
29 #include "valprint.h"
30 #include "gdbarch.h"
31
32 static struct value *
33 evaluate_subexp_modula2 (struct type *expect_type, struct expression *exp,
34                          int *pos, enum noside noside)
35 {
36   enum exp_opcode op = exp->elts[*pos].opcode;
37   struct value *arg1;
38   struct value *arg2;
39   struct type *type;
40
41   switch (op)
42     {
43     case UNOP_HIGH:
44       (*pos)++;
45       arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
46
47       if (noside == EVAL_SKIP || noside == EVAL_AVOID_SIDE_EFFECTS)
48         return arg1;
49       else
50         {
51           arg1 = coerce_ref (arg1);
52           type = check_typedef (value_type (arg1));
53
54           if (m2_is_unbounded_array (type))
55             {
56               struct value *temp = arg1;
57
58               type = type->field (1).type ();
59               /* i18n: Do not translate the "_m2_high" part!  */
60               arg1 = value_struct_elt (&temp, NULL, "_m2_high", NULL,
61                                        _("unbounded structure "
62                                          "missing _m2_high field"));
63           
64               if (value_type (arg1) != type)
65                 arg1 = value_cast (type, arg1);
66             }
67         }
68       return arg1;
69
70     case BINOP_SUBSCRIPT:
71       (*pos)++;
72       arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
73       arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
74       if (noside == EVAL_SKIP)
75         goto nosideret;
76       /* If the user attempts to subscript something that is not an
77          array or pointer type (like a plain int variable for example),
78          then report this as an error.  */
79
80       arg1 = coerce_ref (arg1);
81       type = check_typedef (value_type (arg1));
82
83       if (m2_is_unbounded_array (type))
84         {
85           struct value *temp = arg1;
86           type = type->field (0).type ();
87           if (type == NULL || (type->code () != TYPE_CODE_PTR))
88             {
89               warning (_("internal error: unbounded "
90                          "array structure is unknown"));
91               return evaluate_subexp_standard (expect_type, exp, pos, noside);
92             }
93           /* i18n: Do not translate the "_m2_contents" part!  */
94           arg1 = value_struct_elt (&temp, NULL, "_m2_contents", NULL,
95                                    _("unbounded structure "
96                                      "missing _m2_contents field"));
97           
98           if (value_type (arg1) != type)
99             arg1 = value_cast (type, arg1);
100
101           check_typedef (value_type (arg1));
102           return value_ind (value_ptradd (arg1, value_as_long (arg2)));
103         }
104       else
105         if (type->code () != TYPE_CODE_ARRAY)
106           {
107             if (type->name ())
108               error (_("cannot subscript something of type `%s'"),
109                      type->name ());
110             else
111               error (_("cannot subscript requested type"));
112           }
113
114       if (noside == EVAL_AVOID_SIDE_EFFECTS)
115         return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1));
116       else
117         return value_subscript (arg1, value_as_long (arg2));
118
119     default:
120       return evaluate_subexp_standard (expect_type, exp, pos, noside);
121     }
122
123  nosideret:
124   return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1);
125 }
126 \f
127
128 /* Table of operators and their precedences for printing expressions.  */
129
130 const struct op_print m2_language::op_print_tab[] =
131 {
132   {"+", BINOP_ADD, PREC_ADD, 0},
133   {"+", UNOP_PLUS, PREC_PREFIX, 0},
134   {"-", BINOP_SUB, PREC_ADD, 0},
135   {"-", UNOP_NEG, PREC_PREFIX, 0},
136   {"*", BINOP_MUL, PREC_MUL, 0},
137   {"/", BINOP_DIV, PREC_MUL, 0},
138   {"DIV", BINOP_INTDIV, PREC_MUL, 0},
139   {"MOD", BINOP_REM, PREC_MUL, 0},
140   {":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
141   {"OR", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
142   {"AND", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
143   {"NOT", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
144   {"=", BINOP_EQUAL, PREC_EQUAL, 0},
145   {"<>", BINOP_NOTEQUAL, PREC_EQUAL, 0},
146   {"<=", BINOP_LEQ, PREC_ORDER, 0},
147   {">=", BINOP_GEQ, PREC_ORDER, 0},
148   {">", BINOP_GTR, PREC_ORDER, 0},
149   {"<", BINOP_LESS, PREC_ORDER, 0},
150   {"^", UNOP_IND, PREC_PREFIX, 0},
151   {"@", BINOP_REPEAT, PREC_REPEAT, 0},
152   {"CAP", UNOP_CAP, PREC_BUILTIN_FUNCTION, 0},
153   {"CHR", UNOP_CHR, PREC_BUILTIN_FUNCTION, 0},
154   {"ORD", UNOP_ORD, PREC_BUILTIN_FUNCTION, 0},
155   {"FLOAT", UNOP_FLOAT, PREC_BUILTIN_FUNCTION, 0},
156   {"HIGH", UNOP_HIGH, PREC_BUILTIN_FUNCTION, 0},
157   {"MAX", UNOP_MAX, PREC_BUILTIN_FUNCTION, 0},
158   {"MIN", UNOP_MIN, PREC_BUILTIN_FUNCTION, 0},
159   {"ODD", UNOP_ODD, PREC_BUILTIN_FUNCTION, 0},
160   {"TRUNC", UNOP_TRUNC, PREC_BUILTIN_FUNCTION, 0},
161   {NULL, OP_NULL, PREC_BUILTIN_FUNCTION, 0}
162 };
163 \f
164
165 const struct exp_descriptor m2_language::exp_descriptor_modula2 =
166 {
167   print_subexp_standard,
168   operator_length_standard,
169   operator_check_standard,
170   op_name_standard,
171   dump_subexp_body_standard,
172   evaluate_subexp_modula2
173 };
174
175 /* Single instance of the M2 language.  */
176
177 static m2_language m2_language_defn;
178
179 /* See language.h.  */
180
181 void
182 m2_language::language_arch_info (struct gdbarch *gdbarch,
183                                  struct language_arch_info *lai) const
184 {
185   const struct builtin_m2_type *builtin = builtin_m2_type (gdbarch);
186
187   /* Helper function to allow shorter lines below.  */
188   auto add  = [&] (struct type * t)
189   {
190     lai->add_primitive_type (t);
191   };
192
193   add (builtin->builtin_char);
194   add (builtin->builtin_int);
195   add (builtin->builtin_card);
196   add (builtin->builtin_real);
197   add (builtin->builtin_bool);
198
199   lai->set_string_char_type (builtin->builtin_char);
200   lai->set_bool_type (builtin->builtin_bool, "BOOLEAN");
201 }
202
203 /* See languge.h.  */
204
205 void
206 m2_language::printchar (int c, struct type *type,
207                         struct ui_file *stream) const
208 {
209   fputs_filtered ("'", stream);
210   emitchar (c, type, stream, '\'');
211   fputs_filtered ("'", stream);
212 }
213
214 /* See language.h.  */
215
216 void
217 m2_language::printstr (struct ui_file *stream, struct type *elttype,
218                         const gdb_byte *string, unsigned int length,
219                         const char *encoding, int force_ellipses,
220                         const struct value_print_options *options) const
221 {
222   unsigned int i;
223   unsigned int things_printed = 0;
224   int in_quotes = 0;
225   int need_comma = 0;
226
227   if (length == 0)
228     {
229       fputs_filtered ("\"\"", gdb_stdout);
230       return;
231     }
232
233   for (i = 0; i < length && things_printed < options->print_max; ++i)
234     {
235       /* Position of the character we are examining
236          to see whether it is repeated.  */
237       unsigned int rep1;
238       /* Number of repetitions we have detected so far.  */
239       unsigned int reps;
240
241       QUIT;
242
243       if (need_comma)
244         {
245           fputs_filtered (", ", stream);
246           need_comma = 0;
247         }
248
249       rep1 = i + 1;
250       reps = 1;
251       while (rep1 < length && string[rep1] == string[i])
252         {
253           ++rep1;
254           ++reps;
255         }
256
257       if (reps > options->repeat_count_threshold)
258         {
259           if (in_quotes)
260             {
261               fputs_filtered ("\", ", stream);
262               in_quotes = 0;
263             }
264           printchar (string[i], elttype, stream);
265           fprintf_filtered (stream, " <repeats %u times>", reps);
266           i = rep1 - 1;
267           things_printed += options->repeat_count_threshold;
268           need_comma = 1;
269         }
270       else
271         {
272           if (!in_quotes)
273             {
274               fputs_filtered ("\"", stream);
275               in_quotes = 1;
276             }
277           emitchar (string[i], elttype, stream, '"');
278           ++things_printed;
279         }
280     }
281
282   /* Terminate the quotes if necessary.  */
283   if (in_quotes)
284     fputs_filtered ("\"", stream);
285
286   if (force_ellipses || i < length)
287     fputs_filtered ("...", stream);
288 }
289
290 /* See language.h.  */
291
292 void
293 m2_language::emitchar (int ch, struct type *chtype,
294                        struct ui_file *stream, int quoter) const
295 {
296   ch &= 0xFF;                   /* Avoid sign bit follies.  */
297
298   if (PRINT_LITERAL_FORM (ch))
299     {
300       if (ch == '\\' || ch == quoter)
301         fputs_filtered ("\\", stream);
302       fprintf_filtered (stream, "%c", ch);
303     }
304   else
305     {
306       switch (ch)
307         {
308         case '\n':
309           fputs_filtered ("\\n", stream);
310           break;
311         case '\b':
312           fputs_filtered ("\\b", stream);
313           break;
314         case '\t':
315           fputs_filtered ("\\t", stream);
316           break;
317         case '\f':
318           fputs_filtered ("\\f", stream);
319           break;
320         case '\r':
321           fputs_filtered ("\\r", stream);
322           break;
323         case '\033':
324           fputs_filtered ("\\e", stream);
325           break;
326         case '\007':
327           fputs_filtered ("\\a", stream);
328           break;
329         default:
330           fprintf_filtered (stream, "\\%.3o", (unsigned int) ch);
331           break;
332         }
333     }
334 }
335
336 /* Called during architecture gdbarch initialisation to create language
337    specific types.  */
338
339 static void *
340 build_m2_types (struct gdbarch *gdbarch)
341 {
342   struct builtin_m2_type *builtin_m2_type
343     = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_m2_type);
344
345   /* Modula-2 "pervasive" types.  NOTE:  these can be redefined!!! */
346   builtin_m2_type->builtin_int
347     = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 0, "INTEGER");
348   builtin_m2_type->builtin_card
349     = arch_integer_type (gdbarch, gdbarch_int_bit (gdbarch), 1, "CARDINAL");
350   builtin_m2_type->builtin_real
351     = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch), "REAL",
352                        gdbarch_float_format (gdbarch));
353   builtin_m2_type->builtin_char
354     = arch_character_type (gdbarch, TARGET_CHAR_BIT, 1, "CHAR");
355   builtin_m2_type->builtin_bool
356     = arch_boolean_type (gdbarch, gdbarch_int_bit (gdbarch), 1, "BOOLEAN");
357
358   return builtin_m2_type;
359 }
360
361 static struct gdbarch_data *m2_type_data;
362
363 const struct builtin_m2_type *
364 builtin_m2_type (struct gdbarch *gdbarch)
365 {
366   return (const struct builtin_m2_type *) gdbarch_data (gdbarch, m2_type_data);
367 }
368
369
370 /* Initialization for Modula-2 */
371
372 void _initialize_m2_language ();
373 void
374 _initialize_m2_language ()
375 {
376   m2_type_data = gdbarch_data_register_post_init (build_m2_types);
377 }
This page took 0.046115 seconds and 4 git commands to generate.