# Copyright 2010-2021 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 "failed to prepare" ${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
