2010-03-09 Sriraman Tallam <tmsriram@google.com>
[deliverable/binutils-gdb.git] / gdb / stack.c
index a77fe5e9694a9bb21004edc9e2794e2911e2aa13..2caf9d29ba2ff803d1ec156a2cb23041c85a8877 100644 (file)
@@ -2,7 +2,7 @@
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008,
-   2009 Free Software Foundation, Inc.
+   2009, 2010 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -164,6 +164,8 @@ static void
 print_frame_nameless_args (struct frame_info *frame, long start, int num,
                           int first, struct ui_file *stream)
 {
+  struct gdbarch *gdbarch = get_frame_arch (frame);
+  enum bfd_endian byte_order = gdbarch_byte_order (gdbarch);
   int i;
   CORE_ADDR argsaddr;
   long arg_value;
@@ -174,7 +176,8 @@ print_frame_nameless_args (struct frame_info *frame, long start, int num,
       argsaddr = get_frame_args_address (frame);
       if (!argsaddr)
        return;
-      arg_value = read_memory_integer (argsaddr + start, sizeof (int));
+      arg_value = read_memory_integer (argsaddr + start,
+                                      sizeof (int), byte_order);
       if (!first)
        fprintf_filtered (stream, ", ");
       fprintf_filtered (stream, "%ld", arg_value);
@@ -478,7 +481,9 @@ static void
 gdb_disassembly_stub (void *args)
 {
   struct gdb_disassembly_stub_args *p = args;
-  gdb_disassembly (p->gdbarch, uiout, 0, 0, p->how_many, p->low, p->high);
+  gdb_disassembly (p->gdbarch, uiout, 0,
+                   DISASSEMBLY_RAW_INSN, p->how_many,
+                   p->low, p->high);
 }
 
 /* Use TRY_CATCH to catch the exception from the gdb_disassembly
@@ -520,6 +525,7 @@ void
 print_frame_info (struct frame_info *frame, int print_level,
                  enum print_what print_what, int print_args)
 {
+  struct gdbarch *gdbarch = get_frame_arch (frame);
   struct symtab_and_line sal;
   int source_print;
   int location_print;
@@ -532,7 +538,7 @@ print_frame_info (struct frame_info *frame, int print_level,
        = make_cleanup_ui_out_tuple_begin_end (uiout, "frame");
 
       annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
-                           get_frame_pc (frame));
+                           gdbarch, get_frame_pc (frame));
 
       /* Do this regardless of SOURCE because we don't have any source
          to list for this frame.  */
@@ -545,7 +551,8 @@ print_frame_info (struct frame_info *frame, int print_level,
       if (ui_out_is_mi_like_p (uiout))
         {
           annotate_frame_address ();
-          ui_out_field_core_addr (uiout, "addr", get_frame_pc (frame));
+          ui_out_field_core_addr (uiout, "addr",
+                                 gdbarch, get_frame_pc (frame));
           annotate_frame_address_end ();
         }
 
@@ -624,7 +631,8 @@ print_frame_info (struct frame_info *frame, int print_level,
                 ability to decide for themselves if it is desired.  */
              if (opts.addressprint && mid_statement)
                {
-                 ui_out_field_core_addr (uiout, "addr", get_frame_pc (frame));
+                 ui_out_field_core_addr (uiout, "addr",
+                                         gdbarch, get_frame_pc (frame));
                  ui_out_text (uiout, "\t");
                }
 
@@ -635,12 +643,12 @@ print_frame_info (struct frame_info *frame, int print_level,
       /* If disassemble-next-line is set to on and there is line debug
          messages, output assembly codes for next line.  */
       if (disassemble_next_line == AUTO_BOOLEAN_TRUE)
-       do_gdb_disassembly (get_frame_arch (frame), -1,
-                           get_frame_pc (frame), sal.end);
+       do_gdb_disassembly (get_frame_arch (frame), -1, sal.pc, sal.end);
     }
 
   if (print_what != LOCATION)
-    set_default_breakpoint (1, get_frame_pc (frame), sal.symtab, sal.line);
+    set_default_breakpoint (1, sal.pspace,
+                           get_frame_pc (frame), sal.symtab, sal.line);
 
   annotate_frame_end ();
 
@@ -735,6 +743,7 @@ print_frame (struct frame_info *frame, int print_level,
             enum print_what print_what, int print_args,
             struct symtab_and_line sal)
 {
+  struct gdbarch *gdbarch = get_frame_arch (frame);
   char *funname = NULL;
   enum language funlang = language_unknown;
   struct ui_stream *stb;
@@ -747,7 +756,7 @@ print_frame (struct frame_info *frame, int print_level,
   find_frame_funname (frame, &funname, &funlang);
 
   annotate_frame_begin (print_level ? frame_relative_level (frame) : 0,
-                       get_frame_pc (frame));
+                       gdbarch, get_frame_pc (frame));
 
   list_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "frame");
 
@@ -763,7 +772,7 @@ print_frame (struct frame_info *frame, int print_level,
        || print_what == LOC_AND_ADDRESS)
       {
        annotate_frame_address ();
-       ui_out_field_core_addr (uiout, "addr", get_frame_pc (frame));
+       ui_out_field_core_addr (uiout, "addr", gdbarch, get_frame_pc (frame));
        annotate_frame_address_end ();
        ui_out_text (uiout, " in ");
       }
@@ -816,7 +825,8 @@ print_frame (struct frame_info *frame, int print_level,
 #ifdef PC_SOLIB
       char *lib = PC_SOLIB (get_frame_pc (frame));
 #else
-      char *lib = solib_name_from_address (get_frame_pc (frame));
+      char *lib = solib_name_from_address (get_frame_program_space (frame),
+                                          get_frame_pc (frame));
 #endif
       if (lib)
        {
@@ -1052,10 +1062,10 @@ frame_info (char *addr_exp, int from_tty)
     {
       printf_filtered (_("Stack frame at "));
     }
-  fputs_filtered (paddress (get_frame_base (fi)), gdb_stdout);
+  fputs_filtered (paddress (gdbarch, get_frame_base (fi)), gdb_stdout);
   printf_filtered (":\n");
   printf_filtered (" %s = ", pc_regname);
-  fputs_filtered (paddress (get_frame_pc (fi)), gdb_stdout);
+  fputs_filtered (paddress (gdbarch, get_frame_pc (fi)), gdb_stdout);
 
   wrap_here ("   ");
   if (funname)
@@ -1070,7 +1080,7 @@ frame_info (char *addr_exp, int from_tty)
   puts_filtered ("; ");
   wrap_here ("    ");
   printf_filtered ("saved %s ", pc_regname);
-  fputs_filtered (paddress (frame_unwind_caller_pc (fi)), gdb_stdout);
+  fputs_filtered (paddress (gdbarch, frame_unwind_caller_pc (fi)), gdb_stdout);
   printf_filtered ("\n");
 
   if (calling_frame_info == NULL)
@@ -1088,7 +1098,7 @@ frame_info (char *addr_exp, int from_tty)
   else
     {
       printf_filtered (" called by frame at ");
-      fputs_filtered (paddress (get_frame_base (calling_frame_info)),
+      fputs_filtered (paddress (gdbarch, get_frame_base (calling_frame_info)),
                      gdb_stdout);
     }
   if (get_next_frame (fi) && calling_frame_info)
@@ -1097,7 +1107,7 @@ frame_info (char *addr_exp, int from_tty)
   if (get_next_frame (fi))
     {
       printf_filtered (" caller of frame at ");
-      fputs_filtered (paddress (get_frame_base (get_next_frame (fi))),
+      fputs_filtered (paddress (gdbarch, get_frame_base (get_next_frame (fi))),
                      gdb_stdout);
     }
   if (get_next_frame (fi) || calling_frame_info)
@@ -1118,7 +1128,7 @@ frame_info (char *addr_exp, int from_tty)
     else
       {
        printf_filtered (" Arglist at ");
-       fputs_filtered (paddress (arg_list), gdb_stdout);
+       fputs_filtered (paddress (gdbarch, arg_list), gdb_stdout);
        printf_filtered (",");
 
        if (!gdbarch_frame_num_args_p (gdbarch))
@@ -1150,7 +1160,7 @@ frame_info (char *addr_exp, int from_tty)
     else
       {
        printf_filtered (" Locals at ");
-       fputs_filtered (paddress (arg_list), gdb_stdout);
+       fputs_filtered (paddress (gdbarch, arg_list), gdb_stdout);
        printf_filtered (",");
       }
   }
@@ -1180,6 +1190,8 @@ frame_info (char *addr_exp, int from_tty)
                               &realnum, NULL);
        if (!optimized && 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),
@@ -1188,18 +1200,16 @@ frame_info (char *addr_exp, int from_tty)
            /* 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,
-                                          register_size (gdbarch,
-                                          gdbarch_sp_regnum (gdbarch)));
+           sp = extract_unsigned_integer (value, sp_size, byte_order);
            printf_filtered (" Previous frame's sp is ");
-           fputs_filtered (paddress (sp), gdb_stdout);
+           fputs_filtered (paddress (gdbarch, sp), gdb_stdout);
            printf_filtered ("\n");
            need_nl = 0;
          }
        else if (!optimized && lval == lval_memory)
          {
            printf_filtered (" Previous frame's sp at ");
-           fputs_filtered (paddress (addr), gdb_stdout);
+           fputs_filtered (paddress (gdbarch, addr), gdb_stdout);
            printf_filtered ("\n");
            need_nl = 0;
          }
@@ -1234,7 +1244,7 @@ frame_info (char *addr_exp, int from_tty)
              wrap_here (" ");
              printf_filtered (" %s at ",
                               gdbarch_register_name (gdbarch, i));
-             fputs_filtered (paddress (addr), gdb_stdout);
+             fputs_filtered (paddress (gdbarch, addr), gdb_stdout);
              count++;
            }
        }
@@ -1266,11 +1276,6 @@ backtrace_command_1 (char *count_exp, int show_locals, int from_tty)
      of frames which we should print, or -1 if all of them.  */
   trailing = get_current_frame ();
 
-  /* The target can be in a state where there is no valid frames
-     (e.g., just connected). */
-  if (trailing == NULL)
-    error (_("No stack."));
-
   trailing_level = 0;
   if (count_exp)
     {
@@ -1482,11 +1487,19 @@ print_block_frame_locals (struct block *b, struct frame_info *frame,
   return values_printed;
 }
 
+
 /* Same, but print labels.  */
 
+#if 0
+/* Commented out, as the code using this function has also been
+   commented out.  FIXME:brobecker/2009-01-13: Find out why the code
+   was commented out in the first place.  The discussion introducing
+   this change (2007-12-04: Support lexical blocks and function bodies
+   that occupy non-contiguous address ranges) did not explain why
+   this change was made.  */
 static int
-print_block_frame_labels (struct block *b, int *have_default,
-                         struct ui_file *stream)
+print_block_frame_labels (struct gdbarch *gdbarch, struct block *b,
+                         int *have_default, struct ui_file *stream)
 {
   struct dict_iterator iter;
   struct symbol *sym;
@@ -1511,7 +1524,8 @@ print_block_frame_labels (struct block *b, int *have_default,
          if (opts.addressprint)
            {
              fprintf_filtered (stream, " ");
-             fputs_filtered (paddress (SYMBOL_VALUE_ADDRESS (sym)), stream);
+             fputs_filtered (paddress (gdbarch, SYMBOL_VALUE_ADDRESS (sym)),
+                             stream);
            }
          fprintf_filtered (stream, " in file %s, line %d\n",
                            sal.symtab->filename, sal.line);
@@ -1520,6 +1534,7 @@ print_block_frame_labels (struct block *b, int *have_default,
 
   return values_printed;
 }
+#endif
 
 /* Print on STREAM all the local variables in frame FRAME, including
    all the blocks active in that frame at its current PC.
@@ -1568,6 +1583,7 @@ print_frame_label_vars (struct frame_info *frame, int this_level_only,
 #else
   struct blockvector *bl;
   struct block *block = get_frame_block (frame, 0);
+  struct gdbarch *gdbarch = get_frame_arch (frame);
   int values_printed = 0;
   int index, have_default = 0;
   char *blocks_printed;
@@ -1605,7 +1621,8 @@ print_frame_label_vars (struct frame_info *frame, int this_level_only,
        {
          if (blocks_printed[index] == 0)
            {
-             if (print_block_frame_labels (BLOCKVECTOR_BLOCK (bl, index),
+             if (print_block_frame_labels (gdbarch,
+                                           BLOCKVECTOR_BLOCK (bl, index),
                                            &have_default, stream))
                values_printed = 1;
              blocks_printed[index] = 1;
This page took 0.038106 seconds and 4 git commands to generate.