# 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 DW_OP_GNU_implicit_pointer.

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

standard_testfile .S
set csrcfile ${testfile}.c
set opts {}

if [info exists COMPILE] {
    # make check RUNTESTFLAGS='gdb.dwarf2/implptr.exp COMPILE=1 CC_FOR_TARGET=gcc\ -m32'
    set srcfile ${csrcfile}
    lappend opts debug optimize=-O2
} elseif {![is_x86_like_target]} {
    # This test can only be run on x86 targets.
    return 0  
}

if {[prepare_for_testing "failed to prepare" ${testfile} $srcfile $opts]} {
    return -1
}

# Additional test to verify the referenced CU is not aged out.
gdb_test_no_output "maintenance set dwarf max-cache-age 0"

if ![runto_main] {
    return -1
}

# Test various pointer depths in bar.
proc implptr_test_bar {} {
    global csrcfile
    set line [gdb_get_line_number "bar breakpoint" $csrcfile]
    gdb_test "break implptr.c:$line" "Breakpoint 2.*" \
       "set bar breakpoint for implptr"
    gdb_continue_to_breakpoint "continue to bar breakpoint for implptr"
    gdb_test "print j" " = \\(intp\\) <synthetic pointer>" "print j in implptr:bar"
    gdb_test {print sizeof (j[0])} " = 4" {print sizeof (j[0]) in implptr:bar}
    gdb_test "print *j" " = 5" "print *j in implptr:bar"
    gdb_test "print **k" " = 5" "print **k in implptr:bar"
    gdb_test "print ***l" " = 5" "print ***l in implptr:bar"
}

# Test implicit pointer offset.
proc implptr_test_baz {} {
    global csrcfile
    set line [gdb_get_line_number "baz breakpoint" $csrcfile]
    gdb_test "break implptr.c:$line" "Breakpoint 3.*" \
	"set baz breakpoint for implptr"
    gdb_continue_to_breakpoint "continue to baz breakpoint for implptr"

    # We are breaking in an inlined function.  GDB should appear to
    # have stopped "in" the inlined function.
    gdb_test "up" "#1  foo .*"
    gdb_test {p p[0].y} " = 92" "sanity check element 0"
    gdb_test {p p[1].y} " = 46" "sanity check element 1"
    gdb_test "down" "#0  add .*"
    gdb_test "p a->y" " = 92" "check element 0 for the offset"
    gdb_test "p b->y" " = 46" "check element 1 for the offset"
    gdb_continue_to_breakpoint "ignore the second baz breakpoint"
}

# Test some values in foo.
proc implptr_test_foo {} {
    global csrcfile
    set line [gdb_get_line_number "foo breakpoint" $csrcfile]
    gdb_test "break implptr.c:$line" "Breakpoint 4.*" \
	"set foo breakpoint for implptr"
    gdb_continue_to_breakpoint "continue to foo breakpoint for implptr"
    gdb_test "print p\[0].x" " = \\(int \\*\\) <synthetic pointer>" \
	"print p\[0].x in implptr:foo"
    gdb_test "print *p\[0].x" " = 69" \
	"print *p\[0].x in implptr:foo"
    gdb_test "print/d *(((char *) p\[0].x) + 1)" " = 0" \
	"print byte inside *p\[0].x in implptr:foo"
    gdb_test "print *(p\[0].x + 10)" \
	"access outside bounds of object referenced via synthetic pointer" \
	"print invalid offset from *p\[0].x in implptr:foo"
    gdb_test "print j" " = 69" \
	"print j in implptr:foo"
}

implptr_test_bar
implptr_test_baz
implptr_test_foo
