#   Copyright (C) 1997-1998, 2007-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/>.  */


if { [skip_hp_tests] } then { continue }

set testfile "so-thresh"
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info] {
    return -1
}

# This testcase is relatively large, and therefore can take awhile to
# load.  We'd best set the timeout to something suitable, or we may
# seem to fail...
#
set timeout 60

# Build procedure for this testcase:
#    ${srcdir}/${subdir}/so-thresh.sh ${subdir}
#        which calls,
#        make -f ${srcdir}/${subdir}/so-thresh.mk <targets> <macros>
#            which builds,
#                genso-thresh (from genso-thresh.c)
#                    which generates,
#                        lib00-so-thresh.c
#                        lib01-so-thresh.c
#                        lib02-so-thresh.c
#                        so-thresh.lopt (link options file)
#                lib0*-so-thresh.sl (from .c files above)
#                so-thresh (from so-thresh.c)
#                    using lib0*-so-thresh.sl and so-thresh.lopt
#
# Since so-thresh.mk requires SRCDIR and OBJDIR macro definitions,
# and SRCDIR / OBJDIR could be in relative path format, we use
# so-thresh.sh script to pin down SRCDIR / OBJDIR (using $PWD/ prefix
# when detected relative path values for srcdir / objdir), before the
# 'cd $subdir' call (when this can be done in TCL here, we can call
# make directly instead).
#
# remote_exec build "sh -c \\\"cd ${objdir}/${subdir}\\; make -v -f ${srcdir}/${subdir}/${testfile}.mk clean require_shlibs all SRCDIR=${srcdir}/${subdir} OBJDIR=${objdir}/${subdir}\\\""

remote_exec build "${srcdir}/${subdir}/${testfile}.sh $subdir"

# Only HP-UX (and any other platforms using SOM shared libraries, I
# guess) interprets the auto-solib-limit variable as a threshhold,
# rather than a boolean that strictly enables or disables automatic
# loading of shlib symbol tables.
#
# On HP-UX, it is the size threshhold (in megabytes) at which to
# stop auto loading of symbol tables.
#
if ![istarget "hppa*-hp-hpux*"] then {
   setup_xfail "*-*-*"
}

# Start with a fresh gdb
#
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# This is a test of gdb's ability on HP-UX to stop automatically
# loading symbols of shared libraries, when the total size of the
# debugger's symbol table reaches a specified threshhold.
#

# On HP-UX, the help text for auto-solib-limit mentions that it
# serves as a threshhold.
#
send_gdb "help set auto-solib-limit\n"
gdb_expect {
  -re "Set threshold .in Mb. for autoloading shared library symbols.*
When shared library autoloading is enabled, new libraries will be loaded.*
only until the total size of shared library symbols exceeds this.*
threshold in megabytes.  Is ignored when using .sharedlibrary.*$gdb_prompt $"\
          {pass "help set auto-solib-limit"}
  -re "$gdb_prompt $"\
          {fail "help set auto-solib-limit"}
  timeout {fail "(timeout) help set auto-solib-limit"}
}

# On HP-UX, the threshhold is by default set to 50, which means
# 50 megabytes.
#
send_gdb "show auto-solib-limit\n"
gdb_expect {
  -re "Threshold .in Mb. for autoloading shared library symbols is $decimal.*$gdb_prompt $"\
          {pass "show auto-solib-limit "}
  -re "$gdb_prompt $"\
          {fail "show auto-solib-limit "}
  timeout {fail "(timeout) show auto-solib-limit "}
}

send_gdb "set auto-solib-limit 1\n"
gdb_expect {
   -re ".*$gdb_prompt $"
            {pass "set auto-solib-limit to 1"}
   -re ".*$gdb_prompt $"
            {fail "set auto-solib-limit to 1"}
   timeout {fail "(timeout) set auto-solib-limit to 1"}
}


# We have manually verified that our testcase exceeds 1 Mbytes
# of heap space in GDB to hold the symbols for the main program
# and all associated linked-against libraries.  Thus, when we
# run to the program's main, and therefore notice all the linked-
# against shlibs, we expect to hit the threshhold.
#
# (Note that we're not using the expect [runto main] function here,
# 'cause we want to match on output from the run command.
#
send_gdb "break main\n"
gdb_expect {
  -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\
          {pass "1 set break at main"}
  -re "$gdb_prompt $"\
          {fail "1 set break at main"}
  timeout {fail "(timeout) 1 set break at main"}
}

send_gdb "run\n"
gdb_expect {
  -re ".*warning. Symbols for some libraries have not been loaded, because.*
doing so would exceed the size threshold specified by auto-solib-limit.*
To manually load symbols, use the 'sharedlibrary' command.*
To raise the threshold, set auto-solib-limit to a larger value and rerun.*
the program.*$gdb_prompt $"\
          {pass "run to main hit auto-solib-limit threshold"}
  -re "$gdb_prompt $"\
          {fail "run to main hit auto-solib-limit threshold"}
  timeout {fail "(timeout) run to main hit auto-solib-limit threshold"}
}

# Verify that "info share" mentions something about libraries whose
# symbols weren't loaded.
#
# We'll assume that at least the last two shlib's symbols weren't
# loaded.  As a side-effect of matching this pattern, the text start
# address of the last one is captured in expect_out(1,string).
# (we'll need it for the 'add-symbol-file' command in a nonce...)
#
send_gdb "info sharedlibrary\n"
gdb_expect {
  -re ".*lib01_$testfile.sl .*symbols not loaded.*0x\[0-9\]*  (0x\[0-9a-fA-F\]*).*$gdb_prompt $"\
          { send_gdb "add-symbol-file lib02_$testfile.sl $expect_out(1,string)\n"
            gdb_expect {
              -re "add symbol table.*y or n.*$"\
                      {send_gdb "y\n"
                       gdb_expect {
                         -re "$gdb_prompt $" {pass "add-symbol-file and info sharedlib"}
                         timeout {fail "(timeout) add-symbol-file and info sharedlib"}
                       }}
              -re "$gdb_prompt $"\
                      {fail "add-symbol-file and info sharedlib"}
              timeout {fail "(timeout) add-symbol-file and info sharedlib"}
            }
          }
  -re "$gdb_prompt $" {
	setup_xfail hppa*-*-* CHFts24108
	fail "info sharedlibrary shows shlibs with unloaded symbols"
    }
  timeout {fail "(timeout) info sharedlibrary shows shlibs with unloaded symbols"}
}

# Verify that we can manually load the symbol table of a library
# whose symbols weren't loaded.  (We'll pick the last one.)
#

# I moved this test inside the one above, because the expect_out array is not ok if the
# previous test has failed, and expect would error out (elz)
#
#send_gdb "add-symbol-file lib02_$testfile.sl $expect_out(1,string)\n"
#gdb_expect {
#  -re "add symbol table.*y or n.*$"\
#          {send_gdb "y\n"
#           gdb_expect {
#             -re "$gdb_prompt $" {pass "add-symbol-file"}
#             timeout {fail "(timeout) add-symbol-file"}
#           }}
#  -re "$gdb_prompt $"\
#          {fail "add-symbol-file"}
#  timeout {fail "(timeout) add-symbol-file"}
#}

# Verify that we can manually load the symbols for all libraries
# which weren't already loaded.
#
# Warning!  On a machine with little free swap space, this may
# fail!
#
send_gdb "sharedlibrary\n"
gdb_expect {
  -re "Reading symbols from.*done.*$gdb_prompt $"\
          {pass "sharedlibrary"}
  -re "$gdb_prompt $" {
	setup_xfail hppa*-*-* CHFts24108
	fail "sharedlibrary"
    }
  timeout {fail "(timeout) sharedlibrary"}
}

# Rerun the program, this time verifying that we can set the
# threshhold high enough to avoid hitting it.
#
# It appears that gdb isn't freeing memory when rerunning, as one
# would expect.  To avoid potentially hitting a virtual memory
# ceiling, start with a fresh gdb.
#
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

send_gdb "break main\n"
gdb_expect {
  -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\
          {pass "2 set break at main"}
  -re "$gdb_prompt $"\
          {fail "2 set break at main"}
  timeout {fail "(timeout) 2 set break at main"}
}

send_gdb "set auto-solib-limit 9999\n"
gdb_expect {
  -re "$gdb_prompt $"\
          {pass "set auto-solib-limit threshold to practical infinity"}
  timeout {fail "(timeout) set auto-solib-limit threshold to practical infinity"}
}
send_gdb "run\n"
gdb_expect {
  -re ".*warning. Symbols for some libraries have not been loaded, because.*
doing so would exceed the size threshold specified by auto-solib-limit.*
To manually load symbols, use the 'sharedlibrary' command.*
To raise the threshold, set auto-solib-limit to a larger value and rerun.*
the program.*$gdb_prompt $"\
          {fail "rerun threshold at practical infinity (still hit threshold)"}
  -re "$gdb_prompt $"\
          {pass "rerun with threshold at practical infinity"}
  timeout {fail "(timeout) rerun with threshold at practical infinity"}
}

# Rerun the program, this time altogether disabling the auto loading
# feature.  There should be no information at all about shared
# libraries now.
#
# ??rehrauer: Personally, I'd call that a bug, since it doesn't give
# you the ability to manually load single shlibs (you need the text
# start address that 'info share' normall gives you).  On the other
# hand, one can easily choose to load them all...
#
# It appears that gdb isn't freeing memory when rerunning, as one
# would expect.  To avoid potentially hitting a virtual memory
# ceiling, start with a fresh gdb.
#
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

send_gdb "break main\n"
gdb_expect {
  -re "Breakpoint \[0-9\]* at.*$gdb_prompt $"\
          {pass "3 set break at main"}
  -re "$gdb_prompt $"\
          {fail "3 set break at main"}
  timeout {fail "(timeout) 3 set break at main"}
}

send_gdb "set auto-solib-limit 0\n"
gdb_expect {
  -re "$gdb_prompt $"\
          {pass "set auto-solib-limit threshold to 0"}
  timeout {fail "(timeout) set auto-solib-limit threshold to 0"}
}
send_gdb "run\n"
gdb_expect {
  -re ".*warning. Symbols for some libraries have not been loaded, because.*
doing so would exceed the size threshold specified by auto-solib-limit.*
To manually load symbols, use the 'sharedlibrary' command.*
To raise the threshold, set auto-solib-limit to a larger value and rerun.*
the program.*$gdb_prompt $"\
          {fail "rerun threshold at 0 (still hit threshold)"}
  -re "$gdb_prompt $"\
          {pass "rerun with threshold at 0"}
  timeout {fail "(timeout) rerun with threshold at 0"}
}

# Verify that we can still manually load symbols for all libraries.
# (We'll assume that if the last shlib's symbols are loaded, that
# all of them were.)
#
# Note that we set the GDB "height" variable to prevent GDB from
# prompting 
#
# Warning!  On a machine with little free swap space, this may
# fail!
#
send_gdb "set height 9999\n"
gdb_expect {
  -re "$gdb_prompt $"\
          {pass "set screen page height to practical infinity"}
  timeout {fail "(timeout) set screen page height to practical infinity"}
}
send_gdb "sharedlibrary\n"
gdb_expect {
  -re ".*Reading symbols from .*/lib02-so-thresh\\.sl\\.\\.\\.done\\..*$gdb_prompt $"\
          {pass "manually load all symbols"}
  -re "$gdb_prompt $" {
	setup_xfail hppa*-*-* CHFts24108
	fail "manually load all symbols (CHFts24108)"
    }
  timeout {fail "(timeout) manually load all symbols"}
}

return 0
