# Copyright 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/>.

set testfile "library-module"
set srcfile ${testfile}-main.f90
set srclibfile ${testfile}-lib.f90
set libfile ${testfile}-lib.so
set binfile ${testfile}

# Required for -fPIC by gdb_compile_shlib.
if [get_compiler_info not-used] {
   warning "Could not get compiler info"
   return -1
}

if  { [gdb_compile_shlib "${srcdir}/${subdir}/${srclibfile}" $objdir/$subdir/$libfile {debug f77}] != "" } {
    untested "Couldn't compile ${srclibfile}"
    return -1
}

# prepare_for_testing cannot be used as linking with $libfile cannot be passed
# just for the linking phase (and not the source compilation phase).  And any
# warnings on ignored $libfile abort the process.

if  { [gdb_compile [list $srcdir/$subdir/$srcfile $objdir/$subdir/$libfile] $objdir/$subdir/$binfile executable {debug f77}] != "" } {
    untested "Couldn't compile ${srcfile}"
    return -1
}

clean_restart $binfile

if ![runto MAIN__] then {
    perror "couldn't run to breakpoint MAIN__"
    continue
}

gdb_breakpoint $srclibfile:[gdb_get_line_number "i-is-2-in-lib" $srclibfile]
gdb_continue_to_breakpoint "i-is-2-in-lib" ".*i-is-2-in-lib.*"
gdb_test "print var_i" " = 2" "print var_i in lib"

gdb_breakpoint $srcfile:[gdb_get_line_number "i-is-2-in-main" $srcfile]
gdb_continue_to_breakpoint "i-is-2-in-main" ".*i-is-2-in-main.*"
gdb_test "print var_i" " = 2" "print var_i in main"

gdb_test "print var_j" " = 3"
gdb_test "print var_k" "No symbol \"var_k\" in current context\\."
