]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: convert address_class_type_flags_to_name to address_class_id_to_name
authorTankut Baris Aktemur <tankutbaris.aktemur@amd.com>
Thu, 23 Jul 2026 10:04:42 +0000 (05:04 -0500)
committerTankut Baris Aktemur <tankutbaris.aktemur@amd.com>
Thu, 23 Jul 2026 10:10:06 +0000 (05:10 -0500)
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 <tom@tromey.com>
gdb/avr-tdep.c
gdb/ft32-tdep.c
gdb/gdbarch-gen.c
gdb/gdbarch-gen.h
gdb/gdbarch_components.py
gdb/gdbtypes.c
gdb/gdbtypes.h
gdb/s390-tdep.c

index ddb917fda5fc9a8e50c25a548eda9db16d48147b..d29e47b3a71f27dce4670dc252a5a4a3c14ff867 100644 (file)
 
 /* 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;
 }
index 45afebb18e9f5968b9dde183df0794d9d3e11b05..b0da5bf815b1f7221118a4fbdea2f6ffde7635a5 100644 (file)
@@ -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;
 }
index f424fa2a86eb859c0a066541cbd4fe6fb9b6ab37..e1c5a902b00f404371812b21038711b6a0598b13 100644 (file)
@@ -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
index 678b308fba5abdfe1e27710069b497f77de9e727..9fea082a690cc2c907441470a52271237fe5e90c 100644 (file)
@@ -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. */
index b9304d3036dac6d56590bea3cc4fbaf09f6fd2a8..5ec4bdee8191336a537fad76bc2e90eb3b331340 100644 (file)
@@ -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,
 )
 
index d1a2914e1e6764cd18fe5d91e6a883f6f3ffcf14..f3c77073f7069a80751575d4b9bc05cb13f71329 100644 (file)
@@ -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;
 }
index 572bf6d3d6fd7f3cd4d07736329e90f3713a6b7d..3c21d4ad214eaeda31f5dbf385251856e59bb3b3 100644 (file)
@@ -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.  */
 
index f74e55284c0d8dc084248af37e307a8a20f4d9e4..57ddce4464483ef662276a5a4ad27d4ffc0c8e2b 100644 (file)
@@ -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;