2002-01-15 Michael Snyder <msnyder@redhat.com>
authorMichael Snyder <msnyder@vmware.com>
Thu, 31 Jan 2002 02:31:06 +0000 (02:31 +0000)
committerMichael Snyder <msnyder@vmware.com>
Thu, 31 Jan 2002 02:31:06 +0000 (02:31 +0000)
* 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".

gdb/ChangeLog
gdb/target.c

index b2068fa..27dfeb0 100644 (file)
@@ -1,3 +1,10 @@
+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".
+
 2002-01-29  Andrew Cagney  <ac131313@redhat.com>
 
        * parse.c (target_map_name_to_register): Simplify, search regs and
index 1af8883..95ec4ef 100644 (file)
@@ -835,6 +835,8 @@ target_write_memory (CORE_ADDR memaddr, char *myaddr, int len)
   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.
 
@@ -857,6 +859,24 @@ do_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
      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, &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);
@@ -2254,13 +2274,23 @@ initialize_targets (void)
   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\
+  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);
-
+     &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).");