# Copyright 2020-2021 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 support for non-byte-sized integer base types.

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 .c .S

set executable ${testfile}
set asm_file [standard_output_file ${srcfile2}]

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

# Create the DWARF.
Dwarf::assemble ${asm_file} {
    cu {} {
	DW_TAG_compile_unit {
	    {DW_AT_language @DW_LANG_C_plus_plus}
	} {
	    declare_labels i7_type u1_type u17_type u31_type \
		u31_1_type u32_0_type u0_0_type be30_1_type

	    i7_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_signed}
		{DW_AT_endianity @DW_END_little}
		{DW_AT_name "i7"}
		{DW_AT_byte_size 2 DW_FORM_udata}
		{DW_AT_bit_size 7 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_i16_m1"}
		{DW_AT_type :${i7_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "i16_m1"]}
		    SPECIAL_expr}
	    }

	    u1_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_boolean}
		{DW_AT_endianity @DW_END_little}
		{DW_AT_name "u1"}
		{DW_AT_byte_size 2 DW_FORM_udata}
		{DW_AT_bit_size 1 DW_FORM_udata}
		{DW_AT_data_bit_offset 2 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_u16_1"}
		{DW_AT_type :${u1_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "u16_1"]}
		    SPECIAL_expr}
	    }

	    u17_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_signed}
		{DW_AT_endianity @DW_END_little}
		{DW_AT_name "u17"}
		{DW_AT_byte_size 4 DW_FORM_udata}
		{DW_AT_bit_size 17 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_u32_m2"}
		{DW_AT_type :${u17_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "u32_m2"]}
		    SPECIAL_expr}
	    }

	    u31_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_unsigned}
		{DW_AT_endianity @DW_END_little}
		{DW_AT_name "u31"}
		{DW_AT_byte_size 4 DW_FORM_udata}
		{DW_AT_bit_size 31 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_u32_1"}
		{DW_AT_type :${u31_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "u32_1"]}
		    SPECIAL_expr}
	    }

	    u31_1_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_unsigned}
		{DW_AT_endianity @DW_END_little}
		{DW_AT_name "u31_1"}
		{DW_AT_byte_size 4 DW_FORM_udata}
		{DW_AT_bit_size 31 DW_FORM_udata}
		{DW_AT_data_bit_offset 1 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_u32_1_off"}
		{DW_AT_type :${u31_1_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "u32_1_off"]}
		    SPECIAL_expr}
	    }

	    be30_1_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_unsigned}
		{DW_AT_endianity @DW_END_big}
		{DW_AT_name "be30_1"}
		{DW_AT_byte_size 4 DW_FORM_udata}
		{DW_AT_bit_size 30 DW_FORM_udata}
		{DW_AT_data_bit_offset 1 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_be30_1_off"}
		{DW_AT_type :${be30_1_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "be30_1_off"]}
		    SPECIAL_expr}
	    }

	    u32_0_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_unsigned}
		{DW_AT_endianity @DW_END_little}
		{DW_AT_name "u32_0"}
		{DW_AT_byte_size 4 DW_FORM_udata}
		{DW_AT_bit_size 0 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_u32_0"}
		{DW_AT_type :${u32_0_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "u32_0"]}
		    SPECIAL_expr}
	    }

	    u0_0_type: DW_TAG_base_type {
		{DW_AT_encoding @DW_ATE_unsigned}
		{DW_AT_endianity @DW_END_little}
		{DW_AT_name "u0_0"}
		{DW_AT_byte_size 0 DW_FORM_udata}
	    }

	    DW_TAG_variable {
		{DW_AT_name "v_u0_0"}
		{DW_AT_type :${u0_0_type}}
		{DW_AT_external 1 DW_FORM_flag}
		{DW_AT_location {DW_OP_addr [gdb_target_symbol "u32_0"]}
		    SPECIAL_expr}
	    }
	}
    }
}

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

if {![runto_main]} {
    return -1
}

gdb_test "print v_i16_m1" "= -1"
gdb_test "print v_u16_1" "= true"
gdb_test "print v_u32_m2" "= -2"
gdb_test "print v_u32_1" "= 1"
gdb_test "print v_u32_0" "= 0"
gdb_test "print v_u0_0" "= 0"

gdb_test "print v_i16_m1 = 7" "= 7"
gdb_test "print v_i16_m1" "= 7" "print v_i16_m1 after assignment"

gdb_test "print v_u32_1_off" "= 1"
gdb_test "print v_u32_1_off = 7" " = 7"
gdb_test "x/4xb &v_u32_1_off" ":\t0x0e\t0x00\t0x00\t0x00"

gdb_test "print v_be30_1_off" "= 1"
gdb_test "print v_be30_1_off = 7" " = 7"
gdb_test "x/4xb &v_be30_1_off" ":\t0x00\t0x00\t0x00\t0x0e"
