| # Copyright 2002 Free Software Foundation, Inc. |
| |
| # This program is free software; you can redistribute it and/or modify |
| # it under the terms of the GNU General Public License as published by |
| # the Free Software Foundation; either version 2 of the License, or |
| # (at your option) any later version. |
| # |
| # This program is distributed in the hope that it will be useful, |
| # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| # GNU General Public License for more details. |
| # |
| # You should have received a copy of the GNU General Public License |
| # along with this program; if not, write to the Free Software |
| # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| |
| # This file was written by Jason Molenda (jmolenda@apple.com) |
| |
| |
| # These were written when we were having a problem with gcc not handling |
| # instance variables for an object whose debug info resides in a shared |
| # library. These tests never did reproduce the problem, but they do some |
| # useful shlib handling things, so they remain. |
| # There are two versions of the executable - ivars-static and ivars-dynamic. |
| |
| # ivars-static links against the shared library at link-time (ld), so gdb |
| # can viably get the dynamic info before it starts execution. Despite the |
| # name, nothing is "statically linked" as you'd know it on an ELF system; |
| # it refers to the static link edtor, aka ld. The shlib is named on the |
| # final gcc command line, so ld knows about it and records information |
| # about it in the executable. |
| |
| # ivars-dynamic links against the shared library at run-time, so gdb has |
| # to notice the shared library load message from the dynamic run-time linker |
| # and insert the breakpoint correctly. The shared library was unmentioned |
| # at static link time (ld), so there's no information about it in the |
| # executable. A better name would be "ivars-loaded-by-hand". |
| |
| |
| if $tracelevel then { |
| strace $tracelevel |
| } |
| |
| set timeout 30 |
| set prms_id 0 |
| set bug_id 0 |
| |
| if [target_info exists noobjc64] { |
| verbose "Skipping Objective-C tests on 64-bit PowerPC." |
| return |
| } |
| |
| set libfile "libivars" |
| set libbinfile ${objdir}/${subdir}/${libfile}.dylib |
| |
| set staticfile "ivars-static" |
| set staticsrcfile ${staticfile}.m |
| set staticbinfile ${objdir}/${subdir}/${staticfile} |
| |
| set dynamicfile "ivars-dynamic" |
| set dynamicsrcfile ${dynamicfile}.m |
| set dynamicbinfile ${objdir}/${subdir}/${dynamicfile} |
| |
| proc get_libsystem_load_addr { } { |
| global decimal |
| global hex |
| global gdb_prompt |
| global libsystem_load_addr |
| |
| set libsystem_load_addr -1 |
| |
| gdb_exit |
| gdb_start |
| gdb_load "/bin/echo" |
| send_gdb "info sharedlibrary\n" |
| gdb_expect { |
| -re ".*$decimal libSystem...dylib - - *init Y Y .*libSystem...dylib at ($hex).*$gdb_prompt $" { |
| set libsystem_load_addr $expect_out(1,string) |
| } |
| -re "$gdb_prompt $" { } |
| timeout { } |
| } |
| return 0 |
| } |
| |
| |
| proc build_library { args } { |
| global srcdir |
| global subdir |
| global libfile |
| global libbinfile |
| |
| set more_opts [lindex $args 0] |
| set additional_flags "additional_flags=-dynamiclib $more_opts -framework Foundation" |
| if { [gdb_compile "${srcdir}/${subdir}/${libfile}.m" "${libbinfile}" executable [list debug $additional_flags]] != "" } { |
| gdb_suppress_entire_file "Testcase library compile failed, so all tests in this file will automatically fail." |
| } |
| |
| return 0 |
| } |
| |
| proc test_run { args } { |
| # Start with a fresh gdb |
| global srcdir |
| global subdir |
| global staticbinfile |
| global dynamicbinfile |
| global gdb_prompt |
| global hex |
| |
| set run_name [lindex $args 0] |
| |
| gdb_exit |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| gdb_load ${staticbinfile} |
| gdb_test "show lang" "The current source language is \"auto; currently objective-c\"." "obj-c lang detection ($run_name) (static prog)" |
| gdb_test "info sharedlibrary" ".*libivars.dylib.*init Y \[BY\].*libivars.dylib.*" "info sharedlibrary pre-start ($run_name) (static prog)" |
| gdb_test "future-break randomFunc" ".*Breakpoint 1.*" "Set object breakpoint ($run_name) (static prog)" |
| send_gdb "run\n" |
| set stopped "no" |
| gdb_expect { |
| -re ".*Breakpoint 1, -\\\[MyClass randomFunc\\\].*libivars.m.*$gdb_prompt $" { |
| pass "continue to obj bp ($run_name) (static prog)" |
| set stopped "yes" |
| } |
| -re ".*Program exited.*" { |
| fail "continue to obj bp: Program exited ($run_name) (static prog)" |
| set stopped "no" |
| } |
| -re ".*internal-error: assertion failure in function.*Quit this debugging session. .y or n. $" { |
| fail "continue to obj bp: assertion error! ($run_name) (static prog)" |
| set stopped "no" |
| } |
| -re ".*$gdb_prompt $" { |
| fail "continue to obj bp: Program exited ($run_name) (static prog)" |
| set stopped "no" |
| } |
| timeout { |
| fail "(timeout) continue to obj bp ($run_name) (static prog)" |
| set stopped "yes" |
| } |
| } |
| if {$stopped == "yes"} { |
| gdb_test "show lang" "The current source language is \"auto; currently objective-c\"." "obj-c lang detection at breakpoint (static prog)" |
| gdb_test "po object" "hi there" "print ivar object #1 ($run_name) (static prog)" |
| gdb_test "po _object2" "hi there" "print ivar object #2 ($run_name) (static prog)" |
| gdb_test "po self->object" "hi there" "print ivar object #3 ($run_name) (static prog)" |
| gdb_test "po self->_object2" "hi there" "print ivar object #4 ($run_name) (static prog)" |
| gdb_test "info sharedlibrary" ".*Foundation.*" "quick post-run info shlib check to help debugging ($run_name) (static prog)" |
| } |
| |
| gdb_exit |
| |
| |
| gdb_start |
| gdb_reinitialize_dir $srcdir/$subdir |
| gdb_load ${dynamicbinfile} |
| gdb_test "show lang" "The current source language is \"auto; currently objective-c\"." "obj-c lang detection pre-run (dynamic prog)" |
| gdb_test "info sharedlibrary" ".*" |
| gdb_test "future-break randomFunc" ".*Breakpoint 1.*" "Set object breakpoint ($run_name) (dynamic prog)" |
| send_gdb "run\n" |
| set stopped "no" |
| gdb_expect { |
| -re ".*Breakpoint 1, -\\\[MyClass randomFunc\\\].*libivars.m.*$gdb_prompt $" { |
| pass "continue to obj bp ($run_name) (dynamic prog)" |
| set stopped "yes" |
| } |
| -re ".*Breakpoint 2, -\\\[MyClass randomFunc\\\].*libivars.m.*$gdb_prompt $" { |
| # The breakpoint should be #1, as we assigned it originally. |
| fail "continue to obj bp ($run_name) (dynamic prog) (wrong breakpoint number)" |
| set stopped "yes" |
| } |
| -re ".*Program exited.*" { |
| fail "continue to obj bp: Program exited ($run_name) (dynamic prog)" |
| set stopped "no" |
| } |
| -re ".*internal-error: assertion failure in function.*Quit this debugging session. .y or n. $" { |
| fail "continue to obj bp: assertion error! ($run_name) (dynamic prog)" |
| set stopped "no" |
| } |
| timeout { |
| fail "(timeout) continue to obj bp ($run_name) (dynamic prog)" |
| set stopped "yes" |
| } |
| } |
| if {$stopped == "yes"} { |
| gdb_test "show lang" "The current source language is \"auto; currently objective-c\"." "obj-c lang detection at breakpoint (dynamic prog)" |
| gdb_test "po object" "hi there" "print ivar object #1 ($run_name) (dynamic prog)" |
| gdb_test "po _object2" "hi there" "print ivar object #2 ($run_name) (dynamic prog)" |
| gdb_test "po self->object" "hi there" "print ivar object #3 ($run_name) (dynamic prog)" |
| gdb_test "po self->_object2" "hi there" "print ivar object #4 ($run_name) (dynamic prog)" |
| gdb_test "info sharedlibrary" ".*Foundation.*" "quick post-run info shlib check to help debugging ($run_name) (dynamic_prog)" |
| } |
| |
| gdb_exit |
| |
| return 0 |
| } |
| |
| build_library "" |
| |
| # Build ivars-static |
| |
| set additional_flags "additional_flags=-framework Foundation -L$objdir/$subdir -livars" |
| if { [gdb_compile "${srcdir}/${subdir}/$staticsrcfile" "${staticbinfile}" executable [list debug $additional_flags]] != "" } { |
| gdb_suppress_entire_file "Testcase executable compile failed, so all tests in this file will automatically fail." |
| } |
| |
| # build ivars-dynamic |
| |
| set additional_flags "additional_flags=-framework Foundation -DLIBNAME=\"${libbinfile}\"" |
| if { [gdb_compile "${srcdir}/${subdir}/$dynamicsrcfile" "${dynamicbinfile}" executable [list debug $additional_flags]] != "" } { |
| gdb_suppress_entire_file "Testcase executable compile failed, so all tests in this file will automatically fail." |
| } |
| |
| test_run "dylib no addr specified" |
| |
| build_library "-seg1addr 0x0" |
| test_run "dylib slide from 0x0" |
| |
| get_libsystem_load_addr |
| build_library "-seg1addr $libsystem_load_addr" |
| test_run "dylib slide from $libsystem_load_addr" |
| |
| build_library "-seg1addr 0x500000" |
| test_run "dylib maybe without a slide" |
| |
| return 0 |