From: Jan Kratochvil Date: Tue, 31 Jul 2012 07:34:40 +0000 (+0000) Subject: gdb/ X-Git-Tag: gdb_7_5-2012-08-17-release~42 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3ae9dfc6ebf1ff7d3decaf4493e612fa5f638cfc;p=thirdparty%2Fbinutils-gdb.git gdb/ * infcall.c (call_function_by_hand): Move BP_ADDR comment to AT_ENTRY_POINT. (call_function_by_hand) : Call write_memory with gdbarch_breakpoint_from_pc, if possible. (call_function_by_hand) : The BP_ADDR comment is moved here. gdb/testsuite/ * gdb.base/valgrind-infcall.c: New file. * gdb.base/valgrind-infcall.exp: New file. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fdb66eb96b7..77ae67d38e0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2012-07-31 Jan Kratochvil + + * infcall.c (call_function_by_hand): Move BP_ADDR comment to + AT_ENTRY_POINT. + (call_function_by_hand) : Call write_memory with + gdbarch_breakpoint_from_pc, if possible. + (call_function_by_hand) : The BP_ADDR comment is moved + here. + 2012-07-30 Keith Seitz * linespec.c (linespec_lexer_lex_number): A number followed diff --git a/gdb/infcall.c b/gdb/infcall.c index 51cd11829d9..1b2c3d6eb4c 100644 --- a/gdb/infcall.c +++ b/gdb/infcall.c @@ -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; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 534d5e99bec..178eade3e49 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-07-31 Jan Kratochvil + + * gdb.base/valgrind-infcall.c: New file. + * gdb.base/valgrind-infcall.exp: New file. + 2012-07-30 Keith Seitz * gdb.linespec/ls-errs.exp: Check some quote-enclosed