# Copyright 2012 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 executable ctxobj-m

# The sources used to build two shared libraries (SO).  We use the exact
# same sources to build both SOs, but differentiate them through the use
# of macros defined when calling the compiler.
#
# We need two source files per SO, because we need to test the situation
# where we are trying to print the value of a global variable defined
# in that SO while the variable's associated symtab has not been created
# yet.
set libsrc [list "${srcdir}/${subdir}/ctxobj-v.c" \
                 "${srcdir}/${subdir}/ctxobj-f.c"]

set libobj1 "${objdir}/${subdir}/libctxobj1.so"
set libobj2 "${objdir}/${subdir}/libctxobj2.so"

set libobj1_opts { debug additional_flags=-fPIC
                   additional_flags=-DVERSION=104
                   additional_flags=-DGET_VERSION=get_version_1 }
set libobj2_opts { debug additional_flags=-fPIC
                   additional_flags=-DVERSION=203
                   additional_flags=-DGET_VERSION=get_version_2 }

if { [gdb_compile_shlib $libsrc $libobj1 $libobj1_opts ] != "" } {
    return -1
}
if { [gdb_compile_shlib $libsrc $libobj2 $libobj2_opts ] != "" } {
    return -1
}
if { [gdb_compile "${srcdir}/${subdir}/${executable}.c" \
                  "${objdir}/${subdir}/${executable}" \
                  executable \
                  [list debug shlib=${libobj1} shlib=${libobj2}]]
     != ""} {
    return -1
}

clean_restart $executable
gdb_load_shlibs $libobj1 $libobj2

if ![runto_main] {
    untested "could not run to main"
    return -1
}

set bp_location [gdb_get_line_number "STOP" "ctxobj-f.c"]
gdb_test "break ctxobj-f.c:$bp_location" \
         "Breakpoint \[0-9\]+ at 0x\[0-9a-fA-F\]+: .*" \
         "break in get_version functions"

gdb_test "continue" \
         "Breakpoint $decimal, get_version_1 \\(\\).*" \
         "continue to get_version_1"

# Try printing "this_version_num".  There are two global variables
# with that name, and some systems such as GNU/Linux merge them
# into one single entity, while some other systems such as Windows
# keep them separate.  In the first situation, we have to verify
# that GDB does not randomly select the wrong instance.  And in
# the second case, we have to verify that GDB prints the value
# of the instance from the current debugging context (the shared
# library currently being debugged).
#
# We perform two tests: The first print test verifies that we are
# doing things right when the partial symtab hasn't been expanded.
# And the second print test will do the same, but after the partial
# symtab has been expanded.
#
# To avoid adding target-specific code in this testcase, the program
# sets a local variable named 'v' with the value of the global
# variable 'this_version_number'.  This allows us to compare the value
# that GDB thinks 'this_version_num' has, against the actual value
# seen by the program itself.

gdb_test "print this_version_num == v" \
         " = 1" \
        "print libctxobj1's this_version_num from partial symtab"

gdb_test "print this_version_num == v" \
         " = 1" \
        "print libctxobj1's this_version_num from symtab"

# Do the same, but from get_version_2.

gdb_test "continue" \
         "Breakpoint $decimal, get_version_2 \\(\\).*" \
         "continue to get_version_2"

gdb_test "print this_version_num == v" \
         " = 1" \
        "print libctxobj2's this_version_num from partial symtab"

gdb_test "print this_version_num == v" \
         " = 1" \
        "print libctxobj2's this_version_num from symtab"
