* c-lang.c (emit_char c_printchar c_printstr), c-lang.h (c_printstr)
[deliverable/binutils-gdb.git] / gdb / printcmd.c
index 22fbad57a01e069dab56d1c382b2f5dfc393e388..7d0f3a517f825a2e4bc1393e6b32112dd8da82c4 100644 (file)
@@ -16,7 +16,7 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
-Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "gdb_string.h"
@@ -33,6 +33,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "demangle.h"
 #include "valprint.h"
 #include "annotate.h"
+#include "symfile.h"   /* for overlay functions */
+#include "objfiles.h"  /* ditto */
 
 extern int asm_demangle;       /* Whether to demangle syms in asm printouts */
 extern int addressprint;       /* Whether to print hex addresses in HLL " */
@@ -56,6 +58,10 @@ static char last_size = 'w';
 
 static CORE_ADDR next_address;
 
+/* Default section to examine next. */
+
+static asection *next_section;
+
 /* Last address examined.  */
 
 static CORE_ADDR last_examine_address;
@@ -113,6 +119,12 @@ static int display_number;
 /* Pointer to the target-dependent disassembly function.  */
 
 int (*tm_print_insn) PARAMS ((bfd_vma, disassemble_info *));
+disassemble_info tm_print_insn_info;
+
+/* Functions exported for general use: */
+
+void output_command PARAMS ((char *, int));
+
 
 /* Prototypes for local functions.  */
 
@@ -139,14 +151,12 @@ static void free_display PARAMS ((struct display *));
 
 static void display_command PARAMS ((char *, int));
 
-static void x_command PARAMS ((char *, int));
+void x_command PARAMS ((char *, int));
 
 static void address_info PARAMS ((char *, int));
 
 static void set_command PARAMS ((char *, int));
 
-static void output_command PARAMS ((char *, int));
-
 static void call_command PARAMS ((char *, int));
 
 static void inspect_command PARAMS ((char *, int));
@@ -157,7 +167,7 @@ static void print_command_1 PARAMS ((char *, int, int));
 
 static void validate_format PARAMS ((struct format_data, char *));
 
-static void do_examine PARAMS ((struct format_data, CORE_ADDR));
+static void do_examine PARAMS ((struct format_data, CORE_ADDR addr, asection *section));
 
 static void print_formatted PARAMS ((value_ptr, int, int));
 
@@ -271,16 +281,22 @@ print_formatted (val, format, size)
      register int format;
      int size;
 {
-  int len = TYPE_LENGTH (VALUE_TYPE (val));
+  struct type *type = check_typedef (VALUE_TYPE (val));
+  int len = TYPE_LENGTH (type);
 
   if (VALUE_LVAL (val) == lval_memory)
-    next_address = VALUE_ADDRESS (val) + len;
+    {
+      next_address = VALUE_ADDRESS (val) + len;
+      next_section = VALUE_BFD_SECTION (val);
+    }
 
   switch (format)
     {
     case 's':
+      /* FIXME: Need to handle wchar_t's here... */
       next_address = VALUE_ADDRESS (val)
-       + val_print_string (VALUE_ADDRESS (val), 0, gdb_stdout);
+       + val_print_string (VALUE_ADDRESS (val), -1, 1, gdb_stdout);
+      next_section = VALUE_BFD_SECTION (val);
       break;
 
     case 'i':
@@ -292,18 +308,18 @@ print_formatted (val, format, size)
       wrap_here ("    ");
       next_address = VALUE_ADDRESS (val)
        + print_insn (VALUE_ADDRESS (val), gdb_stdout);
+      next_section = VALUE_BFD_SECTION (val);
       break;
 
     default:
       if (format == 0
-         || TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_ARRAY
-         || TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_STRING
-         || TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_STRUCT
-         || TYPE_CODE (VALUE_TYPE (val)) == TYPE_CODE_UNION
-         || VALUE_REPEATED (val))
+         || TYPE_CODE (type) == TYPE_CODE_ARRAY
+         || TYPE_CODE (type) == TYPE_CODE_STRING
+         || TYPE_CODE (type) == TYPE_CODE_STRUCT
+         || TYPE_CODE (type) == TYPE_CODE_UNION)
        value_print (val, gdb_stdout, format, Val_pretty_default);
       else
-       print_scalar_formatted (VALUE_CONTENTS (val), VALUE_TYPE (val),
+       print_scalar_formatted (VALUE_CONTENTS (val), type,
                                format, size, gdb_stdout);
     }
 }
@@ -324,7 +340,7 @@ print_scalar_formatted (valaddr, type, format, size, stream)
      GDB_FILE *stream;
 {
   LONGEST val_long;
-  int len = TYPE_LENGTH (type);
+  unsigned int len = TYPE_LENGTH (type);
 
   if (len > sizeof (LONGEST)
       && (format == 't'
@@ -334,18 +350,23 @@ print_scalar_formatted (valaddr, type, format, size, stream)
          || format == 'd'
          || format == 'x'))
     {
-      /* We can't print it normally, but we can print it in hex.
-         Printing it in the wrong radix is more useful than saying
-        "use /x, you dummy".  */
-      /* FIXME:  we could also do octal or binary if that was the
-        desired format.  */
-      /* FIXME:  we should be using the size field to give us a minimum
-        field width to print.  */
-      val_print_type_code_int (type, valaddr, stream);
-      return;
-    }
+      if (! TYPE_UNSIGNED (type)
+         || ! extract_long_unsigned_integer (valaddr, len, &val_long))
+       {
+         /* We can't print it normally, but we can print it in hex.
+            Printing it in the wrong radix is more useful than saying
+            "use /x, you dummy".  */
+         /* FIXME:  we could also do octal or binary if that was the
+            desired format.  */
+         /* FIXME:  we should be using the size field to give us a
+            minimum field width to print.  */
+         val_print_type_code_int (type, valaddr, stream);
+         return;
+       }
 
-  if (format != 'f')
+      /* If we get here, extract_long_unsigned_integer set val_long.  */
+    }
+  else if (format != 'f')
     val_long = unpack_long (type, valaddr);
 
   /* If we are printing it as unsigned, truncate it in case it is actually
@@ -501,6 +522,28 @@ print_address_symbolic (addr, stream, do_demangle, leadin)
   struct symtab *symtab = 0;
   CORE_ADDR name_location = 0;
   char *name = "";
+  asection *section = 0;
+  int unmapped = 0;
+
+  /* Determine if the address is in an overlay, and whether it is mapped. */
+  if (overlay_debugging)
+    {
+      section = find_pc_overlay (addr);
+      if (pc_in_unmapped_range (addr, section))
+       {
+         unmapped = 1;
+         addr = overlay_mapped_address (addr, section);
+       }
+    }
+
+  /* On some targets, add in extra "flag" bits to PC for
+     disassembly.  This should ensure that "rounding errors" in
+     symbol addresses that are masked for disassembly favour the
+     the correct symbol. */
+
+#ifdef GDB_TARGET_UNMASK_DISAS_PC
+  addr = GDB_TARGET_UNMASK_DISAS_PC (addr);
+#endif
 
   /* First try to find the address in the symbol table, then
      in the minsyms.  Take the closest one.  */
@@ -511,19 +554,18 @@ print_address_symbolic (addr, stream, do_demangle, leadin)
      save some memory, but for many debug format--ELF/DWARF or
      anything/stabs--it would be inconvenient to eliminate those minimal
      symbols anyway).  */
-  symbol = find_pc_function (addr);
-  if (symbol)
-    name_location = BLOCK_START (SYMBOL_BLOCK_VALUE (symbol));
+  msymbol = lookup_minimal_symbol_by_pc_section (addr, section);
+  symbol = find_pc_sect_function (addr, section);
 
   if (symbol)
     {
+      name_location = BLOCK_START (SYMBOL_BLOCK_VALUE (symbol));
       if (do_demangle)
        name = SYMBOL_SOURCE_NAME (symbol);
       else
        name = SYMBOL_LINKAGE_NAME (symbol);
     }
 
-  msymbol = lookup_minimal_symbol_by_pc (addr);
   if (msymbol != NULL)
     {
       if (SYMBOL_VALUE_ADDRESS (msymbol) > name_location || symbol == NULL)
@@ -542,6 +584,14 @@ print_address_symbolic (addr, stream, do_demangle, leadin)
   if (symbol == NULL && msymbol == NULL)
     return;
 
+  /* On some targets, mask out extra "flag" bits from PC for handsome
+     disassembly. */
+
+#ifdef GDB_TARGET_MASK_DISAS_PC
+  name_location = GDB_TARGET_MASK_DISAS_PC (name_location);
+  addr = GDB_TARGET_MASK_DISAS_PC (addr);
+#endif
+
   /* If the nearest symbol is too far away, don't print anything symbolic.  */
 
   /* For when CORE_ADDR is larger than unsigned int, we do math in
@@ -554,7 +604,10 @@ print_address_symbolic (addr, stream, do_demangle, leadin)
     return;
 
   fputs_filtered (leadin, stream);
-  fputs_filtered ("<", stream);
+  if (unmapped)
+    fputs_filtered ("<*", stream);
+  else
+    fputs_filtered ("<", stream);
   fputs_filtered (name, stream);
   if (addr != name_location)
     fprintf_filtered (stream, "+%u", (unsigned int)(addr - name_location));
@@ -565,7 +618,8 @@ print_address_symbolic (addr, stream, do_demangle, leadin)
     {
       struct symtab_and_line sal;
 
-      sal = find_pc_line (addr, 0);
+      sal = find_pc_sect_line (addr, section, 0);
+
       if (sal.symtab)
        fprintf_filtered (stream, " at %s:%d", sal.symtab->filename, sal.line);
       else if (symtab && symbol && symbol->line)
@@ -573,7 +627,10 @@ print_address_symbolic (addr, stream, do_demangle, leadin)
       else if (symtab)
        fprintf_filtered (stream, " in %s", symtab->filename);
     }
-  fputs_filtered (">", stream);
+  if (unmapped)
+    fputs_filtered ("*>", stream);
+  else
+    fputs_filtered (">", stream);
 }
 
 /* Print address ADDR on STREAM.  USE_LOCAL means the same thing as for
@@ -586,7 +643,7 @@ print_address_numeric (addr, use_local, stream)
 {
   /* This assumes a CORE_ADDR can fit in a LONGEST.  Probably a safe
      assumption.  */
-  print_longest (stream, 'x', use_local, (unsigned LONGEST) addr);
+  print_longest (stream, 'x', use_local, (ULONGEST) addr);
 }
 
 /* Print address ADDR symbolically on STREAM.
@@ -632,6 +689,8 @@ print_address_demangle (addr, stream, do_demangle)
 /* These are the types that $__ will get after an examine command of one
    of these sizes.  */
 
+static struct type *examine_i_type;
+
 static struct type *examine_b_type;
 static struct type *examine_h_type;
 static struct type *examine_w_type;
@@ -641,9 +700,10 @@ static struct type *examine_g_type;
    Fetch it from memory and print on gdb_stdout.  */
 
 static void
-do_examine (fmt, addr)
+do_examine (fmt, addr, sect)
      struct format_data fmt;
      CORE_ADDR addr;
+     asection *sect;
 {
   register char format = 0;
   register char size;
@@ -656,13 +716,16 @@ do_examine (fmt, addr)
   size = fmt.size;
   count = fmt.count;
   next_address = addr;
+  next_section = sect;
 
   /* String or instruction format implies fetch single bytes
      regardless of the specified size.  */
   if (format == 's' || format == 'i')
     size = 'b';
 
-  if (size == 'b')
+  if (format == 'i')
+    val_type = examine_i_type;
+  else if (size == 'b')
     val_type = examine_b_type;
   else if (size == 'h')
     val_type = examine_h_type;
@@ -684,6 +747,7 @@ do_examine (fmt, addr)
 
   while (count > 0)
     {
+      QUIT;
       print_address (next_address, gdb_stdout);
       printf_filtered (":");
       for (i = maxelts;
@@ -694,7 +758,16 @@ do_examine (fmt, addr)
          /* Note that print_formatted sets next_address for the next
             object.  */
          last_examine_address = next_address;
-         last_examine_value = value_at (val_type, next_address);
+         /* The value to be displayed is not fetched greedily.
+             Instead, to avoid the posibility of a fetched value not
+             being used, its retreval is delayed until the print code
+             uses it.  When examining an instruction stream, the
+             disassembler will perform its own memory fetch using just
+             the address stored in LAST_EXAMINE_VALUE.  FIXME: Should
+             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, sect);
          print_formatted (last_examine_value, format, size);
        }
       printf_filtered ("\n");
@@ -850,7 +923,7 @@ call_command (exp, from_tty)
 }
 
 /* ARGSUSED */
-static void
+void
 output_command (exp, from_tty)
      char *exp;
      int from_tty;
@@ -896,6 +969,53 @@ set_command (exp, from_tty)
   do_cleanups (old_chain);
 }
 
+/* ARGSUSED */
+static void
+sym_info (arg, from_tty)
+     char *arg;
+     int   from_tty;
+{
+  struct minimal_symbol *msymbol;
+  struct objfile        *objfile;
+  struct obj_section    *osect;
+  asection              *sect;
+  CORE_ADDR              addr, sect_addr;
+  int                    matches = 0;
+  unsigned int           offset;
+
+  if (!arg)
+    error_no_arg ("address");
+
+  addr = parse_and_eval_address (arg);
+  ALL_OBJSECTIONS (objfile, osect)
+    {
+      sect = osect->the_bfd_section;
+      sect_addr = overlay_mapped_address (addr, sect);
+
+      if (osect->addr <= sect_addr && sect_addr < osect->endaddr &&
+         (msymbol = lookup_minimal_symbol_by_pc_section (sect_addr, sect)))
+       {
+         matches = 1;
+         offset = sect_addr - SYMBOL_VALUE_ADDRESS (msymbol);
+         if (offset)
+           printf_filtered ("%s + %u in ", 
+                            SYMBOL_SOURCE_NAME (msymbol), offset);
+         else
+           printf_filtered ("%s in ", 
+                            SYMBOL_SOURCE_NAME (msymbol));
+         if (pc_in_unmapped_range (addr, sect))
+           printf_filtered ("load address range of ");
+         if (section_is_overlay (sect))
+           printf_filtered ("%s overlay ", 
+                            section_is_mapped (sect) ? "mapped" : "unmapped");
+         printf_filtered ("section %s", sect->name);
+         printf_filtered ("\n");
+       }
+    }
+  if (matches == 0)
+    printf_filtered ("No symbol matches %s.\n", arg);
+}
+
 /* ARGSUSED */
 static void
 address_info (exp, from_tty)
@@ -906,6 +1026,8 @@ address_info (exp, from_tty)
   register struct minimal_symbol *msymbol;
   register long val;
   register long basereg;
+  asection *section;
+  CORE_ADDR load_addr;
   int is_a_field_of_this;      /* C++: lookup_symbol sets this to nonzero
                                   if exp is a field of `this'. */
 
@@ -929,13 +1051,23 @@ address_info (exp, from_tty)
 
       if (msymbol != NULL)
        {
+         load_addr = SYMBOL_VALUE_ADDRESS (msymbol);
+
          printf_filtered ("Symbol \"");
          fprintf_symbol_filtered (gdb_stdout, exp,
                                   current_language->la_language, DMGL_ANSI);
          printf_filtered ("\" is at ");
-         print_address_numeric (SYMBOL_VALUE_ADDRESS (msymbol), 1,
-                                gdb_stdout);
-         printf_filtered (" in a file compiled without debugging.\n");
+         print_address_numeric (load_addr, 1, gdb_stdout);
+         printf_filtered (" in a file compiled without debugging");
+         section = SYMBOL_BFD_SECTION (msymbol);
+         if (section_is_overlay (section))
+           {
+             load_addr = overlay_unmapped_address (load_addr, section);
+             printf_filtered (",\n -- loaded at ");
+             print_address_numeric (load_addr, 1, gdb_stdout);
+             printf_filtered (" in overlay section %s", section->name);
+           }
+         printf_filtered (".\n");
        }
       else
        error ("No symbol \"%s\" in current context.", exp);
@@ -946,8 +1078,9 @@ address_info (exp, from_tty)
   fprintf_symbol_filtered (gdb_stdout, SYMBOL_NAME (sym),
                           current_language->la_language, DMGL_ANSI);
   printf_filtered ("\" is ");
-  val = SYMBOL_VALUE (sym);
+  val     = SYMBOL_VALUE (sym);
   basereg = SYMBOL_BASEREG (sym);
+  section = SYMBOL_BFD_SECTION (sym);
 
   switch (SYMBOL_CLASS (sym))
     {
@@ -958,7 +1091,15 @@ address_info (exp, from_tty)
 
     case LOC_LABEL:
       printf_filtered ("a label at address ");
-      print_address_numeric (SYMBOL_VALUE_ADDRESS (sym), 1, gdb_stdout);
+      print_address_numeric (load_addr = SYMBOL_VALUE_ADDRESS (sym), 
+                            1, gdb_stdout);
+      if (section_is_overlay (section))
+       {
+         load_addr = overlay_unmapped_address (load_addr, section);
+         printf_filtered (",\n -- loaded at ");
+         print_address_numeric (load_addr, 1, gdb_stdout);
+         printf_filtered (" in overlay section %s", section->name);
+       }
       break;
 
     case LOC_REGISTER:
@@ -967,7 +1108,15 @@ address_info (exp, from_tty)
 
     case LOC_STATIC:
       printf_filtered ("static storage at address ");
-      print_address_numeric (SYMBOL_VALUE_ADDRESS (sym), 1, gdb_stdout);
+      print_address_numeric (load_addr = SYMBOL_VALUE_ADDRESS (sym), 
+                            1, gdb_stdout);
+      if (section_is_overlay (section))
+       {
+         load_addr = overlay_unmapped_address (load_addr, section);
+         printf_filtered (",\n -- loaded at ");
+         print_address_numeric (load_addr, 1, gdb_stdout);
+         printf_filtered (" in overlay section %s", section->name);
+       }
       break;
 
     case LOC_REGPARM:
@@ -1010,8 +1159,45 @@ address_info (exp, from_tty)
 
     case LOC_BLOCK:
       printf_filtered ("a function at address ");
-      print_address_numeric (BLOCK_START (SYMBOL_BLOCK_VALUE (sym)), 1,
-                            gdb_stdout);
+#ifdef GDB_TARGET_MASK_DISAS_PC
+      print_address_numeric
+       (load_addr= GDB_TARGET_MASK_DISAS_PC (BLOCK_START (SYMBOL_BLOCK_VALUE (sym))),
+        1, gdb_stdout);
+#else
+      print_address_numeric (load_addr=BLOCK_START (SYMBOL_BLOCK_VALUE (sym)),
+                            1, gdb_stdout);
+#endif
+      if (section_is_overlay (section))
+       {
+         load_addr = overlay_unmapped_address (load_addr, section);
+         printf_filtered (",\n -- loaded at ");
+         print_address_numeric (load_addr, 1, gdb_stdout);
+         printf_filtered (" in overlay section %s", section->name);
+       }
+      break;
+
+    case LOC_UNRESOLVED:
+      {
+       struct minimal_symbol *msym;
+
+       msym = lookup_minimal_symbol (SYMBOL_NAME (sym), NULL, NULL);
+       if (msym == NULL)
+         printf_filtered ("unresolved");
+       else
+         {
+           section = SYMBOL_BFD_SECTION (msym);
+           printf_filtered ("static storage at address ");
+           print_address_numeric (load_addr = SYMBOL_VALUE_ADDRESS (msym), 
+                                  1, gdb_stdout);
+           if (section_is_overlay (section))
+             {
+               load_addr = overlay_unmapped_address (load_addr, section);
+               printf_filtered (",\n -- loaded at ");
+               print_address_numeric (load_addr, 1, gdb_stdout);
+               printf_filtered (" in overlay section %s", section->name);
+             }
+         }
+      }
       break;
 
     case LOC_OPTIMIZED_OUT:
@@ -1025,7 +1211,7 @@ address_info (exp, from_tty)
   printf_filtered (".\n");
 }
 \f
-static void
+void
 x_command (exp, from_tty)
      char *exp;
      int from_tty;
@@ -1067,10 +1253,12 @@ x_command (exp, from_tty)
        next_address = VALUE_ADDRESS (val);
       else
        next_address = value_as_pointer (val);
+      if (VALUE_BFD_SECTION (val))
+       next_section = VALUE_BFD_SECTION (val);
       do_cleanups (old_chain);
     }
 
-  do_examine (fmt, next_address);
+  do_examine (fmt, next_address, next_section);
 
   /* If the examine succeeds, we remember its size and format for next time.  */
   last_size = fmt.size;
@@ -1087,7 +1275,13 @@ x_command (exp, from_tty)
                                   (LONGEST) last_examine_address));
       
       /* Make contents of last address examined available to the user as $__.*/
-      set_internalvar (lookup_internalvar ("__"), last_examine_value);
+      /* 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))
+       set_internalvar (lookup_internalvar ("__"),
+                        allocate_value (builtin_type_void));
+      else
+       set_internalvar (lookup_internalvar ("__"), last_examine_value);
     }
 }
 
@@ -1268,6 +1462,7 @@ do_one_display (d)
   if (d->format.size)
     {
       CORE_ADDR addr;
+      value_ptr val;
 
       annotate_display_format ();
 
@@ -1289,13 +1484,14 @@ do_one_display (d)
       else
        printf_filtered ("  ");
       
-      addr = value_as_pointer (evaluate_expression (d->exp));
+      val = evaluate_expression (d->exp);
+      addr = value_as_pointer (val);
       if (d->format.format == 'i')
        addr = ADDR_BITS_REMOVE (addr);
 
       annotate_display_value ();
 
-      do_examine (d->format, addr);
+      do_examine (d->format, addr, VALUE_BFD_SECTION (val));
     }
   else
     {
@@ -1530,7 +1726,6 @@ print_frame_args (func, fi, num, stream)
       case LOC_REF_ARG:
        {
          long current_offset = SYMBOL_VALUE (sym);
-
          arg_size = TYPE_LENGTH (SYMBOL_TYPE (sym));
          
          /* Compute address of next argument by adding the size of
@@ -1636,8 +1831,14 @@ print_frame_args (func, fi, num, stream)
       annotate_arg_value (val == NULL ? NULL : VALUE_TYPE (val));
 
       if (val)
+       {
+#ifdef GDB_TARGET_IS_D10V
+         if (SYMBOL_CLASS(sym) == LOC_REGPARM && TYPE_CODE(VALUE_TYPE(val)) == TYPE_CODE_PTR)
+           TYPE_LENGTH(VALUE_TYPE(val)) = 2;
+#endif
         val_print (VALUE_TYPE (val), VALUE_CONTENTS (val), VALUE_ADDRESS (val),
                   stream, 0, 0, 2, Val_no_prettyprint);
+       }
       else
        fputs_filtered ("???", stream);
 
@@ -1898,9 +2099,10 @@ printf_command (arg, from_tty)
  
        if (argclass[nargs] == double_arg)
          {
-           if (TYPE_LENGTH (VALUE_TYPE (val_args[nargs])) == sizeof (float))
+           struct type *type = VALUE_TYPE (val_args[nargs]);
+           if (TYPE_LENGTH (type) == sizeof (float))
              VALUE_TYPE (val_args[nargs]) = builtin_type_float;
-           if (TYPE_LENGTH (VALUE_TYPE (val_args[nargs])) == sizeof (double))
+           if (TYPE_LENGTH (type) == sizeof (double))
              VALUE_TYPE (val_args[nargs]) = builtin_type_double;
          }
        nargs++;
@@ -1930,14 +2132,15 @@ printf_command (arg, from_tty)
                {
                  char c;
                  QUIT;
-                 read_memory (tem + j, &c, 1);
+                 read_memory_section (tem + j, &c, 1,
+                                      VALUE_BFD_SECTION (val_args[i]));
                  if (c == 0)
                    break;
                }
 
              /* Copy the string contents into a string inside GDB.  */
              str = (char *) alloca (j + 1);
-             read_memory (tem, str, j);
+             read_memory_section (tem, str, j, VALUE_BFD_SECTION (val_args[i]));
              str[j] = 0;
 
              printf_filtered (current_substring, str);
@@ -1993,8 +2196,9 @@ disassemble_command (arg, from_tty)
 {
   CORE_ADDR low, high;
   char *name;
-  CORE_ADDR pc;
+  CORE_ADDR pc, pc_masked;
   char *space_index;
+  asection *section;
 
   name = NULL;
   if (!arg)
@@ -2005,6 +2209,7 @@ disassemble_command (arg, from_tty)
       pc = get_frame_pc (selected_frame);
       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
        error ("No function contains program counter for selected frame.\n");
+      low += FUNCTION_START_OFFSET;
     }
   else if (!(space_index = (char *) strchr (arg, ' ')))
     {
@@ -2012,6 +2217,7 @@ disassemble_command (arg, from_tty)
       pc = parse_and_eval_address (arg);
       if (find_pc_partial_function (pc, &name, &low, &high) == 0)
        error ("No function contains specified address.\n");
+      low += FUNCTION_START_OFFSET;
     }
   else
     {
@@ -2036,15 +2242,29 @@ disassemble_command (arg, from_tty)
     }
 
   /* Dump the specified range.  */
-  for (pc = low; pc < high; )
+  pc = low;
+
+#ifdef GDB_TARGET_MASK_DISAS_PC
+  pc_masked = GDB_TARGET_MASK_DISAS_PC (pc);
+#else
+  pc_masked = pc;
+#endif
+
+  while (pc_masked < high)
     {
       QUIT;
-      print_address (pc, gdb_stdout);
+      print_address (pc_masked, gdb_stdout);
       printf_filtered (":\t");
       /* We often wrap here if there are long symbolic names.  */
       wrap_here ("    ");
       pc += print_insn (pc, gdb_stdout);
       printf_filtered ("\n");
+
+#ifdef GDB_TARGET_MASK_DISAS_PC
+      pc_masked = GDB_TARGET_MASK_DISAS_PC (pc);
+#else
+      pc_masked = pc;
+#endif
     }
   printf_filtered ("End of assembler dump.\n");
   gdb_flush (gdb_stdout);
@@ -2058,23 +2278,20 @@ print_insn (memaddr, stream)
      CORE_ADDR memaddr;
      GDB_FILE *stream;
 {
-  disassemble_info info;
-
-#define GDB_INIT_DISASSEMBLE_INFO(INFO, STREAM) \
-  (INFO).fprintf_func = (fprintf_ftype)fprintf_filtered, \
-  (INFO).stream = (STREAM), \
-  (INFO).read_memory_func = dis_asm_read_memory, \
-  (INFO).memory_error_func = dis_asm_memory_error, \
-  (INFO).print_address_func = dis_asm_print_address, \
-  (INFO).insn_info_valid = 0
-
-  GDB_INIT_DISASSEMBLE_INFO(info, stream);
-
   /* If there's no disassembler, something is very wrong.  */
   if (tm_print_insn == NULL)
     abort ();
 
-  return (*tm_print_insn) (memaddr, &info);
+  if (TARGET_BYTE_ORDER == BIG_ENDIAN)
+    tm_print_insn_info.endian = BFD_ENDIAN_BIG;
+  else
+    tm_print_insn_info.endian = BFD_ENDIAN_LITTLE;
+
+  if (target_architecture != NULL)
+    tm_print_insn_info.mach = target_architecture->mach;
+  /* else: should set .mach=0 but some disassemblers don't grok this */
+
+  return (*tm_print_insn) (memaddr, &tm_print_insn_info);
 }
 
 \f
@@ -2084,7 +2301,11 @@ _initialize_printcmd ()
   current_display_number = -1;
 
   add_info ("address", address_info,
-          "Describe where variable VAR is stored.");
+          "Describe where symbol SYM is stored.");
+
+  add_info ("symbol", sym_info, 
+           "Describe what symbol is at location ADDR.\n\
+Only for symbols with fixed locations (global or static scope).");
 
   add_com ("x", class_vars, x_command,
           concat ("Examine memory: x/FMT ADDRESS.\n\
@@ -2225,8 +2446,19 @@ environment, the value is printed in its own window.");
                   &setprintlist),
       &showprintlist);
 
+  /* For examine/instruction a single byte quantity is specified as
+     the data.  This avoids problems with value_at_lazy() requiring a
+     valid data type (and rejecting VOID). */
+  examine_i_type = init_type (TYPE_CODE_INT, 1, 0, "examine_i_type", NULL);
+
   examine_b_type = init_type (TYPE_CODE_INT, 1, 0, "examine_b_type", NULL);
   examine_h_type = init_type (TYPE_CODE_INT, 2, 0, "examine_h_type", NULL);
   examine_w_type = init_type (TYPE_CODE_INT, 4, 0, "examine_w_type", NULL);
   examine_g_type = init_type (TYPE_CODE_INT, 8, 0, "examine_g_type", NULL);
+
+  INIT_DISASSEMBLE_INFO_NO_ARCH (tm_print_insn_info, gdb_stdout, (fprintf_ftype)fprintf_filtered);
+  tm_print_insn_info.flavour = bfd_target_unknown_flavour;
+  tm_print_insn_info.read_memory_func = dis_asm_read_memory;
+  tm_print_insn_info.memory_error_func = dis_asm_memory_error;
+  tm_print_insn_info.print_address_func = dis_asm_print_address;
 }
This page took 0.039256 seconds and 4 git commands to generate.