# Copyright 2010-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/>.
load_lib dwarf.exp
# Test some DWARF piece operators.

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0  
}
# This test can only be run on x86 targets.
if {![is_x86_like_target]} {
    return 0  
}

standard_testfile .S
set csrcfile ${testfile}.c

if {[prepare_for_testing ${testfile}.exp ${testfile} $srcfile]} {
    return -1
}

if ![runto_main] {
    return -1
}

# Function f1 tests a particular gdb bug involving DW_OP_piece.
proc pieces_test_f1 {} {
    global csrcfile
    set line [gdb_get_line_number "f1 breakpoint" $csrcfile]
    gdb_test "break pieces.c:$line" "Breakpoint 2.*" \
	"set f1 breakpoint for pieces"
    gdb_continue_to_breakpoint "continue to f1 breakpoint for pieces"
    gdb_test "print a" " = {i = 4, j = 14}" "print a in pieces:f1"
    gdb_test "print a.j" " = 14" "print a.j in pieces:f1"
}

# Function f2 tests for a bug when indexing into an array created
# using DW_OP_piece.
proc pieces_test_f2 {} {
    global csrcfile
    set line [gdb_get_line_number "f2 breakpoint" $csrcfile]
    gdb_test "break pieces.c:$line" "Breakpoint 3.*" \
       "set f2 breakpoint for pieces"
    gdb_continue_to_breakpoint "continue to f2 breakpoint for pieces"
    gdb_test "print a" " = .4, 14." "print a in pieces:f2"
    gdb_test "print a\[0\]" " = 4" "print a\[0\] in pieces:f2"
    gdb_test "print a\[1\]" " = 14" "print a\[1\] in pieces:f2"
}

# Function f3 tests DW_OP_bit_piece.
proc pieces_test_f3 {} {
    global csrcfile
    set line [gdb_get_line_number "f3 breakpoint" $csrcfile]
    gdb_test "break pieces.c:$line" "Breakpoint 4.*" \
       "set f3 breakpoint for pieces"
    gdb_continue_to_breakpoint "continue to f3 breakpoint for pieces"
    gdb_test "print a.i" " = 4" "print a.i in pieces:f3"
    gdb_test "print a.j" " = 14" "print a.j in pieces:f3"
    gdb_test "print a.i = 7" " = 7" "set a.i in pieces:f3"
    gdb_test "print a.i" " = 7" "print new a.i in pieces:f3"
}

# Function f6 tests for an empty DW_OP_piece.
proc pieces_test_f6 {} {
    global csrcfile
    set line [gdb_get_line_number "f6 breakpoint" $csrcfile]
    gdb_test "break pieces.c:$line" "Breakpoint 5.*" \
       "set f6 breakpoint for pieces"
    gdb_continue_to_breakpoint "continue to f6 breakpoint for pieces"
    gdb_test "print a" \
	" = {i = 7, j = 8, q = .optimized out.}" \
	"print a with optimized out piece"
    # Note: no warning for this case.
    gdb_test_multiple "print a.i" \
	"print a.i with optimized out piece" {
	    -re "warning: some bits in computed object" {
		fail "print a.i with optimized out piece"
	    }
	    -re " = 7" {
		pass "print a.i with optimized out piece"
	    }
	}
}

pieces_test_f1
pieces_test_f2
pieces_test_f3
pieces_test_f6
