Support -prompt and -lbl in gdb_test
[binutils-gdb.git] / gdb / stack.c
index bedadb0f491399e70cf4d3246be3687d132d760e..71d85985d18c0706f221c04b4e146f286996329d 100644 (file)
@@ -1,6 +1,6 @@
 /* Print and select stack frames for GDB, the GNU debugger.
 
-   Copyright (C) 1986-2021 Free Software Foundation, Inc.
+   Copyright (C) 1986-2022 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -55,6 +55,7 @@
 #include "gdbsupport/def-vector.h"
 #include "cli/cli-option.h"
 #include "cli/cli-style.h"
+#include "gdbsupport/buildargv.h"
 
 /* The possible choices of "set print frame-arguments", and the value
    of this setting.  */
@@ -398,8 +399,8 @@ print_frame_nameless_args (struct frame_info *frame, long start, int num,
       arg_value = read_memory_integer (argsaddr + start,
                                       sizeof (int), byte_order);
       if (!first)
-       fprintf_filtered (stream, ", ");
-      fprintf_filtered (stream, "%ld", arg_value);
+       gdb_printf (stream, ", ");
+      gdb_printf (stream, "%ld", arg_value);
       first = 0;
       start += sizeof (int);
     }
@@ -427,14 +428,14 @@ print_frame_arg (const frame_print_options &fp_opts,
 
   annotate_arg_emitter arg_emitter;
   ui_out_emit_tuple tuple_emitter (uiout, NULL);
-  fputs_filtered (arg->sym->print_name (), &stb);
+  gdb_puts (arg->sym->print_name (), &stb);
   if (arg->entry_kind == print_entry_values_compact)
     {
       /* It is OK to provide invalid MI-like stream as with
         PRINT_ENTRY_VALUE_COMPACT we never use MI.  */
       stb.puts ("=");
 
-      fputs_filtered (arg->sym->print_name (), &stb);
+      gdb_puts (arg->sym->print_name (), &stb);
     }
   if (arg->entry_kind == print_entry_values_only
       || arg->entry_kind == print_entry_values_compact)
@@ -673,7 +674,7 @@ read_frame_arg (const frame_print_options &fp_opts,
          || (fp_opts.print_entry_values == print_entry_values_preferred
              && (!val || value_optimized_out (val))))
        {
-         entryval = allocate_optimized_out_value (SYMBOL_TYPE (sym));
+         entryval = allocate_optimized_out_value (sym->type ());
          entryval_error = NULL;
        }
     }
@@ -749,7 +750,7 @@ print_frame_args (const frame_print_options &fp_opts,
 
   if (func)
     {
-      const struct block *b = SYMBOL_BLOCK_VALUE (func);
+      const struct block *b = func->value_block ();
       struct block_iterator iter;
       struct symbol *sym;
 
@@ -762,7 +763,7 @@ print_frame_args (const frame_print_options &fp_opts,
          /* Keep track of the highest stack argument offset seen, and
             skip over any kinds of symbols we don't care about.  */
 
-         if (!SYMBOL_IS_ARGUMENT (sym))
+         if (!sym->is_argument ())
            continue;
 
          if (!print_names)
@@ -772,13 +773,13 @@ print_frame_args (const frame_print_options &fp_opts,
              break;
            }
 
-         switch (SYMBOL_CLASS (sym))
+         switch (sym->aclass ())
            {
            case LOC_ARG:
            case LOC_REF_ARG:
              {
-               long current_offset = SYMBOL_VALUE (sym);
-               int arg_size = TYPE_LENGTH (SYMBOL_TYPE (sym));
+               long current_offset = sym->value_longest ();
+               int arg_size = TYPE_LENGTH (sym->type ());
 
                /* Compute address of next argument by adding the size of
                   this argument and rounding to an int boundary.  */
@@ -827,8 +828,8 @@ print_frame_args (const frame_print_options &fp_opts,
              nsym = lookup_symbol_search_name (sym->search_name (),
                                                b, VAR_DOMAIN).symbol;
              gdb_assert (nsym != NULL);
-             if (SYMBOL_CLASS (nsym) == LOC_REGISTER
-                 && !SYMBOL_IS_ARGUMENT (nsym))
+             if (nsym->aclass () == LOC_REGISTER
+                 && !nsym->is_argument ())
                {
                  /* There is a LOC_ARG/LOC_REGISTER pair.  This means
                     that it was passed on the stack and loaded into a
@@ -874,7 +875,7 @@ print_frame_args (const frame_print_options &fp_opts,
          /* Print the current arg.  */
          if (!first)
            uiout->text (", ");
-         uiout->wrap_hint ("    ");
+         uiout->wrap_hint (4);
 
          if (!print_args)
            {
@@ -894,7 +895,7 @@ print_frame_args (const frame_print_options &fp_opts,
              if (arg.entry_kind != print_entry_values_only)
                {
                  uiout->text (", ");
-                 uiout->wrap_hint ("    ");
+                 uiout->wrap_hint (4);
                }
 
              print_frame_arg (fp_opts, &entryarg);
@@ -948,10 +949,10 @@ show_disassemble_next_line (struct ui_file *file, int from_tty,
                                 struct cmd_list_element *c,
                                 const char *value)
 {
-  fprintf_filtered (file,
-                   _("Debugger's willingness to use "
-                     "disassemble-next-line is %s.\n"),
-                   value);
+  gdb_printf (file,
+             _("Debugger's willingness to use "
+               "disassemble-next-line is %s.\n"),
+             value);
 }
 
 /* Use TRY_CATCH to catch the exception from the gdb_disassembly
@@ -1365,9 +1366,9 @@ print_frame (const frame_print_options &fp_opts,
     annotate_frame_function_name ();
 
     string_file stb;
-    fputs_filtered (funname ? funname.get () : "??", &stb);
+    gdb_puts (funname ? funname.get () : "??", &stb);
     uiout->field_stream ("func", stb, function_name_style.style ());
-    uiout->wrap_hint ("   ");
+    uiout->wrap_hint (3);
     annotate_frame_args ();
 
     uiout->text (" (");
@@ -1405,7 +1406,7 @@ print_frame (const frame_print_options &fp_opts,
       
        filename_display = symtab_to_filename_for_display (sal.symtab);
        annotate_frame_source_begin ();
-       uiout->wrap_hint ("   ");
+       uiout->wrap_hint (3);
        uiout->text (" at ");
        annotate_frame_source_file ();
        uiout->field_string ("file", filename_display,
@@ -1432,7 +1433,7 @@ print_frame (const frame_print_options &fp_opts,
        if (lib)
          {
            annotate_frame_where ();
-           uiout->wrap_hint ("  ");
+           uiout->wrap_hint (2);
            uiout->text (" from ");
            uiout->field_string ("from", lib, file_name_style.style ());
          }
@@ -1541,37 +1542,37 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
 
   if (selected_frame_p && frame_relative_level (fi) >= 0)
     {
-      printf_filtered (_("Stack level %d, frame at "),
-                      frame_relative_level (fi));
+      gdb_printf (_("Stack level %d, frame at "),
+                 frame_relative_level (fi));
     }
   else
     {
-      printf_filtered (_("Stack frame at "));
+      gdb_printf (_("Stack frame at "));
     }
-  fputs_filtered (paddress (gdbarch, get_frame_base (fi)), gdb_stdout);
-  printf_filtered (":\n");
-  printf_filtered (" %s = ", pc_regname);
+  gdb_puts (paddress (gdbarch, get_frame_base (fi)));
+  gdb_printf (":\n");
+  gdb_printf (" %s = ", pc_regname);
   if (frame_pc_p)
-    fputs_filtered (paddress (gdbarch, get_frame_pc (fi)), gdb_stdout);
+    gdb_puts (paddress (gdbarch, get_frame_pc (fi)));
   else
     fputs_styled ("<unavailable>", metadata_style.style (), gdb_stdout);
 
-  wrap_here ("   ");
+  gdb_stdout->wrap_here (3);
   if (funname)
     {
-      printf_filtered (" in ");
-      fputs_filtered (funname, gdb_stdout);
+      gdb_printf (" in ");
+      gdb_puts (funname);
     }
-  wrap_here ("   ");
+  gdb_stdout->wrap_here (3);
   if (sal.symtab)
-    printf_filtered
+    gdb_printf
       (" (%ps:%d)",
        styled_string (file_name_style.style (),
                      symtab_to_filename_for_display (sal.symtab)),
        sal.line);
-  puts_filtered ("; ");
-  wrap_here ("    ");
-  printf_filtered ("saved %s = ", pc_regname);
+  gdb_puts ("; ");
+  gdb_stdout->wrap_here (4);
+  gdb_printf ("saved %s = ", pc_regname);
 
   if (!frame_id_p (frame_unwind_caller_id (fi)))
     val_print_not_saved (gdb_stdout);
@@ -1602,8 +1603,8 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
     }
 
   if (caller_pc_p)
-    fputs_filtered (paddress (gdbarch, caller_pc), gdb_stdout);
-  printf_filtered ("\n");
+    gdb_puts (paddress (gdbarch, caller_pc));
+  gdb_printf ("\n");
 
   if (calling_frame_info == NULL)
     {
@@ -1611,35 +1612,33 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
 
       reason = get_frame_unwind_stop_reason (fi);
       if (reason != UNWIND_NO_REASON)
-       printf_filtered (_(" Outermost frame: %s\n"),
-                        frame_stop_reason_string (fi));
+       gdb_printf (_(" Outermost frame: %s\n"),
+                   frame_stop_reason_string (fi));
     }
   else if (get_frame_type (fi) == TAILCALL_FRAME)
-    puts_filtered (" tail call frame");
+    gdb_puts (" tail call frame");
   else if (get_frame_type (fi) == INLINE_FRAME)
-    printf_filtered (" inlined into frame %d",
-                    frame_relative_level (get_prev_frame (fi)));
+    gdb_printf (" inlined into frame %d",
+               frame_relative_level (get_prev_frame (fi)));
   else
     {
-      printf_filtered (" called by frame at ");
-      fputs_filtered (paddress (gdbarch, get_frame_base (calling_frame_info)),
-                     gdb_stdout);
+      gdb_printf (" called by frame at ");
+      gdb_puts (paddress (gdbarch, get_frame_base (calling_frame_info)));
     }
   if (get_next_frame (fi) && calling_frame_info)
-    puts_filtered (",");
-  wrap_here ("   ");
+    gdb_puts (",");
+  gdb_stdout->wrap_here (3);
   if (get_next_frame (fi))
     {
-      printf_filtered (" caller of frame at ");
-      fputs_filtered (paddress (gdbarch, get_frame_base (get_next_frame (fi))),
-                     gdb_stdout);
+      gdb_printf (" caller of frame at ");
+      gdb_puts (paddress (gdbarch, get_frame_base (get_next_frame (fi))));
     }
   if (get_next_frame (fi) || calling_frame_info)
-    puts_filtered ("\n");
+    gdb_puts ("\n");
 
   if (s)
-    printf_filtered (" source language %s.\n",
-                    language_str (s->language));
+    gdb_printf (" source language %s.\n",
+               language_str (s->language ()));
 
   {
     /* Address of the argument list for this frame, or 0.  */
@@ -1648,32 +1647,32 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
     int numargs;
 
     if (arg_list == 0)
-      printf_filtered (" Arglist at unknown address.\n");
+      gdb_printf (" Arglist at unknown address.\n");
     else
       {
-       printf_filtered (" Arglist at ");
-       fputs_filtered (paddress (gdbarch, arg_list), gdb_stdout);
-       printf_filtered (",");
+       gdb_printf (" Arglist at ");
+       gdb_puts (paddress (gdbarch, arg_list));
+       gdb_printf (",");
 
        if (!gdbarch_frame_num_args_p (gdbarch))
          {
            numargs = -1;
-           puts_filtered (" args: ");
+           gdb_puts (" args: ");
          }
        else
          {
            numargs = gdbarch_frame_num_args (gdbarch, fi);
            gdb_assert (numargs >= 0);
            if (numargs == 0)
-             puts_filtered (" no args.");
+             gdb_puts (" no args.");
            else if (numargs == 1)
-             puts_filtered (" 1 arg: ");
+             gdb_puts (" 1 arg: ");
            else
-             printf_filtered (" %d args: ", numargs);
+             gdb_printf (" %d args: ", numargs);
          }
        print_frame_args (user_frame_print_options,
                          func, fi, numargs, gdb_stdout);
-       puts_filtered ("\n");
+       gdb_puts ("\n");
       }
   }
   {
@@ -1681,12 +1680,12 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
     CORE_ADDR arg_list = get_frame_locals_address (fi);
 
     if (arg_list == 0)
-      printf_filtered (" Locals at unknown address,");
+      gdb_printf (" Locals at unknown address,");
     else
       {
-       printf_filtered (" Locals at ");
-       fputs_filtered (paddress (gdbarch, arg_list), gdb_stdout);
-       printf_filtered (",");
+       gdb_printf (" Locals at ");
+       gdb_puts (paddress (gdbarch, arg_list));
+       gdb_printf (",");
       }
   }
 
@@ -1716,25 +1715,24 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
                enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
                int sp_size = register_size (gdbarch, sp_regnum);
 
-               sp = extract_unsigned_integer (value_contents_all (value),
-                                              sp_size, byte_order);
+               sp = extract_unsigned_integer
+                 (value_contents_all (value).data (), sp_size, byte_order);
 
-               printf_filtered (" Previous frame's sp is ");
-               fputs_filtered (paddress (gdbarch, sp), gdb_stdout);
-               printf_filtered ("\n");
+               gdb_printf (" Previous frame's sp is ");
+               gdb_puts (paddress (gdbarch, sp));
+               gdb_printf ("\n");
              }
            else if (VALUE_LVAL (value) == lval_memory)
              {
-               printf_filtered (" Previous frame's sp at ");
-               fputs_filtered (paddress (gdbarch, value_address (value)),
-                               gdb_stdout);
-               printf_filtered ("\n");
+               gdb_printf (" Previous frame's sp at ");
+               gdb_puts (paddress (gdbarch, value_address (value)));
+               gdb_printf ("\n");
              }
            else if (VALUE_LVAL (value) == lval_register)
              {
-               printf_filtered (" Previous frame's sp in %s\n",
-                                gdbarch_register_name (gdbarch,
-                                                       VALUE_REGNUM (value)));
+               gdb_printf (" Previous frame's sp in %s\n",
+                           gdbarch_register_name (gdbarch,
+                                                  VALUE_REGNUM (value)));
              }
 
            release_value (value);
@@ -1764,18 +1762,18 @@ info_frame_command_core (struct frame_info *fi, bool selected_frame_p)
          if (!optimized && !unavailable && lval == lval_memory)
            {
              if (count == 0)
-               puts_filtered (" Saved registers:\n ");
+               gdb_puts (" Saved registers:\n ");
              else
-               puts_filtered (",");
-             wrap_here (" ");
-             printf_filtered (" %s at ",
-                              gdbarch_register_name (gdbarch, i));
-             fputs_filtered (paddress (gdbarch, addr), gdb_stdout);
+               gdb_puts (",");
+             gdb_stdout->wrap_here (1);
+             gdb_printf (" %s at ",
+                         gdbarch_register_name (gdbarch, i));
+             gdb_puts (paddress (gdbarch, addr));
              count++;
            }
        }
     if (count || need_nl)
-      puts_filtered ("\n");
+      gdb_puts ("\n");
   }
 }
 
@@ -1843,14 +1841,6 @@ select_frame_command_core (struct frame_info *fi, bool ignored)
     gdb::observers::user_selected_context_changed.notify (USER_SELECTED_FRAME);
 }
 
-/* See stack.h.  */
-
-void
-select_frame_for_mi (struct frame_info *fi)
-{
-  select_frame_command_core (fi, false /* Ignored.  */);
-}
-
 /* The core of all the "frame" sub-commands.  Select frame FI, and if this
    means we change frame send out a change notification (otherwise, just
    reprint the current frame summary).   */
@@ -2099,7 +2089,7 @@ backtrace_command_1 (const frame_print_options &fp_opts,
 
       /* If we've stopped before the end, mention that.  */
       if (fi && from_tty)
-       printf_filtered (_("(More stack frames follow...)\n"));
+       gdb_printf (_("(More stack frames follow...)\n"));
 
       /* If we've run out of frames, and the reason appears to be an error
         condition, print it.  */
@@ -2109,8 +2099,8 @@ backtrace_command_1 (const frame_print_options &fp_opts,
 
          reason = get_frame_unwind_stop_reason (trailing);
          if (reason >= UNWIND_FIRST_ERROR)
-           printf_filtered (_("Backtrace stopped: %s\n"),
-                            frame_stop_reason_string (trailing));
+           gdb_printf (_("Backtrace stopped: %s\n"),
+                       frame_stop_reason_string (trailing));
        }
     }
 }
@@ -2237,20 +2227,18 @@ backtrace_command_completer (struct cmd_list_element *ignore,
   expression_completer (ignore, tracker, text, word);
 }
 
-/* Iterate over the local variables of a block B, calling CB with
-   CB_DATA.  */
+/* Iterate over the local variables of a block B, calling CB.  */
 
 static void
 iterate_over_block_locals (const struct block *b,
-                          iterate_over_block_arg_local_vars_cb cb,
-                          void *cb_data)
+                          iterate_over_block_arg_local_vars_cb cb)
 {
   struct block_iterator iter;
   struct symbol *sym;
 
   ALL_BLOCK_SYMBOLS (b, iter, sym)
     {
-      switch (SYMBOL_CLASS (sym))
+      switch (sym->aclass ())
        {
        case LOC_CONST:
        case LOC_LOCAL:
@@ -2258,11 +2246,11 @@ iterate_over_block_locals (const struct block *b,
        case LOC_STATIC:
        case LOC_COMPUTED:
        case LOC_OPTIMIZED_OUT:
-         if (SYMBOL_IS_ARGUMENT (sym))
+         if (sym->is_argument ())
            break;
-         if (SYMBOL_DOMAIN (sym) == COMMON_BLOCK_DOMAIN)
+         if (sym->domain () == COMMON_BLOCK_DOMAIN)
            break;
-         (*cb) (sym->print_name (), sym, cb_data);
+         cb (sym->print_name (), sym);
          break;
 
        default:
@@ -2277,18 +2265,17 @@ iterate_over_block_locals (const struct block *b,
 
 void
 iterate_over_block_local_vars (const struct block *block,
-                              iterate_over_block_arg_local_vars_cb cb,
-                              void *cb_data)
+                              iterate_over_block_arg_local_vars_cb cb)
 {
   while (block)
     {
-      iterate_over_block_locals (block, cb, cb_data);
+      iterate_over_block_locals (block, cb);
       /* After handling the function's top-level block, stop.  Don't
         continue to its superblock, the block of per-file
         symbols.  */
-      if (BLOCK_FUNCTION (block))
+      if (block->function ())
        break;
-      block = BLOCK_SUPERBLOCK (block);
+      block = block->superblock ();
     }
 }
 
@@ -2303,41 +2290,40 @@ struct print_variable_and_value_data
   int num_tabs;
   struct ui_file *stream;
   int values_printed;
+
+  void operator() (const char *print_name, struct symbol *sym);
 };
 
 /* The callback for the locals and args iterators.  */
 
-static void
-do_print_variable_and_value (const char *print_name,
-                            struct symbol *sym,
-                            void *cb_data)
+void
+print_variable_and_value_data::operator() (const char *print_name,
+                                          struct symbol *sym)
 {
-  struct print_variable_and_value_data *p
-    = (struct print_variable_and_value_data *) cb_data;
   struct frame_info *frame;
 
-  if (p->preg.has_value ()
-      && p->preg->exec (sym->natural_name (), 0, NULL, 0) != 0)
+  if (preg.has_value ()
+      && preg->exec (sym->natural_name (), 0, NULL, 0) != 0)
     return;
-  if (p->treg.has_value ()
-      && !treg_matches_sym_type_name (*p->treg, sym))
+  if (treg.has_value ()
+      && !treg_matches_sym_type_name (*treg, sym))
     return;
   if (language_def (sym->language ())->symbol_printing_suppressed (sym))
     return;
 
-  frame = frame_find_by_id (p->frame_id);
+  frame = frame_find_by_id (frame_id);
   if (frame == NULL)
     {
       warning (_("Unable to restore previously selected frame."));
       return;
     }
 
-  print_variable_and_value (print_name, sym, frame, p->stream, p->num_tabs);
+  print_variable_and_value (print_name, sym, frame, stream, num_tabs);
 
   /* print_variable_and_value invalidates FRAME.  */
   frame = NULL;
 
-  p->values_printed = 1;
+  values_printed = 1;
 }
 
 /* Prepares the regular expression REG from REGEXP.
@@ -2380,8 +2366,8 @@ print_frame_local_vars (struct frame_info *frame,
   if (!get_frame_pc_if_available (frame, &pc))
     {
       if (!quiet)
-       fprintf_filtered (stream,
-                         _("PC unavailable, cannot determine locals.\n"));
+       gdb_printf (stream,
+                   _("PC unavailable, cannot determine locals.\n"));
       return;
     }
 
@@ -2389,7 +2375,7 @@ print_frame_local_vars (struct frame_info *frame,
   if (block == 0)
     {
       if (!quiet)
-       fprintf_filtered (stream, "No symbol table info available.\n");
+       gdb_printf (stream, "No symbol table info available.\n");
       return;
     }
 
@@ -2406,16 +2392,14 @@ print_frame_local_vars (struct frame_info *frame,
   scoped_restore_selected_frame restore_selected_frame;
   select_frame (frame);
 
-  iterate_over_block_local_vars (block,
-                                do_print_variable_and_value,
-                                &cb_data);
+  iterate_over_block_local_vars (block, cb_data);
 
   if (!cb_data.values_printed && !quiet)
     {
       if (regexp == NULL && t_regexp == NULL)
-       fprintf_filtered (stream, _("No locals.\n"));
+       gdb_printf (stream, _("No locals.\n"));
       else
-       fprintf_filtered (stream, _("No matching locals.\n"));
+       gdb_printf (stream, _("No matching locals.\n"));
     }
 }
 
@@ -2496,8 +2480,7 @@ info_locals_command (const char *args, int from_tty)
 
 void
 iterate_over_block_arg_vars (const struct block *b,
-                            iterate_over_block_arg_local_vars_cb cb,
-                            void *cb_data)
+                            iterate_over_block_arg_local_vars_cb cb)
 {
   struct block_iterator iter;
   struct symbol *sym, *sym2;
@@ -2505,7 +2488,7 @@ iterate_over_block_arg_vars (const struct block *b,
   ALL_BLOCK_SYMBOLS (b, iter, sym)
     {
       /* Don't worry about things which aren't arguments.  */
-      if (SYMBOL_IS_ARGUMENT (sym))
+      if (sym->is_argument ())
        {
          /* We have to look up the symbol because arguments can have
             two entries (one a parameter, one a local) and the one we
@@ -2520,7 +2503,7 @@ iterate_over_block_arg_vars (const struct block *b,
 
          sym2 = lookup_symbol_search_name (sym->search_name (),
                                            b, VAR_DOMAIN).symbol;
-         (*cb) (sym->print_name (), sym2, cb_data);
+         cb (sym->print_name (), sym2);
        }
     }
 }
@@ -2551,8 +2534,8 @@ print_frame_arg_vars (struct frame_info *frame,
   if (!get_frame_pc_if_available (frame, &pc))
     {
       if (!quiet)
-       fprintf_filtered (stream,
-                         _("PC unavailable, cannot determine args.\n"));
+       gdb_printf (stream,
+                   _("PC unavailable, cannot determine args.\n"));
       return;
     }
 
@@ -2560,7 +2543,7 @@ print_frame_arg_vars (struct frame_info *frame,
   if (func == NULL)
     {
       if (!quiet)
-       fprintf_filtered (stream, _("No symbol table info available.\n"));
+       gdb_printf (stream, _("No symbol table info available.\n"));
       return;
     }
 
@@ -2571,8 +2554,7 @@ print_frame_arg_vars (struct frame_info *frame,
   cb_data.stream = stream;
   cb_data.values_printed = 0;
 
-  iterate_over_block_arg_vars (SYMBOL_BLOCK_VALUE (func),
-                              do_print_variable_and_value, &cb_data);
+  iterate_over_block_arg_vars (func->value_block (), cb_data);
 
   /* do_print_variable_and_value invalidates FRAME.  */
   frame = NULL;
@@ -2580,9 +2562,9 @@ print_frame_arg_vars (struct frame_info *frame,
   if (!cb_data.values_printed && !quiet)
     {
       if (regexp == NULL && t_regexp == NULL)
-       fprintf_filtered (stream, _("No arguments.\n"));
+       gdb_printf (stream, _("No arguments.\n"));
       else
-       fprintf_filtered (stream, _("No matching arguments.\n"));
+       gdb_printf (stream, _("No matching arguments.\n"));
     }
 }
 
@@ -2739,7 +2721,7 @@ return_command (const char *retval_exp, int from_tty)
   struct symbol *thisfun;
   struct value *return_value = NULL;
   struct value *function = NULL;
-  const char *query_prefix = "";
+  std::string query_prefix;
 
   thisframe = get_selected_frame ("No selected frame.");
   thisfun = get_frame_function (thisframe);
@@ -2764,7 +2746,7 @@ return_command (const char *retval_exp, int from_tty)
       /* Cast return value to the return type of the function.  Should
         the cast fail, this call throws an error.  */
       if (thisfun != NULL)
-       return_type = TYPE_TARGET_TYPE (SYMBOL_TYPE (thisfun));
+       return_type = TYPE_TARGET_TYPE (thisfun->type ());
       if (return_type == NULL)
        {
          if (retval_expr->first_opcode () != UNOP_CAST
@@ -2795,6 +2777,17 @@ return_command (const char *retval_exp, int from_tty)
        return_value = NULL;
       else if (thisfun != NULL)
        {
+         if (is_nocall_function (check_typedef (value_type (function))))
+           {
+             query_prefix =
+               string_printf ("Function '%s' does not follow the target "
+                              "calling convention.\n"
+                              "If you continue, setting the return value "
+                              "will probably lead to unpredictable "
+                              "behaviors.\n",
+                              thisfun->print_name ());
+           }
+
          rv_conv = struct_return_convention (gdbarch, function, return_type);
          if (rv_conv == RETURN_VALUE_STRUCT_CONVENTION
              || rv_conv == RETURN_VALUE_ABI_RETURNS_ADDRESS)
@@ -2817,12 +2810,13 @@ return_command (const char *retval_exp, int from_tty)
 
       if (thisfun == NULL)
        confirmed = query (_("%sMake selected stack frame return now? "),
-                          query_prefix);
+                          query_prefix.c_str ());
       else
        {
-         if (TYPE_NO_RETURN (thisfun->type))
+         if (TYPE_NO_RETURN (thisfun->type ()))
            warning (_("Function does not return normally to caller."));
-         confirmed = query (_("%sMake %s return now? "), query_prefix,
+         confirmed = query (_("%sMake %s return now? "),
+                            query_prefix.c_str (),
                             thisfun->print_name ());
        }
       if (!confirmed)
@@ -2842,7 +2836,7 @@ return_command (const char *retval_exp, int from_tty)
                  && rv_conv != RETURN_VALUE_ABI_RETURNS_ADDRESS);
       gdbarch_return_value (cache_arch, function, return_type,
                            get_current_regcache (), NULL /*read*/,
-                           value_contents (return_value) /*write*/);
+                           value_contents (return_value).data () /*write*/);
     }
 
   /* If we are at the end of a call dummy now, pop the dummy frame
@@ -2909,24 +2903,6 @@ find_frame_for_function (const char *function_name)
   return frame;
 }
 
-/* Implements the dbx 'func' command.  */
-
-static void
-func_command (const char *arg, int from_tty)
-{
-  if (arg == NULL)
-    return;
-
-  struct frame_info *frame = find_frame_for_function (arg);
-  if (frame == NULL)
-    error (_("'%s' not within current stack frame."), arg);
-  if (frame != get_selected_frame (NULL))
-    {
-      select_frame (frame);
-      print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
-    }
-}
-
 /* The qcs command line flags for the "frame apply" commands.  Keep
    this in sync with the "thread apply" commands.  */
 
@@ -3037,7 +3013,7 @@ frame_apply_command_count (const char *which_command,
            {
              if (!flags.quiet)
                print_stack_frame (fi, 1, LOCATION, 0);
-             printf_filtered ("%s", cmd_result.c_str ());
+             gdb_printf ("%s", cmd_result.c_str ());
            }
        }
       catch (const gdb_exception_error &ex)
@@ -3049,7 +3025,7 @@ frame_apply_command_count (const char *which_command,
              if (!flags.quiet)
                print_stack_frame (fi, 1, LOCATION, 0);
              if (flags.cont)
-               printf_filtered ("%s\n", ex.what ());
+               gdb_printf ("%s\n", ex.what ());
              else
                throw;
            }
@@ -3566,11 +3542,6 @@ Prints the argument variables of the current stack frame.\n"),
                                        false));
   set_cmd_completer_handle_brkchars (cmd, info_print_command_completer);
 
-  if (dbx_commands)
-    add_com ("func", class_stack, func_command, _("\
-Select the stack frame that contains NAME.\n\
-Usage: func NAME"));
-
   /* Install "set print raw frame-arguments", a deprecated spelling of
      "set print raw-frame-arguments".  */
   set_show_commands set_show_frame_args