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

# Test a C++ reference marked with DW_OP_GNU_implicit_pointer.
# The referenced value is a DW_AT_const_value.

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-const.S.
standard_testfile main.c .S

# ${testfile} is now "implref-const".  srcfile2 is "implref-const.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-const program.
# Any program would do, but since we already have implref-const
# 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.
Dwarf::assemble ${asm_file} {
    cu {} {
	DW_TAG_compile_unit {
	    {DW_AT_language @DW_LANG_C_plus_plus}
	} {
	    declare_labels int_label const_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]
	    set var_value 42

	    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}}
	    }

	    const_label: DW_TAG_const_type {
		{DW_AT_type :${ref_label}}
	    }

	    DW_TAG_subprogram {
		{MACRO_AT_func { "main" }}
		{DW_AT_type :${int_label}}
		{DW_AT_external 1 DW_FORM_flag}
	    } {
		variable_label: DW_TAG_variable {
		    {DW_AT_name "var"}
		    {DW_AT_type :${int_label}}
		    {DW_AT_const_value ${var_value} DW_FORM_udata}
		}

		DW_TAG_variable {
		    {DW_AT_name "ref"}
		    {DW_AT_type :${const_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
}

# Doing 'print ref' should show us e.g. '(int &) <synthetic pointer>: 42'.
gdb_test "print ref" " = \\(int &\\) <synthetic pointer>: \\\d+"

# The variable isn't located in memory, thus we can't take its address.
gdb_test "print &var" "Can't take address of \"var\" which isn't an lvalue."
gdb_test "print &ref" "Attempt to take address of value not located in memory."

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