# Copyright 2016-2020 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/>.

# Test a C++ reference marked with DW_OP_GNU_implicit_pointer.
# The referenced value is a global variable whose location is a DW_OP_addr.

if [skip_cplus_tests] {
    continue
}

load_lib dwarf.exp

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

# We'll place the output of Dwarf::assemble in implref-global.S.
standard_testfile .c .S

# ${testfile} is now "implref-global".  srcfile2 is "implref-global.S".
set executable ${testfile}
set asm_file [standard_output_file ${srcfile2}]

# We need to know the size of integer and address types in order
# to write some of the debugging info we'd like to generate.
#
# For that, we ask GDB by debugging our implref-global program.
# Any program would do, but since we already have implref-global
# specifically for this testcase, might as well use that.
if [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] {
    return -1
}

# Create the DWARF.  We need a regular variable and a reference to it that'll
# be marked with DW_OP_GNU_implicit_pointer.  The variable must be global so
# that its name is an exported symbol that we can reference from the DWARF
# using gdb_target_symbol.
Dwarf::assemble ${asm_file} {
    global srcdir subdir srcfile

    cu {} {
	DW_TAG_compile_unit {
	    {DW_AT_language @DW_LANG_C_plus_plus}
	} {
	    declare_labels int_label variable_label ref_label
	    set int_size [get_sizeof "int" -1]

	    # gdb always assumes references are implemented as pointers.
	    set addr_size [get_sizeof "void *" -1]

	    int_label: DW_TAG_base_type {
		{DW_AT_byte_size ${int_size} DW_FORM_udata}
		{DW_AT_encoding @DW_ATE_signed}
		{DW_AT_name "int"}
	    }

	    ref_label: DW_TAG_reference_type {
		{DW_AT_byte_size ${addr_size} DW_FORM_udata}
		{DW_AT_type :${int_label}}
	    }

	    variable_label: DW_TAG_variable {
		{DW_AT_name "global_var"}
		{DW_AT_type :${int_label}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "global_var"]} SPECIAL_expr}
	    }

	    DW_TAG_subprogram {
		{MACRO_AT_func { "main" "${srcdir}/${subdir}/${srcfile}" }}
		{DW_AT_type :${int_label}}
		{DW_AT_external 1 DW_FORM_flag}
	    } {
		DW_TAG_variable {
		    {DW_AT_name "ref"}
		    {DW_AT_type :${ref_label}}
		    {DW_AT_location {DW_OP_GNU_implicit_pointer ${variable_label} 0} SPECIAL_expr}
		}
	    }
	}
    }
}

if [prepare_for_testing "failed to prepare" ${executable} [list ${asm_file} ${srcfile}] {}] {
    return -1
}

# DW_OP_GNU_implicit_pointer implementation requires a valid frame.
if ![runto_main] {
    return -1
}

# Address of the referenced value.
set address [get_hexadecimal_valueof "&global_var" ""]

# Doing 'print ref' should show us e.g. '(int &) @0xdeadbeef: 42'.
gdb_test "print ref" " = \\(int &\\) @${address}: \\\d+"

# Doing 'print &ref' should show us e.g. '(int *) 0xdeadbeef <global_var>'.
gdb_test "print &ref" " = \\(int \\*\\) ${address} <global_var>"

# gdb assumes C++ references are implemented as pointers, and print &(&ref)
# shows us the underlying pointer's address.  Since in this case there's no
# physical pointer, gdb should tell us so.
gdb_test "print &(&ref)" "Attempt to take address of value not located in memory."

# Test assignment through the synthetic reference.
set new_value 10
gdb_test_no_output "set (ref = ${new_value})"
gdb_test "print ref" " = \\(int &\\) @${address}: ${new_value}" "print ref after assignment"
gdb_test "print global_var" " = ${new_value}" "print global_var after assignment"
