# Copyright 2008, 2009, 2010, 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.
load_lib mi-support.exp
set MIFLAGS "-i=mi"

if {![dwarf2_support]} {
    return 0
}

set testfile "dw2-ref-missing-frame"
set srcsfile ${testfile}.S
set objsfile ${objdir}/${subdir}/${testfile}.o
set srcfuncfile ${testfile}-func.c
set objfuncfile ${objdir}/${subdir}/${testfile}-func.o
set srcmainfile ${testfile}-main.c
set objmainfile ${objdir}/${subdir}/${testfile}-main.o
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}

if { [gdb_compile "${srcdir}/${subdir}/${srcsfile}" $objsfile object {}] != ""
     || [gdb_compile "${srcdir}/${subdir}/${srcfuncfile}" $objfuncfile object {}] != ""
     || [gdb_compile "${srcdir}/${subdir}/${srcmainfile}" $objmainfile object {debug}] != ""
     || [gdb_compile "$objsfile $objfuncfile $objmainfile" $binfile executable {}] != "" } {
    return -1
}

if [mi_gdb_start] {
    continue
}

mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}

if [mi_runto func_nofb_marker] {
    # First try referencing DW_AT_frame_base which is not defined.
    mi_gdb_test "300-stack-list-locals --thread 1 --frame 1 --all-values" \
	"300\\^done,locals=\\\[\{name=\"func_nofb_var\",value=\"\\\<error reading variable: Could not find the frame base for \\\\\"func_nofb\\\\\"\\\.\\\>\"\},\{name=\"func_nofb_var2\",value=\"\\\<error reading variable: Could not find the frame base for \\\\\"func_nofb\\\\\"\\\.\\\>\"\}\\\].*" \
	"test func_nofb_marker"
}

# GDB could have crashed.
mi_gdb_exit
if [mi_gdb_start] {
    continue
}
mi_delete_breakpoints
mi_gdb_reinitialize_dir $srcdir/$subdir
mi_gdb_load ${binfile}

# And now try referencing DW_AT_frame_base defined using a self-reference
# (DW_OP_fbreg).
if [mi_runto func_loopfb_marker] {
    mi_gdb_test "301-stack-list-locals --thread 1 --frame 1 --all-values" \
	"301\\^done,locals=\\\[\{name=\"func_loopfb_var\",value=\"\\\<error reading variable: DWARF-2 expression error: Loop detected.*\"\},\{name=\"func_loopfb_var2\",value=\"\\\<error reading variable: DWARF-2 expression error: Loop detected.*\"\}\\\]" \
	"test func_loopfb_var"
}
