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

# Test that GDB can support accesing fields of a structure if the
# fields have non-standard names.  Specifically, if the names are
# reserved C type names like 'double', 'float', 'int', etc.
#
# We don't expect to that such structures should be seen in real C
# code, but in some cases GDB will generate artificial structures, and
# in some cases, these type names are the obvious choice for field
# names.
#
# One specific example is RISC-V, the 64-bit floating point registers
# are represented as a structure with the field names 'float' and
# 'double'.

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 dw2-unusual-field-names.c dw2-unusual-field-names.S
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 test program.  Any program
# would do, but since we already have one specifically for this
# testcase, might as well use that.
if [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] {
    return -1
}
set int_size [get_sizeof "int" -1]

# Rebuild the test binary with the single field within the structure
# renamed to FIELD_NAME, then test that we can access the field
# through '.' and through '->'.
proc run_test { field_name } {
    global asm_file testfile srcfile subdir srcdir
    global int_size

    Dwarf::assemble $asm_file {
	global srcdir subdir srcfile
	global field_name int_size

	cu {} {
	    DW_TAG_compile_unit {
                {DW_AT_language @DW_LANG_C}
                {DW_AT_name     dw2-unusual-field-names.c}
                {DW_AT_comp_dir /tmp}
	    } {
		declare_labels itype ptype stype

		itype: DW_TAG_base_type {
		    {DW_AT_byte_size $int_size DW_FORM_sdata}
		    {DW_AT_encoding  @DW_ATE_signed}
		    {DW_AT_name int}
		}

		stype: DW_TAG_structure_type {
		    {DW_AT_name "foo"}
		    {DW_AT_byte_size $int_size DW_FORM_sdata}
		} {
		    member {
			{name $field_name}
			{type :$itype}
			{data_member_location 0 data1}
		    }
		}

		ptype: DW_TAG_pointer_type {
		    {DW_AT_type :$stype}
		}

		DW_TAG_variable {
		    {DW_AT_name obj}
		    {DW_AT_type :$stype}
		    {DW_AT_location {
			DW_OP_addr [gdb_target_symbol obj]
		    } SPECIAL_expr}
		    {external 1 flag}
		}

		DW_TAG_variable {
		    {DW_AT_name ptr}
		    {DW_AT_type :$ptype}
		    {DW_AT_location {
			DW_OP_addr [gdb_target_symbol ptr]
		    } SPECIAL_expr}
		    {external 1 flag}
		}
	    }
	}
    }

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

    if ![runto_main] {
	return -1
    }

    gdb_test "p obj.$field_name" " = 0" \
	"access a field named '$field_name' directly"

    gdb_test "p ptr->$field_name" " = 0" \
	"access a field named '$field_name' through a pointer"

    gdb_exit
}

foreach field_name { double float char byte long int short unsigned signed } {
    run_test $field_name
}
