X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fp-lang.c;h=8ff2682bf26de85c86aab94893e1f938c77146fd;hb=11cf4ffb5e256d268a8f4cea0fc88a0a46bf824c;hp=e743a6f812c584ff953b9a386e7d2044509063bd;hpb=6c7a06a3facfa3f71606655871d0617d3cad80d9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/p-lang.c b/gdb/p-lang.c index e743a6f812..8ff2682bf2 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -1,7 +1,6 @@ /* Pascal language support routines for GDB, the GNU debugger. - Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009 - Free Software Foundation, Inc. + Copyright (C) 2000-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -21,22 +20,22 @@ /* This file is derived from c-lang.c */ #include "defs.h" -#include "gdb_string.h" #include "symtab.h" #include "gdbtypes.h" #include "expression.h" #include "parser-defs.h" #include "language.h" +#include "varobj.h" #include "p-lang.h" #include "valprint.h" #include "value.h" #include - + extern void _initialize_pascal_language (void); /* All GPC versions until now (2007-09-27) also define a symbol called - '_p_initialize'. Check for the presence of this symbol first. */ + '_p_initialize'. Check for the presence of this symbol first. */ static const char GPC_P_INITIALIZE[] = "_p_initialize"; /* The name of the symbol that GPC uses as the name of the main @@ -54,28 +53,28 @@ static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program"; so that it finds the even if the program was compiled without debugging information. According to information supplied by Waldeck Hebisch, - this should work for all versions posterior to June 2000. */ + this should work for all versions posterior to June 2000. */ const char * pascal_main_name (void) { - struct minimal_symbol *msym; + struct bound_minimal_symbol msym; msym = lookup_minimal_symbol (GPC_P_INITIALIZE, NULL, NULL); /* If '_p_initialize' was not found, the main program is likely not written in Pascal. */ - if (msym == NULL) + if (msym.minsym == NULL) return NULL; msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_1, NULL, NULL); - if (msym != NULL) + if (msym.minsym != NULL) { return GPC_MAIN_PROGRAM_NAME_1; } msym = lookup_minimal_symbol (GPC_MAIN_PROGRAM_NAME_2, NULL, NULL); - if (msym != NULL) + if (msym.minsym != NULL) { return GPC_MAIN_PROGRAM_NAME_2; } @@ -99,15 +98,17 @@ int is_pascal_string_type (struct type *type,int *length_pos, int *length_size, int *string_pos, struct type **char_type, - char **arrayname) + const char **arrayname) { - if (TYPE_CODE (type) == TYPE_CODE_STRUCT) + if (type != NULL && TYPE_CODE (type) == TYPE_CODE_STRUCT) { /* Old Borland type pascal strings from Free Pascal Compiler. */ /* Two fields: length and st. */ - if (TYPE_NFIELDS (type) == 2 - && strcmp (TYPE_FIELDS (type)[0].name, "length") == 0 - && strcmp (TYPE_FIELDS (type)[1].name, "st") == 0) + if (TYPE_NFIELDS (type) == 2 + && TYPE_FIELD_NAME (type, 0) + && strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0 + && TYPE_FIELD_NAME (type, 1) + && strcmp (TYPE_FIELD_NAME (type, 1), "st") == 0) { if (length_pos) *length_pos = TYPE_FIELD_BITPOS (type, 0) / TARGET_CHAR_BIT; @@ -118,14 +119,16 @@ is_pascal_string_type (struct type *type,int *length_pos, if (char_type) *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 1)); if (arrayname) - *arrayname = TYPE_FIELDS (type)[1].name; + *arrayname = TYPE_FIELD_NAME (type, 1); return 2; }; /* GNU pascal strings. */ /* Three fields: Capacity, length and schema$ or _p_schema. */ if (TYPE_NFIELDS (type) == 3 - && strcmp (TYPE_FIELDS (type)[0].name, "Capacity") == 0 - && strcmp (TYPE_FIELDS (type)[1].name, "length") == 0) + && TYPE_FIELD_NAME (type, 0) + && strcmp (TYPE_FIELD_NAME (type, 0), "Capacity") == 0 + && TYPE_FIELD_NAME (type, 1) + && strcmp (TYPE_FIELD_NAME (type, 1), "length") == 0) { if (length_pos) *length_pos = TYPE_FIELD_BITPOS (type, 1) / TARGET_CHAR_BIT; @@ -133,15 +136,16 @@ is_pascal_string_type (struct type *type,int *length_pos, *length_size = TYPE_LENGTH (TYPE_FIELD_TYPE (type, 1)); if (string_pos) *string_pos = TYPE_FIELD_BITPOS (type, 2) / TARGET_CHAR_BIT; - /* FIXME: how can I detect wide chars in GPC ?? */ + /* FIXME: how can I detect wide chars in GPC ?? */ if (char_type) { *char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 2)); + if (TYPE_CODE (*char_type) == TYPE_CODE_ARRAY) *char_type = TYPE_TARGET_TYPE (*char_type); } if (arrayname) - *arrayname = TYPE_FIELDS (type)[2].name; + *arrayname = TYPE_FIELD_NAME (type, 2); return 3; }; } @@ -152,15 +156,12 @@ static void pascal_one_char (int, struct ui_file *, int *); /* Print the character C on STREAM as part of the contents of a literal string. - In_quotes is reset to 0 if a char is written with #4 notation */ + In_quotes is reset to 0 if a char is written with #4 notation. */ static void pascal_one_char (int c, struct ui_file *stream, int *in_quotes) { - - c &= 0xFF; /* Avoid sign bit follies */ - - if ((c == '\'') || (PRINT_LITERAL_FORM (c))) + if (c == '\'' || ((unsigned int) c <= 0xff && (PRINT_LITERAL_FORM (c)))) { if (!(*in_quotes)) fputs_filtered ("'", stream); @@ -186,12 +187,13 @@ static void pascal_emit_char (int c, struct type *type, /* Print the character C on STREAM as part of the contents of a literal string whose delimiter is QUOTER. Note that that format for printing - characters and strings is language specific. */ + characters and strings is language specific. */ static void pascal_emit_char (int c, struct type *type, struct ui_file *stream, int quoter) { int in_quotes = 0; + pascal_one_char (c, stream, &in_quotes); if (in_quotes) fputs_filtered ("'", stream); @@ -201,6 +203,7 @@ void pascal_printchar (int c, struct type *type, struct ui_file *stream) { int in_quotes = 0; + pascal_one_char (c, stream, &in_quotes); if (in_quotes) fputs_filtered ("'", stream); @@ -214,20 +217,26 @@ pascal_printchar (int c, struct type *type, struct ui_file *stream) void pascal_printstr (struct ui_file *stream, struct type *type, const gdb_byte *string, unsigned int length, - int force_ellipses, + const char *encoding, int force_ellipses, const struct value_print_options *options) { + enum bfd_endian byte_order = gdbarch_byte_order (get_type_arch (type)); unsigned int i; unsigned int things_printed = 0; int in_quotes = 0; int need_comma = 0; - int width = TYPE_LENGTH (type); + int width; + + /* Preserve TYPE's original type, just set its LENGTH. */ + check_typedef (type); + width = TYPE_LENGTH (type); /* If the string was not truncated due to `set print elements', and the last byte of it is a null, we don't print that, in traditional C style. */ if ((!force_ellipses) && length > 0 - && extract_unsigned_integer (string + (length - 1) * width, width) == 0) + && extract_unsigned_integer (string + (length - 1) * width, width, + byte_order) == 0) length--; if (length == 0) @@ -253,13 +262,14 @@ pascal_printstr (struct ui_file *stream, struct type *type, need_comma = 0; } - current_char = extract_unsigned_integer (string + i * width, width); + current_char = extract_unsigned_integer (string + i * width, width, + byte_order); rep1 = i + 1; reps = 1; - while (rep1 < length - && extract_unsigned_integer (string + rep1 * width, width) - == current_char) + while (rep1 < length + && extract_unsigned_integer (string + rep1 * width, width, + byte_order) == current_char) { ++rep1; ++reps; @@ -269,10 +279,7 @@ pascal_printstr (struct ui_file *stream, struct type *type, { if (in_quotes) { - if (options->inspect_it) - fputs_filtered ("\\', ", stream); - else - fputs_filtered ("', ", stream); + fputs_filtered ("', ", stream); in_quotes = 0; } pascal_printchar (current_char, type, stream); @@ -285,10 +292,7 @@ pascal_printstr (struct ui_file *stream, struct type *type, { if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char))) { - if (options->inspect_it) - fputs_filtered ("\\'", stream); - else - fputs_filtered ("'", stream); + fputs_filtered ("'", stream); in_quotes = 1; } pascal_one_char (current_char, stream, &in_quotes); @@ -298,12 +302,7 @@ pascal_printstr (struct ui_file *stream, struct type *type, /* Terminate the quotes if necessary. */ if (in_quotes) - { - if (options->inspect_it) - fputs_filtered ("\\'", stream); - else - fputs_filtered ("'", stream); - } + fputs_filtered ("'", stream); if (force_ellipses || i < length) fputs_filtered ("...", stream); @@ -340,7 +339,7 @@ const struct op_print pascal_op_print_tab[] = {"^", UNOP_IND, PREC_SUFFIX, 1}, {"@", UNOP_ADDR, PREC_PREFIX, 0}, {"sizeof", UNOP_SIZEOF, PREC_PREFIX, 0}, - {NULL, 0, 0, 0} + {NULL, OP_NULL, PREC_PREFIX, 0} }; enum pascal_primitive_types { @@ -369,6 +368,7 @@ pascal_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_pascal_primitive_types + 1, @@ -415,15 +415,15 @@ pascal_language_arch_info (struct gdbarch *gdbarch, const struct language_defn pascal_language_defn = { "pascal", /* Language name */ + "Pascal", language_pascal, range_check_on, - type_check_on, case_sensitive_on, array_row_major, macro_expansion_no, &exp_descriptor_standard, pascal_parse, - pascal_error, + pascal_yyerror, null_post_parser, pascal_printchar, /* Print a character constant */ pascal_printstr, /* Function to print string constant */ @@ -432,6 +432,7 @@ const struct language_defn pascal_language_defn = pascal_print_typedef, /* Print a typedef using appropriate syntax */ pascal_val_print, /* Print a value using appropriate syntax */ pascal_value_print, /* Print a top-level value */ + default_read_var_value, /* la_read_var_value */ NULL, /* Language specific skip_trampoline */ "this", /* name_of_this */ basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */ @@ -447,6 +448,11 @@ const struct language_defn pascal_language_defn = default_print_array_index, default_pass_by_reference, default_get_string, + NULL, /* la_get_symbol_name_cmp */ + iterate_over_symbols, + &default_varobj_ops, + NULL, + NULL, LANG_MAGIC };