projects
/
deliverable
/
binutils-gdb.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
gdb: Represent all languages as sub-classes of language_defn
[deliverable/binutils-gdb.git]
/
gdb
/
p-lang.c
diff --git
a/gdb/p-lang.c
b/gdb/p-lang.c
index cd56630efd92f3e19c2c86583d5f6bcb00685af0..2f9598fed94244dec9723794deb1b6c70acd4b78 100644
(file)
--- a/
gdb/p-lang.c
+++ b/
gdb/p-lang.c
@@
-1,7
+1,6
@@
/* Pascal language support routines for GDB, the GNU debugger.
/* Pascal language support routines for GDB, the GNU debugger.
- Copyright (C) 2000, 2002-2005, 2007-2012 Free Software Foundation,
- Inc.
+ Copyright (C) 2000-2020 Free Software Foundation, Inc.
This file is part of GDB.
This file is part of GDB.
@@
-21,19
+20,19
@@
/* This file is derived from c-lang.c */
#include "defs.h"
/* 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 "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 <ctype.h>
#include "p-lang.h"
#include "valprint.h"
#include "value.h"
#include <ctype.h>
-
-extern void _initialize_pascal_language (void);
-
+#include "c-lang.h"
+#include "gdbarch.h"
+#include "cli/cli-style.h"
/* All GPC versions until now (2007-09-27) also define a symbol called
'_p_initialize'. Check for the presence of this symbol first. */
/* All GPC versions until now (2007-09-27) also define a symbol called
'_p_initialize'. Check for the presence of this symbol first. */
@@
-59,23
+58,23
@@
static const char GPC_MAIN_PROGRAM_NAME_2[] = "pascal_main_program";
const char *
pascal_main_name (void)
{
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. */
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);
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);
{
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;
}
{
return GPC_MAIN_PROGRAM_NAME_2;
}
@@
-99,13
+98,13
@@
int
is_pascal_string_type (struct type *type,int *length_pos,
int *length_size, int *string_pos,
struct type **char_type,
is_pascal_string_type (struct type *type,int *length_pos,
int *length_size, int *string_pos,
struct type **char_type,
- char **arrayname)
+ c
onst c
har **arrayname)
{
{
- if (type != NULL &&
TYPE_CODE (type
) == TYPE_CODE_STRUCT)
+ if (type != NULL &&
type->code (
) == TYPE_CODE_STRUCT)
{
/* Old Borland type pascal strings from Free Pascal Compiler. */
/* Two fields: length and st. */
{
/* Old Borland type pascal strings from Free Pascal Compiler. */
/* Two fields: length and st. */
- if (
TYPE_NFIELDS (type
) == 2
+ if (
type->num_fields (
) == 2
&& TYPE_FIELD_NAME (type, 0)
&& strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0
&& TYPE_FIELD_NAME (type, 1)
&& TYPE_FIELD_NAME (type, 0)
&& strcmp (TYPE_FIELD_NAME (type, 0), "length") == 0
&& TYPE_FIELD_NAME (type, 1)
@@
-125,7
+124,7
@@
is_pascal_string_type (struct type *type,int *length_pos,
};
/* GNU pascal strings. */
/* Three fields: Capacity, length and schema$ or _p_schema. */
};
/* GNU pascal strings. */
/* Three fields: Capacity, length and schema$ or _p_schema. */
- if (
TYPE_NFIELDS (type
) == 3
+ if (
type->num_fields (
) == 3
&& TYPE_FIELD_NAME (type, 0)
&& strcmp (TYPE_FIELD_NAME (type, 0), "Capacity") == 0
&& TYPE_FIELD_NAME (type, 1)
&& TYPE_FIELD_NAME (type, 0)
&& strcmp (TYPE_FIELD_NAME (type, 0), "Capacity") == 0
&& TYPE_FIELD_NAME (type, 1)
@@
-142,7
+141,7
@@
is_pascal_string_type (struct type *type,int *length_pos,
{
*char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 2));
{
*char_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type, 2));
- if (
TYPE_CODE (*char_type
) == TYPE_CODE_ARRAY)
+ if (
(*char_type)->code (
) == TYPE_CODE_ARRAY)
*char_type = TYPE_TARGET_TYPE (*char_type);
}
if (arrayname)
*char_type = TYPE_TARGET_TYPE (*char_type);
}
if (arrayname)
@@
-153,6
+152,16
@@
is_pascal_string_type (struct type *type,int *length_pos,
return 0;
}
return 0;
}
+/* This is a wrapper around IS_PASCAL_STRING_TYPE that returns true if TYPE
+ is a string. */
+
+static bool
+pascal_is_string_type_p (struct type *type)
+{
+ return is_pascal_string_type (type, nullptr, nullptr, nullptr,
+ nullptr, nullptr) > 0;
+}
+
static void pascal_one_char (int, struct ui_file *, int *);
/* Print the character C on STREAM as part of the contents of a literal
static void pascal_one_char (int, struct ui_file *, int *);
/* Print the character C on STREAM as part of the contents of a literal
@@
-221,7
+230,7
@@
pascal_printstr (struct ui_file *stream, struct type *type,
const char *encoding, int force_ellipses,
const struct value_print_options *options)
{
const char *encoding, int force_ellipses,
const struct value_print_options *options)
{
- enum bfd_endian byte_order =
gdbarch_byte_order (get_type_arch (type)
);
+ enum bfd_endian byte_order =
type_byte_order (type
);
unsigned int i;
unsigned int things_printed = 0;
int in_quotes = 0;
unsigned int i;
unsigned int things_printed = 0;
int in_quotes = 0;
@@
-280,14
+289,13
@@
pascal_printstr (struct ui_file *stream, struct type *type,
{
if (in_quotes)
{
{
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);
in_quotes = 0;
}
pascal_printchar (current_char, type, stream);
- fprintf_filtered (stream, " <repeats %u times>", reps);
+ fprintf_filtered (stream, " %p[<repeats %u times>%p]",
+ metadata_style.style ().ptr (),
+ reps, nullptr);
i = rep1 - 1;
things_printed += options->repeat_count_threshold;
need_comma = 1;
i = rep1 - 1;
things_printed += options->repeat_count_threshold;
need_comma = 1;
@@
-296,10
+304,7
@@
pascal_printstr (struct ui_file *stream, struct type *type,
{
if ((!in_quotes) && (PRINT_LITERAL_FORM (current_char)))
{
{
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);
in_quotes = 1;
}
pascal_one_char (current_char, stream, &in_quotes);
@@
-309,12
+314,7
@@
pascal_printstr (struct ui_file *stream, struct type *type,
/* Terminate the quotes if necessary. */
if (in_quotes)
/* 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);
if (force_ellipses || i < length)
fputs_filtered ("...", stream);
@@
-351,7
+351,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},
{"^", 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}
};
\f
enum pascal_primitive_types {
};
\f
enum pascal_primitive_types {
@@
-424,48
+424,71
@@
pascal_language_arch_info (struct gdbarch *gdbarch,
lai->bool_type_default = builtin->builtin_bool;
}
lai->bool_type_default = builtin->builtin_bool;
}
-const struct language_defn pascal_language_defn =
+static const char *p_extensions[] =
+{
+ ".pas", ".p", ".pp", NULL
+};
+
+/* Constant data representing the Pascal language. */
+
+extern const struct language_data pascal_language_data =
{
"pascal", /* Language name */
{
"pascal", /* Language name */
+ "Pascal",
language_pascal,
range_check_on,
language_pascal,
range_check_on,
- type_check_on,
case_sensitive_on,
array_row_major,
macro_expansion_no,
case_sensitive_on,
array_row_major,
macro_expansion_no,
+ p_extensions,
&exp_descriptor_standard,
pascal_parse,
&exp_descriptor_standard,
pascal_parse,
- pascal_error,
null_post_parser,
pascal_printchar, /* Print a character constant */
pascal_printstr, /* Function to print string constant */
pascal_emit_char, /* Print a single char */
pascal_print_type, /* Print a type using appropriate syntax */
pascal_print_typedef, /* Print a typedef using appropriate syntax */
null_post_parser,
pascal_printchar, /* Print a character constant */
pascal_printstr, /* Function to print string constant */
pascal_emit_char, /* Print a single char */
pascal_print_type, /* Print a type using appropriate syntax */
pascal_print_typedef, /* Print a typedef using appropriate syntax */
- pascal_val
_print, /* Print a value using appropriate syntax
*/
+ pascal_val
ue_print_inner, /* la_value_print_inner
*/
pascal_value_print, /* Print a top-level value */
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 */
NULL, /* Language specific skip_trampoline */
"this", /* name_of_this */
+ false, /* 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 */
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 */
pascal_op_print_tab, /* expression operators for printing */
1, /* c-style arrays */
0, /* String lower bound */
default_word_break_characters,
NULL, /* Language specific class_name_from_physname */
pascal_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
,
pascal_language_arch_info,
default_print_array_index,
default_pass_by_reference,
pascal_language_arch_info,
default_print_array_index,
default_pass_by_reference,
-
default_get_string
,
- strcmp_iw_ordered,
+
c_watch_location_expression
,
+ NULL, /* la_compare_symbol_for_completion */
iterate_over_symbols,
iterate_over_symbols,
- LANG_MAGIC
+ default_search_name_hash,
+ &default_varobj_ops,
+ NULL,
+ NULL,
+ pascal_is_string_type_p,
+ "{...}" /* la_struct_too_deep_ellipsis */
};
};
-void
-_initialize_pascal_language (void)
+/* Class representing the Pascal language. */
+
+class pascal_language : public language_defn
{
{
- add_language (&pascal_language_defn);
-}
+public:
+ pascal_language ()
+ : language_defn (language_pascal, pascal_language_data)
+ { /* Nothing. */ }
+};
+
+/* Single instance of the Pascal language class. */
+
+static pascal_language pascal_language_defn;
This page took
0.027512 seconds
and
4
git commands to generate.