Change call_site_target to use custom type and enum
authorTom Tromey <tromey@adacore.com>
Thu, 18 Nov 2021 18:25:29 +0000 (11:25 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 28 Mar 2022 19:07:41 +0000 (13:07 -0600)
call_site_target reuses field_loc_kind and field_location.  However,
it has never used the full range of the field_loc_kind enum.  In a
subsequent patch, I plan to add a new 'kind' here, so it seemed best
to avoid this reuse and instead introduce new types here.

gdb/dwarf2/loc.c
gdb/gdbtypes.h

index d7863841a69d899362ecc5d8acf3fabdf54cba8f..16c42a5fdb58b3cb1f61b941c00a6caea44c6009 100644 (file)
@@ -643,7 +643,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
 {
   switch (call_site->target.loc_kind ())
     {
-    case FIELD_LOC_KIND_DWARF_BLOCK:
+    case call_site_target::DWARF_BLOCK:
       {
        struct dwarf2_locexpr_baton *dwarf_block;
        struct value *val;
@@ -690,7 +690,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
          return value_as_address (val);
       }
 
-    case FIELD_LOC_KIND_PHYSNAME:
+    case call_site_target::PHYSNAME:
       {
        const char *physname;
        struct bound_minimal_symbol msym;
@@ -713,7 +713,7 @@ call_site_to_target_addr (struct gdbarch *call_site_gdbarch,
        return BMSYMBOL_VALUE_ADDRESS (msym);
       }
 
-    case FIELD_LOC_KIND_PHYSADDR:
+    case call_site_target::PHYSADDR:
       {
        dwarf2_per_objfile *per_objfile = call_site->per_objfile;
        compunit_symtab *cust = per_objfile->get_symtab (call_site->per_cu);
index bd192da4b4b50524c599c7c9ebf138836127d8ac..122cb355ab1e342b84f997ec1bb69873f792a799 100644 (file)
@@ -1824,52 +1824,70 @@ enum call_site_parameter_kind
 
 struct call_site_target
 {
-  field_loc_kind loc_kind () const
+  /* The kind of location held by this call site target.  */
+  enum kind
+  {
+    /* An address.  */
+    PHYSADDR,
+    /* A name.  */
+    PHYSNAME,
+    /* A DWARF block.  */
+    DWARF_BLOCK,
+  };
+
+  kind loc_kind () const
   {
     return m_loc_kind;
   }
 
   CORE_ADDR loc_physaddr () const
   {
-    gdb_assert (m_loc_kind == FIELD_LOC_KIND_PHYSADDR);
+    gdb_assert (m_loc_kind == PHYSADDR);
     return m_loc.physaddr;
   }
 
   void set_loc_physaddr (CORE_ADDR physaddr)
   {
-    m_loc_kind = FIELD_LOC_KIND_PHYSADDR;
+    m_loc_kind = PHYSADDR;
     m_loc.physaddr = physaddr;
   }
 
   const char *loc_physname () const
   {
-    gdb_assert (m_loc_kind == FIELD_LOC_KIND_PHYSNAME);
+    gdb_assert (m_loc_kind == PHYSNAME);
     return m_loc.physname;
   }
 
   void set_loc_physname (const char *physname)
     {
-      m_loc_kind = FIELD_LOC_KIND_PHYSNAME;
+      m_loc_kind = PHYSNAME;
       m_loc.physname = physname;
     }
 
   dwarf2_locexpr_baton *loc_dwarf_block () const
   {
-    gdb_assert (m_loc_kind == FIELD_LOC_KIND_DWARF_BLOCK);
+    gdb_assert (m_loc_kind == DWARF_BLOCK);
     return m_loc.dwarf_block;
   }
 
   void set_loc_dwarf_block (dwarf2_locexpr_baton *dwarf_block)
     {
-      m_loc_kind = FIELD_LOC_KIND_DWARF_BLOCK;
+      m_loc_kind = DWARF_BLOCK;
       m_loc.dwarf_block = dwarf_block;
     }
 
-  union field_location m_loc;
+  union
+  {
+    /* Address.  */
+    CORE_ADDR physaddr;
+    /* Mangled name.  */
+    const char *physname;
+    /* DWARF block.  */
+    struct dwarf2_locexpr_baton *dwarf_block;
+  } m_loc;
 
   /* * Discriminant for union field_location.  */
-
-  ENUM_BITFIELD(field_loc_kind) m_loc_kind : 3;
+  enum kind m_loc_kind;
 };
 
 union call_site_parameter_u