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]
Other format: [Raw text]

[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, &current_target);
+ 	}
+     }
+ 
    /* The quick case is that the top target can handle the transfer.  */
    res = current_target.to_xfer_memory
      (memaddr, myaddr, len, write, attrib, &current_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).");


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