X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fc-lang.c;h=53137e89b85168d4f65ba775f65230471ed3c60a;hb=9e790a80160676e7fd3fb8be6cf3c1c77d9ded81;hp=846970af7b923600c25eeead6f98b6cf6e6f55e5;hpb=b858499daf0a824a518bac8bc13495ad856ab10d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 846970af7b..53137e89b8 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -1,6 +1,6 @@ /* C language support routines for GDB, the GNU debugger. - Copyright (C) 1992-2019 Free Software Foundation, Inc. + Copyright (C) 1992-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -37,6 +37,8 @@ #include "gdbcore.h" #include "gdbarch.h" +class compile_instance; + /* Given a C string type, STR_TYPE, return the corresponding target character set name. */ @@ -84,9 +86,9 @@ classify_type (struct type *elttype, struct gdbarch *gdbarch, that would do the wrong thing. */ while (elttype) { - const char *name = TYPE_NAME (elttype); + const char *name = elttype->name (); - if (TYPE_CODE (elttype) == TYPE_CODE_CHAR || !name) + if (elttype->code () == TYPE_CODE_CHAR || !name) { result = C_CHAR; goto done; @@ -110,7 +112,7 @@ classify_type (struct type *elttype, struct gdbarch *gdbarch, goto done; } - if (TYPE_CODE (elttype) != TYPE_CODE_TYPEDEF) + if (elttype->code () != TYPE_CODE_TYPEDEF) break; /* Call for side effects. */ @@ -250,23 +252,23 @@ c_get_string (struct value *value, gdb::unique_xmalloc_ptr *buffer, if (element_type == NULL) goto error; - if (TYPE_CODE (type) == TYPE_CODE_ARRAY) + if (type->code () == TYPE_CODE_ARRAY) { /* If we know the size of the array, we can use it as a limit on the number of characters to be fetched. */ - if (TYPE_NFIELDS (type) == 1 - && TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_RANGE) + if (type->num_fields () == 1 + && type->field (0).type ()->code () == TYPE_CODE_RANGE) { LONGEST low_bound, high_bound; - get_discrete_bounds (TYPE_FIELD_TYPE (type, 0), + get_discrete_bounds (type->field (0).type (), &low_bound, &high_bound); fetchlimit = high_bound - low_bound + 1; } else fetchlimit = UINT_MAX; } - else if (TYPE_CODE (type) == TYPE_CODE_PTR) + else if (type->code () == TYPE_CODE_PTR) fetchlimit = UINT_MAX; else /* We work only with arrays and pointers. */ @@ -292,7 +294,7 @@ c_get_string (struct value *value, gdb::unique_xmalloc_ptr *buffer, avoids running off the end of the value's contents. */ if ((VALUE_LVAL (value) == not_lval || VALUE_LVAL (value) == lval_internalvar - || TYPE_CODE (type) == TYPE_CODE_ARRAY) + || type->code () == TYPE_CODE_ARRAY) && fetchlimit != UINT_MAX && (*length < 0 || *length <= fetchlimit)) { @@ -303,14 +305,14 @@ c_get_string (struct value *value, gdb::unique_xmalloc_ptr *buffer, if (*length >= 0) i = *length; else - /* Otherwise, look for a null character. */ - for (i = 0; i < fetchlimit; i++) + /* Otherwise, look for a null character. */ + for (i = 0; i < fetchlimit; i++) if (extract_unsigned_integer (contents + i * width, width, byte_order) == 0) - break; + break; /* I is now either a user-defined length, the number of non-null - characters, or FETCHLIMIT. */ + characters, or FETCHLIMIT. */ *length = i * width; buffer->reset ((gdb_byte *) xmalloc (*length)); memcpy (buffer->get (), contents, *length); @@ -322,7 +324,7 @@ c_get_string (struct value *value, gdb::unique_xmalloc_ptr *buffer, c_style_arrays is false, so we handle that specially here. */ CORE_ADDR addr; - if (TYPE_CODE (type) == TYPE_CODE_ARRAY) + if (type->code () == TYPE_CODE_ARRAY) { if (VALUE_LVAL (value) != lval_memory) error (_("Attempt to take address of value " @@ -629,13 +631,13 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, /* If the caller expects an array of some integral type, satisfy them. If something odder is expected, rely on the caller to cast. */ - if (expect_type && TYPE_CODE (expect_type) == TYPE_CODE_ARRAY) + if (expect_type && expect_type->code () == TYPE_CODE_ARRAY) { struct type *element_type = check_typedef (TYPE_TARGET_TYPE (expect_type)); - if (TYPE_CODE (element_type) == TYPE_CODE_INT - || TYPE_CODE (element_type) == TYPE_CODE_CHAR) + if (element_type->code () == TYPE_CODE_INT + || element_type->code () == TYPE_CODE_CHAR) { type = element_type; satisfy_expected = 1; @@ -696,7 +698,7 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, LONGEST low_bound, high_bound; int element_size = TYPE_LENGTH (type); - if (get_discrete_bounds (TYPE_INDEX_TYPE (expect_type), + if (get_discrete_bounds (expect_type->index_type (), &low_bound, &high_bound) < 0) { low_bound = 0; @@ -742,13 +744,13 @@ bool c_is_string_type_p (struct type *type) { type = check_typedef (type); - while (TYPE_CODE (type) == TYPE_CODE_REF) + while (type->code () == TYPE_CODE_REF) { type = TYPE_TARGET_TYPE (type); type = check_typedef (type); } - switch (TYPE_CODE (type)) + switch (type->code ()) { case TYPE_CODE_ARRAY: { @@ -885,7 +887,9 @@ static const char *c_extensions[] = ".c", NULL }; -extern const struct language_defn c_language_defn = +/* Constant data that describes the C language. */ + +extern const struct language_data c_language_data = { "c", /* Language name */ "C", @@ -901,18 +905,12 @@ extern const struct language_defn c_language_defn = c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ - c_print_type, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ - c_val_print, /* Print a value using appropriate syntax */ + c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ - NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ - basic_lookup_transparent_type,/* lookup_transparent_type */ - NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -920,20 +918,50 @@ extern const struct language_defn c_language_defn = 0, /* String lower bound */ default_word_break_characters, default_collect_symbol_completion_matches, - c_language_arch_info, - default_print_array_index, - default_pass_by_reference, c_watch_location_expression, NULL, /* la_get_symbol_name_matcher */ - iterate_over_symbols, - default_search_name_hash, &c_varobj_ops, - c_get_compile_context, c_compute_program, c_is_string_type_p, "{...}" /* la_struct_too_deep_ellipsis */ }; +/* Class representing the C language. */ + +class c_language : public language_defn +{ +public: + c_language () + : language_defn (language_c, c_language_data) + { /* Nothing. */ } + + /* See language.h. */ + void language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) const override + { + c_language_arch_info (gdbarch, lai); + } + + /* See language.h. */ + compile_instance *get_compile_instance () const override + { + return c_get_compile_context (); + } + + /* See language.h. */ + + void print_type (struct type *type, const char *varstring, + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) const override + { + c_print_type (type, varstring, stream, show, level, flags); + } +}; + +/* Single instance of the C language class. */ + +static c_language c_language_defn; + enum cplus_primitive_types { cplus_primitive_type_int, cplus_primitive_type_long, @@ -962,75 +990,14 @@ enum cplus_primitive_types { nr_cplus_primitive_types }; -static void -cplus_language_arch_info (struct gdbarch *gdbarch, - struct language_arch_info *lai) -{ - const struct builtin_type *builtin = builtin_type (gdbarch); - - lai->string_char_type = builtin->builtin_char; - lai->primitive_type_vector - = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_cplus_primitive_types + 1, - struct type *); - lai->primitive_type_vector [cplus_primitive_type_int] - = builtin->builtin_int; - lai->primitive_type_vector [cplus_primitive_type_long] - = builtin->builtin_long; - lai->primitive_type_vector [cplus_primitive_type_short] - = builtin->builtin_short; - lai->primitive_type_vector [cplus_primitive_type_char] - = builtin->builtin_char; - lai->primitive_type_vector [cplus_primitive_type_float] - = builtin->builtin_float; - lai->primitive_type_vector [cplus_primitive_type_double] - = builtin->builtin_double; - lai->primitive_type_vector [cplus_primitive_type_void] - = builtin->builtin_void; - lai->primitive_type_vector [cplus_primitive_type_long_long] - = builtin->builtin_long_long; - lai->primitive_type_vector [cplus_primitive_type_signed_char] - = builtin->builtin_signed_char; - lai->primitive_type_vector [cplus_primitive_type_unsigned_char] - = builtin->builtin_unsigned_char; - lai->primitive_type_vector [cplus_primitive_type_unsigned_short] - = builtin->builtin_unsigned_short; - lai->primitive_type_vector [cplus_primitive_type_unsigned_int] - = builtin->builtin_unsigned_int; - lai->primitive_type_vector [cplus_primitive_type_unsigned_long] - = builtin->builtin_unsigned_long; - lai->primitive_type_vector [cplus_primitive_type_unsigned_long_long] - = builtin->builtin_unsigned_long_long; - lai->primitive_type_vector [cplus_primitive_type_long_double] - = builtin->builtin_long_double; - lai->primitive_type_vector [cplus_primitive_type_complex] - = builtin->builtin_complex; - lai->primitive_type_vector [cplus_primitive_type_double_complex] - = builtin->builtin_double_complex; - lai->primitive_type_vector [cplus_primitive_type_bool] - = builtin->builtin_bool; - lai->primitive_type_vector [cplus_primitive_type_decfloat] - = builtin->builtin_decfloat; - lai->primitive_type_vector [cplus_primitive_type_decdouble] - = builtin->builtin_decdouble; - lai->primitive_type_vector [cplus_primitive_type_declong] - = builtin->builtin_declong; - lai->primitive_type_vector [cplus_primitive_type_char16_t] - = builtin->builtin_char16; - lai->primitive_type_vector [cplus_primitive_type_char32_t] - = builtin->builtin_char32; - lai->primitive_type_vector [cplus_primitive_type_wchar_t] - = builtin->builtin_wchar; - - lai->bool_type_symbol = "bool"; - lai->bool_type_default = builtin->builtin_bool; -} - static const char *cplus_extensions[] = { ".C", ".cc", ".cp", ".cpp", ".cxx", ".c++", NULL }; -extern const struct language_defn cplus_language_defn = +/* Constant data that describes the C++ language. */ + +extern const struct language_data cplus_language_data = { "c++", /* Language name */ "C++", @@ -1046,18 +1013,12 @@ extern const struct language_defn cplus_language_defn = c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ - c_print_type, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ - c_val_print, /* Print a value using appropriate syntax */ + c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ - cplus_skip_trampoline, /* Language specific skip_trampoline */ "this", /* name_of_this */ false, /* la_store_sym_names_in_linkage_form_p */ cp_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ - cp_lookup_transparent_type, /* lookup_transparent_type */ - gdb_demangle, /* Language specific symbol demangler */ - gdb_sniff_from_mangled_name, cp_class_name_from_physname, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -1065,26 +1026,157 @@ extern const struct language_defn cplus_language_defn = 0, /* String lower bound */ default_word_break_characters, default_collect_symbol_completion_matches, - cplus_language_arch_info, - default_print_array_index, - cp_pass_by_reference, c_watch_location_expression, cp_get_symbol_name_matcher, - iterate_over_symbols, - cp_search_name_hash, &cplus_varobj_ops, - cplus_get_compile_context, cplus_compute_program, c_is_string_type_p, "{...}" /* la_struct_too_deep_ellipsis */ }; +/* A class for the C++ language. */ + +class cplus_language : public language_defn +{ +public: + cplus_language () + : language_defn (language_cplus, cplus_language_data) + { /* Nothing. */ } + + /* See language.h. */ + + struct language_pass_by_ref_info pass_by_reference_info + (struct type *type) const override + { + return cp_pass_by_reference (type); + } + + /* See language.h. */ + void language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) const override + { + const struct builtin_type *builtin = builtin_type (gdbarch); + + lai->string_char_type = builtin->builtin_char; + lai->primitive_type_vector + = GDBARCH_OBSTACK_CALLOC (gdbarch, nr_cplus_primitive_types + 1, + struct type *); + lai->primitive_type_vector [cplus_primitive_type_int] + = builtin->builtin_int; + lai->primitive_type_vector [cplus_primitive_type_long] + = builtin->builtin_long; + lai->primitive_type_vector [cplus_primitive_type_short] + = builtin->builtin_short; + lai->primitive_type_vector [cplus_primitive_type_char] + = builtin->builtin_char; + lai->primitive_type_vector [cplus_primitive_type_float] + = builtin->builtin_float; + lai->primitive_type_vector [cplus_primitive_type_double] + = builtin->builtin_double; + lai->primitive_type_vector [cplus_primitive_type_void] + = builtin->builtin_void; + lai->primitive_type_vector [cplus_primitive_type_long_long] + = builtin->builtin_long_long; + lai->primitive_type_vector [cplus_primitive_type_signed_char] + = builtin->builtin_signed_char; + lai->primitive_type_vector [cplus_primitive_type_unsigned_char] + = builtin->builtin_unsigned_char; + lai->primitive_type_vector [cplus_primitive_type_unsigned_short] + = builtin->builtin_unsigned_short; + lai->primitive_type_vector [cplus_primitive_type_unsigned_int] + = builtin->builtin_unsigned_int; + lai->primitive_type_vector [cplus_primitive_type_unsigned_long] + = builtin->builtin_unsigned_long; + lai->primitive_type_vector [cplus_primitive_type_unsigned_long_long] + = builtin->builtin_unsigned_long_long; + lai->primitive_type_vector [cplus_primitive_type_long_double] + = builtin->builtin_long_double; + lai->primitive_type_vector [cplus_primitive_type_complex] + = builtin->builtin_complex; + lai->primitive_type_vector [cplus_primitive_type_double_complex] + = builtin->builtin_double_complex; + lai->primitive_type_vector [cplus_primitive_type_bool] + = builtin->builtin_bool; + lai->primitive_type_vector [cplus_primitive_type_decfloat] + = builtin->builtin_decfloat; + lai->primitive_type_vector [cplus_primitive_type_decdouble] + = builtin->builtin_decdouble; + lai->primitive_type_vector [cplus_primitive_type_declong] + = builtin->builtin_declong; + lai->primitive_type_vector [cplus_primitive_type_char16_t] + = builtin->builtin_char16; + lai->primitive_type_vector [cplus_primitive_type_char32_t] + = builtin->builtin_char32; + lai->primitive_type_vector [cplus_primitive_type_wchar_t] + = builtin->builtin_wchar; + + lai->bool_type_symbol = "bool"; + lai->bool_type_default = builtin->builtin_bool; + } + + /* See language.h. */ + struct type *lookup_transparent_type (const char *name) const override + { + return cp_lookup_transparent_type (name); + } + + /* See language.h. */ + compile_instance *get_compile_instance () const override + { + return cplus_get_compile_context (); + } + + /* See language.h. */ + unsigned int search_name_hash (const char *name) const override + { + return cp_search_name_hash (name); + } + + /* See language.h. */ + bool sniff_from_mangled_name (const char *mangled, + char **demangled) const override + { + *demangled = gdb_demangle (mangled, DMGL_PARAMS | DMGL_ANSI); + return *demangled != NULL; + } + + /* See language.h. */ + + char *demangle (const char *mangled, int options) const override + { + return gdb_demangle (mangled, options); + } + + /* See language.h. */ + + void print_type (struct type *type, const char *varstring, + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) const override + { + c_print_type (type, varstring, stream, show, level, flags); + } + + /* See language.h. */ + + CORE_ADDR skip_trampoline (struct frame_info *fi, + CORE_ADDR pc) const override + { + return cplus_skip_trampoline (fi, pc); + } +}; + +/* The single instance of the C++ language class. */ + +static cplus_language cplus_language_defn; + static const char *asm_extensions[] = { ".s", ".sx", ".S", NULL }; -extern const struct language_defn asm_language_defn = +/* Constant data that describes the ASM language. */ + +extern const struct language_data asm_language_data = { "asm", /* Language name */ "assembly", @@ -1100,18 +1192,12 @@ extern const struct language_defn asm_language_defn = c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ - c_print_type, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ - c_val_print, /* Print a value using appropriate syntax */ + c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ - NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ - basic_lookup_transparent_type,/* lookup_transparent_type */ - NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -1119,26 +1205,51 @@ extern const struct language_defn asm_language_defn = 0, /* String lower bound */ default_word_break_characters, default_collect_symbol_completion_matches, - c_language_arch_info, /* FIXME: la_language_arch_info. */ - default_print_array_index, - default_pass_by_reference, c_watch_location_expression, NULL, /* la_get_symbol_name_matcher */ - iterate_over_symbols, - default_search_name_hash, &default_varobj_ops, NULL, - NULL, c_is_string_type_p, "{...}" /* la_struct_too_deep_ellipsis */ }; +/* A class for the ASM language. */ + +class asm_language : public language_defn +{ +public: + asm_language () + : language_defn (language_asm, asm_language_data) + { /* Nothing. */ } + + /* See language.h. + + FIXME: Should this have its own arch info method? */ + void language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) const override + { + c_language_arch_info (gdbarch, lai); + } + + /* See language.h. */ + + void print_type (struct type *type, const char *varstring, + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) const override + { + c_print_type (type, varstring, stream, show, level, flags); + } +}; + +/* The single instance of the ASM language class. */ +static asm_language asm_language_defn; + /* The following language_defn does not represent a real language. It just provides a minimal support a-la-C that should allow users to do some simple operations when debugging applications that use a language currently not supported by GDB. */ -extern const struct language_defn minimal_language_defn = +extern const struct language_data minimal_language_data = { "minimal", /* Language name */ "Minimal", @@ -1154,18 +1265,12 @@ extern const struct language_defn minimal_language_defn = c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ c_emit_char, /* Print a single char */ - c_print_type, /* Print a type using appropriate syntax */ c_print_typedef, /* Print a typedef using appropriate syntax */ - c_val_print, /* Print a value using appropriate syntax */ + c_value_print_inner, /* la_value_print_inner */ c_value_print, /* Print a top-level value */ - default_read_var_value, /* la_read_var_value */ - NULL, /* Language specific skip_trampoline */ NULL, /* name_of_this */ true, /* la_store_sym_names_in_linkage_form_p */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ - basic_lookup_transparent_type,/* lookup_transparent_type */ - NULL, /* Language specific symbol demangler */ - NULL, NULL, /* Language specific class_name_from_physname */ c_op_print_tab, /* expression operators for printing */ @@ -1173,16 +1278,39 @@ extern const struct language_defn minimal_language_defn = 0, /* String lower bound */ default_word_break_characters, default_collect_symbol_completion_matches, - c_language_arch_info, - default_print_array_index, - default_pass_by_reference, c_watch_location_expression, NULL, /* la_get_symbol_name_matcher */ - iterate_over_symbols, - default_search_name_hash, &default_varobj_ops, NULL, - NULL, c_is_string_type_p, "{...}" /* la_struct_too_deep_ellipsis */ }; + +/* A class for the minimal language. */ + +class minimal_language : public language_defn +{ +public: + minimal_language () + : language_defn (language_minimal, minimal_language_data) + { /* Nothing. */ } + + /* See language.h. */ + void language_arch_info (struct gdbarch *gdbarch, + struct language_arch_info *lai) const override + { + c_language_arch_info (gdbarch, lai); + } + + /* See language.h. */ + + void print_type (struct type *type, const char *varstring, + struct ui_file *stream, int show, int level, + const struct type_print_options *flags) const override + { + c_print_type (type, varstring, stream, show, level, flags); + } +}; + +/* The single instance of the minimal language class. */ +static minimal_language minimal_language_defn;