xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/d-lang.c (revision afab4e300d3a9fb07dd8c80daf53d0feb3345706)
1 /* D language support routines for GDB, the GNU debugger.
2 
3    Copyright (C) 2005-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 "language.h"
23 #include "varobj.h"
24 #include "d-lang.h"
25 #include "c-lang.h"
26 #include "demangle.h"
27 #include "cp-support.h"
28 #include "gdbarch.h"
29 
30 /* The name of the symbol to use to get the name of the main subprogram.  */
31 static const char D_MAIN[] = "D main";
32 
33 /* Function returning the special symbol name used by D for the main
34    procedure in the main program if it is found in minimal symbol list.
35    This function tries to find minimal symbols so that it finds them even
36    if the program was compiled without debugging information.  */
37 
38 const char *
39 d_main_name (void)
40 {
41   struct bound_minimal_symbol msym;
42 
43   msym = lookup_minimal_symbol (D_MAIN, NULL, NULL);
44   if (msym.minsym != NULL)
45     return D_MAIN;
46 
47   /* No known entry procedure found, the main program is probably not D.  */
48   return NULL;
49 }
50 
51 /* Implements the la_demangle language_defn routine for language D.  */
52 
53 char *
54 d_demangle (const char *symbol, int options)
55 {
56   return gdb_demangle (symbol, options | DMGL_DLANG);
57 }
58 
59 /* Table mapping opcodes into strings for printing operators
60    and precedences of the operators.  */
61 static const struct op_print d_op_print_tab[] =
62 {
63   {",", BINOP_COMMA, PREC_COMMA, 0},
64   {"=", BINOP_ASSIGN, PREC_ASSIGN, 1},
65   {"||", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
66   {"&&", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
67   {"|", BINOP_BITWISE_IOR, PREC_BITWISE_IOR, 0},
68   {"^", BINOP_BITWISE_XOR, PREC_BITWISE_XOR, 0},
69   {"&", BINOP_BITWISE_AND, PREC_BITWISE_AND, 0},
70   {"==", BINOP_EQUAL, PREC_ORDER, 0},
71   {"!=", BINOP_NOTEQUAL, PREC_ORDER, 0},
72   {"<=", BINOP_LEQ, PREC_ORDER, 0},
73   {">=", BINOP_GEQ, PREC_ORDER, 0},
74   {">", BINOP_GTR, PREC_ORDER, 0},
75   {"<", BINOP_LESS, PREC_ORDER, 0},
76   {">>", BINOP_RSH, PREC_SHIFT, 0},
77   {"<<", BINOP_LSH, PREC_SHIFT, 0},
78   {"+", BINOP_ADD, PREC_ADD, 0},
79   {"-", BINOP_SUB, PREC_ADD, 0},
80   {"~", BINOP_CONCAT, PREC_ADD, 0},
81   {"*", BINOP_MUL, PREC_MUL, 0},
82   {"/", BINOP_DIV, PREC_MUL, 0},
83   {"%", BINOP_REM, PREC_MUL, 0},
84   {"^^", BINOP_EXP, PREC_REPEAT, 0},
85   {"@", BINOP_REPEAT, PREC_REPEAT, 0},
86   {"-", UNOP_NEG, PREC_PREFIX, 0},
87   {"!", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
88   {"~", UNOP_COMPLEMENT, PREC_PREFIX, 0},
89   {"*", UNOP_IND, PREC_PREFIX, 0},
90   {"&", UNOP_ADDR, PREC_PREFIX, 0},
91   {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0},
92   {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0},
93   {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0},
94   {NULL, OP_NULL, PREC_PREFIX, 0}
95 };
96 
97 /* Mapping of all D basic data types into the language vector.  */
98 
99 enum d_primitive_types {
100   d_primitive_type_void,
101   d_primitive_type_bool,
102   d_primitive_type_byte,
103   d_primitive_type_ubyte,
104   d_primitive_type_short,
105   d_primitive_type_ushort,
106   d_primitive_type_int,
107   d_primitive_type_uint,
108   d_primitive_type_long,
109   d_primitive_type_ulong,
110   d_primitive_type_cent,    /* Signed 128 bit integer.  */
111   d_primitive_type_ucent,   /* Unsigned 128 bit integer.  */
112   d_primitive_type_float,
113   d_primitive_type_double,
114   d_primitive_type_real,
115   d_primitive_type_ifloat,  /* Imaginary float types.  */
116   d_primitive_type_idouble,
117   d_primitive_type_ireal,
118   d_primitive_type_cfloat,  /* Complex number of two float values.  */
119   d_primitive_type_cdouble,
120   d_primitive_type_creal,
121   d_primitive_type_char,    /* Unsigned character types.  */
122   d_primitive_type_wchar,
123   d_primitive_type_dchar,
124   nr_d_primitive_types
125 };
126 
127 static const char *d_extensions[] =
128 {
129   ".d", NULL
130 };
131 
132 /* Constant data that describes the D language.  */
133 
134 extern const struct language_data d_language_data =
135 {
136   "d",
137   "D",
138   language_d,
139   range_check_off,
140   case_sensitive_on,
141   array_row_major,
142   macro_expansion_no,
143   d_extensions,
144   &exp_descriptor_c,
145   "this",
146   false,			/* la_store_sym_names_in_linkage_form_p */
147   d_op_print_tab,		/* Expression operators for printing.  */
148   1,				/* C-style arrays.  */
149   0,				/* String lower bound.  */
150   &default_varobj_ops,
151   "{...}"			/* la_struct_too_deep_ellipsis */
152 };
153 
154 /* Class representing the D language.  */
155 
156 class d_language : public language_defn
157 {
158 public:
159   d_language ()
160     : language_defn (language_d, d_language_data)
161   { /* Nothing.  */ }
162 
163   /* See language.h.  */
164   void language_arch_info (struct gdbarch *gdbarch,
165 			   struct language_arch_info *lai) const override
166   {
167     const struct builtin_d_type *builtin = builtin_d_type (gdbarch);
168 
169     lai->string_char_type = builtin->builtin_char;
170     lai->primitive_type_vector
171       = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_d_primitive_types + 1,
172 				struct type *);
173 
174     lai->primitive_type_vector [d_primitive_type_void]
175       = builtin->builtin_void;
176     lai->primitive_type_vector [d_primitive_type_bool]
177       = builtin->builtin_bool;
178     lai->primitive_type_vector [d_primitive_type_byte]
179       = builtin->builtin_byte;
180     lai->primitive_type_vector [d_primitive_type_ubyte]
181       = builtin->builtin_ubyte;
182     lai->primitive_type_vector [d_primitive_type_short]
183       = builtin->builtin_short;
184     lai->primitive_type_vector [d_primitive_type_ushort]
185       = builtin->builtin_ushort;
186     lai->primitive_type_vector [d_primitive_type_int]
187       = builtin->builtin_int;
188     lai->primitive_type_vector [d_primitive_type_uint]
189       = builtin->builtin_uint;
190     lai->primitive_type_vector [d_primitive_type_long]
191       = builtin->builtin_long;
192     lai->primitive_type_vector [d_primitive_type_ulong]
193       = builtin->builtin_ulong;
194     lai->primitive_type_vector [d_primitive_type_cent]
195       = builtin->builtin_cent;
196     lai->primitive_type_vector [d_primitive_type_ucent]
197       = builtin->builtin_ucent;
198     lai->primitive_type_vector [d_primitive_type_float]
199       = builtin->builtin_float;
200     lai->primitive_type_vector [d_primitive_type_double]
201       = builtin->builtin_double;
202     lai->primitive_type_vector [d_primitive_type_real]
203       = builtin->builtin_real;
204     lai->primitive_type_vector [d_primitive_type_ifloat]
205       = builtin->builtin_ifloat;
206     lai->primitive_type_vector [d_primitive_type_idouble]
207       = builtin->builtin_idouble;
208     lai->primitive_type_vector [d_primitive_type_ireal]
209       = builtin->builtin_ireal;
210     lai->primitive_type_vector [d_primitive_type_cfloat]
211       = builtin->builtin_cfloat;
212     lai->primitive_type_vector [d_primitive_type_cdouble]
213       = builtin->builtin_cdouble;
214     lai->primitive_type_vector [d_primitive_type_creal]
215       = builtin->builtin_creal;
216     lai->primitive_type_vector [d_primitive_type_char]
217       = builtin->builtin_char;
218     lai->primitive_type_vector [d_primitive_type_wchar]
219       = builtin->builtin_wchar;
220     lai->primitive_type_vector [d_primitive_type_dchar]
221       = builtin->builtin_dchar;
222 
223     lai->bool_type_symbol = "bool";
224     lai->bool_type_default = builtin->builtin_bool;
225   }
226 
227   /* See language.h.  */
228   bool sniff_from_mangled_name (const char *mangled,
229 				char **demangled) const override
230   {
231     *demangled = d_demangle (mangled, 0);
232     return *demangled != NULL;
233   }
234 
235   /* See language.h.  */
236 
237   char *demangle (const char *mangled, int options) const override
238   {
239     return d_demangle (mangled, options);
240   }
241 
242   /* See language.h.  */
243 
244   void print_type (struct type *type, const char *varstring,
245 		   struct ui_file *stream, int show, int level,
246 		   const struct type_print_options *flags) const override
247   {
248     c_print_type (type, varstring, stream, show, level, flags);
249   }
250 
251   /* See language.h.  */
252 
253   void value_print_inner
254 	(struct value *val, struct ui_file *stream, int recurse,
255 	 const struct value_print_options *options) const override
256   {
257     return d_value_print_inner (val, stream, recurse, options);
258   }
259 
260   /* See language.h.  */
261 
262   struct block_symbol lookup_symbol_nonlocal
263 	(const char *name, const struct block *block,
264 	 const domain_enum domain) const override
265   {
266     return d_lookup_symbol_nonlocal (this, name, block, domain);
267   }
268 
269   /* See language.h.  */
270 
271   int parser (struct parser_state *ps) const override
272   {
273     return d_parse (ps);
274   }
275 };
276 
277 /* Single instance of the D language class.  */
278 
279 static d_language d_language_defn;
280 
281 /* Build all D language types for the specified architecture.  */
282 
283 static void *
284 build_d_types (struct gdbarch *gdbarch)
285 {
286   struct builtin_d_type *builtin_d_type
287     = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_d_type);
288 
289   /* Basic types.  */
290   builtin_d_type->builtin_void
291     = arch_type (gdbarch, TYPE_CODE_VOID, TARGET_CHAR_BIT, "void");
292   builtin_d_type->builtin_bool
293     = arch_boolean_type (gdbarch, 8, 1, "bool");
294   builtin_d_type->builtin_byte
295     = arch_integer_type (gdbarch, 8, 0, "byte");
296   builtin_d_type->builtin_ubyte
297     = arch_integer_type (gdbarch, 8, 1, "ubyte");
298   builtin_d_type->builtin_short
299     = arch_integer_type (gdbarch, 16, 0, "short");
300   builtin_d_type->builtin_ushort
301     = arch_integer_type (gdbarch, 16, 1, "ushort");
302   builtin_d_type->builtin_int
303     = arch_integer_type (gdbarch, 32, 0, "int");
304   builtin_d_type->builtin_uint
305     = arch_integer_type (gdbarch, 32, 1, "uint");
306   builtin_d_type->builtin_long
307     = arch_integer_type (gdbarch, 64, 0, "long");
308   builtin_d_type->builtin_ulong
309     = arch_integer_type (gdbarch, 64, 1, "ulong");
310   builtin_d_type->builtin_cent
311     = arch_integer_type (gdbarch, 128, 0, "cent");
312   builtin_d_type->builtin_ucent
313     = arch_integer_type (gdbarch, 128, 1, "ucent");
314   builtin_d_type->builtin_float
315     = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch),
316 		       "float", gdbarch_float_format (gdbarch));
317   builtin_d_type->builtin_double
318     = arch_float_type (gdbarch, gdbarch_double_bit (gdbarch),
319 		       "double", gdbarch_double_format (gdbarch));
320   builtin_d_type->builtin_real
321     = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch),
322 		       "real", gdbarch_long_double_format (gdbarch));
323 
324   TYPE_INSTANCE_FLAGS (builtin_d_type->builtin_byte)
325     |= TYPE_INSTANCE_FLAG_NOTTEXT;
326   TYPE_INSTANCE_FLAGS (builtin_d_type->builtin_ubyte)
327     |= TYPE_INSTANCE_FLAG_NOTTEXT;
328 
329   /* Imaginary and complex types.  */
330   builtin_d_type->builtin_ifloat
331     = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch),
332 		       "ifloat", gdbarch_float_format (gdbarch));
333   builtin_d_type->builtin_idouble
334     = arch_float_type (gdbarch, gdbarch_double_bit (gdbarch),
335 		       "idouble", gdbarch_double_format (gdbarch));
336   builtin_d_type->builtin_ireal
337     = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch),
338 		       "ireal", gdbarch_long_double_format (gdbarch));
339   builtin_d_type->builtin_cfloat
340     = init_complex_type ("cfloat", builtin_d_type->builtin_float);
341   builtin_d_type->builtin_cdouble
342     = init_complex_type ("cdouble", builtin_d_type->builtin_double);
343   builtin_d_type->builtin_creal
344     = init_complex_type ("creal", builtin_d_type->builtin_real);
345 
346   /* Character types.  */
347   builtin_d_type->builtin_char
348     = arch_character_type (gdbarch, 8, 1, "char");
349   builtin_d_type->builtin_wchar
350     = arch_character_type (gdbarch, 16, 1, "wchar");
351   builtin_d_type->builtin_dchar
352     = arch_character_type (gdbarch, 32, 1, "dchar");
353 
354   return builtin_d_type;
355 }
356 
357 static struct gdbarch_data *d_type_data;
358 
359 /* Return the D type table for the specified architecture.  */
360 
361 const struct builtin_d_type *
362 builtin_d_type (struct gdbarch *gdbarch)
363 {
364   return (const struct builtin_d_type *) gdbarch_data (gdbarch, d_type_data);
365 }
366 
367 void _initialize_d_language ();
368 void
369 _initialize_d_language ()
370 {
371   d_type_data = gdbarch_data_register_post_init (build_d_types);
372 }
373