Introduce gdb_argv, a class wrapper for buildargv
[deliverable/binutils-gdb.git] / gdb / stack.c
index 6cd4110b7fdb8e0413c554fe77c106f5c36e212a..3e9dca2d5c55844beeec2584f26fca0c48205e39 100644 (file)
@@ -224,7 +224,6 @@ static void
 print_frame_arg (const struct frame_arg *arg)
 {
   struct ui_out *uiout = current_uiout;
-  struct cleanup *old_chain;
   const char *error_message = NULL;
 
   string_file stb;
@@ -235,9 +234,8 @@ print_frame_arg (const struct frame_arg *arg)
              || (!uiout->is_mi_like_p ()
                  && arg->entry_kind == print_entry_values_compact));
 
-  annotate_arg_begin ();
-
-  old_chain = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
+  annotate_arg_emitter arg_emitter;
+  ui_out_emit_tuple tuple_emitter (uiout, NULL);
   fprintf_symbol_filtered (&stb, SYMBOL_PRINT_NAME (arg->sym),
                           SYMBOL_LANGUAGE (arg->sym), DMGL_PARAMS | DMGL_ANSI);
   if (arg->entry_kind == print_entry_values_compact)
@@ -305,11 +303,6 @@ print_frame_arg (const struct frame_arg *arg)
     }
 
   uiout->field_stream ("value", stb);
-
-  /* Also invoke ui_out_tuple_end.  */
-  do_cleanups (old_chain);
-
-  annotate_arg_end ();
 }
 
 /* Read in inferior function local SYM at FRAME into ARGP.  Caller is
@@ -407,10 +400,9 @@ read_frame_arg (struct symbol *sym, struct frame_info *frame,
                  /* Initialize it just to avoid a GCC false warning.  */
                  struct value *val_deref = NULL, *entryval_deref;
 
-                 /* DW_AT_GNU_call_site_value does match with the current
+                 /* DW_AT_call_value does match with the current
                     value.  If it is a reference still try to verify if
-                    dereferenced DW_AT_GNU_call_site_data_value does not
-                    differ.  */
+                    dereferenced DW_AT_call_data_value does not differ.  */
 
                  TRY
                    {
@@ -806,8 +798,7 @@ print_frame_info (struct frame_info *frame, int print_level,
       || get_frame_type (frame) == SIGTRAMP_FRAME
       || get_frame_type (frame) == ARCH_FRAME)
     {
-      struct cleanup *uiout_cleanup
-       = make_cleanup_ui_out_tuple_begin_end (uiout, "frame");
+      ui_out_emit_tuple tuple_emitter (uiout, "frame");
 
       annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
                            gdbarch, get_frame_pc (frame));
@@ -852,7 +843,6 @@ print_frame_info (struct frame_info *frame, int print_level,
        do_gdb_disassembly (get_frame_arch (frame), 1,
                            get_frame_pc (frame), get_frame_pc (frame) + 1);
 
-      do_cleanups (uiout_cleanup);
       return;
     }
 
@@ -1206,7 +1196,6 @@ print_frame (struct frame_info *frame, int print_level,
     {
       struct gdbarch *gdbarch = get_frame_arch (frame);
       int numargs;
-      struct cleanup *args_list_chain;
 
       if (gdbarch_frame_num_args_p (gdbarch))
        {
@@ -1216,20 +1205,20 @@ print_frame (struct frame_info *frame, int print_level,
       else
        numargs = -1;
     
-      args_list_chain = make_cleanup_ui_out_list_begin_end (uiout, "args");
-      TRY
-       {
-         print_frame_args (func, frame, numargs, gdb_stdout);
-       }
-      CATCH (e, RETURN_MASK_ERROR)
-       {
-       }
-      END_CATCH
+      {
+       ui_out_emit_list list_emitter (uiout, "args");
+       TRY
+         {
+           print_frame_args (func, frame, numargs, gdb_stdout);
+         }
+       CATCH (e, RETURN_MASK_ERROR)
+         {
+         }
+       END_CATCH
 
-      /* FIXME: ARGS must be a list.  If one argument is a string it
-         will have " that will not be properly escaped.  */
-      /* Invoke ui_out_tuple_end.  */
-      do_cleanups (args_list_chain);
+       /* FIXME: ARGS must be a list.  If one argument is a string it
+          will have " that will not be properly escaped.  */
+      }
       QUIT;
     }
   uiout->text (")");
@@ -1631,57 +1620,52 @@ frame_info (char *addr_exp, int from_tty)
   /* Print as much information as possible on the location of all the
      registers.  */
   {
-    enum lval_type lval;
-    int optimized;
-    int unavailable;
-    CORE_ADDR addr;
-    int realnum;
     int count;
     int i;
     int need_nl = 1;
+    int sp_regnum = gdbarch_sp_regnum (gdbarch);
 
     /* The sp is special; what's displayed isn't the save address, but
        the value of the previous frame's sp.  This is a legacy thing,
        at one stage the frame cached the previous frame's SP instead
        of its address, hence it was easiest to just display the cached
        value.  */
-    if (gdbarch_sp_regnum (gdbarch) >= 0)
+    if (sp_regnum >= 0)
       {
-       /* Find out the location of the saved stack pointer with out
-           actually evaluating it.  */
-       frame_register_unwind (fi, gdbarch_sp_regnum (gdbarch),
-                              &optimized, &unavailable, &lval, &addr,
-                              &realnum, NULL);
-       if (!optimized && !unavailable && lval == not_lval)
-         {
-           enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
-           int sp_size = register_size (gdbarch, gdbarch_sp_regnum (gdbarch));
-           gdb_byte value[MAX_REGISTER_SIZE];
-           CORE_ADDR sp;
-
-           frame_register_unwind (fi, gdbarch_sp_regnum (gdbarch),
-                                  &optimized, &unavailable, &lval, &addr,
-                                  &realnum, value);
-           /* NOTE: cagney/2003-05-22: This is assuming that the
-               stack pointer was packed as an unsigned integer.  That
-               may or may not be valid.  */
-           sp = extract_unsigned_integer (value, sp_size, byte_order);
-           printf_filtered (" Previous frame's sp is ");
-           fputs_filtered (paddress (gdbarch, sp), gdb_stdout);
-           printf_filtered ("\n");
-           need_nl = 0;
-         }
-       else if (!optimized && !unavailable && lval == lval_memory)
-         {
-           printf_filtered (" Previous frame's sp at ");
-           fputs_filtered (paddress (gdbarch, addr), gdb_stdout);
-           printf_filtered ("\n");
-           need_nl = 0;
-         }
-       else if (!optimized && !unavailable && lval == lval_register)
+       struct value *value = frame_unwind_register_value (fi, sp_regnum);
+       gdb_assert (value != NULL);
+
+       if (!value_optimized_out (value) && value_entirely_available (value))
          {
-           printf_filtered (" Previous frame's sp in %s\n",
-                            gdbarch_register_name (gdbarch, realnum));
+           if (VALUE_LVAL (value) == not_lval)
+             {
+               CORE_ADDR sp;
+               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);
+
+               printf_filtered (" Previous frame's sp is ");
+               fputs_filtered (paddress (gdbarch, sp), gdb_stdout);
+               printf_filtered ("\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");
+             }
+           else if (VALUE_LVAL (value) == lval_register)
+             {
+               printf_filtered (" Previous frame's sp in %s\n",
+                                gdbarch_register_name (gdbarch,
+                                                       VALUE_REGNUM (value)));
+             }
+
+           release_value (value);
+           value_free (value);
            need_nl = 0;
          }
        /* else keep quiet.  */
@@ -1691,9 +1675,15 @@ frame_info (char *addr_exp, int from_tty)
     numregs = gdbarch_num_regs (gdbarch)
              + gdbarch_num_pseudo_regs (gdbarch);
     for (i = 0; i < numregs; i++)
-      if (i != gdbarch_sp_regnum (gdbarch)
+      if (i != sp_regnum
          && gdbarch_register_reggroup_p (gdbarch, i, all_reggroup))
        {
+         enum lval_type lval;
+         int optimized;
+         int unavailable;
+         CORE_ADDR addr;
+         int realnum;
+
          /* Find out the location of the saved register without
              fetching the corresponding value.  */
          frame_register_unwind (fi, i, &optimized, &unavailable,
@@ -1887,8 +1877,8 @@ backtrace_command (char *arg, int from_tty)
       char **argv;
       int i;
 
-      argv = gdb_buildargv (arg);
-      make_cleanup_freeargv (argv);
+      gdb_argv built_argv (arg);
+      argv = built_argv.get ();
       argc = 0;
       for (i = 0; argv[i]; i++)
        {
This page took 0.033837 seconds and 4 git commands to generate.