gdb/
[deliverable/binutils-gdb.git] / gdb / tui / tui-winsource.c
index b93c2c9d6f26ded43100e03ef9cbf03d93ac629e..ee6827ea047775955408e86a970fa0b7c5fa9ba8 100644 (file)
@@ -1,7 +1,6 @@
 /* TUI display source/assembly window.
 
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006, 2007, 2008,
-   2009 Free Software Foundation, Inc.
+   Copyright (C) 1998-2013 Free Software Foundation, Inc.
 
    Contributed by Hewlett-Packard Company.
 
@@ -27,6 +26,8 @@
 #include "breakpoint.h"
 #include "value.h"
 #include "source.h"
+#include "objfiles.h"
+#include "filenames.h"
 
 #include "tui/tui.h"
 #include "tui/tui-data.h"
@@ -47,19 +48,20 @@ tui_display_main (void)
 {
   if ((tui_source_windows ())->count > 0)
     {
+      struct gdbarch *gdbarch;
       CORE_ADDR addr;
 
-      addr = tui_get_begin_asm_address ();
+      tui_get_begin_asm_address (&gdbarch, &addr);
       if (addr != (CORE_ADDR) 0)
        {
          struct symtab_and_line sal;
 
-         tui_update_source_windows_with_addr (addr);
+         tui_update_source_windows_with_addr (gdbarch, addr);
          sal = find_pc_line (addr, 0);
           if (sal.symtab)
-             tui_update_locator_filename (sal.symtab->filename);
+             tui_update_locator_fullname (symtab_to_fullname (sal.symtab));
           else
-             tui_update_locator_filename ("??");
+             tui_update_locator_fullname ("??");
        }
     }
 }
@@ -70,12 +72,13 @@ tui_display_main (void)
    initializes the horizontal scroll to 0.  */
 void
 tui_update_source_window (struct tui_win_info *win_info,
+                         struct gdbarch *gdbarch,
                          struct symtab *s,
                          struct tui_line_or_address line_or_addr,
                          int noerror)
 {
   win_info->detail.source_info.horizontal_offset = 0;
-  tui_update_source_window_as_is (win_info, s, line_or_addr, noerror);
+  tui_update_source_window_as_is (win_info, gdbarch, s, line_or_addr, noerror);
 
   return;
 }
@@ -85,6 +88,7 @@ tui_update_source_window (struct tui_win_info *win_info,
    shows the source as specified by the horizontal offset.  */
 void
 tui_update_source_window_as_is (struct tui_win_info *win_info, 
+                               struct gdbarch *gdbarch,
                                struct symtab *s,
                                struct tui_line_or_address line_or_addr, 
                                int noerror)
@@ -94,7 +98,7 @@ tui_update_source_window_as_is (struct tui_win_info *win_info,
   if (win_info->generic.type == SRC_WIN)
     ret = tui_set_source_content (s, line_or_addr.u.line_no, noerror);
   else
-    ret = tui_set_disassem_content (line_or_addr.u.addr);
+    ret = tui_set_disassem_content (gdbarch, line_or_addr.u.addr);
 
   if (ret == TUI_FAILURE)
     {
@@ -110,9 +114,11 @@ tui_update_source_window_as_is (struct tui_win_info *win_info,
        {
          struct symtab_and_line sal;
          
+         init_sal (&sal);
          sal.line = line_or_addr.u.line_no +
            (win_info->generic.content_size - 2);
          sal.symtab = s;
+         sal.pspace = s->objfile->pspace;
          set_current_source_symtab_and_line (&sal);
          /* If the focus was in the asm win, put it in the src win if
             we don't have a split layout.  */
@@ -130,7 +136,7 @@ tui_update_source_window_as_is (struct tui_win_info *win_info,
 /* Function to ensure that the source and/or disassemly windows
    reflect the input address.  */
 void
-tui_update_source_windows_with_addr (CORE_ADDR addr)
+tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr)
 {
   if (addr != 0)
     {
@@ -141,16 +147,16 @@ tui_update_source_windows_with_addr (CORE_ADDR addr)
        {
        case DISASSEM_COMMAND:
        case DISASSEM_DATA_COMMAND:
-         tui_show_disassem (addr);
+         tui_show_disassem (gdbarch, addr);
          break;
        case SRC_DISASSEM_COMMAND:
-         tui_show_disassem_and_update_source (addr);
+         tui_show_disassem_and_update_source (gdbarch, addr);
          break;
        default:
          sal = find_pc_line (addr, 0);
          l.loa = LOA_LINE;
          l.u.line_no = sal.line;
-         tui_show_symtab_source (sal.symtab, l, FALSE);
+         tui_show_symtab_source (gdbarch, sal.symtab, l, FALSE);
          break;
        }
     }
@@ -173,24 +179,30 @@ tui_update_source_windows_with_addr (CORE_ADDR addr)
 void
 tui_update_source_windows_with_line (struct symtab *s, int line)
 {
+  struct gdbarch *gdbarch;
   CORE_ADDR pc;
   struct tui_line_or_address l;
-  
+
+  if (!s)
+    return;
+
+  gdbarch = get_objfile_arch (s->objfile);
+
   switch (tui_current_layout ())
     {
     case DISASSEM_COMMAND:
     case DISASSEM_DATA_COMMAND:
       find_line_pc (s, line, &pc);
-      tui_update_source_windows_with_addr (pc);
+      tui_update_source_windows_with_addr (gdbarch, pc);
       break;
     default:
       l.loa = LOA_LINE;
       l.u.line_no = line;
-      tui_show_symtab_source (s, l, FALSE);
+      tui_show_symtab_source (gdbarch, s, l, FALSE);
       if (tui_current_layout () == SRC_DISASSEM_COMMAND)
        {
          find_line_pc (s, line, &pc);
-         tui_show_disassem (pc);
+         tui_show_disassem (gdbarch, pc);
        }
       break;
     }
@@ -211,7 +223,8 @@ tui_clear_source_content (struct tui_win_info *win_info,
       for (i = 0; i < win_info->generic.content_size; i++)
        {
          struct tui_win_element *element =
-         (struct tui_win_element *) win_info->generic.content[i];
+           (struct tui_win_element *) win_info->generic.content[i];
+
          element->which_element.source.has_break = FALSE;
          element->which_element.source.is_exec_point = FALSE;
        }
@@ -311,25 +324,33 @@ tui_horizontal_source_scroll (struct tui_win_info *win_info,
 {
   if (win_info->generic.content != NULL)
     {
+      struct gdbarch *gdbarch = win_info->detail.source_info.gdbarch;
       int offset;
-      struct symtab *s;
-      struct symtab_and_line cursal = get_current_source_symtab_and_line ();
+      struct symtab *s = NULL;
 
-      if (cursal.symtab == (struct symtab *) NULL)
-       s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL)));
-      else
-       s = cursal.symtab;
+      if (win_info->generic.type == SRC_WIN)
+       {
+         struct symtab_and_line cursal
+           = get_current_source_symtab_and_line ();
+
+         if (cursal.symtab == NULL)
+           s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL)));
+         else
+           s = cursal.symtab;
+       }
 
       if (direction == LEFT_SCROLL)
-       offset = win_info->detail.source_info.horizontal_offset + num_to_scroll;
+       offset = win_info->detail.source_info.horizontal_offset
+         + num_to_scroll;
       else
        {
-         if ((offset =
-            win_info->detail.source_info.horizontal_offset - num_to_scroll) < 0)
+         offset = win_info->detail.source_info.horizontal_offset
+           - num_to_scroll;
+         if (offset < 0)
            offset = 0;
        }
       win_info->detail.source_info.horizontal_offset = offset;
-      tui_update_source_window_as_is (win_info, s,
+      tui_update_source_window_as_is (win_info, gdbarch, s,
                                      ((struct tui_win_element *)
                                       win_info->generic.content[0])->which_element.source.line_or_addr,
                                      FALSE);
@@ -420,7 +441,8 @@ tui_update_breakpoint_info (struct tui_win_info *win,
       int mode;
       struct tui_source_element *line;
 
-      line = &((struct tui_win_element *) win->generic.content[i])->which_element.source;
+      line = &((struct tui_win_element *)
+              win->generic.content[i])->which_element.source;
       if (current_only && !line->is_exec_point)
          continue;
 
@@ -432,29 +454,35 @@ tui_update_breakpoint_info (struct tui_win_info *win,
            bp != (struct breakpoint *) NULL;
            bp = bp->next)
         {
+         struct bp_location *loc;
+
          gdb_assert (line->line_or_addr.loa == LOA_LINE
                      || line->line_or_addr.loa == LOA_ADDRESS);
-          if ((win == TUI_SRC_WIN
-               && bp->source_file
-               && (strcmp (src->filename, bp->source_file) == 0)
-              && line->line_or_addr.loa == LOA_LINE
-               && bp->line_number == line->line_or_addr.u.line_no)
-              || (win == TUI_DISASM_WIN
-                 && line->line_or_addr.loa == LOA_ADDRESS
-                 && bp->loc != NULL
-                  && bp->loc->address == line->line_or_addr.u.addr))
-            {
-              if (bp->enable_state == bp_disabled)
-                mode |= TUI_BP_DISABLED;
-              else
-                mode |= TUI_BP_ENABLED;
-              if (bp->hit_count)
-                mode |= TUI_BP_HIT;
-              if (bp->loc->cond)
-                mode |= TUI_BP_CONDITIONAL;
-              if (bp->type == bp_hardware_breakpoint)
-                mode |= TUI_BP_HARDWARE;
-            }
+
+         for (loc = bp->loc; loc != NULL; loc = loc->next)
+           {
+             if ((win == TUI_SRC_WIN
+                  && loc->symtab != NULL
+                  && filename_cmp (src->fullname,
+                                   symtab_to_fullname (loc->symtab)) == 0
+                  && line->line_or_addr.loa == LOA_LINE
+                  && loc->line_number == line->line_or_addr.u.line_no)
+                 || (win == TUI_DISASM_WIN
+                     && line->line_or_addr.loa == LOA_ADDRESS
+                     && loc->address == line->line_or_addr.u.addr))
+               {
+                 if (bp->enable_state == bp_disabled)
+                   mode |= TUI_BP_DISABLED;
+                 else
+                   mode |= TUI_BP_ENABLED;
+                 if (bp->hit_count)
+                   mode |= TUI_BP_HIT;
+                 if (bp->loc->cond)
+                   mode |= TUI_BP_CONDITIONAL;
+                 if (bp->type == bp_hardware_breakpoint)
+                   mode |= TUI_BP_HARDWARE;
+               }
+           }
         }
       if (line->has_break != mode)
         {
@@ -474,9 +502,11 @@ tui_set_exec_info_content (struct tui_win_info *win_info)
 {
   enum tui_status ret = TUI_SUCCESS;
 
-  if (win_info->detail.source_info.execution_info != (struct tui_gen_win_info *) NULL)
+  if (win_info->detail.source_info.execution_info
+      != (struct tui_gen_win_info *) NULL)
     {
-      struct tui_gen_win_info *exec_info_ptr = win_info->detail.source_info.execution_info;
+      struct tui_gen_win_info *exec_info_ptr
+       = win_info->detail.source_info.execution_info;
 
       if (exec_info_ptr->content == NULL)
        exec_info_ptr->content =
@@ -494,7 +524,8 @@ tui_set_exec_info_content (struct tui_win_info *win_info)
               int mode;
 
              element = (struct tui_win_element *) exec_info_ptr->content[i];
-             src_element = (struct tui_win_element *) win_info->generic.content[i];
+             src_element = (struct tui_win_element *)
+               win_info->generic.content[i];
 
               memset(element->which_element.simple_string, ' ',
                      sizeof(element->which_element.simple_string));
@@ -531,7 +562,8 @@ tui_set_exec_info_content (struct tui_win_info *win_info)
 void
 tui_show_exec_info_content (struct tui_win_info *win_info)
 {
-  struct tui_gen_win_info *exec_info = win_info->detail.source_info.execution_info;
+  struct tui_gen_win_info *exec_info
+    = win_info->detail.source_info.execution_info;
   int cur_line;
 
   werase (exec_info->handle);
@@ -550,7 +582,8 @@ tui_show_exec_info_content (struct tui_win_info *win_info)
 void
 tui_erase_exec_info_content (struct tui_win_info *win_info)
 {
-  struct tui_gen_win_info *exec_info = win_info->detail.source_info.execution_info;
+  struct tui_gen_win_info *exec_info
+    = win_info->detail.source_info.execution_info;
 
   werase (exec_info->handle);
   tui_refresh_win (exec_info);
@@ -592,7 +625,8 @@ tui_alloc_source_buffer (struct tui_win_info *win_info)
        xmalloc ((max_lines * line_width) * sizeof (char));
       if (src_line_buf == (char *) NULL)
        {
-         fputs_unfiltered ("Unable to Allocate Memory for Source or Disassembly Display.\n",
+         fputs_unfiltered ("Unable to Allocate Memory for "
+                           "Source or Disassembly Display.\n",
                            gdb_stderr);
          return TUI_FAILURE;
        }
@@ -601,7 +635,8 @@ tui_alloc_source_buffer (struct tui_win_info *win_info)
           (void **) tui_alloc_content (max_lines, SRC_WIN)) == NULL)
        {
          xfree (src_line_buf);
-         fputs_unfiltered ("Unable to Allocate Memory for Source or Disassembly Display.\n",
+         fputs_unfiltered ("Unable to Allocate Memory for "
+                           "Source or Disassembly Display.\n",
                            gdb_stderr);
          return TUI_FAILURE;
        }
@@ -615,7 +650,7 @@ tui_alloc_source_buffer (struct tui_win_info *win_info)
 }
 
 
-/* Answer whether the a particular line number or address is displayed
+/* Answer whether a particular line number or address is displayed
    in the current source window.  */
 int
 tui_line_is_displayed (int line, 
@@ -646,7 +681,7 @@ tui_line_is_displayed (int line,
 }
 
 
-/* Answer whether the a particular line number or address is displayed
+/* Answer whether a particular line number or address is displayed
    in the current source window.  */
 int
 tui_addr_is_displayed (CORE_ADDR addr, 
This page took 0.034301 seconds and 4 git commands to generate.