From 5c6ce71d76dc5618b6ebfc967e5c4b99d701ef50 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Sat, 27 Sep 2008 21:29:30 +0000 Subject: [PATCH] gdb * scm-lang.c (scm_language_defn): Update. * p-typeprint.c (pascal_print_typedef): New function. * p-lang.h: (pascal_print_typedef): Declare. * p-lang.c (pascal_language_defn): Update. * objc-lang.c (objc_language_defn): Update. * m2-typeprint.c (m2_print_typedef): New function. * m2-lang.h (m2_print_typedef): Declare. * m2-lang.c (m2_language_defn): Update. * language.h (_LANG_c, _LANG_m2, _LANG_fortran, _LANG_pascal): Remove. (struct language_defn) : New field. (default_print_typedef): Declare. (LA_PRINT_TYPEDEF): New define. * language.c (unknown_language_defn): Update. (auto_language_defn): Update. (local_language_defn): Update. * jv-lang.c (java_language_defn): Update. * f-lang.c (f_language_defn): Update. * c-typeprint.c (c_print_typedef): New function. * c-lang.h (c_print_typedef): Declare. * c-lang.c (c_language_defn): Update. (cplus_language_defn): Update. (asm_language_defn): Update. (minimal_language_defn): Update. * ada-lang.c (ada_language_defn): Update. * typeprint.c (default_print_typedef): New function. gdb/doc * gdbint.texinfo (Language Support): Remove text about omitting support for a language. --- gdb/ChangeLog | 29 ++++++++++++++++++++++++++ gdb/ada-lang.c | 1 + gdb/c-lang.c | 4 ++++ gdb/c-lang.h | 2 ++ gdb/c-typeprint.c | 18 +++++++++++++++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/gdbint.texinfo | 17 ---------------- gdb/f-lang.c | 1 + gdb/jv-lang.c | 1 + gdb/language.c | 3 +++ gdb/language.h | 22 ++++++++++++-------- gdb/m2-lang.c | 1 + gdb/m2-lang.h | 3 +++ gdb/m2-typeprint.c | 20 ++++++++++++++++++ gdb/objc-lang.c | 1 + gdb/p-lang.c | 1 + gdb/p-lang.h | 3 +++ gdb/p-typeprint.c | 15 ++++++++++++++ gdb/scm-lang.c | 1 + gdb/typeprint.c | 46 ++++++++++-------------------------------- 20 files changed, 134 insertions(+), 60 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 749e65f9529..667d6be27ae 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,32 @@ +2008-09-27 Tom Tromey + + * scm-lang.c (scm_language_defn): Update. + * p-typeprint.c (pascal_print_typedef): New function. + * p-lang.h: (pascal_print_typedef): Declare. + * p-lang.c (pascal_language_defn): Update. + * objc-lang.c (objc_language_defn): Update. + * m2-typeprint.c (m2_print_typedef): New function. + * m2-lang.h (m2_print_typedef): Declare. + * m2-lang.c (m2_language_defn): Update. + * language.h (_LANG_c, _LANG_m2, _LANG_fortran, _LANG_pascal): + Remove. + (struct language_defn) : New field. + (default_print_typedef): Declare. + (LA_PRINT_TYPEDEF): New define. + * language.c (unknown_language_defn): Update. + (auto_language_defn): Update. + (local_language_defn): Update. + * jv-lang.c (java_language_defn): Update. + * f-lang.c (f_language_defn): Update. + * c-typeprint.c (c_print_typedef): New function. + * c-lang.h (c_print_typedef): Declare. + * c-lang.c (c_language_defn): Update. + (cplus_language_defn): Update. + (asm_language_defn): Update. + (minimal_language_defn): Update. + * ada-lang.c (ada_language_defn): Update. + * typeprint.c (default_print_typedef): New function. + 2008-09-27 Tom Tromey * jv-exp.y (insert_exp): Define using ISO syntax. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 7176561115d..d4d7dc03527 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10943,6 +10943,7 @@ const struct language_defn ada_language_defn = { ada_printstr, /* Function to print string constant */ emit_char, /* Function to print single char (not used) */ ada_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ ada_val_print, /* Print a value using appropriate syntax */ ada_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/c-lang.c b/gdb/c-lang.c index ebe781b3796..a9cd9c2970e 100644 --- a/gdb/c-lang.c +++ b/gdb/c-lang.c @@ -400,6 +400,7 @@ const struct language_defn c_language_defn = 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 */ NULL, /* Language specific skip_trampoline */ @@ -516,6 +517,7 @@ const struct language_defn cplus_language_defn = 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 */ cplus_skip_trampoline, /* Language specific skip_trampoline */ @@ -551,6 +553,7 @@ const struct language_defn asm_language_defn = 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 */ NULL, /* Language specific skip_trampoline */ @@ -591,6 +594,7 @@ const struct language_defn minimal_language_defn = 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 */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/c-lang.h b/gdb/c-lang.h index 58d99ce5478..fe1939accc3 100644 --- a/gdb/c-lang.h +++ b/gdb/c-lang.h @@ -37,6 +37,8 @@ extern void c_error (char *); /* Defined in c-exp.y */ extern void c_print_type (struct type *, char *, struct ui_file *, int, int); +extern void c_print_typedef (struct type *, struct symbol *, struct ui_file *); + extern int c_val_print (struct type *, const gdb_byte *, int, CORE_ADDR, struct ui_file *, int, int, int, enum val_prettyprint); diff --git a/gdb/c-typeprint.c b/gdb/c-typeprint.c index 56d12f96ee5..31a98ea5eaa 100644 --- a/gdb/c-typeprint.c +++ b/gdb/c-typeprint.c @@ -97,6 +97,24 @@ c_print_type (struct type *type, char *varstring, struct ui_file *stream, } } +/* Print a typedef using C syntax. TYPE is the underlying type. + NEW_SYMBOL is the symbol naming the type. STREAM is the stream on + which to print. */ + +void +c_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + CHECK_TYPEDEF (type); + fprintf_filtered (stream, "typedef "); + type_print (type, "", stream, 0); + if (TYPE_NAME ((SYMBOL_TYPE (new_symbol))) == 0 + || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))), + SYMBOL_LINKAGE_NAME (new_symbol)) != 0) + fprintf_filtered (stream, " %s", SYMBOL_PRINT_NAME (new_symbol)); + fprintf_filtered (stream, ";\n"); +} + /* If TYPE is a derived type, then print out derivation information. Print only the actual base classes of this type, not the base classes of the base classes. I.E. for the derivation hierarchy: diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index c11cb92f96d..b75da649b5a 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2008-09-27 Tom Tromey + + * gdbint.texinfo (Language Support): Remove text about omitting + support for a language. + 2008-09-23 Doug Evans * gdb.texinfo (info dcache): Update. diff --git a/gdb/doc/gdbint.texinfo b/gdb/doc/gdbint.texinfo index 63b0d34de3c..1edb444a4c9 100644 --- a/gdb/doc/gdbint.texinfo +++ b/gdb/doc/gdbint.texinfo @@ -2513,23 +2513,6 @@ printed representations of your operators to @code{op_print_tab}. Add a call to @code{@var{lang}_parse()} and @code{@var{lang}_error} in @code{parse_exp_1} (defined in @file{parse.c}). -@item Use macros to trim code - -@cindex trimming language-dependent code -The user has the option of building @value{GDBN} for some or all of the -languages. If the user decides to build @value{GDBN} for the language -@var{lang}, then every file dependent on @file{language.h} will have the -macro @code{_LANG_@var{lang}} defined in it. Use @code{#ifdef}s to -leave out large routines that the user won't need if he or she is not -using your language. - -Note that you do not need to do this in your YACC parser, since if @value{GDBN} -is not build for @var{lang}, then @file{@var{lang}-exp.tab.o} (the -compiled form of your parser) is not linked into @value{GDBN} at all. - -See the file @file{configure.in} for how @value{GDBN} is configured -for different languages. - @item Edit @file{Makefile.in} Add dependencies in @file{Makefile.in}. Make sure you update the macro diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 8ae7775ad42..4e2f3c44ecd 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -324,6 +324,7 @@ const struct language_defn f_language_defn = f_printstr, /* function to print string constant */ f_emit_char, /* Function to print a single character */ f_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ f_val_print, /* Print a value using appropriate syntax */ c_value_print, /* FIXME */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/jv-lang.c b/gdb/jv-lang.c index 39d8f4821e0..69570b43bb4 100644 --- a/gdb/jv-lang.c +++ b/gdb/jv-lang.c @@ -1110,6 +1110,7 @@ const struct language_defn java_language_defn = c_printstr, /* Function to print string constant */ java_emit_char, /* Function to print a single character */ java_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ java_val_print, /* Print a value using appropriate syntax */ java_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/language.c b/gdb/language.c index 7b0b44a6b1b..0b21dc3ccc2 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -1145,6 +1145,7 @@ const struct language_defn unknown_language_defn = unk_lang_printstr, unk_lang_emit_char, unk_lang_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ unk_lang_trampoline, /* Language specific skip_trampoline */ @@ -1181,6 +1182,7 @@ const struct language_defn auto_language_defn = unk_lang_printstr, unk_lang_emit_char, unk_lang_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ unk_lang_trampoline, /* Language specific skip_trampoline */ @@ -1216,6 +1218,7 @@ const struct language_defn local_language_defn = unk_lang_printstr, unk_lang_emit_char, unk_lang_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ unk_lang_val_print, /* Print a value using appropriate syntax */ unk_lang_value_print, /* Print a top-level value */ unk_lang_trampoline, /* Language specific skip_trampoline */ diff --git a/gdb/language.h b/gdb/language.h index 04d4da2604b..ba28540b564 100644 --- a/gdb/language.h +++ b/gdb/language.h @@ -31,14 +31,6 @@ struct frame_info; struct expression; struct ui_file; -/* This used to be included to configure GDB for one or more specific - languages. Now it is left out to configure for all of them. FIXME. */ -/* #include "lang_def.h" */ -#define _LANG_c -#define _LANG_m2 -#define _LANG_fortran -#define _LANG_pascal - #define MAX_FORTRAN_DIMS 7 /* Maximum number of F77 array dims */ /* range_mode == @@ -192,6 +184,13 @@ struct language_defn void (*la_print_type) (struct type *, char *, struct ui_file *, int, int); + /* Print a typedef using syntax appropriate for this language. + TYPE is the underlying type. NEW_SYMBOL is the symbol naming + the type. STREAM is the output stream on which to print. */ + + void (*la_print_typedef) (struct type *type, struct symbol *new_symbol, + struct ui_file *stream); + /* Print a value using syntax appropriate for this language. */ int (*la_val_print) (struct type *, const gdb_byte *, int, CORE_ADDR, @@ -350,6 +349,9 @@ extern enum language set_language (enum language); #define LA_PRINT_TYPE(type,varstring,stream,show,level) \ (current_language->la_print_type(type,varstring,stream,show,level)) +#define LA_PRINT_TYPEDEF(type,new_symbol,stream) \ + (current_language->la_print_typedef(type,new_symbol,stream)) + #define LA_VAL_PRINT(type,valaddr,offset,addr,stream,fmt,deref,recurse,pretty) \ (current_language->la_val_print(type,valaddr,offset,addr,stream,fmt,deref, \ recurse,pretty)) @@ -468,4 +470,8 @@ int language_pass_by_reference (struct type *type); independent of this. */ int default_pass_by_reference (struct type *type); +/* The default implementation of la_print_typedef. */ +void default_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream); + #endif /* defined (LANGUAGE_H) */ diff --git a/gdb/m2-lang.c b/gdb/m2-lang.c index 8bc0ce79523..2b3ca6ab47a 100644 --- a/gdb/m2-lang.c +++ b/gdb/m2-lang.c @@ -375,6 +375,7 @@ const struct language_defn m2_language_defn = m2_printstr, /* function to print string constant */ m2_emit_char, /* Function to print a single character */ m2_print_type, /* Print a type using appropriate syntax */ + m2_print_typedef, /* Print a typedef using appropriate syntax */ m2_val_print, /* Print a value using appropriate syntax */ c_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/m2-lang.h b/gdb/m2-lang.h index ac7c8f5ad05..8ce458c3d49 100644 --- a/gdb/m2-lang.h +++ b/gdb/m2-lang.h @@ -26,6 +26,9 @@ extern void m2_error (char *); /* Defined in m2-exp.y */ extern void m2_print_type (struct type *, char *, struct ui_file *, int, int); +extern void m2_print_typedef (struct type *, struct symbol *, + struct ui_file *); + extern int m2_is_long_set (struct type *type); extern int m2_is_unbounded_array (struct type *type); diff --git a/gdb/m2-typeprint.c b/gdb/m2-typeprint.c index 666ae286677..e2970e2a4e2 100644 --- a/gdb/m2-typeprint.c +++ b/gdb/m2-typeprint.c @@ -154,6 +154,26 @@ m2_print_type (struct type *type, char *varstring, struct ui_file *stream, } } +/* Print a typedef using M2 syntax. TYPE is the underlying type. + NEW_SYMBOL is the symbol naming the type. STREAM is the stream on + which to print. */ + +void +m2_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + CHECK_TYPEDEF (type); + fprintf_filtered (stream, "TYPE "); + if (!TYPE_NAME (SYMBOL_TYPE (new_symbol)) + || strcmp (TYPE_NAME ((SYMBOL_TYPE (new_symbol))), + SYMBOL_LINKAGE_NAME (new_symbol)) != 0) + fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new_symbol)); + else + fprintf_filtered (stream, " = "); + type_print (type, "", stream, 0); + fprintf_filtered (stream, ";\n"); +} + /* m2_type_name - if a, type, has a name then print it. */ void diff --git a/gdb/objc-lang.c b/gdb/objc-lang.c index 1692c3d3398..46081688264 100644 --- a/gdb/objc-lang.c +++ b/gdb/objc-lang.c @@ -512,6 +512,7 @@ const struct language_defn objc_language_defn = { objc_printstr, /* Function to print string constant */ objc_emit_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 */ objc_skip_trampoline, /* Language specific skip_trampoline */ diff --git a/gdb/p-lang.c b/gdb/p-lang.c index b763e04900d..b829f8d4aad 100644 --- a/gdb/p-lang.c +++ b/gdb/p-lang.c @@ -414,6 +414,7 @@ const struct language_defn pascal_language_defn = 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_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/p-lang.h b/gdb/p-lang.h index b840041a865..a4f878f8b95 100644 --- a/gdb/p-lang.h +++ b/gdb/p-lang.h @@ -31,6 +31,9 @@ extern void pascal_error (char *); /* Defined in p-exp.y */ /* Defined in p-typeprint.c */ extern void pascal_print_type (struct type *, char *, struct ui_file *, int, int); +extern void pascal_print_typedef (struct type *, struct symbol *, + struct ui_file *); + extern int pascal_val_print (struct type *, const gdb_byte *, int, CORE_ADDR, struct ui_file *, int, int, int, enum val_prettyprint); diff --git a/gdb/p-typeprint.c b/gdb/p-typeprint.c index a10982d773b..afc831cc484 100644 --- a/gdb/p-typeprint.c +++ b/gdb/p-typeprint.c @@ -87,6 +87,21 @@ pascal_print_type (struct type *type, char *varstring, struct ui_file *stream, } +/* Print a typedef using Pascal syntax. TYPE is the underlying type. + NEW_SYMBOL is the symbol naming the type. STREAM is the stream on + which to print. */ + +void +pascal_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + CHECK_TYPEDEF (type); + fprintf_filtered (stream, "type "); + fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new_symbol)); + type_print (type, "", stream, 0); + fprintf_filtered (stream, ";\n"); +} + /* If TYPE is a derived type, then print out derivation information. Print only the actual base classes of this type, not the base classes of the base classes. I.E. for the derivation hierarchy: diff --git a/gdb/scm-lang.c b/gdb/scm-lang.c index 003e27a7376..607efb6e5d1 100644 --- a/gdb/scm-lang.c +++ b/gdb/scm-lang.c @@ -254,6 +254,7 @@ const struct language_defn scm_language_defn = scm_printstr, /* Function to print string constant */ NULL, /* Function to print a single character */ c_print_type, /* Print a type using appropriate syntax */ + default_print_typedef, /* Print a typedef using appropriate syntax */ scm_val_print, /* Print a value using appropriate syntax */ scm_value_print, /* Print a top-level value */ NULL, /* Language specific skip_trampoline */ diff --git a/gdb/typeprint.c b/gdb/typeprint.c index 0ec0e267a8b..44f1a77e12b 100644 --- a/gdb/typeprint.c +++ b/gdb/typeprint.c @@ -47,6 +47,7 @@ static void whatis_command (char *, int); static void whatis_exp (char *, int); + /* Print a description of a type in the format of a typedef for the current language. NEW is the new name for a type TYPE. */ @@ -54,41 +55,16 @@ static void whatis_exp (char *, int); void typedef_print (struct type *type, struct symbol *new, struct ui_file *stream) { - CHECK_TYPEDEF (type); - switch (current_language->la_language) - { -#ifdef _LANG_c - case language_c: - case language_cplus: - fprintf_filtered (stream, "typedef "); - type_print (type, "", stream, 0); - if (TYPE_NAME ((SYMBOL_TYPE (new))) == 0 - || strcmp (TYPE_NAME ((SYMBOL_TYPE (new))), SYMBOL_LINKAGE_NAME (new)) != 0) - fprintf_filtered (stream, " %s", SYMBOL_PRINT_NAME (new)); - break; -#endif -#ifdef _LANG_m2 - case language_m2: - fprintf_filtered (stream, "TYPE "); - if (!TYPE_NAME (SYMBOL_TYPE (new)) - || strcmp (TYPE_NAME ((SYMBOL_TYPE (new))), SYMBOL_LINKAGE_NAME (new)) != 0) - fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new)); - else - fprintf_filtered (stream, " = "); - type_print (type, "", stream, 0); - break; -#endif -#ifdef _LANG_pascal - case language_pascal: - fprintf_filtered (stream, "type "); - fprintf_filtered (stream, "%s = ", SYMBOL_PRINT_NAME (new)); - type_print (type, "", stream, 0); - break; -#endif - default: - error (_("Language not supported.")); - } - fprintf_filtered (stream, ";\n"); + LA_PRINT_TYPEDEF (type, new, stream); +} + +/* The default way to print a typedef. */ + +void +default_print_typedef (struct type *type, struct symbol *new_symbol, + struct ui_file *stream) +{ + error (_("Language not supported.")); } /* Print a description of a type TYPE in the form of a declaration of a -- 2.30.2