#   Copyright (C) 1997, 1998, 2007, 2008, 2009 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 3 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, see <http://www.gnu.org/licenses/>.

# GDB tests for names beginning with '$'

# This is aimed at HP-UX systems where a lot of system
# routines and names begin with '$' or '$$'.  GDB 4.16 was
# unable to deal with these names as they clashed with
# convenience variables.  Wildebeest should accept such
# names in preference to convenience variables.

# This file was written by Satish Pai <pai@apollo.hp.com>
# 1997-09-24

if $tracelevel then {
	strace $tracelevel
	}

#
# test running programs
#
set prms_id 0
set bug_id 0

if { [skip_hp_tests] } { continue }

set testfile "dollar"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested dollar.exp
     return -1
}

#source ${binfile}.ci

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

#
# set it up at a breakpoint so we can play with the variable values
#

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

# Test for millicode routines
# hppa64 does not support dyncall
if ![istarget "hppa64*-*-*"] {
send_gdb "print \$\$dyncall\n"   
gdb_expect {   
   -re "\\$\[0-9\]* = \\{<text variable, no debug info>\\} $hex <>.*$gdb_prompt $" { pass "print \$\$dyncall" }
   -re "\\$\[0-9\]* = \\{<text variable, no debug info>\\} $hex <.*dyncall>.*$gdb_prompt $" { pass "print \$\$dyncall" }
   -re "\\$\[0-9\]* = void"            { fail "print \$\$dyncall -- interpreted as convenience var" }
   -re "$gdb_prompt $"                     { fail "print \$\$dyncall" }
   timeout                             { fail "(timeout) print \$\$dyncall" }
}
send_gdb "print \$\$dyncall_external\n"   
gdb_expect {   
   -re "\\$\[0-9\]* = \\{<text variable, no debug info>\\} $hex <>.*$gdb_prompt $" { pass "print \$\$dyncall_external" }
	-re "\\$\[0-9\]* = \\{<text variable, no debug info>\\} $hex <.*dyncall_external>.*$gdb_prompt $" { pass "print \$\$dyncall_external" }
   -re "\\$\[0-9\]* = void"            { fail "print \$\$dyncall_external -- interpreted as convenience var" }
   -re "$gdb_prompt $"                     { fail "print \$\$dyncall_external" }
   timeout                             { fail "(timeout) print \$\$dyncall_external" }
}

# Set a breakpoint on a millicode routine
send_gdb "break \$\$dyncall\n"   
gdb_expect {   
   -re "Breakpoint \[0-9\]* at $hex.*$gdb_prompt $" { pass "break \$\$dyncall" }
   -re "Function.*not defined.*$gdb_prompt $" {fail "break \$\$dyncall -- no \$\$dyncall?" }
   -re "Convenience variables used in line specs must have integer values\\..*$gdb_prompt $" {
             fail "break \$\$dyncall -- treated as convenince variable"
       }          
   -re "$gdb_prompt $"                     { fail "print break \$\$dyncall" }
   timeout                             { fail "(timeout) print break \$\$dyncall" }
}

# Disassemble $$dyncall
send_gdb "disassemble \$\$dyncall\n"   
gdb_expect {   
   -re "Dump of assembler code for function.*$gdb_prompt $" { pass "disas \$\$dyncall" }
   -re "$gdb_prompt $"                     { fail "disas \$\$dyncall" }
   timeout                             { fail "(timeout) disas \$\$dyncall" }
}

# Try to set $$dyncall like a convenience var.
send_gdb "set \$\$dyncall = 77\n"   
gdb_expect {   
   -re "Invalid cast.*$gdb_prompt $" { pass "set \$\$dyncall = 77" }
   -re "$gdb_prompt $"                     { fail "set \$\$dyncall = 77" }
   timeout                             { fail "(timeout) set \$\$dyncall = 77" }
}
}

# Try out some other $ name, not millicode
if [istarget "hppa64*-*-*"] {
    #hppa64 uses __argv instead of $ARGV.
    send_gdb "print \__argv\n"   
    gdb_expect {   
        -re "\\$\[0-9\]* = \[0-9\]*.*$gdb_prompt $" { pass "print \__argv" }
        -re "\\$\[0-9\]* = void.*$gdb_prompt $" {
	    fail "print \__argv (interpreted as convenience var)"
	}
        -re "$gdb_prompt $" { fail "print \__argv" }
        timeout { fail "(timeout) print \__argv" }
    }

    send_gdb "ptype \__argv\n"   
    gdb_expect {   
        -re "type = <data variable, no debug info>.*$gdb_prompt $" {
	    pass "ptype \__argv"
	}
        -re "type = void.*$gdb_prompt $" {
	    fail "ptype \__argv (interpreted as convenience var)"
	}
        -re "$gdb_prompt $" { fail "ptype \__argv" }
        timeout { fail "(timeout) ptype \__argv" }
    }
} else {
send_gdb "print \$ARGV\n"   
gdb_expect {   
   -re "\\$\[0-9\]* = \[0-9\]*.*$gdb_prompt $" { pass "print \$ARGV" }
   -re "\\$\[0-9\]* = void.*$gdb_prompt $" { fail "print \$ARGV (interpreted as convenience var)" }
   -re "$gdb_prompt $"                     { fail "print \$ARGV" }
   timeout                             { fail "(timeout) print \$ARGV" }
}
send_gdb "ptype \$ARGV\n"   
gdb_expect {   
   -re "type = <data variable, no debug info>.*$gdb_prompt $" { pass "ptype \$ARGV" }
   -re "type = void.*$gdb_prompt $" { fail "ptype \$ARGV (interpreted as convenience var)" }
   -re "$gdb_prompt $"                     { fail "ptype \$ARGV" }
   timeout                             { fail "(timeout) ptype \$ARGV" }
}
}
