# Copyright 2016-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 printing a bitfield of an optimized-out variable.  Regression
# test for PR gdb/20295.

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}

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu { version 3 addr_size 4 } {
	compile_unit {} {
	    declare_labels struct_label var_label int_label

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

	    struct_label: structure_type {
		{name S}
		{byte_size 8 DW_FORM_sdata}
	    } {
		member {
		    {name bitfield}
		    {type :$int_label}
		    {bit_size 12 DW_FORM_sdata}
		    {bit_offset 20 DW_FORM_sdata}
		}
		member {
		    {name intfield}
		    {type :$int_label}
		    {data_member_location 4 DW_FORM_sdata}
		}
	    }

	    subprogram {
		{MACRO_AT_func { main }}
		{type :$int_label}
		{external 1 flag}
	    } {
		var_label: DW_TAG_variable {
		    {name var}
		    {location {} DW_FORM_block1}
		    {type :$struct_label}
		}
	    }
	}
    }
}

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

if ![runto_main] {
    return -1
}

gdb_test "p var" " = <optimized out>"
gdb_test "p var.bitfield" " = <optimized out>"
gdb_test "p var.intfield" " = <optimized out>"
