From 085e57a4449252928d3d70bf1fe63e508b594636 Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Wed, 10 Aug 2022 12:25:10 -0700 Subject: [PATCH] Default gdbarch_capability_bit to 0, not ptr_bit. This allows testing for 0 to distinguish architectures without capabilities. Make use of this to only add in builtin types for architectures which support capabilities. --- gdb/c-lang.c | 14 +++++++--- gdb/gdbarch-components.py | 4 +-- gdb/gdbarch.c | 6 ++--- gdb/gdbtypes.c | 55 +++++++++++++++++++++------------------ 4 files changed, 42 insertions(+), 37 deletions(-) diff --git a/gdb/c-lang.c b/gdb/c-lang.c index d72ab4b89c8..538c5ff7d73 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -759,8 +759,11 @@ c_language_arch_info (struct gdbarch *gdbarch, add (builtin->builtin_decfloat); add (builtin->builtin_decdouble); add (builtin->builtin_declong); - add (builtin->builtin_intcap_t); - add (builtin->builtin_uintcap_t); + if (gdbarch_capability_bit (gdbarch) != 0) + { + add (builtin->builtin_intcap_t); + add (builtin->builtin_uintcap_t); + } lai->set_string_char_type (builtin->builtin_char); lai->set_bool_type (builtin->builtin_int); @@ -912,8 +915,11 @@ public: add (builtin->builtin_char16); add (builtin->builtin_char32); add (builtin->builtin_wchar); - add (builtin->builtin_intcap_t); - add (builtin->builtin_uintcap_t); + if (gdbarch_capability_bit (gdbarch) != 0) + { + add (builtin->builtin_intcap_t); + add (builtin->builtin_uintcap_t); + } lai->set_string_char_type (builtin->builtin_char); lai->set_bool_type (builtin->builtin_bool, "bool"); diff --git a/gdb/gdbarch-components.py b/gdb/gdbarch-components.py index 2ce2162734f..a08063f2f4e 100644 --- a/gdb/gdbarch-components.py +++ b/gdb/gdbarch-components.py @@ -348,9 +348,7 @@ capability_bit is the size of a target capability as represented in gdb """, type="int", name="capability_bit", - predefault="0", - postdefault="gdbarch_ptr_bit (gdbarch)", - invalid=True + invalid=False, ) Value( diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index cdd7f76e657..c6766d9bee4 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -431,8 +431,7 @@ 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; - if (gdbarch->capability_bit == 0) - gdbarch->capability_bit = gdbarch_ptr_bit (gdbarch); + /* Skip verify of capability_bit, invalid_p == 0 */ if (gdbarch->char_signed == -1) gdbarch->char_signed = 1; /* Skip verify of read_pc, has predicate. */ @@ -1866,8 +1865,7 @@ int gdbarch_capability_bit (struct gdbarch *gdbarch) { gdb_assert (gdbarch != NULL); - /* Check variable changed from pre-default. */ - gdb_assert (gdbarch->capability_bit != 0); + /* Skip verify of capability_bit, invalid_p == 0 */ if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_capability_bit called\n"); return gdbarch->capability_bit; diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index ee0a1b6c77c..d18d7f0a0a4 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -6255,32 +6255,35 @@ gdbtypes_post_init (struct gdbarch *gdbarch) builtin_type->builtin_func_func = lookup_function_type (builtin_type->builtin_func_ptr); - /* Capability types. */ - builtin_type->builtin_intcap_t - = arch_capability_type (gdbarch, gdbarch_capability_bit (gdbarch), 0, - "__intcap_t"); - builtin_type->builtin_intcap_t->set_tagged (true); - builtin_type->builtin_uintcap_t - = arch_capability_type (gdbarch, gdbarch_capability_bit (gdbarch), 1, - "__uintcap_t"); - builtin_type->builtin_uintcap_t->set_tagged (true); - - /* Capability pointer types. */ - 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_data_capability->set_tagged (true); - - 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); - builtin_type->builtin_code_capability->set_tagged (true); + if (gdbarch_capability_bit (gdbarch) != 0) + { + /* Capability types. */ + builtin_type->builtin_intcap_t + = arch_capability_type (gdbarch, gdbarch_capability_bit (gdbarch), 0, + "__intcap_t"); + builtin_type->builtin_intcap_t->set_tagged (true); + builtin_type->builtin_uintcap_t + = arch_capability_type (gdbarch, gdbarch_capability_bit (gdbarch), 1, + "__uintcap_t"); + builtin_type->builtin_uintcap_t->set_tagged (true); + + /* Capability pointer types. */ + 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_data_capability->set_tagged (true); + + 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); + builtin_type->builtin_code_capability->set_tagged (true); + } /* This type represents a GDB internal function. */ builtin_type->internal_fn -- 2.47.2