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