OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [gdb-5.0/] [gdb/] [tui/] [tuiDisassem.c] - Diff between revs 107 and 1765

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 107 Rev 1765
/*
/*
   ** tuiDisassem.c
   ** tuiDisassem.c
   **         This module contains functions for handling disassembly display.
   **         This module contains functions for handling disassembly display.
 */
 */
 
 
 
 
#include "defs.h"
#include "defs.h"
#include "symtab.h"
#include "symtab.h"
#include "breakpoint.h"
#include "breakpoint.h"
#include "frame.h"
#include "frame.h"
 
 
#include "tui.h"
#include "tui.h"
#include "tuiData.h"
#include "tuiData.h"
#include "tuiLayout.h"
#include "tuiLayout.h"
#include "tuiSourceWin.h"
#include "tuiSourceWin.h"
#include "tuiStack.h"
#include "tuiStack.h"
 
 
 
 
/*****************************************
/*****************************************
** STATIC LOCAL FUNCTIONS FORWARD DECLS    **
** STATIC LOCAL FUNCTIONS FORWARD DECLS    **
******************************************/
******************************************/
 
 
static struct breakpoint *_hasBreak PARAMS ((CORE_ADDR));
static struct breakpoint *_hasBreak PARAMS ((CORE_ADDR));
 
 
 
 
/*****************************************
/*****************************************
** PUBLIC FUNCTIONS                        **
** PUBLIC FUNCTIONS                        **
******************************************/
******************************************/
 
 
/*
/*
   ** tuiSetDisassemContent().
   ** tuiSetDisassemContent().
   **        Function to set the disassembly window's content.
   **        Function to set the disassembly window's content.
 */
 */
TuiStatus
TuiStatus
#ifdef __STDC__
#ifdef __STDC__
tuiSetDisassemContent (
tuiSetDisassemContent (
                        struct symtab *s,
                        struct symtab *s,
                        Opaque startAddr)
                        Opaque startAddr)
#else
#else
tuiSetDisassemContent (s, startAddr)
tuiSetDisassemContent (s, startAddr)
     struct symtab *s;
     struct symtab *s;
     Opaque startAddr;
     Opaque startAddr;
#endif
#endif
{
{
  TuiStatus ret = TUI_FAILURE;
  TuiStatus ret = TUI_FAILURE;
  struct ui_file *gdb_dis_out;
  struct ui_file *gdb_dis_out;
 
 
  if (startAddr != (Opaque) NULL)
  if (startAddr != (Opaque) NULL)
    {
    {
      register int i, desc;
      register int i, desc;
 
 
      if ((ret = tuiAllocSourceBuffer (disassemWin)) == TUI_SUCCESS)
      if ((ret = tuiAllocSourceBuffer (disassemWin)) == TUI_SUCCESS)
        {
        {
          register int offset = disassemWin->detail.sourceInfo.horizontalOffset;
          register int offset = disassemWin->detail.sourceInfo.horizontalOffset;
          register int threshold, curLine = 0, lineWidth, maxLines;
          register int threshold, curLine = 0, lineWidth, maxLines;
          CORE_ADDR newpc, pc;
          CORE_ADDR newpc, pc;
          disassemble_info asmInfo;
          disassemble_info asmInfo;
          TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
          TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
          extern void strcat_address PARAMS ((CORE_ADDR, char *, int));
          extern void strcat_address PARAMS ((CORE_ADDR, char *, int));
          extern void strcat_address_numeric PARAMS ((CORE_ADDR, int, char *, int));
          extern void strcat_address_numeric PARAMS ((CORE_ADDR, int, char *, int));
          int curLen = 0;
          int curLen = 0;
          int tab_len = tuiDefaultTabLen ();
          int tab_len = tuiDefaultTabLen ();
 
 
          maxLines = disassemWin->generic.height - 2;   /* account for hilite */
          maxLines = disassemWin->generic.height - 2;   /* account for hilite */
          lineWidth = disassemWin->generic.width - 1;
          lineWidth = disassemWin->generic.width - 1;
          threshold = (lineWidth - 1) + offset;
          threshold = (lineWidth - 1) + offset;
 
 
          /* now init the ui_file structure */
          /* now init the ui_file structure */
          gdb_dis_out = tui_sfileopen (threshold);
          gdb_dis_out = tui_sfileopen (threshold);
 
 
          INIT_DISASSEMBLE_INFO_NO_ARCH (asmInfo, gdb_dis_out, (fprintf_ftype) fprintf_filtered);
          INIT_DISASSEMBLE_INFO_NO_ARCH (asmInfo, gdb_dis_out, (fprintf_ftype) fprintf_filtered);
          asmInfo.read_memory_func = dis_asm_read_memory;
          asmInfo.read_memory_func = dis_asm_read_memory;
          asmInfo.memory_error_func = dis_asm_memory_error;
          asmInfo.memory_error_func = dis_asm_memory_error;
 
 
          disassemWin->detail.sourceInfo.startLineOrAddr.addr = startAddr;
          disassemWin->detail.sourceInfo.startLineOrAddr.addr = startAddr;
 
 
          /* Now construct each line */
          /* Now construct each line */
          for (curLine = 0, pc = (CORE_ADDR) startAddr; (curLine < maxLines);)
          for (curLine = 0, pc = (CORE_ADDR) startAddr; (curLine < maxLines);)
            {
            {
              TuiWinElementPtr element = (TuiWinElementPtr) disassemWin->generic.content[curLine];
              TuiWinElementPtr element = (TuiWinElementPtr) disassemWin->generic.content[curLine];
              struct breakpoint *bp;
              struct breakpoint *bp;
 
 
              print_address (pc, gdb_dis_out);
              print_address (pc, gdb_dis_out);
 
 
              curLen = strlen (tui_file_get_strbuf (gdb_dis_out));
              curLen = strlen (tui_file_get_strbuf (gdb_dis_out));
              i = curLen - ((curLen / tab_len) * tab_len);
              i = curLen - ((curLen / tab_len) * tab_len);
 
 
              /* adjust buffer length if necessary */
              /* adjust buffer length if necessary */
              tui_file_adjust_strbuf ((tab_len - i > 0) ? (tab_len - i) : 0, gdb_dis_out);
              tui_file_adjust_strbuf ((tab_len - i > 0) ? (tab_len - i) : 0, gdb_dis_out);
 
 
              /* Add spaces to make the instructions start onthe same column */
              /* Add spaces to make the instructions start onthe same column */
              while (i < tab_len)
              while (i < tab_len)
                {
                {
                  tui_file_get_strbuf (gdb_dis_out)[curLen] = ' ';
                  tui_file_get_strbuf (gdb_dis_out)[curLen] = ' ';
                  i++;
                  i++;
                  curLen++;
                  curLen++;
                }
                }
              tui_file_get_strbuf (gdb_dis_out)[curLen] = '\0';
              tui_file_get_strbuf (gdb_dis_out)[curLen] = '\0';
 
 
              newpc = pc + ((*tm_print_insn) (pc, &asmInfo));
              newpc = pc + ((*tm_print_insn) (pc, &asmInfo));
 
 
              /* Now copy the line taking the offset into account */
              /* Now copy the line taking the offset into account */
              if (strlen (tui_file_get_strbuf (gdb_dis_out)) > offset)
              if (strlen (tui_file_get_strbuf (gdb_dis_out)) > offset)
                strcpy (element->whichElement.source.line,
                strcpy (element->whichElement.source.line,
                        &(tui_file_get_strbuf (gdb_dis_out)[offset]));
                        &(tui_file_get_strbuf (gdb_dis_out)[offset]));
              else
              else
                element->whichElement.source.line[0] = '\0';
                element->whichElement.source.line[0] = '\0';
              element->whichElement.source.lineOrAddr.addr = (Opaque) pc;
              element->whichElement.source.lineOrAddr.addr = (Opaque) pc;
              element->whichElement.source.isExecPoint =
              element->whichElement.source.isExecPoint =
                (pc == (CORE_ADDR) ((TuiWinElementPtr) locator->content[0])->whichElement.locator.addr);
                (pc == (CORE_ADDR) ((TuiWinElementPtr) locator->content[0])->whichElement.locator.addr);
              bp = _hasBreak (pc);
              bp = _hasBreak (pc);
              element->whichElement.source.hasBreak =
              element->whichElement.source.hasBreak =
                (bp != (struct breakpoint *) NULL &&
                (bp != (struct breakpoint *) NULL &&
                 (!element->whichElement.source.isExecPoint ||
                 (!element->whichElement.source.isExecPoint ||
                  (bp->disposition != del || bp->hit_count <= 0)));
                  (bp->disposition != del || bp->hit_count <= 0)));
              curLine++;
              curLine++;
              pc = newpc;
              pc = newpc;
              /* reset the buffer to empty */
              /* reset the buffer to empty */
              tui_file_get_strbuf (gdb_dis_out)[0] = '\0';
              tui_file_get_strbuf (gdb_dis_out)[0] = '\0';
            }
            }
          ui_file_delete (gdb_dis_out);
          ui_file_delete (gdb_dis_out);
          gdb_dis_out = NULL;
          gdb_dis_out = NULL;
          disassemWin->generic.contentSize = curLine;
          disassemWin->generic.contentSize = curLine;
          ret = TUI_SUCCESS;
          ret = TUI_SUCCESS;
        }
        }
    }
    }
 
 
  return ret;
  return ret;
}                               /* tuiSetDisassemContent */
}                               /* tuiSetDisassemContent */
 
 
 
 
/*
/*
   ** tuiShowDisassem().
   ** tuiShowDisassem().
   **        Function to display the disassembly window with disassembled code.
   **        Function to display the disassembly window with disassembled code.
 */
 */
void
void
#ifdef __STDC__
#ifdef __STDC__
tuiShowDisassem (
tuiShowDisassem (
                  Opaque startAddr)
                  Opaque startAddr)
#else
#else
tuiShowDisassem (startAddr)
tuiShowDisassem (startAddr)
     Opaque startAddr;
     Opaque startAddr;
#endif
#endif
{
{
  struct symtab *s = find_pc_symtab ((CORE_ADDR) startAddr);
  struct symtab *s = find_pc_symtab ((CORE_ADDR) startAddr);
  TuiWinInfoPtr winWithFocus = tuiWinWithFocus ();
  TuiWinInfoPtr winWithFocus = tuiWinWithFocus ();
 
 
  tuiAddWinToLayout (DISASSEM_WIN);
  tuiAddWinToLayout (DISASSEM_WIN);
  tuiUpdateSourceWindow (disassemWin, s, startAddr, FALSE);
  tuiUpdateSourceWindow (disassemWin, s, startAddr, FALSE);
  /*
  /*
     ** if the focus was in the src win, put it in the asm win, if the
     ** if the focus was in the src win, put it in the asm win, if the
     ** source view isn't split
     ** source view isn't split
   */
   */
  if (currentLayout () != SRC_DISASSEM_COMMAND && winWithFocus == srcWin)
  if (currentLayout () != SRC_DISASSEM_COMMAND && winWithFocus == srcWin)
    tuiSetWinFocusTo (disassemWin);
    tuiSetWinFocusTo (disassemWin);
 
 
  return;
  return;
}                               /* tuiShowDisassem */
}                               /* tuiShowDisassem */
 
 
 
 
/*
/*
   ** tuiShowDisassemAndUpdateSource().
   ** tuiShowDisassemAndUpdateSource().
   **        Function to display the disassembly window.
   **        Function to display the disassembly window.
 */
 */
void
void
#ifdef __STDC__
#ifdef __STDC__
tuiShowDisassemAndUpdateSource (
tuiShowDisassemAndUpdateSource (
                                 Opaque startAddr)
                                 Opaque startAddr)
#else
#else
tuiShowDisassemAndUpdateSource (startAddr)
tuiShowDisassemAndUpdateSource (startAddr)
     Opaque startAddr;
     Opaque startAddr;
#endif
#endif
{
{
  struct symtab_and_line sal;
  struct symtab_and_line sal;
 
 
  tuiShowDisassem (startAddr);
  tuiShowDisassem (startAddr);
  if (currentLayout () == SRC_DISASSEM_COMMAND)
  if (currentLayout () == SRC_DISASSEM_COMMAND)
    {
    {
      TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
      TuiGenWinInfoPtr locator = locatorWinInfoPtr ();
      /*
      /*
         ** Update what is in the source window if it is displayed too,
         ** Update what is in the source window if it is displayed too,
         ** note that it follows what is in the disassembly window and visa-versa
         ** note that it follows what is in the disassembly window and visa-versa
       */
       */
      sal = find_pc_line ((CORE_ADDR) startAddr, 0);
      sal = find_pc_line ((CORE_ADDR) startAddr, 0);
      current_source_symtab = sal.symtab;
      current_source_symtab = sal.symtab;
      tuiUpdateSourceWindow (srcWin, sal.symtab, (Opaque) sal.line, TRUE);
      tuiUpdateSourceWindow (srcWin, sal.symtab, (Opaque) sal.line, TRUE);
      tuiUpdateLocatorFilename (sal.symtab->filename);
      tuiUpdateLocatorFilename (sal.symtab->filename);
    }
    }
 
 
  return;
  return;
}                               /* tuiShowDisassemAndUpdateSource */
}                               /* tuiShowDisassemAndUpdateSource */
 
 
 
 
/*
/*
   ** tuiShowDisassemAsIs().
   ** tuiShowDisassemAsIs().
   **        Function to display the disassembly window.  This function shows
   **        Function to display the disassembly window.  This function shows
   **        the disassembly as specified by the horizontal offset.
   **        the disassembly as specified by the horizontal offset.
 */
 */
void
void
#ifdef __STDC__
#ifdef __STDC__
tuiShowDisassemAsIs (
tuiShowDisassemAsIs (
                      Opaque addr)
                      Opaque addr)
#else
#else
tuiShowDisassemAsIs (addr)
tuiShowDisassemAsIs (addr)
     Opaque addr;
     Opaque addr;
#endif
#endif
{
{
  tuiAddWinToLayout (DISASSEM_WIN);
  tuiAddWinToLayout (DISASSEM_WIN);
  tuiUpdateSourceWindowAsIs (disassemWin, (struct symtab *) NULL, addr, FALSE);
  tuiUpdateSourceWindowAsIs (disassemWin, (struct symtab *) NULL, addr, FALSE);
  /*
  /*
     ** Update what is in the source window if it is displayed too, not that it
     ** Update what is in the source window if it is displayed too, not that it
     ** follows what is in the disassembly window and visa-versa
     ** follows what is in the disassembly window and visa-versa
   */
   */
  if (currentLayout () == SRC_DISASSEM_COMMAND)
  if (currentLayout () == SRC_DISASSEM_COMMAND)
    tuiShowSourceContent (srcWin);      /*????  Need to do more? */
    tuiShowSourceContent (srcWin);      /*????  Need to do more? */
 
 
  return;
  return;
}                               /* tuiShowDisassem */
}                               /* tuiShowDisassem */
 
 
 
 
/*
/*
   ** tuiGetBeginAsmAddress().
   ** tuiGetBeginAsmAddress().
 */
 */
Opaque
Opaque
#ifdef __STDC__
#ifdef __STDC__
tuiGetBeginAsmAddress (void)
tuiGetBeginAsmAddress (void)
#else
#else
tuiGetBeginAsmAddress ()
tuiGetBeginAsmAddress ()
#endif
#endif
{
{
  TuiGenWinInfoPtr locator;
  TuiGenWinInfoPtr locator;
  TuiLocatorElementPtr element;
  TuiLocatorElementPtr element;
  Opaque addr;
  Opaque addr;
 
 
  locator = locatorWinInfoPtr ();
  locator = locatorWinInfoPtr ();
  element = &((TuiWinElementPtr) locator->content[0])->whichElement.locator;
  element = &((TuiWinElementPtr) locator->content[0])->whichElement.locator;
 
 
  if (element->addr == (Opaque) 0)
  if (element->addr == (Opaque) 0)
    {
    {
      /*the target is not executing, because the pc is 0 */
      /*the target is not executing, because the pc is 0 */
 
 
      addr = (Opaque) parse_and_eval_address ("main");
      addr = (Opaque) parse_and_eval_address ("main");
 
 
      if (addr == (Opaque) 0)
      if (addr == (Opaque) 0)
        addr = (Opaque) parse_and_eval_address ("MAIN");
        addr = (Opaque) parse_and_eval_address ("MAIN");
 
 
    }
    }
  else                          /* the target is executing */
  else                          /* the target is executing */
    addr = element->addr;
    addr = element->addr;
 
 
  return addr;
  return addr;
}                               /* tuiGetBeginAsmAddress */
}                               /* tuiGetBeginAsmAddress */
 
 
 
 
/*
/*
   ** tuiVerticalDisassemScroll().
   ** tuiVerticalDisassemScroll().
   **      Scroll the disassembly forward or backward vertically
   **      Scroll the disassembly forward or backward vertically
 */
 */
void
void
#ifdef __STDC__
#ifdef __STDC__
tuiVerticalDisassemScroll (
tuiVerticalDisassemScroll (
                            TuiScrollDirection scrollDirection,
                            TuiScrollDirection scrollDirection,
                            int numToScroll)
                            int numToScroll)
#else
#else
tuiVerticalDisassemScroll (scrollDirection, numToScroll)
tuiVerticalDisassemScroll (scrollDirection, numToScroll)
     TuiScrollDirection scrollDirection;
     TuiScrollDirection scrollDirection;
     int numToScroll;
     int numToScroll;
#endif
#endif
{
{
  if (disassemWin->generic.content != (OpaquePtr) NULL)
  if (disassemWin->generic.content != (OpaquePtr) NULL)
    {
    {
      Opaque pc, lowAddr;
      Opaque pc, lowAddr;
      TuiWinContent content;
      TuiWinContent content;
      struct symtab *s;
      struct symtab *s;
 
 
      content = (TuiWinContent) disassemWin->generic.content;
      content = (TuiWinContent) disassemWin->generic.content;
      if (current_source_symtab == (struct symtab *) NULL)
      if (current_source_symtab == (struct symtab *) NULL)
        s = find_pc_symtab (selected_frame->pc);
        s = find_pc_symtab (selected_frame->pc);
      else
      else
        s = current_source_symtab;
        s = current_source_symtab;
 
 
      pc = content[0]->whichElement.source.lineOrAddr.addr;
      pc = content[0]->whichElement.source.lineOrAddr.addr;
      if (find_pc_partial_function ((CORE_ADDR) pc,
      if (find_pc_partial_function ((CORE_ADDR) pc,
                                    (char **) NULL,
                                    (char **) NULL,
                                    (CORE_ADDR *) & lowAddr,
                                    (CORE_ADDR *) & lowAddr,
                                    (CORE_ADDR) NULL) == 0)
                                    (CORE_ADDR) NULL) == 0)
        error ("No function contains prgram counter for selected frame.\n");
        error ("No function contains prgram counter for selected frame.\n");
      else
      else
        {
        {
          register int line = 0;
          register int line = 0;
          register Opaque newLow;
          register Opaque newLow;
          bfd_byte buffer[4];
          bfd_byte buffer[4];
 
 
          newLow = pc;
          newLow = pc;
          if (scrollDirection == FORWARD_SCROLL)
          if (scrollDirection == FORWARD_SCROLL)
            {
            {
              for (; line < numToScroll; line++)
              for (; line < numToScroll; line++)
                newLow += sizeof (bfd_getb32 (buffer));
                newLow += sizeof (bfd_getb32 (buffer));
            }
            }
          else
          else
            {
            {
              for (; newLow >= (Opaque) 0 && line < numToScroll; line++)
              for (; newLow >= (Opaque) 0 && line < numToScroll; line++)
                newLow -= sizeof (bfd_getb32 (buffer));
                newLow -= sizeof (bfd_getb32 (buffer));
            }
            }
          tuiUpdateSourceWindowAsIs (disassemWin, s, newLow, FALSE);
          tuiUpdateSourceWindowAsIs (disassemWin, s, newLow, FALSE);
        }
        }
    }
    }
 
 
  return;
  return;
}                               /* tuiVerticalDisassemScroll */
}                               /* tuiVerticalDisassemScroll */
 
 
 
 
 
 
/*****************************************
/*****************************************
** STATIC LOCAL FUNCTIONS                 **
** STATIC LOCAL FUNCTIONS                 **
******************************************/
******************************************/
/*
/*
   ** _hasBreak().
   ** _hasBreak().
   **      Answer whether there is a break point at the input line in the
   **      Answer whether there is a break point at the input line in the
   **      source file indicated
   **      source file indicated
 */
 */
static struct breakpoint *
static struct breakpoint *
#ifdef __STDC__
#ifdef __STDC__
_hasBreak (
_hasBreak (
            CORE_ADDR addr)
            CORE_ADDR addr)
#else
#else
_hasBreak (addr)
_hasBreak (addr)
     CORE_ADDR addr;
     CORE_ADDR addr;
#endif
#endif
{
{
  struct breakpoint *bpWithBreak = (struct breakpoint *) NULL;
  struct breakpoint *bpWithBreak = (struct breakpoint *) NULL;
  struct breakpoint *bp;
  struct breakpoint *bp;
  extern struct breakpoint *breakpoint_chain;
  extern struct breakpoint *breakpoint_chain;
 
 
 
 
  for (bp = breakpoint_chain;
  for (bp = breakpoint_chain;
       (bp != (struct breakpoint *) NULL &&
       (bp != (struct breakpoint *) NULL &&
        bpWithBreak == (struct breakpoint *) NULL);
        bpWithBreak == (struct breakpoint *) NULL);
       bp = bp->next)
       bp = bp->next)
    if (addr == bp->address)
    if (addr == bp->address)
      bpWithBreak = bp;
      bpWithBreak = bp;
 
 
  return bpWithBreak;
  return bpWithBreak;
}                               /* _hasBreak */
}                               /* _hasBreak */
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.