This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: [RFA] New option "trust-readonly-sections"
- From: Michael Snyder <msnyder at redhat dot com>
- To: Andrew Cagney <ac131313 at cygnus dot com>
- Cc: Michael Snyder <msnyder at cygnus dot com>, gdb-patches at sources dot redhat dot com
- Date: Wed, 30 Jan 2002 18:18:47 -0800
- Subject: Re: [RFA] New option "trust-readonly-sections"
- Organization: Red Hat, Inc.
- References: <200201240323.g0O3NI905339@reddwarf.cygnus.com> <3C5057E6.6070401@cygnus.com>
Andrew Cagney wrote:
>
> > *************** 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);
>
> My understanding of do_xfer_memory() is that it is allowed to do partial
> transfers. Hence, here, if the data doesn't all lie in the section, it
> is safe to truncate the transfer and return the number of bytes transfered.
Thanks. Implementing both this suggestion and your other one about
using "add_set_boolean_cmd", I have committed the patch in the new
form attached below:
Eli may now nag me for doco, and you may nag me for a NEWS entry. ;-)
2002-01-15 Michael Snyder <msnyder@redhat.com>
* target.c: New command, "set trust-readonly-sections on".
(do_xfer_memory): Honor the suggestion to trust readonly sections
by reading them from the object file instead of from the target.
(initialize_targets): Register command "set trust-readonly-sections".
Index: target.c
===================================================================
RCS file: /cvs/src/src/gdb/target.c,v
retrieving revision 1.30
diff -p -r1.30 target.c
*** target.c 2002/01/09 00:36:58 1.30
--- target.c 2002/01/31 02:20:53
*************** 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,882 ----
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++)
+ {
+ if (memaddr >= secp->addr && memaddr < 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).");
--- 2274,2296 ----
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_boolean_cmd
+ ("trust-readonly-sections", class_support,
+ &trust_readonly,
+ "Set mode for reading from readonly sections.\n\
+ When this mode is on, memory reads from readonly sections (such as .text)\n\
+ will be read from the object file instead of from the target. This will\n\
+ result in significant performance improvement for remote targets.",
+ &setlist),
+ &showlist);
add_com ("monitor", class_obscure, do_monitor_command,
"Send a command to the remote monitor (remote targets only).");