This is the mail archive of the
insight@sources.redhat.com
mailing list for the Insight project.
[rfa/patch] string <-> core_addr conversions
- To: insight at sources dot redhat dot com
- Subject: [rfa/patch] string <-> core_addr conversions
- From: Andrew Cagney <ac131313 at cygnus dot com>
- Date: Tue, 16 Oct 2001 22:57:00 -0400
- Cc: gdb-patches at sources dot redhat dot com
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++;