#   Copyright (C) 1997, 1998 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.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# 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 ![ istarget "*-*-hpux*" ] then {
 return
}

if $tracelevel then {
	strace $tracelevel
	}

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

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

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

#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
send_gdb "print \$\$dyncall\n"   
gdb_expect {   
   -re "\\$\[0-9\]* = \\{<text variable, no debug info>\\} $hex <>.*$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\]* = 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
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" }
}

