*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / stack.c
index 237ded107d1aaf31c6feed2da34184e197b9fd81..f09283fd555450c03cf6132e8bf427acd19fb504 100644 (file)
 
 void (*deprecated_selected_frame_level_changed_hook) (int);
 
+/* The possible choices of "set print frame-arguments, and the value
+   of this setting.  */
+
+static const char *print_frame_arguments_choices[] =
+  {"all", "scalars", "none", NULL};
+static const char *print_frame_arguments = "all";
+
 /* Prototypes for local functions. */
 
 static void print_frame_local_vars (struct frame_info *, int,
@@ -148,6 +155,46 @@ print_frame_nameless_args (struct frame_info *frame, long start, int num,
     }
 }
 
+/* Return non-zero if the debugger should print the value of the provided
+   symbol parameter (SYM).  */
+
+static int
+print_this_frame_argument_p (struct symbol *sym)
+{
+  struct type *type;
+  
+  /* If the user asked to print no argument at all, then obviously
+     do not print this argument.  */
+
+  if (strcmp (print_frame_arguments, "none") == 0)
+    return 0;
+
+  /* If the user asked to print all arguments, then we should print
+     that one.  */
+
+  if (strcmp (print_frame_arguments, "all") == 0)
+    return 1;
+
+  /* The user asked to print only the scalar arguments, so do not
+     print the non-scalar ones.  */
+
+  type = CHECK_TYPEDEF (SYMBOL_TYPE (sym));
+  while (TYPE_CODE (type) == TYPE_CODE_REF)
+    type = CHECK_TYPEDEF (TYPE_TARGET_TYPE (type));
+  switch (TYPE_CODE (type))
+    {
+      case TYPE_CODE_ARRAY:
+      case TYPE_CODE_STRUCT:
+      case TYPE_CODE_UNION:
+      case TYPE_CODE_SET:
+      case TYPE_CODE_STRING:
+      case TYPE_CODE_BITSTRING:
+        return 0;
+      default:
+        return 1;
+    }
+}
+
 /* Print the arguments of frame FRAME on STREAM, given the function
    FUNC running in that frame (as a symbol), where NUM is the number
    of arguments according to the stack frame (or -1 if the number of
@@ -304,23 +351,30 @@ print_frame_args (struct symbol *func, struct frame_info *frame,
          annotate_arg_name_end ();
          ui_out_text (uiout, "=");
 
-         /* Avoid value_print because it will deref ref parameters.
-            We just want to print their addresses.  Print ??? for
-            args whose address we do not know.  We pass 2 as
-            "recurse" to val_print because our standard indentation
-            here is 4 spaces, and val_print indents 2 for each
-            recurse.  */
-         val = read_var_value (sym, frame);
-
-         annotate_arg_value (val == NULL ? NULL : value_type (val));
+          if (print_this_frame_argument_p (sym))
+            {
+             /* Avoid value_print because it will deref ref parameters.
+                We just want to print their addresses.  Print ??? for
+                args whose address we do not know.  We pass 2 as
+                "recurse" to val_print because our standard indentation
+                here is 4 spaces, and val_print indents 2 for each
+                recurse.  */
+             val = read_var_value (sym, frame);
+
+             annotate_arg_value (val == NULL ? NULL : value_type (val));
+
+             if (val)
+               {
+                 common_val_print (val, stb->stream, 0, 0, 2,
+                                   Val_no_prettyprint);
+                 ui_out_field_stream (uiout, "value", stb);
+               }
+             else
+               ui_out_text (uiout, "???");
+            }
+          else
+            ui_out_text (uiout, "...");
 
-         if (val)
-           {
-             common_val_print (val, stb->stream, 0, 0, 2, Val_no_prettyprint);
-             ui_out_field_stream (uiout, "value", stb);
-           }
-         else
-           ui_out_text (uiout, "???");
 
          /* Invoke ui_out_tuple_end.  */
          do_cleanups (list_chain);
@@ -355,11 +409,12 @@ static int
 print_args_stub (void *args)
 {
   struct print_args_args *p = args;
+  struct gdbarch *gdbarch = get_frame_arch (p->frame);
   int numargs;
 
-  if (gdbarch_frame_num_args_p (current_gdbarch))
+  if (gdbarch_frame_num_args_p (gdbarch))
     {
-      numargs = gdbarch_frame_num_args (current_gdbarch, p->frame);
+      numargs = gdbarch_frame_num_args (gdbarch, p->frame);
       gdb_assert (numargs >= 0);
     }
   else
@@ -839,15 +894,15 @@ frame_info (char *addr_exp, int from_tty)
   struct gdbarch *gdbarch;
 
   fi = parse_frame_specification_1 (addr_exp, "No stack.", &selected_frame_p);
+  gdbarch = get_frame_arch (fi);
 
   /* Name of the value returned by get_frame_pc().  Per comments, "pc"
      is not a good name.  */
-  if (gdbarch_pc_regnum (current_gdbarch) >= 0)
+  if (gdbarch_pc_regnum (gdbarch) >= 0)
     /* OK, this is weird.  The gdbarch_pc_regnum hardware register's value can
        easily not match that of the internal value returned by
        get_frame_pc().  */
-    pc_regname = gdbarch_register_name (current_gdbarch,
-                                       gdbarch_pc_regnum (current_gdbarch));
+    pc_regname = gdbarch_register_name (gdbarch, gdbarch_pc_regnum (gdbarch));
   else
     /* But then, this is weird to.  Even without gdbarch_pc_regnum, an
        architectures will often have a hardware register called "pc",
@@ -856,7 +911,6 @@ frame_info (char *addr_exp, int from_tty)
     pc_regname = "pc";
 
   find_frame_sal (fi, &sal);
-  gdbarch = get_frame_arch (fi);
   func = get_frame_function (fi);
   /* FIXME: cagney/2002-11-28: Why bother?  Won't sal.symtab contain
      the same value?  */
@@ -1417,6 +1471,9 @@ static void
 print_frame_label_vars (struct frame_info *frame, int this_level_only,
                        struct ui_file *stream)
 {
+#if 1
+  fprintf_filtered (stream, "print_frame_label_vars disabled.\n");
+#else
   struct blockvector *bl;
   struct block *block = get_frame_block (frame, 0);
   int values_printed = 0;
@@ -1477,6 +1534,7 @@ print_frame_label_vars (struct frame_info *frame, int this_level_only,
 
   if (!values_printed && !this_level_only)
     fprintf_filtered (stream, _("No catches.\n"));
+#endif
 }
 
 void
@@ -1491,22 +1549,9 @@ catch_info (char *ignore, int from_tty)
 {
   struct symtab_and_line *sal;
 
-  /* Check for target support for exception handling */
-  sal = target_enable_exception_callback (EX_EVENT_CATCH, 1);
-  if (sal)
-    {
-      /* Currently not handling this.  Ideally, here we should
-         interact with the C++ runtime system to find the list of
-         active handlers, etc.  */
-      fprintf_filtered (gdb_stdout, _("\
-Info catch not supported with this target/compiler combination.\n"));
-    }
-  else
-    {
-      /* Assume g++ compiled code; old GDB 4.16 behaviour.  */
-      print_frame_label_vars (get_selected_frame (_("No frame selected.")),
-                             0, gdb_stdout);
-    }
+  /* Assume g++ compiled code; old GDB 4.16 behaviour.  */
+  print_frame_label_vars (get_selected_frame (_("No frame selected.")),
+                          0, gdb_stdout);
 }
 
 static void
@@ -2039,6 +2084,12 @@ Usage: func <name>\n"));
   add_info ("catch", catch_info,
            _("Exceptions that can be caught in the current stack frame."));
 
+  add_setshow_enum_cmd ("frame-arguments", class_stack,
+                       print_frame_arguments_choices, &print_frame_arguments,
+                       _("Set printing of non-scalar frame arguments"),
+                       _("Show printing of non-scalar frame arguments"),
+                       NULL, NULL, NULL, &setprintlist, &showprintlist);
+
 #if 0
   add_cmd ("backtrace-limit", class_stack, set_backtrace_limit_command, _(\
 "Specify maximum number of frames for \"backtrace\" to print by default."),
This page took 0.025872 seconds and 4 git commands to generate.