guile disassembly hardcode TARGET_XFER_E_IO
[deliverable/binutils-gdb.git] / gdb / printcmd.c
index 1cc248d70f60091eb2f1be4f7a1297ff7cfaec32..1744abd432485b0658abffeed88c95247c05f78a 100644 (file)
@@ -1,6 +1,6 @@
 /* Print values for GNU debugger GDB.
 
-   Copyright (C) 1986-2013 Free Software Foundation, Inc.
+   Copyright (C) 1986-2015 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -18,7 +18,6 @@
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include "gdb_string.h"
 #include "frame.h"
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "objfiles.h"          /* ditto */
 #include "completer.h"         /* for completion functions */
 #include "ui-out.h"
-#include "gdb_assert.h"
 #include "block.h"
 #include "disasm.h"
 #include "dfp.h"
-#include "valprint.h"
-#include "exceptions.h"
 #include "observer.h"
 #include "solist.h"
 #include "parser-defs.h"
 #include "tui/tui.h"           /* For tui_active et al.   */
 #endif
 
-struct format_data
-  {
-    int count;
-    char format;
-    char size;
-
-    /* True if the value should be printed raw -- that is, bypassing
-       python-based formatters.  */
-    unsigned char raw;
-  };
-
 /* Last specified output format.  */
 
 static char last_format = 0;
@@ -361,7 +346,7 @@ float_type_from_length (struct type *type)
    supported at this level.  */
 
 void
-print_scalar_formatted (const void *valaddr, struct type *type,
+print_scalar_formatted (const gdb_byte *valaddr, struct type *type,
                        const struct value_print_options *options,
                        int size, struct ui_file *stream)
 {
@@ -632,7 +617,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
                        int *line,       /* OUT */
                        int *unmapped)   /* OUT */
 {
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   struct symbol *symbol;
   CORE_ADDR name_location = 0;
   struct obj_section *section = NULL;
@@ -662,7 +647,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
      save some memory, but for many debug format--ELF/DWARF or
      anything/stabs--it would be inconvenient to eliminate those minimal
      symbols anyway).  */
-  msymbol = lookup_minimal_symbol_by_pc_section (addr, section).minsym;
+  msymbol = lookup_minimal_symbol_by_pc_section (addr, section);
   symbol = find_pc_sect_function (addr, section);
 
   if (symbol)
@@ -681,40 +666,40 @@ build_address_symbolic (struct gdbarch *gdbarch,
        name_temp = SYMBOL_LINKAGE_NAME (symbol);
     }
 
-  if (msymbol != NULL
-      && MSYMBOL_HAS_SIZE (msymbol)
-      && MSYMBOL_SIZE (msymbol) == 0
-      && MSYMBOL_TYPE (msymbol) != mst_text
-      && MSYMBOL_TYPE (msymbol) != mst_text_gnu_ifunc
-      && MSYMBOL_TYPE (msymbol) != mst_file_text)
-    msymbol = NULL;
+  if (msymbol.minsym != NULL
+      && MSYMBOL_HAS_SIZE (msymbol.minsym)
+      && MSYMBOL_SIZE (msymbol.minsym) == 0
+      && MSYMBOL_TYPE (msymbol.minsym) != mst_text
+      && MSYMBOL_TYPE (msymbol.minsym) != mst_text_gnu_ifunc
+      && MSYMBOL_TYPE (msymbol.minsym) != mst_file_text)
+    msymbol.minsym = NULL;
 
-  if (msymbol != NULL)
+  if (msymbol.minsym != NULL)
     {
-      if (SYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
+      if (BMSYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
        {
          /* If this is a function (i.e. a code address), strip out any
             non-address bits.  For instance, display a pointer to the
             first instruction of a Thumb function as <function>; the
             second instruction will be <function+2>, even though the
             pointer is <function+3>.  This matches the ISA behavior.  */
-         if (MSYMBOL_TYPE (msymbol) == mst_text
-             || MSYMBOL_TYPE (msymbol) == mst_text_gnu_ifunc
-             || MSYMBOL_TYPE (msymbol) == mst_file_text
-             || MSYMBOL_TYPE (msymbol) == mst_solib_trampoline)
+         if (MSYMBOL_TYPE (msymbol.minsym) == mst_text
+             || MSYMBOL_TYPE (msymbol.minsym) == mst_text_gnu_ifunc
+             || MSYMBOL_TYPE (msymbol.minsym) == mst_file_text
+             || MSYMBOL_TYPE (msymbol.minsym) == mst_solib_trampoline)
            addr = gdbarch_addr_bits_remove (gdbarch, addr);
 
          /* The msymbol is closer to the address than the symbol;
             use the msymbol instead.  */
          symbol = 0;
-         name_location = SYMBOL_VALUE_ADDRESS (msymbol);
+         name_location = BMSYMBOL_VALUE_ADDRESS (msymbol);
          if (do_demangle || asm_demangle)
-           name_temp = SYMBOL_PRINT_NAME (msymbol);
+           name_temp = MSYMBOL_PRINT_NAME (msymbol.minsym);
          else
-           name_temp = SYMBOL_LINKAGE_NAME (msymbol);
+           name_temp = MSYMBOL_LINKAGE_NAME (msymbol.minsym);
        }
     }
-  if (symbol == NULL && msymbol == NULL)
+  if (symbol == NULL && msymbol.minsym == NULL)
     return 1;
 
   /* If the nearest symbol is too far away, don't print anything symbolic.  */
@@ -931,7 +916,7 @@ do_examine (struct format_data fmt, struct gdbarch *gdbarch, CORE_ADDR addr)
 }
 \f
 static void
-validate_format (struct format_data fmt, char *cmdname)
+validate_format (struct format_data fmt, const char *cmdname)
 {
   if (fmt.size != 0)
     error (_("Size letters are meaningless in \"%s\" command."), cmdname);
@@ -943,6 +928,57 @@ validate_format (struct format_data fmt, char *cmdname)
           fmt.format, cmdname);
 }
 
+/* Parse print command format string into *FMTP and update *EXPP.
+   CMDNAME should name the current command.  */
+
+void
+print_command_parse_format (const char **expp, const char *cmdname,
+                           struct format_data *fmtp)
+{
+  const char *exp = *expp;
+
+  if (exp && *exp == '/')
+    {
+      exp++;
+      *fmtp = decode_format (&exp, last_format, 0);
+      validate_format (*fmtp, cmdname);
+      last_format = fmtp->format;
+    }
+  else
+    {
+      fmtp->count = 1;
+      fmtp->format = 0;
+      fmtp->size = 0;
+      fmtp->raw = 0;
+    }
+
+  *expp = exp;
+}
+
+/* Print VAL to console according to *FMTP, including recording it to
+   the history.  */
+
+void
+print_value (struct value *val, const struct format_data *fmtp)
+{
+  struct value_print_options opts;
+  int histindex = record_latest_value (val);
+
+  annotate_value_history_begin (histindex, value_type (val));
+
+  printf_filtered ("$%d = ", histindex);
+
+  annotate_value_history_value ();
+
+  get_formatted_print_options (&opts, fmtp->format);
+  opts.raw = fmtp->raw;
+
+  print_formatted (val, fmtp->size, &opts, gdb_stdout);
+  printf_filtered ("\n");
+
+  annotate_value_history_end ();
+}
+
 /* Evaluate string EXP as an expression in the current language and
    print the resulting value.  EXP may contain a format specifier as the
    first argument ("/x myvar" for example, to print myvar in hex).  */
@@ -952,24 +988,10 @@ print_command_1 (const char *exp, int voidprint)
 {
   struct expression *expr;
   struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
-  char format = 0;
   struct value *val;
   struct format_data fmt;
 
-  if (exp && *exp == '/')
-    {
-      exp++;
-      fmt = decode_format (&exp, last_format, 0);
-      validate_format (fmt, "print");
-      last_format = format = fmt.format;
-    }
-  else
-    {
-      fmt.count = 1;
-      fmt.format = 0;
-      fmt.size = 0;
-      fmt.raw = 0;
-    }
+  print_command_parse_format (&exp, "print", &fmt);
 
   if (exp && *exp)
     {
@@ -982,32 +1004,7 @@ print_command_1 (const char *exp, int voidprint)
 
   if (voidprint || (val && value_type (val) &&
                    TYPE_CODE (value_type (val)) != TYPE_CODE_VOID))
-    {
-      struct value_print_options opts;
-      int histindex = record_latest_value (val);
-
-      if (histindex >= 0)
-       annotate_value_history_begin (histindex, value_type (val));
-      else
-       annotate_value_begin (value_type (val));
-
-      if (histindex >= 0)
-       printf_filtered ("$%d = ", histindex);
-
-      if (histindex >= 0)
-       annotate_value_history_value ();
-
-      get_formatted_print_options (&opts, format);
-      opts.raw = fmt.raw;
-
-      print_formatted (val, fmt.size, &opts, gdb_stdout);
-      printf_filtered ("\n");
-
-      if (histindex >= 0)
-       annotate_value_history_end ();
-      else
-       annotate_value_end ();
-    }
+    print_value (val, &fmt);
 
   do_cleanups (old_chain);
 }
@@ -1135,10 +1132,10 @@ sym_info (char *arg, int from_tty)
        struct cleanup *old_chain;
 
        matches = 1;
-       offset = sect_addr - SYMBOL_VALUE_ADDRESS (msymbol);
+       offset = sect_addr - MSYMBOL_VALUE_ADDRESS (objfile, msymbol);
        mapped = section_is_mapped (osect) ? _("mapped") : _("unmapped");
        sec_name = osect->the_bfd_section->name;
-       msym_name = SYMBOL_PRINT_NAME (msymbol);
+       msym_name = MSYMBOL_PRINT_NAME (msymbol);
 
        /* Don't print the offset if it is zero.
           We assume there's no need to handle i18n of "sym + offset".  */
@@ -1151,8 +1148,8 @@ sym_info (char *arg, int from_tty)
           a pagination request inside printf_filtered.  */
        old_chain = make_cleanup (xfree, loc_string);
 
-       gdb_assert (osect->objfile && osect->objfile->name);
-       obj_name = osect->objfile->name;
+       gdb_assert (osect->objfile && objfile_name (osect->objfile));
+       obj_name = objfile_name (osect->objfile);
 
        if (MULTI_OBJFILE_P ())
          if (pc_in_unmapped_range (addr, osect))
@@ -1201,7 +1198,7 @@ address_info (char *exp, int from_tty)
   struct gdbarch *gdbarch;
   int regno;
   struct symbol *sym;
-  struct minimal_symbol *msymbol;
+  struct bound_minimal_symbol msymbol;
   long val;
   struct obj_section *section;
   CORE_ADDR load_addr, context_pc = 0;
@@ -1211,7 +1208,7 @@ address_info (char *exp, int from_tty)
     error (_("Argument required."));
 
   sym = lookup_symbol (exp, get_selected_block (&context_pc), VAR_DOMAIN,
-                      &is_a_field_of_this);
+                      &is_a_field_of_this).symbol;
   if (sym == NULL)
     {
       if (is_a_field_of_this.type != NULL)
@@ -1227,14 +1224,14 @@ address_info (char *exp, int from_tty)
          return;
        }
 
-      msymbol = lookup_minimal_symbol (exp, NULL, NULL);
+      msymbol = lookup_bound_minimal_symbol (exp);
 
-      if (msymbol != NULL)
+      if (msymbol.minsym != NULL)
        {
-         struct objfile *objfile = msymbol_objfile (msymbol);
+         struct objfile *objfile = msymbol.objfile;
 
          gdbarch = get_objfile_arch (objfile);
-         load_addr = SYMBOL_VALUE_ADDRESS (msymbol);
+         load_addr = BMSYMBOL_VALUE_ADDRESS (msymbol);
 
          printf_filtered ("Symbol \"");
          fprintf_symbol_filtered (gdb_stdout, exp,
@@ -1242,7 +1239,7 @@ address_info (char *exp, int from_tty)
          printf_filtered ("\" is at ");
          fputs_filtered (paddress (gdbarch, load_addr), gdb_stdout);
          printf_filtered (" in a file compiled without debugging");
-         section = SYMBOL_OBJ_SECTION (objfile, msymbol);
+         section = MSYMBOL_OBJ_SECTION (objfile, msymbol.minsym);
          if (section_is_overlay (section))
            {
              load_addr = overlay_unmapped_address (load_addr, section);
@@ -1263,8 +1260,11 @@ address_info (char *exp, int from_tty)
                           current_language->la_language, DMGL_ANSI);
   printf_filtered ("\" is ");
   val = SYMBOL_VALUE (sym);
-  section = SYMBOL_OBJ_SECTION (SYMBOL_OBJFILE (sym), sym);
-  gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
+  if (SYMBOL_OBJFILE_OWNED (sym))
+    section = SYMBOL_OBJ_SECTION (symbol_objfile (sym), sym);
+  else
+    section = NULL;
+  gdbarch = symbol_arch (sym);
 
   if (SYMBOL_COMPUTED_OPS (sym) != NULL)
     {
@@ -1375,17 +1375,20 @@ address_info (char *exp, int from_tty)
          printf_filtered ("unresolved");
        else
          {
-           section = SYMBOL_OBJ_SECTION (msym.objfile, msym.minsym);
-           load_addr = SYMBOL_VALUE_ADDRESS (msym.minsym);
+           section = MSYMBOL_OBJ_SECTION (msym.objfile, msym.minsym);
 
            if (section
                && (section->the_bfd_section->flags & SEC_THREAD_LOCAL) != 0)
-             printf_filtered (_("a thread-local variable at offset %s "
-                                "in the thread-local storage for `%s'"),
-                              paddress (gdbarch, load_addr),
-                              section->objfile->name);
+             {
+               load_addr = MSYMBOL_VALUE_RAW_ADDRESS (msym.minsym);
+               printf_filtered (_("a thread-local variable at offset %s "
+                                  "in the thread-local storage for `%s'"),
+                                paddress (gdbarch, load_addr),
+                                objfile_name (section->objfile));
+             }
            else
              {
+               load_addr = BMSYMBOL_VALUE_ADDRESS (msym);
                printf_filtered (_("static storage at address "));
                fputs_filtered (paddress (gdbarch, load_addr), gdb_stdout);
                if (section_is_overlay (section))
@@ -1505,62 +1508,51 @@ display_command (char *arg, int from_tty)
 {
   struct format_data fmt;
   struct expression *expr;
-  struct display *new;
-  int display_it = 1;
+  struct display *newobj;
   const char *exp = arg;
 
-#if defined(TUI)
-  /* NOTE: cagney/2003-02-13 The `tui_active' was previously
-     `tui_version'.  */
-  if (tui_active && exp != NULL && *exp == '$')
-    display_it = (tui_set_layout_for_display_command (exp) == TUI_FAILURE);
-#endif
-
-  if (display_it)
+  if (exp == 0)
     {
-      if (exp == 0)
-       {
-         do_displays ();
-         return;
-       }
+      do_displays ();
+      return;
+    }
 
-      if (*exp == '/')
-       {
-         exp++;
-         fmt = decode_format (&exp, 0, 0);
-         if (fmt.size && fmt.format == 0)
-           fmt.format = 'x';
-         if (fmt.format == 'i' || fmt.format == 's')
-           fmt.size = 'b';
-       }
-      else
-       {
-         fmt.format = 0;
-         fmt.size = 0;
-         fmt.count = 0;
-         fmt.raw = 0;
-       }
+  if (*exp == '/')
+    {
+      exp++;
+      fmt = decode_format (&exp, 0, 0);
+      if (fmt.size && fmt.format == 0)
+       fmt.format = 'x';
+      if (fmt.format == 'i' || fmt.format == 's')
+       fmt.size = 'b';
+    }
+  else
+    {
+      fmt.format = 0;
+      fmt.size = 0;
+      fmt.count = 0;
+      fmt.raw = 0;
+    }
 
-      innermost_block = NULL;
-      expr = parse_expression (exp);
+  innermost_block = NULL;
+  expr = parse_expression (exp);
 
-      new = (struct display *) xmalloc (sizeof (struct display));
+  newobj = XNEW (struct display);
 
-      new->exp_string = xstrdup (exp);
-      new->exp = expr;
-      new->block = innermost_block;
-      new->pspace = current_program_space;
-      new->next = display_chain;
-      new->number = ++display_number;
-      new->format = fmt;
-      new->enabled_p = 1;
-      display_chain = new;
+  newobj->exp_string = xstrdup (exp);
+  newobj->exp = expr;
+  newobj->block = innermost_block;
+  newobj->pspace = current_program_space;
+  newobj->next = display_chain;
+  newobj->number = ++display_number;
+  newobj->format = fmt;
+  newobj->enabled_p = 1;
+  display_chain = newobj;
 
-      if (from_tty && target_has_execution)
-       do_one_display (new);
+  if (from_tty)
+    do_one_display (newobj);
 
-      dont_repeat ();
-    }
+  dont_repeat ();
 }
 
 static void
@@ -1627,7 +1619,7 @@ map_display_numbers (char *args,
 
   while (!state.finished)
     {
-      char *p = state.string;
+      const char *p = state.string;
 
       num = get_number_or_range (&state);
       if (num == 0)
@@ -1701,15 +1693,14 @@ do_one_display (struct display *d)
 
   if (d->exp == NULL)
     {
-      volatile struct gdb_exception ex;
 
-      TRY_CATCH (ex, RETURN_MASK_ALL)
+      TRY
        {
          innermost_block = NULL;
          d->exp = parse_expression (d->exp_string);
          d->block = innermost_block;
        }
-      if (ex.reason < 0)
+      CATCH (ex, RETURN_MASK_ALL)
        {
          /* Can't re-parse the expression.  Disable this display item.  */
          d->enabled_p = 0;
@@ -1717,6 +1708,7 @@ do_one_display (struct display *d)
                   d->exp_string, ex.message);
          return;
        }
+      END_CATCH
     }
 
   if (d->block)
@@ -1740,7 +1732,6 @@ do_one_display (struct display *d)
   printf_filtered (": ");
   if (d->format.size)
     {
-      volatile struct gdb_exception ex;
 
       annotate_display_format ();
 
@@ -1764,7 +1755,7 @@ do_one_display (struct display *d)
 
       annotate_display_value ();
 
-      TRY_CATCH (ex, RETURN_MASK_ERROR)
+      TRY
         {
          struct value *val;
          CORE_ADDR addr;
@@ -1775,13 +1766,15 @@ do_one_display (struct display *d)
            addr = gdbarch_addr_bits_remove (d->exp->gdbarch, addr);
          do_examine (d->format, d->exp->gdbarch, addr);
        }
-      if (ex.reason < 0)
-       fprintf_filtered (gdb_stdout, _("<error: %s>\n"), ex.message);
+      CATCH (ex, RETURN_MASK_ERROR)
+       {
+         fprintf_filtered (gdb_stdout, _("<error: %s>\n"), ex.message);
+       }
+      END_CATCH
     }
   else
     {
       struct value_print_options opts;
-      volatile struct gdb_exception ex;
 
       annotate_display_format ();
 
@@ -1800,15 +1793,19 @@ do_one_display (struct display *d)
       get_formatted_print_options (&opts, d->format.format);
       opts.raw = d->format.raw;
 
-      TRY_CATCH (ex, RETURN_MASK_ERROR)
+      TRY
         {
          struct value *val;
 
          val = evaluate_expression (d->exp);
          print_formatted (val, d->format.size, &opts, gdb_stdout);
        }
-      if (ex.reason < 0)
-       fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
+      CATCH (ex, RETURN_MASK_ERROR)
+       {
+         fprintf_filtered (gdb_stdout, _("<error: %s>"), ex.message);
+       }
+      END_CATCH
+
       printf_filtered ("\n");
     }
 
@@ -1940,21 +1937,24 @@ disable_display_command (char *args, int from_tty)
    an item by re-parsing .exp_string field in the new execution context.  */
 
 static void
-clear_dangling_display_expressions (struct so_list *solib)
+clear_dangling_display_expressions (struct objfile *objfile)
 {
-  struct objfile *objfile = solib->objfile;
   struct display *d;
+  struct program_space *pspace;
 
   /* With no symbol file we cannot have a block or expression from it.  */
   if (objfile == NULL)
     return;
+  pspace = objfile->pspace;
   if (objfile->separate_debug_objfile_backlink)
-    objfile = objfile->separate_debug_objfile_backlink;
-  gdb_assert (objfile->pspace == solib->pspace);
+    {
+      objfile = objfile->separate_debug_objfile_backlink;
+      gdb_assert (objfile->pspace == pspace);
+    }
 
   for (d = display_chain; d != NULL; d = d->next)
     {
-      if (d->pspace != solib->pspace)
+      if (d->pspace != pspace)
        continue;
 
       if (lookup_objfile_from_block (d->block) == objfile
@@ -1981,18 +1981,21 @@ print_variable_and_value (const char *name, struct symbol *var,
                          struct frame_info *frame,
                          struct ui_file *stream, int indent)
 {
-  volatile struct gdb_exception except;
 
   if (!name)
     name = SYMBOL_PRINT_NAME (var);
 
   fprintf_filtered (stream, "%s%s = ", n_spaces (2 * indent), name);
-  TRY_CATCH (except, RETURN_MASK_ERROR)
+  TRY
     {
       struct value *val;
       struct value_print_options opts;
 
-      val = read_var_value (var, frame);
+      /* READ_VAR_VALUE needs a block in order to deal with non-local
+        references (i.e. to handle nested functions).  In this context, we
+        print variables that are local to this frame, so we can avoid passing
+        a block to it.  */
+      val = read_var_value (var, NULL, frame);
       get_user_print_options (&opts);
       opts.deref_ref = 1;
       common_val_print (val, stream, indent, &opts, current_language);
@@ -2001,9 +2004,13 @@ print_variable_and_value (const char *name, struct symbol *var,
         function.  */
       frame = NULL;
     }
-  if (except.reason < 0)
-    fprintf_filtered(stream, "<error reading variable %s (%s)>", name,
-                    except.message);
+  CATCH (except, RETURN_MASK_ERROR)
+    {
+      fprintf_filtered(stream, "<error reading variable %s (%s)>", name,
+                      except.message);
+    }
+  END_CATCH
+
   fprintf_filtered (stream, "\n");
 }
 
@@ -2057,7 +2064,7 @@ printf_wide_c_string (struct ui_file *stream, const char *format,
   struct type *wctype = lookup_typename (current_language, gdbarch,
                                         "wchar_t", NULL, 0);
   int wcwidth = TYPE_LENGTH (wctype);
-  gdb_byte *buf = alloca (wcwidth);
+  gdb_byte *buf = (gdb_byte *) alloca (wcwidth);
   struct obstack output;
   struct cleanup *inner_cleanup;
 
@@ -2196,7 +2203,7 @@ printf_pointer (struct ui_file *stream, const char *format,
   long val = value_as_long (value);
 #endif
 
-  fmt = alloca (strlen (format) + 5);
+  fmt = (char *) alloca (strlen (format) + 5);
 
   /* Copy up to the leading %.  */
   p = format;
@@ -2252,7 +2259,7 @@ ui_printf (const char *arg, struct ui_file *stream)
   int allocated_args = 20;
   struct cleanup *old_cleanups;
 
-  val_args = xmalloc (allocated_args * sizeof (struct value *));
+  val_args = XNEWVEC (struct value *, allocated_args);
   old_cleanups = make_cleanup (free_current_contents, &val_args);
 
   if (s == 0)
@@ -2458,6 +2465,7 @@ static void
 printf_command (char *arg, int from_tty)
 {
   ui_printf (arg, gdb_stdout);
+  gdb_flush (gdb_stdout);
 }
 
 /* Implement the "eval" command.  */
@@ -2486,7 +2494,7 @@ _initialize_printcmd (void)
 
   current_display_number = -1;
 
-  observer_attach_solib_unloaded (clear_dangling_display_expressions);
+  observer_attach_free_objfile (clear_dangling_display_expressions);
 
   add_info ("address", address_info,
            _("Describe where symbol SYM is stored."));
This page took 0.042944 seconds and 4 git commands to generate.