From 7eb21cc702249b4fb1beecee25c0c8ccbd9edd15 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Thu, 18 Nov 2021 11:25:29 -0700 Subject: [PATCH] Change call_site_target to use custom type and enum 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 | 6 +++--- gdb/gdbtypes.h | 38 ++++++++++++++++++++++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c index d7863841a69..16c42a5fdb5 100644 --- a/gdb/dwarf2/loc.c +++ b/gdb/dwarf2/loc.c @@ -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); diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index bd192da4b4b..122cb355ab1 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -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 -- 2.30.2