# 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 f90}] != "" } {
    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 $srcdir/$subdir/$srcfile $objdir/$subdir/$binfile executable [list debug f90 shlib=$objdir/$subdir/$libfile]] != "" } {
    untested "Couldn't compile ${srcfile}"
    return -1
}

clean_restart $binfile

gdb_load_shlibs $objdir/$subdir/$libfile

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\\."
