# Copyright 2011-2020 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  
}

standard_testfile main.c .S
set executable ${testfile}

# Create the DWARF.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    global srcdir subdir srcfile

    cu { version 3 addr_size 4 } {
	compile_unit {
	    {producer "GNU C 4.4.3"}
	    {language @DW_LANG_C89}
	    {name 1.c}
	} {
	    declare_labels int_label struct_label pointer_label variable_label

	    int_label: base_type {
		{byte_size 4 sdata}
		{encoding @DW_ATE_signed}
		{name int}
	    }

	    struct_label: structure_type {
		{name s}
		{byte_size 4 sdata}
	    } {
		member {
		    {name f}
		    {type :$int_label}
		    {data_member_location 0 data1}
		}
	    }

	    subprogram {
		{MACRO_AT_func { main ${srcdir}/${subdir}/${srcfile} }}
		{type :$int_label}
		{external 1 flag}
	    } {
		pointer_label: pointer_type {
		    {byte_size 4 sdata}
		    {type :$struct_label}
		}

		variable_label: DW_TAG_variable {
		    {name v}
		    {location {} DW_FORM_block1}
		    {type :$struct_label}
		}

		DW_TAG_variable {
		    {name p}
		    {location {
			GNU_implicit_pointer $variable_label 0
		    } SPECIAL_expr}
		    {type :$pointer_label}
		}
	    }
	}
    }
}

if [prepare_for_testing "failed to prepare" $executable "${asm_file} ${srcfile}" {}] {
    return -1
}

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

gdb_test "p p->f" " = <optimized out>"
