/* D language support routines for GDB, the GNU debugger.
- Copyright (C) 2005, 2006, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 2005-2014 Free Software Foundation, Inc.
This file is part of GDB.
#include "defs.h"
#include "symtab.h"
#include "language.h"
+#include "varobj.h"
#include "d-lang.h"
#include "c-lang.h"
-#include "gdb_string.h"
+#include <string.h>
#include "parser-defs.h"
#include "gdb_obstack.h"
#include <ctype.h>
+/* The name of the symbol to use to get the name of the main subprogram. */
+static const char D_MAIN[] = "D main";
+
+/* Function returning the special symbol name used by D for the main
+ procedure in the main program if it is found in minimal symbol list.
+ This function tries to find minimal symbols so that it finds them even
+ if the program was compiled without debugging information. */
+
+const char *
+d_main_name (void)
+{
+ struct minimal_symbol *msym;
+
+ msym = lookup_minimal_symbol (D_MAIN, NULL, NULL);
+ if (msym != NULL)
+ return D_MAIN;
+
+ /* No known entry procedure found, the main program is probably not D. */
+ return NULL;
+}
+
/* Extract identifiers from MANGLED_STR and append it to TEMPBUF.
Return 1 on success or 0 on failure. */
static int
{NULL, 0, 0, 0}
};
+/* Mapping of all D basic data types into the language vector. */
+
+enum d_primitive_types {
+ d_primitive_type_void,
+ d_primitive_type_bool,
+ d_primitive_type_byte,
+ d_primitive_type_ubyte,
+ d_primitive_type_short,
+ d_primitive_type_ushort,
+ d_primitive_type_int,
+ d_primitive_type_uint,
+ d_primitive_type_long,
+ d_primitive_type_ulong,
+ d_primitive_type_cent, /* Signed 128 bit integer. */
+ d_primitive_type_ucent, /* Unsigned 128 bit integer. */
+ d_primitive_type_float,
+ d_primitive_type_double,
+ d_primitive_type_real,
+ d_primitive_type_ifloat, /* Imaginary float types. */
+ d_primitive_type_idouble,
+ d_primitive_type_ireal,
+ d_primitive_type_cfloat, /* Complex number of two float values. */
+ d_primitive_type_cdouble,
+ d_primitive_type_creal,
+ d_primitive_type_char, /* Unsigned character types. */
+ d_primitive_type_wchar,
+ d_primitive_type_dchar,
+ nr_d_primitive_types
+};
+
+/* Implements the la_language_arch_info language_defn routine
+ for language D. */
+
+static void
+d_language_arch_info (struct gdbarch *gdbarch,
+ struct language_arch_info *lai)
+{
+ const struct builtin_d_type *builtin = builtin_d_type (gdbarch);
+
+ lai->string_char_type = builtin->builtin_char;
+ lai->primitive_type_vector
+ = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_d_primitive_types + 1,
+ struct type *);
+
+ lai->primitive_type_vector [d_primitive_type_void]
+ = builtin->builtin_void;
+ lai->primitive_type_vector [d_primitive_type_bool]
+ = builtin->builtin_bool;
+ lai->primitive_type_vector [d_primitive_type_byte]
+ = builtin->builtin_byte;
+ lai->primitive_type_vector [d_primitive_type_ubyte]
+ = builtin->builtin_ubyte;
+ lai->primitive_type_vector [d_primitive_type_short]
+ = builtin->builtin_short;
+ lai->primitive_type_vector [d_primitive_type_ushort]
+ = builtin->builtin_ushort;
+ lai->primitive_type_vector [d_primitive_type_int]
+ = builtin->builtin_int;
+ lai->primitive_type_vector [d_primitive_type_uint]
+ = builtin->builtin_uint;
+ lai->primitive_type_vector [d_primitive_type_long]
+ = builtin->builtin_long;
+ lai->primitive_type_vector [d_primitive_type_ulong]
+ = builtin->builtin_ulong;
+ lai->primitive_type_vector [d_primitive_type_cent]
+ = builtin->builtin_cent;
+ lai->primitive_type_vector [d_primitive_type_ucent]
+ = builtin->builtin_ucent;
+ lai->primitive_type_vector [d_primitive_type_float]
+ = builtin->builtin_float;
+ lai->primitive_type_vector [d_primitive_type_double]
+ = builtin->builtin_double;
+ lai->primitive_type_vector [d_primitive_type_real]
+ = builtin->builtin_real;
+ lai->primitive_type_vector [d_primitive_type_ifloat]
+ = builtin->builtin_ifloat;
+ lai->primitive_type_vector [d_primitive_type_idouble]
+ = builtin->builtin_idouble;
+ lai->primitive_type_vector [d_primitive_type_ireal]
+ = builtin->builtin_ireal;
+ lai->primitive_type_vector [d_primitive_type_cfloat]
+ = builtin->builtin_cfloat;
+ lai->primitive_type_vector [d_primitive_type_cdouble]
+ = builtin->builtin_cdouble;
+ lai->primitive_type_vector [d_primitive_type_creal]
+ = builtin->builtin_creal;
+ lai->primitive_type_vector [d_primitive_type_char]
+ = builtin->builtin_char;
+ lai->primitive_type_vector [d_primitive_type_wchar]
+ = builtin->builtin_wchar;
+ lai->primitive_type_vector [d_primitive_type_dchar]
+ = builtin->builtin_dchar;
+
+ lai->bool_type_symbol = "bool";
+ lai->bool_type_default = builtin->builtin_bool;
+}
+
static const struct language_defn d_language_defn =
{
"d",
+ "D",
language_d,
range_check_off,
- type_check_off,
case_sensitive_on,
array_row_major,
- macro_expansion_c,
+ macro_expansion_no,
&exp_descriptor_c,
c_parse,
c_error,
c_printstr, /* Function to print string constant. */
c_emit_char, /* Print a single char. */
c_print_type, /* Print a type using appropriate syntax. */
- c_print_typedef, /* Print a typedef using appropriate syntax. */
+ c_print_typedef, /* Print a typedef using appropriate
+ syntax. */
d_val_print, /* Print a value using appropriate syntax. */
c_value_print, /* Print a top-level value. */
+ default_read_var_value, /* la_read_var_value */
NULL, /* Language specific skip_trampoline. */
"this",
basic_lookup_symbol_nonlocal,
basic_lookup_transparent_type,
d_demangle, /* Language specific symbol demangler. */
- NULL, /* Language specific class_name_from_physname. */
+ NULL, /* Language specific
+ class_name_from_physname. */
d_op_print_tab, /* Expression operators for printing. */
1, /* C-style arrays. */
0, /* String lower bound. */
default_word_break_characters,
default_make_symbol_completion_list,
- c_language_arch_info,
+ d_language_arch_info,
default_print_array_index,
default_pass_by_reference,
c_get_string,
+ NULL, /* la_get_symbol_name_cmp */
+ iterate_over_symbols,
+ &default_varobj_ops,
LANG_MAGIC
};
+/* Build all D language types for the specified architecture. */
+
+static void *
+build_d_types (struct gdbarch *gdbarch)
+{
+ struct builtin_d_type *builtin_d_type
+ = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_d_type);
+
+ /* Basic types. */
+ builtin_d_type->builtin_void
+ = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void");
+ builtin_d_type->builtin_bool
+ = arch_boolean_type (gdbarch, 8, 1, "bool");
+ builtin_d_type->builtin_byte
+ = arch_integer_type (gdbarch, 8, 0, "byte");
+ builtin_d_type->builtin_ubyte
+ = arch_integer_type (gdbarch, 8, 1, "ubyte");
+ builtin_d_type->builtin_short
+ = arch_integer_type (gdbarch, 16, 0, "short");
+ builtin_d_type->builtin_ushort
+ = arch_integer_type (gdbarch, 16, 1, "ushort");
+ builtin_d_type->builtin_int
+ = arch_integer_type (gdbarch, 32, 0, "int");
+ builtin_d_type->builtin_uint
+ = arch_integer_type (gdbarch, 32, 1, "uint");
+ builtin_d_type->builtin_long
+ = arch_integer_type (gdbarch, 64, 0, "long");
+ builtin_d_type->builtin_ulong
+ = arch_integer_type (gdbarch, 64, 1, "ulong");
+ builtin_d_type->builtin_cent
+ = arch_integer_type (gdbarch, 128, 0, "cent");
+ builtin_d_type->builtin_ucent
+ = arch_integer_type (gdbarch, 128, 1, "ucent");
+ builtin_d_type->builtin_float
+ = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch),
+ "float", NULL);
+ builtin_d_type->builtin_double
+ = arch_float_type (gdbarch, gdbarch_double_bit (gdbarch),
+ "double", NULL);
+ builtin_d_type->builtin_real
+ = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch),
+ "real", NULL);
+
+ TYPE_INSTANCE_FLAGS (builtin_d_type->builtin_byte)
+ |= TYPE_INSTANCE_FLAG_NOTTEXT;
+ TYPE_INSTANCE_FLAGS (builtin_d_type->builtin_ubyte)
+ |= TYPE_INSTANCE_FLAG_NOTTEXT;
+
+ /* Imaginary and complex types. */
+ builtin_d_type->builtin_ifloat
+ = arch_float_type (gdbarch, gdbarch_float_bit (gdbarch),
+ "ifloat", NULL);
+ builtin_d_type->builtin_idouble
+ = arch_float_type (gdbarch, gdbarch_double_bit (gdbarch),
+ "idouble", NULL);
+ builtin_d_type->builtin_ireal
+ = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch),
+ "ireal", NULL);
+ builtin_d_type->builtin_cfloat
+ = arch_complex_type (gdbarch, "cfloat",
+ builtin_d_type->builtin_float);
+ builtin_d_type->builtin_cdouble
+ = arch_complex_type (gdbarch, "cdouble",
+ builtin_d_type->builtin_double);
+ builtin_d_type->builtin_creal
+ = arch_complex_type (gdbarch, "creal",
+ builtin_d_type->builtin_real);
+
+ /* Character types. */
+ builtin_d_type->builtin_char
+ = arch_character_type (gdbarch, 8, 1, "char");
+ builtin_d_type->builtin_wchar
+ = arch_character_type (gdbarch, 16, 1, "wchar");
+ builtin_d_type->builtin_dchar
+ = arch_character_type (gdbarch, 32, 1, "dchar");
+
+ return builtin_d_type;
+}
+
+static struct gdbarch_data *d_type_data;
+
+/* Return the D type table for the specified architecture. */
+
+const struct builtin_d_type *
+builtin_d_type (struct gdbarch *gdbarch)
+{
+ return gdbarch_data (gdbarch, d_type_data);
+}
+
+/* Provide a prototype to silence -Wmissing-prototypes. */
+extern initialize_file_ftype _initialize_d_language;
+
void
_initialize_d_language (void)
{
+ d_type_data = gdbarch_data_register_post_init (build_d_types);
+
add_language (&d_language_defn);
}