# Copyright (C) 1998, 2007, 2008 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/>.  */

# 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}] != "" } {
     untested optimize.exp
     return -1
}


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}] != "" } {
     untested optimize.exp
     return -1
}

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
