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

standard_testfile average.c

set ofile "${binfile}0.o"
if {[gdb_compile $srcdir/$subdir/$srcfile $ofile \
	 object {debug}] != ""} {
    untested comprdebug.exp
    return
}

set objcopy_program [transform objcopy]
set cmd "$objcopy_program --compress-debug-sections $ofile"
verbose "invoking $cmd"
set result [catch "exec $cmd" output]
verbose "result is $result"
verbose "output is $output"

if {$result == 1} {
    untested comprdebug.exp
    return
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
set testname "file [file tail $ofile]"
if {[gdb_file_cmd $ofile] == 0} {
    pass $testname
} else {
    fail $testname
}

