gdb/testsuite: Improve detection of bug gdb/24541
[deliverable/binutils-gdb.git] / gdb / tui / tui-disasm.c
index a5276f10acf63de051db1a32a4007341c42b4a37..003462c22445a8141f39cef8256d4cb3d404b558 100644 (file)
@@ -1,7 +1,6 @@
 /* Disassembly display.
 
-   Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009,
-   2010, 2011 Free Software Foundation, Inc.
+   Copyright (C) 1998-2019 Free Software Foundation, Inc.
 
    Contributed by Hewlett-Packard Company.
 
@@ -28,7 +27,6 @@
 #include "value.h"
 #include "source.h"
 #include "disasm.h"
-#include "gdb_string.h"
 #include "tui/tui.h"
 #include "tui/tui-data.h"
 #include "tui/tui-win.h"
@@ -38,6 +36,7 @@
 #include "tui/tui-file.h"
 #include "tui/tui-disasm.h"
 #include "progspace.h"
+#include "objfiles.h"
 
 #include "gdb_curses.h"
 
@@ -55,10 +54,7 @@ static CORE_ADDR
 tui_disassemble (struct gdbarch *gdbarch, struct tui_asm_line *asm_lines,
                 CORE_ADDR pc, int count)
 {
-  struct ui_file *gdb_dis_out;
-
-  /* Now init the ui_file structure.  */
-  gdb_dis_out = tui_sfileopen (256);
+  string_file gdb_dis_out;
 
   /* Now construct each line.  */
   for (; count > 0; count--, asm_lines++)
@@ -68,20 +64,19 @@ tui_disassemble (struct gdbarch *gdbarch, struct tui_asm_line *asm_lines,
       if (asm_lines->insn)
         xfree (asm_lines->insn);
       
-      print_address (gdbarch, pc, gdb_dis_out);
+      print_address (gdbarch, pc, &gdb_dis_out);
       asm_lines->addr = pc;
-      asm_lines->addr_string = xstrdup (tui_file_get_strbuf (gdb_dis_out));
+      asm_lines->addr_string = xstrdup (gdb_dis_out.c_str ());
 
-      ui_file_rewind (gdb_dis_out);
+      gdb_dis_out.clear ();
 
-      pc = pc + gdb_print_insn (gdbarch, pc, gdb_dis_out, NULL);
+      pc = pc + gdb_print_insn (gdbarch, pc, &gdb_dis_out, NULL);
 
-      asm_lines->insn = xstrdup (tui_file_get_strbuf (gdb_dis_out));
+      asm_lines->insn = xstrdup (gdb_dis_out.c_str ());
 
       /* Reset the buffer to empty.  */
-      ui_file_rewind (gdb_dis_out);
+      gdb_dis_out.clear ();
     }
-  ui_file_delete (gdb_dis_out);
   return pc;
 }
 
@@ -100,8 +95,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
   if (max_lines <= 1)
      return pc;
 
-  asm_lines = (struct tui_asm_line*) alloca (sizeof (struct tui_asm_line)
-                                         * max_lines);
+  asm_lines = XALLOCAVEC (struct tui_asm_line, max_lines);
   memset (asm_lines, 0, sizeof (struct tui_asm_line) * max_lines);
 
   new_low = pc;
@@ -114,7 +108,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
     {
       CORE_ADDR last_addr;
       int pos;
-      struct minimal_symbol *msymbol;
+      struct bound_minimal_symbol msymbol;
               
       /* Find backward an address which is a symbol and for which
          disassembling from that address will fill completely the
@@ -124,14 +118,14 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from)
          new_low -= 1 * max_lines;
          msymbol = lookup_minimal_symbol_by_pc_section (new_low, 0);
 
-         if (msymbol)
-            new_low = SYMBOL_VALUE_ADDRESS (msymbol);
+         if (msymbol.minsym)
+            new_low = BMSYMBOL_VALUE_ADDRESS (msymbol);
          else
             new_low += 1 * max_lines;
 
          tui_disassemble (gdbarch, asm_lines, new_low, max_lines);
          last_addr = asm_lines[pos].addr;
-      } while (last_addr > pc && msymbol);
+      } while (last_addr > pc && msymbol.minsym);
 
       /* Scan forward disassembling one instruction at a time until
          the last visible instruction of the window matches the pc.
@@ -174,13 +168,13 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
   enum tui_status ret = TUI_FAILURE;
   int i;
   int offset = TUI_DISASM_WIN->detail.source_info.horizontal_offset;
-  int line_width, max_lines;
+  int max_lines, line_width;
   CORE_ADDR cur_pc;
   struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
-  int tab_len = tui_default_tab_len ();
+  int tab_len = tui_tab_width;
   struct tui_asm_line *asm_lines;
   int insn_pos;
-  int addr_size, max_size;
+  int addr_size, insn_size;
   char *line;
   
   if (pc == 0)
@@ -193,24 +187,21 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
   TUI_DISASM_WIN->detail.source_info.gdbarch = gdbarch;
   TUI_DISASM_WIN->detail.source_info.start_line_or_addr.loa = LOA_ADDRESS;
   TUI_DISASM_WIN->detail.source_info.start_line_or_addr.u.addr = pc;
-  cur_pc = (CORE_ADDR)
-    (((struct tui_win_element *) locator->content[0])->which_element.locator.addr);
+  cur_pc = locator->content[0]->which_element.locator.addr;
 
-  max_lines = TUI_DISASM_WIN->generic.height - 2;      /* Account for
-                                                          hilite.  */
+  /* Window size, excluding highlight box.  */
+  max_lines = TUI_DISASM_WIN->generic.height - 2;
+  line_width = TUI_DISASM_WIN->generic.width - 2;
 
   /* Get temporary table that will hold all strings (addr & insn).  */
-  asm_lines = (struct tui_asm_line*) alloca (sizeof (struct tui_asm_line)
-                                         * max_lines);
+  asm_lines = XALLOCAVEC (struct tui_asm_line, max_lines);
   memset (asm_lines, 0, sizeof (struct tui_asm_line) * max_lines);
 
-  line_width = TUI_DISASM_WIN->generic.width - 1;
-
   tui_disassemble (gdbarch, asm_lines, pc, max_lines);
 
-  /* See what is the maximum length of an address and of a line.  */
+  /* Determine maximum address- and instruction lengths.  */
   addr_size = 0;
-  max_size = 0;
+  insn_size = 0;
   for (i = 0; i < max_lines; i++)
     {
       size_t len = strlen (asm_lines[i].addr_string);
@@ -218,16 +209,17 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
       if (len > addr_size)
         addr_size = len;
 
-      len = strlen (asm_lines[i].insn) + tab_len;
-      if (len > max_size)
-        max_size = len;
+      len = strlen (asm_lines[i].insn);
+      if (len > insn_size)
+       insn_size = len;
     }
-  max_size += addr_size + tab_len;
 
-  /* Allocate memory to create each line.  */
-  line = (char*) alloca (max_size);
+  /* Align instructions to the same column.  */
   insn_pos = (1 + (addr_size / tab_len)) * tab_len;
 
+  /* Allocate memory to create each line.  */
+  line = (char*) alloca (insn_pos + insn_size + 1);
+
   /* Now construct each line.  */
   for (i = 0; i < max_lines; i++)
     {
@@ -235,24 +227,19 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
       struct tui_source_element *src;
       int cur_len;
 
-      element = (struct tui_win_element *) TUI_DISASM_WIN->generic.content[i];
+      element = TUI_DISASM_WIN->generic.content[i];
       src = &element->which_element.source;
       strcpy (line, asm_lines[i].addr_string);
       cur_len = strlen (line);
-
-      /* Add spaces to make the instructions start on the same
-        column.  */
-      while (cur_len < insn_pos)
-        {
-          strcat (line, " ");
-          cur_len++;
-        }
-
-      strcat (line, asm_lines[i].insn);
+      memset (line + cur_len, ' ', insn_pos - cur_len);
+      strcpy (line + insn_pos, asm_lines[i].insn);
 
       /* Now copy the line taking the offset into account.  */
       if (strlen (line) > offset)
-        strcpy (src->line, &line[offset]);
+       {
+         strncpy (src->line, &line[offset], line_width);
+         src->line[line_width] = '\0';
+       }
       else
         src->line[0] = '\0';
 
@@ -262,7 +249,8 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
 
       /* See whether there is a breakpoint installed.  */
       src->has_break = (!src->is_exec_point
-                       && breakpoint_here_p (current_program_space->aspace, pc)
+                       && breakpoint_here_p (current_program_space->aspace,
+                                             pc)
                        != no_breakpoint_here);
 
       xfree (asm_lines[i].addr_string);
@@ -277,7 +265,7 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
 void
 tui_show_disassem (struct gdbarch *gdbarch, CORE_ADDR start_addr)
 {
-  struct symtab *s = find_pc_symtab (start_addr);
+  struct symtab *s = find_pc_line_symtab (start_addr);
   struct tui_win_info *win_with_focus = tui_win_with_focus ();
   struct tui_line_or_address val;
 
@@ -317,11 +305,11 @@ tui_show_disassem_and_update_source (struct gdbarch *gdbarch,
       tui_update_source_window (TUI_SRC_WIN, gdbarch, sal.symtab, val, TRUE);
       if (sal.symtab)
        {
-         set_current_source_symtab_and_line (&sal);
-         tui_update_locator_filename (sal.symtab->filename);
+         set_current_source_symtab_and_line (sal);
+         tui_update_locator_fullname (symtab_to_fullname (sal.symtab));
        }
       else
-       tui_update_locator_filename ("?");
+       tui_update_locator_fullname ("?");
     }
 
   return;
@@ -336,21 +324,21 @@ tui_get_begin_asm_address (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
   CORE_ADDR addr;
 
   locator = tui_locator_win_info_ptr ();
-  element = &((struct tui_win_element *) locator->content[0])->which_element.locator;
+  element = &locator->content[0]->which_element.locator;
 
   if (element->addr == 0)
     {
-      struct minimal_symbol *main_symbol;
+      struct bound_minimal_symbol main_symbol;
 
       /* Find address of the start of program.
          Note: this should be language specific.  */
       main_symbol = lookup_minimal_symbol ("main", NULL, NULL);
-      if (main_symbol == 0)
+      if (main_symbol.minsym == 0)
         main_symbol = lookup_minimal_symbol ("MAIN", NULL, NULL);
-      if (main_symbol == 0)
+      if (main_symbol.minsym == 0)
         main_symbol = lookup_minimal_symbol ("_start", NULL, NULL);
-      if (main_symbol)
-        addr = SYMBOL_VALUE_ADDRESS (main_symbol);
+      if (main_symbol.minsym)
+        addr = BMSYMBOL_VALUE_ADDRESS (main_symbol);
       else
         addr = 0;
     }
@@ -396,14 +384,16 @@ tui_vertical_disassem_scroll (enum tui_scroll_direction scroll_direction,
       struct tui_line_or_address val;
       int dir;
 
-      content = (tui_win_content) TUI_DISASM_WIN->generic.content;
+      content = TUI_DISASM_WIN->generic.content;
 
       pc = content[0]->which_element.source.line_or_addr.u.addr;
       num_to_scroll++;
-      dir = (scroll_direction == FORWARD_SCROLL) ? num_to_scroll : -num_to_scroll;
+      dir = (scroll_direction == FORWARD_SCROLL)
+       ? num_to_scroll : -num_to_scroll;
 
       val.loa = LOA_ADDRESS;
       val.u.addr = tui_find_disassembly_address (gdbarch, pc, dir);
-      tui_update_source_window_as_is (TUI_DISASM_WIN, gdbarch, NULL, val, FALSE);
+      tui_update_source_window_as_is (TUI_DISASM_WIN, gdbarch,
+                                     NULL, val, FALSE);
     }
 }
This page took 0.027961 seconds and 4 git commands to generate.