# This testcase is part of GDB, the GNU debugger.

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

# Test inappropriate offseting of multiple sections with the same name.
# When kept in object file (before final executable link) it still works.
# When separate debug info file is not used it still works.
# When the ELF symbol table is kept in the main binary it still works.
# Used .S file as in .c file we would need __attriute__((section)) which is
# a GCC extension.

# This test can only be run on targets which support ELF and use gas.
# For now pick a sampling of likely targets.
if {![istarget *-*-linux*]
    && ![istarget *-*-gnu*]
    && ![istarget *-*-elf*]
    && ![istarget arm*-*-eabi*]
    && ![istarget arm*-*-symbianelf*]
    && ![istarget powerpc-*-eabi*]} {
    return 0
}

set testfile dup-sect
set srcfile ${testfile}.S
set srcmainfile start.c
set executable ${testfile}
set binfile ${objdir}/${subdir}/${executable}

if {[build_executable ${testfile}.exp $executable [list ${srcfile} ${srcmainfile}] {}] == -1} {
    return -1
}

set test "rename section"
set objcopy_program [transform objcopy]
set result [catch "exec $objcopy_program --rename-section sect2=sect1 $binfile" output]
verbose "result is $result"
verbose "output is $output"
if {$result != 0} {
    fail $test
    return
}
pass $test

set test "split"
if {[gdb_gnu_strip_debug $binfile] != 0} {
    fail $test
} else {
    pass $test
}

# gdb_gnu_strip_debug uses only --strip-debug and keeps the ELF symbol table
# in $binfile.
set test "strip"
set strip_program [transform strip]
set result [catch "exec $strip_program $binfile" output]
verbose "result is $result"
verbose "output is $output"
if {$result != 0} {
    fail $test
    return
}
pass $test

clean_restart $executable

gdb_test "p/d *(const char *) &var1" " = 1" "var1 after strip"
gdb_test "p/d *(const char *) &var2" " = 2" "var2 after strip"
