diff options
author | Tom Tromey <tromey@adacore.com> | 2021-11-18 11:25:29 -0700 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-03-28 13:07:41 -0600 |
commit | 7eb21cc702249b4fb1beecee25c0c8ccbd9edd15 (patch) | |
tree | ecd6706240119bc64fb60a5025a808e53c0664bb | |
parent | b8e92c571baed4e794bd62b7bf417fa8bbaf5c95 (diff) | |
download | gdb-7eb21cc702249b4fb1beecee25c0c8ccbd9edd15.zip gdb-7eb21cc702249b4fb1beecee25c0c8ccbd9edd15.tar.gz gdb-7eb21cc702249b4fb1beecee25c0c8ccbd9edd15.tar.bz2 |
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.
-rw-r--r-- | gdb/dwarf2/loc.c | 6 | ||||
-rw-r--r-- | gdb/gdbtypes.h | 38 |
2 files changed, 31 insertions, 13 deletions
diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c index d786384..16c42a5 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 bd192da..122cb35 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 |