This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[rfa/patch] string <-> core_addr conversions


Hello,

The attached patch changes the way Insight converts from a tcl string to 
a CORE_ADDR.  Without the patch Insight would use 
parse_and_eval_address() when converting an address (in ascii) into a 
CORE_ADDR.  Unfortunatly, that function, on harvard architectures, does 
strange and wonderful things.

You can see the problems if you try to use the memory window to modify 
locations.

This code adds a very simple (?) function for converting the tcl integer 
directly into a core_addr.  It also adds a function to convert a 
core_addr to a string (not yet used), I suspect Insight needs an audit 
and should ensure that these functions are always used.

Comments? Ok (tcl)?  The utils.c change is pretty straightforward.

Andrew
2001-10-16  Andrew Cagney  <ac131313@redhat.com>

	Based on code by John Moore <jmore@redhat.com>:
	* utils.c (core_addr_to_string): New function for conversion of
	CORE_ADDR to string.
	(string_to_core_addr): New function to convert from string to
	CORE_ADDR.
	* defs.h: Added extern statements for the above.

Index: gdbtk/ChangeLog
2001-10-16  Andrew Cagney  <ac131313@redhat.com>

	From 2001-08-29 John Moore <jmoore@redhat.com>:
	* gdbtk/generic/gdbtk-cmds.c (gdb_disassemble): Replaced
	parse_and_eval_address() with string_to_core_addr().
	(gdb_load_disassembly): Same.
	(gdb_set_mem): Ditto.
	* gdbtk/generic/gdbtk-stack.c (gdb_block_vars): Ditto.
	* gdbtk/generic/gdbtk-varobj.c (variable_create): Same.

Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.63
diff -p -r1.63 defs.h
*** defs.h	2001/09/07 21:33:08	1.63
--- defs.h	2001/10/17 02:33:03
*************** extern char *paddr_d (LONGEST addr);
*** 690,695 ****
--- 690,701 ----
  extern char *phex (ULONGEST l, int sizeof_l);
  extern char *phex_nz (ULONGEST l, int sizeof_l);
  
+ /* Like paddr() only print/scan raw CORE_ADDR.  The output from
+    core_addr_to_string() can be passed direct to
+    string_to_core_addr().  */
+ extern const char *core_addr_to_string (const CORE_ADDR addr);
+ extern CORE_ADDR string_to_core_addr (const char *my_string);
+ 
  extern void fprintf_symbol_filtered (struct ui_file *, char *,
  				     enum language, int);
  
Index: utils.c
===================================================================
RCS file: /cvs/src/src/gdb/utils.c,v
retrieving revision 1.47
diff -p -r1.47 utils.c
*** utils.c	2001/08/01 18:39:23	1.47
--- utils.c	2001/10/17 02:33:05
*************** address_to_host_pointer (CORE_ADDR addr)
*** 2490,2492 ****
--- 2490,2536 ----
    ADDRESS_TO_POINTER (builtin_type_void_data_ptr, &ptr, addr);
    return ptr;
  }
+ 
+ /* Convert a CORE_ADDR into a string.  */
+ const char *
+ core_addr_to_string (const CORE_ADDR addr)
+ {
+   char *str = get_cell ();
+   strcpy (str, "0x");
+   strcat (str, phex_nz (addr, sizeof (addr)));
+   return str;
+ }
+ 
+ /* Convert a string back into a CORE_ADDR.  */
+ CORE_ADDR
+ string_to_core_addr (const char *my_string)
+ {
+   CORE_ADDR addr = 0;
+   if (my_string[0] == '0' && tolower (my_string[1]) == 'x')
+     {
+       /* Assume that it is in decimal.  */
+       int i;
+       for (i = 2; my_string[i] != '\0'; i++)
+ 	{
+ 	  if (isdigit (my_string[i]))
+ 	    addr = (my_string[i] - '0') + (addr * 16);
+ 	  else if (isxdigit (my_string[i])) 
+ 	    addr = (tolower (my_string[i]) - 'a' + 0xa) + (addr * 16);
+ 	  else
+ 	    internal_error (__FILE__, __LINE__, "invalid hex");
+ 	}
+     }
+   else
+     {
+       /* Assume that it is in decimal.  */
+       int i;
+       for (i = 0; my_string[i] != '\0'; i++)
+ 	{
+ 	  if (isdigit (my_string[i]))
+ 	    addr = (my_string[i] - '0') + (addr * 10);
+ 	  else
+ 	    internal_error (__FILE__, __LINE__, "invalid decimal");
+ 	}
+     }
+   return addr;
+ }
Index: gdbtk/generic/gdbtk-cmds.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-cmds.c,v
retrieving revision 1.40
diff -p -r1.40 gdbtk-cmds.c
*** gdbtk-cmds.c	2001/10/12 23:51:29	1.40
--- gdbtk-cmds.c	2001/10/17 02:33:08
*************** gdb_disassemble (clientData, interp, obj
*** 1599,1605 ****
    else
      error ("First arg must be 'source' or 'nosource'");
  
!   low = parse_and_eval_address (Tcl_GetStringFromObj (objv[2], NULL));
  
    if (objc == 3)
      {
--- 1599,1605 ----
    else
      error ("First arg must be 'source' or 'nosource'");
  
!   low = string_to_core_addr (Tcl_GetStringFromObj (objv[2], NULL));
  
    if (objc == 3)
      {
*************** gdb_disassemble (clientData, interp, obj
*** 1607,1613 ****
          error ("No function contains specified address");
      }
    else
!     high = parse_and_eval_address (Tcl_GetStringFromObj (objv[3], NULL));
  
    return gdb_disassemble_driver (low, high, mixed_source_and_assembly, NULL,
  			  gdbtk_print_source, gdbtk_print_asm);
--- 1607,1613 ----
          error ("No function contains specified address");
      }
    else
!     high = string_to_core_addr (Tcl_GetStringFromObj (objv[3], NULL));
  
    return gdb_disassemble_driver (low, high, mixed_source_and_assembly, NULL,
  			  gdbtk_print_source, gdbtk_print_asm);
*************** gdb_set_mem (clientData, interp, objc, o
*** 2520,2526 ****
      }
  
    /* Address to write */
!   addr = parse_and_eval_address (Tcl_GetStringFromObj (objv[1], NULL));
  
    /* String value to write: it's in hex */
    hexstr = Tcl_GetStringFromObj (objv[2], NULL);
--- 2520,2526 ----
      }
  
    /* Address to write */
!   addr = string_to_core_addr (Tcl_GetStringFromObj (objv[1], NULL));
  
    /* String value to write: it's in hex */
    hexstr = Tcl_GetStringFromObj (objv[2], NULL);
Index: gdbtk/generic/gdbtk-stack.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-stack.c,v
retrieving revision 1.3
diff -p -r1.3 gdbtk-stack.c
*** gdbtk-stack.c	2001/10/12 23:51:30	1.3
--- gdbtk-stack.c	2001/10/17 02:33:09
*************** gdb_block_vars (clientData, interp, objc
*** 109,116 ****
    if (selected_frame == NULL)
      return TCL_OK;
  
!   start = parse_and_eval_address (Tcl_GetStringFromObj (objv[1], NULL));
!   end   = parse_and_eval_address (Tcl_GetStringFromObj (objv[2], NULL));
    
    block = get_frame_block (selected_frame);
  
--- 109,116 ----
    if (selected_frame == NULL)
      return TCL_OK;
  
!   start = string_to_core_addr (Tcl_GetStringFromObj (objv[1], NULL));
!   end   = string_to_core_addr (Tcl_GetStringFromObj (objv[2], NULL));
    
    block = get_frame_block (selected_frame);
  
Index: gdbtk/generic/gdbtk-varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbtk/generic/gdbtk-varobj.c,v
retrieving revision 1.8
diff -p -r1.8 gdbtk-varobj.c
*** gdbtk-varobj.c	2001/08/17 19:10:36	1.8
--- gdbtk-varobj.c	2001/10/17 02:33:09
*************** variable_create (interp, objc, objv)
*** 364,370 ****
  	  {
  	    char *str;
  	    str = Tcl_GetStringFromObj (objv[1], NULL);
! 	    frame = parse_and_eval_address (str);
  	    how_specified = USE_SPECIFIED_FRAME;
  	    objc--;
  	    objv++;
--- 364,370 ----
  	  {
  	    char *str;
  	    str = Tcl_GetStringFromObj (objv[1], NULL);
! 	    frame = string_to_core_addr (str);
  	    how_specified = USE_SPECIFIED_FRAME;
  	    objc--;
  	    objv++;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]