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

load_lib dwarf.exp

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

require allow_cplus_tests

standard_testfile main.c -dw.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]

Dwarf::assemble $asm_file {
    # Using a funny address size here and in the pointer type lets us
    # also check for a sign-extension bug in the
    # DW_OP_GNU_implicit_pointer code.
    cu { addr_size 2 } {
 	compile_unit {} {
	    declare_labels struct_label short_type_label
	    declare_labels char_type_label ptr_label
	    declare_labels var_label

	    struct_label: structure_type {
		{name S}
		{byte_size 4 DW_FORM_sdata}
	    } {
		member {
		    {name a}
		    {type :$short_type_label}
		    {data_member_location 0 DW_FORM_sdata}
		}
		member {
		    {name b}
		    {type :$char_type_label}
		    {data_member_location 2 DW_FORM_sdata}
		}
		member {
		    {name c}
		    {type :$char_type_label}
		    {data_member_location 3 DW_FORM_sdata}
		}
	    }

	    short_type_label: base_type {
		{name "short int"}
		{encoding @DW_ATE_signed}
		{byte_size 2 DW_FORM_sdata}
	    }

	    char_type_label: base_type {
		{name "signed char"}
		{encoding @DW_ATE_signed}
		{byte_size 1 DW_FORM_sdata}
	    }

	    # See comment above to understand the pointer size.
	    ptr_label: pointer_type {
		{byte_size 2 DW_FORM_sdata}
		{type :$char_type_label}
	    }

	    var_label: DW_TAG_variable {
		{name s}
		{type :$struct_label}
		{location {
		    const2u 0x5678
		    stack_value
		    piece 2
		    const1u 2
		    stack_value
		    piece 1
		    const1u 3
		    stack_value
		    piece 1
		} SPECIAL_expr}
	    }

	    DW_TAG_variable {
		{name p}
		{type :$ptr_label}
		{location {
		    GNU_implicit_pointer $var_label 2
		} SPECIAL_expr}
	    }
	}
    }
}

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

if ![runto_main] {
    return -1
}

# Determine byte order.
set endian [get_endianness]

# Access the second byte of s through an implicit pointer to the third
# byte of s, using a negative offset.  Compare that to the second byte of
# the short integer 0x5678 in target byte order.
switch $endian { little {set val 0x56} big {set val 0x78} }
gdb_test "p/x p\[-1\]" " = $val"
