/* Multiple source language support for GDB.
- Copyright (C) 1991-2015 Free Software Foundation, Inc.
+ Copyright (C) 1991-2017 Free Software Foundation, Inc.
Contributed by the Department of Computer Science at the State University
of New York at Buffalo.
#include "varobj.h"
#include "target.h"
#include "parser-defs.h"
-#include "jv-lang.h"
#include "demangle.h"
#include "symfile.h"
#include "cp-support.h"
+#include "frame.h"
extern void _initialize_language (void);
show_language_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- enum language flang; /* The language of the current frame. */
+ enum language flang; /* The language of the frame. */
if (language_mode == language_mode_auto)
fprintf_filtered (gdb_stdout,
_("The current source language is \"%s\".\n"),
current_language->la_name);
- flang = get_frame_language ();
- if (flang != language_unknown &&
- language_mode == language_mode_manual &&
- current_language->la_language != flang)
- printf_filtered ("%s\n", lang_frame_mismatch_warn);
+ if (has_stack_frames ())
+ {
+ struct frame_info *frame;
+
+ frame = get_selected_frame (NULL);
+ flang = get_frame_language (frame);
+ if (flang != language_unknown
+ && language_mode == language_mode_manual
+ && current_language->la_language != flang)
+ printf_filtered ("%s\n", lang_frame_mismatch_warn);
+ }
}
/* Set command. Change the current working language. */
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
int i;
- enum language flang;
+ enum language flang = language_unknown;
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
/* Enter auto mode. Set to the current frame's language, if
known, or fallback to the initial language. */
language_mode = language_mode_auto;
- flang = get_frame_language ();
+ TRY
+ {
+ struct frame_info *frame;
+
+ frame = get_selected_frame (NULL);
+ flang = get_frame_language (frame);
+ }
+ CATCH (ex, RETURN_MASK_ERROR)
+ {
+ flang = language_unknown;
+ }
+ END_CATCH
+
if (flang != language_unknown)
set_language (flang);
else
/* For the "set language" command. */
static const char **language_names = NULL;
/* For the "help set language" command. */
- char *language_set_doc = NULL;
int i;
struct ui_file *tmp_stream;
if (!languages)
{
languages_allocsize = DEFAULT_ALLOCSIZE;
- languages = (const struct language_defn **) xmalloc
- (languages_allocsize * sizeof (*languages));
+ languages = XNEWVEC (const struct language_defn *, languages_allocsize);
}
if (languages_size >= languages_allocsize)
{
/* Build the language names array, to be used as enumeration in the
set language" enum command. */
- language_names = xrealloc (language_names,
- (languages_size + 1) * sizeof (const char *));
+ language_names = XRESIZEVEC (const char *, language_names,
+ languages_size + 1);
+
for (i = 0; i < languages_size; ++i)
language_names[i] = languages[i]->la_name;
language_names[i] = NULL;
+ /* Add the filename extensions. */
+ if (lang->la_filename_extensions != NULL)
+ {
+ int i;
+
+ for (i = 0; lang->la_filename_extensions[i] != NULL; ++i)
+ add_filename_language (lang->la_filename_extensions[i],
+ lang->la_language);
+ }
+
/* Build the "help set language" docs. */
tmp_stream = mem_fileopen ();
languages[i]->la_name + 1);
}
- language_set_doc = ui_file_xstrdup (tmp_stream, NULL);
+ std::string language_set_doc = ui_file_as_string (tmp_stream);
ui_file_delete (tmp_stream);
add_setshow_enum_cmd ("language", class_support,
(const char **) language_names,
&language,
- language_set_doc,
+ language_set_doc.c_str (),
_("Show the current source language."),
NULL, set_language_command,
show_language_command,
&setlist, &showlist);
-
- xfree (language_set_doc);
}
/* Iterate through all registered languages looking for and calling
return NULL;
}
+/* See langauge.h. */
+
+int
+language_sniff_from_mangled_name (const struct language_defn *lang,
+ const char *mangled, char **demangled)
+{
+ gdb_assert (lang != NULL);
+
+ if (lang->la_sniff_from_mangled_name == NULL)
+ {
+ *demangled = NULL;
+ return 0;
+ }
+
+ return lang->la_sniff_from_mangled_name (mangled, demangled);
+}
+
/* Return class name from physname or NULL. */
char *
language_class_name_from_physname (const struct language_defn *lang,
}
static void
-unk_lang_val_print (struct type *type, const gdb_byte *valaddr,
+unk_lang_val_print (struct type *type,
int embedded_offset, CORE_ADDR address,
struct ui_file *stream, int recurse,
- const struct value *val,
+ struct value *val,
const struct value_print_options *options)
{
error (_("internal error - unimplemented "
case_sensitive_on,
array_row_major,
macro_expansion_no,
+ NULL,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
+ NULL,
unk_lang_class_name, /* Language specific
class_name_from_physname */
unk_op_print_tab, /* expression operators for printing */
case_sensitive_on,
array_row_major,
macro_expansion_no,
+ NULL,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
+ NULL,
unk_lang_class_name, /* Language specific
class_name_from_physname */
unk_op_print_tab, /* expression operators for printing */
case_sensitive_on,
array_row_major,
macro_expansion_no,
+ NULL,
&exp_descriptor_standard,
unk_lang_parser,
unk_lang_error,
basic_lookup_symbol_nonlocal, /* lookup_symbol_nonlocal */
basic_lookup_transparent_type,/* lookup_transparent_type */
unk_lang_demangle, /* Language specific symbol demangler */
+ NULL,
unk_lang_class_name, /* Language specific
class_name_from_physname */
unk_op_print_tab, /* expression operators for printing */
language_string_char_type (const struct language_defn *la,
struct gdbarch *gdbarch)
{
- struct language_gdbarch *ld = gdbarch_data (gdbarch,
- language_gdbarch_data);
+ struct language_gdbarch *ld
+ = (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data);
return ld->arch_info[la->la_language].string_char_type;
}
language_bool_type (const struct language_defn *la,
struct gdbarch *gdbarch)
{
- struct language_gdbarch *ld = gdbarch_data (gdbarch,
- language_gdbarch_data);
+ struct language_gdbarch *ld
+ = (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data);
if (ld->arch_info[la->la_language].bool_type_symbol)
{
struct gdbarch *gdbarch,
const char *name)
{
- struct language_gdbarch *ld = gdbarch_data (gdbarch,
- language_gdbarch_data);
+ struct language_gdbarch *ld =
+ (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data);
struct type **typep;
typep = language_lookup_primitive_type_1 (&ld->arch_info[la->la_language],
struct gdbarch *gdbarch)
{
int n;
- struct compunit_symtab *cust;
- struct symtab *symtab;
- struct block *static_block, *global_block;
gdb_assert (lai->primitive_type_vector != NULL);
struct gdbarch *gdbarch,
const char *name)
{
- struct language_gdbarch *ld = gdbarch_data (gdbarch,
- language_gdbarch_data);
+ struct language_gdbarch *ld
+ = (struct language_gdbarch *) gdbarch_data (gdbarch, language_gdbarch_data);
struct language_arch_info *lai = &ld->arch_info[la->la_language];
struct type **typep;
struct symbol *sym;