From: Tankut Baris Aktemur Date: Thu, 23 Jul 2026 10:04:42 +0000 (-0500) Subject: gdb: convert address_class_name_to_type_flags to address_class_name_to_id X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e7b33a295fccb64de6b1a5173eb844fcb6bf02ee;p=thirdparty%2Fbinutils-gdb.git gdb: convert address_class_name_to_type_flags to address_class_name_to_id This is the dual of the previous patch, where we refactor the gdbarch method 'address_class_name_to_type_flags'. We make it take a name and return an address class id, instead of a whole type instance flags. In one case, there is hardcoded `aclass << 4` to convert an id to type instance flags. This will go away in a future patch. Approved-By: Tom Tromey --- diff --git a/gdb/avr-tdep.c b/gdb/avr-tdep.c index d29e47b3a71..58330eececd 100644 --- a/gdb/avr-tdep.c +++ b/gdb/avr-tdep.c @@ -1401,18 +1401,18 @@ avr_address_class_id_to_name (struct gdbarch *gdbarch, return NULL; } -/* Implementation of `address_class_name_to_type_flags' gdbarch method. +/* Implementation of `address_class_name_to_id' gdbarch method. - Convert an address space qualifier to a type_instance_flag_value. */ + Convert an address class name to an address class id. */ static bool -avr_address_class_name_to_type_flags (struct gdbarch *gdbarch, - const char* name, - type_instance_flags *type_flags_ptr) +avr_address_class_name_to_id (struct gdbarch *gdbarch, + const char* name, + unsigned int &address_class) { if (streq (name, "flash")) { - *type_flags_ptr = AVR_TYPE_INSTANCE_FLAG_ADDRESS_CLASS_FLASH; + address_class = AVR_ADDRESS_CLASS_FLASH; return true; } else @@ -1535,8 +1535,8 @@ avr_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_unwind_sp (gdbarch, avr_unwind_sp); 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_name_to_id + (gdbarch, avr_address_class_name_to_id); set_gdbarch_address_class_id_to_name (gdbarch, avr_address_class_id_to_name); diff --git a/gdb/ft32-tdep.c b/gdb/ft32-tdep.c index b0da5bf815b..8906a09b0b6 100644 --- a/gdb/ft32-tdep.c +++ b/gdb/ft32-tdep.c @@ -368,18 +368,18 @@ ft32_address_class_id_to_name (struct gdbarch *gdbarch, return NULL; } -/* Implementation of `address_class_name_to_type_flags' gdbarch method. +/* Implementation of `address_class_name_to_id' gdbarch method. - Convert an address space qualifier to a type_instance_flag_value. */ + Convert an address class name to an address class id. */ static bool -ft32_address_class_name_to_type_flags (struct gdbarch *gdbarch, - const char* name, - type_instance_flags *type_flags_ptr) +ft32_address_class_name_to_id (struct gdbarch *gdbarch, + const char* name, + unsigned int &address_class) { if (streq (name, "flash")) { - *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + address_class = 1; return true; } else @@ -610,8 +610,8 @@ ft32_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_overlay_update (gdbarch, simple_overlay_update); 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_name_to_id + (gdbarch, ft32_address_class_name_to_id); set_gdbarch_address_class_id_to_name (gdbarch, ft32_address_class_id_to_name); diff --git a/gdb/gdbarch-gen.c b/gdb/gdbarch-gen.c index e1c5a902b00..980682e1bfb 100644 --- a/gdb/gdbarch-gen.c +++ b/gdb/gdbarch-gen.c @@ -166,7 +166,7 @@ struct gdbarch gdbarch_address_class_type_flags_ftype *address_class_type_flags = 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_address_class_name_to_id_ftype *address_class_name_to_id = nullptr; gdbarch_register_reggroup_p_ftype *register_reggroup_p = default_register_reggroup_p; gdbarch_fetch_pointer_argument_ftype *fetch_pointer_argument = nullptr; gdbarch_iterate_over_regset_sections_ftype *iterate_over_regset_sections = nullptr; @@ -421,7 +421,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of address_class_type_flags, 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 address_class_name_to_id, has predicate. */ /* Skip verify of register_reggroup_p, invalid_p == 0. */ /* Skip verify of fetch_pointer_argument, invalid_p == 0. */ /* Skip verify of iterate_over_regset_sections, has predicate. */ @@ -974,11 +974,11 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: execute_dwarf_cfa_vendor_op = <%s>\n", host_address_to_string (gdbarch->execute_dwarf_cfa_vendor_op)); gdb_printf (file, - "gdbarch_dump: gdbarch_address_class_name_to_type_flags_p() = %d\n", - gdbarch_address_class_name_to_type_flags_p (gdbarch)); + "gdbarch_dump: gdbarch_address_class_name_to_id_p() = %d\n", + gdbarch_address_class_name_to_id_p (gdbarch)); gdb_printf (file, - "gdbarch_dump: address_class_name_to_type_flags = <%s>\n", - host_address_to_string (gdbarch->address_class_name_to_type_flags)); + "gdbarch_dump: address_class_name_to_id = <%s>\n", + host_address_to_string (gdbarch->address_class_name_to_id)); gdb_printf (file, "gdbarch_dump: register_reggroup_p = <%s>\n", host_address_to_string (gdbarch->register_reggroup_p)); @@ -3561,27 +3561,27 @@ set_gdbarch_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, } bool -gdbarch_address_class_name_to_type_flags_p (struct gdbarch *gdbarch) +gdbarch_address_class_name_to_id_p (struct gdbarch *gdbarch) { gdb_assert (gdbarch != nullptr); - return gdbarch->address_class_name_to_type_flags != nullptr; + return gdbarch->address_class_name_to_id != nullptr; } bool -gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, const char *name, type_instance_flags *type_flags_ptr) +gdbarch_address_class_name_to_id (struct gdbarch *gdbarch, const char *name, unsigned int &address_class) { gdb_assert (gdbarch != nullptr); - gdb_assert (gdbarch->address_class_name_to_type_flags != nullptr); + gdb_assert (gdbarch->address_class_name_to_id != nullptr); if (gdbarch_debug >= 2) - gdb_printf (gdb_stdlog, "gdbarch_address_class_name_to_type_flags called\n"); - return gdbarch->address_class_name_to_type_flags (gdbarch, name, type_flags_ptr); + gdb_printf (gdb_stdlog, "gdbarch_address_class_name_to_id called\n"); + return gdbarch->address_class_name_to_id (gdbarch, name, address_class); } 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) +set_gdbarch_address_class_name_to_id (struct gdbarch *gdbarch, + gdbarch_address_class_name_to_id_ftype address_class_name_to_id) { - gdbarch->address_class_name_to_type_flags = address_class_name_to_type_flags; + gdbarch->address_class_name_to_id = address_class_name_to_id; } bool diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h index 9fea082a690..05b1656a511 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -918,15 +918,15 @@ using gdbarch_execute_dwarf_cfa_vendor_op_ftype = bool (struct gdbarch *gdbarch, bool gdbarch_execute_dwarf_cfa_vendor_op (struct gdbarch *gdbarch, gdb_byte op, struct dwarf2_frame_state *fs); 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 address class id for the supplied address class name. This function should return true if the address class was recognized and - type_flags was set, false otherwise. */ + address_class was set, false otherwise. */ -bool gdbarch_address_class_name_to_type_flags_p (struct gdbarch *gdbarch); +bool gdbarch_address_class_name_to_id_p (struct gdbarch *gdbarch); -using gdbarch_address_class_name_to_type_flags_ftype = bool (struct gdbarch *gdbarch, const char *name, type_instance_flags *type_flags_ptr); -bool gdbarch_address_class_name_to_type_flags (struct gdbarch *gdbarch, const char *name, type_instance_flags *type_flags_ptr); -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); +using gdbarch_address_class_name_to_id_ftype = bool (struct gdbarch *gdbarch, const char *name, unsigned int &address_class); +bool gdbarch_address_class_name_to_id (struct gdbarch *gdbarch, const char *name, unsigned int &address_class); +void set_gdbarch_address_class_name_to_id (struct gdbarch *gdbarch, gdbarch_address_class_name_to_id_ftype *address_class_name_to_id); /* Is a register in a group */ diff --git a/gdb/gdbarch_components.py b/gdb/gdbarch_components.py index 5ec4bdee819..d5d5a6d4fe3 100644 --- a/gdb/gdbarch_components.py +++ b/gdb/gdbarch_components.py @@ -1570,13 +1570,13 @@ FS are passed from the generic execute_cfa_program function. Method( comment=""" -Return the appropriate type_flags for the supplied address class. +Return the appropriate address class id for the supplied address class name. This function should return true if the address class was recognized and -type_flags was set, false otherwise. +address_class was set, false otherwise. """, type="bool", - name="address_class_name_to_type_flags", - params=[("const char *", "name"), ("type_instance_flags *", "type_flags_ptr")], + name="address_class_name_to_id", + params=[("const char *", "name"), ("unsigned int &", "address_class")], predicate=True, ) diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index f3c77073f70..87cc7d15d0d 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -543,18 +543,20 @@ type_instance_flags address_space_name_to_type_instance_flags (struct gdbarch *gdbarch, const char *space_identifier) { - type_instance_flags type_flags; - /* Check for known address space delimiters. */ if (streq (space_identifier, "code")) return TYPE_INSTANCE_FLAG_CODE_SPACE; else if (streq (space_identifier, "data")) return TYPE_INSTANCE_FLAG_DATA_SPACE; - else if (gdbarch_address_class_name_to_type_flags_p (gdbarch) - && gdbarch_address_class_name_to_type_flags (gdbarch, - space_identifier, - &type_flags)) - return type_flags; + + unsigned int aclass; + if (gdbarch_address_class_name_to_id_p (gdbarch) + && gdbarch_address_class_name_to_id (gdbarch, + space_identifier, + aclass)) + { + return (enum type_instance_flag_value) (aclass << 4); + } else error (_("Unknown address space specifier: \"%s\""), space_identifier); } diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c index 57ddce44644..1aebdfa46d3 100644 --- a/gdb/s390-tdep.c +++ b/gdb/s390-tdep.c @@ -1632,17 +1632,17 @@ s390_address_class_id_to_name (struct gdbarch *gdbarch, return NULL; } -/* Implement addr_class_name_to_type_flags gdbarch method. +/* Implement addr_class_name_to_id gdbarch method. Only used for ABI_LINUX_ZSERIES. */ static bool -s390_address_class_name_to_type_flags (struct gdbarch *gdbarch, - const char *name, - type_instance_flags *type_flags_ptr) +s390_address_class_name_to_id (struct gdbarch *gdbarch, + const char *name, + unsigned int &address_class) { if (streq (name, "mode32")) { - *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + address_class = 1; return true; } else @@ -7359,8 +7359,8 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) s390_address_class_type_flags); 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); + set_gdbarch_address_class_name_to_id (gdbarch, + s390_address_class_name_to_id); break; }