# 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 array 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-array.S.
standard_testfile .c .S

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

set array_length [get_valueof "/u" "sizeof(array) / sizeof(array\[0\])" -1]

# Create the DWARF.  We need a regular variable which represents the array, 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 array_length

    cu {} {
	DW_TAG_compile_unit {
	    DW_AT_language @DW_LANG_C_plus_plus
	} {
	    declare_labels int_label sizetype_label array_label variable_label ref_label
	    set int_size [get_sizeof "int" -1]
	    set upper_bound [expr ${array_length} - 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"
	    }

	    sizetype_label: DW_TAG_base_type {
		DW_AT_byte_size ${int_size} DW_FORM_udata
		DW_AT_encoding @DW_ATE_unsigned
		DW_AT_name "sizetype"
	    }

	    array_label: DW_TAG_array_type {
		    DW_AT_type :${int_label}
	    } {
		DW_TAG_subrange_type {
		    DW_AT_type :${sizetype_label}
		    DW_AT_lower_bound 0 DW_FORM_udata
		    DW_AT_upper_bound ${upper_bound} DW_FORM_udata
		}
	    }

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

	    variable_label: DW_TAG_variable {
		DW_AT_name "array"
		DW_AT_type :${array_label}
		DW_AT_external 1 DW_FORM_flag
		DW_AT_location {
		    DW_OP_addr [gdb_target_symbol "array"]
		} 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
}

# This matches e.g. '(int (&)[5])'
set ref_type [format {\(int \(&\)\[%d\]\)} ${array_length}]

# This matches e.g. '(int (*)[5])'
set ptr_type [format {\(int \(\*\)\[%d\]\)} ${array_length}]

# Contents of the array.  Trim leading/trailing whitespace, '{' and '}'
# since they confuse TCL to no end.
set contents [get_valueof "" "array" ""]
set contents [string trim ${contents}]
set contents [string trim ${contents} "{}"]

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

# Doing 'print ref' should show us e.g. '(int (&)[5]) 0xdeadbeef: {0, 1, 2, 3, 4}'.
gdb_test "print ref" " = ${ref_type} @${address}: \\{${contents}\\}"

# Doing 'print &ref' should show us e.g. '(int (*)[5]) 0xdeadbeef <array>'.
gdb_test "print &ref" " = ${ptr_type} ${address} <array>"

# 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 first_value 10
gdb_test_no_output "set (ref\[0\] = ${first_value})"

# This matches '{10, 1, 2, 3, 4}'.
set new_contents [format {\{%d, 1, 2, 3, 4\}} ${first_value}]

# Doing 'print ref' should now show us e.g.
# '(int (&)[5]) <synthetic pointer>: {10, 1, 2, 3, 4}'.
gdb_test "print ref" " = ${ref_type} @${address}: ${new_contents}" "print ref after assignment"
gdb_test "print array" " = ${new_contents}" "print array after assignment"

# Test treating the array as a pointer.
set second_value 20
set new_contents [format {\{%d, %d, 2, 3, 4\}} ${first_value} ${second_value}]

gdb_test "print *ref" " = ${first_value}"
gdb_test_no_output "set (*(ref + 1) = ${second_value})"
gdb_test "print ref\[1\]" " = ${second_value}"
gdb_test "print array" " = ${new_contents}" "print array after second assignment"
