From 67bd3fd5e4d1bf9f1730eaf6ed9fa9df89904fc2 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Sat, 4 Jul 2020 09:06:08 +0100 Subject: [PATCH] gdb: Convert language_data::c_style_arrays to a method Convert language_data::c_style_arrays member variable to a virtual method language_defn::c_style_arrays_p. There should be no user visible changes after this commit. gdb/ChangeLog: * ada-lang.c (ada_language_data): Remove c_style_arrays initializer. (ada_language::c_style_arrays_p): New member fuction. * c-lang.c (c_language_data): Remove c_style_arrays initializer. (cplus_language_data): Likewise. (asm_language_data): Likewise. (minimal_language_data): Likewise. * d-lang.c (d_language_data): Likewise. * eval.c (ptrmath_type_p): Update call to c_style_arrays_p. * f-lang.c (f_language_data): Remove c_style_arrays initializer. (f_language::c_style_arrays_p): New member function. * go-lang.c (go_language_data): Remove c_style_arrays initializer. * infcall.c (value_arg_coerce): Update call to c_style_arrays_p. * language.c (unknown_language_data): Remove c_style_arrays initializer. (auto_language_data): Likewise. * language.h (language_data): Remove c_style_arrays field. (language_defn::c_style_arrays_p): New member function. * m2-lang.c (m2_language_data): Remove c_style_arrays initializer. (m2_language::c_style_arrays_p): New member function. * objc-lang.c (objc_language_data): Remove c_style_arrays initializer. * opencl-lang.c (opencl_language_data): Likewise. * p-lang.c (pascal_language_data): Likewise. * rust-lang.c (rust_language_data): Likewise. * valarith.c (value_subscript): Update call to c_style_arrays_p, and update local variable to a bool. * valops.c (value_cast): Update call to c_style_arrays_p. (value_array): Likewise. * value.c (coerce_array): Likewise. --- gdb/ChangeLog | 34 ++++++++++++++++++++++++++++++++++ gdb/ada-lang.c | 6 +++++- gdb/c-lang.c | 4 ---- gdb/d-lang.c | 1 - gdb/eval.c | 2 +- gdb/f-lang.c | 6 +++++- gdb/go-lang.c | 1 - gdb/infcall.c | 2 +- gdb/language.c | 2 -- gdb/language.h | 13 ++++++++----- gdb/m2-lang.c | 6 +++++- gdb/objc-lang.c | 1 - gdb/opencl-lang.c | 1 - gdb/p-lang.c | 1 - gdb/rust-lang.c | 1 - gdb/valarith.c | 6 +++--- gdb/valops.c | 4 ++-- gdb/value.c | 2 +- 18 files changed, 65 insertions(+), 28 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index dfdd18f6101..4f4336f4814 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,37 @@ +2020-09-16 Andrew Burgess + + * ada-lang.c (ada_language_data): Remove c_style_arrays + initializer. + (ada_language::c_style_arrays_p): New member fuction. + * c-lang.c (c_language_data): Remove c_style_arrays + initializer. + (cplus_language_data): Likewise. + (asm_language_data): Likewise. + (minimal_language_data): Likewise. + * d-lang.c (d_language_data): Likewise. + * eval.c (ptrmath_type_p): Update call to c_style_arrays_p. + * f-lang.c (f_language_data): Remove c_style_arrays initializer. + (f_language::c_style_arrays_p): New member function. + * go-lang.c (go_language_data): Remove c_style_arrays initializer. + * infcall.c (value_arg_coerce): Update call to c_style_arrays_p. + * language.c (unknown_language_data): Remove c_style_arrays + initializer. + (auto_language_data): Likewise. + * language.h (language_data): Remove c_style_arrays field. + (language_defn::c_style_arrays_p): New member function. + * m2-lang.c (m2_language_data): Remove c_style_arrays initializer. + (m2_language::c_style_arrays_p): New member function. + * objc-lang.c (objc_language_data): Remove c_style_arrays + initializer. + * opencl-lang.c (opencl_language_data): Likewise. + * p-lang.c (pascal_language_data): Likewise. + * rust-lang.c (rust_language_data): Likewise. + * valarith.c (value_subscript): Update call to c_style_arrays_p, + and update local variable to a bool. + * valops.c (value_cast): Update call to c_style_arrays_p. + (value_array): Likewise. + * value.c (coerce_array): Likewise. + 2020-09-16 Andrew Burgess * ada-lang.c (ada_language_data): Remove la_language initializer. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index b1127d84217..859dcec84ba 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -13716,7 +13716,6 @@ extern const struct language_data ada_language_data = &ada_exp_descriptor, true, /* la_store_sym_names_in_linkage_form_p */ ada_op_print_tab, /* expression operators for printing */ - 0, /* c-style arrays */ 1, /* String lower bound */ &ada_varobj_ops, }; @@ -14200,6 +14199,11 @@ public: const char *struct_too_deep_ellipsis () const override { return "(...)"; } + /* See language.h. */ + + bool c_style_arrays_p () const override + { return false; } + protected: /* See language.h. */ diff --git a/gdb/c-lang.c b/gdb/c-lang.c index d8d66c24103..41eac2d43a3 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -882,7 +882,6 @@ extern const struct language_data c_language_data = &exp_descriptor_c, true, /* la_store_sym_names_in_linkage_form_p */ c_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &c_varobj_ops, }; @@ -990,7 +989,6 @@ extern const struct language_data cplus_language_data = &exp_descriptor_c, false, /* la_store_sym_names_in_linkage_form_p */ c_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &cplus_varobj_ops, }; @@ -1201,7 +1199,6 @@ extern const struct language_data asm_language_data = &exp_descriptor_c, true, /* la_store_sym_names_in_linkage_form_p */ c_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; @@ -1270,7 +1267,6 @@ extern const struct language_data minimal_language_data = &exp_descriptor_c, true, /* la_store_sym_names_in_linkage_form_p */ c_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; diff --git a/gdb/d-lang.c b/gdb/d-lang.c index 18f785fd58d..67912089989 100644 --- a/gdb/d-lang.c +++ b/gdb/d-lang.c @@ -135,7 +135,6 @@ extern const struct language_data d_language_data = &exp_descriptor_c, false, /* la_store_sym_names_in_linkage_form_p */ d_op_print_tab, /* Expression operators for printing. */ - 1, /* C-style arrays. */ 0, /* String lower bound. */ &default_varobj_ops, }; diff --git a/gdb/eval.c b/gdb/eval.c index 1177f7444e6..1af57fcad83 100644 --- a/gdb/eval.c +++ b/gdb/eval.c @@ -622,7 +622,7 @@ ptrmath_type_p (const struct language_defn *lang, struct type *type) return 1; case TYPE_CODE_ARRAY: - return type->is_vector () ? 0 : lang->c_style_arrays; + return type->is_vector () ? 0 : lang->c_style_arrays_p (); default: return 0; diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 55d0a7a00de..649716ba106 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -493,7 +493,6 @@ extern const struct language_data f_language_data = &exp_descriptor_f, false, /* la_store_sym_names_in_linkage_form_p */ f_op_print_tab, /* expression operators for printing */ - 0, /* arrays are first-class (not c-style) */ 1, /* String lower bound */ &default_varobj_ops, }; @@ -720,6 +719,11 @@ public: const char *struct_too_deep_ellipsis () const override { return "(...)"; } + /* See language.h. */ + + bool c_style_arrays_p () const override + { return false; } + protected: /* See language.h. */ diff --git a/gdb/go-lang.c b/gdb/go-lang.c index ed7fcd1f425..c2724e3d7cc 100644 --- a/gdb/go-lang.c +++ b/gdb/go-lang.c @@ -515,7 +515,6 @@ extern const struct language_data go_language_data = &exp_descriptor_c, false, /* la_store_sym_names_in_linkage_form_p */ go_op_print_tab, /* Expression operators for printing. */ - 1, /* C-style arrays. */ 0, /* String lower bound. */ &default_varobj_ops, }; diff --git a/gdb/infcall.c b/gdb/infcall.c index f87b7456ec0..8df7523f157 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -219,7 +219,7 @@ value_arg_coerce (struct gdbarch *gdbarch, struct value *arg, /* Arrays are coerced to pointers to their first element, unless they are vectors, in which case we want to leave them alone, because they are passed by value. */ - if (current_language->c_style_arrays) + if (current_language->c_style_arrays_p ()) if (!type->is_vector ()) type = lookup_pointer_type (TYPE_TARGET_TYPE (type)); break; diff --git a/gdb/language.c b/gdb/language.c index 55e8104132b..9a496ae8548 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -782,7 +782,6 @@ extern const struct language_data unknown_language_data = &exp_descriptor_standard, true, /* store_sym_names_in_linkage_form_p */ unk_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; @@ -917,7 +916,6 @@ extern const struct language_data auto_language_data = &exp_descriptor_standard, false, /* store_sym_names_in_linkage_form_p */ unk_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; diff --git a/gdb/language.h b/gdb/language.h index 731b641d261..83014e47789 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -232,11 +232,6 @@ struct language_data const struct op_print *la_op_print_tab; - /* Zero if the language has first-class arrays. True if there are no - array values, and array objects decay to pointers, as in C. */ - - char c_style_arrays; - /* Index to use for extracting the first element of a string. */ char string_lower_bound; @@ -565,6 +560,14 @@ struct language_defn : language_data virtual const char *name_of_this () const { return nullptr; } + /* Return false if the language has first-class arrays. Return true if + there are no array values, and array objects decay to pointers, as in + C. The default is true as currently most supported languages behave + in this manor. */ + + virtual bool c_style_arrays_p () const + { return true; } + protected: /* This is the overridable part of the GET_SYMBOL_NAME_MATCHER method. diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index 94340b0d9b2..9dd557777c0 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -206,7 +206,6 @@ extern const struct language_data m2_language_data = &exp_descriptor_modula2, false, /* la_store_sym_names_in_linkage_form_p */ m2_op_print_tab, /* expression operators for printing */ - 0, /* arrays are first-class (not c-style) */ 0, /* String lower bound */ &default_varobj_ops, }; @@ -436,6 +435,11 @@ public: return false; } + + /* See language.h. */ + + bool c_style_arrays_p () const override + { return false; } }; /* Single instance of the M2 language. */ diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index f605c2194b0..66b7b50144b 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -330,7 +330,6 @@ extern const struct language_data objc_language_data = &exp_descriptor_standard, false, /* la_store_sym_names_in_linkage_form_p */ objc_op_print_tab, /* Expression operators for printing */ - 1, /* C-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c index 2c8dba013fe..1ac3aa42a8e 100644 --- a/gdb/opencl-lang.c +++ b/gdb/opencl-lang.c @@ -1013,7 +1013,6 @@ extern const struct language_data opencl_language_data = &exp_descriptor_opencl, false, /* la_store_sym_names_in_linkage_form_p */ c_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; diff --git a/gdb/p-lang.c b/gdb/p-lang.c index aef908c7dc6..66ba51ac8eb 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -259,7 +259,6 @@ extern const struct language_data pascal_language_data = &exp_descriptor_standard, false, /* la_store_sym_names_in_linkage_form_p */ pascal_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; diff --git a/gdb/rust-lang.c b/gdb/rust-lang.c index 2ceb573da2b..de971e6255a 100644 --- a/gdb/rust-lang.c +++ b/gdb/rust-lang.c @@ -1908,7 +1908,6 @@ extern const struct language_data rust_language_data = &exp_descriptor_rust, false, /* la_store_sym_names_in_linkage_form_p */ c_op_print_tab, /* expression operators for printing */ - 1, /* c-style arrays */ 0, /* String lower bound */ &default_varobj_ops, }; diff --git a/gdb/valarith.c b/gdb/valarith.c index c418fc6f55a..7127a5d6763 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -140,7 +140,7 @@ value_ptrdiff (struct value *arg1, struct value *arg2) struct value * value_subscript (struct value *array, LONGEST index) { - int c_style = current_language->c_style_arrays; + bool c_style = current_language->c_style_arrays_p (); struct type *tarray; array = coerce_ref (array); @@ -156,7 +156,7 @@ value_subscript (struct value *array, LONGEST index) if (VALUE_LVAL (array) != lval_memory) return value_subscripted_rvalue (array, index, lowerbound); - if (c_style == 0) + if (!c_style) { if (index >= lowerbound && index <= upperbound) return value_subscripted_rvalue (array, index, lowerbound); @@ -165,7 +165,7 @@ value_subscript (struct value *array, LONGEST index) if (upperbound > -1) warning (_("array or string index out of range")); /* fall doing C stuff */ - c_style = 1; + c_style = true; } index -= lowerbound; diff --git a/gdb/valops.c b/gdb/valops.c index 6dc2f54b14d..7b604da0fd5 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -414,7 +414,7 @@ value_cast (struct type *type, struct value *arg2) } } - if (current_language->c_style_arrays + if (current_language->c_style_arrays_p () && type2->code () == TYPE_CODE_ARRAY && !type2->is_vector ()) arg2 = value_coerce_array (arg2); @@ -1622,7 +1622,7 @@ value_array (int lowbound, int highbound, struct value **elemvec) arraytype = lookup_array_range_type (value_enclosing_type (elemvec[0]), lowbound, highbound); - if (!current_language->c_style_arrays) + if (!current_language->c_style_arrays_p ()) { val = allocate_value (arraytype); for (idx = 0; idx < nelem; idx++) diff --git a/gdb/value.c b/gdb/value.c index 8f4030e90b2..c72b2fd6cea 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -3687,7 +3687,7 @@ coerce_array (struct value *arg) switch (type->code ()) { case TYPE_CODE_ARRAY: - if (!type->is_vector () && current_language->c_style_arrays) + if (!type->is_vector () && current_language->c_style_arrays_p ()) arg = value_coerce_array (arg); break; case TYPE_CODE_FUNC: -- 2.30.2