From: Tankut Baris Aktemur Date: Thu, 23 Jul 2026 10:04:42 +0000 (-0500) Subject: gdb: convert address_class_type_flags_to_name to address_class_id_to_name X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ea1bd1c8e62efba45684778dade1284f1fe1a87c;p=thirdparty%2Fbinutils-gdb.git gdb: convert address_class_type_flags_to_name to address_class_id_to_name In type instance flags, two bits are allocated for encoding the address class. Although defined like a bitmask, those two bits in fact represent an architecture-specific enum value. As a step towards making this conceptual separation clear, refactor the gdbarch method 'address_class_type_flags_to_name'. This method is used for returning the name for the address class id encoded in type instance flags. Make this clear by passing it the address class id, instead of the whole flags. Approved-By: Tom Tromey --- diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index ddb917fda5f..d29e47b3a71 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -72,13 +72,10 @@ /* Constants: prefixed with AVR_ to avoid name space clashes */ -/* Address space flags */ +/* We are assigning the id 1 to the flash address space. */ -/* We are assigning the TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 to the flash address - space. */ - -#define AVR_TYPE_ADDRESS_CLASS_FLASH TYPE_ADDRESS_CLASS_1 -#define AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH \ +#define AVR_ADDRESS_CLASS_FLASH 1 +#define AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH \ TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 @@ -310,7 +307,7 @@ avr_address_to_pointer (struct gdbarch *gdbarch, enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); /* Is it a data address in flash? */ - if (AVR_TYPE_ADDRESS_CLASS_FLASH (type)) + if (TYPE_ADDRESS_CLASS (type) == AVR_ADDRESS_CLASS_FLASH) { /* A data pointer in flash is byte addressed. */ store_unsigned_integer (buf, type->length (), byte_order, @@ -342,7 +339,7 @@ avr_pointer_to_address (struct gdbarch *gdbarch, = extract_unsigned_integer (buf, type->length (), byte_order); /* Is it a data address in flash? */ - if (AVR_TYPE_ADDRESS_CLASS_FLASH (type)) + if (TYPE_ADDRESS_CLASS (type) == AVR_ADDRESS_CLASS_FLASH) { /* A data pointer in flash is already byte addressed. */ return avr_make_iaddr (addr); @@ -1390,15 +1387,15 @@ avr_address_class_type_flags (int byte_size, int dwarf2_addr_class) return 0; } -/* Implementation of `address_class_type_flags_to_name' gdbarch method. +/* Implementation of `address_class_id_to_name' gdbarch method. - Convert a type_instance_flag_value to an address space qualifier. */ + Convert an address class id to an address class qualifier. */ static const char* -avr_address_class_type_flags_to_name (struct gdbarch *gdbarch, - type_instance_flags type_flags) +avr_address_class_id_to_name (struct gdbarch *gdbarch, + unsigned int address_class) { - if (type_flags & AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH) + if (address_class == AVR_ADDRESS_CLASS_FLASH) return "flash"; else return NULL; @@ -1540,8 +1537,8 @@ avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_address_class_type_flags (gdbarch, avr_address_class_type_flags); set_gdbarch_address_class_name_to_type_flags (gdbarch, avr_address_class_name_to_type_flags); - set_gdbarch_address_class_type_flags_to_name - (gdbarch, avr_address_class_type_flags_to_name); + set_gdbarch_address_class_id_to_name + (gdbarch, avr_address_class_id_to_name); return gdbarch; } diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c index 45afebb18e9..b0da5bf815b 100644 --- a/gdb/ft32-tdep.c +++ b/gdb/ft32-tdep.c @@ -354,15 +354,15 @@ ft32_address_class_type_flags (int byte_size, int dwarf2_addr_class) return 0; } -/* Implementation of `address_class_type_flags_to_name' gdbarch method. +/* Implementation of `address_class_id_to_name' gdbarch method. - Convert a type_instance_flag_value to an address space qualifier. */ + Convert an address class id to an address space qualifier. */ static const char* -ft32_address_class_type_flags_to_name (struct gdbarch *gdbarch, - type_instance_flags type_flags) +ft32_address_class_id_to_name (struct gdbarch *gdbarch, + unsigned int address_class) { - if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) + if (address_class == 1) return "flash"; else return NULL; @@ -612,8 +612,8 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_address_class_type_flags (gdbarch, ft32_address_class_type_flags); set_gdbarch_address_class_name_to_type_flags (gdbarch, ft32_address_class_name_to_type_flags); - set_gdbarch_address_class_type_flags_to_name - (gdbarch, ft32_address_class_type_flags_to_name); + set_gdbarch_address_class_id_to_name + (gdbarch, ft32_address_class_id_to_name); return gdbarch; } diff --git a/gdb/gdbarch-gen.c b/gdb/gdbarch-gen.c index f424fa2a86e..e1c5a902b00 100644 --- a/gdb/gdbarch-gen.c +++ b/gdb/gdbarch-gen.c @@ -164,7 +164,7 @@ struct gdbarch bool cannot_step_breakpoint = false; bool have_nonsteppable_watchpoint = false; gdbarch_address_class_type_flags_ftype *address_class_type_flags = nullptr; - gdbarch_address_class_type_flags_to_name_ftype *address_class_type_flags_to_name = nullptr; + gdbarch_address_class_id_to_name_ftype *address_class_id_to_name = nullptr; gdbarch_execute_dwarf_cfa_vendor_op_ftype *execute_dwarf_cfa_vendor_op = default_execute_dwarf_cfa_vendor_op; gdbarch_address_class_name_to_type_flags_ftype *address_class_name_to_type_flags = nullptr; gdbarch_register_reggroup_p_ftype *register_reggroup_p = default_register_reggroup_p; @@ -419,7 +419,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of cannot_step_breakpoint, invalid_p == 0. */ /* Skip verify of have_nonsteppable_watchpoint, invalid_p == 0. */ /* Skip verify of address_class_type_flags, has predicate. */ - /* Skip verify of address_class_type_flags_to_name, has predicate. */ + /* Skip verify of address_class_id_to_name, has predicate. */ /* Skip verify of execute_dwarf_cfa_vendor_op, invalid_p == 0. */ /* Skip verify of address_class_name_to_type_flags, has predicate. */ /* Skip verify of register_reggroup_p, invalid_p == 0. */ @@ -965,11 +965,11 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: address_class_type_flags = <%s>\n", host_address_to_string (gdbarch->address_class_type_flags)); gdb_printf (file, - "gdbarch_dump: gdbarch_address_class_type_flags_to_name_p() = %d\n", - gdbarch_address_class_type_flags_to_name_p (gdbarch)); + "gdbarch_dump: gdbarch_address_class_id_to_name_p() = %d\n", + gdbarch_address_class_id_to_name_p (gdbarch)); gdb_printf (file, - "gdbarch_dump: address_class_type_flags_to_name = <%s>\n", - host_address_to_string (gdbarch->address_class_type_flags_to_name)); + "gdbarch_dump: address_class_id_to_name = <%s>\n", + host_address_to_string (gdbarch->address_class_id_to_name)); gdb_printf (file, "gdbarch_dump: execute_dwarf_cfa_vendor_op = <%s>\n", host_address_to_string (gdbarch->execute_dwarf_cfa_vendor_op)); @@ -3520,27 +3520,27 @@ set_gdbarch_address_class_type_flags (struct gdbarch *gdbarch, } bool -gdbarch_address_class_type_flags_to_name_p (struct gdbarch *gdbarch) +gdbarch_address_class_id_to_name_p (struct gdbarch *gdbarch) { gdb_assert (gdbarch != nullptr); - return gdbarch->address_class_type_flags_to_name != nullptr; + return gdbarch->address_class_id_to_name != nullptr; } const char * -gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, type_instance_flags type_flags) +gdbarch_address_class_id_to_name (struct gdbarch *gdbarch, unsigned int address_class) { gdb_assert (gdbarch != nullptr); - gdb_assert (gdbarch->address_class_type_flags_to_name != nullptr); + gdb_assert (gdbarch->address_class_id_to_name != nullptr); if (gdbarch_debug >= 2) - gdb_printf (gdb_stdlog, "gdbarch_address_class_type_flags_to_name called\n"); - return gdbarch->address_class_type_flags_to_name (gdbarch, type_flags); + gdb_printf (gdb_stdlog, "gdbarch_address_class_id_to_name called\n"); + return gdbarch->address_class_id_to_name (gdbarch, address_class); } 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) +set_gdbarch_address_class_id_to_name (struct gdbarch *gdbarch, + gdbarch_address_class_id_to_name_ftype address_class_id_to_name) { - gdbarch->address_class_type_flags_to_name = address_class_type_flags_to_name; + gdbarch->address_class_id_to_name = address_class_id_to_name; } bool diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h index 678b308fba5..9fea082a690 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -902,11 +902,14 @@ using gdbarch_address_class_type_flags_ftype = type_instance_flags (int byte_siz type_instance_flags gdbarch_address_class_type_flags (struct gdbarch *gdbarch, int byte_size, int dwarf2_addr_class); void set_gdbarch_address_class_type_flags (struct gdbarch *gdbarch, gdbarch_address_class_type_flags_ftype *address_class_type_flags); -bool gdbarch_address_class_type_flags_to_name_p (struct gdbarch *gdbarch); +/* Given an architecture-specific address class identifier, return the + name of that address class. */ -using gdbarch_address_class_type_flags_to_name_ftype = const char *(struct gdbarch *gdbarch, type_instance_flags type_flags); -const char *gdbarch_address_class_type_flags_to_name (struct gdbarch *gdbarch, type_instance_flags type_flags); -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); +bool gdbarch_address_class_id_to_name_p (struct gdbarch *gdbarch); + +using gdbarch_address_class_id_to_name_ftype = const char *(struct gdbarch *gdbarch, unsigned int address_class); +const char *gdbarch_address_class_id_to_name (struct gdbarch *gdbarch, unsigned int address_class); +void set_gdbarch_address_class_id_to_name (struct gdbarch *gdbarch, gdbarch_address_class_id_to_name_ftype *address_class_id_to_name); /* Execute vendor-specific DWARF Call Frame Instruction. OP is the instruction. FS are passed from the generic execute_cfa_program function. */ diff --git a/gdb/gdbarch_components.py b/gdb/gdbarch_components.py index b9304d3036d..5ec4bdee819 100644 --- a/gdb/gdbarch_components.py +++ b/gdb/gdbarch_components.py @@ -1546,9 +1546,13 @@ Function( ) Method( + comment=""" +Given an architecture-specific address class identifier, return the +name of that address class. +""", type="const char *", - name="address_class_type_flags_to_name", - params=[("type_instance_flags", "type_flags")], + name="address_class_id_to_name", + params=[("unsigned int", "address_class")], predicate=True, ) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index d1a2914e1e6..f3c77073f70 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -570,9 +570,11 @@ address_space_type_instance_flags_to_name (struct gdbarch *gdbarch, return "code"; else if (space_flag & TYPE_INSTANCE_FLAG_DATA_SPACE) return "data"; - else if ((space_flag & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL) - && gdbarch_address_class_type_flags_to_name_p (gdbarch)) - return gdbarch_address_class_type_flags_to_name (gdbarch, space_flag); + + unsigned int aclass = TYPE_ADDRESS_CLASS_FROM_INSTANCE_FLAGS (space_flag); + + if (gdbarch_address_class_id_to_name_p (gdbarch)) + return gdbarch_address_class_id_to_name (gdbarch, aclass); else return NULL; } diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 572bf6d3d6f..3c21d4ad214 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -175,6 +175,10 @@ DEF_ENUM_FLAGS_TYPE (enum type_instance_flag_value, type_instance_flags); (TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 | TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2) #define TYPE_ADDRESS_CLASS_ALL(t) (((t)->instance_flags ()) \ & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL) +#define TYPE_ADDRESS_CLASS_FROM_INSTANCE_FLAGS(t) \ + ((unsigned int) ((t) & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL) >> 4) +#define TYPE_ADDRESS_CLASS(t) \ + (TYPE_ADDRESS_CLASS_FROM_INSTANCE_FLAGS ((t)->instance_flags ())) /* Information about a single discriminant. */ diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c index f74e55284c0..57ddce44644 100644 --- a/gdb/s390-tdep.c +++ b/gdb/s390-tdep.c @@ -1619,14 +1619,14 @@ s390_address_class_type_flags (int byte_size, int dwarf2_addr_class) return 0; } -/* Implement addr_class_type_flags_to_name gdbarch method. +/* Implement addr_class_id_to_name gdbarch method. Only used for ABI_LINUX_ZSERIES. */ static const char * -s390_address_class_type_flags_to_name (struct gdbarch *gdbarch, - type_instance_flags type_flags) +s390_address_class_id_to_name (struct gdbarch *gdbarch, + unsigned int address_class) { - if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) + if (address_class == 1) return "mode32"; else return NULL; @@ -7357,8 +7357,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_ptr_bit (gdbarch, 64); set_gdbarch_address_class_type_flags (gdbarch, s390_address_class_type_flags); - set_gdbarch_address_class_type_flags_to_name (gdbarch, - s390_address_class_type_flags_to_name); + set_gdbarch_address_class_id_to_name (gdbarch, + s390_address_class_id_to_name); set_gdbarch_address_class_name_to_type_flags (gdbarch, s390_address_class_name_to_type_flags); break;