# Copyright 2008, 2009, 2010 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/>.

# This test can only be run on targets which support DWARF-2 and use gas.
# For now pick a sampling of likely targets.
if {![istarget *-*-linux*]
    && ![istarget *-*-gnu*]
    && ![istarget *-*-elf*]
    && ![istarget *-*-openbsd*]
    && ![istarget arm-*-eabi*]
    && ![istarget powerpc-*-eabi*]} {
    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
}

clean_restart $executable

# First try referencing DW_AT_frame_base which is not defined.
if [runto func_nofb] {
    gdb_test "p func_nofb_var" {Could not find the frame base for "func_nofb".} "func_nofb print"
    gdb_test "bt full" " in main .* main_var = 1" "func_nofb backtrace"
}

# GDB could have crashed.
clean_restart $executable

# And now try referencing DW_AT_frame_base defined using a self-reference
# (DW_OP_fbreg).
if [runto func_loopfb] {
    gdb_test "p func_loopfb_var" "DWARF-2 expression error: Loop detected .*" "func_loopfb print"
    gdb_test "bt full" " in main .* main_var = 1" "func_loopfb backtrace"
}
