# 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 Adam Fedor (fedor@gnu.org) if $tracelevel then { strace $tracelevel } set testfile "myclass" set srcfile ${testfile}.m set binfile ${objdir}/${subdir}/${testfile} # # Objective-C program compilation isn't standard. We need to figure out # which libraries to link in. Most of the time it uses pthread # if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug "libs=-lobjc -lpthread"} ] != "" } { # Solaris requires posix4 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug "libs=-lobjc -lpthread -lposix4"} ] != "" } { if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug "libs=-lobjc"} ] != "" } { gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail." } } } # # Deduce language of main() # proc deduce_language_of_main {} { global gdb_prompt # See what language gdb thinks main() is, prior to reading full symbols. # I think this fails for COFF targets. send_gdb "show language\n" gdb_expect { -re ".* source language is \"auto; currently objective-c\".*$gdb_prompt $" { pass "deduced language is Objective-C, before full symbols" } -re ".*$gdb_prompt $" { fail "source language not correct for Objective-C (psymtabs only)" return } timeout { fail "can't show language (timeout)" return } } runto_main # See if our idea of the language has changed. send_gdb "show language\n" gdb_expect { -re ".* source language is \"auto; currently objective-c\".*$gdb_prompt $" { pass "deduced language is Objective-C, after full symbols" } -re ".*$gdb_prompt $" { fail "source language not correct for Objective-C (full symbols)" return } timeout { fail "can't show language (timeout)" return } } } proc do_objc_tests {} { global prms_id global bug_id global subdir global objdir global srcdir global binfile global gdb_prompt set prms_id 0 set bug_id 0 # Start with a fresh gdb. gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_load $binfile deduce_language_of_main } do_objc_tests # # Breakpoint tests # gdb_test "break doIt" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint method" gdb_test "break takeArg:" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint method with colon" gdb_test "break newWithArg:" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint class method with colon" # # Continue until breakpoint (test re-setting breakpoint) # gdb_test continue \ "Continuing\\..*Breakpoint \[0-9\]+, -.MyClass takeArg:. \\(self=.*, _cmd=.*, arg=.*\\) at .*$srcfile:.*" \ "continue until method breakpoint" # # Test printing objects # gdb_test "print object" \ "\\$\[0-9\] = .*0x0" \ " print an ivar of self" gdb_test "print self" \ "\\$\[0-9\] = \\(.*MyClass \\*\\) 0x\[0-9a-f\]+" \ " print self" gdb_test "print \*self" \ "\\$\[0-9\] = \{isa = 0x\[0-9a-f\]+, object = 0x0\}" \ " print contents of self" # # Break in a category # gdb_test "break hiddenMethod" \ "Breakpoint.*at.* file .*$srcfile, line.*" \ "breakpoint in category method" # # Continue until breakpoint (test re-setting category breakpoint) # gdb_test continue \ "Continuing\\..*Breakpoint \[0-9\]+, -.MyClass\\(Private\\) hiddenMethod. \\(self=.*, _cmd=.*\\) at .*$srcfile:.*" \ "continue until category method" # APPLE LOCAL: All of these selector tests down below are Apple local # additions. runto_main gdb_test "print @selector(a)" "(0x\[^0\]\[0-9a-fA-F\]+)" gdb_test "print @selector(b)" "(0x\[^0\]\[0-9a-fA-F\]+)" gdb_test "print @selector(c)" "(0x\[^0\]\[0-9a-fA-F\]+)" send_gdb "print @selector(WiwKeeOrqwKxqIFjeqwJ)\n" gdb_expect { -re ".* (0x\[^0\]\[0-9a-fA-F\]+).*$gdb_prompt $" { set selector_addr $expect_out(1,string) pass "fetch selector" } -re "$gdb_prompt $" { fail "fetch selector" } timeout { fail "fetch selector" } } gdb_test "print @selector(d)" "(0x\[^0\]\[0-9a-fA-F\]+)" send_gdb "print @selector(WiwKeeOrqwKxqIFjeqwJ)\n" gdb_expect { -re ".* (0x\[^0\]\[0-9a-fA-F\]+).*$gdb_prompt $" { set selector_addr_retry $expect_out(1,string) pass "fetch selector retry" } -re "$gdb_prompt $" { fail "fetch selector retry" } timeout { fail "fetch selector retry" } } if {$selector_addr == $selector_addr_retry} { pass "selector address cached within a single run" } else { fail "selector address cached within a single run" } runto_main gdb_test "print @selector(aaaaaaaa)" "(0x\[^0\]\[0-9a-fA-F\]+)" gdb_test "print @selector(bbbbbbbb)" "(0x\[^0\]\[0-9a-fA-F\]+)" send_gdb "print @selector(WiwKeeOrqwKxqIFjeqwJ)\n" gdb_expect { -re ".* (0x\[^0\]\[0-9a-fA-F\]+).*$gdb_prompt $" { set selector_addr_2 $expect_out(1,string) pass "fetch selector after run" } -re "$gdb_prompt $" { fail "fetch selector after run" } timeout { fail "fetch selector after run" } } if {$selector_addr != $selector_addr_2} { pass "selector address changed when re-running" } else { fail "selector address changed when re-running" } gdb_test "print @selector(cccccccc)" "(0x\[^0\]\[0-9a-fA-F\]+)" gdb_exit