#   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 $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" }
}
}
