From 88dfca6c43c11dea69db24cfb87e6821e63e29b2 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Tue, 6 Sep 2016 17:26:32 +0200 Subject: [PATCH] Add some missing arch_..._type helpers gdbtypes provides a number of helper routines that can be called instead of using arch_type directly to create a type of a particular kind. This patch adds two additional such routines that have been missing so far, to allow creation of TYPE_CODE_DECFLOAT and TYPE_CODE_POINTER types. The patch also changes a number of places to use the new helper routines instead of calling arch_type directly. No functional change intended. gdb/ChangeLog: * gdbtypes.h (arch_decfloat_type): New prototype. (arch_pointer_type): Likewise. * gdbtypes.c (arch_decfloat_type): New function. (arch_pointer_type): Likewise. (gdbtypes_post_init): Use arch_decfloat_type. * avr-tdep.c (avr_gdbarch_init): Use arch_pointer_type. * ft32-tdep.c (ft32_gdbarch_init): Likewise. * m32c-tdep.c (make_types): Likewise. * rl78-tdep.c (rl78_gdbarch_init): Likewise. Signed-off-by: Ulrich Weigand --- gdb/ChangeLog | 12 ++++++++++++ gdb/avr-tdep.c | 5 ++--- gdb/ft32-tdep.c | 5 ++--- gdb/gdbtypes.c | 35 ++++++++++++++++++++++++++++++++--- gdb/gdbtypes.h | 3 +++ gdb/m32c-tdep.c | 15 +++------------ gdb/rl78-tdep.c | 11 ++--------- 7 files changed, 56 insertions(+), 30 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 95627c2d18d..437fedbbe7a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2016-09-05 Ulrich Weigand + + * gdbtypes.h (arch_decfloat_type): New prototype. + (arch_pointer_type): Likewise. + * gdbtypes.c (arch_decfloat_type): New function. + (arch_pointer_type): Likewise. + (gdbtypes_post_init): Use arch_decfloat_type. + * avr-tdep.c (avr_gdbarch_init): Use arch_pointer_type. + * ft32-tdep.c (ft32_gdbarch_init): Likewise. + * m32c-tdep.c (make_types): Likewise. + * rl78-tdep.c (rl78_gdbarch_init): Likewise. + 2016-09-05 Ulrich Weigand * gdbtypes.c (set_type_code): New function. diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index f6f43a0a233..c5f32a6b33c 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -1466,9 +1466,8 @@ avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) be defined. */ tdep->void_type = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void"); tdep->func_void_type = make_function_type (tdep->void_type, NULL); - tdep->pc_type = arch_type (gdbarch, TYPE_CODE_PTR, 4, NULL); - TYPE_TARGET_TYPE (tdep->pc_type) = tdep->func_void_type; - TYPE_UNSIGNED (tdep->pc_type) = 1; + tdep->pc_type = arch_pointer_type (gdbarch, 4 * TARGET_CHAR_BIT, NULL, + tdep->func_void_type); set_gdbarch_short_bit (gdbarch, 2 * TARGET_CHAR_BIT); set_gdbarch_int_bit (gdbarch, 2 * TARGET_CHAR_BIT); diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c index 5eaa6825adb..db04d2e7abd 100644 --- a/gdb/ft32-tdep.c +++ b/gdb/ft32-tdep.c @@ -610,9 +610,8 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) be defined. */ void_type = arch_type (gdbarch, TYPE_CODE_VOID, 1, "void"); func_void_type = make_function_type (void_type, NULL); - tdep->pc_type = arch_type (gdbarch, TYPE_CODE_PTR, 4, NULL); - TYPE_TARGET_TYPE (tdep->pc_type) = func_void_type; - TYPE_UNSIGNED (tdep->pc_type) = 1; + tdep->pc_type = arch_pointer_type (gdbarch, 4 * TARGET_CHAR_BIT, NULL, + func_void_type); TYPE_INSTANCE_FLAGS (tdep->pc_type) |= TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; set_gdbarch_read_pc (gdbarch, ft32_read_pc); diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 241bf08d53d..45fdf84f384 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -4740,6 +4740,18 @@ arch_float_type (struct gdbarch *gdbarch, return t; } +/* Allocate a TYPE_CODE_DECFLOAT type structure associated with GDBARCH. + BIT is the type size in bits. NAME is the type name. */ + +struct type * +arch_decfloat_type (struct gdbarch *gdbarch, int bit, const char *name) +{ + struct type *t; + + t = arch_type (gdbarch, TYPE_CODE_DECFLOAT, bit / TARGET_CHAR_BIT, name); + return t; +} + /* Allocate a TYPE_CODE_COMPLEX type structure associated with GDBARCH. NAME is the type name. TARGET_TYPE is the component float type. */ @@ -4755,6 +4767,23 @@ arch_complex_type (struct gdbarch *gdbarch, return t; } +/* Allocate a TYPE_CODE_PTR type structure associated with GDBARCH. + BIT is the pointer type size in bits. NAME is the type name. + TARGET_TYPE is the pointer target type. Always sets the pointer type's + TYPE_UNSIGNED flag. */ + +struct type * +arch_pointer_type (struct gdbarch *gdbarch, + int bit, const char *name, struct type *target_type) +{ + struct type *t; + + t = arch_type (gdbarch, TYPE_CODE_PTR, bit / TARGET_CHAR_BIT, name); + TYPE_TARGET_TYPE (t) = target_type; + TYPE_UNSIGNED (t) = 1; + return t; +} + /* Allocate a TYPE_CODE_FLAGS type structure associated with GDBARCH. NAME is the type name. LENGTH is the size of the flag word in bytes. */ @@ -4971,11 +5000,11 @@ gdbtypes_post_init (struct gdbarch *gdbarch) /* The following three are about decimal floating point types, which are 32-bits, 64-bits and 128-bits respectively. */ builtin_type->builtin_decfloat - = arch_type (gdbarch, TYPE_CODE_DECFLOAT, 32 / 8, "_Decimal32"); + = arch_decfloat_type (gdbarch, 32, "_Decimal32"); builtin_type->builtin_decdouble - = arch_type (gdbarch, TYPE_CODE_DECFLOAT, 64 / 8, "_Decimal64"); + = arch_decfloat_type (gdbarch, 64, "_Decimal64"); builtin_type->builtin_declong - = arch_type (gdbarch, TYPE_CODE_DECFLOAT, 128 / 8, "_Decimal128"); + = arch_decfloat_type (gdbarch, 128, "_Decimal128"); /* "True" character types. */ builtin_type->builtin_true_char diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 2dda074d737..579a34bc00e 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -1686,8 +1686,11 @@ extern struct type *arch_boolean_type (struct gdbarch *, int, int, const char *); extern struct type *arch_float_type (struct gdbarch *, int, const char *, const struct floatformat **); +extern struct type *arch_decfloat_type (struct gdbarch *, int, const char *); extern struct type *arch_complex_type (struct gdbarch *, const char *, struct type *); +extern struct type *arch_pointer_type (struct gdbarch *, int, const char *, + struct type *); /* Helper functions to construct a struct or record type. An initially empty type is created using arch_composite_type(). diff --git a/gdb/m32c-tdep.c b/gdb/m32c-tdep.c index 1e98f73a35c..547c997c6af 100644 --- a/gdb/m32c-tdep.c +++ b/gdb/m32c-tdep.c @@ -192,27 +192,18 @@ make_types (struct gdbarch *arch) this is called, so we avoid using them. */ tdep->voyd = arch_type (arch, TYPE_CODE_VOID, 1, "void"); tdep->ptr_voyd - = arch_type (arch, TYPE_CODE_PTR, gdbarch_ptr_bit (arch) / TARGET_CHAR_BIT, - NULL); - TYPE_TARGET_TYPE (tdep->ptr_voyd) = tdep->voyd; - TYPE_UNSIGNED (tdep->ptr_voyd) = 1; + = arch_pointer_type (arch, gdbarch_ptr_bit (arch), NULL, tdep->voyd); tdep->func_voyd = lookup_function_type (tdep->voyd); xsnprintf (type_name, sizeof (type_name), "%s_data_addr_t", gdbarch_bfd_arch_info (arch)->printable_name); tdep->data_addr_reg_type - = arch_type (arch, TYPE_CODE_PTR, data_addr_reg_bits / TARGET_CHAR_BIT, - xstrdup (type_name)); - TYPE_TARGET_TYPE (tdep->data_addr_reg_type) = tdep->voyd; - TYPE_UNSIGNED (tdep->data_addr_reg_type) = 1; + = arch_pointer_type (arch, data_addr_reg_bits, type_name, tdep->voyd); xsnprintf (type_name, sizeof (type_name), "%s_code_addr_t", gdbarch_bfd_arch_info (arch)->printable_name); tdep->code_addr_reg_type - = arch_type (arch, TYPE_CODE_PTR, code_addr_reg_bits / TARGET_CHAR_BIT, - xstrdup (type_name)); - TYPE_TARGET_TYPE (tdep->code_addr_reg_type) = tdep->func_voyd; - TYPE_UNSIGNED (tdep->code_addr_reg_type) = 1; + = arch_pointer_type (arch, code_addr_reg_bits, type_name, tdep->func_voyd); tdep->uint8 = arch_integer_type (arch, 8, 1, "uint8_t"); tdep->uint16 = arch_integer_type (arch, 16, 1, "uint16_t"); diff --git a/gdb/rl78-tdep.c b/gdb/rl78-tdep.c index 420ee868fa3..4818d3816f4 100644 --- a/gdb/rl78-tdep.c +++ b/gdb/rl78-tdep.c @@ -1410,16 +1410,9 @@ rl78_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->rl78_int32 = arch_integer_type (gdbarch, 32, 0, "int32_t"); tdep->rl78_data_pointer - = arch_type (gdbarch, TYPE_CODE_PTR, 16 / TARGET_CHAR_BIT, - xstrdup ("rl78_data_addr_t")); - TYPE_TARGET_TYPE (tdep->rl78_data_pointer) = tdep->rl78_void; - TYPE_UNSIGNED (tdep->rl78_data_pointer) = 1; - + = arch_pointer_type (gdbarch, 16, "rl78_data_addr_t", tdep->rl78_void); tdep->rl78_code_pointer - = arch_type (gdbarch, TYPE_CODE_PTR, 32 / TARGET_CHAR_BIT, - xstrdup ("rl78_code_addr_t")); - TYPE_TARGET_TYPE (tdep->rl78_code_pointer) = tdep->rl78_void; - TYPE_UNSIGNED (tdep->rl78_code_pointer) = 1; + = arch_pointer_type (gdbarch, 32, "rl78_code_addr_t", tdep->rl78_void); tdep->rl78_psw_type = arch_flags_type (gdbarch, "builtin_type_rl78_psw", 1); append_flags_type_flag (tdep->rl78_psw_type, 0, "CY"); -- 2.30.2