# Copyright (C) 1998, 2007-2012 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 { [skip_hp_tests] } then { continue }

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

if [get_compiler_info] {
    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
