# Copyright (C) 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

# optimize.exp -- Expect script for testing apps compiled with -O

# There is no DOC support for gdb yet, return 0 for now.
return 0

global timeout

# use this to debug:
#
#log_user 1

if $tracelevel then {
    strace $tracelevel
}

if { [skip_hp_tests] } then { continue }

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

if [get_compiler_info ${binfile}] {
    return -1;
}

 
if { $gcc_compiled } then { continue }


# Vanilla -O, which is the same as +O2
#
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug optimize=+O2}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}


gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

send_gdb "file $binfile\n"
gdb_expect {
    -re ".*no debugging symbols found.*$gdb_prompt $" {
        fail "Didn't find debug symbols; CHFts23488" 
    }
    -re ".*No header section (PXDB data).*$gdb_prompt $" {
        fail "pointless warning"
    }
    -re ".*done.*$gdb_prompt $" {
        pass "load debug symbols"
    }
    timeout { fail "timeout on file" }
}

# Two lines at the same place after opt.
#
gdb_test "b 28"   ".*"
gdb_test "b 26"   ".*also set at.*" "same line"

gdb_test "b 47"   ".*"
gdb_test "b 48"   ".*also set at.*" "same line"

gdb_test "tb main" ".*"

set old_timeout $timeout
set timeout [expr "$timeout + 200"]
send_gdb "r\n"
gdb_expect {
    -re ".*No header section (PXDB data).*$gdb_prompt $" {
        fail "pointless warning"
    }
    -re ".*main.*2\[12].*$gdb_prompt $" {
        # All the lines before line 21 or 22 are 
        # evaporated by the compiler.
        # 
        pass "hit main"
    }
    -re ".*$gdb_prompt $" {
        fail "didn't hit main"
    }
    timeout { fail "timeout on run" }
}
set timeout $old_timeout

gdb_test "c" ".*Breakpoint 1.*33.*"
gdb_test "c" ".*51.*"
gdb_test "cle" ".*Deleted breakpoints.*" "set 2, so del 2"

gdb_test "b callee" ".*"
gdb_test "c" ".*callee.*" "hit called rtn"

gdb_exit

# +O4, don't use -g
#
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {optimize=+O4}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

gdb_start
gdb_reinitialize_dir $srcdir/$subdir

send_gdb "file $binfile\n"
gdb_expect {
    -re ".*no debugging symbols found.*$gdb_prompt $" {
        pass "Didn't find debug symbols, as expected"
    }
    -re ".*No header section (PXDB data).*$gdb_prompt $" {
        fail "pointless warning"
    }
    -re ".*done.*$gdb_prompt $" {
        fail "Somehow found debug symbols--make this a pass?"
    }
    timeout { fail "timeout on file" }
}

gdb_test "b main"   ".*"
gdb_test "b callee" ".*"
gdb_test "r"        ".*Breakpoint 1.*main.*"
gdb_test "si 3"     ".*main.*" "steps"
gdb_test "x/4i \$pc" ".*main.*main+4.*main+8.*"
gdb_test "c"        ".*callee.*" "hit bp"
gdb_test "disas"    ".*callee.*callee+4.*callee+12.*"
gdb_test "si"       ".*callee.*"
gdb_test "fin"      ".*Run till exit.*main.*" "finish"
gdb_test "x/i \$pc" ".*main+.*" "back in main"
gdb_exit

#remote_exec build "rm -f ${binfile}"
return 0
