Use type_instance_flags more throughout

A later patch in this series will rewrite enum_flags fixing some API
holes.  That would cause build failures around code using
type_instance_flags.  Or rather, that should be using it, but wasn't.

This patch fixes it by using type_instance_flags throughout instead of
plain integers.

Note that we can't make the seemingly obvious change to struct
type::instance_flags:

 -  unsigned instance_flags : 9;
 +  ENUM_BITFIELD (type_instance_flag_value) instance_flags : 9;

Because G++ complains then that 9 bits isn't sufficient for holding
all values of type_instance_flag_value.

So the patch adds an type::instance_flags() method, which takes care
of casting appropriately, and adds a separate type::set_instance_flags
method, following the pattern of the ongoing TYPE_XXX macro
elimination.  This converts uses of TYPE_INSTANCE_FLAGS to
type::instance_flags() in the places where the code was already being
touched, but there are still many references to the
TYPE_INSTANCE_FLAGS macro left behind.  Those could/should be fully
replaced at some point.

gdb/ChangeLog:

	* avr-tdep.c (avr_address_class_type_flags): Return
	type_instance_flags.
	(avr_address_class_type_flags_to_name): Take a
	type_instance_flags.
	(avr_address_class_name_to_type_flags): Return bool and take a
	type_instance_flags.
	* d-lang.c (build_d_types): Use type::set_instance_flags.
	* ft32-tdep.c (ft32_address_class_type_flags): Return
	type_instance_flags.
	(ft32_address_class_type_flags_to_name): Take a
	type_instance_flags.
	(ft32_address_class_name_to_type_flags): Return bool and take a
	type_instance_flags.
	(ft32_gdbarch_init): Use type::set_instance_flags.
	* eval.c (fake_method::fake_method): Use type::set_instance_flags.
	* gdbarch.h, gdbarch.c: Regenerate.
	* gdbarch.sh (address_class_type_flags): Use type_instance_flags.
	(address_class_name_to_type_flags): Use type_instance_flags and
	bool.
	* gdbtypes.c (address_space_name_to_int)
	(address_space_int_to_name, make_qualified_type): Use
	type_instance_flags.
	(make_qualified_type): Use type_instance_flags and
	type::set_instance_flags.
	(make_type_with_address_space, make_cv_type, make_vector_type)
	(check_typedef): Use type_instance_flags.
	(recursive_dump_type): Cast type_instance_flags to unsigned for
	printing.
	(copy_type_recursive): Use type::set_instance_flags.
	(gdbtypes_post_init): Use type::set_instance_flags.
	* gdbtypes.h (struct type) <instance_flags>: Rename to ...
	<m_instance_flags>: ... this.
	<instance_flags, set_instance_flags>: New methods.
	(TYPE_INSTANCE_FLAGS): Use the instance_flags method.
	(SET_TYPE_INSTANCE_FLAGS): New.
	(address_space_name_to_int, address_space_int_to_name)
	(make_type_with_address_space): Pass flags using
	type_instance_flags instead of int.
	* stabsread.c (cleanup_undefined_types_noname): Use
	type::set_instance_flags.
	* s390-tdep.c (s390_address_class_type_flags): Return
	type_instance_flags.
	(s390_address_class_type_flags_to_name): Take a
	type_instance_flags.
	(s390_address_class_name_to_type_flags): Return bool and take a
	type_instance_flags.
	* type-stack.c (type_stack::follow_types): Use
	type_instance_flags.
	* dwarf2/read.c (read_tag_pointer_type): Use type_instance_flags.
This commit is contained in:
Pedro Alves 2020-09-14 21:16:56 +01:00
parent 27087b7f6c
commit 314ad88df6
14 changed files with 168 additions and 85 deletions

View file

@ -1,3 +1,56 @@
2020-09-14 Pedro Alves <pedro@palves.net>
Andrew Burgess <andrew.burgess@embecosm.com>
* avr-tdep.c (avr_address_class_type_flags): Return
type_instance_flags.
(avr_address_class_type_flags_to_name): Take a
type_instance_flags.
(avr_address_class_name_to_type_flags): Return bool and take a
type_instance_flags.
* d-lang.c (build_d_types): Use type::set_instance_flags.
* ft32-tdep.c (ft32_address_class_type_flags): Return
type_instance_flags.
(ft32_address_class_type_flags_to_name): Take a
type_instance_flags.
(ft32_address_class_name_to_type_flags): Return bool and take a
type_instance_flags.
(ft32_gdbarch_init): Use type::set_instance_flags.
* eval.c (fake_method::fake_method): Use type::set_instance_flags.
* gdbarch.h, gdbarch.c: Regenerate.
* gdbarch.sh (address_class_type_flags): Use type_instance_flags.
(address_class_name_to_type_flags): Use type_instance_flags and
bool.
* gdbtypes.c (address_space_name_to_int)
(address_space_int_to_name, make_qualified_type): Use
type_instance_flags.
(make_qualified_type): Use type_instance_flags and
type::set_instance_flags.
(make_type_with_address_space, make_cv_type, make_vector_type)
(check_typedef): Use type_instance_flags.
(recursive_dump_type): Cast type_instance_flags to unsigned for
printing.
(copy_type_recursive): Use type::set_instance_flags.
(gdbtypes_post_init): Use type::set_instance_flags.
* gdbtypes.h (struct type) <instance_flags>: Rename to ...
<m_instance_flags>: ... this.
<instance_flags, set_instance_flags>: New methods.
(TYPE_INSTANCE_FLAGS): Use the instance_flags method.
(SET_TYPE_INSTANCE_FLAGS): New.
(address_space_name_to_int, address_space_int_to_name)
(make_type_with_address_space): Pass flags using
type_instance_flags instead of int.
* stabsread.c (cleanup_undefined_types_noname): Use
type::set_instance_flags.
* s390-tdep.c (s390_address_class_type_flags): Return
type_instance_flags.
(s390_address_class_type_flags_to_name): Take a
type_instance_flags.
(s390_address_class_name_to_type_flags): Return bool and take a
type_instance_flags.
* type-stack.c (type_stack::follow_types): Use
type_instance_flags.
* dwarf2/read.c (read_tag_pointer_type): Use type_instance_flags.
2020-09-14 Tom Tromey <tromey@adacore.com> 2020-09-14 Tom Tromey <tromey@adacore.com>
* x86-tdep.h (x86_in_indirect_branch_thunk): Update. * x86-tdep.h (x86_in_indirect_branch_thunk): Update.

View file

@ -1372,7 +1372,7 @@ avr_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
This method maps DW_AT_address_class attributes to a This method maps DW_AT_address_class attributes to a
type_instance_flag_value. */ type_instance_flag_value. */
static int static type_instance_flags
avr_address_class_type_flags (int byte_size, int dwarf2_addr_class) avr_address_class_type_flags (int byte_size, int dwarf2_addr_class)
{ {
/* The value 1 of the DW_AT_address_class attribute corresponds to the /* The value 1 of the DW_AT_address_class attribute corresponds to the
@ -1389,7 +1389,8 @@ avr_address_class_type_flags (int byte_size, int dwarf2_addr_class)
Convert a type_instance_flag_value to an address space qualifier. */ Convert a type_instance_flag_value to an address space qualifier. */
static const char* static const char*
avr_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags) avr_address_class_type_flags_to_name (struct gdbarch *gdbarch,
type_instance_flags type_flags)
{ {
if (type_flags & AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH) if (type_flags & AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH)
return "flash"; return "flash";
@ -1401,18 +1402,18 @@ avr_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
Convert an address space qualifier to a type_instance_flag_value. */ Convert an address space qualifier to a type_instance_flag_value. */
static int static bool
avr_address_class_name_to_type_flags (struct gdbarch *gdbarch, avr_address_class_name_to_type_flags (struct gdbarch *gdbarch,
const char* name, const char* name,
int *type_flags_ptr) type_instance_flags *type_flags_ptr)
{ {
if (strcmp (name, "flash") == 0) if (strcmp (name, "flash") == 0)
{ {
*type_flags_ptr = AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH; *type_flags_ptr = AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH;
return 1; return true;
} }
else else
return 0; return false;
} }
/* Initialize the gdbarch structure for the AVR's. */ /* Initialize the gdbarch structure for the AVR's. */

View file

@ -321,10 +321,13 @@ build_d_types (struct gdbarch *gdbarch)
= arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch), = arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch),
"real", gdbarch_long_double_format (gdbarch)); "real", gdbarch_long_double_format (gdbarch));
TYPE_INSTANCE_FLAGS (builtin_d_type->builtin_byte) builtin_d_type->builtin_byte->set_instance_flags
|= TYPE_INSTANCE_FLAG_NOTTEXT; (builtin_d_type->builtin_byte->instance_flags ()
TYPE_INSTANCE_FLAGS (builtin_d_type->builtin_ubyte) | TYPE_INSTANCE_FLAG_NOTTEXT);
|= TYPE_INSTANCE_FLAG_NOTTEXT;
builtin_d_type->builtin_ubyte->set_instance_flags
(builtin_d_type->builtin_ubyte->instance_flags ()
| TYPE_INSTANCE_FLAG_NOTTEXT);
/* Imaginary and complex types. */ /* Imaginary and complex types. */
builtin_d_type->builtin_ifloat builtin_d_type->builtin_ifloat

View file

@ -17296,10 +17296,9 @@ read_tag_pointer_type (struct die_info *die, struct dwarf2_cu *cu)
{ {
if (gdbarch_address_class_type_flags_p (gdbarch)) if (gdbarch_address_class_type_flags_p (gdbarch))
{ {
int type_flags; type_instance_flags type_flags
= gdbarch_address_class_type_flags (gdbarch, byte_size,
type_flags = gdbarch_address_class_type_flags addr_class);
(gdbarch, byte_size, addr_class);
gdb_assert ((type_flags & ~TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL) gdb_assert ((type_flags & ~TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL)
== 0); == 0);
type = make_type_with_address_space (type, type_flags); type = make_type_with_address_space (type, type_flags);

View file

@ -659,7 +659,7 @@ fake_method::fake_method (type_instance_flags flags,
TYPE_LENGTH (type) = 1; TYPE_LENGTH (type) = 1;
type->set_code (TYPE_CODE_METHOD); type->set_code (TYPE_CODE_METHOD);
TYPE_CHAIN (type) = type; TYPE_CHAIN (type) = type;
TYPE_INSTANCE_FLAGS (type) = flags; type->set_instance_flags (flags);
if (num_types > 0) if (num_types > 0)
{ {
if (param_types[num_types - 1] == NULL) if (param_types[num_types - 1] == NULL)

View file

@ -341,7 +341,7 @@ ft32_pointer_to_address (struct gdbarch *gdbarch,
This method maps DW_AT_address_class attributes to a This method maps DW_AT_address_class attributes to a
type_instance_flag_value. */ type_instance_flag_value. */
static int static type_instance_flags
ft32_address_class_type_flags (int byte_size, int dwarf2_addr_class) ft32_address_class_type_flags (int byte_size, int dwarf2_addr_class)
{ {
/* The value 1 of the DW_AT_address_class attribute corresponds to the /* The value 1 of the DW_AT_address_class attribute corresponds to the
@ -357,7 +357,8 @@ ft32_address_class_type_flags (int byte_size, int dwarf2_addr_class)
Convert a type_instance_flag_value to an address space qualifier. */ Convert a type_instance_flag_value to an address space qualifier. */
static const char* static const char*
ft32_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags) ft32_address_class_type_flags_to_name (struct gdbarch *gdbarch,
type_instance_flags type_flags)
{ {
if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1)
return "flash"; return "flash";
@ -369,18 +370,18 @@ ft32_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
Convert an address space qualifier to a type_instance_flag_value. */ Convert an address space qualifier to a type_instance_flag_value. */
static int static bool
ft32_address_class_name_to_type_flags (struct gdbarch *gdbarch, ft32_address_class_name_to_type_flags (struct gdbarch *gdbarch,
const char* name, const char* name,
int *type_flags_ptr) type_instance_flags *type_flags_ptr)
{ {
if (strcmp (name, "flash") == 0) if (strcmp (name, "flash") == 0)
{ {
*type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
return 1; return true;
} }
else else
return 0; return false;
} }
/* Given a return value in `regbuf' with a type `valtype', /* Given a return value in `regbuf' with a type `valtype',
@ -576,7 +577,8 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
func_void_type = make_function_type (void_type, NULL); func_void_type = make_function_type (void_type, NULL);
tdep->pc_type = arch_pointer_type (gdbarch, 4 * TARGET_CHAR_BIT, NULL, tdep->pc_type = arch_pointer_type (gdbarch, 4 * TARGET_CHAR_BIT, NULL,
func_void_type); func_void_type);
TYPE_INSTANCE_FLAGS (tdep->pc_type) |= TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; tdep->pc_type->set_instance_flags (tdep->pc_type->instance_flags ()
| TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1);
set_gdbarch_num_regs (gdbarch, FT32_NUM_REGS); set_gdbarch_num_regs (gdbarch, FT32_NUM_REGS);
set_gdbarch_sp_regnum (gdbarch, FT32_SP_REGNUM); set_gdbarch_sp_regnum (gdbarch, FT32_SP_REGNUM);

View file

@ -3546,7 +3546,7 @@ gdbarch_address_class_type_flags_p (struct gdbarch *gdbarch)
return gdbarch->address_class_type_flags != NULL; return gdbarch->address_class_type_flags != NULL;
} }
int type_instance_flags
gdbarch_address_class_type_flags (struct gdbarch *gdbarch, int byte_size, int dwarf2_addr_class) gdbarch_address_class_type_flags (struct gdbarch *gdbarch, int byte_size, int dwarf2_addr_class)
{ {
gdb_assert (gdbarch != NULL); gdb_assert (gdbarch != NULL);
@ -3571,7 +3571,7 @@ gdbarch_address_class_type_flags_to_name_p (struct gdbarch *gdbarch)
} }
const char * const char *
gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags) gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, type_instance_flags type_flags)
{ {
gdb_assert (gdbarch != NULL); gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->address_class_type_flags_to_name != NULL); gdb_assert (gdbarch->address_class_type_flags_to_name != NULL);
@ -3611,8 +3611,8 @@ gdbarch_address_class_name_to_type_flags_p (struct gdbarch *gdbarch)
return gdbarch->address_class_name_to_type_flags != NULL; return gdbarch->address_class_name_to_type_flags != NULL;
} }
int bool
gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, const char *name, int *type_flags_ptr) gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, const char *name, type_instance_flags *type_flags_ptr)
{ {
gdb_assert (gdbarch != NULL); gdb_assert (gdbarch != NULL);
gdb_assert (gdbarch->address_class_name_to_type_flags != NULL); gdb_assert (gdbarch->address_class_name_to_type_flags != NULL);

View file

@ -854,14 +854,14 @@ extern void set_gdbarch_have_nonsteppable_watchpoint (struct gdbarch *gdbarch, i
extern int gdbarch_address_class_type_flags_p (struct gdbarch *gdbarch); extern int gdbarch_address_class_type_flags_p (struct gdbarch *gdbarch);
typedef int (gdbarch_address_class_type_flags_ftype) (int byte_size, int dwarf2_addr_class); typedef type_instance_flags (gdbarch_address_class_type_flags_ftype) (int byte_size, int dwarf2_addr_class);
extern int gdbarch_address_class_type_flags (struct gdbarch *gdbarch, int byte_size, int dwarf2_addr_class); extern type_instance_flags gdbarch_address_class_type_flags (struct gdbarch *gdbarch, int byte_size, int dwarf2_addr_class);
extern void set_gdbarch_address_class_type_flags (struct gdbarch *gdbarch, gdbarch_address_class_type_flags_ftype *address_class_type_flags); extern void set_gdbarch_address_class_type_flags (struct gdbarch *gdbarch, gdbarch_address_class_type_flags_ftype *address_class_type_flags);
extern int gdbarch_address_class_type_flags_to_name_p (struct gdbarch *gdbarch); extern int gdbarch_address_class_type_flags_to_name_p (struct gdbarch *gdbarch);
typedef const char * (gdbarch_address_class_type_flags_to_name_ftype) (struct gdbarch *gdbarch, int type_flags); typedef const char * (gdbarch_address_class_type_flags_to_name_ftype) (struct gdbarch *gdbarch, type_instance_flags type_flags);
extern const char * gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags); extern const char * gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, type_instance_flags type_flags);
extern void set_gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, gdbarch_address_class_type_flags_to_name_ftype *address_class_type_flags_to_name); extern void set_gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, gdbarch_address_class_type_flags_to_name_ftype *address_class_type_flags_to_name);
/* Execute vendor-specific DWARF Call Frame Instruction. OP is the instruction. /* Execute vendor-specific DWARF Call Frame Instruction. OP is the instruction.
@ -872,13 +872,13 @@ extern bool gdbarch_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, gdb_by
extern void set_gdbarch_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, gdbarch_execute_dwarf_cfa_vendor_op_ftype *execute_dwarf_cfa_vendor_op); extern void set_gdbarch_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, gdbarch_execute_dwarf_cfa_vendor_op_ftype *execute_dwarf_cfa_vendor_op);
/* Return the appropriate type_flags for the supplied address class. /* Return the appropriate type_flags for the supplied address class.
This function should return 1 if the address class was recognized and This function should return true if the address class was recognized and
type_flags was set, zero otherwise. */ type_flags was set, false otherwise. */
extern int gdbarch_address_class_name_to_type_flags_p (struct gdbarch *gdbarch); extern int gdbarch_address_class_name_to_type_flags_p (struct gdbarch *gdbarch);
typedef int (gdbarch_address_class_name_to_type_flags_ftype) (struct gdbarch *gdbarch, const char *name, int *type_flags_ptr); typedef bool (gdbarch_address_class_name_to_type_flags_ftype) (struct gdbarch *gdbarch, const char *name, type_instance_flags *type_flags_ptr);
extern int gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, const char *name, int *type_flags_ptr); extern bool gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, const char *name, type_instance_flags *type_flags_ptr);
extern void set_gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, gdbarch_address_class_name_to_type_flags_ftype *address_class_name_to_type_flags); extern void set_gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, gdbarch_address_class_name_to_type_flags_ftype *address_class_name_to_type_flags);
/* Is a register in a group */ /* Is a register in a group */

View file

@ -691,16 +691,16 @@ v;int;cannot_step_breakpoint;;;0;0;;0
# See comment in target.h about continuable, steppable and # See comment in target.h about continuable, steppable and
# non-steppable watchpoints. # non-steppable watchpoints.
v;int;have_nonsteppable_watchpoint;;;0;0;;0 v;int;have_nonsteppable_watchpoint;;;0;0;;0
F;int;address_class_type_flags;int byte_size, int dwarf2_addr_class;byte_size, dwarf2_addr_class F;type_instance_flags;address_class_type_flags;int byte_size, int dwarf2_addr_class;byte_size, dwarf2_addr_class
M;const char *;address_class_type_flags_to_name;int type_flags;type_flags M;const char *;address_class_type_flags_to_name;type_instance_flags type_flags;type_flags
# Execute vendor-specific DWARF Call Frame Instruction. OP is the instruction. # Execute vendor-specific DWARF Call Frame Instruction. OP is the instruction.
# FS are passed from the generic execute_cfa_program function. # FS are passed from the generic execute_cfa_program function.
m;bool;execute_dwarf_cfa_vendor_op;gdb_byte op, struct dwarf2_frame_state *fs;op, fs;;default_execute_dwarf_cfa_vendor_op;;0 m;bool;execute_dwarf_cfa_vendor_op;gdb_byte op, struct dwarf2_frame_state *fs;op, fs;;default_execute_dwarf_cfa_vendor_op;;0
# Return the appropriate type_flags for the supplied address class. # Return the appropriate type_flags for the supplied address class.
# This function should return 1 if the address class was recognized and # This function should return true if the address class was recognized and
# type_flags was set, zero otherwise. # type_flags was set, false otherwise.
M;int;address_class_name_to_type_flags;const char *name, int *type_flags_ptr;name, type_flags_ptr M;bool;address_class_name_to_type_flags;const char *name, type_instance_flags *type_flags_ptr;name, type_flags_ptr
# Is a register in a group # Is a register in a group
m;int;register_reggroup_p;int regnum, struct reggroup *reggroup;regnum, reggroup;;default_register_reggroup_p;;0 m;int;register_reggroup_p;int regnum, struct reggroup *reggroup;regnum, reggroup;;default_register_reggroup_p;;0
# Fetch the pointer to the ith function argument. # Fetch the pointer to the ith function argument.

View file

@ -578,11 +578,11 @@ lookup_function_type_with_arguments (struct type *type,
/* Identify address space identifier by name -- /* Identify address space identifier by name --
return the integer flag defined in gdbtypes.h. */ return the integer flag defined in gdbtypes.h. */
int type_instance_flags
address_space_name_to_int (struct gdbarch *gdbarch, address_space_name_to_int (struct gdbarch *gdbarch,
const char *space_identifier) const char *space_identifier)
{ {
int type_flags; type_instance_flags type_flags;
/* Check for known address space delimiters. */ /* Check for known address space delimiters. */
if (!strcmp (space_identifier, "code")) if (!strcmp (space_identifier, "code"))
@ -602,7 +602,8 @@ address_space_name_to_int (struct gdbarch *gdbarch,
gdbtypes.h -- return the string version of the adress space name. */ gdbtypes.h -- return the string version of the adress space name. */
const char * const char *
address_space_int_to_name (struct gdbarch *gdbarch, int space_flag) address_space_int_to_name (struct gdbarch *gdbarch,
type_instance_flags space_flag)
{ {
if (space_flag & TYPE_INSTANCE_FLAG_CODE_SPACE) if (space_flag & TYPE_INSTANCE_FLAG_CODE_SPACE)
return "code"; return "code";
@ -621,7 +622,7 @@ address_space_int_to_name (struct gdbarch *gdbarch, int space_flag)
STORAGE must be in the same obstack as TYPE. */ STORAGE must be in the same obstack as TYPE. */
static struct type * static struct type *
make_qualified_type (struct type *type, int new_flags, make_qualified_type (struct type *type, type_instance_flags new_flags,
struct type *storage) struct type *storage)
{ {
struct type *ntype; struct type *ntype;
@ -661,7 +662,7 @@ make_qualified_type (struct type *type, int new_flags,
TYPE_CHAIN (type) = ntype; TYPE_CHAIN (type) = ntype;
/* Now set the instance flags and return the new type. */ /* Now set the instance flags and return the new type. */
TYPE_INSTANCE_FLAGS (ntype) = new_flags; ntype->set_instance_flags (new_flags);
/* Set length of new type to that of the original type. */ /* Set length of new type to that of the original type. */
TYPE_LENGTH (ntype) = TYPE_LENGTH (type); TYPE_LENGTH (ntype) = TYPE_LENGTH (type);
@ -679,13 +680,14 @@ make_qualified_type (struct type *type, int new_flags,
representations. */ representations. */
struct type * struct type *
make_type_with_address_space (struct type *type, int space_flag) make_type_with_address_space (struct type *type,
type_instance_flags space_flag)
{ {
int new_flags = ((TYPE_INSTANCE_FLAGS (type) type_instance_flags new_flags = ((type->instance_flags ()
& ~(TYPE_INSTANCE_FLAG_CODE_SPACE & ~(TYPE_INSTANCE_FLAG_CODE_SPACE
| TYPE_INSTANCE_FLAG_DATA_SPACE | TYPE_INSTANCE_FLAG_DATA_SPACE
| TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL)) | TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL))
| space_flag); | space_flag);
return make_qualified_type (type, new_flags, NULL); return make_qualified_type (type, new_flags, NULL);
} }
@ -709,9 +711,9 @@ make_cv_type (int cnst, int voltl,
{ {
struct type *ntype; /* New type */ struct type *ntype; /* New type */
int new_flags = (TYPE_INSTANCE_FLAGS (type) type_instance_flags new_flags = (type->instance_flags ()
& ~(TYPE_INSTANCE_FLAG_CONST & ~(TYPE_INSTANCE_FLAG_CONST
| TYPE_INSTANCE_FLAG_VOLATILE)); | TYPE_INSTANCE_FLAG_VOLATILE));
if (cnst) if (cnst)
new_flags |= TYPE_INSTANCE_FLAG_CONST; new_flags |= TYPE_INSTANCE_FLAG_CONST;
@ -1412,7 +1414,6 @@ void
make_vector_type (struct type *array_type) make_vector_type (struct type *array_type)
{ {
struct type *inner_array, *elt_type; struct type *inner_array, *elt_type;
int flags;
/* Find the innermost array type, in case the array is /* Find the innermost array type, in case the array is
multi-dimensional. */ multi-dimensional. */
@ -1423,7 +1424,8 @@ make_vector_type (struct type *array_type)
elt_type = TYPE_TARGET_TYPE (inner_array); elt_type = TYPE_TARGET_TYPE (inner_array);
if (elt_type->code () == TYPE_CODE_INT) if (elt_type->code () == TYPE_CODE_INT)
{ {
flags = TYPE_INSTANCE_FLAGS (elt_type) | TYPE_INSTANCE_FLAG_NOTTEXT; type_instance_flags flags
= elt_type->instance_flags () | TYPE_INSTANCE_FLAG_NOTTEXT;
elt_type = make_qualified_type (elt_type, flags, NULL); elt_type = make_qualified_type (elt_type, flags, NULL);
TYPE_TARGET_TYPE (inner_array) = elt_type; TYPE_TARGET_TYPE (inner_array) = elt_type;
} }
@ -2734,12 +2736,13 @@ struct type *
check_typedef (struct type *type) check_typedef (struct type *type)
{ {
struct type *orig_type = type; struct type *orig_type = type;
/* While we're removing typedefs, we don't want to lose qualifiers.
E.g., const/volatile. */
int instance_flags = TYPE_INSTANCE_FLAGS (type);
gdb_assert (type); gdb_assert (type);
/* While we're removing typedefs, we don't want to lose qualifiers.
E.g., const/volatile. */
type_instance_flags instance_flags = type->instance_flags ();
while (type->code () == TYPE_CODE_TYPEDEF) while (type->code () == TYPE_CODE_TYPEDEF)
{ {
if (!TYPE_TARGET_TYPE (type)) if (!TYPE_TARGET_TYPE (type))
@ -2780,10 +2783,13 @@ check_typedef (struct type *type)
outer cast in a chain of casting win), instead of assuming outer cast in a chain of casting win), instead of assuming
"it can't happen". */ "it can't happen". */
{ {
const int ALL_SPACES = (TYPE_INSTANCE_FLAG_CODE_SPACE const type_instance_flags ALL_SPACES
| TYPE_INSTANCE_FLAG_DATA_SPACE); = (TYPE_INSTANCE_FLAG_CODE_SPACE
const int ALL_CLASSES = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL; | TYPE_INSTANCE_FLAG_DATA_SPACE);
int new_instance_flags = TYPE_INSTANCE_FLAGS (type); const type_instance_flags ALL_CLASSES
= TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL;
type_instance_flags new_instance_flags = type->instance_flags ();
/* Treat code vs data spaces and address classes separately. */ /* Treat code vs data spaces and address classes separately. */
if ((instance_flags & ALL_SPACES) != 0) if ((instance_flags & ALL_SPACES) != 0)
@ -5028,7 +5034,7 @@ recursive_dump_type (struct type *type, int spaces)
gdb_print_host_address (TYPE_CHAIN (type), gdb_stdout); gdb_print_host_address (TYPE_CHAIN (type), gdb_stdout);
printf_filtered ("\n"); printf_filtered ("\n");
printfi_filtered (spaces, "instance_flags 0x%x", printfi_filtered (spaces, "instance_flags 0x%x",
TYPE_INSTANCE_FLAGS (type)); (unsigned) type->instance_flags ());
if (TYPE_CONST (type)) if (TYPE_CONST (type))
{ {
puts_filtered (" TYPE_CONST"); puts_filtered (" TYPE_CONST");
@ -5302,7 +5308,7 @@ copy_type_recursive (struct objfile *objfile,
if (type->name ()) if (type->name ())
new_type->set_name (xstrdup (type->name ())); new_type->set_name (xstrdup (type->name ()));
TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); new_type->set_instance_flags (type->instance_flags ());
TYPE_LENGTH (new_type) = TYPE_LENGTH (type); TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
/* Copy the fields. */ /* Copy the fields. */
@ -5429,7 +5435,7 @@ copy_type (const struct type *type)
gdb_assert (TYPE_OBJFILE_OWNED (type)); gdb_assert (TYPE_OBJFILE_OWNED (type));
new_type = alloc_type_copy (type); new_type = alloc_type_copy (type);
TYPE_INSTANCE_FLAGS (new_type) = TYPE_INSTANCE_FLAGS (type); new_type->set_instance_flags (type->instance_flags ());
TYPE_LENGTH (new_type) = TYPE_LENGTH (type); TYPE_LENGTH (new_type) = TYPE_LENGTH (type);
memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type), memcpy (TYPE_MAIN_TYPE (new_type), TYPE_MAIN_TYPE (type),
sizeof (struct main_type)); sizeof (struct main_type));
@ -5822,10 +5828,14 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
= arch_integer_type (gdbarch, 128, 0, "int128_t"); = arch_integer_type (gdbarch, 128, 0, "int128_t");
builtin_type->builtin_uint128 builtin_type->builtin_uint128
= arch_integer_type (gdbarch, 128, 1, "uint128_t"); = arch_integer_type (gdbarch, 128, 1, "uint128_t");
TYPE_INSTANCE_FLAGS (builtin_type->builtin_int8) |=
TYPE_INSTANCE_FLAG_NOTTEXT; builtin_type->builtin_int8->set_instance_flags
TYPE_INSTANCE_FLAGS (builtin_type->builtin_uint8) |= (builtin_type->builtin_int8->instance_flags ()
TYPE_INSTANCE_FLAG_NOTTEXT; | TYPE_INSTANCE_FLAG_NOTTEXT);
builtin_type->builtin_uint8->set_instance_flags
(builtin_type->builtin_uint8->instance_flags ()
| TYPE_INSTANCE_FLAG_NOTTEXT);
/* Wide character types. */ /* Wide character types. */
builtin_type->builtin_char16 builtin_type->builtin_char16

View file

@ -963,6 +963,18 @@ struct type
this->field (0).set_type (index_type); this->field (0).set_type (index_type);
} }
/* Return the instance flags converted to the correct type. */
const type_instance_flags instance_flags () const
{
return (enum type_instance_flag_value) this->m_instance_flags;
}
/* Set the instance flags. */
void set_instance_flags (type_instance_flags flags)
{
this->m_instance_flags = flags;
}
/* Get the bounds bounds of this type. The type must be a range type. */ /* Get the bounds bounds of this type. The type must be a range type. */
range_bounds *bounds () const range_bounds *bounds () const
{ {
@ -1212,7 +1224,7 @@ struct type
instance flags are completely inherited from the target type. No instance flags are completely inherited from the target type. No
qualifiers can be cleared by the typedef. See also qualifiers can be cleared by the typedef. See also
check_typedef. */ check_typedef. */
unsigned instance_flags : 9; unsigned m_instance_flags : 9;
/* * Length of storage for a value of this type. The value is the /* * Length of storage for a value of this type. The value is the
expression in host bytes of what sizeof(type) would return. This expression in host bytes of what sizeof(type) would return. This
@ -1672,7 +1684,7 @@ extern void allocate_gnat_aux_type (struct type *);
TYPE_ZALLOC (type, \ TYPE_ZALLOC (type, \
sizeof (*TYPE_MAIN_TYPE (type)->type_specific.func_stuff))) sizeof (*TYPE_MAIN_TYPE (type)->type_specific.func_stuff)))
#define TYPE_INSTANCE_FLAGS(thistype) (thistype)->instance_flags #define TYPE_INSTANCE_FLAGS(thistype) ((thistype)->instance_flags ())
#define TYPE_MAIN_TYPE(thistype) (thistype)->main_type #define TYPE_MAIN_TYPE(thistype) (thistype)->main_type
#define TYPE_TARGET_TYPE(thistype) TYPE_MAIN_TYPE(thistype)->target_type #define TYPE_TARGET_TYPE(thistype) TYPE_MAIN_TYPE(thistype)->target_type
#define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type #define TYPE_POINTER_TYPE(thistype) (thistype)->pointer_type
@ -2205,12 +2217,14 @@ extern struct type *make_atomic_type (struct type *);
extern void replace_type (struct type *, struct type *); extern void replace_type (struct type *, struct type *);
extern int address_space_name_to_int (struct gdbarch *, const char *); extern type_instance_flags address_space_name_to_int (struct gdbarch *,
const char *);
extern const char *address_space_int_to_name (struct gdbarch *, int); extern const char *address_space_int_to_name (struct gdbarch *,
type_instance_flags);
extern struct type *make_type_with_address_space (struct type *type, extern struct type *make_type_with_address_space
int space_identifier); (struct type *type, type_instance_flags space_identifier);
extern struct type *lookup_memberptr_type (struct type *, struct type *); extern struct type *lookup_memberptr_type (struct type *, struct type *);

View file

@ -1583,7 +1583,7 @@ s390_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
/* Implement addr_class_type_flags gdbarch method. /* Implement addr_class_type_flags gdbarch method.
Only used for ABI_LINUX_ZSERIES. */ Only used for ABI_LINUX_ZSERIES. */
static int static type_instance_flags
s390_address_class_type_flags (int byte_size, int dwarf2_addr_class) s390_address_class_type_flags (int byte_size, int dwarf2_addr_class)
{ {
if (byte_size == 4) if (byte_size == 4)
@ -1596,7 +1596,8 @@ s390_address_class_type_flags (int byte_size, int dwarf2_addr_class)
Only used for ABI_LINUX_ZSERIES. */ Only used for ABI_LINUX_ZSERIES. */
static const char * static const char *
s390_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags) s390_address_class_type_flags_to_name (struct gdbarch *gdbarch,
type_instance_flags type_flags)
{ {
if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1)
return "mode32"; return "mode32";
@ -1607,18 +1608,18 @@ s390_address_class_type_flags_to_name (struct gdbarch *gdbarch, int type_flags)
/* Implement addr_class_name_to_type_flags gdbarch method. /* Implement addr_class_name_to_type_flags gdbarch method.
Only used for ABI_LINUX_ZSERIES. */ Only used for ABI_LINUX_ZSERIES. */
static int static bool
s390_address_class_name_to_type_flags (struct gdbarch *gdbarch, s390_address_class_name_to_type_flags (struct gdbarch *gdbarch,
const char *name, const char *name,
int *type_flags_ptr) type_instance_flags *type_flags_ptr)
{ {
if (strcmp (name, "mode32") == 0) if (strcmp (name, "mode32") == 0)
{ {
*type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1;
return 1; return true;
} }
else else
return 0; return false;
} }
/* Inferior function calls. */ /* Inferior function calls. */

View file

@ -4398,7 +4398,7 @@ cleanup_undefined_types_noname (struct objfile *objfile)
and needs to be copied over from the reference type. and needs to be copied over from the reference type.
Since replace_type expects them to be identical, we need Since replace_type expects them to be identical, we need
to set these flags manually before hand. */ to set these flags manually before hand. */
TYPE_INSTANCE_FLAGS (nat.type) = TYPE_INSTANCE_FLAGS (*type); nat.type->set_instance_flags ((*type)->instance_flags ());
replace_type (nat.type, *type); replace_type (nat.type, *type);
} }
} }

View file

@ -109,7 +109,7 @@ type_stack::follow_types (struct type *follow_type)
int done = 0; int done = 0;
int make_const = 0; int make_const = 0;
int make_volatile = 0; int make_volatile = 0;
int make_addr_space = 0; type_instance_flags make_addr_space = 0;
bool make_restrict = false; bool make_restrict = false;
bool make_atomic = false; bool make_atomic = false;
int array_size; int array_size;
@ -128,7 +128,7 @@ type_stack::follow_types (struct type *follow_type)
make_volatile = 1; make_volatile = 1;
break; break;
case tp_space_identifier: case tp_space_identifier:
make_addr_space = pop_int (); make_addr_space = (enum type_instance_flag_value) pop_int ();
break; break;
case tp_atomic: case tp_atomic:
make_atomic = true; make_atomic = true;