]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 31 Jul 2012 07:34:40 +0000 (07:34 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Tue, 31 Jul 2012 07:34:40 +0000 (07:34 +0000)
* infcall.c (call_function_by_hand): Move BP_ADDR comment to
AT_ENTRY_POINT.
(call_function_by_hand) <ON_STACK>: Call write_memory with
gdbarch_breakpoint_from_pc, if possible.
(call_function_by_hand) <AT_ENTRY_POINT>: The BP_ADDR comment is moved
here.

gdb/testsuite/
* gdb.base/valgrind-infcall.c: New file.
* gdb.base/valgrind-infcall.exp: New file.

gdb/ChangeLog
gdb/infcall.c
gdb/testsuite/ChangeLog

index fdb66eb96b7ccac906c1a6274704e5e90fabfaa9..77ae67d38e000802994c5316302c92432a05ce2a 100644 (file)
@@ -1,3 +1,12 @@
+2012-07-31  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * infcall.c (call_function_by_hand): Move BP_ADDR comment to
+       AT_ENTRY_POINT.
+       (call_function_by_hand) <ON_STACK>: Call write_memory with
+       gdbarch_breakpoint_from_pc, if possible.
+       (call_function_by_hand) <AT_ENTRY_POINT>: The BP_ADDR comment is moved
+       here.
+
 2012-07-30  Keith Seitz  <keiths@redhat.com>
 
        * linespec.c (linespec_lexer_lex_number): A number followed
index 51cd11829d9948d6a8e42dca50379cf47e620b76..1b2c3d6eb4c63e1e17bbaccc87500bc30dd20499 100644 (file)
@@ -618,15 +618,38 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
      not just the breakpoint but also an extra word containing the
      size (?) of the structure being passed.  */
 
-  /* The actual breakpoint (at BP_ADDR) is inserted separatly so there
-     is no need to write that out.  */
-
   switch (gdbarch_call_dummy_location (gdbarch))
     {
     case ON_STACK:
-      sp = push_dummy_code (gdbarch, sp, funaddr,
-                               args, nargs, target_values_type,
-                               &real_pc, &bp_addr, get_current_regcache ());
+      {
+       const gdb_byte *bp_bytes;
+       CORE_ADDR bp_addr_as_address;
+       int bp_size;
+
+       /* Be careful BP_ADDR is in inferior PC encoding while
+          BP_ADDR_AS_ADDRESS is a plain memory address.  */
+
+       sp = push_dummy_code (gdbarch, sp, funaddr, args, nargs,
+                             target_values_type, &real_pc, &bp_addr,
+                             get_current_regcache ());
+
+       /* Write a legitimate instruction at the point where the infcall
+          breakpoint is going to be inserted.  While this instruction
+          is never going to be executed, a user investigating the
+          memory from GDB would see this instruction instead of random
+          uninitialized bytes.  We chose the breakpoint instruction
+          as it may look as the most logical one to the user and also
+          valgrind 3.7.0 needs it for proper vgdb inferior calls.
+
+          If software breakpoints are unsupported for this target we
+          leave the user visible memory content uninitialized.  */
+
+       bp_addr_as_address = bp_addr;
+       bp_bytes = gdbarch_breakpoint_from_pc (gdbarch, &bp_addr_as_address,
+                                              &bp_size);
+       if (bp_bytes != NULL)
+         write_memory (bp_addr_as_address, bp_bytes, bp_size);
+      }
       break;
     case AT_ENTRY_POINT:
       {
@@ -634,8 +657,12 @@ call_function_by_hand (struct value *function, int nargs, struct value **args)
 
        real_pc = funaddr;
        dummy_addr = entry_point_address ();
+
        /* A call dummy always consists of just a single breakpoint, so
-          its address is the same as the address of the dummy.  */
+          its address is the same as the address of the dummy.
+
+          The actual breakpoint is inserted separatly so there is no need to
+          write that out.  */
        bp_addr = dummy_addr;
        break;
       }
index 534d5e99bec4daab6dbd83d99588fd2fef496400..178eade3e4953a70148283e8e9089654920f1161 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-31  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.base/valgrind-infcall.c: New file.
+       * gdb.base/valgrind-infcall.exp: New file.
+
 2012-07-30  Keith Seitz  <keiths@redhat.com>
 
        * gdb.linespec/ls-errs.exp: Check some quote-enclosed