# Copyright 2016-2026 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
}

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

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

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