# Copyright 2016-2023 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 struct whose location is a DW_OP_addr.

require allow_cplus_tests

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
require dwarf2_support

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

# ${testfile} is now "implref-struct".  srcfile2 is "implref-struct.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-struct program.
# Any program would do, but since we already have implref-struct
# specifically for this testcase, might as well use that.
if [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} {debug c++}] {
    return -1
}

# Create the DWARF.  We need a regular variable for the struct 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 can we can reference from
# the DWARF using gdb_target_symbol.
Dwarf::assemble ${asm_file} {
    cu {} {
	DW_TAG_compile_unit {
	    {DW_AT_language @DW_LANG_C_plus_plus}
	} {
	    declare_labels int_label struct_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 S_size [get_sizeof "S" -1]

	    # The compiler shouldn't introduce structure padding here.
	    set b_offset 4
	    set c_offset 8

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

	    struct_label: DW_TAG_structure_type {
		{DW_AT_name "S"}
		{DW_AT_byte_size ${S_size} DW_FORM_udata}
	    } {
		DW_TAG_member {
		    {DW_AT_name "a"}
		    {DW_AT_type :${int_label}}
		    {DW_AT_data_member_location 0 DW_FORM_udata}
		}

		DW_TAG_member {
		    {DW_AT_name "b"}
		    {DW_AT_type :${int_label}}
		    {DW_AT_data_member_location ${b_offset} DW_FORM_udata}
		}

		DW_TAG_member {
		    {DW_AT_name "c"}
		    {DW_AT_type :${int_label}}
		    {DW_AT_data_member_location ${c_offset} DW_FORM_udata}
		}
	    }

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

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

	    DW_TAG_variable {
		{DW_AT_name "s2"}
		{DW_AT_type :${struct_label}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "s2"]} SPECIAL_expr}
	    }

	    DW_TAG_subprogram {
		{MACRO_AT_func { "main" }}
		{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
}

# Returns the struct members, e.g. '{a = 0, b = 1, c = 2}'.
proc get_members {var} {
    set members [get_valueof "" ${var} ""]

    # Trim leading/trailing whitespace, '{' and '}' since they confuse TCL to no end.
    set members [string trim ${members}]
    set members [string trim ${members} "{}"]

    return ${members}
}

# Values of the struct members.
set s1_members [get_members "s1"]
set s2_members [get_members "s2"]

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

# Test printing with both 'set print object off' and 'on', just to make sure
# the output doesn't change.
foreach_with_prefix print-object {"off" "on"} {
    gdb_test_no_output "set print object ${print-object}"

    # Doing 'print ref' should show us e.g.
    # '(S &) @0xdeadbeef: {a = 0, b = 1, c = 2}'.
    gdb_test "print ref" " = \\(S &\\) @${address}: \\{${s1_members}\\}"

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

    # 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.
gdb_test_no_output "set (ref = s2)"

with_test_prefix "after assignment" {
    foreach_with_prefix print-object {"off" "on"} {
	gdb_test_no_output "set print object ${print-object}"

	gdb_test "print ref" " = \\(S &\\) @${address}: \\{${s2_members}\\}" "print ref"
	gdb_test "print s1" " = \\{${s2_members}\\}" "print s1"
    }
}
