Fix gdb build on 32-bit hosts w/ --enable-64-bit-bfd
[deliverable/binutils-gdb.git] / gdb / printcmd.c
index dd81d8fda13c2954dd89e254b99874da787da6e1..8c999188d71edc4d20674a34b5dfc56c02e167b5 100644 (file)
 #include "source.h"
 #include "common/byte-vector.h"
 
-#ifdef TUI
-#include "tui/tui.h"           /* For tui_active et al.   */
-#endif
-
 /* Last specified output format.  */
 
 static char last_format = 0;
@@ -62,6 +58,10 @@ static char last_format = 0;
 
 static char last_size = 'w';
 
+/* Last specified count for the 'x' command.  */
+
+static int last_count;
+
 /* Default address to examine next, and associated architecture.  */
 
 static struct gdbarch *next_gdbarch;
@@ -78,7 +78,7 @@ static CORE_ADDR last_examine_address;
 /* Contents of last address examined.
    This is not valid past the end of the `x' command!  */
 
-static struct value *last_examine_value;
+static value_ref_ptr last_examine_value;
 
 /* Largest offset between a symbolic value and an address, that will be
    printed as `0x1234 <symbol+offset>'.  */
@@ -211,9 +211,7 @@ decode_format (const char **string_ptr, int oformat, int osize)
        break;
     }
 
-  while (*p == ' ' || *p == '\t')
-    p++;
-  *string_ptr = p;
+  *string_ptr = skip_spaces (p);
 
   /* Set defaults for format and size if not specified.  */
   if (val.format == '?')
@@ -522,63 +520,50 @@ print_address_symbolic (struct gdbarch *gdbarch, CORE_ADDR addr,
                        struct ui_file *stream,
                        int do_demangle, const char *leadin)
 {
-  char *name = NULL;
-  char *filename = NULL;
+  std::string name, filename;
   int unmapped = 0;
   int offset = 0;
   int line = 0;
 
-  /* Throw away both name and filename.  */
-  struct cleanup *cleanup_chain = make_cleanup (free_current_contents, &name);
-  make_cleanup (free_current_contents, &filename);
-
   if (build_address_symbolic (gdbarch, addr, do_demangle, &name, &offset,
                              &filename, &line, &unmapped))
-    {
-      do_cleanups (cleanup_chain);
-      return 0;
-    }
+    return 0;
 
   fputs_filtered (leadin, stream);
   if (unmapped)
     fputs_filtered ("<*", stream);
   else
     fputs_filtered ("<", stream);
-  fputs_filtered (name, stream);
+  fputs_filtered (name.c_str (), stream);
   if (offset != 0)
     fprintf_filtered (stream, "+%u", (unsigned int) offset);
 
   /* Append source filename and line number if desired.  Give specific
      line # of this addr, if we have it; else line # of the nearest symbol.  */
-  if (print_symbol_filename && filename != NULL)
+  if (print_symbol_filename && !filename.empty ())
     {
       if (line != -1)
-       fprintf_filtered (stream, " at %s:%d", filename, line);
+       fprintf_filtered (stream, " at %s:%d", filename.c_str (), line);
       else
-       fprintf_filtered (stream, " in %s", filename);
+       fprintf_filtered (stream, " in %s", filename.c_str ());
     }
   if (unmapped)
     fputs_filtered ("*>", stream);
   else
     fputs_filtered (">", stream);
 
-  do_cleanups (cleanup_chain);
   return 1;
 }
 
-/* Given an address ADDR return all the elements needed to print the
-   address in a symbolic form.  NAME can be mangled or not depending
-   on DO_DEMANGLE (and also on the asm_demangle global variable,
-   manipulated via ''set print asm-demangle'').  Return 0 in case of
-   success, when all the info in the OUT paramters is valid.  Return 1
-   otherwise.  */
+/* See valprint.h.  */
+
 int
 build_address_symbolic (struct gdbarch *gdbarch,
                        CORE_ADDR addr,  /* IN */
                        int do_demangle, /* IN */
-                       char **name,     /* OUT */
+                       std::string *name, /* OUT */
                        int *offset,     /* OUT */
-                       char **filename, /* OUT */
+                       std::string *filename, /* OUT */
                        int *line,       /* OUT */
                        int *unmapped)   /* OUT */
 {
@@ -624,7 +609,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
         pointer is <function+3>.  This matches the ISA behavior.  */
       addr = gdbarch_addr_bits_remove (gdbarch, addr);
 
-      name_location = BLOCK_START (SYMBOL_BLOCK_VALUE (symbol));
+      name_location = BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (symbol));
       if (do_demangle || asm_demangle)
        name_temp = SYMBOL_PRINT_NAME (symbol);
       else
@@ -680,7 +665,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
 
   *offset = addr - name_location;
 
-  *name = xstrdup (name_temp);
+  *name = name_temp;
 
   if (print_symbol_filename)
     {
@@ -690,7 +675,7 @@ build_address_symbolic (struct gdbarch *gdbarch,
 
       if (sal.symtab)
        {
-         *filename = xstrdup (symtab_to_filename_for_display (sal.symtab));
+         *filename = symtab_to_filename_for_display (sal.symtab);
          *line = sal.line;
        }
     }
@@ -1093,9 +1078,6 @@ do_examine (struct format_data fmt, struct gdbarch *gdbarch, CORE_ADDR addr)
             object.  */
          last_examine_address = next_address;
 
-         if (last_examine_value)
-           value_free (last_examine_value);
-
          /* The value to be displayed is not fetched greedily.
             Instead, to avoid the possibility of a fetched value not
             being used, its retrieval is delayed until the print code
@@ -1105,12 +1087,10 @@ do_examine (struct format_data fmt, struct gdbarch *gdbarch, CORE_ADDR addr)
             the disassembler be modified so that LAST_EXAMINE_VALUE
             is left with the byte sequence from the last complete
             instruction fetched from memory?  */
-         last_examine_value = value_at_lazy (val_type, next_address);
-
-         if (last_examine_value)
-           release_value (last_examine_value);
+         last_examine_value
+           = release_value (value_at_lazy (val_type, next_address));
 
-         print_formatted (last_examine_value, size, &opts, gdb_stdout);
+         print_formatted (last_examine_value.get (), size, &opts, gdb_stdout);
 
          /* Display any branch delay slots following the final insn.  */
          if (format == 'i' && count == 1)
@@ -1228,16 +1208,8 @@ call_command (const char *exp, int from_tty)
 
 /* Implementation of the "output" command.  */
 
-static void
-output_command (const char *exp, int from_tty)
-{
-  output_command_const (exp, from_tty);
-}
-
-/* Like output_command, but takes a const string as argument.  */
-
 void
-output_command_const (const char *exp, int from_tty)
+output_command (const char *exp, int from_tty)
 {
   char format = 0;
   struct value *val;
@@ -1325,7 +1297,6 @@ info_symbol_command (const char *arg, int from_tty)
       {
        const char *obj_name, *mapped, *sec_name, *msym_name;
        const char *loc_string;
-       struct cleanup *old_chain;
 
        matches = 1;
        offset = sect_addr - MSYMBOL_VALUE_ADDRESS (objfile, msymbol);
@@ -1548,7 +1519,7 @@ info_address_command (const char *exp, int from_tty)
 
     case LOC_BLOCK:
       printf_filtered (_("a function at address "));
-      load_addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+      load_addr = BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (sym));
       fputs_filtered (paddress (gdbarch, load_addr), gdb_stdout);
       if (section_is_overlay (section))
        {
@@ -1564,7 +1535,7 @@ info_address_command (const char *exp, int from_tty)
       {
        struct bound_minimal_symbol msym;
 
-       msym = lookup_minimal_symbol_and_objfile (SYMBOL_LINKAGE_NAME (sym));
+       msym = lookup_bound_minimal_symbol (SYMBOL_LINKAGE_NAME (sym));
        if (msym.minsym == NULL)
          printf_filtered ("unresolved");
        else
@@ -1621,6 +1592,11 @@ x_command (const char *exp, int from_tty)
   fmt.count = 1;
   fmt.raw = 0;
 
+  /* If there is no expression and no format, use the most recent
+     count.  */
+  if (exp == nullptr && last_count > 0)
+    fmt.count = last_count;
+
   if (exp && *exp == '/')
     {
       const char *tmp = exp + 1;
@@ -1629,6 +1605,8 @@ x_command (const char *exp, int from_tty)
       exp = (char *) tmp;
     }
 
+  last_count = fmt.count;
+
   /* If we have an expression, evaluate it and use it as the address.  */
 
   if (exp != 0 && *exp != 0)
@@ -1668,12 +1646,12 @@ x_command (const char *exp, int from_tty)
   last_format = fmt.format;
 
   /* Set a couple of internal variables if appropriate.  */
-  if (last_examine_value)
+  if (last_examine_value != nullptr)
     {
       /* Make last address examined available to the user as $_.  Use
          the correct pointer type.  */
       struct type *pointer_type
-       = lookup_pointer_type (value_type (last_examine_value));
+       = lookup_pointer_type (value_type (last_examine_value.get ()));
       set_internalvar (lookup_internalvar ("_"),
                       value_from_pointer (pointer_type,
                                           last_examine_address));
@@ -1682,10 +1660,10 @@ x_command (const char *exp, int from_tty)
         as $__.  If the last value has not been fetched from memory
         then don't fetch it now; instead mark it by voiding the $__
         variable.  */
-      if (value_lazy (last_examine_value))
+      if (value_lazy (last_examine_value.get ()))
        clear_internalvar (lookup_internalvar ("__"));
       else
-       set_internalvar (lookup_internalvar ("__"), last_examine_value);
+       set_internalvar (lookup_internalvar ("__"), last_examine_value.get ());
     }
 }
 \f
@@ -2222,7 +2200,10 @@ printf_c_string (struct ui_file *stream, const char *format,
   tem = value_as_address (value);
   if (tem == 0)
     {
+      DIAGNOSTIC_PUSH
+      DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
       fprintf_filtered (stream, format, "(null)");
+      DIAGNOSTIC_POP
       return;
     }
 
@@ -2243,7 +2224,10 @@ printf_c_string (struct ui_file *stream, const char *format,
     read_memory (tem, str, j);
   str[j] = 0;
 
+  DIAGNOSTIC_PUSH
+  DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
   fprintf_filtered (stream, format, (char *) str);
+  DIAGNOSTIC_POP
 }
 
 /* Subroutine of ui_printf to simplify it.
@@ -2267,7 +2251,10 @@ printf_wide_c_string (struct ui_file *stream, const char *format,
   tem = value_as_address (value);
   if (tem == 0)
     {
+      DIAGNOSTIC_PUSH
+      DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
       fprintf_filtered (stream, format, "(null)");
+      DIAGNOSTIC_POP
       return;
     }
 
@@ -2294,7 +2281,10 @@ printf_wide_c_string (struct ui_file *stream, const char *format,
                             &output, translit_char);
   obstack_grow_str0 (&output, "");
 
+  DIAGNOSTIC_PUSH
+  DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
   fprintf_filtered (stream, format, obstack_base (&output));
+  DIAGNOSTIC_POP
 }
 
 /* Subroutine of ui_printf to simplify it.
@@ -2307,7 +2297,6 @@ printf_floating (struct ui_file *stream, const char *format,
   /* Parameter data.  */
   struct type *param_type = value_type (value);
   struct gdbarch *gdbarch = get_type_arch (param_type);
-  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
 
   /* Determine target type corresponding to the format string.  */
   struct type *fmt_type;
@@ -2423,13 +2412,19 @@ printf_pointer (struct ui_file *stream, const char *format,
       *fmt_p++ = 'l';
       *fmt_p++ = 'x';
       *fmt_p++ = '\0';
+      DIAGNOSTIC_PUSH
+      DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
       fprintf_filtered (stream, fmt, val);
+      DIAGNOSTIC_POP
     }
   else
     {
       *fmt_p++ = 's';
       *fmt_p++ = '\0';
+      DIAGNOSTIC_PUSH
+      DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
       fprintf_filtered (stream, fmt, "(nil)");
+      DIAGNOSTIC_POP
     }
 }
 
@@ -2530,8 +2525,11 @@ ui_printf (const char *arg, struct ui_file *stream)
                                         &output, translit_char);
              obstack_grow_str0 (&output, "");
 
+             DIAGNOSTIC_PUSH
+             DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
              fprintf_filtered (stream, current_substring,
                                 obstack_base (&output));
+             DIAGNOSTIC_POP
            }
            break;
          case long_long_arg:
@@ -2539,7 +2537,10 @@ ui_printf (const char *arg, struct ui_file *stream)
            {
              long long val = value_as_long (val_args[i]);
 
+             DIAGNOSTIC_PUSH
+             DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
               fprintf_filtered (stream, current_substring, val);
+             DIAGNOSTIC_POP
              break;
            }
 #else
@@ -2549,14 +2550,20 @@ ui_printf (const char *arg, struct ui_file *stream)
            {
              int val = value_as_long (val_args[i]);
 
+             DIAGNOSTIC_PUSH
+             DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
               fprintf_filtered (stream, current_substring, val);
+             DIAGNOSTIC_POP
              break;
            }
          case long_arg:
            {
              long val = value_as_long (val_args[i]);
 
+             DIAGNOSTIC_PUSH
+             DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
               fprintf_filtered (stream, current_substring, val);
+             DIAGNOSTIC_POP
              break;
            }
          /* Handles floating-point values.  */
@@ -2580,7 +2587,10 @@ ui_printf (const char *arg, struct ui_file *stream)
               have modified GCC to include -Wformat-security by
               default, which will warn here if there is no
               argument.  */
+           DIAGNOSTIC_PUSH
+           DIAGNOSTIC_IGNORE_FORMAT_NONLITERAL
            fprintf_filtered (stream, current_substring, 0);
+           DIAGNOSTIC_POP
            break;
          default:
            internal_error (__FILE__, __LINE__,
@@ -2737,6 +2747,7 @@ with $), a register (a few standard names starting with $), or an actual\n\
 variable in the program being debugged.  EXP is any valid expression.\n\
 This may usually be abbreviated to simply \"set\"."),
           &setlist);
+  add_alias_cmd ("var", "variable", class_vars, 0, &setlist);
 
   c = add_com ("print", class_vars, print_command, _("\
 Print value of expression EXP.\n\
This page took 0.029939 seconds and 4 git commands to generate.