bool destructible = true;
};
-/* Structure tying together assorted information about a language. */
+/* Structure tying together assorted information about a language.
-struct language_defn
+ As we move over from the old structure based languages to a class
+ hierarchy of languages this structure will continue to contain a
+ mixture of both data and function pointers.
+
+ Once the class hierarchy of languages in place the first task is to
+ remove the function pointers from this structure and convert them into
+ member functions on the different language classes.
+
+ The current plan it to keep the constant data that describes a language
+ in this structure, and have each language pass in an instance of this
+ structure at construction time. */
+
+struct language_data
{
/* Name of the language. */
void (*la_value_print) (struct value *, struct ui_file *,
const struct value_print_options *);
- /* Given a symbol VAR, the corresponding block VAR_BLOCK (if any) and a
- stack frame id FRAME, read the value of the variable and return (pointer
- to a) struct value containing the value.
-
- VAR_BLOCK is needed if there's a possibility for VAR to be outside
- FRAME. This is what happens if FRAME correspond to a nested function
- and VAR is defined in the outer function. If callers know that VAR is
- located in FRAME or is global/static, NULL can be passed as VAR_BLOCK.
-
- Throw an error if the variable cannot be found. */
-
- struct value *(*la_read_var_value) (struct symbol *var,
- const struct block *var_block,
- struct frame_info *frame);
-
/* PC is possibly an unknown languages trampoline.
If that PC falls in a trampoline belonging to this language,
return the address of the first pc in the real function, or 0
void (*la_language_arch_info) (struct gdbarch *,
struct language_arch_info *);
- /* Print the index of an element of an array. */
- void (*la_print_array_index) (struct type *index_type,
- LONGEST index_value,
- struct ui_file *stream,
- const struct value_print_options *options);
-
/* Return information about whether TYPE should be passed
(and returned) by reference at the language level. */
struct language_pass_by_ref_info (*la_pass_by_reference)
};
+/* Base class from which all other language classes derive. */
+
+struct language_defn : language_data
+{
+ language_defn (enum language lang, const language_data &init_data)
+ : language_data (init_data)
+ {
+ /* We should only ever create one instance of each language. */
+ gdb_assert (languages[lang] == nullptr);
+ languages[lang] = this;
+ }
+
+ /* Print the index of an element of an array. This default
+ implementation prints using C99 syntax. */
+
+ virtual void print_array_index (struct type *index_type,
+ LONGEST index_value,
+ struct ui_file *stream,
+ const value_print_options *options) const;
+
+ /* Given a symbol VAR, the corresponding block VAR_BLOCK (if any) and a
+ stack frame id FRAME, read the value of the variable and return (pointer
+ to a) struct value containing the value.
+
+ VAR_BLOCK is needed if there's a possibility for VAR to be outside
+ FRAME. This is what happens if FRAME correspond to a nested function
+ and VAR is defined in the outer function. If callers know that VAR is
+ located in FRAME or is global/static, NULL can be passed as VAR_BLOCK.
+
+ Throw an error if the variable cannot be found. */
+
+ virtual struct value *read_var_value (struct symbol *var,
+ const struct block *var_block,
+ struct frame_info *frame) const;
+
+ /* List of all known languages. */
+ static const struct language_defn *languages[nr_languages];
+};
+
/* Pointer to the language_defn for our current language. This pointer
always points to *some* valid struct; it can be used without checking
it for validity.
(current_language->la_emitchar(ch, type, stream, quoter))
#define LA_PRINT_ARRAY_INDEX(index_type, index_value, stream, options) \
- (current_language->la_print_array_index(index_type, index_value, stream, \
- options))
+ (current_language->print_array_index(index_type, index_value, stream, \
+ options))
#define LA_ITERATE_OVER_SYMBOLS(BLOCK, NAME, DOMAIN, CALLBACK) \
(current_language->la_iterate_over_symbols (BLOCK, NAME, DOMAIN, CALLBACK))
/* Splitting strings into words. */
extern const char *default_word_break_characters (void);
-/* Print the index of an array element using the C99 syntax. */
-extern void default_print_array_index (struct type *index_type, LONGEST index,
- struct ui_file *stream,
- const struct value_print_options *options);
-
/* Return information about whether TYPE should be passed
(and returned) by reference at the language level. */
struct language_pass_by_ref_info language_pass_by_reference (struct type *type);
symbol_name_matcher_ftype *get_symbol_name_matcher
(const language_defn *lang, const lookup_name_info &lookup_name);
-/* The languages supported by GDB. */
-
-extern const struct language_defn auto_language_defn;
-extern const struct language_defn unknown_language_defn;
-extern const struct language_defn minimal_language_defn;
-
-extern const struct language_defn ada_language_defn;
-extern const struct language_defn asm_language_defn;
-extern const struct language_defn c_language_defn;
-extern const struct language_defn cplus_language_defn;
-extern const struct language_defn d_language_defn;
-extern const struct language_defn f_language_defn;
-extern const struct language_defn go_language_defn;
-extern const struct language_defn m2_language_defn;
-extern const struct language_defn objc_language_defn;
-extern const struct language_defn opencl_language_defn;
-extern const struct language_defn pascal_language_defn;
-extern const struct language_defn rust_language_defn;
-
/* Save the current language and restore it upon destruction. */
class scoped_restore_current_language