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

# This file was written by Michael Snyder (msnyder@redhat.com)


# Define if you want to skip this test
# (could be very time-consuming on remote targets with slow connection).
#
if [target_info exists gdb,skip_huge_test] {
    return;
}

set testfile "huge"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

for { set size [expr 2 * 1024 * 1024] } { $size > 10 } { set size [expr $size / 2] } {
  if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
	    executable [list debug "additional_flags=-DCRASH_GDB=$size"]] \
      == "" } break
}
if { $size < 10 } {
     untested huge.exp
     return -1
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

set prev_timeout $timeout
set timeout 30

if { ! [ runto_main ] } then {
    untested huge.exp
    return -1
}

gdb_test "print a" ".1 = .0 .repeats \[0123456789\]+ times.." "print a very large data object"

set timeout $prev_timeout
