X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fc-lang.c;h=6bae4c18ec65dc19ecd1d35563495cf603bc2aef;hb=e98ee8c458f3a8405eb93e71b00f801b4bbe3635;hp=e647ff6f47a6e655af0a9b0aae3ec12f347b79c8;hpb=dccbb60975cdbcd6a906a79d0c4308b040fdac1b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/c-lang.c b/gdb/c-lang.c index e647ff6f47..6bae4c18ec 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-2014 Free Software Foundation, Inc. + Copyright (C) 1992-2018 Free Software Foundation, Inc. This file is part of GDB. @@ -25,26 +25,22 @@ #include "language.h" #include "varobj.h" #include "c-lang.h" +#include "c-support.h" #include "valprint.h" #include "macroscope.h" #include "charset.h" -#include #include "demangle.h" #include "cp-abi.h" #include "cp-support.h" #include "gdb_obstack.h" #include -#include "exceptions.h" #include "gdbcore.h" -extern void _initialize_c_language (void); - /* Given a C string type, STR_TYPE, return the corresponding target character set name. */ static const char * -charset_for_string_type (enum c_string_type str_type, - struct gdbarch *gdbarch) +charset_for_string_type (c_string_type str_type, struct gdbarch *gdbarch) { switch (str_type & ~C_CHAR) { @@ -74,11 +70,11 @@ charset_for_string_type (enum c_string_type str_type, characters of this type in target BYTE_ORDER to the host character set. */ -static enum c_string_type +static c_string_type classify_type (struct type *elttype, struct gdbarch *gdbarch, const char **encoding) { - enum c_string_type result; + c_string_type result; /* We loop because ELTTYPE may be a typedef, and we want to successively peel each typedef until we reach a type we @@ -126,7 +122,7 @@ classify_type (struct type *elttype, struct gdbarch *gdbarch, /* Perhaps check_typedef did not update the target type. In this case, force the lookup again and hope it works out. It never will for C, but it might for C++. */ - CHECK_TYPEDEF (elttype); + elttype = check_typedef (elttype); } } @@ -157,7 +153,7 @@ c_emit_char (int c, struct type *type, void c_printchar (int c, struct type *type, struct ui_file *stream) { - enum c_string_type str_type; + c_string_type str_type; str_type = classify_type (type, get_type_arch (type), NULL); switch (str_type) @@ -193,7 +189,7 @@ c_printstr (struct ui_file *stream, struct type *type, const char *user_encoding, int force_ellipses, const struct value_print_options *options) { - enum c_string_type str_type; + c_string_type str_type; const char *type_encoding; const char *encoding; @@ -238,7 +234,7 @@ c_printstr (struct ui_file *stream, struct type *type, target charset. */ void -c_get_string (struct value *value, gdb_byte **buffer, +c_get_string (struct value *value, gdb::unique_xmalloc_ptr *buffer, int *length, struct type **char_type, const char **charset) { @@ -304,8 +300,8 @@ c_get_string (struct value *value, gdb_byte **buffer, /* I is now either a user-defined length, the number of non-null characters, or FETCHLIMIT. */ *length = i * width; - *buffer = xmalloc (*length); - memcpy (*buffer, contents, *length); + buffer->reset ((gdb_byte *) xmalloc (*length)); + memcpy (buffer->get (), contents, *length); err = 0; } else @@ -329,11 +325,8 @@ c_get_string (struct value *value, gdb_byte **buffer, err = read_string (addr, *length, width, fetchlimit, byte_order, buffer, length); - if (err) - { - xfree (*buffer); - memory_error (err, addr); - } + if (err != 0) + memory_error (TARGET_XFER_E_IO, addr); } /* If the LENGTH is specified at -1, we want to return the string @@ -343,7 +336,7 @@ c_get_string (struct value *value, gdb_byte **buffer, if (req_length == -1) /* If the last character is null, subtract it from LENGTH. */ if (*length > 0 - && extract_unsigned_integer (*buffer + *length - width, + && extract_unsigned_integer (buffer->get () + *length - width, width, byte_order) == 0) *length -= width; @@ -359,14 +352,11 @@ c_get_string (struct value *value, gdb_byte **buffer, error: { - char *type_str; - - type_str = type_to_string (type); - if (type_str) + std::string type_str = type_to_string (type); + if (!type_str.empty ()) { - make_cleanup (xfree, type_str); error (_("Trying to read string with inappropriate type `%s'."), - type_str); + type_str.c_str ()); } else error (_("Trying to read string with inappropriate type.")); @@ -390,7 +380,7 @@ convert_ucn (char *p, char *limit, const char *dest_charset, gdb_byte data[4]; int i; - for (i = 0; i < length && p < limit && isxdigit (*p); ++i, ++p) + for (i = 0; i < length && p < limit && ISXDIGIT (*p); ++i, ++p) result = (result << 4) + host_hex_value (*p); for (i = 3; i >= 0; --i) @@ -414,7 +404,7 @@ emit_numeric_character (struct type *type, unsigned long value, { gdb_byte *buffer; - buffer = alloca (TYPE_LENGTH (type)); + buffer = (gdb_byte *) alloca (TYPE_LENGTH (type)); pack_long (buffer, type, value); obstack_grow (output, buffer, TYPE_LENGTH (type)); } @@ -432,7 +422,7 @@ convert_octal (struct type *type, char *p, unsigned long value = 0; for (i = 0; - i < 3 && p < limit && isdigit (*p) && *p != '8' && *p != '9'; + i < 3 && p < limit && ISDIGIT (*p) && *p != '8' && *p != '9'; ++i) { value = 8 * value + host_hex_value (*p); @@ -455,7 +445,7 @@ convert_hex (struct type *type, char *p, { unsigned long value = 0; - while (p < limit && isxdigit (*p)) + while (p < limit && ISXDIGIT (*p)) { value = 16 * value + host_hex_value (*p); ++p; @@ -496,7 +486,7 @@ convert_escape (struct type *type, const char *dest_charset, case 'x': ADVANCE; - if (!isxdigit (*p)) + if (!ISXDIGIT (*p)) error (_("\\x used with no following hex digits.")); p = convert_hex (type, p, limit, output); break; @@ -518,7 +508,7 @@ convert_escape (struct type *type, const char *dest_charset, int length = *p == 'u' ? 4 : 8; ADVANCE; - if (!isxdigit (*p)) + if (!ISXDIGIT (*p)) error (_("\\u used with no following hex digits")); p = convert_ucn (p, limit, dest_charset, output, length); } @@ -576,23 +566,20 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, { int oplen, limit; struct type *type; - struct obstack output; - struct cleanup *cleanup; struct value *result; - enum c_string_type dest_type; + c_string_type dest_type; const char *dest_charset; int satisfy_expected = 0; - obstack_init (&output); - cleanup = make_cleanup_obstack_free (&output); + auto_obstack output; ++*pos; oplen = longest_to_int (exp->elts[*pos].longconst); ++*pos; limit = *pos + BYTES_TO_EXP_ELEM (oplen + 1); - dest_type - = (enum c_string_type) longest_to_int (exp->elts[*pos].longconst); + dest_type = ((enum c_string_type_values) + longest_to_int (exp->elts[*pos].longconst)); switch (dest_type & ~C_CHAR) { case C_STRING: @@ -662,7 +649,6 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, result = allocate_value (type); else result = value_cstring ("", 0, type); - do_cleanups (cleanup); return result; } @@ -704,11 +690,10 @@ evaluate_subexp_c (struct type *expect_type, struct expression *exp, obstack_object_size (&output)); } else - result = value_cstring (obstack_base (&output), + result = value_cstring ((const char *) obstack_base (&output), obstack_object_size (&output), type); } - do_cleanups (cleanup); return result; } break; @@ -718,7 +703,17 @@ 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))); +} /* Table mapping opcodes into strings for printing operators @@ -754,9 +749,10 @@ const struct op_print c_op_print_tab[] = {"*", UNOP_IND, PREC_PREFIX, 0}, {"&", UNOP_ADDR, PREC_PREFIX, 0}, {"sizeof ", UNOP_SIZEOF, PREC_PREFIX, 0}, + {"alignof ", UNOP_ALIGNOF, PREC_PREFIX, 0}, {"++", UNOP_PREINCREMENT, PREC_PREFIX, 0}, {"--", UNOP_PREDECREMENT, PREC_PREFIX, 0}, - {NULL, 0, 0, 0} + {NULL, OP_NULL, PREC_PREFIX, 0} }; enum c_primitive_types { @@ -827,7 +823,12 @@ const struct exp_descriptor exp_descriptor_c = evaluate_subexp_c }; -const struct language_defn c_language_defn = +static const char *c_extensions[] = +{ + ".c", NULL +}; + +extern const struct language_defn c_language_defn = { "c", /* Language name */ "C", @@ -836,9 +837,9 @@ const struct language_defn c_language_defn = case_sensitive_on, array_row_major, macro_expansion_c, + c_extensions, &exp_descriptor_c, c_parse, - c_error, null_post_parser, c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ @@ -850,23 +851,29 @@ const struct language_defn c_language_defn = 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_make_symbol_completion_list, + default_collect_symbol_completion_matches, c_language_arch_info, default_print_array_index, default_pass_by_reference, c_get_string, - NULL, /* la_get_symbol_name_cmp */ + 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, LANG_MAGIC }; @@ -892,6 +899,9 @@ enum cplus_primitive_types { cplus_primitive_type_decfloat, cplus_primitive_type_decdouble, cplus_primitive_type_declong, + cplus_primitive_type_char16_t, + cplus_primitive_type_char32_t, + cplus_primitive_type_wchar_t, nr_cplus_primitive_types }; @@ -947,12 +957,23 @@ cplus_language_arch_info (struct gdbarch *gdbarch, = 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; } -const struct language_defn cplus_language_defn = +static const char *cplus_extensions[] = +{ + ".C", ".cc", ".cp", ".cpp", ".cxx", ".c++", NULL +}; + +extern const struct language_defn cplus_language_defn = { "c++", /* Language name */ "C++", @@ -961,9 +982,9 @@ const struct language_defn cplus_language_defn = case_sensitive_on, array_row_major, macro_expansion_c, + cplus_extensions, &exp_descriptor_c, c_parse, - c_error, null_post_parser, c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ @@ -975,27 +996,38 @@ const struct language_defn cplus_language_defn = 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_make_symbol_completion_list, + default_collect_symbol_completion_matches, cplus_language_arch_info, default_print_array_index, cp_pass_by_reference, c_get_string, - NULL, /* la_get_symbol_name_cmp */ + 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, LANG_MAGIC }; -const struct language_defn asm_language_defn = +static const char *asm_extensions[] = +{ + ".s", ".sx", ".S", NULL +}; + +extern const struct language_defn asm_language_defn = { "asm", /* Language name */ "assembly", @@ -1004,9 +1036,9 @@ const struct language_defn asm_language_defn = case_sensitive_on, array_row_major, macro_expansion_c, + asm_extensions, &exp_descriptor_c, c_parse, - c_error, null_post_parser, c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ @@ -1018,23 +1050,29 @@ const struct language_defn asm_language_defn = 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_make_symbol_completion_list, + default_collect_symbol_completion_matches, c_language_arch_info, /* FIXME: la_language_arch_info. */ default_print_array_index, default_pass_by_reference, c_get_string, - NULL, /* la_get_symbol_name_cmp */ + c_watch_location_expression, + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, &default_varobj_ops, + NULL, + NULL, LANG_MAGIC }; @@ -1043,7 +1081,7 @@ const struct language_defn asm_language_defn = to do some simple operations when debugging applications that use a language currently not supported by GDB. */ -const struct language_defn minimal_language_defn = +extern const struct language_defn minimal_language_defn = { "minimal", /* Language name */ "Minimal", @@ -1052,9 +1090,9 @@ const struct language_defn minimal_language_defn = case_sensitive_on, array_row_major, macro_expansion_c, + NULL, &exp_descriptor_c, c_parse, - c_error, null_post_parser, c_printchar, /* Print a character constant */ c_printstr, /* Function to print string constant */ @@ -1066,31 +1104,28 @@ const struct language_defn minimal_language_defn = 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_make_symbol_completion_list, + default_collect_symbol_completion_matches, c_language_arch_info, default_print_array_index, default_pass_by_reference, c_get_string, - NULL, /* la_get_symbol_name_cmp */ + c_watch_location_expression, + NULL, /* la_get_symbol_name_matcher */ iterate_over_symbols, + default_search_name_hash, &default_varobj_ops, + NULL, + NULL, LANG_MAGIC }; - -void -_initialize_c_language (void) -{ - add_language (&c_language_defn); - add_language (&cplus_language_defn); - add_language (&asm_language_defn); - add_language (&minimal_language_defn); -}