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

set testfile "dw2-simple-locdesc"
set srcfile ${testfile}.S
set executable ${testfile}.x
set binfile ${objdir}/${subdir}/${executable}

if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object {}] != "" } {
    return -1
}

clean_restart $executable

# Re: [patch 2/2] Fix decode_locdesc for gcc-4.7.x optimized DWARF
# http://sourceware.org/ml/gdb-patches/2011-07/msg00766.html
set test "p &s.shl"
gdb_test_multiple $test $test {
    -re " = \\(int \\*\\) 0x1000000\r\n$gdb_prompt $" {
	pass $test
    }
    -re " = \\(int \\*\\) 0x14\r\n$gdb_prompt $" {
	kfail "symtab/13307" $test
    }
}

# Re: RFC: fix DW_AT_data_member_location buglet
# http://sourceware.org/ml/gdb-patches/2011-05/msg00291.html
gdb_test "p &s.data4" { = \(int \*\) 0x10000}
