Define all basic data types of D and add them to the primitive type
language vector. gdb/ChangeLog: 2014-01-17 Iain Buclaw <ibuclaw@gdcproject.org> * d-lang.h (struct builtin_d_type): New data type. (builtin_d_type): Add declaration. * d-lang.c (d_language_arch_info, build_d_types) (builtin_d_type): New functions. (enum d_primitive_types): New data type. (d_language_defn): Change c_language_arch_info to d_language_arch_info. (d_type_data): New static variable. (_initialize_d_language): Initialize d_type_data. gdb/testsuite/ChangeLog: 2014-01-17 Iain Buclaw <ibuclaw@gdcproject.org> * gdb.dlang/primitive-types.exp: New file.
This commit is contained in:
parent
6377854769
commit
94b1b47ee1
|
@ -1,3 +1,15 @@
|
|||
2014-01-17 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
* d-lang.h (struct builtin_d_type): New data type.
|
||||
(builtin_d_type): Add declaration.
|
||||
* d-lang.c (d_language_arch_info, build_d_types)
|
||||
(builtin_d_type): New functions.
|
||||
(enum d_primitive_types): New data type.
|
||||
(d_language_defn): Change c_language_arch_info to
|
||||
d_language_arch_info.
|
||||
(d_type_data): New static variable.
|
||||
(_initialize_d_language): Initialize d_type_data.
|
||||
|
||||
2014-01-17 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
* d-lang.h (d_main_name): Add declaration.
|
||||
|
|
190
gdb/d-lang.c
190
gdb/d-lang.c
|
@ -257,6 +257,103 @@ static const struct op_print d_op_print_tab[] =
|
|||
{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",
|
||||
|
@ -291,7 +388,7 @@ static const struct language_defn d_language_defn =
|
|||
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,
|
||||
|
@ -301,11 +398,102 @@ static const struct language_defn d_language_defn =
|
|||
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);
|
||||
}
|
||||
|
|
36
gdb/d-lang.h
36
gdb/d-lang.h
|
@ -22,12 +22,48 @@
|
|||
|
||||
#include "symtab.h"
|
||||
|
||||
/* Language specific builtin types for D. Any additional types added
|
||||
should be kept in sync with enum d_primitive_types, where these
|
||||
types are documented. */
|
||||
|
||||
struct builtin_d_type
|
||||
{
|
||||
struct type *builtin_void;
|
||||
struct type *builtin_bool;
|
||||
struct type *builtin_byte;
|
||||
struct type *builtin_ubyte;
|
||||
struct type *builtin_short;
|
||||
struct type *builtin_ushort;
|
||||
struct type *builtin_int;
|
||||
struct type *builtin_uint;
|
||||
struct type *builtin_long;
|
||||
struct type *builtin_ulong;
|
||||
struct type *builtin_cent;
|
||||
struct type *builtin_ucent;
|
||||
struct type *builtin_float;
|
||||
struct type *builtin_double;
|
||||
struct type *builtin_real;
|
||||
struct type *builtin_ifloat;
|
||||
struct type *builtin_idouble;
|
||||
struct type *builtin_ireal;
|
||||
struct type *builtin_cfloat;
|
||||
struct type *builtin_cdouble;
|
||||
struct type *builtin_creal;
|
||||
struct type *builtin_char;
|
||||
struct type *builtin_wchar;
|
||||
struct type *builtin_dchar;
|
||||
};
|
||||
|
||||
/* Defined in d-lang.c */
|
||||
|
||||
extern const char *d_main_name (void);
|
||||
|
||||
extern char *d_demangle (const char *mangled, int options);
|
||||
|
||||
extern const struct builtin_d_type *builtin_d_type (struct gdbarch *);
|
||||
|
||||
/* Defined in d-valprint.c */
|
||||
|
||||
extern void d_val_print (struct type *type, const gdb_byte *valaddr,
|
||||
int embedded_offset, CORE_ADDR address,
|
||||
struct ui_file *stream, int recurse,
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2014-01-17 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
* gdb.dlang/primitive-types.exp: New file.
|
||||
|
||||
2014-01-17 Iain Buclaw <ibuclaw@gdcproject.org>
|
||||
|
||||
* configure.ac: Create gdb.dlang/Makefile.
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
# Copyright (C) 2014 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Test basic builtin types.
|
||||
# NOTE: The tests here intentionally do not require a D compiler.
|
||||
|
||||
load_lib "d-support.exp"
|
||||
|
||||
if { [skip_d_tests] } { continue }
|
||||
|
||||
proc test_builtin_d_types_accepted {} {
|
||||
# Test types are recognised.
|
||||
|
||||
gdb_test "ptype void" "type = void"
|
||||
gdb_test "ptype bool" "type = bool"
|
||||
gdb_test "ptype byte" "type = byte"
|
||||
gdb_test "ptype ubyte" "type = ubyte"
|
||||
gdb_test "ptype short" "type = short"
|
||||
gdb_test "ptype ushort" "type = ushort"
|
||||
gdb_test "ptype int" "type = int"
|
||||
gdb_test "ptype uint" "type = uint"
|
||||
gdb_test "ptype long" "type = long"
|
||||
gdb_test "ptype ulong" "type = ulong"
|
||||
gdb_test "ptype cent" "type = cent"
|
||||
gdb_test "ptype ucent" "type = ucent"
|
||||
gdb_test "ptype float" "type = float"
|
||||
gdb_test "ptype double" "type = double"
|
||||
gdb_test "ptype real" "type = real"
|
||||
gdb_test "ptype ifloat" "type = ifloat"
|
||||
gdb_test "ptype idouble" "type = idouble"
|
||||
gdb_test "ptype ireal" "type = ireal"
|
||||
gdb_test "ptype cfloat" "type = cfloat"
|
||||
gdb_test "ptype cdouble" "type = cdouble"
|
||||
gdb_test "ptype creal" "type = creal"
|
||||
gdb_test "ptype char" "type = char"
|
||||
gdb_test "ptype wchar" "type = wchar"
|
||||
gdb_test "ptype dchar" "type = dchar"
|
||||
}
|
||||
|
||||
# Start with a fresh gdb.
|
||||
|
||||
gdb_exit
|
||||
gdb_start
|
||||
|
||||
if [set_lang_d] {
|
||||
test_builtin_d_types_accepted
|
||||
} else {
|
||||
warning "D type tests suppressed."
|
||||
}
|
Loading…
Reference in New Issue