From c6a26c89d540f6cf4fe267a59c8b3ccb21beadec Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Tue, 3 Nov 2020 14:08:15 -0300 Subject: [PATCH] Support data_capability and code_capability types + update target description 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: 2020-11-11 Luis Machado * 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) : Rename to builtin_data_capability. (struct builtin_type) : Rename to builtin_code_capability. * target-descriptions.c (make_gdb_type): Update type names. gdbsupport/ChangeLog: 2020-11-11 Luis Machado * 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-components.py | 34 ------------- gdb/gdbarch-gen.h | 19 +------ gdb/gdbarch.c | 71 -------------------------- gdb/gdbtypes.c | 23 ++++++--- gdb/gdbtypes.h | 4 +- gdb/target-descriptions.c | 6 +-- gdbsupport/tdesc.cc | 4 +- 10 files changed, 104 insertions(+), 215 deletions(-) diff --git a/gdb/aarch64-tdep.c b/gdb/aarch64-tdep.c index 02c845f2d9f..8788097ba5c 100644 --- a/gdb/aarch64-tdep.c +++ b/gdb/aarch64-tdep.c @@ -4369,6 +4369,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 b6180e64b6d..a4098af7103 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 ebe8aea733c..e8ae9b2db9f 100644 --- a/gdb/features/aarch64-capability.xml +++ b/gdb/features/aarch64-capability.xml @@ -7,45 +7,45 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gdb/gdbarch-components.py b/gdb/gdbarch-components.py index 811f3636e7e..18b5dbc3baa 100644 --- a/gdb/gdbarch-components.py +++ b/gdb/gdbarch-components.py @@ -344,27 +344,6 @@ 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 -""", - type="int", - name="code_capability_bit", - predefault="gdbarch->int_bit", - invalid=False, -) - -Value( - comment=""" -data_capability is the size of a target capability as represented in gdb -""", - type="int", - name="data_capability_bit", - predefault="0", - postdefault="gdbarch_ptr_bit (gdbarch)", - invalid=True -) - -Value( - comment=""" capability_bit is the size of a target capability as represented in gdb """, type="int", @@ -374,19 +353,6 @@ capability_bit is the size of a target capability as represented in gdb invalid=True ) -Value( - comment=""" -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. -""", - type="int", - name="dwarf2_capability_size", - predefault="0", - postdefault="gdbarch_ptr_bit (gdbarch) / TARGET_CHAR_BIT", - invalid=True, -) - Value( comment=""" One if `char' acts like `signed char', zero if `unsigned char'. diff --git a/gdb/gdbarch-gen.h b/gdb/gdbarch-gen.h index 47b77558f09..770601cf53f 100644 --- a/gdb/gdbarch-gen.h +++ b/gdb/gdbarch-gen.h @@ -162,28 +162,11 @@ extern void set_gdbarch_dwarf2_addr_size (struct gdbarch *gdbarch, int dwarf2_ad 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.c b/gdb/gdbarch.c index f8baccf05ce..e9d6ccd2e1f 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -70,10 +70,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; @@ -300,7 +297,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; @@ -431,13 +427,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. */ @@ -724,18 +715,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) fprintf_filtered (file, "gdbarch_dump: dwarf2_addr_size = %s\n", plongest (gdbarch->dwarf2_addr_size)); - fprintf_filtered (file, - "gdbarch_dump: code_capability_bit = %s\n", - plongest (gdbarch->code_capability_bit)); - fprintf_filtered (file, - "gdbarch_dump: data_capability_bit = %s\n", - plongest (gdbarch->data_capability_bit)); fprintf_filtered (file, "gdbarch_dump: capability_bit = %s\n", plongest (gdbarch->capability_bit)); - fprintf_filtered (file, - "gdbarch_dump: dwarf2_capability_size = %s\n", - plongest (gdbarch->dwarf2_capability_size)); fprintf_filtered (file, "gdbarch_dump: char_signed = %s\n", plongest (gdbarch->char_signed)); @@ -1868,41 +1850,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) { @@ -1921,24 +1868,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/gdbtypes.c b/gdb/gdbtypes.c index d42d9eda502..73dda92062b 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -6239,15 +6239,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 f7e0793684a..93d19d14ff1 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -2360,10 +2360,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 49bf62e7dd1..5b886f49872 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 1d15a3df2ca..fd3605250f0 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 }, -- 2.47.2