This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] Accept compiler internal use of memcpy/bcopy for structs
- From: Fred Fish <fnf at fred dot ninemoons dot com>
- To: gdb-patches at sources dot redhat dot com
- Cc: fnf at redhat dot com
- Date: Tue, 8 Jan 2002 09:58:36 -0700 (MST)
- Subject: [RFA] Accept compiler internal use of memcpy/bcopy for structs
- Reply-to: fnf at redhat dot com
For cases where the compiler uses memcpy/bcopy to copy structs around,
and those calls are found in a library for which debugging line number
information is available, attempting to step into a function where a
large struct is passed by value will first stop at the memcpy/bcopy
call that the compiler calls prior to the user function.
The comment in step-test.exp says that "opinion is bitterly divided
about whether this is the right behavior for GDB or not". Regardless
of which opinion you have, you would probably have to agree that gdb
is currently behaving as designed, in the absence of additional
code to not stop in functions used internally by the compiler. Thus
I believe the correct behavior of the test suite is to accept the
cases where gdb stops in memcpy/bcopy.
Here is a patch to fix the testsuite.
-Fred
2002-01-08 Fred Fish <fnf@redhat.com>
* gdb.base/step-test.exp: Accept stopping in memcpy/bcopy when we
have debugging info for those functions and the compiler uses them
internally to copy structs around.
Index: gdb.base/step-test.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/step-test.exp,v
retrieving revision 1.3
diff -c -p -r1.3 step-test.exp
*** step-test.exp 2001/03/06 08:21:51 1.3
--- step-test.exp 2002/01/08 16:51:30
*************** gdb_test \
*** 212,220 ****
gdb_test "continue" \
".*Breakpoint ${decimal},.*large_struct_by_value.*" \
"run to pass large struct"
! gdb_test "step" \
! ".*step-test.exp: arrive here 1.*" \
! "large struct by value"
gdb_continue_to_end "step-test.exp"
--- 212,244 ----
gdb_test "continue" \
".*Breakpoint ${decimal},.*large_struct_by_value.*" \
"run to pass large struct"
! send_gdb "step\n"
! gdb_expect {
! -re ".*step-test.exp: arrive here 1.*$gdb_prompt $" {
! pass "large struct by value"
! }
! -re ".*(memcpy|bcopy).*$gdb_prompt $" {
! send_gdb "finish\n" ; gdb_expect -re "$gdb_prompt $"
! send_gdb "step\n"
! gdb_expect {
! -re ".*step-test.exp: arrive here 1.*$gdb_prompt $" {
! pass "large struct by value"
! }
! -re ".*$gdb_prompt $" {
! fail "large struct by value"
! }
! timeout {
! fail "large struct by value (timeout)"
! }
! }
! }
! -re ".*$gdb_prompt $" {
! fail "large struct by value"
! }
! timeout {
! fail "large struct by value (timeout)"
! }
! }
gdb_continue_to_end "step-test.exp"