This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] New option "trust-readonly-sections"
- From: Michael Snyder <msnyder at cygnus dot com>
- To: gdb-patches at sources dot redhat dot com
- Date: Wed, 23 Jan 2002 19:23:18 -0800
- Subject: [RFA] New option "trust-readonly-sections"
This is an optimization mainly for remote debugging, or any
context where reading from the child's memory is expensive.
In a nutshell, if you trust that read-only sections will really
not be modified, you can advise GDB of this fact, and GDB will
then satisfy all memory reads from read-only sections by reading
from the object file, instead of from the child/target.
Naturally it defaults to 'off'.
On targets that do a lot of prologue analysis (which
involves lots of reads from the text section), this can
be a huge speed win.
2002-01-15 Michael Snyder <msnyder@redhat.com>
* target.c: New command, "set trust-readonly on".
(do_xfer_memory): Honor the suggestion to trust readonly sections
by reading them from the object file instead of from the target.
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/target.c,v
retrieving revision 1.30
diff -c -3 -p -r1.30 target.c
*** target.c 2002/01/09 00:36:58 1.30
--- target.c 2002/01/24 03:23:44
*************** target_write_memory (CORE_ADDR memaddr,
*** 835,840 ****
--- 835,842 ----
return target_xfer_memory (memaddr, myaddr, len, 1);
}
+ static int trust_readonly = 0;
+
/* Move memory to or from the targets. The top target gets priority;
if it cannot handle it, it is offered to the next one down, etc.
*************** do_xfer_memory (CORE_ADDR memaddr, char
*** 857,862 ****
--- 859,883 ----
0. */
errno = 0;
+ if (!write && trust_readonly)
+ {
+ /* User-settable option, "trust-readonly". If true, then
+ memory from any SEC_READONLY bfd section may be read
+ directly from the bfd file. */
+
+ struct section_table *secp;
+
+ for (secp = current_target.to_sections;
+ secp < current_target.to_sections_end;
+ secp++)
+ {
+ /* FIXME: take it only if it's entirely within the section. */
+ if (memaddr >= secp->addr && memaddr + len <= secp->endaddr)
+ return xfer_memory (memaddr, myaddr, len, 0,
+ attrib, ¤t_target);
+ }
+ }
+
/* The quick case is that the top target can handle the transfer. */
res = current_target.to_xfer_memory
(memaddr, myaddr, len, write, attrib, ¤t_target);
*************** initialize_targets (void)
*** 2254,2266 ****
add_info ("target", target_info, targ_desc);
add_info ("files", target_info, targ_desc);
! add_show_from_set (
! add_set_cmd ("target", class_maintenance, var_zinteger,
! (char *) &targetdebug,
! "Set target debugging.\n\
When non-zero, target debugging is enabled.", &setdebuglist),
! &showdebuglist);
add_com ("monitor", class_obscure, do_monitor_command,
"Send a command to the remote monitor (remote targets only).");
--- 2275,2295 ----
add_info ("target", target_info, targ_desc);
add_info ("files", target_info, targ_desc);
! add_show_from_set
! (add_set_cmd ("target", class_maintenance, var_zinteger,
! (char *) &targetdebug,
! "Set target debugging.\n\
When non-zero, target debugging is enabled.", &setdebuglist),
! &showdebuglist);
+ add_show_from_set
+ (add_set_cmd ("trust-readonly", class_support,
+ var_boolean, (char *) &trust_readonly,
+ "Set memory reads to trust SEC_READONLY section attribute.\n\
+ When active, memory from readonly sections (such as .text)\n\
+ will be read from the executable file instead of from target memory.",
+ &setlist),
+ &showlist);
add_com ("monitor", class_obscure, do_monitor_command,
"Send a command to the remote monitor (remote targets only).");