# Copyright 2016-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 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 {
    global srcdir subdir srcfile

    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 ${srcdir}/${subdir}/${srcfile} }}
		{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>"
