aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2021-11-18 11:25:29 -0700
committerTom Tromey <tromey@adacore.com>2022-03-28 13:07:41 -0600
commit7eb21cc702249b4fb1beecee25c0c8ccbd9edd15 (patch)
treeecd6706240119bc64fb60a5025a808e53c0664bb
parentb8e92c571baed4e794bd62b7bf417fa8bbaf5c95 (diff)
downloadgdb-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.c6
-rw-r--r--gdb/gdbtypes.h38
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