X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fc-lang.c;h=329986ce88c737121d7d4d95cf7bc768f977dd42;hb=b6fb30eda72b7fc3a6214ed2787f80971f66810d;hp=846970af7b923600c25eeead6f98b6cf6e6f55e5;hpb=b858499daf0a824a518bac8bc13495ad856ab10d;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/c-lang.c b/gdb/c-lang.c index 846970af7b..329986ce88 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; @@ -725,30 +727,19 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, return evaluate_subexp_standard (expect_type, exp, pos, noside); } -/* la_watch_location_expression for C. */ - -gdb::unique_xmalloc_ptr -c_watch_location_expression (struct type *type, CORE_ADDR addr) -{ - type = check_typedef (TYPE_TARGET_TYPE (check_typedef (type))); - std::string name = type_to_string (type); - return gdb::unique_xmalloc_ptr - (xstrprintf ("* (%s *) %s", name.c_str (), core_addr_to_string (addr))); -} - /* See c-lang.h. */ 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: { @@ -880,60 +871,90 @@ const struct exp_descriptor exp_descriptor_c = evaluate_subexp_c }; -static const char *c_extensions[] = -{ - ".c", NULL -}; +/* Class representing the C language. */ -extern const struct language_defn c_language_defn = +class c_language : public language_defn { - "c", /* Language name */ - "C", - language_c, - range_check_off, - case_sensitive_on, - array_row_major, - macro_expansion_c, - c_extensions, - &exp_descriptor_c, - c_parse, - null_post_parser, - 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, /* 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 */ - 1, /* c-style arrays */ - 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 */ +public: + c_language () + : language_defn (language_c) + { /* Nothing. */ } + + /* See language.h. */ + + const char *name () const override + { return "c"; } + + /* See language.h. */ + + const char *natural_name () const override + { return "C"; } + + /* See language.h. */ + + const std::vector &filename_extensions () const override + { + static const std::vector extensions = { ".c" }; + return extensions; + } + + /* 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. */ + std::string compute_program (compile_instance *inst, + const char *input, + struct gdbarch *gdbarch, + const struct block *expr_block, + CORE_ADDR expr_pc) const override + { + return c_compute_program (inst, input, gdbarch, expr_block, expr_pc); + } + + /* 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. */ + + bool store_sym_names_in_linkage_form_p () const override + { return true; } + + /* See language.h. */ + + enum macro_expansion macro_expansion () const override + { return macro_expansion_c; } + + /* See language.h. */ + + const struct exp_descriptor *expression_ops () const override + { return &exp_descriptor_c; } + + /* See language.h. */ + + const struct op_print *opcode_print_table () const override + { return c_op_print_tab; } }; +/* 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,227 +983,349 @@ enum cplus_primitive_types { nr_cplus_primitive_types }; -static void -cplus_language_arch_info (struct gdbarch *gdbarch, - struct language_arch_info *lai) +/* A class for the C++ language. */ + +class cplus_language : public language_defn { - const struct builtin_type *builtin = builtin_type (gdbarch); +public: + cplus_language () + : language_defn (language_cplus) + { /* Nothing. */ } - 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. */ -static const char *cplus_extensions[] = -{ - ".C", ".cc", ".cp", ".cpp", ".cxx", ".c++", NULL -}; + const char *name () const override + { return "c++"; } -extern const struct language_defn cplus_language_defn = -{ - "c++", /* Language name */ - "C++", - language_cplus, - range_check_off, - case_sensitive_on, - array_row_major, - macro_expansion_c, - cplus_extensions, - &exp_descriptor_c, - c_parse, - null_post_parser, - 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, /* 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 */ - 1, /* c-style arrays */ - 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 */ -}; + /* See language.h. */ -static const char *asm_extensions[] = -{ - ".s", ".sx", ".S", NULL + const char *natural_name () const override + { return "C++"; } + + /* See language.h. */ + + const std::vector &filename_extensions () const override + { + static const std::vector extensions + = { ".C", ".cc", ".cp", ".cpp", ".cxx", ".c++" }; + return extensions; + } + + /* 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. */ + std::string compute_program (compile_instance *inst, + const char *input, + struct gdbarch *gdbarch, + const struct block *expr_block, + CORE_ADDR expr_pc) const override + { + return cplus_compute_program (inst, input, gdbarch, expr_block, expr_pc); + } + + /* 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_symbol (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); + } + + /* See language.h. */ + + char *class_name_from_physname (const char *physname) const override + { + return cp_class_name_from_physname (physname); + } + + /* See language.h. */ + + struct block_symbol lookup_symbol_nonlocal + (const char *name, const struct block *block, + const domain_enum domain) const override + { + return cp_lookup_symbol_nonlocal (this, name, block, domain); + } + + /* See language.h. */ + + const char *name_of_this () const override + { return "this"; } + + /* See language.h. */ + + enum macro_expansion macro_expansion () const override + { return macro_expansion_c; } + + /* See language.h. */ + + const struct lang_varobj_ops *varobj_ops () const override + { return &cplus_varobj_ops; } + + /* See language.h. */ + + const struct exp_descriptor *expression_ops () const override + { return &exp_descriptor_c; } + + /* See language.h. */ + + const struct op_print *opcode_print_table () const override + { return c_op_print_tab; } + +protected: + + /* See language.h. */ + + symbol_name_matcher_ftype *get_symbol_name_matcher_inner + (const lookup_name_info &lookup_name) const override + { + return cp_get_symbol_name_matcher (lookup_name); + } }; -extern const struct language_defn asm_language_defn = +/* The single instance of the C++ language class. */ + +static cplus_language cplus_language_defn; + +/* A class for the ASM language. */ + +class asm_language : public language_defn { - "asm", /* Language name */ - "assembly", - language_asm, - range_check_off, - case_sensitive_on, - array_row_major, - macro_expansion_c, - asm_extensions, - &exp_descriptor_c, - c_parse, - null_post_parser, - 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, /* 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 */ - 1, /* c-style arrays */ - 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 */ +public: + asm_language () + : language_defn (language_asm) + { /* Nothing. */ } + + /* See language.h. */ + + const char *name () const override + { return "asm"; } + + /* See language.h. */ + + const char *natural_name () const override + { return "Assembly"; } + + /* See language.h. */ + + const std::vector &filename_extensions () const override + { + static const std::vector extensions + = { ".s", ".sx", ".S" }; + return extensions; + } + + /* 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); + } + + /* See language.h. */ + + bool store_sym_names_in_linkage_form_p () const override + { return true; } + + /* See language.h. */ + + enum macro_expansion macro_expansion () const override + { return macro_expansion_c; } + + /* See language.h. */ + + const struct exp_descriptor *expression_ops () const override + { return &exp_descriptor_c; } + + /* See language.h. */ + + const struct op_print *opcode_print_table () const override + { return c_op_print_tab; } }; -/* 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 +/* The single instance of the ASM language class. */ +static asm_language asm_language_defn; + +/* A class for the minimal language. This 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 = +class minimal_language : public language_defn { - "minimal", /* Language name */ - "Minimal", - language_minimal, - range_check_off, - case_sensitive_on, - array_row_major, - macro_expansion_c, - NULL, - &exp_descriptor_c, - c_parse, - null_post_parser, - 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, /* 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 */ - 1, /* c-style arrays */ - 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 */ +public: + minimal_language () + : language_defn (language_minimal) + { /* Nothing. */ } + + /* See language.h. */ + + const char *name () const override + { return "minimal"; } + + /* See language.h. */ + + const char *natural_name () const override + { return "Minimal"; } + + /* 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); + } + + /* See language.h. */ + + bool store_sym_names_in_linkage_form_p () const override + { return true; } + + /* See language.h. */ + + enum macro_expansion macro_expansion () const override + { return macro_expansion_c; } + + /* See language.h. */ + + const struct exp_descriptor *expression_ops () const override + { return &exp_descriptor_c; } + + /* See language.h. */ + + const struct op_print *opcode_print_table () const override + { return c_op_print_tab; } }; + +/* The single instance of the minimal language class. */ +static minimal_language minimal_language_defn;