From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20817 invoked by alias); 24 Apr 2008 01:31:13 -0000 Received: (qmail 20803 invoked by uid 22791); 24 Apr 2008 01:31:09 -0000 X-Spam-Check-By: sourceware.org Received: from rock.gnat.com (HELO rock.gnat.com) (205.232.38.15) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 24 Apr 2008 01:30:39 +0000 Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 0D8532A9FBC; Wed, 23 Apr 2008 21:30:37 -0400 (EDT) Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id RnvtT6v3mJ5j; Wed, 23 Apr 2008 21:30:36 -0400 (EDT) Received: from joel.gnat.com (localhost.localdomain [127.0.0.1]) by rock.gnat.com (Postfix) with ESMTP id 169762A9FB7; Wed, 23 Apr 2008 21:30:36 -0400 (EDT) Received: by joel.gnat.com (Postfix, from userid 1000) id CD824E7ACD; Wed, 23 Apr 2008 18:30:33 -0700 (PDT) Date: Thu, 24 Apr 2008 02:15:00 -0000 From: Joel Brobecker To: Jerome Guitton , gdb-patches@sources.redhat.com Subject: Re: [RFA] backtrace in mixed language applications (take 2) Message-ID: <20080424013033.GA5814@adacore.com> References: <20070810100313.GA29799@adacore.com> <20080109204712.GJ21281@adacore.com> <20080129180025.GH3773@caradoc.them.org> <20080204205620.GE21614@adacore.com> <20080204210336.GF21614@adacore.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20080204210336.GF21614@adacore.com> User-Agent: Mutt/1.4.2.2i Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2008-04/txt/msg00544.txt.bz2 > > The patch looks sane to me, except for this, which ignores "set > > language" - compare to the code in select_frame. Do you think we > > ought to honor it here if it's been set? Ooops, for some reason, the following patch never made it. > Good catch. I don't have any clear reason why we should change > the previous behavior in this case, so I've tweaked the previous > patch to honor "set language". I also added a test in the new > testcase to verify this. The rest of the patch should be identical. Since the adjustments from the previous iteration were relatively minor, I will commit in a week unless someone objects (or approves :). Hopefully the patch still applies cleanly - I'll retest in any case. > 2008-02-04 Joel Brobecker > > * valprint.c (val_print): Add new language parameter and use it > instead of using the current_language. Update calls to val_print > throughout. > (common_val_print): Add new langauge parameter and pass it to > val_print. > * value.h (struct language_defn): Add opaque declaration. > (val_print, common_val_print): Update declarations. > * stack.c (print_frame_args): Update call to common_val_print > using the appropriate language. > * mi/mi-cmd-stack.c (list_args_or_locals): Likewise. > * c-valprint, f-valprint.c, m2-valprint.c, mt-tdep.c, infcmd.c, > mi/mi-main.c, jv-valprint.c, ada-valprint.c, varobj.c, p-valprint.c, > scm-valprint.c, cp-valprint.c, sh64-tdep.c, printcmd.c: > #include "language.h" if necessary. > Update calls to val_print and common_val_print. > * Makefile.in (mt-tdep.o, sh64-tdep.o, mi-cmds.o, mi-main.o): > Update dependencies. > > 2008-02-04 Jerome Guitton > Joel Brobecker > > * gdb.ada/lang_switch: New test program. > * gdb.ada/lang_switch.exp: New testcase. > > Tested on x86-linux. No regression. Index: valprint.c =================================================================== --- valprint.c (revision 161) +++ valprint.c (revision 162) @@ -180,9 +180,10 @@ show_addressprint (struct ui_file *file, } -/* Print data of type TYPE located at VALADDR (within GDB), which came from - the inferior at address ADDRESS, onto stdio stream STREAM according to - FORMAT (a letter, or 0 for natural format using TYPE). +/* Print using the given LANGUAGE the data of type TYPE located at VALADDR + (within GDB), which came from the inferior at address ADDRESS, onto + stdio stream STREAM according to FORMAT (a letter, or 0 for natural + format using TYPE). If DEREF_REF is nonzero, then dereference references, otherwise just print them like pointers. @@ -203,7 +204,8 @@ show_addressprint (struct ui_file *file, int val_print (struct type *type, const gdb_byte *valaddr, int embedded_offset, CORE_ADDR address, struct ui_file *stream, int format, - int deref_ref, int recurse, enum val_prettyprint pretty) + int deref_ref, int recurse, enum val_prettyprint pretty, + const struct language_defn *language) { volatile struct gdb_exception except; volatile enum val_prettyprint real_pretty = pretty; @@ -228,8 +230,9 @@ val_print (struct type *type, const gdb_ TRY_CATCH (except, RETURN_MASK_ERROR) { - ret = LA_VAL_PRINT (type, valaddr, embedded_offset, address, - stream, format, deref_ref, recurse, real_pretty); + ret = language->la_val_print (type, valaddr, embedded_offset, address, + stream, format, deref_ref, recurse, + real_pretty); } if (except.reason < 0) fprintf_filtered (stream, _("")); @@ -259,8 +262,8 @@ value_check_printable (struct value *val return 1; } -/* Print the value VAL onto stream STREAM according to FORMAT (a - letter, or 0 for natural format using TYPE). +/* Print using the given LANGUAGE the value VAL onto stream STREAM according + to FORMAT (a letter, or 0 for natural format using TYPE). If DEREF_REF is nonzero, then dereference references, otherwise just print them like pointers. @@ -275,14 +278,16 @@ value_check_printable (struct value *val int common_val_print (struct value *val, struct ui_file *stream, int format, - int deref_ref, int recurse, enum val_prettyprint pretty) + int deref_ref, int recurse, enum val_prettyprint pretty, + const struct language_defn *language) { if (!value_check_printable (val, stream)) return 0; return val_print (value_type (val), value_contents_all (val), value_embedded_offset (val), VALUE_ADDRESS (val), - stream, format, deref_ref, recurse, pretty); + stream, format, deref_ref, recurse, pretty, + language); } /* Print the value VAL in C-ish syntax on stream STREAM. @@ -1061,7 +1066,7 @@ val_print_array_elements (struct type *t if (reps > repeat_count_threshold) { val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format, - deref_ref, recurse + 1, pretty); + deref_ref, recurse + 1, pretty, current_language); annotate_elt_rep (reps); fprintf_filtered (stream, " ", reps); annotate_elt_rep_end (); @@ -1072,7 +1077,7 @@ val_print_array_elements (struct type *t else { val_print (elttype, valaddr + i * eltlen, 0, 0, stream, format, - deref_ref, recurse + 1, pretty); + deref_ref, recurse + 1, pretty, current_language); annotate_elt (); things_printed++; } Index: value.h =================================================================== --- value.h (revision 161) +++ value.h (revision 162) @@ -31,6 +31,7 @@ struct regcache; struct symbol; struct type; struct ui_file; +struct language_defn; /* The structure which defines the type of a value. It should never be possible for a program lval value to survive over a call to the @@ -511,12 +512,14 @@ extern int val_print (struct type *type, int embedded_offset, CORE_ADDR address, struct ui_file *stream, int format, int deref_ref, int recurse, - enum val_prettyprint pretty); + enum val_prettyprint pretty, + const struct language_defn *language); extern int common_val_print (struct value *val, struct ui_file *stream, int format, int deref_ref, int recurse, - enum val_prettyprint pretty); + enum val_prettyprint pretty, + const struct language_defn *language); extern int val_print_string (CORE_ADDR addr, int len, int width, struct ui_file *stream); Index: c-valprint.c =================================================================== --- c-valprint.c (revision 161) +++ c-valprint.c (revision 162) @@ -276,7 +276,8 @@ c_val_print (struct type *type, const gd } vt_val = value_at (wtype, vt_address); common_val_print (vt_val, stream, format, - deref_ref, recurse + 1, pretty); + deref_ref, recurse + 1, pretty, + current_language); if (pretty) { fprintf_filtered (stream, "\n"); @@ -314,7 +315,7 @@ c_val_print (struct type *type, const gd unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr + embedded_offset)); common_val_print (deref_val, stream, format, deref_ref, - recurse, pretty); + recurse, pretty, current_language); } else fputs_filtered ("???", stream); @@ -620,7 +621,8 @@ c_value_print (struct value *val, struct /* Print out object: enclosing type is same as real_type if full */ return val_print (value_enclosing_type (val), value_contents_all (val), 0, - VALUE_ADDRESS (val), stream, format, 1, 0, pretty); + VALUE_ADDRESS (val), stream, format, 1, 0, + pretty, current_language); /* Note: When we look up RTTI entries, we don't get any information on const or volatile attributes */ } @@ -631,7 +633,8 @@ c_value_print (struct value *val, struct TYPE_NAME (value_enclosing_type (val))); return val_print (value_enclosing_type (val), value_contents_all (val), 0, - VALUE_ADDRESS (val), stream, format, 1, 0, pretty); + VALUE_ADDRESS (val), stream, format, 1, 0, + pretty, current_language); } /* Otherwise, we end up at the return outside this "if" */ } @@ -639,5 +642,5 @@ c_value_print (struct value *val, struct return val_print (type, value_contents_all (val), value_embedded_offset (val), VALUE_ADDRESS (val) + value_offset (val), - stream, format, 1, 0, pretty); + stream, format, 1, 0, pretty, current_language); } Index: f-valprint.c =================================================================== --- f-valprint.c (revision 161) +++ f-valprint.c (revision 162) @@ -308,7 +308,8 @@ f77_print_array_1 (int nss, int ndimensi valaddr + i * F77_DIM_OFFSET (ndimensions), 0, address + i * F77_DIM_OFFSET (ndimensions), - stream, format, deref_ref, recurse, pretty); + stream, format, deref_ref, recurse, pretty, + current_language); if (i != (F77_DIM_SIZE (nss) - 1)) fprintf_filtered (stream, ", "); @@ -446,7 +447,7 @@ f_val_print (struct type *type, const gd unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr + embedded_offset)); common_val_print (deref_val, stream, format, deref_ref, recurse, - pretty); + pretty, current_language); } else fputs_filtered ("???", stream); Index: m2-valprint.c =================================================================== --- m2-valprint.c (revision 161) +++ m2-valprint.c (revision 162) @@ -263,7 +263,7 @@ print_variable_at_address (struct type * unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr)); common_val_print (deref_val, stream, format, deref_ref, - recurse, pretty); + recurse, pretty, current_language); } else fputs_filtered ("???", stream); @@ -423,7 +423,7 @@ m2_val_print (struct type *type, const g unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr + embedded_offset)); common_val_print (deref_val, stream, format, deref_ref, - recurse, pretty); + recurse, pretty, current_language); } else fputs_filtered ("???", stream); Index: mt-tdep.c =================================================================== --- mt-tdep.c (revision 161) +++ mt-tdep.c (revision 162) @@ -36,6 +36,7 @@ #include "dwarf2-frame.h" #include "infcall.h" #include "gdb_assert.h" +#include "language.h" enum mt_arch_constants { @@ -691,7 +692,8 @@ mt_registers_info (struct gdbarch *gdbar (gdbarch, regnum)), file); val_print (register_type (gdbarch, regnum), buf, - 0, 0, file, 0, 1, 0, Val_no_prettyprint); + 0, 0, file, 0, 1, 0, Val_no_prettyprint, + current_language); fputs_filtered ("\n", file); } else if (regnum == MT_MAC_REGNUM || regnum == MT_MAC_PSEUDOREG_REGNUM) Index: infcmd.c =================================================================== --- infcmd.c (revision 161) +++ infcmd.c (revision 162) @@ -1629,7 +1629,7 @@ default_print_registers_info (struct gdb int j; val_print (register_type (gdbarch, i), buffer, 0, 0, - file, 0, 1, 0, Val_pretty_default); + file, 0, 1, 0, Val_pretty_default, current_language); fprintf_filtered (file, "\t(raw 0x"); for (j = 0; j < register_size (gdbarch, i); j++) @@ -1647,14 +1647,14 @@ default_print_registers_info (struct gdb { /* Print the register in hex. */ val_print (register_type (gdbarch, i), buffer, 0, 0, - file, 'x', 1, 0, Val_pretty_default); + file, 'x', 1, 0, Val_pretty_default, current_language); /* If not a vector register, print it also according to its natural format. */ if (TYPE_VECTOR (register_type (gdbarch, i)) == 0) { fprintf_filtered (file, "\t"); val_print (register_type (gdbarch, i), buffer, 0, 0, - file, 0, 1, 0, Val_pretty_default); + file, 0, 1, 0, Val_pretty_default, current_language); } } Index: mi/mi-cmd-stack.c =================================================================== --- mi/mi-cmd-stack.c (revision 161) +++ mi/mi-cmd-stack.c (revision 162) @@ -29,6 +29,7 @@ #include "stack.h" #include "dictionary.h" #include "gdb_string.h" +#include "language.h" static void list_args_or_locals (int locals, int values, struct frame_info *fi); @@ -298,7 +299,8 @@ list_args_or_locals (int locals, int val { val = read_var_value (sym2, fi); common_val_print - (val, stb->stream, 0, 1, 0, Val_no_prettyprint); + (val, stb->stream, 0, 1, 0, Val_no_prettyprint, + language_def (SYMBOL_LANGUAGE (sym2))); ui_out_field_stream (uiout, "value", stb); } do_cleanups (cleanup_tuple); @@ -306,7 +308,8 @@ list_args_or_locals (int locals, int val case PRINT_ALL_VALUES: val = read_var_value (sym2, fi); common_val_print - (val, stb->stream, 0, 1, 0, Val_no_prettyprint); + (val, stb->stream, 0, 1, 0, Val_no_prettyprint, + language_def (SYMBOL_LANGUAGE (sym2))); ui_out_field_stream (uiout, "value", stb); do_cleanups (cleanup_tuple); break; Index: mi/mi-main.c =================================================================== --- mi/mi-main.c (revision 161) +++ mi/mi-main.c (revision 162) @@ -44,6 +44,7 @@ #include "gdb.h" #include "frame.h" #include "mi-main.h" +#include "language.h" #include #include @@ -567,7 +568,8 @@ get_register (int regnum, int format) else { val_print (register_type (current_gdbarch, regnum), buffer, 0, 0, - stb->stream, format, 1, 0, Val_pretty_default); + stb->stream, format, 1, 0, Val_pretty_default, + current_language); ui_out_field_stream (uiout, "value", stb); ui_out_stream_delete (stb); } @@ -672,7 +674,7 @@ mi_cmd_data_evaluate_expression (char *c /* Print the result of the expression evaluation. */ val_print (value_type (val), value_contents (val), value_embedded_offset (val), VALUE_ADDRESS (val), - stb->stream, 0, 0, 0, 0); + stb->stream, 0, 0, 0, 0, current_language); ui_out_field_stream (uiout, "value", stb); ui_out_stream_delete (stb); Index: jv-valprint.c =================================================================== --- jv-valprint.c (revision 161) +++ jv-valprint.c (revision 162) @@ -180,7 +180,8 @@ java_value_print (struct value *val, str else fprintf_filtered (stream, "%d..%d: ", i, i + reps - 1); - common_val_print (v, stream, format, 2, 1, pretty); + common_val_print (v, stream, format, 2, 1, pretty, + current_language); things_printed++; i += reps; @@ -232,7 +233,8 @@ java_value_print (struct value *val, str return 0; } - return common_val_print (val, stream, format, 1, 0, pretty); + return common_val_print (val, stream, format, 1, 0, pretty, + current_language); } /* TYPE, VALADDR, ADDRESS, STREAM, RECURSE, and PRETTY have the @@ -380,7 +382,8 @@ java_print_value_fields (struct type *ty v = value_from_longest (TYPE_FIELD_TYPE (type, i), unpack_field_as_long (type, valaddr, i)); - common_val_print (v, stream, format, 0, recurse + 1, pretty); + common_val_print (v, stream, format, 0, recurse + 1, + pretty, current_language); } } else @@ -400,7 +403,7 @@ java_print_value_fields (struct type *ty if (TYPE_CODE (t) == TYPE_CODE_STRUCT) v = value_addr (v); common_val_print (v, stream, format, 0, recurse + 1, - pretty); + pretty, current_language); } } else if (TYPE_FIELD_TYPE (type, i) == NULL) @@ -410,7 +413,8 @@ java_print_value_fields (struct type *ty val_print (TYPE_FIELD_TYPE (type, i), valaddr + TYPE_FIELD_BITPOS (type, i) / 8, 0, address + TYPE_FIELD_BITPOS (type, i) / 8, - stream, format, 0, recurse + 1, pretty); + stream, format, 0, recurse + 1, pretty, + current_language); } } annotate_field_end (); Index: ada-valprint.c =================================================================== --- ada-valprint.c (revision 161) +++ ada-valprint.c (revision 162) @@ -201,7 +201,7 @@ val_print_packed_array_elements (struct if (i - i0 > repeat_count_threshold) { val_print (elttype, value_contents (v0), 0, 0, stream, format, - 0, recurse + 1, pretty); + 0, recurse + 1, pretty, current_language); annotate_elt_rep (i - i0); fprintf_filtered (stream, _(" "), i - i0); annotate_elt_rep_end (); @@ -228,7 +228,7 @@ val_print_packed_array_elements (struct stream, format, pretty); } val_print (elttype, value_contents (v0), 0, 0, stream, format, - 0, recurse + 1, pretty); + 0, recurse + 1, pretty, current_language); annotate_elt (); } } @@ -876,7 +876,7 @@ ada_val_print_1 (struct type *type, cons val_print (value_type (deref_val), value_contents (deref_val), 0, VALUE_ADDRESS (deref_val), stream, format, - deref_ref, recurse + 1, pretty); + deref_ref, recurse + 1, pretty, current_language); } else fputs_filtered ("(null)", stream); @@ -966,7 +966,7 @@ ada_value_print (struct value *val0, str } return (val_print (type, value_contents (val), 0, address, - stream, format, 1, 0, pretty)); + stream, format, 1, 0, pretty, current_language)); } static void @@ -1096,7 +1096,8 @@ print_field_values (struct type *type, c bit_size, TYPE_FIELD_TYPE (type, i)); val_print (TYPE_FIELD_TYPE (type, i), value_contents (v), 0, 0, - stream, format, 0, recurse + 1, pretty); + stream, format, 0, recurse + 1, pretty, + current_language); } } else Index: varobj.c =================================================================== --- varobj.c (revision 161) +++ varobj.c (revision 162) @@ -1808,7 +1808,8 @@ value_get_print_value (struct value *val stb = mem_fileopen (); old_chain = make_cleanup_ui_file_delete (stb); - common_val_print (value, stb, format_code[(int) format], 1, 0, 0); + common_val_print (value, stb, format_code[(int) format], 1, 0, 0, + current_language); thevalue = ui_file_xstrdup (stb, &dummy); do_cleanups (old_chain); Index: p-valprint.c =================================================================== --- p-valprint.c (revision 161) +++ p-valprint.c (revision 162) @@ -231,7 +231,7 @@ pascal_val_print (struct type *type, con } vt_val = value_at (wtype, vt_address); common_val_print (vt_val, stream, format, deref_ref, - recurse + 1, pretty); + recurse + 1, pretty, current_language); if (pretty) { fprintf_filtered (stream, "\n"); @@ -270,7 +270,7 @@ pascal_val_print (struct type *type, con unpack_pointer (lookup_pointer_type (builtin_type_void), valaddr + embedded_offset)); common_val_print (deref_val, stream, format, deref_ref, - recurse + 1, pretty); + recurse + 1, pretty, current_language); } else fputs_filtered ("???", stream); @@ -548,7 +548,8 @@ pascal_value_print (struct value *val, s fprintf_filtered (stream, ") "); } } - return common_val_print (val, stream, format, 1, 0, pretty); + return common_val_print (val, stream, format, 1, 0, pretty, + current_language); } @@ -743,7 +744,8 @@ pascal_object_print_value_fields (struct v = value_from_longest (TYPE_FIELD_TYPE (type, i), unpack_field_as_long (type, valaddr, i)); - common_val_print (v, stream, format, 0, recurse + 1, pretty); + common_val_print (v, stream, format, 0, recurse + 1, + pretty, current_language); } } else @@ -774,7 +776,8 @@ pascal_object_print_value_fields (struct val_print (TYPE_FIELD_TYPE (type, i), valaddr, TYPE_FIELD_BITPOS (type, i) / 8, address + TYPE_FIELD_BITPOS (type, i) / 8, - stream, format, 0, recurse + 1, pretty); + stream, format, 0, recurse + 1, pretty, + current_language); } } annotate_field_end (); @@ -941,7 +944,8 @@ pascal_object_print_static_field (struct stream, format, recurse, pretty, NULL, 1); return; } - common_val_print (val, stream, format, 0, recurse, pretty); + common_val_print (val, stream, format, 0, recurse, pretty, + current_language); } extern initialize_file_ftype _initialize_pascal_valprint; /* -Wmissing-prototypes */ Index: scm-valprint.c =================================================================== --- scm-valprint.c (revision 161) +++ scm-valprint.c (revision 162) @@ -432,5 +432,6 @@ int scm_value_print (struct value *val, struct ui_file *stream, int format, enum val_prettyprint pretty) { - return (common_val_print (val, stream, format, 1, 0, pretty)); + return (common_val_print (val, stream, format, 1, 0, pretty, + current_language)); } Index: Makefile.in =================================================================== --- Makefile.in (revision 161) +++ Makefile.in (revision 162) @@ -2504,7 +2504,7 @@ mt-tdep.o: mt-tdep.c $(defs_h) $(frame_h $(symtab_h) $(dis_asm_h) $(arch_utils_h) $(gdbtypes_h) \ $(gdb_string_h) $(regcache_h) $(reggroups_h) $(gdbcore_h) \ $(trad_frame_h) $(inferior_h) $(dwarf2_frame_h) $(infcall_h) \ - $(gdb_assert_h) + $(gdb_assert_h) $(language_h) nbsd-nat.o: nbsd-nat.c $(defs_h) $(nbsd_nat_h) nbsd-tdep.o: nbsd-tdep.c $(defs_h) $(gdb_string_h) $(solib_svr4_h) nto-procfs.o: nto-procfs.c $(defs_h) $(gdb_dirent_h) $(exceptions_h) \ @@ -2685,7 +2685,7 @@ sh64-tdep.o: sh64-tdep.c $(defs_h) $(fra $(frame_unwind_h) $(dwarf2_frame_h) $(symtab_h) $(gdbtypes_h) \ $(gdbcmd_h) $(gdbcore_h) $(value_h) $(dis_asm_h) $(inferior_h) \ $(gdb_string_h) $(gdb_assert_h) $(arch_utils_h) $(regcache_h) \ - $(osabi_h) $(elf_bfd_h) $(elf_sh_h) $(gdb_sim_sh_h) + $(osabi_h) $(elf_bfd_h) $(elf_sh_h) $(gdb_sim_sh_h) $(language_h) shnbsd-nat.o: shnbsd-nat.c $(defs_h) $(inferior_h) $(sh_tdep_h) \ $(shnbsd_tdep_h) $(inf_ptrace_h) $(regcache_h) shnbsd-tdep.o: shnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) $(regset_h) \ @@ -3193,7 +3193,7 @@ mi-cmds.o: $(srcdir)/mi/mi-cmds.c $(defs $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmds.c mi-cmd-stack.o: $(srcdir)/mi/mi-cmd-stack.c $(defs_h) $(target_h) $(frame_h) \ $(value_h) $(mi_cmds_h) $(ui_out_h) $(symtab_h) $(block_h) \ - $(stack_h) $(dictionary_h) $(gdb_string_h) + $(stack_h) $(dictionary_h) $(gdb_string_h) $(language_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-stack.c mi-cmd-target.o: $(srcdir)/mi/mi-cmd-target.c $(defs_h) $(mi_cmds_h) \ $(mi_getopt_h) $(remote_h) @@ -3216,7 +3216,7 @@ mi-main.o: $(srcdir)/mi/mi-main.c $(defs $(gdb_string_h) $(exceptions_h) $(top_h) $(gdbthread_h) $(mi_cmds_h) \ $(mi_parse_h) $(mi_getopt_h) $(mi_console_h) $(ui_out_h) $(mi_out_h) \ $(interps_h) $(event_loop_h) $(event_top_h) $(gdbcore_h) $(value_h) \ - $(regcache_h) $(gdb_h) $(frame_h) $(mi_main_h) + $(regcache_h) $(gdb_h) $(frame_h) $(mi_main_h) $(language_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-main.c mi-out.o: $(srcdir)/mi/mi-out.c $(defs_h) $(ui_out_h) $(mi_out_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-out.c Index: stack.c =================================================================== --- stack.c (revision 161) +++ stack.c (revision 162) @@ -365,8 +365,18 @@ print_frame_args (struct symbol *func, s if (val) { + const struct language_defn *language; + + /* Use the appropriate language to display our symbol, + unless the user forced the language to a specific + language. */ + if (language_mode == language_mode_auto) + language = language_def (SYMBOL_LANGUAGE (sym)); + else + language = current_language; + common_val_print (val, stb->stream, 0, 0, 2, - Val_no_prettyprint); + Val_no_prettyprint, language); ui_out_field_stream (uiout, "value", stb); } else Index: cp-valprint.c =================================================================== --- cp-valprint.c (revision 161) +++ cp-valprint.c (revision 162) @@ -267,7 +267,8 @@ cp_print_value_fields (struct type *type (TYPE_FIELD_TYPE (type, i), unpack_field_as_long (type, valaddr + offset, i)); - common_val_print (v, stream, format, 0, recurse + 1, pretty); + common_val_print (v, stream, format, 0, recurse + 1, pretty, + current_language); } } else @@ -291,7 +292,8 @@ cp_print_value_fields (struct type *type val_print (TYPE_FIELD_TYPE (type, i), valaddr, offset + TYPE_FIELD_BITPOS (type, i) / 8, address + TYPE_FIELD_BITPOS (type, i) / 8, - stream, format, 0, recurse + 1, pretty); + stream, format, 0, recurse + 1, pretty, + current_language); } } annotate_field_end (); @@ -485,7 +487,7 @@ cp_print_static_field (struct type *type } val_print (type, value_contents_all (val), value_embedded_offset (val), VALUE_ADDRESS (val), - stream, format, 0, recurse, pretty); + stream, format, 0, recurse, pretty, current_language); } Index: sh64-tdep.c =================================================================== --- sh64-tdep.c (revision 161) +++ sh64-tdep.c (revision 162) @@ -47,6 +47,7 @@ #include "elf/sh.h" /* registers numbers shared with the simulator */ #include "gdb/sim-sh.h" +#include "language.h" /* Information that is dependent on the processor variant. */ enum sh_abi @@ -2109,10 +2110,10 @@ sh64_do_register (struct gdbarch *gdbarc fprintf_filtered (file, "*value not available*\n"); val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0, - file, 'x', 1, 0, Val_pretty_default); + file, 'x', 1, 0, Val_pretty_default, current_language); fprintf_filtered (file, "\t"); val_print (register_type (gdbarch, regnum), raw_buffer, 0, 0, - file, 0, 1, 0, Val_pretty_default); + file, 0, 1, 0, Val_pretty_default, current_language); fprintf_filtered (file, "\n"); } Index: printcmd.c =================================================================== --- printcmd.c (revision 161) +++ printcmd.c (revision 162) @@ -321,7 +321,8 @@ print_scalar_formatted (const void *vala again. */ if (format == 's') { - val_print (type, valaddr, 0, 0, stream, 0, 0, 0, Val_pretty_default); + val_print (type, valaddr, 0, 0, stream, 0, 0, 0, Val_pretty_default, + current_language); return; } Index: gdb.ada/lang_switch.exp =================================================================== --- gdb.ada/lang_switch.exp (revision 0) +++ gdb.ada/lang_switch.exp (revision 160) @@ -0,0 +1,56 @@ +# Copyright 2008 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +if $tracelevel then { + strace $tracelevel +} + +load_lib "ada.exp" + +set testdir "lang_switch" +set testfile "${testdir}/lang_switch" +set cfile "${testdir}/foo" +set adasrcfile ${srcdir}/${subdir}/${testfile}.adb +set csrcfile ${srcdir}/${subdir}/${cfile}.c +set cobject ${objdir}/${subdir}/${cfile}.o +set binfile ${objdir}/${subdir}/${testfile} + +file mkdir ${objdir}/${subdir}/${testdir} +gdb_compile "${csrcfile}" "${cobject}" object [list debug] +if {[gdb_compile_ada "${adasrcfile}" "${binfile}" executable [list debug]] != "" } { + return -1 +} + +gdb_exit +gdb_start +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.c] +runto "foo.c:$bp_location" + +# Make sure that the language is switched to Ada for the second frame +# by checking the string parameter. +gdb_test "bt" \ + ".*#1.*lang_switch\\.ada_procedure\\s*\\(msg=$hex\\).*" \ + "backtrace" + +# Now, make sure that the language doesn't get automatically switched +# if the current language is not "auto". +gdb_test "set lang c" +gdb_test "bt" \ + ".*#1.*lang_switch\\.ada_procedure\\s*\\(msg={.*\\).*" \ + "backtrace" + Index: gdb.ada/lang_switch/foo.c =================================================================== --- gdb.ada/lang_switch/foo.c (revision 0) +++ gdb.ada/lang_switch/foo.c (revision 160) @@ -0,0 +1,22 @@ +/* Copyright 2008 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +int +c_procedure (char* msg) +{ + return 0; /* STOP */ +} Index: gdb.ada/lang_switch/lang_switch.adb =================================================================== --- gdb.ada/lang_switch/lang_switch.adb (revision 0) +++ gdb.ada/lang_switch/lang_switch.adb (revision 160) @@ -0,0 +1,34 @@ +-- Copyright 2008 Free Software Foundation, Inc. +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +with System; + +procedure Lang_Switch is + pragma Linker_Options ("foo.o"); + + function C_Procedure (Msg : String) return Integer; + pragma Import(C, C_Procedure, "c_procedure"); + + procedure Ada_Procedure (Msg : String) is + C_Msg : String (1 .. 1024); + Tmp_Int : Integer; + begin + C_Msg (1 .. Msg'length + 1) := Msg & Ascii.Nul; + Tmp_Int := C_Procedure (Msg => C_Msg); + end Ada_Procedure; + +begin + Ada_Procedure ("msg"); +end Lang_Switch; -- Joel