# Copyright 2013-2016 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.
if {![dwarf2_support]} {
    return 0  
}

if { [skip_cplus_tests] } { continue }

standard_testfile main.c implptrpiece-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 {
		    const1u 1
		    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 { [build_executable ${testfile}.exp ${testfile} \
	  [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

# We need --readnow because otherwise we never read in the CU we
# created above.
set saved_gdbflags $GDBFLAGS
set GDBFLAGS "$GDBFLAGS -readnow"
clean_restart ${testfile}
set GDBFLAGS $saved_gdbflags

if ![runto_main] {
    return -1
}

gdb_test "print/d p\[-1\]" " = 0"
