From: Luis Machado luis.machado@arm.com
Make sure we only use the C registers if they have been detected.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* aarch64-tdep.c (aarch64_prologue_prev_register): Guard use of C registers. (aarch64_dwarf2_prev_register): Likewise. (aarch64_dwarf2_frame_init_reg): Likewise. * aarch64-linux-nat.c (aarch64_linux_nat_target::store_registers): Likewise. --- gdb/aarch64-linux-nat.c | 6 +++++- gdb/aarch64-tdep.c | 23 ++++++++++++++++++----- 2 files changed, 23 insertions(+), 6 deletions(-)
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index 7e1763e8ea..dc006de7f0 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -582,7 +582,11 @@ aarch64_linux_nat_target::store_registers (struct regcache *regcache, else if (regno < AARCH64_V0_REGNUM) { store_gregs_to_thread (regcache); - fetch_cregs_from_thread (regcache); + + /* If we have capability registers, refresh them when we store to + the general register set. */ + if (tdep->has_capability ()) + fetch_cregs_from_thread (regcache); } else if (tdep->has_sve ()) store_sveregs_to_thread (regcache); diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index cb6f468363..16c85e3946 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -1401,7 +1401,10 @@ aarch64_prologue_prev_register (struct frame_info *this_frame, = aarch64_make_prologue_cache (this_frame, this_cache);
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame)); - int pcc_regnum = tdep->cap_reg_base + 31; + + int pcc_regnum = -1; + if (tdep->has_capability ()) + pcc_regnum = tdep->cap_reg_base + 31;
/* If we are asked to unwind the PC, then we need to return the LR instead. The prologue may save PC, but it will point into this @@ -1465,7 +1468,9 @@ aarch64_prologue_prev_register (struct frame_info *this_frame, | | | |<- SP +----------+ */ - int csp_regnum = tdep->cap_reg_base + 32; + int csp_regnum = -1; + if (tdep->has_capability ()) + csp_regnum = tdep->cap_reg_base + 32;
if (prev_regnum == AARCH64_SP_REGNUM || prev_regnum == csp_regnum) return frame_unwind_got_constant (this_frame, prev_regnum, @@ -1611,7 +1616,9 @@ aarch64_dwarf2_prev_register (struct frame_info *this_frame, struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); CORE_ADDR lr;
- int pcc_regnum = tdep->cap_reg_base + 31; + int pcc_regnum = -1; + if (tdep->has_capability ()) + pcc_regnum = tdep->cap_reg_base + 31;
if (regnum == AARCH64_PC_REGNUM || regnum == pcc_regnum) { @@ -1635,8 +1642,14 @@ aarch64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum, struct frame_info *this_frame) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - int pcc_regnum = tdep->cap_reg_base + 31; - int csp_regnum = tdep->cap_reg_base + 32; + int pcc_regnum = -1; + int csp_regnum = -1; + + if (tdep->has_capability ()) + { + pcc_regnum = tdep->cap_reg_base + 31; + csp_regnum = tdep->cap_reg_base + 32; + }
if (regnum == AARCH64_PC_REGNUM || regnum == pcc_regnum) {
From: Luis Machado luis.machado@arm.com
This change makes the code more straightforward, since we can expect the order of the X registers to match that of the C registers. That way we don't have to deal with ordering issues.
It also simplifies the access to the dynamic C register numbers through the gdbarch tdep data structure.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* aarch64-linux-nat.c (fetch_cregs_from_thread): Invert pcc/csp order. * aarch64-linux-tdep.c (aarch64_linux_sigframe_init): Likewise. * aarch64-tdep.c (aarch64_c_register_names): Likewise. (aarch64_analyze_prologue): Remove code to handle csp/pcc ordering issues. (aarch64_prologue_prev_register): Use new tdep fields. (aarch64_dwarf2_prev_register): Use new tdep fields and handle lr/clr. (aarch64_dwarf2_frame_init_reg): Use new tdep fields. (aarch64_gdbarch_init): Initialize the new tdep fields. * aarch64-tdep.h (gdbarch_tdep) <cap_reg_clr, cap_reg_csp> <cap_reg_pcc, cap_reg_rcsp>: New fields * features/aarch64-capability.c: Regenerate. * features/aarch64-capability.xml: Invert pcc/csp.
gdbserver/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* linux-aarch64-low.cc (aarch64_store_cregset): Invert pcc/csp.
YYYY-MM-DD Luis Machado luis.machado@arm.com --- gdb/aarch64-linux-nat.c | 2 +- gdb/aarch64-linux-tdep.c | 10 +--- gdb/aarch64-tdep.c | 86 ++++++++++++++--------------- gdb/aarch64-tdep.h | 8 +++ gdb/features/aarch64-capability.c | 2 +- gdb/features/aarch64-capability.xml | 2 +- gdbserver/linux-aarch64-low.cc | 2 +- 7 files changed, 58 insertions(+), 54 deletions(-)
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c index dc006de7f0..d1859c89da 100644 --- a/gdb/aarch64-linux-nat.c +++ b/gdb/aarch64-linux-nat.c @@ -489,8 +489,8 @@ fetch_cregs_from_thread (struct regcache *regcache) regcache->raw_supply (regno, &cregset.cregs[i]);
/* Fetch the other registers. */ - regcache->raw_supply (regno++, &cregset.pcc); regcache->raw_supply (regno++, &cregset.csp); + regcache->raw_supply (regno++, &cregset.pcc); regcache->raw_supply (regno++, &cregset.ddc); regcache->raw_supply (regno++, &cregset.ctpidr); regcache->raw_supply (regno++, &cregset.rcsp); diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c index 398b429341..9c4d27610c 100644 --- a/gdb/aarch64-linux-tdep.c +++ b/gdb/aarch64-linux-tdep.c @@ -313,10 +313,6 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self, offset + i * reg_size); }
- int pcc_regnum = tdep->cap_reg_base + 31; - int csp_regnum = tdep->cap_reg_base + 32; - int rcsp_regnum = tdep->cap_reg_base + 35; - if (aarch64_debug) { debug_printf ("aarch64: Reading PCC, CSP and RCSP registers " @@ -324,11 +320,11 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self, paddress (gdbarch, offset + 31 * reg_size)); }
- trad_frame_set_reg_addr (this_cache, csp_regnum, + trad_frame_set_reg_addr (this_cache, tdep->cap_reg_csp, offset + 31 * reg_size); - trad_frame_set_reg_addr (this_cache, rcsp_regnum, + trad_frame_set_reg_addr (this_cache, tdep->cap_reg_rcsp, offset + 32 * reg_size); - trad_frame_set_reg_addr (this_cache, pcc_regnum, + trad_frame_set_reg_addr (this_cache, tdep->cap_reg_pcc, offset + 33 * reg_size);
section += size; diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 16c85e3946..c8ca8ac736 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -272,8 +272,8 @@ static const char *const aarch64_c_register_names[] = "c0", "c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11", "c12", "c13", "c14", "c15", "c16", "c17", "c18", "c19", "c20", "c21", "c22", "c23", - "c24", "c25", "c26", "c27", "c28", "c29", "c30", "pcc", - "csp", "ddc", "ctpidr", "rcsp", "rddc", "rctpidr", "cid", + "c24", "c25", "c26", "c27", "c28", "c29", "c30", "csp", + "pcc", "ddc", "ctpidr", "rcsp", "rddc", "rctpidr", "cid", "tag_map", "cctlr" };
@@ -865,8 +865,6 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, if (gdbarch_tdep (gdbarch)->has_capability ()) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - int pcc_regnum = tdep->cap_reg_base + 31; - int csp_regnum = tdep->cap_reg_base + 32;
/* Also save the C registers. */ for (i = 0; i < AARCH64_X_REGISTER_COUNT; i++) @@ -879,15 +877,7 @@ aarch64_analyze_prologue (struct gdbarch *gdbarch, debug_printf ("aarch64: %s Register C%d found at offset %s\n", __func__, i, core_addr_to_string_nz (offset));
- /* FIXME-Morello: We should really invert CSP/PCC to make them - match the order of the X registers. Then we wouldn't need - this conditional block. */ - if (i == AARCH64_SP_REGNUM) - cache->saved_regs[csp_regnum].addr = offset; - else if (i == AARCH64_PC_REGNUM) - cache->saved_regs[pcc_regnum].addr = offset; - else - cache->saved_regs[tdep->cap_reg_base + i].addr = offset; + cache->saved_regs[tdep->cap_reg_base + i].addr = offset; } } } @@ -1402,16 +1392,12 @@ aarch64_prologue_prev_register (struct frame_info *this_frame,
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame));
- int pcc_regnum = -1; - if (tdep->has_capability ()) - pcc_regnum = tdep->cap_reg_base + 31; - /* If we are asked to unwind the PC, then we need to return the LR instead. The prologue may save PC, but it will point into this frame's prologue, not the next frame's resume location.
We do the same for PCC and CLR. */ - if (prev_regnum == AARCH64_PC_REGNUM || prev_regnum == pcc_regnum) + if (prev_regnum == AARCH64_PC_REGNUM || prev_regnum == tdep->cap_reg_pcc) { CORE_ADDR lr; struct gdbarch *gdbarch = get_frame_arch (this_frame); @@ -1422,7 +1408,7 @@ aarch64_prologue_prev_register (struct frame_info *this_frame, if (prev_regnum == AARCH64_PC_REGNUM) lr_regnum = AARCH64_LR_REGNUM; else - lr_regnum = tdep->cap_reg_base + 30; + lr_regnum = tdep->cap_reg_clr;
struct value *lr_value = frame_unwind_register_value (this_frame, lr_regnum); @@ -1444,7 +1430,7 @@ aarch64_prologue_prev_register (struct frame_info *this_frame, = frame_unwind_got_constant (this_frame, prev_regnum, lr);
/* Copy the capability tag over, if it exists. */ - if (prev_regnum == pcc_regnum && value_tagged (lr_value)) + if (prev_regnum == tdep->cap_reg_pcc && value_tagged (lr_value)) { set_value_tagged (lr_value_adjusted, 1); set_value_tag (lr_value_adjusted, value_tag (lr_value)); @@ -1468,11 +1454,8 @@ aarch64_prologue_prev_register (struct frame_info *this_frame, | | | |<- SP +----------+ */ - int csp_regnum = -1; - if (tdep->has_capability ()) - csp_regnum = tdep->cap_reg_base + 32;
- if (prev_regnum == AARCH64_SP_REGNUM || prev_regnum == csp_regnum) + if (prev_regnum == AARCH64_SP_REGNUM || prev_regnum == tdep->cap_reg_csp) return frame_unwind_got_constant (this_frame, prev_regnum, cache->prev_sp);
@@ -1614,18 +1597,38 @@ aarch64_dwarf2_prev_register (struct frame_info *this_frame, { struct gdbarch *gdbarch = get_frame_arch (this_frame); struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - CORE_ADDR lr;
- int pcc_regnum = -1; - if (tdep->has_capability ()) - pcc_regnum = tdep->cap_reg_base + 31; - - if (regnum == AARCH64_PC_REGNUM || regnum == pcc_regnum) + if (regnum == AARCH64_PC_REGNUM || regnum == tdep->cap_reg_pcc) { - lr = frame_unwind_register_unsigned (this_frame, AARCH64_LR_REGNUM); + /* Fetch LR or CLR depending on the ABI. */ + int lr_regnum; + if (regnum == AARCH64_PC_REGNUM) + lr_regnum = AARCH64_LR_REGNUM; + else + lr_regnum = tdep->cap_reg_clr; + + struct value *lr_value = frame_unwind_register_value (this_frame, + lr_regnum); + + /* Extract only the bottom 8 bytes of CLR. This truncates the capability + to 8 bytes. For LR, this gets us the whole register. */ + CORE_ADDR lr = extract_unsigned_integer (value_contents_all (lr_value), 8, + gdbarch_byte_order (gdbarch)); + lr = aarch64_frame_unmask_lr (tdep, this_frame, lr); lr = gdbarch_addr_bits_remove (gdbarch, lr); - return frame_unwind_got_constant (this_frame, regnum, lr); + + struct value *lr_value_adjusted + = frame_unwind_got_constant (this_frame, regnum, lr); + + /* Copy the capability tag over, if it exists. */ + if (regnum == tdep->cap_reg_pcc && value_tagged (lr_value)) + { + set_value_tagged (lr_value_adjusted, 1); + set_value_tag (lr_value_adjusted, value_tag (lr_value)); + } + + return lr_value_adjusted; }
internal_error (__FILE__, __LINE__, _("Unexpected register %d"), regnum); @@ -1642,23 +1645,15 @@ aarch64_dwarf2_frame_init_reg (struct gdbarch *gdbarch, int regnum, struct frame_info *this_frame) { struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - int pcc_regnum = -1; - int csp_regnum = -1; - - if (tdep->has_capability ()) - { - pcc_regnum = tdep->cap_reg_base + 31; - csp_regnum = tdep->cap_reg_base + 32; - }
- if (regnum == AARCH64_PC_REGNUM || regnum == pcc_regnum) + if (regnum == AARCH64_PC_REGNUM || regnum == tdep->cap_reg_pcc) { reg->how = DWARF2_FRAME_REG_FN; reg->loc.fn = aarch64_dwarf2_prev_register; return; }
- if (regnum == AARCH64_SP_REGNUM || regnum == csp_regnum) + if (regnum == AARCH64_SP_REGNUM || regnum == tdep->cap_reg_csp) { reg->how = DWARF2_FRAME_REG_CFA; return; @@ -2593,7 +2588,7 @@ aarch64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg) return tdep->cap_reg_base + (reg - AARCH64_DWARF_C0);
if (reg == AARCH64_DWARF_CSP) - return tdep->cap_reg_base + 32; + return tdep->cap_reg_csp; }
return -1; @@ -4220,8 +4215,13 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) tdep->pauth_ra_state_regnum = (feature_pauth == NULL) ? -1 : pauth_ra_state_offset + num_regs;
+ /* Initialize the capability register numbers. */ tdep->cap_reg_base = first_cap_regnum; tdep->cap_reg_last = last_cap_regnum; + tdep->cap_reg_clr = (first_cap_regnum == -1)? -1 : first_cap_regnum + 30; + tdep->cap_reg_csp = (first_cap_regnum == -1)? -1 : first_cap_regnum + 31; + tdep->cap_reg_pcc = (first_cap_regnum == -1)? -1 : first_cap_regnum + 32; + tdep->cap_reg_rcsp = (first_cap_regnum == -1)? -1 : first_cap_regnum + 35;
set_gdbarch_push_dummy_call (gdbarch, aarch64_push_dummy_call); set_gdbarch_frame_align (gdbarch, aarch64_frame_align); diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index a9d89c0d8b..f87322dffb 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -128,6 +128,14 @@ struct gdbarch_tdep int cap_reg_base; /* Last register from the capability set. */ int cap_reg_last; + /* CLR register number. */ + int cap_reg_clr; + /* CSP register numbers. */ + int cap_reg_csp; + /* PCC register number. */ + int cap_reg_pcc; + /* RCSP register number. */ + int cap_reg_rcsp;
/* Returns true if the target supports capabilities. */ bool has_capability () const diff --git a/gdb/features/aarch64-capability.c b/gdb/features/aarch64-capability.c index dfd78615ac..b6180e64b6 100644 --- a/gdb/features/aarch64-capability.c +++ b/gdb/features/aarch64-capability.c @@ -41,8 +41,8 @@ create_feature_aarch64_capability (struct target_desc *result, long regnum) tdesc_create_reg (feature, "c28", regnum++, 1, "general", 128, "uintcap"); tdesc_create_reg (feature, "c29", regnum++, 1, "general", 128, "uintcap"); tdesc_create_reg (feature, "c30", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "pcc", regnum++, 1, "general", 128, "uintcap"); tdesc_create_reg (feature, "csp", regnum++, 1, "general", 128, "uintcap"); + tdesc_create_reg (feature, "pcc", regnum++, 1, "general", 128, "uintcap"); tdesc_create_reg (feature, "ddc", regnum++, 1, "system", 128, "uintcap"); tdesc_create_reg (feature, "ctpidr", regnum++, 1, "system", 128, "uintcap"); tdesc_create_reg (feature, "rcsp", regnum++, 1, "system", 128, "uintcap"); diff --git a/gdb/features/aarch64-capability.xml b/gdb/features/aarch64-capability.xml index 33110cdbd8..ebe8aea733 100644 --- a/gdb/features/aarch64-capability.xml +++ b/gdb/features/aarch64-capability.xml @@ -38,8 +38,8 @@ <reg name="c28" bitsize="128" type="uintcap" group="general"/> <reg name="c29" bitsize="128" type="uintcap" group="general"/> <reg name="c30" bitsize="128" type="uintcap" group="general"/> - <reg name="pcc" bitsize="128" type="uintcap" group="general"/> <reg name="csp" bitsize="128" type="uintcap" group="general"/> + <reg name="pcc" bitsize="128" type="uintcap" group="general"/> <reg name="ddc" bitsize="128" type="uintcap" group="system"/> <reg name="ctpidr" bitsize="128" type="uintcap" group="system"/> <reg name="rcsp" bitsize="128" type="uintcap" group="general"/> diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc index 940399d381..d034e783cb 100644 --- a/gdbserver/linux-aarch64-low.cc +++ b/gdbserver/linux-aarch64-low.cc @@ -279,8 +279,8 @@ aarch64_store_cregset (struct regcache *regcache, const void *buf) supply_register (regcache, regno, &cregset->cregs[i]);
/* Fetch the other registers. */ - supply_register (regcache, regno++, &cregset->pcc); supply_register (regcache, regno++, &cregset->csp); + supply_register (regcache, regno++, &cregset->pcc); supply_register (regcache, regno++, &cregset->ddc); supply_register (regcache, regno++, &cregset->ctpidr); supply_register (regcache, regno++, &cregset->rcsp);
From: Luis Machado luis.machado@arm.com
When displaying a capability pointer, don't truncate the length of the type.
Also, update the instance flags to mark capability pointers as TYPE_INSTANCE_FLAG_CAPABILITY.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* aarch64-tdep.c (aarch64_address_class_type_flags) (aarch64_address_class_type_flags_to_name) (aarch64_address_class_name_to_type_flags): Use TYPE_INSTANCE_FLAG_CAPABILITY instead of TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1. * gdbtypes.h (TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL): Include TYPE_INSTANCE_FLAG_CAPABILITY. * printcmd.c (print_scalar_formatted): Don't truncate capability pointers. --- gdb/aarch64-tdep.c | 6 +++--- gdb/gdbtypes.h | 3 ++- gdb/printcmd.c | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index c8ca8ac736..6fab1cc2fb 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -3767,7 +3767,7 @@ aarch64_address_class_type_flags (int byte_size, int dwarf2_addr_class) __capability qualifier, meaning a capability for Morello. */
if (dwarf2_addr_class == 1) - return TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + return TYPE_INSTANCE_FLAG_CAPABILITY; return 0; }
@@ -3779,7 +3779,7 @@ static const char* aarch64_address_class_type_flags_to_name (struct gdbarch *gdbarch, type_instance_flags type_flags) { - if (type_flags & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1) + if (type_flags & TYPE_INSTANCE_FLAG_CAPABILITY) return "__capability"; else return NULL; @@ -3796,7 +3796,7 @@ aarch64_address_class_name_to_type_flags (struct gdbarch *gdbarch, { if (strcmp (name, "__capability") == 0) { - *type_flags_ptr = TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1; + *type_flags_ptr = TYPE_INSTANCE_FLAG_CAPABILITY; return true; } else diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index fb2062d8d5..a876cebcd1 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -324,7 +324,8 @@ DEF_ENUM_FLAGS_TYPE (enum type_instance_flag_value, type_instance_flags); #define TYPE_ADDRESS_CLASS_2(t) (((t)->instance_flags ()) \ & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2) #define TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL \ - (TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 | TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2) + (TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1 | TYPE_INSTANCE_FLAG_ADDRESS_CLASS_2 \ + | TYPE_INSTANCE_FLAG_CAPABILITY) #define TYPE_ADDRESS_CLASS_ALL(t) (((t)->instance_flags ()) \ & TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL)
diff --git a/gdb/printcmd.c b/gdb/printcmd.c index f9b42cfda7..c0e59301db 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -362,7 +362,7 @@ print_scalar_formatted (const gdb_byte *valaddr, struct type *type, /* If the value is a pointer, and pointers and addresses are not the same, then at this point, the value's length (in target bytes) is gdbarch_addr_bit/TARGET_CHAR_BIT, not TYPE_LENGTH (type). */ - if (type->code () == TYPE_CODE_PTR) + if (type->code () == TYPE_CODE_PTR && !TYPE_CAPABILITY (type)) len = gdbarch_addr_bit (gdbarch) / TARGET_CHAR_BIT;
/* If we are printing it as unsigned, truncate it in case it is actually
From: Luis Machado luis.machado@arm.com
Support the data_capability and code_capability types, which the capability counterparts of the data_ptr and code_ptr types.
Adjust the Morello C registers to be of data_capability and code_capability types.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* aarch64-tdep.c (aarch64_address_class_type_flags) (aarch64_address_class_type_flags_to_name) (aarch64_address_class_name_to_type_flags): Use TYPE_INSTANCE_FLAG_CAPABILITY instead of TYPE_INSTANCE_FLAG_ADDRESS_CLASS_1. (aarch64_gdbarch_init): Set capability size to 128. * features/aarch64-capability.c: Regenerate. * features/aarch64-capability.xml: Update C register types. * gdbarch.c: Regenerate. * gdbarch.h: Regenerate. * gdbarch.sh (code_capability_bit, data_capability) (dwarf2_capability_size): Remove. * gdbtypes.c (gdbtypes_post_init): Initialize data_capability and code_capability types. * gdbtypes.h (TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL): Include TYPE_INSTANCE_FLAG_CAPABILITY in the list of address classes. (struct builtin_type) <builtin_data_addr_capability>: Rename to builtin_data_capability. (struct builtin_type) <builtin_code_addr_capability>: Rename to builtin_code_capability. * target-descriptions.c (make_gdb_type): Update type names.
gdbsupport/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* tdesc.cc (tdesc_predefined_types): Update type names for capabilities. --- gdb/aarch64-tdep.c | 2 + gdb/features/aarch64-capability.c | 78 ++++++++++++++--------------- gdb/features/aarch64-capability.xml | 78 ++++++++++++++--------------- gdb/gdbarch.c | 71 -------------------------- gdb/gdbarch.h | 19 +------ gdb/gdbarch.sh | 9 ---- gdb/gdbtypes.c | 23 ++++++--- gdb/gdbtypes.h | 4 +- gdb/target-descriptions.c | 6 +-- gdbsupport/tdesc.cc | 4 +- 10 files changed, 104 insertions(+), 190 deletions(-)
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 6fab1cc2fb..e30a61e6a6 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -4263,6 +4263,8 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_long_bit (gdbarch, 64); set_gdbarch_long_long_bit (gdbarch, 64); set_gdbarch_ptr_bit (gdbarch, 64); + /* Regardless of the ABI, capabilities are always 128-bit. */ + set_gdbarch_capability_bit (gdbarch, 128); set_gdbarch_char_signed (gdbarch, 0); set_gdbarch_wchar_signed (gdbarch, 0); set_gdbarch_float_format (gdbarch, floatformats_ieee_single); diff --git a/gdb/features/aarch64-capability.c b/gdb/features/aarch64-capability.c index b6180e64b6..a4098af710 100644 --- a/gdb/features/aarch64-capability.c +++ b/gdb/features/aarch64-capability.c @@ -10,45 +10,45 @@ create_feature_aarch64_capability (struct target_desc *result, long regnum)
feature = tdesc_create_feature (result, "org.gnu.gdb.aarch64.capability");
- tdesc_create_reg (feature, "c0", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c1", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c2", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c3", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c4", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c5", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c6", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c7", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c8", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c9", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c10", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c11", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c12", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c13", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c14", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c15", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c16", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c17", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c18", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c19", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c20", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c21", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c22", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c23", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c24", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c25", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c26", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c27", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c28", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c29", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "c30", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "csp", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "pcc", regnum++, 1, "general", 128, "uintcap"); - tdesc_create_reg (feature, "ddc", regnum++, 1, "system", 128, "uintcap"); - tdesc_create_reg (feature, "ctpidr", regnum++, 1, "system", 128, "uintcap"); - tdesc_create_reg (feature, "rcsp", regnum++, 1, "system", 128, "uintcap"); - tdesc_create_reg (feature, "rddc", regnum++, 1, "system", 128, "uintcap"); - tdesc_create_reg (feature, "rctpidr", regnum++, 1, "system", 128, "uintcap"); - tdesc_create_reg (feature, "cid", regnum++, 1, "system", 128, "uintcap"); + tdesc_create_reg (feature, "c0", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c1", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c2", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c3", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c4", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c5", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c6", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c7", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c8", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c9", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c10", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c11", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c12", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c13", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c14", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c15", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c16", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c17", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c18", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c19", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c20", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c21", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c22", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c23", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c24", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c25", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c26", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c27", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c28", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c29", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "c30", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "csp", regnum++, 1, "general", 128, "data_capability"); + tdesc_create_reg (feature, "pcc", regnum++, 1, "general", 128, "code_capability"); + tdesc_create_reg (feature, "ddc", regnum++, 1, "system", 128, "data_capability"); + tdesc_create_reg (feature, "ctpidr", regnum++, 1, "system", 128, "data_capability"); + tdesc_create_reg (feature, "rcsp", regnum++, 1, "system", 128, "data_capability"); + tdesc_create_reg (feature, "rddc", regnum++, 1, "system", 128, "data_capability"); + tdesc_create_reg (feature, "rctpidr", regnum++, 1, "system", 128, "data_capability"); + tdesc_create_reg (feature, "cid", regnum++, 1, "system", 128, "data_capability"); tdesc_create_reg (feature, "tag_map", regnum++, 1, "system", 64, "uint64"); tdesc_create_reg (feature, "cctlr", regnum++, 1, "system", 64, "uint64"); return regnum; diff --git a/gdb/features/aarch64-capability.xml b/gdb/features/aarch64-capability.xml index ebe8aea733..e8ae9b2db9 100644 --- a/gdb/features/aarch64-capability.xml +++ b/gdb/features/aarch64-capability.xml @@ -7,45 +7,45 @@
<!DOCTYPE feature SYSTEM "gdb-target.dtd"> <feature name="org.gnu.gdb.aarch64.capability"> - <reg name="c0" bitsize="128" type="uintcap" group="general"/> - <reg name="c1" bitsize="128" type="uintcap" group="general"/> - <reg name="c2" bitsize="128" type="uintcap" group="general"/> - <reg name="c3" bitsize="128" type="uintcap" group="general"/> - <reg name="c4" bitsize="128" type="uintcap" group="general"/> - <reg name="c5" bitsize="128" type="uintcap" group="general"/> - <reg name="c6" bitsize="128" type="uintcap" group="general"/> - <reg name="c7" bitsize="128" type="uintcap" group="general"/> - <reg name="c8" bitsize="128" type="uintcap" group="general"/> - <reg name="c9" bitsize="128" type="uintcap" group="general"/> - <reg name="c10" bitsize="128" type="uintcap" group="general"/> - <reg name="c11" bitsize="128" type="uintcap" group="general"/> - <reg name="c12" bitsize="128" type="uintcap" group="general"/> - <reg name="c13" bitsize="128" type="uintcap" group="general"/> - <reg name="c14" bitsize="128" type="uintcap" group="general"/> - <reg name="c15" bitsize="128" type="uintcap" group="general"/> - <reg name="c16" bitsize="128" type="uintcap" group="general"/> - <reg name="c17" bitsize="128" type="uintcap" group="general"/> - <reg name="c18" bitsize="128" type="uintcap" group="general"/> - <reg name="c19" bitsize="128" type="uintcap" group="general"/> - <reg name="c20" bitsize="128" type="uintcap" group="general"/> - <reg name="c21" bitsize="128" type="uintcap" group="general"/> - <reg name="c22" bitsize="128" type="uintcap" group="general"/> - <reg name="c23" bitsize="128" type="uintcap" group="general"/> - <reg name="c24" bitsize="128" type="uintcap" group="general"/> - <reg name="c25" bitsize="128" type="uintcap" group="general"/> - <reg name="c26" bitsize="128" type="uintcap" group="general"/> - <reg name="c27" bitsize="128" type="uintcap" group="general"/> - <reg name="c28" bitsize="128" type="uintcap" group="general"/> - <reg name="c29" bitsize="128" type="uintcap" group="general"/> - <reg name="c30" bitsize="128" type="uintcap" group="general"/> - <reg name="csp" bitsize="128" type="uintcap" group="general"/> - <reg name="pcc" bitsize="128" type="uintcap" group="general"/> - <reg name="ddc" bitsize="128" type="uintcap" group="system"/> - <reg name="ctpidr" bitsize="128" type="uintcap" group="system"/> - <reg name="rcsp" bitsize="128" type="uintcap" group="general"/> - <reg name="rddc" bitsize="128" type="uintcap" group="general"/> - <reg name="rctpidr" bitsize="128" type="uintcap" group="system"/> - <reg name="cid" bitsize="128" type="uintcap" group="system"/> + <reg name="c0" bitsize="128" type="data_capability" group="general"/> + <reg name="c1" bitsize="128" type="data_capability" group="general"/> + <reg name="c2" bitsize="128" type="data_capability" group="general"/> + <reg name="c3" bitsize="128" type="data_capability" group="general"/> + <reg name="c4" bitsize="128" type="data_capability" group="general"/> + <reg name="c5" bitsize="128" type="data_capability" group="general"/> + <reg name="c6" bitsize="128" type="data_capability" group="general"/> + <reg name="c7" bitsize="128" type="data_capability" group="general"/> + <reg name="c8" bitsize="128" type="data_capability" group="general"/> + <reg name="c9" bitsize="128" type="data_capability" group="general"/> + <reg name="c10" bitsize="128" type="data_capability" group="general"/> + <reg name="c11" bitsize="128" type="data_capability" group="general"/> + <reg name="c12" bitsize="128" type="data_capability" group="general"/> + <reg name="c13" bitsize="128" type="data_capability" group="general"/> + <reg name="c14" bitsize="128" type="data_capability" group="general"/> + <reg name="c15" bitsize="128" type="data_capability" group="general"/> + <reg name="c16" bitsize="128" type="data_capability" group="general"/> + <reg name="c17" bitsize="128" type="data_capability" group="general"/> + <reg name="c18" bitsize="128" type="data_capability" group="general"/> + <reg name="c19" bitsize="128" type="data_capability" group="general"/> + <reg name="c20" bitsize="128" type="data_capability" group="general"/> + <reg name="c21" bitsize="128" type="data_capability" group="general"/> + <reg name="c22" bitsize="128" type="data_capability" group="general"/> + <reg name="c23" bitsize="128" type="data_capability" group="general"/> + <reg name="c24" bitsize="128" type="data_capability" group="general"/> + <reg name="c25" bitsize="128" type="data_capability" group="general"/> + <reg name="c26" bitsize="128" type="data_capability" group="general"/> + <reg name="c27" bitsize="128" type="data_capability" group="general"/> + <reg name="c28" bitsize="128" type="data_capability" group="general"/> + <reg name="c29" bitsize="128" type="data_capability" group="general"/> + <reg name="c30" bitsize="128" type="data_capability" group="general"/> + <reg name="csp" bitsize="128" type="data_capability" group="general"/> + <reg name="pcc" bitsize="128" type="code_capability" group="general"/> + <reg name="ddc" bitsize="128" type="data_capability" group="system"/> + <reg name="ctpidr" bitsize="128" type="data_capability" group="system"/> + <reg name="rcsp" bitsize="128" type="data_capability" group="general"/> + <reg name="rddc" bitsize="128" type="data_capability" group="general"/> + <reg name="rctpidr" bitsize="128" type="data_capability" group="system"/> + <reg name="cid" bitsize="128" type="data_capability" group="system"/> <reg name="tag_map" bitsize="64" type="uint64" group="system"/> <reg name="cctlr" bitsize="64" type="uint64" group="system"/> </feature> diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index 875b31cb3b..00f6272243 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -182,10 +182,7 @@ struct gdbarch int ptr_bit; int addr_bit; int dwarf2_addr_size; - int code_capability_bit; - int data_capability_bit; int capability_bit; - int dwarf2_capability_size; int char_signed; gdbarch_read_pc_ftype *read_pc; gdbarch_write_pc_ftype *write_pc; @@ -400,7 +397,6 @@ gdbarch_alloc (const struct gdbarch_info *info, gdbarch->wchar_signed = -1; gdbarch->floatformat_for_type = default_floatformat_for_type; gdbarch->ptr_bit = gdbarch->int_bit; - gdbarch->code_capability_bit = gdbarch->int_bit; gdbarch->char_signed = -1; gdbarch->virtual_frame_pointer = legacy_virtual_frame_pointer; gdbarch->num_regs = -1; @@ -559,13 +555,8 @@ verify_gdbarch (struct gdbarch *gdbarch) gdbarch->addr_bit = gdbarch_ptr_bit (gdbarch); if (gdbarch->dwarf2_addr_size == 0) gdbarch->dwarf2_addr_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; - /* Skip verify of code_capability_bit, invalid_p == 0 */ - if (gdbarch->data_capability_bit == 0) - gdbarch->data_capability_bit = gdbarch_ptr_bit (gdbarch); if (gdbarch->capability_bit == 0) gdbarch->capability_bit = gdbarch_ptr_bit (gdbarch); - if (gdbarch->dwarf2_capability_size == 0) - gdbarch->dwarf2_capability_size = gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; if (gdbarch->char_signed == -1) gdbarch->char_signed = 1; /* Skip verify of read_pc, has predicate. */ @@ -870,9 +861,6 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: char_signed = %s\n", plongest (gdbarch->char_signed)); - fprintf_unfiltered (file, - "gdbarch_dump: code_capability_bit = %s\n", - plongest (gdbarch->code_capability_bit)); fprintf_unfiltered (file, "gdbarch_dump: code_of_frame_writable = <%s>\n", host_address_to_string (gdbarch->code_of_frame_writable)); @@ -927,9 +915,6 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: core_xfer_siginfo = <%s>\n", host_address_to_string (gdbarch->core_xfer_siginfo)); - fprintf_unfiltered (file, - "gdbarch_dump: data_capability_bit = %s\n", - plongest (gdbarch->data_capability_bit)); fprintf_unfiltered (file, "gdbarch_dump: decr_pc_after_break = %s\n", core_addr_to_string_nz (gdbarch->decr_pc_after_break)); @@ -999,9 +984,6 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) fprintf_unfiltered (file, "gdbarch_dump: dwarf2_addr_size = %s\n", plongest (gdbarch->dwarf2_addr_size)); - fprintf_unfiltered (file, - "gdbarch_dump: dwarf2_capability_size = %s\n", - plongest (gdbarch->dwarf2_capability_size)); fprintf_unfiltered (file, "gdbarch_dump: dwarf2_reg_to_regnum = <%s>\n", host_address_to_string (gdbarch->dwarf2_reg_to_regnum)); @@ -1938,41 +1920,6 @@ set_gdbarch_dwarf2_addr_size (struct gdbarch *gdbarch, gdbarch->dwarf2_addr_size = dwarf2_addr_size; }
-int -gdbarch_code_capability_bit (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - /* Skip verify of code_capability_bit, invalid_p == 0 */ - if (gdbarch_debug >= 2) - fprintf_unfiltered (gdb_stdlog, "gdbarch_code_capability_bit called\n"); - return gdbarch->code_capability_bit; -} - -void -set_gdbarch_code_capability_bit (struct gdbarch *gdbarch, - int code_capability_bit) -{ - gdbarch->code_capability_bit = code_capability_bit; -} - -int -gdbarch_data_capability_bit (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - /* Check variable changed from pre-default. */ - gdb_assert (gdbarch->data_capability_bit != 0); - if (gdbarch_debug >= 2) - fprintf_unfiltered (gdb_stdlog, "gdbarch_data_capability_bit called\n"); - return gdbarch->data_capability_bit; -} - -void -set_gdbarch_data_capability_bit (struct gdbarch *gdbarch, - int data_capability_bit) -{ - gdbarch->data_capability_bit = data_capability_bit; -} - int gdbarch_capability_bit (struct gdbarch *gdbarch) { @@ -1991,24 +1938,6 @@ set_gdbarch_capability_bit (struct gdbarch *gdbarch, gdbarch->capability_bit = capability_bit; }
-int -gdbarch_dwarf2_capability_size (struct gdbarch *gdbarch) -{ - gdb_assert (gdbarch != NULL); - /* Check variable changed from pre-default. */ - gdb_assert (gdbarch->dwarf2_capability_size != 0); - if (gdbarch_debug >= 2) - fprintf_unfiltered (gdb_stdlog, "gdbarch_dwarf2_capability_size called\n"); - return gdbarch->dwarf2_capability_size; -} - -void -set_gdbarch_dwarf2_capability_size (struct gdbarch *gdbarch, - int dwarf2_capability_size) -{ - gdbarch->dwarf2_capability_size = dwarf2_capability_size; -} - int gdbarch_char_signed (struct gdbarch *gdbarch) { diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index bcce5060ad..b36dbd0ab2 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -252,28 +252,11 @@ extern void set_gdbarch_dwarf2_addr_size (struct gdbarch *gdbarch, int dwarf2_ad /* For capability-based targets, the capability representation will likely differ from regular pointers. We can have a code capability and a data capability. - code_capability is the size of a capability on the target */ - -extern int gdbarch_code_capability_bit (struct gdbarch *gdbarch); -extern void set_gdbarch_code_capability_bit (struct gdbarch *gdbarch, int code_capability_bit); - -/* data_capability is the size of a target capability as represented in gdb */ - -extern int gdbarch_data_capability_bit (struct gdbarch *gdbarch); -extern void set_gdbarch_data_capability_bit (struct gdbarch *gdbarch, int data_capability_bit); - -/* capability_bit is the size of a target capability as represented in gdb */ + capability_bit is the size of a target capability as represented in gdb */
extern int gdbarch_capability_bit (struct gdbarch *gdbarch); extern void set_gdbarch_capability_bit (struct gdbarch *gdbarch, int capability_bit);
-/* Note that dwarf2_capability_size only needs to be redefined by a target if the - GCC back-end defines a DWARF2_CAPABILITY_SIZE other than the target pointer - size, and if Dwarf versions < 4 need to be supported. */ - -extern int gdbarch_dwarf2_capability_size (struct gdbarch *gdbarch); -extern void set_gdbarch_dwarf2_capability_size (struct gdbarch *gdbarch, int dwarf2_capability_size); - /* One if `char' acts like `signed char', zero if `unsigned char'. */
extern int gdbarch_char_signed (struct gdbarch *gdbarch); diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index d0b58eca60..f7f727611f 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -385,18 +385,9 @@ v;int;dwarf2_addr_size;;;sizeof (void*);0;gdbarch_ptr_bit (gdbarch) / TARGET_CHA # For capability-based targets, the capability representation will likely # differ from regular pointers. We can have a code capability and a data # capability. -# code_capability is the size of a capability on the target -v;int;code_capability_bit;;;8 * sizeof (void*);gdbarch->int_bit;;0 -# data_capability is the size of a target capability as represented in gdb -v;int;data_capability_bit;;;8 * sizeof (void*);0;gdbarch_ptr_bit (gdbarch); # capability_bit is the size of a target capability as represented in gdb v;int;capability_bit;;;8 * sizeof (void*);0;gdbarch_ptr_bit (gdbarch);
-# Note that dwarf2_capability_size only needs to be redefined by a target if the -# GCC back-end defines a DWARF2_CAPABILITY_SIZE other than the target pointer -# size, and if Dwarf versions < 4 need to be supported. -v;int;dwarf2_capability_size;;;sizeof (void*);0;gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT; - # One if `char' acts like `signed char', zero if `unsigned char'. v;int;char_signed;;;1;-1;1 # diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index 0c36285245..b8d90fb75c 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -5925,15 +5925,26 @@ gdbtypes_post_init (struct gdbarch *gdbarch)
/* Capability types. */ builtin_type->builtin_intcap_t - = arch_capability_type (gdbarch, 128, 0, "__intcap_t"); + = arch_capability_type (gdbarch, gdbarch_capability_bit (gdbarch), 0, + "__intcap_t"); builtin_type->builtin_uintcap_t - = arch_capability_type (gdbarch, 128, 1, "__uintcap_t"); + = arch_capability_type (gdbarch, gdbarch_capability_bit (gdbarch), 1, + "__uintcap_t");
/* Capability pointer types. */ - builtin_type->builtin_data_addr_capability - = lookup_pointer_type (builtin_type->builtin_void); - builtin_type->builtin_code_addr_capability - = lookup_pointer_type (lookup_function_type (builtin_type->builtin_void)); + builtin_type->builtin_data_capability + = arch_pointer_type (gdbarch, gdbarch_capability_bit (gdbarch), "", + builtin_type->builtin_void); + builtin_type->builtin_data_capability->set_instance_flags + (builtin_type->builtin_data_capability->instance_flags () + | TYPE_INSTANCE_FLAG_CAPABILITY); + + builtin_type->builtin_code_capability + = arch_pointer_type (gdbarch, gdbarch_capability_bit (gdbarch), "", + lookup_function_type (builtin_type->builtin_void)); + builtin_type->builtin_code_capability->set_instance_flags + (builtin_type->builtin_code_capability->instance_flags () + | TYPE_INSTANCE_FLAG_CAPABILITY);
/* This type represents a GDB internal function. */ builtin_type->internal_fn diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index a876cebcd1..36e44d0b39 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -2072,10 +2072,10 @@ struct builtin_type struct type *builtin_uintcap_t;
/* Data address capability. */ - struct type *builtin_data_addr_capability; + struct type *builtin_data_capability;
/* Code address capability. */ - struct type *builtin_code_addr_capability; + struct type *builtin_code_capability;
/* Special-purpose types. */
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c index f883ec2c96..d5dd4835de 100644 --- a/gdb/target-descriptions.c +++ b/gdb/target-descriptions.c @@ -110,13 +110,11 @@ make_gdb_type (struct gdbarch *gdbarch, struct tdesc_type *ttype) case TDESC_TYPE_DATA_PTR: m_type = builtin_type (m_gdbarch)->builtin_data_ptr; return; - /* FIXME-Morello: Fix naming of the type according to what the final - code will look like. */ case TDESC_TYPE_CODE_CAPABILITY: - m_type = builtin_type (m_gdbarch)->builtin_code_addr_capability; + m_type = builtin_type (m_gdbarch)->builtin_code_capability; return; case TDESC_TYPE_DATA_CAPABILITY: - m_type = builtin_type (m_gdbarch)->builtin_data_addr_capability; + m_type = builtin_type (m_gdbarch)->builtin_data_capability; return; case TDESC_TYPE_INTCAP: m_type = builtin_type (m_gdbarch)->builtin_intcap_t; diff --git a/gdbsupport/tdesc.cc b/gdbsupport/tdesc.cc index 9f4eac655f..abe98a77ed 100644 --- a/gdbsupport/tdesc.cc +++ b/gdbsupport/tdesc.cc @@ -50,8 +50,8 @@ static tdesc_type_builtin tdesc_predefined_types[] = { "uint128", TDESC_TYPE_UINT128 }, { "code_ptr", TDESC_TYPE_CODE_PTR }, { "data_ptr", TDESC_TYPE_DATA_PTR }, - { "code_addr_capability", TDESC_TYPE_CODE_CAPABILITY }, - { "data_addr_capability", TDESC_TYPE_DATA_CAPABILITY }, + { "code_capability", TDESC_TYPE_CODE_CAPABILITY }, + { "data_capability", TDESC_TYPE_DATA_CAPABILITY }, { "intcap", TDESC_TYPE_INTCAP }, { "uintcap", TDESC_TYPE_UINTCAP }, { "ieee_half", TDESC_TYPE_IEEE_HALF },
From: Luis Machado luis.machado@arm.com
When casting capabilities and capability pointers to other types, we truncate the value to the appropriate size, given some capabilities are greater than 8 bytes in size.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* valops.c (value_cast): Handle casting from capabilities and capability pointers. --- gdb/valops.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/gdb/valops.c b/gdb/valops.c index 3c0ed38a97..d0f1a1ed60 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -441,14 +441,20 @@ value_cast (struct type *type, struct value *arg2) || code2 == TYPE_CODE_DECFLOAT || code2 == TYPE_CODE_ENUM || code2 == TYPE_CODE_RANGE);
- /* Handle casting capabilities to other scalar types. For now we truncate - the capability value to the size of the target type. */ - if (scalar && code2 == TYPE_CODE_CAPABILITY) + int to_scalar = (code1 == TYPE_CODE_INT || code1 == TYPE_CODE_FLT + || code1 == TYPE_CODE_DECFLOAT || code1 == TYPE_CODE_ENUM + || code1 == TYPE_CODE_RANGE); + + /* Handle casting capabilities/capability pointers to other scalar types. + For now we truncate the capability value to the size of the target + type. */ + if (to_scalar && (code2 == TYPE_CODE_CAPABILITY + || (code2 == TYPE_CODE_PTR && TYPE_CAPABILITY (type2)))) { if (type->is_unsigned ()) - value_from_ulongest (to_type, value_as_long (arg2)); + return value_from_ulongest (to_type, value_as_long (arg2)); else - value_from_longest (to_type, value_as_long (arg2)); + return value_from_longest (to_type, value_as_long (arg2)); }
if ((code1 == TYPE_CODE_STRUCT || code1 == TYPE_CODE_UNION)
From: Luis Machado luis.machado@arm.com
Rename "attributes" to "permissions" when printing decoded capabilities.
gdbsupport/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* capability.cc (capability::to_str): Rename "attributes" to "permissions". --- gdbsupport/capability.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/gdbsupport/capability.cc b/gdbsupport/capability.cc index f2979d3060..1b01590d5c 100644 --- a/gdbsupport/capability.cc +++ b/gdbsupport/capability.cc @@ -529,7 +529,7 @@ std::string capability::to_str (void) { /* The printing format is the following: - {tag = %d, address = 0x%016x, attributes = {[%s], otype = 0x%04x, + {tag = %d, address = 0x%016x, permissions = {[%s], otype = 0x%04x, [range = [0x%016x - 0x%016x)}} */ std::string cap_str (""); @@ -566,7 +566,7 @@ capability::to_str (void)
/* Assemble the capability string. */ cap_str += "{tag = " + tag_str + ", address = " + val_str + ", " - + "attributes = {" + perm_str + " "; + + "permissions = {" + perm_str + " ";
if (is_sealed ()) cap_str += "otype = " + otype_str + ", ";
From: Luis Machado luis.machado@arm.com
In order to produce output that is not so verbose, we print the short version of the decoded capabilities instead.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* valprint.c (generic_value_print_capability): Use compact form.
gdbsupport/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* capability.cc (cap_short_perms_strings): New static global. (capability::to_str): New argument COMPACT. Print contents based on the new argument. (capability::print): Update calls. * capability.h (capability::to_str): Update prototype and documentation. --- gdb/valprint.c | 2 +- gdbsupport/capability.cc | 40 ++++++++++++++++++++++++++++++++++++---- gdbsupport/capability.h | 7 +++++-- 3 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/gdb/valprint.c b/gdb/valprint.c index 048512d310..7e31700836 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -513,7 +513,7 @@ generic_value_print_capability (struct value *val, struct ui_file *stream, uint128_t dummy_cap; memcpy (&dummy_cap, contents, length); capability cap (dummy_cap, tag); - fprintf_filtered (stream, "%s", cap.to_str ().c_str ()); + fprintf_filtered (stream, "%s", cap.to_str (true).c_str ()); }
return; diff --git a/gdbsupport/capability.cc b/gdbsupport/capability.cc index 1b01590d5c..6551bab678 100644 --- a/gdbsupport/capability.cc +++ b/gdbsupport/capability.cc @@ -76,6 +76,31 @@ static const char *cap_perms_strings[] = "Load" };
+/* Short version of permission string names, indexed by bit number from + permissions + Valid bits are 0 through 17. */ +static const char *cap_short_perms_strings[] = +{ + "G", + "E", + "U0", + "U1", + "U2", + "U3", + "MLd", + "CID", + "BrUn", + "Sys", + "Un", + "Sl", + "StLoC", + "StC", + "LdC", + "X", + "St", + "Ld" +}; + /* Returns a capability, derived from the input capability, with base address set to the value of the input capability and the length set to a given value. If precise bounds setting is not possible, either the bounds are @@ -523,10 +548,13 @@ capability::set_offset (uint64_t offset) set_value (get_base () + offset); }
-/* Returns a string representation of the capability. */ +/* Returns a string representation of the capability. + + If COMPACT is true, use a less verbose form. Otherwise print + the more verbose version. */
std::string -capability::to_str (void) +capability::to_str (bool compact) { /* The printing format is the following: {tag = %d, address = 0x%016x, permissions = {[%s], otype = 0x%04x, @@ -549,7 +577,11 @@ capability::to_str (void) if (check_permissions (1 << i)) { perm_str += " "; - perm_str += cap_perms_strings [i]; + + if (compact) + perm_str += cap_short_perms_strings[i]; + else + perm_str += cap_perms_strings[i]; }
perm_str += " ]"; @@ -581,7 +613,7 @@ capability::to_str (void) void capability::print (void) { - printf ("%s", to_str ().c_str ()); + printf ("%s", to_str (true).c_str ()); }
/* UNIT TESTS - Exercise all the methods and primitives. Some of the tests diff --git a/gdbsupport/capability.h b/gdbsupport/capability.h index 817316ed0e..fd94768e43 100644 --- a/gdbsupport/capability.h +++ b/gdbsupport/capability.h @@ -544,9 +544,12 @@ struct capability {
/* Printing functions. */
- /* Returns a string representation of the capability. */ + /* Returns a string representation of the capability.
- std::string to_str (void); + If COMPACT is true, use a less verbose form. Otherwise print + the more verbose version. */ + + std::string to_str (bool compact);
/* Print the capability. */
From: Luis Machado luis.machado@arm.com
Print capability pointers as capabilities, so the user can see the decoded fields of the capability.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* c-valprint.c (c_value_print_ptr): Adjust to print capability pointers as capabilities. (c_value_print_inner): Handle TYPE_CODE_CAPABILITY. * findvar.c (extract_integer): Truncate scalars instead of erroring out. * valprint.c (generic_value_print_capability): Make non-static and print additional space. * valprint.h (generic_value_print_capability): New prototype. --- gdb/c-valprint.c | 9 ++++++++- gdb/findvar.c | 16 ++++++++-------- gdb/valprint.c | 4 ++-- gdb/valprint.h | 4 ++++ 4 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/gdb/c-valprint.c b/gdb/c-valprint.c index 01b1071cb7..89d4a7e3e1 100644 --- a/gdb/c-valprint.c +++ b/gdb/c-valprint.c @@ -326,13 +326,19 @@ static void c_value_print_ptr (struct value *val, struct ui_file *stream, int recurse, const struct value_print_options *options) { + struct type *type = check_typedef (value_type (val)); + + /* If we have a pointer to a capability, handle it as a capability. */ + if (options->format == 0 && (type->code () == TYPE_CODE_PTR + && TYPE_CAPABILITY (type))) + generic_value_print_capability (val, stream, options); + if (options->format && options->format != 's') { value_print_scalar_formatted (val, options, 0, stream); return; }
- struct type *type = check_typedef (value_type (val)); struct gdbarch *arch = get_type_arch (type); const gdb_byte *valaddr = value_contents_for_printing (val);
@@ -461,6 +467,7 @@ c_value_print_inner (struct value *val, struct ui_file *stream, int recurse, case TYPE_CODE_UNDEF: case TYPE_CODE_COMPLEX: case TYPE_CODE_CHAR: + case TYPE_CODE_CAPABILITY: default: generic_value_print (val, stream, recurse, options, &c_decorations); break; diff --git a/gdb/findvar.c b/gdb/findvar.c index 5c3a8848a5..18ae8e2ffb 100644 --- a/gdb/findvar.c +++ b/gdb/findvar.c @@ -36,7 +36,11 @@
/* Basic byte-swapping routines. All 'extract' functions return a host-format integer from a target-format integer at ADDR which is - LEN bytes long. */ + LEN bytes long. + + FIXME-Morello: This is a temporary hack to address GDB's inability to cope + with 128-bit scalar types. Instead of erroring out and giving up, just + truncate the scalar to the size of T. */
#if TARGET_CHAR_BIT != 8 || HOST_CHAR_BIT != 8 /* 8 bit characters are a pretty safe assumption these days, so we @@ -53,18 +57,14 @@ extract_integer (const gdb_byte *addr, int len, enum bfd_endian byte_order) typename std::make_unsigned<T>::type retval = 0; const unsigned char *p; const unsigned char *startaddr = addr; + size_t max_len = (len > sizeof (T))? sizeof (T) : len; const unsigned char *endaddr = startaddr + len;
- if (len > (int) sizeof (T)) - error (_("\ -That operation is not available on integers of more than %d bytes."), - (int) sizeof (T)); - /* Start at the most significant end of the integer, and work towards the least significant. */ if (byte_order == BFD_ENDIAN_BIG) { - p = startaddr; + p = endaddr - max_len; if (std::is_signed<T>::value) { /* Do the sign extension once at the start. */ @@ -76,7 +76,7 @@ That operation is not available on integers of more than %d bytes."), } else { - p = endaddr - 1; + p = startaddr + max_len - 1; if (std::is_signed<T>::value) { /* Do the sign extension once at the start. */ diff --git a/gdb/valprint.c b/gdb/valprint.c index 7e31700836..b28d987e9c 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -480,7 +480,7 @@ generic_value_print_ptr (struct value *val, struct ui_file *stream,
/* generic_value_print helper for TYPE_CODE_CAPABILITY. */
-static void +void generic_value_print_capability (struct value *val, struct ui_file *stream, const struct value_print_options *options) { @@ -513,7 +513,7 @@ generic_value_print_capability (struct value *val, struct ui_file *stream, uint128_t dummy_cap; memcpy (&dummy_cap, contents, length); capability cap (dummy_cap, tag); - fprintf_filtered (stream, "%s", cap.to_str (true).c_str ()); + fprintf_filtered (stream, "%s ", cap.to_str (true).c_str ()); }
return; diff --git a/gdb/valprint.h b/gdb/valprint.h index 489d14ba0e..ff7be2b6cf 100644 --- a/gdb/valprint.h +++ b/gdb/valprint.h @@ -242,6 +242,10 @@ extern void generic_printstr (struct ui_file *stream, struct type *type, int quote_char, int c_style_terminator, const struct value_print_options *options);
+extern void generic_value_print_capability (struct value *val, + struct ui_file *stream, + const struct value_print_options *options); + /* Run the "output" command. ARGS and FROM_TTY are the usual arguments passed to all command implementations, except ARGS is const. */
From: Luis Machado luis.machado@arm.com
Remove code to return LR for a CLR DWARF register.
For the pure capability ABI, set pc to PCC and sp to CSP.
gdb/ChangeLog:
YYYY-MM-DD Luis Machado luis.machado@arm.com
* aarch64-tdep.c (aarch64_dwarf_reg_to_regnum): Don't return LR for CLR. (aarch64_gdbarch_init): Set pc to PCC and sp to CSP for pure cap ABI. --- gdb/aarch64-tdep.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index e30a61e6a6..14b46e85c8 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -2580,10 +2580,6 @@ aarch64_dwarf_reg_to_regnum (struct gdbarch *gdbarch, int reg)
if (tdep->has_capability ()) { - /* FIXME-Morello: Redirect CLR to LR for now. */ - if (reg == AARCH64_DWARF_CLR) - return AARCH64_LR_REGNUM; - if (reg >= AARCH64_DWARF_C0 && reg <= AARCH64_DWARF_C0 + 30) return tdep->cap_reg_base + (reg - AARCH64_DWARF_C0);
@@ -4331,6 +4327,9 @@ aarch64_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) /* Set address class hooks for capabilities. */ if (feature_capability) { + set_gdbarch_sp_regnum (gdbarch, tdep->cap_reg_csp); + set_gdbarch_pc_regnum (gdbarch, tdep->cap_reg_pcc); + /* Address manipulation. */ set_gdbarch_addr_bits_remove (gdbarch, aarch64_addr_bits_remove);
gnu-morello@op-lists.linaro.org