# Copyright 2003 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 tests decoding non-debuggable Objective-C symbols

# This file was written by Adam Fedor (fedor@gnu.org)

if $tracelevel then {
	strace $tracelevel
}

set testfile "nondebug"
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_objc "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list ] ] != "" } {
  return -1
}

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

}

do_objc_tests

#
# Break on multiply defined non-debuggable symbol (PR objc/1236)
#
set name "break on non-debuggable method"
gdb_test_multiple "break someMethod" $name \
{
    -re "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\]\[ \]+-.NonDebug someMethod.*\\\[3\\\]\[ \]+-.NonDebug2 someMethod.*" {
	send_gdb "2\n"
	exp_continue
    }
    -re "\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n> " {
	gdb_test "0" "" ""
	kfail "gdb/1236" $name
    }
    -re "Breakpoint \[0-9\]+ at 0x\[0-9a-f\]+.*$gdb_prompt $" { pass $name }
    -re ".*$gdb_prompt $"   { kfail "gdb/1236" $name }
}

